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(中止しなã�?に設定するå?合ã?後続å?ç�?�§は、{&#064;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開å§?終äº?–‡å­?&gt;&lt;) 存在チェãƒ?‚¯を実施するかどã�?�‹[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             * (&gt;&lt;) が含まれてã�?�Ÿエラーにする(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    }