    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 * ●形式：&lt;og:tableUpdate command="…" names="…" queryType="JDBCTableUpdate" &gt;
    048 *             {&#064;SQL}
    049 *         &lt;/og:update&gt;
    050 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    051 *
    052 * ●Tag定義：
    053 *   &lt;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】条件判定するカラムＩＤを指定します(初期値: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 *   &gt;   ... Body ...
    077 *   &lt;/og:tableUpdate&gt;
    078 *
    079 * ●使用例
    080 *    ・QUERYを他のJSPから渡す場合
    081 *    【copy.jsp】
    082 *        &lt;og:hidden name=&quot;SQL&quot; &gt;
    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 *               &#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;)
    089 *        &lt;/og:value&gt;
    090 *
    091 *    【entry.jsp】
    092 *        &lt;og:tableUpdate
    093 *            command   = &quot;{&#064;command}&quot;
    094 *            queryType = &quot;JDBCTableUpdate&quot;
    095 *        {&#064;SQL}
    096 *        &lt;/og:tableUpdate&gt;
    097 *
    098 *    ・tableUpdateParamを使用する場合
    099 *    【entry.jsp】
    100 *        &lt;og:tableUpdate
    101 *            command   = &quot;{&#064;command}&quot;
    102 *            queryType = &quot;JDBCTableUpdate&quot;
    103 *            sqlType   = &quot;{&#064;sqlType}&quot;        // tableUpdateParam の sqlType と一致
    104 *        &gt;
    105 *            &lt;og:tableUpdateParam
    106 *                sqlType     = &quot;{&#064;sqlType}"       // INSERT,COPY,UPDATE,MODIFY,DELETE
    107 *                table       = &quot;{&#064;TABLE_NAME}"    // 処理対象のテーブル名
    108 *                names       = &quot;{&#064;names}"         // 処理対象のカラム名
    109 *                omitNames   = &quot;{&#064;omitNames}"     // 処理対象外のカラム名
    110 *                where       = &quot;{&#064;where}"         // 処理対象を特定するキー
    111 *                constKeys   = &quot;{&#064;constKeys}"     // 処理カラム名の中の固定情報カラム名
    112 *                constVals   = &quot;{&#064;constVals}"     // 処理カラム名の中の固定情報設定値
    113 *            /&gt;
    114 *        &lt;/og:tableUpdate&gt;
    115 *
    116 *    ・処理の可否を指定する場合
    117 *    【entry.jsp】
    118 *        &lt;og:tableUpdate
    119 *            command   = &quot;{&#064;command}&quot;
    120 *            queryType = &quot;JDBCTableUpdate&quot;
    121 *            conditionKey  ="…"      : 条件判定するカラムＩＤを指定(初期値は columnId )
    122 *            conditionList ="…"      : 条件判定する値のリストを、"|"で区切って登録(初期値は、無条件)
    123 *        {&#064;SQL}
    124 *        &lt;/og:tableUpdate&gt;
    125 *
    126 * @og.rev 3.8.8.0 (2007/12/22) 新規作成
    127 * @og.group ＤＢ登録
    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    ;                       // 条件判定するカラムＩＤを指定(初期値は 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;         // 条件判定するカラムＩＤを指定(初期値は 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         * なにも選ばれていない場合は、サイズ０の配列を返します。
    323         *
    324         * @og.rev 4.3.2.0 (2008/09/09) followCdkh属性対応
    325         *
    326         * @return       (選ばれていない場合は、サイズ０の配列を返す)
    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】条件判定するカラムＩＤを指定します(初期値:null)。
    451         *
    452         * @og.tag
    453         * 指定のカラムＩＤの値と、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         * 指定することで、複数条件(ＯＲ結合)での比較を行い、リストにカラム値が
    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のパラメータに
    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}