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