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                super.quotCheck = quotCheck;
160
161                return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
162        }
163
164        /**
165         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
166         *
167         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
168         *
169         * @return      後続処理の指示
170         */
171        @Override
172        public int doEndTag() {
173                debugPrint();
174
175                String label  = "";                             // 4.0.0 (2005/11/30) 検索しなかった場合。
176                if( check( command, COMMAND_LIST ) ) {
177                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
178                        if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
179                                buf.append( executeCount );
180                                buf.append( getResource().getLabel( displayMsg ) );
181                                buf.append( HybsSystem.BR );
182                        }
183
184                        String err = TaglibUtil.makeHTMLErrorTable( errMessage,getResource() );
185                        if( err != null && err.length() > 0 ) {
186                                buf.append( err );
187                                setSessionAttribute( errMsgId,errMessage );
188                        }
189                        else {
190                                removeSessionAttribute( errMsgId );
191                        }
192                        label = buf.toString();
193
194                        if( table != null && ! commitTableObject( tableId, table )  ) {
195                                // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
196                                jspPrint( "TableUpdateTag Query処理が割り込まれました。DBTableModel は登録しません。" );
197                                return SKIP_PAGE ;
198                        }
199                }
200
201                jspPrint( label );
202
203                long dyTime = System.currentTimeMillis()-dyStart;
204                jspPrint( "<div id=\"queryTime\" value=\"" + (dyTime) + "\"></div>" );  // 3.5.6.3 (2004/07/12)
205
206                // セキュリティチェック(データアクセス件数登録)
207                GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
208                if( guiInfo != null ) { guiInfo.addWriteCount( executeCount,dyTime,sql ); }
209
210                return ( errCode >= ErrorMessage.NG ) ? SKIP_PAGE : EVAL_PAGE ;
211        }
212
213        /**
214         * タグリブオブジェクトをリリースします。
215         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
216         *
217         * @og.rev 4.0.2.0 (2007/12/25) commitTableModel追加
218         * @og.rev 4.1.2.0 (2008/03/12) sqlType追加
219         * @og.rev 5.1.7.0 (2010/06/01) quotCheckを指定できるようにする。※但し、初期値はfalse固定。
220         *
221         */
222        @Override
223        protected void release2() {
224                super.release2();
225                sqlType                 = null;         // INSERT,COPY,UPDATE,MODIFY,DELETE
226                resourceType    = null;
227                resTypeColNo    = -1;
228                conditionKey    = null;         // 条件判定するカラムIDを指定(初期値は columnId )
229                conditionList   = null;         // 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
230                selectedAll             = false;
231                commitTableModel= true;         // 4.0.2.0 (2007/12/25)
232                followCdkh              = false;        // 4.3.2.0 (2008/09/09)
233                quotCheck               = false;        // 5.1.7.0 (2010/06/01)
234        }
235
236        /**
237         * Query を実行します。
238         *
239         * @og.rev 4.0.2.0 (2007/12/25) commitTableModel追加
240         *
241         * @param   query オブジェクト
242         */
243        @Override
244        protected void execute( final Query query ) {
245
246                try {
247                        int[] rowNo = getParameterRows();               // 4.0.0 (2005/01/31)
248                        if( rowNo.length > 0 ) {
249                                query.execute( rowNo,table );
250
251                                errCode = query.getErrorCode();
252                                errMessage = query.getErrorMessage();
253
254                                // リソースクリア処理
255                                if( resourceType != null ) {
256                                        resTypeColNo = table.getColumnNo( "CLM" );              // キーは、CLM
257                                }
258
259                                // 逆順にDELETEしないと、行番号がずれてしまう。
260                                int row;
261                                for( int j=rowNo.length-1; j>=0; j-- ) {
262                                        row = rowNo[j];
263                                        if( resTypeColNo >= 0 ) {
264                                                clearResourceData( table.getValue( row,resTypeColNo ) );                // リソースのクリア
265                                        }
266
267                                        if( commitTableModel ) { // 4.0.2.0 (2007/12/25)
268                                                if( DBTableModel.DELETE_TYPE.equals( table.getModifyType( row ) ) ) {
269                                                        table.removeValue( row );
270                                                }
271                                                else {
272                                                        table.resetModify( row );
273                                                }
274                                        }
275                                }
276                                if( query.isUpdate() ) { query.commit(); }
277                        }
278                }
279                finally {
280                        if( query != null ) { query.close(); }
281                }
282        }
283
284        /**
285         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行番号の
286         * 配列を返します。
287         * ここでは、conditionKey に値が設定されている場合は、そのカラムの値が
288         * conditionList にマッチする場合のみ対象選択行として返します。
289         * 値がセットされていない場合は、通常のCommonTagSupport#getParameterRows()
290         * が呼ばれます。
291         * なにも選ばれていない場合は、サイズ0の配列を返します。
292         *
293         * @og.rev 4.3.2.0 (2008/09/09) followCdkh属性対応
294         *
295         * @return       (選ばれていない場合は、サイズ0の配列を返す)
296         */
297        @Override
298        protected int[] getParameterRows() {
299                int[] rowNo ;
300                if( selectedAll ) {
301                        int rowCnt = table.getRowCount();               // 3.5.5.7 (2004/05/10)
302                        rowNo = new int[ rowCnt ];
303                        for( int i=0; i<rowCnt; i++ ) {
304                                rowNo[i] = i;
305                        }
306                } else {
307                        rowNo = super.getParameterRows();               // 4.0.0 (2005/01/31)
308                }
309
310                if( conditionKey != null ) {
311                        int col = table.getColumnNo( conditionKey );
312                        List<Integer> list = new ArrayList<Integer>();
313                        for( int i=0; i<rowNo.length; i++ ) {
314                                String val = "|" + table.getValue( rowNo[i],col ) + "|";
315                                if( conditionList.indexOf( val ) >= 0 ) {
316                                        list.add( Integer.valueOf( rowNo[i] ) );
317                                }
318                        }
319
320                        int size = list.size();
321                        rowNo = new int[size];
322                        for( int i=0; i<size; i++ ) {
323                                rowNo[i] = list.get(i).intValue();
324                        }
325                }
326
327                // 4.3.2.0 (2008/09/09)
328                if( sqlType != null && sqlType.length() > 0 && followCdkh ) {
329                        List<Integer> flist = new ArrayList<Integer>();
330                        for( int i=0; i<rowNo.length; i++ ) {
331                                String cdkh = table.getModifyType( rowNo[i] );
332                                if( ( ( "INSERT".equals( sqlType ) || "COPY".equals( sqlType ) )
333                                                        && DBTableModel.INSERT_TYPE.equals( cdkh ) )
334                                        ||
335                                        ( ( "UPDATE".equals( sqlType ) || "CHANGE".equals( sqlType ) )
336                                                        && DBTableModel.UPDATE_TYPE.equals( cdkh ) )
337                                        ||
338                                        ( ( "DELETE".equals( sqlType ) )
339                                                        && DBTableModel.DELETE_TYPE.equals( cdkh ) ) ) {
340                                        flist.add(  Integer.valueOf( rowNo[i] ) );
341                                }
342                        }
343
344                        int size = flist.size();
345                        rowNo = new int[size];
346                        for( int i=0; i<size; i++ ) {
347                                rowNo[i] = flist.get(i).intValue();
348                        }
349                }
350
351                return rowNo;
352        }
353
354        /**
355         * 【TAG】Query を発行する為のクラスIDを指定します({@og.doc03Link queryType 初期値:JDBCTableUpdate})。
356         *
357         * @og.tag
358         * 引数指定のINSERT/UPDATE文を実行する場合の、queryType 属性を使用します。
359         * このタグでは、execute( int[] ,DBTableModel )を実行します。
360         * 代表的なクラスとして、"JDBCTableUpdate" が標準で用意されています。
361         *
362         * タグにより使用できる/出来ないがありますが、これは、org.opengion.hayabusa.db
363         * 以下の Query_**** クラスの **** を与えます。
364         * これらは、Query インターフェースを継承したサブクラスです。
365         * {@og.doc03Link queryType Query_**** クラス}
366         *
367         * @param       id Query を発行する為の実クラス ID
368         * @see         org.opengion.hayabusa.db.Query  Queryのサブクラス
369         * @see         org.opengion.hayabusa.db.Query#execute( int[] ,DBTableModel )
370         */
371        @Override
372        public void setQueryType( final String id ) {
373                super.setQueryType( nval( id,"JDBCTableUpdate" ) );
374        }
375
376        /**
377         * resourceType が設定されたときのみ使用される、キャッシュの初期化メソッドです。
378         *
379         * @param       key     初期化を行うキー
380         */
381        private void clearResourceData( final String key ) {
382                getResource().clear( key );
383        }
384
385        /**
386         * 【特殊】クリアするリソースの種類[GEA03/GEA04/GEA08]を指定します。
387         *
388         * @og.tag
389         * 注意:この属性は、リソース関連DBのメンテナンス時にのみ、内部リソースキャッシュを
390         * クリアする目的で使用します。一般の属性としては、使用することはないため、
391         * ご注意ください。
392         * リソース関連のテーブルを更新した場合、リソースキャッシュをクリアして
393         * 置かないと、データベースの値が反映されません。
394         * 昔は、リソースの更新ごとに、全件クリアしていましたが、部分クリアが
395         * できるようになったため、部分クリアを行います。
396         * こでは、(GEA03,GEA04,GEA08) のどれかを指定してください。
397         *
398         * @param       type    クリアするリソースタイプ [GEA03/GEA04/GEA08]
399         */
400        public void setResourceType( final String type ) {
401                resourceType = nval( getRequestParameter(type),resourceType );
402
403                if( resourceType != null &&
404                        "|GEA03|GEA04|GEA08|".indexOf( "|" + resourceType + "|" ) < 0 ) {
405                                String errMsg = "resourceTypeは GEA03,GEA04,GEA08 のどれかです。"
406                                                        + "resourceType=" + type ;
407                                throw new HybsSystemException( errMsg );
408                }
409        }
410
411        /**
412         * 【TAG】条件判定するカラムIDを指定します(初期値:null)。
413         *
414         * @og.tag
415         * 指定のカラムIDの値と、conditionList の値を比較して、
416         * 存在する場合は、Query 処理を実行します。
417         * 例えば、conditionKey="CDKH" として、conditionList="A" とすれば、
418         * 改廃コードが"A"のデータで、かつ選択されたデータのみを処理します。
419         * 設定しない場合は、通常の処理と同様に、選択行のみ処理されます。
420         *
421         * @param       key 条件判定するカラムID
422         * @see         #setConditionList( String )
423         */
424        public void setConditionKey( final String key ) {
425                conditionKey = nval( getRequestParameter( key ),null ) ;
426        }
427
428        /**
429         * 【TAG】条件判定する値のリストを、"|"で区切って登録します(初期値:無条件)。
430         *
431         * @og.tag
432         * conditionKey とペアで指定します。ここには、カラムの設定値のリストを
433         * 指定することで、複数条件(OR結合)での比較を行い、リストにカラム値が
434         * 存在する場合のみ、Query 処理を実行します。
435         * 値が設定されている場合は、その値とマッチする必要があります。なにもセット
436         * されない場合、または、null の場合は、null データとマッチする場合のみ処理
437         * されますので、ご注意ください。
438         *
439         * @param       list    値のリスト("|"区切)
440         * @see         #setConditionKey( String )
441         */
442        public void setConditionList( final String list ) {
443                conditionList = "|" + nval( getRequestParameter( list ),"" ) + "|" ;
444        }
445
446        /**
447         * 【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)。
448         *
449         * @og.tag
450         * 全てのデータを選択済みデータとして扱って処理します。
451         * 全件処理する場合に、(true/false)を指定します。
452         * 初期値は false です。
453         *
454         * @param  all データを全件選択済み [true:全件選択済み/false:通常]
455         */
456        public void setSelectedAll( final String all ) {
457                selectedAll = nval( getRequestParameter( all ),selectedAll );
458        }
459
460        /**
461         * 【特殊】SQL実行後に結果をDBTableModelに反映させるかどうか[true/false]を指定します(初期値:true)。
462         *
463         * @og.tag
464         * 注意:この属性は、リソース関連DBのメンテナンス時に、複数DBへの登録を行うための、
465         * 暫定対応として定義しています。
466         * falseにした場合は、実データとDBTableModelの整合性が取れなくなるため、使用には十分注して下さい。
467         * 初期値は true です。
468         *
469         * @og.rev 4.0.2.0 (2007/12/25) 新規作成
470         *
471         * @param  commitTblMdl テーブルモデルへ反映する [true:反映する/false:反映しない]
472         */
473        public void setCommitTableModel( final String commitTblMdl ) {
474                commitTableModel = nval( getRequestParameter( commitTblMdl ),commitTableModel );
475        }
476
477        /**
478         * 引数の名称配列
479         *
480         * @return      名称配列
481         */
482        protected String[] getNames() {
483                return table.getNames() ;
484        }
485
486        /**
487         * 【TAG】BODY部に書かれている Param の SQLタイプを指定します。
488         *
489         * @og.tag
490         * TableUpdateParamTag は、上位の TableUpdateTag の sqlType 属性 と同じ
491         * sqlType 属性の場合のみ、SQL文を合成・出力します。
492         * つまり、TableUpdateTag側のsqlType 属性をパラメータに、TableUpdateParamTag
493         * の sqlType 属性を固定値にすることで、どのパラメータを使用するかを
494         * 選択できる機能を実現する事が可能です。
495         *
496         * @og.rev 4.1.2.0 (2008/03/12) 新規追加
497         *
498         * @param       type BODY部に書かれている SQL タイプ
499         */
500        public void setSqlType( final String type ) {
501                sqlType = nval( getRequestParameter( type ),sqlType );
502        }
503
504        /**
505         * 【TAG】DBTableModelの改廃Cに従って処理を行うかを指定します。
506         *
507         * @og.tag
508         * この属性は、sqlTypeが指定されている場合のみ有効です。
509         * sqlTypeが指定されている場合、そのsqlTypeに対応した、改廃Cが設定されている
510         * 行のみを処理します。
511         * 対応関係は、以下の通りです。
512         *  sqlType = "INSERT" or "COPY" ⇒ 改廃C='A'のみ処理
513         *  sqlType = "UPDATE" or "CHANGE" ⇒ 改廃C='C'のみ処理
514         *  sqlType = "DELETE" ⇒ 改廃C='D'のみ処理
515         *
516         * @og.rev 4.3.2.0 (2008/09/09) 新規追加
517         *
518         * @param       flg DBTableModelの改廃Cに従って処理を行うか
519         */
520        public void setFollowCdkh( final String flg ) {
521                followCdkh = nval( getRequestParameter( flg ),followCdkh );
522        }
523
524        /**
525         * 【TAG】リクエスト情報の クォーティション(') 存在チェックを実施するかどうか[true/false]を設定します(初期値:false)。
526         *
527         * @og.tag
528         * SQLインジェクション対策の一つとして、暫定的ではありますが、SQLのパラメータに
529         * 渡す文字列にクォーティション(') を許さない設定にすれば、ある程度は防止できます。
530         * 数字タイプの引数には、 or 5=5 などのクォーティションを使用しないコードを埋めても、
531         * 数字チェックで検出可能です。文字タイプの場合は、必ず (')をはずして、
532         * ' or 'A' like 'A のような形式になる為、(')チェックだけでも有効です。
533         * (') が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。
534         * ※(他のタグは、システムリソースのUSE_SQL_INJECTION_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_SQL_INJECTION_CHECK}])
535         * ですが、JSPの互換性を考慮し、初期値を固定でfalseにしています)
536         *
537         * @og.rev 5.1.7.0 (2010/06/01) 新規追加
538         *
539         * @param   flag クォーティションチェック [true:する/それ以外:しない]
540         */
541        @Override
542        public void setQuotCheck( final String flag ) {
543                quotCheck = nval( getRequestParameter( flag ),quotCheck );
544        }
545
546        /**
547         * SQLタイプを返します。
548         *
549         * @og.rev 4.1.2.0 (2008/03/12) 新規追加
550         *
551         * @return      SQLタイプ
552         */
553        protected String getSqlType() {
554                return sqlType ;
555        }
556
557        /**
558         * このオブジェクトの文字列表現を返します。
559         * 基本的にデバッグ目的に使用します。
560         *
561         * @og.rev 4.0.2.0 (2007/12/25) resourceColumn、commitTableModel追加
562         *
563         * @return このクラスの文字列表現
564         */
565        @Override
566        public String toString() {
567                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
568                                .println( "VERSION"                     ,VERSION                )
569                                .println( "resourceType"        ,resourceType   )
570                                .println( "resTypeColNo"        ,resTypeColNo   )
571                                .println( "conditionKey"        ,conditionKey   )
572                                .println( "conditionList"       ,conditionList  )
573                                .println( "followCdkh"          ,followCdkh             )
574                                .println( "CMD_ENTRY"           ,CMD_ENTRY              )
575                                .println( "commitTabelModel",commitTableModel )         // 4.0.2.0 (2007/12/25)
576                                .println( "sql"                         ,sql                    )               // 4.1.2.0 (2008/03/12)
577                                .println( "Other..."    ,getAttributes().getAttribute() )
578                                .fixForm().toString()
579                        + HybsSystem.CR
580                        + super.toString() ;
581        }
582}