    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 org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.db.DBTableModel;
    020import org.opengion.hayabusa.db.DBColumn;
    021import org.opengion.hayabusa.html.JsonReader;
    022import org.opengion.fukurou.util.ErrorMessage;
    023import org.opengion.fukurou.util.StringUtil;
    024import static org.opengion.fukurou.util.StringUtil.nval;
    025
    026import java.util.Locale;
    027
    028/**
    029 * JSONを DBTableModelオブジェクトに読み取るタグです。
    030 *
    031 * JSONの読み取りにはpluginのJsonReaderを利用します。
    032 * 標準はエンジンの出力形式の読み取りを行うJsonReader_Defaultです。
    033 *
    034 * 入力件数を"DB.COUNT" キーでリクエストにセットしています。
    035 *
    036 * @og.formSample
    037 * ●形式：
    038 *     &lt;og:readJSON
    039 *         command      = "NEW"
    040 *         maxRowCount  = "10000"               読取最大件数(0:[無制限])
    041 *     &gt;
    042 *      ...
    043 *     &lt;og:readJSON /&gt;
    044 * ●body：なし
    045 *
    046 * ●Tag定義：
    047 *   &lt;og:readTable
    048 *       readerClass        【TAG】実際に読み出すクラス名の略称(TableReader_**** の ****)をセットします(初期値:Default)
    049 *       JSONData           【TAG】読み取るJSONデータをセットします。タグのBODYでもセット可能です。
    050 *       maxRowCount        【TAG】読取時の最大取り込み件数をセットします (初期値:DB_MAX_ROW_COUNT[=1000])(0:[無制限])
    051 *       tableId            【TAG】(通常使いません)sessionから所得する DBTableModelオブジェクトの ID
    052 *       command            【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)
    053 *       modifyType         【TAG】ファイル取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します
    054 *       displayMsg         【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[　件検索しました])
    055 *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])
    056 *       checkColumns       【TAG】読み取り元ファイルの整合性チェックを行うカラム列をカンマ指定します
    057 *       nullCheck          【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します
    058 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
    059 *       stopZero           【TAG】読込件数が０件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する])
    060 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
    061 *       mainTrans          【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)
    062 *       skipRowCount       【TAG】(通常は使いません)データの読み飛ばし件数を設定します
    063 *       useRenderer        【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します (初期値:false)
    064 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    065 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    066 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true)
    067 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true)
    068 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    069 *   /&gt;
    070 *
    071 * ●使用例
    072 *
    073 *     &lt;og:readJSON
    074 *         command        = "NEW"
    075 *         readerClass    = "Default"
    076 *         maxRowCount    = "10000"               読取最大件数(0:[無制限])
    077 *         checkColumns   = "OYA,KO,HJO,SU"       整合性チェックするカラム列("*" で全カラム)
    078 *         nullCheck      = "OYA,KO,SU"           NULLチェックを実行します("*" で全カラム)
    079 *         stopZero       = "true"                取得0件の場合に以降の処理を停止します
    080 *     &gt;
    081 *       [JSON Data]
    082 *     &lt;og:readJSON /&gt;
    083 *
    084 * @og.group ファイル入力
    085 *
    086 * @version  4.0
    087 * @author   Takahashi Masakazu
    088 * @since    JDK5.0,
    089 */
    090public class ReadJSONTag extends CommonTagSupport {
    091        //* このプログラムのVERSION文字列を設定します。   {@value} */
    092        private static final String             VERSION                         = "5.7.7.2 (2014/06/20)";
    093
    094        private static final long               serialVersionUID        = 577220140620L;
    095
    096        private static final int                ERROR_ROW_COUNT         = 200;                                                                                                  // 4.0.0 (2007/05/25)
    097
    098        /** command 引数に渡す事の出来る コマンド  新規作成 {@value} */
    099        public static final String              CMD_NEW                         = "NEW";
    100        /** command 引数に渡す事の出来る コマンド  再検索 {@value} */
    101        public static final String              CMD_RENEW                       = "RENEW";
    102        private static final String[]   COMMAND_LIST            = new String[] { CMD_NEW, CMD_RENEW };
    103
    104        private String                                  jsonData                        = null;                                                                                         //変換JSONデータ
    105        private String                                  readerClass                     = "Default";
    106        private int                                             maxRowCount                     = -1;
    107        private String                                  displayMsg                      = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
    108        private String                                  notfoundMsg                     = "MSG0077";                                                                                    // 対象データはありませんでした。
    109        private int                                             executeCount            = -1;                                                                                                   // 検索/実行件数
    110        private String                                  modifyType                      = null;
    111        private String                                  checkColumns            = null;                                                                                         //  取り込み時チェック
    112        private String                                  nullCheck                       = null;                                                                                         //  nullチェック確認
    113        private transient DBTableModel  table                           = null;
    114        private String                                  command                         = CMD_NEW;
    115        private String                                  tableId                         = HybsSystem.TBL_MDL_KEY;
    116        private boolean                                 stopZero                        = false;                                                                                                //  stopZero属性追加
    117        private boolean                                 isMainTrans                     = true;                                                                                         //  DBLastSqlの処理の見直し
    118        private int                                             skipRowCount            = 0;                                                                                                    //  データの読み飛ばし設定
    119
    120        //  読取処理でコードリソースのラベル変換を行うかどうか。
    121        private boolean                                 useRenderer                     = false;
    122
    123        /**
    124         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    125         *
    126         *
    127         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    128         */
    129        @Override
    130        public int doStartTag() {
    131                if( useTag() ) {
    132
    133                        return EVAL_BODY_BUFFERED ;     // Body を評価する。( extends BodyTagSupport 時)
    134                }
    135                return  SKIP_BODY ;                             // Body を評価しない
    136        }
    137
    138        /**
    139         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    140         *
    141         * @return      後続処理の指示(SKIP_BODY)
    142         */
    143        @Override
    144        public int doAfterBody() {
    145                if( jsonData == null || jsonData.length() <= 0 ) {
    146                        jsonData = getBodyString();
    147                }
    148                return SKIP_BODY;
    149        }
    150
    151        /**
    152         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    153         *
    154         *
    155         * @return      後続処理の指示
    156         */
    157        @Override
    158        public int doEndTag() {
    159                debugPrint();
    160                if( !useTag() ) { return EVAL_PAGE; }
    161
    162                if( jsonData != null && jsonData.length() > 0 && check( command, COMMAND_LIST ) ) {
    163                        useMainTrans( isMainTrans );
    164                        startQueryTransaction( tableId );
    165
    166                        if( "session".equals( getScope() ) ) {
    167                                removeSessionAttribute( tableId );
    168                                removeSessionAttribute( HybsSystem.VIEWFORM_KEY );
    169                        }
    170
    171                        if( maxRowCount < 0 ) {
    172                                maxRowCount = sysInt( "DB_MAX_ROW_COUNT" );
    173                        }
    174
    175                        create( jsonData );
    176
    177                        if( table != null ) {
    178                                //  checkTableColumn 前に、modifyType 設定を行います。
    179                                executeCount = table.getRowCount();
    180                                if( modifyType != null ) {
    181                                        for( int row = 0; row < executeCount; row++ ) {
    182                                                table.setModifyType( row, modifyType );
    183                                        }
    184                                }
    185
    186                                ErrorMessage errMsg = checkTableColumn( table );
    187                                if( errMsg != null && !errMsg.isOK() ) {
    188                                        jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg, getResource() ) );
    189                                        return SKIP_PAGE;
    190                                }
    191
    192                        }
    193                        // トランザクションチェックを行います。
    194                        if( !commitTableObject( tableId, table ) ) {
    195                                jspPrint( "ReadTableTag Query処理が割り込まれました。DBTableModel は登録しません。" );
    196                                return SKIP_PAGE;
    197                        }
    198
    199                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
    200
    201                        // 実行件数の表示 command="NEW" のときのみ、displayMsg を表示させます。
    202                        if( CMD_NEW.equals( command ) ) {
    203                                if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
    204                                        buf.append( executeCount );
    205                                        buf.append( getResource().getLabel( displayMsg ) );
    206                                        buf.append( HybsSystem.BR );
    207                                }
    208                                else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) {
    209                                        buf.append( getResource().getLabel( notfoundMsg ) );
    210                                        buf.append( HybsSystem.BR );
    211                                }
    212                        }
    213
    214                        // 読込件数を、"DB.COUNT" キーでリクエストにセットする。
    215                        setRequestAttribute( "DB.COUNT", String.valueOf( executeCount ) );
    216
    217                        jspPrint( buf.toString() );
    218                }
    219
    220                // stopZero機能を追加
    221                final int rtnCode;
    222                if( executeCount < 0 && stopZero ) {
    223                        rtnCode = SKIP_PAGE;
    224                }
    225                else {
    226                        rtnCode = EVAL_PAGE;
    227                }
    228
    229                return rtnCode;
    230        }
    231
    232        /**
    233         * タグリブオブジェクトをリリースします。
    234         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    235         *
    236         */
    237        @Override
    238        protected void release2() {
    239                super.release2();
    240                readerClass = "Default";
    241                maxRowCount = -1;
    242                displayMsg = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
    243                notfoundMsg = "MSG0077"; // 対象データはありませんでした。
    244                executeCount = -1; // 検索/実行件数
    245                modifyType = null;
    246                command = CMD_NEW;
    247                table = null;
    248                tableId = HybsSystem.TBL_MDL_KEY;
    249                checkColumns = null; // 取り込み時チェック
    250                nullCheck = null;
    251                stopZero = false;
    252                isMainTrans = true;
    253                skipRowCount = 0;
    254                useRenderer = false;
    255                jsonData = null;
    256        }
    257
    258        /**
    259         * TableReader の実オブジェクトを生成して，BufferedReader に書き込みます。
    260         *
    261         *
    262         * @param       out     出力するBufferedReaderオブジェクト
    263         */
    264        protected void create( final String out ) {
    265                String className = HybsSystem.sys( "JsonReader_" + readerClass );
    266                JsonReader reader = (JsonReader) HybsSystem.newInstance( className );
    267                reader.setResourceManager( getResource() );
    268                reader.setMaxRowCount( maxRowCount );
    269                reader.setSkipRowCount( skipRowCount );
    270                reader.setUseRenderer( useRenderer );
    271                reader.setDebug( isDebug() );
    272                reader.readDBTable( out );
    273                table = reader.getDBTableModel();
    274        }
    275
    276        /**
    277         * カラム文字列(CSV形式)から、カラム番号配列を作成します。
    278         * 簡易メソッドです。
    279         * 引数が、"*" の場合は、全カラムを指定したことになります。
    280         * null の場合は、サイズが ０ の配列を返します。
    281         *
    282         *
    283         * @param       clms    カラム文字列(CSV形式)
    284         * @param       table   DBTableModelオブジェクト
    285         *
    286         * @return      カラム番号配列(無い場合は、長さ０の配列)
    287         */
    288        private int[] makeClmNos( final String clms, final DBTableModel table ) {
    289                final int[] clmNo;
    290
    291                if( clms == null ) {
    292                        clmNo = new int[0];
    293                }
    294                else if( "*".equals( clms ) ) {
    295                        int size = table.getColumnCount();
    296                        clmNo = new int[size];
    297                        for( int i = 0; i < size; i++ ) {
    298                                clmNo[i] = i;
    299                        }
    300                }
    301                else {
    302                        String[] clmStr = StringUtil.csv2Array( clms );
    303                        int size = clmStr.length;
    304                        clmNo = new int[size];
    305                        for( int i = 0; i < size; i++ ) {
    306                                clmNo[i] = table.getColumnNo( clmStr[i] );
    307                        }
    308                }
    309
    310                return clmNo;
    311        }
    312
    313        /**
    314         * checkColumns に指定されたカラムをチェックします。
    315         * カラムオブジェクトのDBType属性に対応したチェックを行います。
    316         * チェック結果で、エラーが発生した場合は、ErrorMessage オブジェクトを
    317         * 返します。
    318         * DBColumn#valueCheck( String ) の結果のErrorMessageをすべて append
    319         * していきます。
    320         * debug=true で、エラー時の詳細なデータを出力します。
    321         *
    322         * @param       table   DBTableModelオブジェクト
    323         *
    324         * @return      カラムキー ＋ 値 のエラーメッセージオブジェクト
    325         */
    326        private ErrorMessage checkTableColumn( final DBTableModel table ) {
    327                ErrorMessage errMsg = new ErrorMessage( "Check Columns Error!" );
    328
    329                int rowCnt = table.getRowCount();
    330                int[] chkClmNo = makeClmNos( checkColumns, table );
    331                int[] nllclmNo = makeClmNos( nullCheck, table );
    332
    333                for( int row = 0; row < rowCnt; row++ ) {
    334                        String[] vals = table.getValues( row );
    335                        DBColumn[] dbClms = table.getDBColumns();
    336                        boolean isError = false;
    337
    338                        // checkColumns 処理
    339                        for( int i = 0; i < chkClmNo.length; i++ ) {
    340                                int no = chkClmNo[i];
    341                                ErrorMessage msg = dbClms[no].valueCheck( vals[no] );
    342                                if( msg.getKekka() > ErrorMessage.OK ) {
    343                                        isError = true;
    344                                        errMsg.append( row + 1, dbClms[no].valueCheck( vals[no] ) );
    345                                }
    346                        }
    347
    348                        // nullCheck 処理
    349                        for( int i = 0; i < nllclmNo.length; i++ ) {
    350                                int no = nllclmNo[i];
    351                                if( vals[no] == null || vals[no].length() == 0 ) {
    352                                        isError = true;
    353                                        String label = dbClms[no].getLabel();
    354                                        // ERR0012 : 指定のデータがセットされていません。(NULLエラー)。key={0}
    355                                        errMsg.addMessage( row + 1, ErrorMessage.NG, "ERR0012", label );
    356                                }
    357                        }
    358
    359                        // エラー時のデバッグ出力
    360                        if( isDebug() && isError ) {
    361                                errMsg.addMessage( row + 1, ErrorMessage.OK, "Debug Info", java.util.Arrays.toString( table.getValues( row ) ) );
    362                        }
    363
    364                        if( errMsg.size() > ERROR_ROW_COUNT ) {
    365                                break;
    366                        }
    367                }
    368
    369                return errMsg;
    370        }
    371
    372        /**
    373         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
    374         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    375         *
    376         * @og.tag
    377         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
    378         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
    379         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
    380         * この tableId 属性を利用して、メモリ空間を分けます。
    381         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    382         *
    383         * @param       id sessionに登録する時の ID
    384         */
    385        public void setTableId( final String id ) {
    386                tableId = nval( getRequestParameter( id ), tableId );
    387        }
    388
    389        /**
    390         * 【TAG】実際に読み出すクラス名の略称(JsonReader_**** の ****)をセットします({@og.doc03Link readerClass 初期値:Default})。
    391         *
    392         * @og.tag
    393         * 実際に読み出すクラス名(の略称)をセットします。
    394         * これは、org.opengion.plugin.json 以下の JsonReader_**** クラスの **** を
    395         * 与えます。これらは、JsonReader インターフェースを継承したサブクラスです。
    396         *
    397         * @param   readerClass クラス名(の略称)
    398         */
    399        public void setReaderClass( final String readerClass ) {
    400                this.readerClass = nval( getRequestParameter( readerClass ), this.readerClass );
    401        }
    402
    403        /**
    404         * 【TAG】読取時の最大取り込み件数をセットします
    405         *              (初期値:DB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。
    406         *
    407         * @og.tag
    408         * DBTableModelのデータとして登録する最大件数をこの値に設定します。
    409         * サーバーのメモリ資源と応答時間の確保の為です。
    410         * 0 をセットすると、無制限(Integer.MAX_VALUE)になります。
    411         * (初期値:ユーザー定数のDB_MAX_ROW_COUNT[={@og.value org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT}])。
    412         *
    413         *
    414         * @param   count 読取時の最大取り込み件数
    415         * @see         org.opengion.hayabusa.common.SystemData#DB_MAX_ROW_COUNT
    416         */
    417        public void setMaxRowCount( final String count ) {
    418                maxRowCount = nval( getRequestParameter( count ), maxRowCount );
    419                if( maxRowCount == 0 ) {
    420                        maxRowCount = Integer.MAX_VALUE;
    421                }
    422        }
    423
    424        /**
    425         * 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)。
    426         *
    427         * @og.tag
    428         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
    429         * フィールド定数値のいづれかを、指定できます。
    430         * 何も設定されない、または、null の場合は、"NEW" が初期値にセットされます。
    431         *
    432         * @param       cmd コマンド(public static final 宣言されている文字列)
    433         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ReadTableTag.CMD_NEW">コマンド定数</a>
    434         */
    435        public void setCommand( final String cmd ) {
    436                String cmd2 = getRequestParameter( cmd );
    437                if( cmd2 != null && cmd2.length() > 0 ) {
    438                        command = cmd2.toUpperCase( Locale.JAPAN );
    439                }
    440        }
    441
    442        /**
    443         * 【TAG】query の結果を画面上に表示するメッセージIDを指定します(初期値:MSG0033[　件検索しました])。
    444         *
    445         * @og.tag
    446         * ここでは、検索結果の件数や登録された件数をまず出力し、
    447         * その次に、ここで指定したメッセージをリソースから取得して
    448         * 表示します。
    449         * 表示させたくない場合は, displayMsg = "" をセットしてください。
    450         * 初期値は、検索件数を表示します。
    451         *
    452         * @param   id ディスプレイに表示させるメッセージ ID
    453         */
    454        public void setDisplayMsg( final String id ) {
    455                if( id != null ) {
    456                        displayMsg = id;
    457                }
    458        }
    459
    460        /**
    461         * 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])。
    462         *
    463         * @og.tag
    464         * ここでは、検索結果がゼロ件の場合のみ、特別なメッセージを表示させます。
    465         * 従来は、displayMsg と兼用で、『0　件検索しました』という表示でしたが、
    466         * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合のみ別に表示させます。
    467         * 表示させたくない場合は, notfoundMsg = "" をセットしてください。
    468         * 初期値は、MSG0077[対象データはありませんでした]です。
    469         *
    470         * @param       id ディスプレイに表示させるメッセージ ID
    471         */
    472        public void setNotfoundMsg( final String id ) {
    473                String ids = getRequestParameter( id );
    474                if( ids != null ) {
    475                        notfoundMsg = ids;
    476                }
    477        }
    478
    479        /**
    480         * 【TAG】取り込み時の モディファイタイプ(A(追加),C(更新),D(削除))を指定します。
    481         *
    482         * @og.tag
    483         * JSON読み込み時に、そのデータをA(追加)、C(更新)、D(削除)の
    484         * モディファイタイプをつけた状態にします。
    485         * その状態で、そのまま、update する事が可能になります。
    486         *
    487         * @param   type ファイル取り込み時の モディファイタイプ(A,C,D属性)
    488         */
    489        public void setModifyType( final String type ) {
    490                modifyType = getRequestParameter( type );
    491        }
    492
    493        /**
    494         * 【TAG】整合性チェックを行うカラム列をカンマ指定します。
    495         *
    496         * @og.tag
    497         * カラムオブジェクトのDBType属性に対応したチェックを行います。
    498         * 指定のカラム名をカンマ区切り(CSV)で複数指定できます。
    499         * 全てのカラムのチェックを行う場合は、allColumnCheck = "true" を
    500         * 指定して下さい。
    501         * 分解方法は、通常のパラメータ取得後に、CSV分解します。
    502         *
    503         *
    504         * @param   clms 整合性チェックを行うカラム列(カンマ区切り文字)
    505         */
    506        public void setCheckColumns( final String clms ) {
    507                checkColumns = nval( getRequestParameter( clms ), checkColumns );
    508        }
    509
    510        /**
    511         * 【TAG】NULL チェックすべきカラム列をカンマ区切り(CVS形式)で指定します。
    512         *
    513         * @og.tag nullCheck="AAA,BBB,CCC,DDD"
    514         * 分解方法は、通常のパラメータ取得後に、CSV分解します。
    515         *
    516         * @param   clms カラム列(CVS形式)
    517         */
    518        public void setNullCheck( final String clms ) {
    519                nullCheck = nval( getRequestParameter( clms ), nullCheck );
    520        }
    521
    522        /**
    523         * 【TAG】読込件数が０件のとき処理を続行するかどうか[true/false]を指定します(初期値:false[続行する])。
    524         *
    525         * @og.tag
    526         * 初期値は、false(続行する)です。
    527         *
    528         *
    529         * @param  cmd 読込件数が０件のとき、処理を [true:中止する/false:続行する]
    530         */
    531        public void setStopZero( final String cmd ) {
    532                stopZero = nval( getRequestParameter( cmd ), stopZero );
    533        }
    534
    535        /**
    536         * 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。
    537         *
    538         * @og.tag
    539         * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが
    540         * ファイルダウンロードの対象の表になります。
    541         *
    542         * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。
    543         * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい
    544         * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から
    545         * 除外することができます。
    546         *
    547         *
    548         * @param  flag メイントランザクションかどうか
    549         */
    550        public void setMainTrans( final String flag ) {
    551                isMainTrans = nval( getRequestParameter( flag ), isMainTrans );
    552        }
    553
    554        /**
    555         * 【TAG】(通常は使いません)データの読み飛ばし件数を設定します。
    556         *
    557         * @og.tag
    558         * データの読み始めの初期値を指定します。
    559         * 先頭行が、０行としてカウントしますので、設定値は、読み飛ばす
    560         * 件数になります。(１と指定すると、１件読み飛ばし、２行目から読み込みます。)
    561         * 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。
    562         * ＃NAME属性や、columns 属性は、有効です。
    563         *
    564         *
    565         * @param       count 読み始めの初期値
    566         */
    567        public void setSkipRowCount( final String count ) {
    568                skipRowCount = nval( getRequestParameter( count ), skipRowCount );
    569        }
    570
    571        /**
    572         * 【TAG】読取処理でラベルをコードリソースに逆変換を行うかどうかを指定します
    573         *
    574         * @og.tag
    575         * コードリソースのカラムに対して、ラベルからコードを求める逆変換を行うことで、
    576         * Renderer 系で出力したデータを取り込むことができるようにします。
    577         *
    578         * JSONでの出力ではRenderer系で出力する事は少ないと思われるため、初期値はfalseとしておきます。
    579         *
    580         *
    581         * @param  flag コードリソースのラベル逆変換を行うかどうか
    582         */
    583        public void setUseRenderer( final String flag ) {
    584                useRenderer = nval( getRequestParameter( flag ), useRenderer );
    585        }
    586
    587        /**
    588         * 【TAG】テーブルモデルに取り込むJSONデータ
    589         *
    590         * @og.tag
    591         * テーブルモデルに取り込むためのJSONデータを指定します。
    592         * タグのBODYでも指定可能です。
    593         *
    594         * @param json 取り込むJSON形式データ
    595         */
    596        public void setJSONData( final String json ) {
    597                jsonData = nval( getRequestParameter( json ), jsonData );
    598        }
    599
    600        /**
    601         * このオブジェクトの文字列表現を返します。
    602         * 基本的にデバッグ目的に使用します。
    603         *
    604         * @return このクラスの文字列表現
    605         */
    606        @Override
    607        public String toString() {
    608                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ).println( "VERSION", VERSION ).println( "readerClass", readerClass ).println( "maxRowCount", maxRowCount ).println( "displayMsg", displayMsg ).println( "executeCount", executeCount ).println( "modifyType", modifyType ).println( "checkColumns", checkColumns ).println( "nullCheck", nullCheck ).println( "command", command ).println( "tableId", tableId ).println( "Other...", getAttributes().getAttribute() ).fixForm().toString();
    609        }
    610}