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