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 java.util.ArrayList;
019import java.util.List;
020import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
021
022import org.opengion.fukurou.util.ErrorMessage;
023import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
024import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
025import org.opengion.hayabusa.common.HybsSystem;
026import org.opengion.hayabusa.common.HybsSystemException;
027import org.opengion.hayabusa.db.DBTableModel;
028import org.opengion.hayabusa.db.Query;
029import org.opengion.hayabusa.resource.GUIInfo;
030
031import static org.opengion.fukurou.util.StringUtil.nval;
032import static org.opengion.fukurou.system.HybsConst.BR;                 // 6.1.0.0 (2014/12/26) refactoring
033
034/**
035 * SQL文を直接指定して、データベースに追加/更新/削除を行います(queryType="JDBCTableUpdate")。
036 *
037 * 存在チェックを行う場合は、tableExist タグと併用してください。
038 * 複雑な処理が必要な場合は、従来より使用しています、PLSQLをCALLする、
039 * plsqlUpdateタグを使用してください。
040 * また、tableUpdateParam タグを使用する事で、テーブル名とsqlTypeの指定で動的に
041 * SQL文を自動生成できます。これにより、追加、更新、削除やテーブルに関して、
042 * 単一のJSP画面ですべて対応できるようになります。
043 *
044 * ※ このタグは、Transaction タグの対象です。
045 *
046 * @og.formSample
047 * ●形式:<og:tableUpdate command="…" names="…" queryType="JDBCTableUpdate" >
048 *             {@SQL}
049 *         </og:update>
050 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
051 *
052 * ●Tag定義:
053 *   <og:tableUpdate
054 *       queryType          【TAG】Query を発行する為のクラスIDを指定します({@og.doc03Link queryType 初期値:JDBCTableUpdate})
055 *       sqlType            【TAG】BODY部に書かれている Param の SQLタイプを指定します
056 *       command            【TAG】コマンド (NEW,RENEW)をセットします(PlsqlUpdateTag,UpdateTag の場合は、ENTRY)
057 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
058 *       displayMsg         【TAG】検索結果を画面上に表示するメッセージリソースIDを指定します (初期値:VIEW_DISPLAY_MSG[=])
059 *       resourceType       【特殊】クリアするリソースの種類[GEA03/GEA04/GEA08]を指定します
060 *       conditionKey       【TAG】条件判定するカラムIDを指定します(初期値:null)
061 *       conditionList      【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)
062 *       tableId            【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
063 *       dbid               【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します
064 *       selectedAll        【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)
065 *       commitTableModel   【特殊】SQL実行後に結果をDBTableModelに反映させるかどうか[true/false]を指定します(初期値:true)
066 *       followCdkh         【TAG】DBTableModelの改廃Cに従って処理を行うかを指定します
067 *       quotCheck          【TAG】リクエスト情報の シングルクォート(') 存在チェックを実施するかどうか[true/false]を設定します(初期値:false)
068 *       useTimeView        【TAG】処理時間を表示する TimeView を表示するかどうかを指定します
069 *                                                                              (初期値:VIEW_USE_TIMEBAR[={@og.value SystemData#VIEW_USE_TIMEBAR}])。
070 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
071 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
072 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
073 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
074 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
075 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
076 *   >   ... Body ...
077 *   </og:tableUpdate>
078 *
079 * ●使用例
080 *    ・QUERYを他のJSPから渡す場合
081 *    【copy.jsp】
082 *        <og:hidden name="SQL" >
083 *          INSERT INTO GE41
084 *               (CLM,NAME_JA,LABEL_NAME,KBSAKU,SYSTEM_ID,LANG,
085 *               FGJ,DYSET,DYUPD,USRSET,USRUPD,PGUPD)
086 *          VALUES
087 *               ([CLM],[NAME_JA],[LABEL_NAME],[KBSAKU],[SYSTEM_ID],[LANG],
088 *               '1','{@USER.YMDH}','{@USER.YMDH}','{@USER.ID}','{@USER.ID}','{@GUI.KEY}')
089 *        </og:value>
090 *
091 *    【entry.jsp】
092 *        <og:tableUpdate
093 *            command   = "{@command}"
094 *            queryType = "JDBCTableUpdate"
095 *        {@SQL}
096 *        </og:tableUpdate>
097 *
098 *    ・tableUpdateParamを使用する場合
099 *    【entry.jsp】
100 *        <og:tableUpdate
101 *            command   = "{@command}"
102 *            queryType = "JDBCTableUpdate"
103 *            sqlType   = "{@sqlType}"        // tableUpdateParam の sqlType と一致
104 *        >
105 *            <og:tableUpdateParam
106 *                sqlType     = "{@sqlType}"       // INSERT,COPY,UPDATE,MODIFY,DELETE
107 *                table       = "{@TABLE_NAME}"    // 処理対象のテーブル名
108 *                names       = "{@names}"         // 処理対象のカラム名
109 *                omitNames   = "{@omitNames}"     // 処理対象外のカラム名
110 *                where       = "{@where}"         // 処理対象を特定するキー
111 *                constKeys   = "{@constKeys}"     // 処理カラム名の中の固定情報カラム名
112 *                constVals   = "{@constVals}"     // 処理カラム名の中の固定情報設定値
113 *            />
114 *        </og:tableUpdate>
115 *
116 *    ・処理の可否を指定する場合
117 *    【entry.jsp】
118 *        <og:tableUpdate
119 *            command   = "{@command}"
120 *            queryType = "JDBCTableUpdate"
121 *            conditionKey  ="…"      : 条件判定するカラムIDを指定(初期値は columnId )
122 *            conditionList ="…"      : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
123 *        {@SQL}
124 *        </og:tableUpdate>
125 *
126 * @og.rev 3.8.8.0 (2007/12/22) 新規作成
127 * @og.group DB登録
128 *
129 * @version  4.0
130 * @author   Kazuhiko Hasegawa
131 * @since    JDK5.0,
132 */
133public class TableUpdateTag extends QueryTag {
134        /** このプログラムのVERSION文字列を設定します。   {@value} */
135        private static final String VERSION = "6.9.9.0 (2018/08/20)" ;
136        private static final long serialVersionUID = 699020180820L ;
137
138        /** command 引数に渡す事の出来る コマンド  登録{@value} */
139        public static final String CMD_ENTRY  = "ENTRY" ;
140        // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
141        private static final Set<String> COMMAND_SET = new ArraySet<>( CMD_ENTRY );
142
143        // 処理を行う、リソースの種類を指定します。(GEA03,GEA04,GEA08 のどれか)
144        private String  sqlType                 ;                       // INSERT,COPY,UPDATE,MODIFY,DELETE
145        private String  resourceType    ;
146        private int             resTypeColNo    = -1;
147        private String  conditionKey    ;                       // 条件判定するカラムIDを指定(初期値は columnId )
148        private String  conditionList   ;                       // 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
149        private boolean selectedAll             ;
150        private boolean commitTableModel= true;         // 4.0.2.0 (2007/12/25)
151        private boolean followCdkh              ;                       // 4.3.2.0 (2008/09/09).
152        private boolean quotCheck               ;                       // 5.1.7.0 (2010/06/01) quotCheckを指定できるようにする。※但し、初期値はfalse固定。タイミングを見て修正要
153
154        /**
155         * デフォルトコンストラクター
156         *
157         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
158         */
159        public TableUpdateTag() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
160
161        /**
162         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
163         *
164         * @og.rev 4.0.0.0 (2007/11/14) 0件の場合でもstartQueryTransactionを通すように変更
165         * @og.rev 5.1.7.0 (2010/06/01) quotCheckを指定できるようにする。※但し、初期値はfalse固定。
166         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
167         *
168         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
169         */
170        @Override
171        public int doStartTag() {
172                if( !useTag() ) { return SKIP_BODY ; }  // 6.3.4.0 (2015/08/01)
173                dyStart = System.currentTimeMillis();
174
175                table = (DBTableModel)getObject( tableId );
176                startQueryTransaction( tableId );               // 4.0.0.0 (2007/11/14) 0件の場合でもdoEndでPAGE_SKIPしないように位置変更。
177                if( table == null || table.getRowCount() == 0 ||
178                        ! check( command, COMMAND_SET ) ) { return SKIP_BODY ; }
179                super.quotCheck = quotCheck;
180
181                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
182        }
183
184        /**
185         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
186         *
187         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
188         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
189         * @og.rev 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
190         * @og.rev 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
191         *
192         * @return      後続処理の指示
193         */
194        @Override
195        public int doEndTag() {
196                debugPrint();
197                if( !useTag() ) { return EVAL_PAGE ; }  // 6.3.4.0 (2015/08/01)
198
199                String label  = "";                             // 4.0.0 (2005/11/30) 検索しなかった場合。
200                if( check( command, COMMAND_SET ) ) {
201                        final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
202                        if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
203                                buf.append( executeCount )
204                                        .append( getResource().getLabel( displayMsg ) )
205                                        .append( BR );
206                        }
207
208                        // 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
209                        if( table != null && ! commitTableObject( tableId, table ) ) {
210                                if( errMessage == null ) { errMessage = new ErrorMessage( "TableUpdateTag Query Error!" ); }
211                                // ERR0041:検索処理中に割り込みの検索要求がありました。処理されません。
212                                errMessage.addMessage( 0,ErrorMessage.NG,"ERR0041" );   
213                                errCode = ErrorMessage.NG;
214                        }
215
216                        final String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
217                        if( err != null && err.length() > 0 ) {
218                                buf.append( err );
219                                // 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
220                                setSessionAttribute( ERR_MSG_ID,errMessage );
221                        }
222                        else {
223                                // 6.4.1.2 (2016/01/22) QueryTag.errMsgId  → QueryTag.ERR_MSG_ID  refactoring
224                                removeSessionAttribute( ERR_MSG_ID );
225                        }
226                        label = buf.toString();
227
228//                      // 6.9.9.0 (2018/08/20) 「ERR0041:検索処理中に割り込みの検索要求がありました」エラーを、標準のErrorMessageに追加するようにします。
229//                      if( table != null && ! commitTableObject( tableId, table )  ) {
230//                              // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
231//                              jspPrint( "TableUpdateTag Query処理が割り込まれました。DBTableModel は登録しません。" );
232//                              return SKIP_PAGE ;
233//                      }
234                }
235
236                jspPrint( label );
237
238                // セキュリティチェック(データアクセス件数登録)
239                final long dyTime = System.currentTimeMillis()-dyStart;
240                final GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
241                if( guiInfo != null ) { guiInfo.addWriteCount( executeCount,dyTime,sql ); }
242
243                if( useTimeView ) {             // 6.3.6.0 (2015/08/16)
244                        jspPrint( "<div id=\"queryTime\" value=\"" + (dyTime) + "\"></div>" );  // 3.5.6.3 (2004/07/12)
245                }
246                return errCode >= ErrorMessage.NG ? SKIP_PAGE : EVAL_PAGE ;
247        }
248
249        /**
250         * タグリブオブジェクトをリリースします。
251         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
252         *
253         * @og.rev 4.0.2.0 (2007/12/25) commitTableModel追加
254         * @og.rev 4.1.2.0 (2008/03/12) sqlType追加
255         * @og.rev 5.1.7.0 (2010/06/01) quotCheckを指定できるようにする。※但し、初期値はfalse固定。
256         *
257         */
258        @Override
259        protected void release2() {
260                super.release2();
261                sqlType                 = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
262                resourceType    = null;
263                resTypeColNo    = -1;
264                conditionKey    = null;         // 条件判定するカラムIDを指定(初期値は columnId )
265                conditionList   = null;         // 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
266                selectedAll             = false;
267                commitTableModel= true;         // 4.0.2.0 (2007/12/25)
268                followCdkh              = false;        // 4.3.2.0 (2008/09/09)
269                quotCheck               = false;        // 5.1.7.0 (2010/06/01)
270        }
271
272        /**
273         * Query を実行します。
274         *
275         * @og.rev 4.0.2.0 (2007/12/25) commitTableModel追加
276         * @og.rev 6.3.6.1 (2015/08/28) close(),realClose() 廃止。Queryはキャッシュしません。
277         *
278         * @param   query オブジェクト
279         */
280        @Override
281        protected void execute( final Query query ) {
282
283                        final int[] rowNo = getParameterRows();         // 4.0.0 (2005/01/31)
284                        if( rowNo.length > 0 ) {
285                                query.execute( rowNo,table );
286
287                                errCode = query.getErrorCode();
288                                errMessage = query.getErrorMessage();
289
290                                // リソースクリア処理
291                                if( resourceType != null ) {
292                                        resTypeColNo = table.getColumnNo( "CLM" );              // キーは、CLM
293                                }
294
295                                // 逆順にDELETEしないと、行番号がずれてしまう。
296                                int row;
297                                for( int j=rowNo.length-1; j>=0; j-- ) {
298                                        row = rowNo[j];
299                                        if( resTypeColNo >= 0 ) {
300                                                clearResourceData( table.getValue( row,resTypeColNo ) );                // リソースのクリア
301                                        }
302
303                                        if( commitTableModel ) {        // 4.0.2.0 (2007/12/25)
304                                                if( DBTableModel.DELETE_TYPE.equals( table.getModifyType( row ) ) ) {
305                                                        table.removeValue( row );
306                                                }
307                                                else {
308                                                        table.resetModify( row );
309                                                }
310                                        }
311                                }
312                        }
313        }
314
315        /**
316         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行番号の
317         * 配列を返します。
318         * ここでは、conditionKey に値が設定されている場合は、そのカラムの値が
319         * conditionList にマッチする場合のみ対象選択行として返します。
320         * 値がセットされていない場合は、通常のCommonTagSupport#getParameterRows()
321         * が呼ばれます。
322         * なにも選ばれていない場合は、サイズ0の配列を返します。
323         *
324         * @og.rev 4.3.2.0 (2008/09/09) followCdkh属性対応
325         *
326         * @return       (選ばれていない場合は、サイズ0の配列を返す)
327         * @og.rtnNotNull
328         */
329        @Override
330        protected int[] getParameterRows() {
331                int[] rowNo ;
332                if( selectedAll ) {
333                        final int rowCnt = table.getRowCount();         // 3.5.5.7 (2004/05/10)
334                        rowNo = new int[ rowCnt ];
335                        for( int i=0; i<rowCnt; i++ ) {
336                                rowNo[i] = i;
337                        }
338                } else {
339                        rowNo = super.getParameterRows();               // 4.0.0 (2005/01/31)
340                }
341
342                if( conditionKey != null ) {
343                        final int col = table.getColumnNo( conditionKey );
344                        final List<Integer> list = new ArrayList<>();
345                        for( int i=0; i<rowNo.length; i++ ) {
346                                final String val = "|" + table.getValue( rowNo[i],col ) + "|";
347                                if( conditionList.indexOf( val ) >= 0 ) {
348                                        list.add( Integer.valueOf( rowNo[i] ) );
349                                }
350                        }
351
352                        final int size = list.size();
353                        rowNo = new int[size];
354                        for( int i=0; i<size; i++ ) {
355                                rowNo[i] = list.get(i).intValue();
356                        }
357                }
358
359                // 4.3.2.0 (2008/09/09)
360                if( sqlType != null && sqlType.length() > 0 && followCdkh ) {
361                        final List<Integer> flist = new ArrayList<>();
362                        for( int i=0; i<rowNo.length; i++ ) {
363                                final String cdkh = table.getModifyType( rowNo[i] );
364//                              if( ( ( "INSERT".equals( sqlType ) || "COPY".equals( sqlType ) )
365//                                                      && DBTableModel.INSERT_TYPE.equals( cdkh ) )
366//                                      ||
367//                                      ( ( "UPDATE".equals( sqlType ) || "CHANGE".equals( sqlType ) )
368//                                                      && DBTableModel.UPDATE_TYPE.equals( cdkh ) )
369//                                      ||
370//                                      (   "DELETE".equals( sqlType )
371//                                                      && DBTableModel.DELETE_TYPE.equals( cdkh ) ) ) {
372//                                      flist.add(  Integer.valueOf( rowNo[i] ) );
373//                              }
374                                // 6.9.7.0 (2018/05/14) PMD Useless parentheses.
375                                if(     ( "INSERT".equals( sqlType ) || "COPY".equals(   sqlType ) )    && DBTableModel.INSERT_TYPE.equals( cdkh )
376                                        ||      ( "UPDATE".equals( sqlType ) || "CHANGE".equals( sqlType ) )    && DBTableModel.UPDATE_TYPE.equals( cdkh )
377                                        ||        "DELETE".equals( sqlType )                                                                    && DBTableModel.DELETE_TYPE.equals( cdkh ) ) {
378                                                flist.add( Integer.valueOf( rowNo[i] ) );
379                                }
380                        }
381
382                        final int size = flist.size();
383                        rowNo = new int[size];
384                        for( int i=0; i<size; i++ ) {
385                                rowNo[i] = flist.get(i).intValue();
386                        }
387                }
388
389                return rowNo;
390        }
391
392        /**
393         * 【TAG】Query を発行する為のクラスIDを指定します({@og.doc03Link queryType 初期値:JDBCTableUpdate})。
394         *
395         * @og.tag
396         * 引数指定のINSERT/UPDATE文を実行する場合の、queryType 属性を使用します。
397         * このタグでは、execute( int[] ,DBTableModel )を実行します。
398         * 代表的なクラスとして、"JDBCTableUpdate" が標準で用意されています。
399         *
400         * タグにより使用できる/出来ないがありますが、これは、org.opengion.hayabusa.db
401         * 以下の Query_**** クラスの **** を与えます。
402         * これらは、Query インターフェースを継承したサブクラスです。
403         * {@og.doc03Link queryType Query_**** クラス}
404         *
405         * @param       id Queryタイプ
406         * @see         org.opengion.hayabusa.db.Query  Queryのサブクラス
407         * @see         org.opengion.hayabusa.db.Query#execute( int[] ,DBTableModel )
408         */
409        @Override
410        public void setQueryType( final String id ) {
411                super.setQueryType( nval( id,"JDBCTableUpdate" ) );
412        }
413
414        /**
415         * resourceType が設定されたときのみ使用される、キャッシュの初期化メソッドです。
416         *
417         * @param       key     初期化を行うキー
418         */
419        private void clearResourceData( final String key ) {
420                getResource().clear( key );
421        }
422
423        /**
424         * 【特殊】クリアするリソースの種類[GEA03/GEA04/GEA08]を指定します。
425         *
426         * @og.tag
427         * 注意:この属性は、リソース関連DBのメンテナンス時にのみ、内部リソースキャッシュを
428         * クリアする目的で使用します。一般の属性としては、使用することはないため、
429         * ご注意ください。
430         * リソース関連のテーブルを更新した場合、リソースキャッシュをクリアして
431         * 置かないと、データベースの値が反映されません。
432         * 昔は、リソースの更新ごとに、全件クリアしていましたが、部分クリアが
433         * できるようになったため、部分クリアを行います。
434         * こでは、(GEA03,GEA04,GEA08) のどれかを指定してください。
435         *
436         * @param       type    クリアリソースタイプ [GEA03/GEA04/GEA08]
437         */
438        public void setResourceType( final String type ) {
439                resourceType = nval( getRequestParameter(type),resourceType );
440
441                if( resourceType != null &&
442                        "|GEA03|GEA04|GEA08|".indexOf( "|" + resourceType + "|" ) < 0 ) {
443                                final String errMsg = "resourceTypeは GEA03,GEA04,GEA08 のどれかです。"
444                                                        + "resourceType=" + type ;
445                                throw new HybsSystemException( errMsg );
446                }
447        }
448
449        /**
450         * 【TAG】条件判定するカラムIDを指定します(初期値:null)。
451         *
452         * @og.tag
453         * 指定のカラムIDの値と、conditionList の値を比較して、
454         * 存在する場合は、Query 処理を実行します。
455         * 例えば、conditionKey="CDKH" として、conditionList="A" とすれば、
456         * 改廃コードが"A"のデータで、かつ選択されたデータのみを処理します。
457         * 設定しない場合は、通常の処理と同様に、選択行のみ処理されます。
458         *
459         * @param       key 条件判定カラム
460         * @see         #setConditionList( String )
461         */
462        public void setConditionKey( final String key ) {
463                conditionKey = nval( getRequestParameter( key ),null ) ;
464        }
465
466        /**
467         * 【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)。
468         *
469         * @og.tag
470         * conditionKey とペアで指定します。ここには、カラムの設定値のリストを
471         * 指定することで、複数条件(OR結合)での比較を行い、リストにカラム値が
472         * 存在する場合のみ、Query 処理を実行します。
473         * 値が設定されている場合は、その値とマッチする必要があります。なにもセット
474         * されない場合、または、null の場合は、null データとマッチする場合のみ処理
475         * されますので、ご注意ください。
476         *
477         * @param       list    条件判定値 ("|"区切のリスト)
478         * @see         #setConditionKey( String )
479         */
480        public void setConditionList( final String list ) {
481                conditionList = "|" + nval( getRequestParameter( list ),"" ) + "|" ;
482        }
483
484        /**
485         * 【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)。
486         *
487         * @og.tag
488         * 全てのデータを選択済みデータとして扱って処理します。
489         * 全件処理する場合に、(true/false)を指定します。
490         * 初期値は false です。
491         *
492         * @param  all データを全件選択済み [true:全件選択済み/false:通常]
493         */
494        public void setSelectedAll( final String all ) {
495                selectedAll = nval( getRequestParameter( all ),selectedAll );
496        }
497
498        /**
499         * 【特殊】SQL実行後に結果をDBTableModelに反映させるかどうか[true/false]を指定します(初期値:true)。
500         *
501         * @og.tag
502         * 注意:この属性は、リソース関連DBのメンテナンス時に、複数DBへの登録を行うための、
503         * 暫定対応として定義しています。
504         * falseにした場合は、実データとDBTableModelの整合性が取れなくなるため、使用には十分注して下さい。
505         * 初期値は true です。
506         *
507         * @og.rev 4.0.2.0 (2007/12/25) 新規作成
508         *
509         * @param  commitTblMdl 反映有無 [true:反映する/false:反映しない]
510         */
511        public void setCommitTableModel( final String commitTblMdl ) {
512                commitTableModel = nval( getRequestParameter( commitTblMdl ),commitTableModel );
513        }
514
515        /**
516         * 引数の名称配列。
517         *
518         * @return      名称配列
519         */
520        protected String[] getNames() {
521                return table.getNames() ;
522        }
523
524        /**
525         * 【TAG】BODY部に書かれている Param の SQLタイプを指定します。
526         *
527         * @og.tag
528         * TableUpdateParamTag は、上位の TableUpdateTag の sqlType 属性 と同じ
529         * sqlType 属性の場合のみ、SQL文を合成・出力します。
530         * つまり、TableUpdateTag側のsqlType 属性をパラメータに、TableUpdateParamTag
531         * の sqlType 属性を固定値にすることで、どのパラメータを使用するかを
532         * 選択できる機能を実現する事が可能です。
533         *
534         * @og.rev 4.1.2.0 (2008/03/12) 新規追加
535         *
536         * @param       type SQLタイプ
537         */
538        public void setSqlType( final String type ) {
539                sqlType = nval( getRequestParameter( type ),sqlType );
540        }
541
542        /**
543         * 【TAG】DBTableModelの改廃Cに従って処理を行うかを指定します。
544         *
545         * @og.tag
546         * この属性は、sqlTypeが指定されている場合のみ有効です。
547         * sqlTypeが指定されている場合、そのsqlTypeに対応した、改廃Cが設定されている
548         * 行のみを処理します。
549         * 対応関係は、以下の通りです。
550         *  sqlType = "INSERT" or "COPY" ⇒ 改廃C='A'のみ処理
551         *  sqlType = "UPDATE" or "CHANGE" ⇒ 改廃C='C'のみ処理
552         *  sqlType = "DELETE" ⇒ 改廃C='D'のみ処理
553         *
554         * @og.rev 4.3.2.0 (2008/09/09) 新規追加
555         *
556         * @param       flag 改廃C処理 [true:行う/false:行わない]
557         */
558        public void setFollowCdkh( final String flag ) {
559                followCdkh = nval( getRequestParameter( flag ),followCdkh );
560        }
561
562        /**
563         * 【TAG】リクエスト情報の シングルクォート(') 存在チェックを実施するかどうか[true/false]を設定します(初期値:false)。
564         *
565         * @og.tag
566         * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに
567         * 渡す文字列にシングルクォート(') を許さない設定にすれば、ある程度は防止できます。
568         * 数字タイプの引数には、 or 5=5 などのシングルクォートを使用しないコードを埋めても、
569         * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、
570         * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。
571         * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
572         * ※(他のタグは、システムリソースのUSE_SQL_INJECTION_CHECK[={@og.value SystemData#USE_SQL_INJECTION_CHECK}])
573         * ですが、JSPの互換性を考慮し、初期値を固定でfalseにしています)
574         *
575         * @og.rev 5.1.7.0 (2010/06/01) 新規追加
576         *
577         * @param   flag クォートチェック [true:する/それ以外:しない]
578         */
579        @Override
580        public void setQuotCheck( final String flag ) {
581                quotCheck = nval( getRequestParameter( flag ),quotCheck );
582        }
583
584        /**
585         * SQLタイプを返します。
586         *
587         * @og.rev 4.1.2.0 (2008/03/12) 新規追加
588         *
589         * @return      SQLタイプ
590         */
591        protected String getSqlType() {
592                return sqlType ;
593        }
594
595        /**
596         * このオブジェクトの文字列表現を返します。
597         * 基本的にデバッグ目的に使用します。
598         *
599         * @og.rev 4.0.2.0 (2007/12/25) resourceColumn、commitTableModel追加
600         *
601         * @return このクラスの文字列表現
602         * @og.rtnNotNull
603         */
604        @Override
605        public String toString() {
606                return ToString.title( this.getClass().getName() )
607                                .println( "VERSION"                     ,VERSION                )
608                                .println( "resourceType"        ,resourceType   )
609                                .println( "resTypeColNo"        ,resTypeColNo   )
610                                .println( "conditionKey"        ,conditionKey   )
611                                .println( "conditionList"       ,conditionList  )
612                                .println( "followCdkh"          ,followCdkh             )
613                                .println( "CMD_ENTRY"           ,CMD_ENTRY              )
614                                .println( "commitTabelModel",commitTableModel )         // 4.0.2.0 (2007/12/25)
615                                .println( "sql"                         ,sql                    )               // 4.1.2.0 (2008/03/12)
616                                .println( "Other..."    ,getAttributes().getAttribute() )
617                                .fixForm().toString()
618                        + CR
619                        + super.toString() ;
620        }
621}