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