001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.taglib;
017
018 import static org.opengion.fukurou.util.StringUtil.nval;
019
020 import java.io.IOException;
021 import java.io.ObjectInputStream;
022 import java.io.ObjectOutputStream;
023 import java.util.ArrayList;
024 import java.util.HashMap;
025 import java.util.List;
026 import java.util.Locale;
027 import java.util.Map;
028
029 import javax.script.ScriptEngine;
030 import javax.script.ScriptEngineManager;
031 import javax.script.ScriptException;
032 import javax.servlet.ServletException;
033
034 import org.opengion.fukurou.db.DBUtil;
035 import org.opengion.fukurou.db.Transaction;
036 import org.opengion.fukurou.db.TransactionReal;
037 import org.opengion.fukurou.model.Formatter;
038 import org.opengion.fukurou.util.ErrorMessage;
039 import org.opengion.fukurou.util.StringUtil;
040 import org.opengion.hayabusa.common.HybsSystem;
041 import org.opengion.hayabusa.common.HybsSystemException;
042 import org.opengion.hayabusa.db.DBTableModel;
043 import org.opengion.hayabusa.resource.ResourceManager;
044
045 /**
046 * 画面で入力された??タのチェ?を行うためのタグです?
047 *
048 * commandがNEWの場合?検索条件等?リクエストパラメータに対してチェ?を行います?
049 * commandがENTRYの場合?、登録時?DB??ブルモ?に対するチェ?を行います?
050 * (値の取得?、?に選択された行?みにつ?、実行されます?)
051 *
052 * チェ?を行うための定義は、SQL?又? JavaScriptの式が記述可能です?
053 * これら?式?タグのボディー部?記述します?
054 *
055 * SQL?よりチェ?を行う場合?、?件数が返されるように記述して下さ?select count(*) ??? ?
056 * こ?SQL?取得された件数とexistの属?値とを?合しチェ?を行います?
057 * ?れ?場合も、?立時は、正常とみなします?
058 * (?true:存在する? には、データが存在した場合に??で、なければエラーです?)
059 *
060 * JavaScript式を記述する場合?、?true or falseを返す式を?して下さ??
061 * こ?式を評価した結果falseが返される場合?、エラーとみなします?
062 * 式に不等号等を使用する場合?、CDATAセクションで囲??して下さ??
063 *
064 * また??れ?チェ?方法?場合でも?引数部に[カラ?]を用?Hybs拡張SQL?
065 * ?することが可能です?
066 * メ?ージIDの{0},{1}にはそれぞれ[カラ?]?されたカラ?及???タがカンマ区?で
067 * 自動的に設定されます?
068 *
069 * ※ こ?タグは、Transaction タグの対象です?
070 *
071 * @og.formSample
072 * <pre>
073 * ●形式?
074 * ・<og:dataCheck
075 * command = "{@command}"
076 * exist = "[auto|true|false|one|notuse]"
077 * errRemove = "[true|false]"
078 * msg = "{@msg}"
079 * msgParamKeys = "ZY03" : メ?ージリソースのキーをカンマ区?で??{2} 以降にセ?
080 * sqlType = "{@sqlType}"
081 * execType = "INSERT|COPY|UPDATE|MODIFY|DELETE" : sqlType を含??合?実?
082 * conditionKey = "FGJ" : 条件判定するカラ??を指?初期値は columnId )
083 * conditionList = "0|1|8|9" : 条件判定する?のリストを?|"で区?て登録(初期値は、無条件)
084 * uniqCheckKeys = "CLM,LANG" : DBTableModel?のユニ?クキーチェ?を行うためのカラ?
085 * >
086 *
087 * ●body?SQL?又? JavaScript?
088 *
089 * ●Tag定義??
090 * <og:dataCheck
091 * command 【TAG】コマン?NEW or ENTRY)をセ?しま?
092 * exist 【TAG】データベ?スのチェ?方法[auto/true/false/one/notuse]を指定しま?初期値:auto[自動])
093 * tableId 【TAG?通常は使?せん)結果をDBTableModelに書き込んで、sessionに登録するとき?キーを指定しま?
094 * dbid 【TAG?通常は使?せん)Queryオブジェクトを作?する時?DB接続IDを指定しま?
095 * lbl 【TAG】ラベルリソースIDを指定しま?
096 * lblParamKeys 【TAG】ラベルリソースの引数をカンマ区?で?しま?
097 * errRemove 【TAG】エラー時?選択行を取り除?継続??行うかど?[true/false]を指定しま?初期値:false)
098 * sqlType 【TAG】このチェ?を行う、SQLタイ?を指定しま?
099 * execType 【TAG】このチェ?を行う、実行タイ?を指定しま?
100 * conditionKey 【TAG】条件判定するカラ??を指定しま?
101 * conditionList 【TAG】条件判定する?のリストを?|"で区?て登録しま?初期値:無条件)
102 * uniqCheckClms 【TAG】指定されたキーに従って、メモリ上???ブルに対してユニ?クキーチェ?を行いま?
103 * beforeErrorJsp 【TAG】エラーが発生した際に、エラーメ?ージの表示前にincludeするJSPを指定しま?
104 * afterErrorJsp 【TAG】エラーが発生した際に、エラーメ?ージの表示後にincludeするJSPを指定しま?
105 * selectedAll 【TAG】データを?件選択済みとして処?るかど?[true/false]を指定しま?初期値:false)
106 * msg 【?】メ?ージIDを指定しま?lbl 属?を使用してください)
107 * msgParamKeys 【?】メ?ージリソースの引数をカンマ区?で?しま?lblParamKeys 属?を使用してください)
108 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
109 * > ... Body ...
110 * </og:dataCheck>
111 *
112 * ●使用?
113 * ・<og:dataCheck
114 * command = "ENTRY"
115 * exist = "true"
116 * msg = "MSG0001"
117 * >
118 * select count(*) from GEA03 where clm = [CLM]
119 * </og:dataCheck>
120 *
121 * ・exist 属?の値に応じて、チェ?方法が異なります?
122 * [ auto , true , false , one , notuse が指定できます?]
123 *
124 * ・<og:dataCheck
125 * command = "ENTRY"
126 * msg = "MSG0001"
127 * >
128 * <![CDATA[
129 * [DYSTART] < [DY] && [DY] < [DYEND]
130 * ]]>
131 * </og:dataCheck>
132 *
133 * ・<og:dataCheck
134 * command = "ENTRY"
135 * msg = "MSG0001"
136 * >
137 * <![CDATA[
138 * [GOKEI] < [TANKA] * [RITU]
139 * ]]>
140 * </og:dataCheck>
141 * </pre>
142 *
143 * @og.rev 4.1.1.1 (2008/02/22) 新規作?
144 * @og.group ??登録
145 *
146 * @version 4.0
147 * @author Hiroki Nakamura
148 * @since JDK5.0,
149 */
150 public class DataCheckTag extends CommonTagSupport {
151 //* こ?プログラ??VERSION??を設定します? {@value} */
152 private static final String VERSION = "5.6.1.1 (2013/02/08)";
153
154 private static final long serialVersionUID = 561120130208L;
155
156 /** command 引数に渡す事?出来?コマン?{@value} */
157 public static final String CMD_NEW = "NEW";
158
159 /** command 引数に渡す事?出来?コマン?{@value} */
160 public static final String CMD_ENTRY = "ENTRY";
161
162 /** command 引数に渡す事?出来?コマン?リス? */
163 private static final String[] COMMAND_LIST = { CMD_ENTRY, CMD_NEW };
164
165 /** ?変数 */
166 private transient DBTableModel table = null;
167 // private transient ErrorMessage errMessage = null;
168 private transient boolean isSql = false;
169 private transient boolean isUniqCheck = false; // 4.3.4.0 (2008/12/01) 追?
170 private transient ScriptEngine jsEngine = null;
171 private transient String bodyStr = null; // 4.3.4.0 (2008/12/01) 追?
172
173 /** タグで設定する属? */
174 private String command = CMD_ENTRY;
175 private String exist = "auto";
176 private String tableId = HybsSystem.TBL_MDL_KEY;
177 private String dbid = null;
178 private String msg = null;
179 private String[] msgParamKeys = null; // 4.2.0.1 (2008/03/27)
180 private boolean errRemove = false;
181 private String sqlType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
182 private String execType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
183 private boolean isExec = true; // 4.1.2.0 (2008/03/12)
184
185 private String conditionKey = null; // 4.2.0.1 (2008/03/27)
186 private String conditionList = null; // 4.2.0.1 (2008/03/27)
187 private String from = null; // 4.2.0.1 (2008/03/27)
188 private String[] uniqCheckClms = null; // 4.3.4.0 (2008/12/01)
189
190 private String beforeErrorJsp = null; // 5.1.9.0 (2010/08/01)
191 private String afterErrorJsp = null; // 5.1.9.0 (2010/08/01)
192 private boolean selectedAll = false; // 5.1.9.0 (2010/08/01)
193
194 /**
195 * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
196 *
197 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
198 * @og.rev 4.1.2.0 (2008/03/12) sqlType,execType 判?
199 *
200 * @return 後続????
201 */
202 @Override
203 public int doStartTag() {
204 isExec = (sqlType == null || execType == null || execType.indexOf( sqlType ) >= 0 );
205
206 if( isExec ) {
207 return( EVAL_BODY_BUFFERED ); // Body を評価する
208 }
209 else {
210 return(SKIP_BODY); // Body を評価しな?
211 }
212 }
213
214 /**
215 * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
216 *
217 * @og.rev 4.3.4.0 (2008/12/01) 新規追?
218 *
219 * @return 後続????(SKIP_BODY)
220 */
221 @Override
222 public int doAfterBody() {
223 bodyStr = getBodyString().trim();
224 return(SKIP_BODY);
225 }
226
227 /**
228 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
229 *
230 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
231 * @og.rev 4.1.2.0 (2008/03/12) sqlType,execType 判?
232 * @og.rev 4.2.0.1 (2008/03/27) from を取?
233 * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対?
234 * @og.rev 4.3.4.0 (2008/12/01) ユニ?クキーチェ?対応?bodyContentの取得を#doAfterBody()で行う?
235 * @og.rev 5.1.9.0 (2010/08/01) エラーメ?ージの表示前後にincludeするJSPを指定できるようにする?
236 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応します?
237 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更 、Transaction対応で、close処?入れる?
238 *
239 * @return 後続????
240 */
241 @Override
242 public int doEndTag() {
243 debugPrint();
244 int rtnCode = EVAL_PAGE;
245
246 // 4.1.2.0 (2008/03/12) 実行条件 isExec を評価
247 if( isExec && check( command, COMMAND_LIST ) ) {
248 // exist="notuse"の場合?チェ?しな?
249 if( exist.equalsIgnoreCase( "notuse" ) ) { return rtnCode; }
250
251 // パラメーターから処??タイプを判別
252 checkParam();
253
254 // エラーメ?ージを管?るクラスを作?します?
255 ErrMessageManager manager = new ErrMessageManager();
256 manager.setTitle( "Data Check Error!" );
257 manager.setParamKeys( msgParamKeys );
258 manager.setResourceManager( getResource() );
259 manager.setFrom( from );
260
261 // 5.1.9.0 (2010/08/01) TransactionTag 対?
262 Transaction tran = null ;
263 // 5.3.7.0 (2011/07/01) Transaction対応で、close処?入れる?
264 try {
265 if( isSql ) {
266 TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
267 if( tranTag == null ) {
268 // tran = new TransactionReal( dbid,getApplicationInfo() );
269 tran = new TransactionReal( getApplicationInfo() ); // 5.3.7.0 (2011/07/01) 引数変更
270 }
271 else {
272 tran = tranTag.getTransaction();
273 }
274 }
275
276 // command="NEW"の場?
277 if( CMD_NEW.equals( command ) ) {
278 if( isSql ) {
279 // checkSql( str, null, null, DBTableModel.UPDATE_TYPE, 0 );
280 // checkSql( bodyStr, manager, null, 0, DBTableModel.UPDATE_TYPE );
281 checkSql( bodyStr, manager, null, 0, DBTableModel.UPDATE_TYPE, tran ); // 5.1.9.0 (2010/08/01)
282 }
283 else {
284 // checkJs( str, null, null, 0, jsEngine );
285 checkJs( bodyStr, manager, null, 0, jsEngine );
286 }
287 }
288 // command="ENTRY"の場???ブルモ?が存在しな??合?処?な?
289 else if( CMD_ENTRY.equals( command ) ) {
290 table = (DBTableModel) getObject( tableId );
291 if( table != null && table.getRowCount() > 0 ) {
292 manager.setDBTableModel( table );
293 if( isUniqCheck ) {
294 checkUnique( manager );
295 }
296 else {
297 // checkRows( bodyStr, manager );
298 checkRows( bodyStr, manager, tran ); // 5.1.9.0 (2010/08/01)
299 }
300 }
301 else {
302 System.out.println( "DBTableModel doesn't exist!! need this when command=\"ENTRY\"" );
303 }
304 }
305 }
306 finally {
307 if( tran != null ) { tran.close(); }
308 }
309
310 // エラーが発生した?合?、エラーメ?ージを表示して以降?処?行わな??
311 ErrorMessage errMessage = manager.getErrMessage() ;
312 if( errMessage != null && !errMessage.isOK() && !errRemove ) {
313 rtnCode = SKIP_PAGE;
314
315 // 5.1.9.0 (2010/08/01) エラーメ?ージの表示前にincludeするJSPを指?
316 if( beforeErrorJsp != null && beforeErrorJsp.length() > 0 ) {
317 includeJsp( beforeErrorJsp );
318 }
319
320 jspPrint( TaglibUtil.makeHTMLErrorTable( errMessage, getResource() ) );
321
322 // 5.1.9.0 (2010/08/01) エラーメ?ージの表示後にincludeするJSPを指?
323 if( afterErrorJsp != null && afterErrorJsp.length() > 0 ) {
324 includeJsp( afterErrorJsp );
325 }
326 }
327 }
328
329 return( rtnCode );
330 }
331
332 /**
333 * タグリブオブジェクトをリリースします?
334 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
335 *
336 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
337 * @og.rev 4.1.2.0 (2008/03/12) sqlType , execType , isExec 追?
338 * @og.rev 4.2.0.1 (2008/03/27) conditionKey , conditionList , msgParamKeys 追?
339 * @og.rev 5.1.9.0 (2010/08/01) beforeErrorJsp , afterErrorJsp, selectedAll 追?
340 */
341 @Override
342 protected void release2() {
343 super.release2();
344 tableId = HybsSystem.TBL_MDL_KEY;
345 dbid = null;
346 command = CMD_ENTRY;
347 table = null;
348 // errMessage = null;
349 exist = "auto";
350 errRemove = false;
351 msg = null;
352 msgParamKeys = null; // 4.2.0.1 (2008/03/27)
353 isSql = false;
354 isUniqCheck = false; // 4.3.4.0 (2008/12/01)
355 jsEngine = null;
356 sqlType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
357 execType = null; // INSERT,COPY,UPDATE,MODIFY,DELETE
358 isExec = true; // 4.1.2.0 (2008/03/12)
359 conditionKey = null; // 4.2.0.1 (2008/03/27)
360 conditionList = null; // 4.2.0.1 (2008/03/27)
361 from = null; // 4.2.0.1 (2008/03/27)
362 bodyStr = null; // 4.3.4.0 (2008/12/01))
363 uniqCheckClms = null; // 4.3.4.0 (2008/12/01)
364 beforeErrorJsp = null; // 5.1.9.0 (2010/08/01)
365 afterErrorJsp = null; // 5.1.9.0 (2010/08/01)
366 selectedAll = false; // 5.1.9.0 (2010/08/01)
367 }
368
369 /**
370 * 引数及?ボディー部??チェ?を行い、???タイプを判別します?
371 * @og.rev 5.5.8.0 (2012/11/01) タイプ判別変更
372 * @og.rev 5.6.1.1 (2013/02/08) FROM 部の?出し位置修正
373 *
374 */
375 private void checkParam() {
376 isUniqCheck = ( uniqCheckClms != null && uniqCheckClms.length > 0 ) ? true : false;
377 if( isUniqCheck ) {
378 if( !CMD_ENTRY.equals( command ) ) {
379 String errMsg = "ユニ?クキーチェ?は、command=\"ENTRY\"の場合?み使用可能です?"
380 + " command=" + command ; // 5.1.8.0 (2010/07/01) errMsg 修正
381 throw new HybsSystemException( errMsg );
382 }
383 }
384 else {
385 if( bodyStr == null || bodyStr.length() == 0 ) {
386 String errMsg = "Body部?チェ?定義を記述して下さ??";
387 throw new HybsSystemException( errMsg );
388 }
389 else {
390 // SQLチェ?かJavaScriptによるチェ?か?判?
391 String query = bodyStr.toUpperCase( Locale.JAPAN ); // 4.2.0.1 (2008/03/27)
392 // if( query.indexOf( "SELECT" ) >= 0 ) {
393 if( query.indexOf( "SELECT" ) == 0 ) { // 5.5.8.0 (2012/11/01) 先?に限定する?(trim済?ため)
394 isSql = true;
395 int st = query.indexOf( "FROM" ) ;
396 int ed = query.indexOf( "WHERE" ) ;
397 if( st > 0 && st < ed ) {
398 // from = query.substring( st,ed ).trim();
399 from = query.substring( st+"FROM".length(),ed ).trim(); // 5.6.1.1 (2013/02/08)
400 }
401 }
402 else {
403 jsEngine = new ScriptEngineManager().getEngineByName( "JavaScript" );
404 }
405 }
406 }
407 }
408
409 /**
410 * SQLによる??タチェ?を行います?
411 * チェ?方法?、exist属?の?に依存します?
412 * autoの場合?、テーブルモ?の改廃Cから自動でチェ?方法が決定されます?
413 *
414 * @param str 実行するSQL?
415 * @param manager ErrMessageManager オブジェク?
416 * @param values SQL??パラメータ
417 * @param row 行番号
418 * @param modifyType 改廃C
419 * @param tran トランザクションオブジェク?
420 *
421 * @return 処??成否
422 *
423 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
424 * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対?
425 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応します?
426 */
427 // private boolean checkSql( final String str, final String names, final String[] values
428 // , final String modifyType, final int row ) {
429 // private boolean checkSql( final String str, final ErrMessageManager manager, final String[] values
430 // , final int row, final String modifyType ) {
431 private boolean checkSql( final String str, final ErrMessageManager manager, final String[] values
432 , final int row, final String modifyType, final Transaction tran ) {
433
434 // int cnt = DBUtil.dbExist( str, values, getApplicationInfo(), dbid );
435 int cnt = DBUtil.dbExist( str, values, tran, dbid ); // 5.1.9.0 (2010/08/01)
436
437 boolean okFlag = true;
438 String id = null;
439 if( ( exist.equalsIgnoreCase( "true" ) || ( exist.equalsIgnoreCase( "auto" )
440 && ( DBTableModel.UPDATE_TYPE.equals( modifyType ) || DBTableModel.DELETE_TYPE.equals( modifyType ) ) ) ) && cnt <= 0 ) {
441 // ERR0025=??タ未登録エラー。キー={0}、?={1} の??タは、存在して?せん?
442 id = ( msg == null ? "ERR0025" : msg );
443 okFlag = false;
444 }
445 else if( ( exist.equalsIgnoreCase( "false" ) || ( exist.equalsIgnoreCase( "auto" )
446 && DBTableModel.INSERT_TYPE.equals( modifyType ) ) ) && cnt > 0 ) {
447 // ERR0026=??タ登録済みエラー。キー={0}、?={1} の??タは、すでに存在して?す?
448 id = ( msg == null ? "ERR0026" : msg );
449 okFlag = false;
450 }
451 else if( exist.equalsIgnoreCase( "one" ) && cnt > 1 ) {
452 // ERR0027=??タ?重登録エラー。キー={0}、?={1} の??タは??て存在して?す?
453 id = ( msg == null ? "ERR0027" : msg );
454 okFlag = false;
455 }
456
457 if( !okFlag ) {
458 manager.addMessage( row, id, values );
459
460 // String vals = StringUtil.array2csv( values );
461 // ResourceManager resource = getResource();
462 // String fromLbl = resource.getLabel( from );
463 // if( msgParamKeys == null || msgParamKeys.length == 0 ) {
464 // errMessage.addMessage( row, ErrorMessage.NG, id, names, vals, fromLbl );
465 // }
466 // else {
467 // int size = msgParamKeys.length;
468 // String[] args = new String[size] ;
469 // for( int i=0; i<size; i++ ) {
470 // String key = msgParamKeys[i] ;
471 // if( "@KEY".equals( key ) ) { args[i] = names; }
472 // else if( "@VAL".equals( key ) ) { args[i] = vals; }
473 // else if( "@TBL".equals( key ) ) { args[i] = fromLbl;}
474 // // 4.2.1.0 (2008/04/11) リクエスト変数対?
475 // else if( "[".startsWith( key ) && "]".endsWith( key ) ) {
476 // if( table != null ) {
477 // args[i] = table.getValue( row,key.substrng( 1,key.length()-1 ) );
478 // }
479 // }
480 // // 4.2.1.0 (2008/04/11) リクエスト変数対?
481 // else if( "{#".startsWith( key ) && "}".endsWith( key ) ) {
482 // args[i] = resource.getLabel( key.substrng( 2,key.length()-1 ));
483 // }
484 // else {
485 // args[i] = key;
486 // }
487 // }
488 // errMessage.addMessage( row, ErrorMessage.NG, id, args );
489 // }
490 }
491 return okFlag;
492 }
493
494 /**
495 * JavaScriptの式を実行します?
496 * 実行した結果がboolean型でな??合?エラーとなります?
497 *
498 * @param str 実行するSQL?
499 * @param manager オブジェク?
500 * @param values 値配?
501 * @param row 行番号
502 * @param engine JavaScriptエンジン
503 *
504 * @return 処??成否
505 *
506 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
507 * @og.rev 4.2.0.1 (2008/03/27) getClass().getName() から、instanceof に変更
508 * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対?
509 */
510 // private boolean checkJs( final String str, final String names, final String[] values
511 // , final int row, final ScriptEngine engine ) {
512 private boolean checkJs( final String str, final ErrMessageManager manager, final String[] values
513 , final int row, final ScriptEngine engine ) {
514 // JavaScriptエンジンによる評価
515 Object obj = null;
516 try {
517 obj = engine.eval( str );
518 }
519 catch( ScriptException ex ) {
520 String errMsg = "JavaScript式?パ?スに失敗しました?" + str + "]";
521 throw new HybsSystemException( errMsg , ex );
522 }
523
524 // 返り値がBoolean型かチェ?
525 boolean okFlag = false;
526 // 4.2.0.1 (2008/03/27) instanceof に変更
527 // if( obj != null && "java.lang.Boolean".equals( obj.getClass().getName() ) ) {
528 // if( obj != null && obj instanceof Boolean ) {
529 if( obj instanceof Boolean ) { // 4.3.1.1 (2008/08/23) instanceof チェ?は、nullチェ?不?
530 okFlag = ((Boolean)obj).booleanValue();
531 }
532 else {
533 String errMsg = "JavaScript式には true 若しくは false が返るように設定して下さ?
534 + " Object=" + obj ; // 5.1.8.0 (2010/07/01) errMsg 修正
535 throw new HybsSystemException( errMsg );
536 }
537
538 if( !okFlag ) {
539 // ERR0030=入力したデータが不正です?key={0} value={1} 形?{2}
540 String id = ( msg == null ? "ERR0030" : msg );
541
542 manager.addMessage( row, id, values );
543
544 // String vals = StringUtil.array2csv( values );
545 // // ERR0030=入力したデータが不正です?key={0} value={1} 形?{2}
546 // String id = ( msg == null ? "ERR0030" : msg );
547 // // 4.2.1.0 (2008/04/11) リクエスト変数対?
548 // if( msgParamKeys == null || msgParamKeys.length == 0 ) {
549 // errMessage.addMessage( row, ErrorMessage.NG, id, names, vals, str );
550 // }
551 // else {
552 // int size = msgParamKeys.length;
553 // String[] args = new String[size] ;
554 // for( int i=0; i<size; i++ ) {
555 // ResourceManager resource = getResource();
556 // String key = msgParamKeys[i] ;
557 // // 4.2.1.0 (2008/04/11) リクエスト変数対?
558 // if( "{#".startsWith( key ) && "}".endsWith( key ) ) {
559 // args[i] = resource.getLabel( key.substrng( 2,key.length()-1 ));
560 // }
561 // else {
562 // args[i] = key;
563 // }
564 // }
565 // errMessage.addMessage( row, ErrorMessage.NG, id, args );
566 // }
567 }
568
569 return okFlag;
570 }
571
572 /**
573 * DB??ブルモ?の?に対して??タチェ?を行います?
574 *
575 * @param str チェ?対象の??
576 * @param manager ErrMessageManagerオブジェク?
577 * @param tran Transactionトランザクションオブジェク?
578 *
579 * @og.rev 4.1.1.0 (2008/02/22) 新規作?
580 * @og.rev 4.2.0.1 (2008/03/27) conditionKey,conditionList 対?
581 * @og.rev 4.2.1.0 (2008/04/11) ErrMessageManager対?
582 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対応します?
583 */
584 // private void checkRows( final String str ) {
585 // private void checkRows( final String str, final ErrMessageManager manager ) {
586 private void checkRows( final String str, final ErrMessageManager manager, final Transaction tran ) {
587
588 int[] rowNo = getParameterRows(); // 4.0.0 (2005/01/31)
589 if( rowNo.length == 0 ) { return; }
590
591 Formatter format = new Formatter( table );
592 format.setFormat( str );
593 int[] clmNo = format.getClmNos();
594 // 4.2.0.1 (2008/03/27) カラ?のメ?ージリソース??を作?します?
595 // String names = getKeysLabel( clmNo );
596
597 manager.setClmNos( clmNo );
598
599 // SQL??場合?み[xxx]?に変換したSQL?取?JavaScriptの場合?ループ?で?毎に取?
600 String query = null;
601 if( isSql ) {
602 query = format.getQueryFormatString();
603 }
604
605 // 4.2.0.1 (2008/03/27) conditionKey,conditionList 対?
606 int cndKeyNo = -1;
607 if( conditionKey != null && conditionList != null ) {
608 cndKeyNo = table.getColumnNo( conditionKey ); // 不正??エラー
609 }
610
611 List<Integer> list = new ArrayList<Integer>();
612 boolean okFlag = false;
613 for( int i = 0; i < rowNo.length; i++ ) {
614 int row = rowNo[i] ;
615 String[] values = getTableModelData( row, clmNo );
616 // 4.2.0.1 (2008/03/27) 条件?がされて?場合に?
617 // Listに含まれな??合?、実行されな??
618 // 4.2.1.0 (2008/04/11) 厳?処?ます?
619 if( cndKeyNo >= 0 && conditionList.indexOf( table.getValue( row,cndKeyNo ) ) < 0 ) {
620 String conVal = "|" + table.getValue( row,cndKeyNo ) + "|" ;
621 if( conditionList.indexOf( conVal ) < 0 ) { continue; }
622 }
623
624 if( isSql ) {
625 // okFlag = checkSql( query, names, values, table.getModifyType( row ), row );
626 // okFlag = checkSql( query, manager, values, row, table.getModifyType( row ) );
627 okFlag = checkSql( query, manager, values, row, table.getModifyType( row ), tran );
628 }
629 else {
630 String jsStr = format.getFormatString( row, "\"" );
631 // okFlag = checkJs( jsStr, names, values, row, jsEngine );
632 okFlag = checkJs( jsStr, manager, values, row, jsEngine );
633 }
634
635 if( errRemove && okFlag ) {
636 list.add( row );
637 }
638 }
639
640 if( errRemove ) {
641 Integer[] in = list.toArray( new Integer[list.size()] );
642 int[] newRowNo = new int[in.length];
643 for( int i = 0; i < in.length; i++ ) {
644 newRowNo[i] = in[i].intValue();
645 }
646 setParameterRows( newRowNo );
647 }
648 }
649
650 /**
651 * DB??ブルモ?の?にユニ?クキーのチェ?を行います?
652 *
653 * @og.rev 4.3.4.0 (2008/12/01) 新規作?
654 *
655 * @param manager ErrMessageManagerオブジェク?
656 */
657 private void checkUnique( final ErrMessageManager manager ) {
658 int[] rowNo = getParameterRows();
659 if( rowNo.length == 0 ) { return; }
660
661 int[] clmNo = new int[uniqCheckClms.length];
662 for( int i=0; i<clmNo.length; i++ ) {
663 clmNo[i] = table.getColumnNo( uniqCheckClms[i] );
664 }
665
666 manager.setClmNos( clmNo );
667
668 List<Integer> list = new ArrayList<Integer>();
669 Map<String,Integer> map = new HashMap<String,Integer>();
670 for( int i = 0; i < rowNo.length; i++ ) {
671 int row = rowNo[i] ;
672 String[] values = getTableModelData( row, clmNo );
673 String key = StringUtil.array2line( values, " + " );
674
675 if( map.get( key ) == null ) {
676 map.put( key, 1 );
677 if( errRemove ) {
678 list.add( row );
679 }
680 }
681 else {
682 // ERR0027=??タ?重登録エラー。キー={0}、?={1} の??タは??て存在して?す?
683 id = ( msg == null ? "ERR0027" : msg );
684 manager.addMessage( row, id, values );
685 }
686 }
687
688 if( errRemove ) {
689 Integer[] in = list.toArray( new Integer[list.size()] );
690 int[] newRowNo = new int[in.length];
691 for( int i = 0; i < in.length; i++ ) {
692 newRowNo[i] = in[i].intValue();
693 }
694 setParameterRows( newRowNo );
695 }
696 }
697
698 /**
699 * msgParamKeys 属?に対して、実際の値を割り当てます?
700 *
701 * ここでは?#064;KEY ?#064;TBL 、{#XX} 、{@XX} に対して、実際の値と置き換えられます?
702 * @VAL と、[XX] は、DBTableModel の行番号が?なので、?別処?判断します?
703 * msgParamKeys が?未??null) の場合?、null を返します?
704 *
705 * @param names カラ?
706 * @param fromLbl ??ブル?
707 *
708 * @og.rev 4.2.0.1 (2008/03/27) 新規作?
709 */
710 // private String[] makeMsgParamVals( final String names,final String fromLbl ) {
711 // if( msgParamKeys == null ) { return null; }
712 //
713 // int size = msgParamKeys.length;
714 // String[] args = new String[size] ;
715 // ResourceManager resource = getResource();
716 //
717 // for( int i=0; i<size; i++ ) {
718 // String key = msgParamKeys[i] ;
719 // if( "@KEY".equals( key ) ) { args[i] = names; }
720 // else if( "@VAL".equals( key ) ) { args[i] = key; } // そ?まま返す
721 // else if( "@TBL".equals( key ) ) { args[i] = fromLbl;}
722 // // 4.2.1.0 (2008/04/11) リクエスト変数対?
723 // else if( "[".startsWith( key ) && "]".endsWith( key ) ) {
724 // args[i] = key; // そ?まま返す
725 // }
726 // else if( "{#".startsWith( key ) && "}".endsWith( key ) ) {
727 // args[i] = resource.getLabel( key.substrng( 2,key.length()-1 ));
728 // }
729 // else {
730 // args[i] = getRequestParameter( key );
731 // }
732 // }
733 //
734 // return args ;
735 // }
736
737 /**
738 * 【TAG?通常は使?せん)結果をDBTableModelに書き込んで、sessionに登録するとき?キーを指定します?
739 *
740 * @og.tag 初期値は、HybsSystem.TBL_MDL_KEY です?
741 *
742 * @param id sessionに登録する時? ID
743 */
744 public void setTableId( final String id ) {
745 tableId = nval( getRequestParameter( id ), tableId );
746 }
747
748 /**
749 * 【TAG?通常は使?せん)Queryオブジェクトを作?する時?DB接続IDを指定します?
750 *
751 * @og.tag Queryオブジェクトを作?する時?DB接続IDを指定します?
752 *
753 * @param id ??タベ?ス接続ID
754 */
755 public void setDbid( final String id ) {
756 dbid = nval( getRequestParameter( id ), dbid );
757 }
758
759 /**
760 * 【TAG】コマン?NEW or ENTRY)をセ?します?
761 *
762 * @og.tag
763 * コマンド?,HTMLから(get/post)?されます?で,CMD_xxx で設定される
764 * フィールド定数値の?れかを??できます?
765 *
766 * @param cmd コマン?public static final 宣?れて???)
767 * @see <a href="{@docRoot}/constant-values.html#org.opengion.hayabusa.taglib.DataCheckTag.CMD_NEW">コマンド定数</a>
768 */
769 public void setCommand( final String cmd ) {
770 String cmd2 = getRequestParameter( cmd );
771 if( cmd2 != null && cmd2.length() > 0 ) {
772 command = cmd2.toUpperCase( Locale.JAPAN );
773 }
774 }
775
776 /**
777 * 【TAG】データベ?スのチェ?方法[auto/true/false/one/notuse]を指定しま?初期値:auto[自動])?
778 *
779 * @og.tag
780 * exist 属?に?された ?true:存在する??false:存在しな??one:ひとつ以下」?
781 * の値は、いずれの場合も、?立時は、正常とみなします?
782 * ?auto:自動」は、DBTableModeleのmodifyType(A,C,D)に応じて、チェ?します?
783 * A,C,D は、entryタグにコマンドを渡して??タを作?したときに、?部で作?されます?
784 * (command="NEW"の場合?、trueと同じ動きになります?)
785 * notuse は、チェ?を行いません。これ?、このタグを?有使用する場合に、外部で
786 * チェ?を行うかど?を指定できるようにするために使用します?
787 * (?true:存在する? には、データが存在した場合に??で、なければエラーです?)
788 * 初期値は?auto:自動」です?
789 *
790 * @param ext チェ?方??auto:自動」?true:存在する??false:存在しな??one:ひとつ以下」?notuse:チェ?しな?)
791 */
792 public void setExist( final String ext ) {
793 exist = nval( getRequestParameter( ext ), exist );
794 if( !"auto".equalsIgnoreCase( exist )
795 && !"true".equalsIgnoreCase( exist )
796 && !"false".equalsIgnoreCase( exist )
797 && !"one".equalsIgnoreCase( exist )
798 && !"notuse".equalsIgnoreCase( exist ) ) {
799 String errMsg = "exist 属?は?auto,true,false,one,notuse)を指定してください?[" + exist + "]" + HybsSystem.CR;
800 throw new HybsSystemException( errMsg );
801 }
802 }
803
804 /**
805 * 【TAG】エラー時?選択行を取り除?継続??行うかど?[true/false]を指定しま?初期値:false)?
806 *
807 * @og.tag
808 * exist 属?に?された ?true:存在する??false:存在しな??one:ひとつ以下」?
809 * に対して、エラーが発生した選択行番号を?取り除?以下?処?継続するかど??
810 * ?します?
811 * true に設定した?合?、エラー??タを削除し?継続??行うことができます?
812 * flase の場合?、エラー??タを表示して、継続??停止します?
813 * 初期値は?false:エラー時停止?です?
814 *
815 * @param flag エラー時?継続??[true:エラー行番号を取り除き継続??false:エラー時停止]
816 */
817 public void setErrRemove( final String flag ) {
818 errRemove = nval( getRequestParameter( flag ), errRemove );
819 }
820
821 /**
822 * 【?】メ?ージIDを指定しま?lbl 属?を使用してください)?
823 *
824 * @og.tag メ?ージIDを指定します?
825 * ???応じた?期設定?メ?ージIDは、以下?通りです?
826 * exist="true" ERR0025=??タ未登録エラー。キー={0}、?={1} の??タは、存在して?せん?
827 * exist="false" ERR0026=??タ登録済みエラー。キー={0}、?={1} の??タは、すでに存在して?す?
828 * exist="one" ERR0027=??タ?重登録エラー。キー={0}、?={1} の??タは??て存在して?す?
829 * JavaScript ERR0030=入力したデータが不正です?key={0} value={1} 形?{2}
830 * 引数のパラメータには??常、チェ?に使用した実データが?DBTableModel から取得されます?
831 * 引数を変更する場合?、msgParamKeys を使用してください?
832 *
833 * @og.rev 5.2.2.0 (2010/11/01) ?します?lbl 属?を使用してください?
834 *
835 * @param id メ?ージID
836 * @see #setMsgParamKeys( String )
837 * @deprecated lbl 属?を使用してください?
838 */
839 @Deprecated public void setMsg( final String id ) {
840 msg = nval( getRequestParameter( id ), msg );
841 }
842
843 /**
844 * 【TAG】ラベルリソースIDを指定します?
845 *
846 * @og.tag ラベルリソースIDを指定します?
847 * ???応じた?期設定?ラベルリソースIDは、以下?通りです?
848 * exist="true" ERR0025=??タ未登録エラー。キー={0}、?={1} の??タは、存在して?せん?
849 * exist="false" ERR0026=??タ登録済みエラー。キー={0}、?={1} の??タは、すでに存在して?す?
850 * exist="one" ERR0027=??タ?重登録エラー。キー={0}、?={1} の??タは??て存在して?す?
851 * JavaScript ERR0030=入力したデータが不正です?key={0} value={1} 形?{2}
852 * 引数のパラメータには??常、チェ?に使用した実データが?DBTableModel から取得されます?
853 * 引数を変更する場合?、msgParamKeys を使用してください?
854 *
855 * @param id メ?ージID
856 * @see #setLblParamKeys( String )
857 */
858 @Override
859 public void setLbl( final String id ) {
860 // 継承親のメソ?を使わな??
861 msg = nval( getRequestParameter( id ), msg );
862 }
863
864 /**
865 * 【?】メ?ージリソースの引数をカンマ区?で?しま?lblParamKeys 属?を使用してください)?
866 *
867 * @og.tag
868 * メ?ージリソースのキーをカンマ区?で?することで、設定します?
869 * メ?ージに引数( {0},{1} など ) がある?合?ここで?した??
870 * ?に、{0},{1},{2}・・・ に当てはめて?ます?
871 * キーワード?、カンマ区?で?し、それを?後?ラベルリソースで
872 * リソース変換を行います?(つまり?記述された?そ?も?では在りません)
873 * PL/SQL では?{#PN}" などと?して???、同様に "PN" と?しです?
874 * ??、where 条件に?されたキーと値は、@KEY と @VAL に?
875 * from と where の間???は?#064;TBL に対応付けられます?
876 * {@XXXX} 変数も使用できます?実データの値を取出した??合?、[PN]と
877 * すれば、DBTableModel の PN の値を取出します?
878 * なにも指定しな??合?、キー={0} 、?={1}、from={2} です?
879 *
880 * @og.rev 4.2.0.1 (2008/03/27) 新規追?
881 *
882 * @param keys メ?ージリソースのキー(CSV)
883 * @see #setLbl( String )
884 * @deprecated lblParamKeys 属?を使用してください?
885 */
886 @Deprecated public void setMsgParamKeys( final String keys ) {
887 msgParamKeys = getCSVParameter( keys );
888 }
889
890 /**
891 * 【TAG】ラベルリソースの引数をカンマ区?で?します?
892 *
893 * @og.tag
894 * ラベルリソースのキーをカンマ区?で?することで、設定します?
895 * ラベルに引数( {0},{1} など ) がある?合?ここで?した??
896 * ?に、{0},{1},{2}・・・ に当てはめて?ます?
897 * キーワード?、カンマ区?で?し、それを?後?ラベルリソースで
898 * リソース変換を行います?(つまり?記述された?そ?も?では在りません)
899 * PL/SQL では?{#PN}" などと?して???、同様に "PN" と?しです?
900 * ??、where 条件に?されたキーと値は?#064;KEY と @VAL に?
901 * from と where の間???は?#064;TBL に対応付けられます?
902 * {@XXXX} 変数も使用できます?実データの値を取出した??合?、[PN]と
903 * すれば、DBTableModel の PN の値を取出します?
904 * なにも指定しな??合?、キー={0} 、?={1}、from={2} です?
905 *
906 * @og.rev 4.2.0.1 (2008/03/27) 新規追?
907 *
908 * @param keys メ?ージリソースのキー(CSV)
909 * @see #setMsg( String )
910 */
911 public void setLblParamKeys( final String keys ) {
912 msgParamKeys = getCSVParameter( keys );
913 }
914
915 /**
916 * 【TAG】このチェ?を行う、SQLタイ?を指定します?
917 *
918 * @og.tag
919 * SQLタイプ?、INSERT,COPY,UPDATE,MODIFY,DELETE などの記号を指定します?
920 * ?には、result 画面から update 画面へ遷移するとき?、command と
921 * 同じにしておけばよいでしょ??
922 * これは、execType とマッチした?合?み、このチェ?が??れます?
923 * 簡?equals タグの代役に使用できます?
924 * なにも指定しな??合?、チェ?は実行されます?
925 *
926 * @og.rev 4.1.2.0 (2008/03/12) 新規追?
927 *
928 * @param type こ?チェ?を行う、SQLタイ?
929 */
930 public void setSqlType( final String type ) {
931 sqlType = nval( getRequestParameter( type ),sqlType );
932 }
933
934 /**
935 * 【TAG】このチェ?を行う、実行タイ?を指定します?
936 *
937 * @og.tag
938 * 実行タイプ?、sqlType とマッチした?合?み、このチェ?が??れます?
939 * 簡?equals タグの代役に使用できます?
940 * execType は、??が可能です?単純な??マッチで、sqlType ?
941 * 含め?、実行されます?
942 * 例えば、sqlType={@sqlType} execType="INSERT|COPY" とすれば?
943 * sqlType に、INSERT また?、COPY が登録された?合にチェ?が掛かります?
944 * なにも指定しな??合?、チェ?は実行されます?
945 *
946 * @og.rev 4.1.2.0 (2008/03/12) 新規追?
947 *
948 * @param type こ?チェ?を行う、実行タイ?
949 */
950 public void setExecType( final String type ) {
951 execType = nval( getRequestParameter( type ),execType );
952 }
953
954 /**
955 * 【TAG】条件判定するカラ??を指定します?
956 *
957 * @og.tag
958 * ??カラ??の値と、conditionList の値を比?て?
959 * 存在する場合?、check処?実行します?
960 * こ?処?有効なのは、command="ENTRY" の場合?みです?
961 *
962 * @og.rev 4.2.0.1 (2008/03/27) 新規追?
963 *
964 * @param key カラ??
965 * @see #setConditionList( String )
966 */
967 public void setConditionKey( final String key ) {
968 conditionKey = nval( getRequestParameter( key ),null ) ;
969 }
970
971 /**
972 * 【TAG】条件判定する?のリストを?|"で区?て登録しま?初期値:無条件)?
973 *
974 * @og.tag
975 * conditionKey とペアで?します?ここには、カラ??設定?のリストを
976 * ?することで、?条件(??結合)での比?行い、リストにカラ???
977 * 存在する場合?み、check処?実行します?
978 * こ?処?有効なのは、command="ENTRY" の場合?みです?
979 * 設定しな??合?、無条件に実行します?
980 *
981 * @og.rev 4.2.0.1 (2008/03/27) 新規追?
982 *
983 * @param list 条件判定する?("|"で区?
984 * @see #setConditionKey( String )
985 */
986 public void setConditionList( final String list ) {
987 conditionList = nval( getRequestParameter( list ),null ) ;
988 if( conditionList != null ) {
989 conditionList = "|" + conditionList + "|" ;
990 }
991 }
992
993 /**
994 * 【TAG】指定されたキーに従って、メモリ上???ブルに対してユニ?クキーチェ?を行います?
995 *
996 * @og.tag
997 * ユニ?クキーチェ?を行うキーを指定します?ここで、指定されたキーに対して?
998 * DBTableModelの値をチェ?し?全てのキーに同じ値となって?行が存在すればエラーとなります?
999 * こ?チェ?は、command="ENTRY"の場合?み有効です?
1000 * また?こ?チェ?は他?チェ?(DB存在チェ?など)と同時に処?ることはできません?
1001 * キーが指定され手?場合?、??部?記述されて?定義は無視されます?
1002 * errRemoveの属?がtrueに?されて?場合?重??、DBTableModelの並び?ら見て?
1003 * ??の行?み処?れ?2つめ以降?重??無視されます?
1004 * なお?キーはカンマ区?(CSV形?で??が可能です?
1005 *
1006 * @og.rev 4.3.4.0 (2008/12/01) 新規追?
1007 *
1008 * @param clm チェ?キー(CSV形?
1009 */
1010 public void setUniqCheckClms( final String clm ) {
1011 String tmp = nval( getRequestParameter( clm ),null );
1012 uniqCheckClms = StringUtil.csv2Array( tmp );
1013 }
1014
1015 /**
1016 * 【TAG】エラーが発生した際に、エラーメ?ージの表示前にincludeするJSPを指定します?
1017 *
1018 * @og.tag
1019 * エラーが発生した際に、エラーメ?ージの表示前にincludeするJSPを指定します?
1020 * エラーが発生して???合?、ここで?されたJSPが??れることはありません?
1021 * 通常は、戻るリンクなどを指定します?
1022 *
1023 * ??方法?、相対パス、絶対パスの両方で?することができます?
1024 * ?、絶対パスで?した?合?そ?基点は、コン?スト?ルートディレクトリになります?
1025 * ? beforeErrorJsp = "/jsp/common/history_back.jsp"
1026 *
1027 * @og.rev 5.1.9.0 (2010/08/01) 新規追?
1028 *
1029 * @param jsp 表示前にincludeするJSPファイル?
1030 */
1031 public void setBeforeErrorJsp( final String jsp ) {
1032 beforeErrorJsp = nval( getRequestParameter( jsp ),beforeErrorJsp );
1033 }
1034
1035 /**
1036 * 【TAG】エラーが発生した際に、エラーメ?ージの表示後にincludeするJSPを指定します?
1037 *
1038 * @og.tag
1039 * エラーが発生した際に、エラーメ?ージの表示前にincludeするJSPを指定します?
1040 * エラーが発生して???合?、ここで?されたJSPが??れることはありません?
1041 *
1042 * ??方法?、相対パス、絶対パスの両方で?することができます?
1043 * ?、絶対パスで?した?合?そ?基点は、コン?スト?ルートディレクトリになります?
1044 * ? afterErrorJsp = "/jsp/common/history_back.jsp"
1045 *
1046 * @og.rev 5.1.9.0 (2010/08/01) 新規追?
1047 *
1048 * @param jsp 表示後にincludeするJSPファイル?
1049 */
1050 public void setAfterErrorJsp( final String jsp ) {
1051 afterErrorJsp = nval( getRequestParameter( jsp ),afterErrorJsp );
1052 }
1053
1054 /**
1055 * 【TAG】データを?件選択済みとして処?るかど?[true/false]を指定しま?初期値:false)?
1056 *
1057 * @og.tag
1058 * 全ての??タを選択済み??タとして扱って処?ます?
1059 * 全件処?る?合に?true/false)を指定します?
1060 * 初期値は false です?
1061 *
1062 * @og.rev 5.1.9.0 (2010/08/01) 新規追?
1063 *
1064 * @param all 選択済みとして処?るかど?[true:全件選択済み/false:通常]
1065 */
1066 public void setSelectedAll( final String all ) {
1067 selectedAll = nval( getRequestParameter( all ),selectedAll );
1068 }
1069
1070 /**
1071 * ??行番号の、カラ?o配?(int[])に対応した?の配?を返します?
1072 *
1073 * 表示??タの HybsSystem.ROW_SEL_KEY を?に?ばれた 行を
1074 * 処??対象とします?
1075 *
1076 * @og.rev 4.2.0.1 (2008/03/27) row と clm を?れ替えます?(他とあわせま?
1077 *
1078 * @param row 行番号
1079 * @param clmNo カラ?o配?
1080 *
1081 * @return 行番号とカラ?o配?に対応した?値の配?
1082 */
1083 // private String[] getTableModelData( final int[] clmNo, final int row ) {
1084 private String[] getTableModelData( final int row, final int[] clmNo ) {
1085 String[] values = new String[clmNo.length];
1086 for( int i = 0; i < values.length; i++ ) {
1087 values[i] = table.getValue( row, clmNo[i] );
1088 }
1089 return values;
1090 }
1091
1092 /**
1093 * ??行番号の、カラ?o配?(int[])に対応したカラ?の配?を返します?
1094 *
1095 * @og.rev 4.3.1.1 (2008/08/23) ?
1096 *
1097 * @param clmNo カラ?o配?
1098 *
1099 * @return String[] カラ?o配?に対応した?カラ?の配?
1100 */
1101 // private String[] getTableModelClm( final int[] clmNo ) {
1102 // String[] clm = new String[clmNo.length];
1103 // for( int i = 0; i < clm.length; i++ ) {
1104 // clm[i] = table.getColumnName( clmNo[i] );
1105 // }
1106 // return clm;
1107 // }
1108
1109 /**
1110 * カラ?o配?(int[])に対応したカラ?のメ?ージリソース??を返します?
1111 *
1112 * @og.rev 4.3.1.1 (2008/08/23) ErrMessageManager ?クラスへ移?
1113 *
1114 * @param clmNo カラ?o配?
1115 *
1116 * @return カラ?o配?に対応した?カラ?のメ?ージリソース
1117 */
1118 // private String getKeysLabel( final int[] clmNo ) {
1119 // ResourceManager resource = getResource();
1120 //
1121 // StringBuilder buf = new StringBuilder();
1122 // if( clmNo.length > 0 ) {
1123 // String key = table.getColumnName( clmNo[0] );
1124 // buf.append( resource.getLabel( key ) );
1125 // for( int i=1; i<clmNo.length; i++ ) {
1126 // key = table.getColumnName( clmNo[i] );
1127 // buf.append( "," ).append( resource.getLabel( key ) );
1128 // }
1129 // }
1130 //
1131 // return buf.toString();
1132 // }
1133
1134 /**
1135 * エラーメ?ージの前後に処?るJSPをインクルードします?
1136 *
1137 * @og.rev 5.1.9.0 (2010/08/01) 新規作?
1138 *
1139 * @param jsp JSP?
1140 */
1141 private void includeJsp( final String jsp ) {
1142 try {
1143 pageContext.include( jsp, false );
1144 } catch ( IOException ex ) {
1145 String errMsg = jsp + " の include に失敗しました?";
1146 throw new HybsSystemException( errMsg,ex );
1147 } catch ( ServletException ex ) {
1148 String errMsg = jsp + " の include に失敗しました?";
1149 throw new HybsSystemException( errMsg,ex );
1150 }
1151 }
1152
1153 /**
1154 * 表示??タの HybsSystem.ROW_SEL_KEY を?に?ばれた 行を処??対象とします?
1155 *
1156 * <del>rowNo[] ?null の場合?み、取込を行います?</del>
1157 *
1158 * @og.rev 5.1.9.0 (2010/08/01) 新規追?
1159 *
1160 * @return 選択行?配?
1161 */
1162 @Override
1163 protected int[] getParameterRows() {
1164 final int[] rowNo ;
1165 if( selectedAll ) {
1166 int rowCnt = table.getRowCount();
1167 rowNo = new int[ rowCnt ];
1168 for( int i=0; i<rowCnt; i++ ) {
1169 rowNo[i] = i;
1170 }
1171 } else {
1172 rowNo = super.getParameterRows();
1173 }
1174 return rowNo ;
1175 }
1176
1177 /**
1178 * ErrMessage を管?て? メソ????クラス
1179 *
1180 * 繰返し処?と、固定部が混在したエラーメ?ージで、固定部を?に処??
1181 * 繰返し部は、?時に処?るよ?しました?
1182 * また?実際にエラーが発生して?になるまで、実行遅延させます?
1183 *
1184 * @og.rev 4.2.1.0 (2008/04/11) 新規追?
1185 * @og.rev 4.3.0.0 (2008/07/24) クラス宣?static?
1186 */
1187 private static final class ErrMessageManager {
1188 // 引数として初期設定される変数
1189 private String title = null;
1190 private String from = null;
1191 private String[] msgKeys = null;
1192 private ResourceManager resource = null;
1193 private DBTableModel table = null;
1194 private int[] clmNo = null;
1195
1196 // ?引数として処?れたキャ?ュ値
1197 private ErrorMessage errMessage = null;
1198 private String names = null;
1199 private String fromLbl = null;
1200 private String[] msgVals = null;
1201
1202 private boolean isFirst = true; // 初期化されて??true
1203
1204 /**
1205 * ErrMessage のタイトルを設定します?
1206 *
1207 * @param title タイトル
1208 */
1209 public void setTitle( final String title ) { this.title = title; }
1210
1211 /**
1212 * 処?象の??ブル名を設定します?
1213 *
1214 * @param from ??ブル?
1215 */
1216 public void setFrom( final String from ) { this.from = from; }
1217
1218 /**
1219 * 処?象の??ブルオブジェクトを設定します?
1220 *
1221 * @param table DBTableModelオブジェク?
1222 */
1223 public void setDBTableModel( final DBTableModel table ) { this.table = table; }
1224
1225 /**
1226 * ResourceManagerオブジェクトを設定します?
1227 *
1228 * @param resource ResourceManagerオブジェク?
1229 */
1230 public void setResourceManager( final ResourceManager resource ) { this.resource = resource; }
1231
1232 /**
1233 * msgParamKeys 属?の配?を設定します?
1234 *
1235 * @param msgKeys 属?の配?
1236 */
1237 public void setParamKeys( final String[] msgKeys ) { this.msgKeys = msgKeys; }
1238
1239 /**
1240 * カラ?列を設定します?
1241 *
1242 * @param clmNo カラ?
1243 */
1244 public void setClmNos( final int[] clmNo ) { this.clmNo = clmNo ; }
1245
1246 /**
1247 * 初期処?行います?
1248 * エラー処??、エラー時?み実行する為、??な??合?、??不要です?
1249 * ??のエラー出力までは、?部オブジェクト?構築??行いません?
1250 * ?回目以降?、?部変数にキャ?ュされた変換値を利用して??化します?
1251 *
1252 * @og.rev 4.2.3.2 (2008/06/20) from が?null なら?なにもしな??
1253 */
1254 private void firstExecute() {
1255 errMessage = new ErrorMessage( title );
1256
1257 // ??ブル(from) をキーにラベルリソースから値を取得します?
1258 // 4.2.3.2 (2008/06/20) from が?null なら?なにもしな??
1259 if( from != null ) {
1260 fromLbl = resource.getLabel( from );
1261 }
1262
1263 // カラ?号配?から、カラ?のラベルリソース??のCSV??を作?します?
1264 names = getKeysLabel( clmNo );
1265
1266 if( msgKeys != null && msgKeys.length > 0 ) {
1267 int size = msgKeys.length;
1268 msgVals = new String[size] ;
1269
1270 for( int i=0; i<size; i++ ) {
1271 String key = msgKeys[i] ;
1272 if( key != null ) {
1273 if( "@KEY".equals( key ) ) { msgVals[i] = names; }
1274 else if( "@TBL".equals( key ) ) { msgVals[i] = fromLbl;}
1275 else if( key.startsWith( "{#" ) && key.endsWith( "}" ) ) {
1276 msgVals[i] = resource.getLabel( key.substring( 2,key.length()-1 ));
1277 }
1278 else {
1279 msgVals[i] = key;
1280 }
1281 }
1282 }
1283 }
1284 }
1285
1286 /**
1287 * カラ?o配?(int[])に対応したカラ?のメ?ージリソース??を返します?
1288 *
1289 * @param clmNo カラ?o配?
1290 * @return カラ?o配?に対応した?カラ?のメ?ージリソース
1291 */
1292 private String getKeysLabel( final int[] clmNo ) {
1293 StringBuilder buf = new StringBuilder();
1294 if( table != null && clmNo.length > 0 ) {
1295 String key = table.getColumnName( clmNo[0] );
1296 buf.append( resource.getLabel( key ) );
1297 for( int i=1; i<clmNo.length; i++ ) {
1298 key = table.getColumnName( clmNo[i] );
1299 buf.append( "," ).append( resource.getLabel( key ) );
1300 }
1301 }
1302
1303 return buf.toString();
1304 }
1305
1306 /**
1307 * カラ?列を設定します?
1308 *
1309 * @og.rev 4.3.5.7 (2008/03/22) エラーメ?ージの行番号を実際の行番号と??させる?
1310 *
1311 * @param row カラ?
1312 * @param id カラ?
1313 * @param values ??行に対する値
1314 */
1315 public void addMessage( final int row, final String id, final String[] values ) {
1316 if( isFirst ) { firstExecute(); isFirst = false; }
1317
1318 String vals = StringUtil.array2csv( values );
1319 if( msgVals == null ) {
1320 // errMessage.addMessage( row, ErrorMessage.NG, id, names, vals, fromLbl );
1321 errMessage.addMessage( row + 1, ErrorMessage.NG, id, names, vals, fromLbl );
1322 }
1323 else {
1324 int size = msgKeys.length;
1325 String[] args = new String[size] ;
1326
1327 for( int i=0; i<size; i++ ) {
1328 String key = msgVals[i] ;
1329 if( key != null ) {
1330 if( "@VAL".equals( key ) ) { args[i] = vals; }
1331 else if( key.startsWith( "[" ) && key.endsWith( "]" ) ) {
1332 if( table != null ) {
1333 args[i] = table.getValue( row,key.substring( 1,key.length()-1 ) );
1334 }
1335 }
1336 else {
1337 args[i] = key;
1338 }
1339 }
1340 }
1341 // errMessage.addMessage( row, ErrorMessage.NG, id, args );
1342 errMessage.addMessage( row + 1, ErrorMessage.NG, id, args );
1343 }
1344 }
1345
1346 /**
1347 * ErrorMessageオブジェクトを返します?
1348 *
1349 * @return ErrorMessage オブジェク?
1350 */
1351 public ErrorMessage getErrMessage() { return errMessage; }
1352 }
1353
1354 /**
1355 * シリアライズ用のカスタ?リアライズ書き込みメソ?
1356 *
1357 * @og.rev 4.0.0.0 (2006/09/31) 新規追?
1358 * @serialData
1359 *
1360 * @param strm ObjectOutputStreamオブジェク?
1361 */
1362 private void writeObject( final ObjectOutputStream strm ) throws IOException {
1363 strm.defaultWriteObject();
1364 }
1365
1366 /**
1367 * シリアライズ用のカスタ?リアライズ読み込みメソ?
1368 *
1369 * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します?
1370 *
1371 * @og.rev 4.0.0.0 (2006/09/31) 新規追?
1372 * @serialData
1373 *
1374 * @param strm ObjectInputStreamオブジェク?
1375 * @see #release2()
1376 */
1377 private void readObject( final ObjectInputStream strm ) throws IOException, ClassNotFoundException {
1378 strm.defaultReadObject();
1379 }
1380
1381 /**
1382 * こ?オブジェクト???表現を返します?
1383 * 基本???目?使用します?
1384 *
1385 * @return こ?クラスの??表現
1386 */
1387 @Override
1388 public String toString() {
1389 return org.opengion.fukurou.util.ToString.title(this.getClass().getName() )
1390 .println( "VERSION", VERSION )
1391 .println( "tableId", tableId )
1392 .println( "dbid", dbid )
1393 .println( "command", command )
1394 .println( "exist", exist )
1395 .println( "msg", msg )
1396 .println( "Other...", getAttributes().getAttribute() ).fixForm().toString();
1397 }
1398 }