    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 * ●形式：&lt;og:tableUpdate command="…" names="…" queryType="JDBCTableUpdate" &gt;
    044 *             {&#064;SQL}
    045 *         &lt;/og:update&gt;
    046 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    047 *
    048 * ●Tag定義：
    049 *   &lt;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】条件判定するカラムＩＤを指定します(初期値: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 *   &gt;   ... Body ...
    066 *   &lt;/og:tableUpdate&gt;
    067 *
    068 * ●使用例
    069 *    ・QUERYを他のJSPから渡す場合
    070 *    【copy.jsp】
    071 *        &lt;og:hidden name=&quot;SQL&quot; &gt;
    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 *               &#39;1&#39;,&#39;{&#064;USER.YMDH}&#39;,&#39;{&#064;USER.YMDH}&#39;,&#39;{&#064;USER.ID}&#39;,&#39;{&#064;USER.ID}&#39;,&#39;{&#064;GUI.KEY}&#39;)
    078 *        &lt;/og:value&gt;
    079 *
    080 *    【entry.jsp】
    081 *        &lt;og:tableUpdate
    082 *            command   = &quot;{&#064;command}&quot;
    083 *            queryType = &quot;JDBCTableUpdate&quot;
    084 *        {&#064;SQL}
    085 *        &lt;/og:tableUpdate&gt;
    086 *
    087 *    ・tableUpdateParamを使用する場合
    088 *    【entry.jsp】
    089 *        &lt;og:tableUpdate
    090 *            command   = &quot;{&#064;command}&quot;
    091 *            queryType = &quot;JDBCTableUpdate&quot;
    092 *            sqlType   = &quot;{&#064;sqlType}&quot;        // tableUpdateParam の sqlType と一致
    093 *        &gt;
    094 *            &lt;og:tableUpdateParam
    095 *                sqlType     = &quot;{&#064;sqlType}"       // INSERT,COPY,UPDATE,MODIFY,DELETE
    096 *                table       = &quot;{&#064;TABLE_NAME}"    // 処理対象のテーブル名
    097 *                names       = &quot;{&#064;names}"         // 処理対象のカラム名
    098 *                omitNames   = &quot;{&#064;omitNames}"     // 処理対象外のカラム名
    099 *                where       = &quot;{&#064;where}"         // 処理対象を特定するキー
    100 *                constKeys   = &quot;{&#064;constKeys}"     // 処理カラム名の中の固定情報カラム名
    101 *                constVals   = &quot;{&#064;constVals}"     // 処理カラム名の中の固定情報設定値
    102 *            /&gt;
    103 *        &lt;/og:tableUpdate&gt;
    104 *
    105 *    ・処理の可否を指定する場合
    106 *    【entry.jsp】
    107 *        &lt;og:tableUpdate
    108 *            command   = &quot;{&#064;command}&quot;
    109 *            queryType = &quot;JDBCTableUpdate&quot;
    110 *            conditionKey  ="…"      : 条件判定するカラムＩＤを指定(初期値は columnId )
    111 *            conditionList ="…"      : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
    112 *        {&#064;SQL}
    113 *        &lt;/og:tableUpdate&gt;
    114 *
    115 * @og.rev 3.8.8.0 (2007/12/22) 新規作成
    116 * @og.group ＤＢ登録
    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;         // 条件判定するカラムＩＤを指定(初期値は 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;         // 条件判定するカラムＩＤを指定(初期値は 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         * なにも選ばれていない場合は、サイズ０の配列を返します。
    292         *
    293         * @og.rev 4.3.2.0 (2008/09/09) followCdkh属性対応
    294         *
    295         * @return       (選ばれていない場合は、サイズ０の配列を返す)
    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】条件判定するカラムＩＤを指定します(初期値:null)。
    413         *
    414         * @og.tag
    415         * 指定のカラムＩＤの値と、conditionList の値を比較して、
    416         * 存在する場合は、Query 処理を実行します。
    417         * 例えば、conditionKey="CDKH" として、conditionList="A" とすれば、
    418         * 改廃コードが"A"のデータで、かつ選択されたデータのみを処理します。
    419         * 設定しない場合は、通常の処理と同様に、選択行のみ処理されます。
    420         *
    421         * @param       key 条件判定するカラムＩＤ
    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         * 指定することで、複数条件(ＯＲ結合)での比較を行い、リストにカラム値が
    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のパラメータに
    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}