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.File;
021 import java.io.IOException;
022 import java.io.ObjectInputStream;
023 import java.io.ObjectOutputStream;
024 import java.util.Locale;
025 import java.util.Map;
026 import java.util.Map.Entry;
027 import java.util.Arrays;
028
029 import org.opengion.fukurou.business.ArrayTableModel;
030 import org.opengion.fukurou.business.BizLogicHelper;
031 import org.opengion.fukurou.db.Transaction;
032 import org.opengion.fukurou.db.TransactionReal;
033 import org.opengion.fukurou.util.ErrMsg;
034 import org.opengion.fukurou.util.ErrorMessage;
035 import org.opengion.fukurou.util.HybsLoader;
036 import org.opengion.fukurou.util.HybsLoaderConfig;
037 import org.opengion.fukurou.util.HybsLoaderFactory;
038 import org.opengion.fukurou.util.StringUtil;
039 import org.opengion.hayabusa.common.HybsSystem;
040 import org.opengion.hayabusa.common.HybsSystemException;
041 import org.opengion.hayabusa.db.DBTableModel;
042
043 /**
044 * 業務ロジãƒ?‚¯を呼び出すためã?タグですã?
045 *
046 * logics属æ?に呼び出す業務ロジãƒ?‚¯のクラス名を記述しますã?
047 * こã?タグでは、è¤?•°の業務ロジãƒ?‚¯ã‚?度に呼び出すことができã?
048 * DB接続ã?commit,rollbackはä¸?•ªæœ?¾Œにã€?度のみ実行されますã?
049 * å�?¥務ロジãƒ?‚¯は、記述したé ?•ªに呼び出されますã?
050 *
051 * 業務ロジãƒ?‚¯は、{@link org.opengion.fukurou.business.BizLogicHelper}の
052 * 実è£?‚¯ラス、またã?、この実è£?‚¯ラスを継承したサブクラスであるå¿?¦�がありますã?
053 *
054 * 業務ロジãƒ?‚¯クラスにつã�?�¦は、ã?ãƒ?ƒˆãƒ??ロイ機è?により、動çš?‚³ンパイル、クラスロードが
055 * 行われますã?
056 *
057 * 業務ロジãƒ?‚¯のソースãƒ?‚£レクトリは、シスãƒ?ƒ リソースの BIZLOGIC_SRC_PATH で定義されますã?
058 * またã?同様にクラスãƒ?‚£レクトリは、シスãƒ?ƒ リソースの BIZLOGIC_CLASS_PATH で定義されますã?
059 * さらに、シスãƒ?ƒ リソースの BIZLOGIC_HOTDEPLOY ã‚?false に設定することで、動çš?‚³ンパイル
060 * 、クラスロードを行わなくすることもできますã?
061 * こã?場合ã?予めコンパイルされたクラスをã?初回呼び出し時に1回ã?みロードされますã?
062 *
063 * SystemData の USE_SQL_INJECTION_CHECK ã�?true かã?quotCheck 属æ?ã�?true の場合ã?ã€?
064 * ?³?±?¬インジェクション対策用のクォーãƒ?‚£ションチェãƒ?‚¯を行いますã?リクエスト引数に
065 * クォーãƒ?‚£ション(')が含まれると、エラーになりますã?
066 * 同様にUSE_XSS_CHECKがtrueかã?xssCheck属æ?がtrueの場合ã?ã€?
067 * クロスサイトススクリプティング(XSS)対策ã?ためless/greater than signのチェãƒ?‚¯を行いますã?
068 *
069 * ※ こã?タグは、Transaction タグの対象ですã?
070 *
071 * @og.formSample
072 * ●形式ï¼?
073 * ・<og:bizLog
074 * logics = "業務ロジãƒ?‚¯のクラスå�?
075 * command = "ENTRY"
076 * scope = "session"
077 * dbid = "DEFAULT"
078 * tableId = "DEFAULT"
079 * selectedAll = "false"
080 * modifyType = "A"
081 * keys = "SYSTEM_ID"
082 * vals = "{@SYSTEM_ID}"
083 * stopError = "true"
084 * quotCheck = "true"
085 * xssCheck = "true"
086 * debug = "false"
087 * />
088 * ●body?šなã�?
089 *
090 * ●Tag定義??
091 * <og:bizLogic
092 * logics ○ã?TAG】実行する業務ロジãƒ?‚¯名をæŒ?®šしまã�?å¿??)ã€?
093 * command 【TAG】コマンドをセãƒ?ƒˆしまã�?初期値:ENTRY)
094 * scope 【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)
095 * dbid 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
096 * tableId 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
097 * selectedAll 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)
098 * modifyType 【TAG】DB検索時ã? モãƒ?‚£ファイタイプをæŒ?®šします[A:追åŠ?C:更新/D:削除]
099 * keys 【TAG】リンク先に渡すキーをCSV形式でè¤?•°æŒ?®šしまã�?
100 * vals 【TAG】リンク先に渡すå?をCSV形式でè¤?•°æŒ?®šしまã�?
101 * stopError 【TAG】å?ç�?‚¨ラーの時に処ç�?‚’中止するかどã�?�‹[true/false]を設定しまã�?初期値:true)
102 * quotCheck 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_SQL_INJECTION_CHECK[=true])
103 * xssCheck 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?(初期値:USE_XSS_CHECK[=true])
104 * multi 【TAG】vals属æ?でパラメーターを取得する際、è¤?•°件存在する場合に、å?をé?結するかどã�?�‹を指定しまã�?初期値:false)
105 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
106 * />
107 *
108 * ●使用ä¾?
109 * <!-- 業務ロジãƒ?‚¯の呼び出しを行いまã�?-->
110 * <og:bizLogic logics="org.opengion.logic.gf9110.BizLogic_0001" keys="SYSTEM_ID" vals="{@MEM.SYSTEM_ID}" />
111 *
112 * @og.rev 5.1.1.0 (2009/12/01) 新規作æ?
113 * @og.group 業務ロジãƒ?‚¯
114 *
115 * @version 5.0
116 * @author Hiroki Nakamura
117 * @since JDK1.6,
118 */
119 public class BizLogicTag extends CommonTagSupport {
120 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
121 private static final String VERSION = "567020130727" ;
122 private static final long serialVersionUID = 567020130727L ;
123
124 /** command 引数に渡す事ã?出来ã‚?コマンãƒ? エントリー {@value} */
125 // private static final String CMD_ENTRY = "ENTRY" ;
126 public static final String CMD_ENTRY = "ENTRY" ; // 5.1.9.0 (2010/08/01)
127 // private static final String COMMAND_LIST = CMD_ENTRY;
128 private static final String ERR_MSG_ID = HybsSystem.ERR_MSG_KEY;
129
130 private String command = CMD_ENTRY;
131 private String[] logics = null;
132 private String dbid = null ;
133 private transient DBTableModel table = null;
134 private String tableId = HybsSystem.TBL_MDL_KEY;
135 private boolean selectedAll = false;
136 private String modifyType = null;
137 private String[] keys = null;
138 private String[] vals = null;
139
140 private boolean stopError = true;
141 private boolean quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" ); // 4.0.0 (2005/08/31)
142 private boolean xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.0.0.2 (2009/09/15)
143
144 private transient ErrorMessage errMessage = null;
145 private int errCode = ErrorMessage.OK;
146 private int executeCount = -1;
147 // private Connection conn = null; // 5.1.9.0 (2010/08/01) Transaction 対å¿?
148 private ArrayTableModel arrTable= null;
149 private HybsLoader loader = null;
150
151 private String srcDir = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "BIZLOGIC_SRC_PATH" );
152 private String classDir = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "BIZLOGIC_CLASS_PATH" );
153 private boolean isAutoCompile = HybsSystem.sysBool( "BIZLOGIC_AUTO_COMPILE" );
154 private boolean isHotDeploy = HybsSystem.sysBool( "BIZLOGIC_HOT_DEPLOY" );
155 private boolean isMulti = false; // 5.1.8.0 (2010/07/01) 追åŠ?
156
157 private static final String CLASS_PATH;
158
159 // HotDeploy機è?を使用する場合に、Javaクラスをコンパイルするためのクラスパスを設定しますã?
160 // 対象となるクラスパスは、WEB-INF/classes 及ã? WEB-INF/lib/*.jar ですã?
161
162 static {
163 StringBuilder sb = new StringBuilder();
164 sb.append( '.' ).append( File.pathSeparatorChar );
165 File lib = new File( HybsSystem.sys( "REAL_PATH" ) + "WEB-INF" + File.separator + "lib" );
166 File[] libFiles = lib.listFiles();
167 for( int i=0; i<libFiles.length; i++ ) {
168 // 5.1.1.2 (2009/12/10) File.pathSeparatorCharを使用
169 // 5.1.8.0 (2010/07/01) libの検索パスの不å?合対å¿?
170 // sb.append( libFiles[i] ).append( ';' );
171 sb.append( libFiles[i].getAbsolutePath() ).append( File.pathSeparatorChar );
172 }
173 sb.append( HybsSystem.sys( "REAL_PATH" ) + "WEB-INF" + File.separator + "classes" ).append( File.pathSeparatorChar );
174 // 5.1.8.0 (2010/07/01) bizの下も検索パスに追åŠ?
175 sb.append( HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "BIZLOGIC_CLASS_PATH" ) ).append( File.pathSeparatorChar );
176
177 CLASS_PATH = sb.toString();
178 }
179
180 /**
181 * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
182 *
183 * @og.rev 5.3.4.0 (2011/04/01) command=ENTRY以外ではDBTableModelの処ç�?‚’行わなã�??
184 *
185 * @return 後続å?ç�??æŒ?¤º(SKIP_BODY)
186 */
187 @Override
188 public int doStartTag() {
189 // 5.3.4.0 (2011/04/01)
190 // if( !check( command, COMMAND_LIST ) ) {
191 // return(SKIP_BODY);
192 // }
193
194 if( CMD_ENTRY.equals( command ) ) {
195 startQueryTransaction( tableId );
196 }
197
198 return( SKIP_BODY );
199 }
200
201 /**
202 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
203 *
204 * @og.rev 5.1.8.0 (2010/07/01) isMulti対å¿?
205 * @og.rev 5.3.4.0 (2011/04/01) command=ENTRY以外ではDBTableModelの処ç�?‚’行わなã�??
206 *
207 * @return 後続å?ç�??æŒ?¤º
208 */
209 @Override
210 public int doEndTag() {
211 debugPrint();
212
213 // 5.3.4.0 (2011/04/01)
214 // if( check( command, COMMAND_LIST ) ) {
215 useQuotCheck( quotCheck );
216 useXssCheck( xssCheck );
217
218 makeVals();
219 execute();
220
221 String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
222 if( err != null && err.length() > 0 ) {
223 setSessionAttribute( ERR_MSG_ID,errMessage );
224 }
225
226 if( table != null && ! commitTableObject( tableId, table ) ) {
227 jspPrint( "BizLoicTag 処ç�?�Œ割り込まれましたã€?BTableModel は登録しませんã€? );
228 return (SKIP_PAGE);
229 }
230
231 jspPrint( err );
232 // }
233
234 if( errCode >= ErrorMessage.NG && stopError ) {
235 return SKIP_PAGE;
236 }
237 else {
238 return EVAL_PAGE;
239 }
240 }
241
242 /**
243 * タグリブオブジェクトをリリースしますã?
244 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
245 *
246 * @og.rev 5.1.8.0 (2010/07/01) isMultiを追åŠ?
247 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対å¿?
248 */
249 @Override
250 protected void release2() {
251 super.release2();
252 command = CMD_ENTRY;
253 logics = null;
254 dbid = null;
255 table = null;
256 tableId = HybsSystem.TBL_MDL_KEY;
257 selectedAll = false;
258 modifyType = null;
259 keys = null;
260 vals = null;
261 stopError = true;
262 quotCheck = HybsSystem.sysBool( "USE_SQL_INJECTION_CHECK" );
263 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" );
264 errMessage = null;
265 errCode = ErrorMessage.OK;
266 executeCount = -1;
267 // conn = null; // 5.1.9.0 (2010/08/01) Transaction 対å¿?
268 arrTable = null;
269 loader = null;
270 srcDir = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "BIZLOGIC_SRC_PATH" );
271 classDir = HybsSystem.sys( "REAL_PATH" ) + HybsSystem.sys( "BIZLOGIC_CLASS_PATH" );
272 isAutoCompile = HybsSystem.sysBool( "BIZLOGIC_AUTO_COMPILE" );
273 isHotDeploy = HybsSystem.sysBool( "BIZLOGIC_HOT_DEPLOY" );
274 isMulti = false; // 5.1.8.0 (2010/07/01) 追åŠ?
275 }
276
277 /**
278 * 業務ロジãƒ?‚¯を実行しますã?
279 *
280 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対å¿?
281 * @og.rev 5.3.4.0 (2011/04/01) command=ENTRY以外ではDBTableModelの処ç�?‚’行わなã�??
282 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更 、Transaction対応で、close処ç�?‚’入れるã€?
283 * @og.rev 5.6.0.3 (2012/01/24) arrTable に変更されたå?をã?table に書き戻すå?ç�?‚’追åŠ?
284 */
285 private void execute() {
286 int[] rowNos = new int[0];
287
288 // 5.3.4.0 (2011/04/01)
289 if( CMD_ENTRY.equals( command ) ) {
290 table = (DBTableModel)getObject( tableId );
291 }
292
293 if( table != null ) {
294 rowNos = getParameterRows();
295 String[][] tblVals = new String[rowNos.length][table.getColumnCount()];
296 String[] modTypes = new String[rowNos.length];
297 for( int i=0; i<rowNos.length; i++ ) {
298 tblVals[i] = table.getValues( rowNos[i] );
299 modTypes[i] = table.getModifyType( rowNos[i] );
300 }
301 arrTable = new ArrayTableModel( table.getNames(), tblVals, modTypes );
302 }
303
304 // 5.1.9.0 (2010/08/01) Transaction 対å¿?
305 // final Transaction tran ;
306 Transaction tran = null;
307 // 5.3.7.0 (2011/07/01) Transaction対応で、close処ç�?‚’入れるã€?
308 try {
309 TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
310 if( tranTag == null ) {
311 // tran = new TransactionReal( dbid,getApplicationInfo() );
312 tran = new TransactionReal( getApplicationInfo() ); // 5.3.7.0 (2011/07/01) 引数変更
313 }
314 else {
315 tran = tranTag.getTransaction();
316 }
317 // conn = ConnectionFactory.connection( dbid, null );
318 errMessage = new ErrorMessage();
319 loader = HybsLoaderFactory.getLoader(
320 new HybsLoaderConfig( srcDir, classDir, isAutoCompile, isHotDeploy, CLASS_PATH )
321 );
322
323 boolean rtn = false;
324 for( int i=0; i<logics.length; i++ ) {
325 // BizLogic logic = (BizLogic)loader.newInstance( logics[i] );
326 // rtn = call( logic );
327 // rtn = call( logics[i] );
328 rtn = call( logics[i] , tran ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
329 if( !rtn ) { break; }
330 }
331
332 // 5.6.0.3 (2012/01/24) arrTable に変更されたå?をã?table に書き戻すå?ç�?
333 if( arrTable != null ) {
334 Map<Integer,String[]> valMap = arrTable.getModifyVals();
335 if( valMap != null ) {
336 for( Map.Entry<Integer, String[]> entr : valMap.entrySet()) {
337 int seq = entr.getKey(); // intValue() は省略できるã€?
338 String[] vals = entr.getValue();
339 table.setValues( vals , rowNos[seq] ); // DBTableModel へ書き戻しã?å…??行番号に変換がå¿?¦�ã?
340 }
341 }
342 }
343
344 executeCount = rowNos.length;
345 errCode = errMessage.getKekka();
346 setRequestAttribute( "DB.COUNT" , String.valueOf( executeCount ) );
347 setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
348
349 if( errCode < ErrorMessage.NG ) {
350 // Closer.commit( conn );
351 tran.commit(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
352
353 if( table != null && rowNos.length > 0 ) {
354 for( int j=rowNos.length-1; j>=0; j-- ) {
355 int row = rowNos[j];
356 if( DBTableModel.DELETE_TYPE.equals( table.getModifyType( row ) ) ) {
357 table.removeValue( row );
358 }
359 else {
360 table.resetModify( row );
361 }
362 }
363 }
364 }
365 else {
366 // Closer.rollback( conn );
367 tran.rollback(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
368 }
369 // ConnectionFactory.close( conn, dbid );
370 // tran.close(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
371 }
372 finally {
373 if( tran != null ) { tran.close(); }
374 }
375
376 // エラーメãƒ?‚»ージの行番号をå?の選択行に戻しますã?
377 ErrMsg[] errs = errMessage.toArray();
378 ErrorMessage errMsgTmp = new ErrorMessage();
379 for( int i=0; i<errs.length; i++ ) {
380 if( table != null && rowNos.length > 0 ) {
381 errMsgTmp.addMessage( errs[i].copy( rowNos[errs[i].getNo()] + 1 ) );
382 }
383 else {
384 errMsgTmp.addMessage( errs[i].copy( errs[i].getNo() + 1 ) );
385 }
386 }
387 errMessage = errMsgTmp;
388 }
389
390 /**
391 * 業務ロジãƒ?‚¯をCallしますã?
392 *
393 * @og.rev 5.1.9.0 (2010/08/01) Transaction 対å¿?
394 * @og.rev 5.1.9.0 (2010/08/01) DBIDをセãƒ?ƒˆ、ConnectonではなくTransactionを渡すよã�?�«変更
395 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
396 *
397 * @param logicName 業務ロジãƒ?‚¯å�?
398 * @param tran Transactionトランザクションオブジェクãƒ?
399 *
400 * @return 業務ロジãƒ?‚¯の呼び出しが成功したかどã�?�‹
401 */
402 // private boolean call( final BizLogic logic ) {
403 // private boolean call( final String logicName ) {
404 private boolean call( final String logicName , final Transaction tran ) {
405 BizLogicHelper logicHp = new BizLogicHelper( logicName, loader );
406
407 if( logicHp.isRequireTable() ) {
408 if( arrTable == null ) {
409 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
410 // throw new HybsSystemException( "TableModelが存在しません。logic=[" + logicName + "]" );
411 String errMsg = "TableModelが存在しません。logic=[" + logicName + "]" ;
412 throw new HybsSystemException( errMsg );
413 }
414 else if( arrTable.getRowCount() == 0 ) { return true; } // 0件のときã?呼び出ししなã�?
415 else { logicHp.setTable( arrTable ); }
416 }
417 // logicHp.setConnection( conn );
418 // logicHp.setConnection( tran.getConnection( dbid ) ); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
419 logicHp.setTransaction( tran );
420 logicHp.setDbid( dbid ); // 5.1.9.0 (2010/08/01) DBIDをセãƒ?ƒˆ
421 logicHp.setKeys( keys );
422 logicHp.setVals( vals );
423 logicHp.setUserId( getUser().getUserID() );
424 logicHp.setParentPgId( getGUIInfoAttri( "KEY" ) );
425 logicHp.setLoader( loader );
426 if( isDebug() ) { logicHp.setDebug(); }
427
428 boolean rtn = false;
429 try {
430 rtn = logicHp.exec();
431 }
432 catch ( Throwable th ) {
433 // Closer.rollback( conn );
434 // ConnectionFactory.remove( conn, dbid );
435 tran.rollback(); // 5.1.9.0 (2010/08/01) Transaction 対å¿?
436 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
437 // throw new HybsSystemException( "業務ロジãƒ?‚¯の処ç�?¸にエラーが発生しましたã€?, th );
438 String errMsg = "業務ロジãƒ?‚¯の処ç�?¸にエラーが発生しましたã€? + th.getMessage() ;
439 throw new HybsSystemException( errMsg,th );
440 }
441 errMessage.append( logicHp.getErrMsg() );
442
443 setRequestAttribute( logicHp.getClass().getSimpleName() + ".RETURN" , logicHp.getReturn() );
444 setRequestAttribute( "RETURN", logicHp.getReturn() );
445
446 if( isDebug() ) { jspPrint( logicHp.getDebugMsg() ); }
447
448 return rtn;
449 }
450
451 /**
452 * Valsの配å?を生成しますã?
453 *
454 * @og.rev 5.1.8.0 (2010/07/01) 新規作æ?-
455 * @og.rev 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
456 */
457 private void makeVals() {
458 if( keys != null && keys.length > 0 ) {
459 boolean isSetVal = ( vals == null || vals.length == 0 ) ? false : true;
460 if( isSetVal ) {
461 if( keys.length != vals.length ) {
462 // 5.6.7.0 (2013/07/27) Exception ã‚?throw するときã?ä¸?—¦、errMsg 変数にセãƒ?ƒˆしますã?
463 // throw new HybsSystemException( "keysとValsの個数が異なりますã?" );
464 String errMsg = "keysとValsの個数が異なりますã?" + HybsSystem.CR
465 + " keys=" + Arrays.toString( keys ) + HybsSystem.CR
466 + " vals=" + Arrays.toString( vals ) ;
467 throw new HybsSystemException( errMsg );
468 }
469 }
470 else {
471 vals = new String[keys.length];
472 }
473 for( int i=0; i<keys.length; i++ ) {
474 if( isSetVal ) {
475 if( isMulti ) { vals[i] = StringUtil.array2csv( getRequestParameterValues( vals[i] ) );}
476 else { vals[i] = getRequestParameter( vals[i] ); }
477 }
478 else {
479 if( isMulti ) { vals[i] = StringUtil.array2csv( getRequestValues( keys[i] ) );}
480 else { vals[i] = getRequestValue( keys[i] ); }
481 }
482 }
483 }
484 }
485
486 /**
487 * 【TAG】コマンドをセãƒ?ƒˆしまã�?初期値:ENTRY)ã€?
488 *
489 * @og.tag
490 * command=ENTRY以外ではDBTableModelの処ç�?‚’行いませんã€?
491 * コマンドã?,HTMLから[get/post]æŒ?®šされますã?で,CMD_xxx で設定される
492 * フィールド定数値のã�?�¥れかをã?æŒ?®šできますã?
493 *
494 * @param cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?—å?)
495 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.BizLogicTag.CMD_ENTRY">コマンド定数</a>
496 */
497 public void setCommand( final String cmd ) {
498 String cmd2 = getRequestParameter( cmd );
499 if( cmd2 != null && cmd2.length() >= 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
500 }
501
502 /**
503 * 【TAG】実行する業務ロジãƒ?‚¯名をæŒ?®šしますã?
504 *
505 * @og.tag
506 * 実行する業務ロジãƒ?‚¯名をæŒ?®šしますã?業務ロジãƒ?‚¯名ã?、クラス名をæŒ?®šしますã?
507 * クラス名につã�?�¦は、クラス自身の名称のみを指定することができますã?
508 * (パッケージ名を含めた完å?な形のクラス名をæŒ?®šすることもできまã�?
509 * またã?カンマ区åˆ?‚Šで、è¤?•°æŒ?®šすることもできますã?
510 * こã?場合ã?æŒ?®šしたé?番に処ç�?�•れますã?
511 *
512 * @param lgs 業務ロジãƒ?‚¯å�?
513 */
514 public void setLogics( final String lgs ) {
515 logics = getCSVParameter( lgs );
516 }
517
518 /**
519 * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
520 *
521 * @og.tag
522 * Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
523 * これは、シスãƒ?ƒ リソースで、DEFAULT_DB_URL 等でæŒ?®šしてã�?‚‹ ãƒ??タベã?ス接続å?
524 * æƒ??に、XX_DB_URL を定義することでã€?dbid="XX" とすると、この 接続å?を使用して
525 * ãƒ??タベã?スにアクセスできますã?
526 *
527 * @param id ãƒ??タベã?ス接続ID
528 */
529 public void setDbid( final String id ) {
530 dbid = nval( getRequestParameter( id ),dbid );
531 }
532
533 /**
534 * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
535 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
536 *
537 * @og.tag
538 * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
539 * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
540 * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
541 * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
542 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
543 *
544 * @param id sessionに登録する時ã? ID
545 */
546 public void setTableId( final String id ) {
547 tableId = nval( getRequestParameter( id ),tableId );
548 }
549
550 /**
551 * 【TAG】データをå?件選択済みとして処ç�?�™るかどã�?�‹[true/false]を指定しまã�?初期値:false)ã€?
552 *
553 * @og.tag
554 * 全てのãƒ??タを選択済みãƒ??タとして扱って処ç�?�—ますã?
555 * 全件処ç�?�™るå?合にã€?true/false)を指定しますã?
556 * 初期値は false ですã?
557 *
558 * @param all ãƒ??タをå?件選択済み [true:全件選択済み/false:通常]
559 */
560 public void setSelectedAll( final String all ) {
561 selectedAll = nval( getRequestParameter( all ),selectedAll );
562 }
563
564 /**
565 * 【TAG】DB検索時ã? モãƒ?‚£ファイタイプをæŒ?®šします[A:追åŠ?C:更新/D:削除]ã€?
566 *
567 * @og.tag
568 * DB検索時に、そのãƒ??タをA(追åŠ?、C(更新)、D(削除)のモãƒ?‚£ファイタイプを
569 * つけた状態にしますã?
570 * そã?状態で、そのまま、update する事が可能になりますã?
571 *
572 * @param type DB検索時ã?モãƒ?‚£ファイタイãƒ?[A:追åŠ?C:更新/D:削除]
573 */
574 public void setModifyType( final String type ) {
575 modifyType = nval( getRequestParameter( type ),modifyType );
576 }
577
578 /**
579 * 【TAG】リンク先に渡すキーをCSV形式でè¤?•°æŒ?®šしますã?
580 *
581 * @og.tag リンク先に渡すキーを指定しますã?
582 * Keysã�?�‘を指定して、Valsを指定しなã�??合ã?KeysでæŒ?®šされたé ?›®名に対応するパラメーターを取得しã€?
583 * Valsとして使用しますã?
584 *
585 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
586 *
587 * @param key リンク先に渡すキー(CSV形å¼?
588 */
589 public void setKeys( final String key ) {
590 // keys = getCSVParameter( key );
591 keys = getCSVParameter( getRequestParameter( key ) );
592 }
593
594 /**
595 * 【TAG】リンク先に渡すå?をCSV形式でè¤?•°æŒ?®šしますã?
596 *
597 * @og.tag リンク先に渡すå?を指定しますã?
598 * Keysã�?�‘を指定して、Valsを指定しなã�??合ã?KeysでæŒ?®šされたé ?›®名に対応するパラメーターを取得しã€?
599 * Valsとして使用しますã?
600 * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
601 * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
602 *
603 * @og.rev 3.5.6.2 (2004/07/05) CommonTagSupport#getCSVParameter を使用
604 * @og.rev 5.1.8.0 (2010/07/01) isMuitl対å¿?
605 *
606 * @param val リンク先に渡すå?(CSV形å¼?
607 */
608 public void setVals( final String val ) {
609 // vals = getCSVParameter( val );
610 vals = StringUtil.csv2Array( val );
611 }
612
613 /**
614 * 【TAG】å?ç�?‚¨ラーの時に処ç�?‚’中止するかどã�?�‹[true/false]を設定しまã�?初期値:true)ã€?
615 *
616 * @og.tag
617 * false(中止しなã�?に設定するå?合ã?後続å?ç�?�§は、{@DB.ERR_CODE}の値によりã€?
618 * PLSQL/SQLの異常/正常終äº?�«よってåˆ?²�å?ç�??可能となりますã?
619 * 初期値は、true(中止する)ですã?
620 *
621 * @param flag [true:中止する/false:中止しない]
622 */
623 public void setStopError( final String flag ) {
624 stopError = nval( getRequestParameter( flag ),stopError );
625 }
626
627 /**
628 * 【TAG】リクエスト情報の クォーãƒ?‚£ション(') 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
629 * (初期値:USE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
630 *
631 * @og.tag
632 * ?³?±?¬インジェクション対策ã?ä¸?�¤として、暫定的ではありますが、SQLのパラメータに
633 * 渡す文字å?にクォーãƒ?‚£ション(') を許さなã�?¨定にすれば、ある程度は防止できますã?
634 * 数字タイプã?引数にはã€?or 5=5 などのクォーãƒ?‚£ションを使用しなã�?‚³ードを埋めてもã?
635 * 数字チェãƒ?‚¯で検å?可能ですã?æ–?—タイプã?場合ã?、å¿?�š (')をã?ずしてã€?
636 * ' or 'A' like 'A のような形式になる為ã€?')チェãƒ?‚¯ã�?�‘でも有効ですã?
637 * (') が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
638 * (初期値:シスãƒ?ƒ 定数のUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])ã€?
639 *
640 * @param flag クォーãƒ?‚£ションチェãƒ?‚¯ [true:する/それ以å¤?しない]
641 * @see org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK
642 */
643 public void setQuotCheck( final String flag ) {
644 quotCheck = nval( getRequestParameter( flag ),quotCheck );
645 }
646
647 /**
648 * 【TAG】リクエスト情報の HTMLTag開å§?終äº?–‡å?><) 存在チェãƒ?‚¯を実施するかどã�?�‹[true/false]を設定しまã�?
649 * (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
650 *
651 * @og.tag
652 * クロスサイトスクリプティング(XSS)対策ã?ä¸?’°としてless/greater than signにつã�?�¦のチェãƒ?‚¯を行いますã?
653 * (><) が含まれてã�?�Ÿエラーにする(true)?�かノã?チェãƒ?‚¯ã�?false)を指定しますã?
654 * (初期値:シスãƒ?ƒ 定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])ã€?
655 *
656 * @param flag XSSチェãƒ?‚¯する [true:チェãƒ?‚¯する/false:しない]
657 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
658 */
659 public void setXssCheck( final String flag ) {
660 xssCheck = nval( getRequestParameter( flag ),xssCheck );
661 }
662
663 /**
664 * 【TAG】vals属æ?でパラメーターを取得する際、è¤?•°件存在する場合に、å?をé?結するかどã�?�‹を指定しまã�?初期値:false)ã€?
665 *
666 * @og.tag
667 * こã?属æ?がtrueにæŒ?®šされた場合ã?パラメーターがè¤?•°存在する場合に、カンマで連結しますã?
668 * 初期値は、false(連結しなã�?ですã?
669 *
670 * @og.rev 5.1.8.0 (2010/07/01) 新規作æ?
671 *
672 * @param flag パラメーター連結するかどã�?�‹
673 */
674 public void setMulti( final String flag ) {
675 isMulti = nval( getRequestParameter( flag ),isMulti );
676 }
677
678 /**
679 * 表示ãƒ??タの HybsSystem.ROW_SEL_KEY をå?にã€?�¸ばれた 行を処ç�??対象としますã?
680 *
681 * @return 選択行ã?配å?
682 */
683 @Override
684 protected int[] getParameterRows() {
685 final int[] rowNo ;
686 if( selectedAll ) {
687 int rowCnt = table.getRowCount();
688 rowNo = new int[ rowCnt ];
689 for( int i=0; i<rowCnt; i++ ) {
690 rowNo[i] = i;
691 }
692 } else {
693 rowNo = super.getParameterRows();
694 }
695 return rowNo ;
696 }
697
698 /**
699 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
700 *
701 * @serialData ä¸?ƒ¨のオブジェクãƒ?DBTableModel,ErrorMessage)は、シリアライズされませんã€?
702 *
703 * @param strm ObjectOutputStreamオブジェクãƒ?
704 * @throws IOException 入出力エラーが発生したå?å�?
705 */
706 private void writeObject( final ObjectOutputStream strm ) throws IOException {
707 strm.defaultWriteObject();
708 }
709
710 /**
711 * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
712 *
713 * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
714 *
715 * @serialData ä¸?ƒ¨のオブジェクãƒ?DBTableModel,ErrorMessage)は、読み込まれませんã€?
716 *
717 * @param strm ObjectInputStreamオブジェクãƒ?
718 * @see #release2()
719 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
720 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
721 */
722 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
723 strm.defaultReadObject();
724 }
725
726 /**
727 * こã?オブジェクトã?æ–?—å?表現を返しますã?
728 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
729 *
730 * @return こã?クラスのæ–?—å?表現
731 */
732 @Override
733 public String toString() {
734 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
735 .println( "VERSION" ,VERSION )
736 .println( "command" ,command )
737 .println( "logics" ,logics )
738 .println( "dbid" ,dbid )
739 .println( "tableId" ,tableId )
740 .println( "selectedAll" ,selectedAll )
741 .println( "modifyType" ,modifyType )
742 .println( "keys" ,keys )
743 .println( "vals" ,vals )
744 .println( "stopError" ,stopError )
745 .println( "quotCheck" ,quotCheck )
746 .println( "xssCheck" ,xssCheck )
747 .println( "executeCount" ,executeCount )
748 .println( "errCode" ,errCode )
749 .println( "Other..." ,getAttributes().getAttribute() )
750 .fixForm().toString() ;
751 }
752 }