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.DBColumn;
020import org.opengion.hayabusa.db.DBTableModel;
021import org.opengion.fukurou.model.ArrayDataModel;
022import org.opengion.fukurou.model.Formatter;
023import org.opengion.fukurou.util.Attributes;
024import org.opengion.fukurou.util.ErrorMessage;
025import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
026import org.opengion.fukurou.util.StringUtil ;                                   // 6.2.0.0 (2015/02/27)
027import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
028
029import static org.opengion.fukurou.util.StringUtil.nval ;
030
031import java.util.List;
032import java.util.ArrayList;
033import java.util.Enumeration;
034import java.util.Locale ;
035import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
036
037/**
038 * 検索結果の DBTableModelオブジェクトに値を設定するタグです。
039 *
040 * columnSet と共に使用する場合は、entryタグ の command属性と、columnSetタグ の command属性が
041 * 一致した場合のみ、処理されます。
042 * entryタグは、そのコマンドにより、DBTableModelオブジェクトの値を設定します。
043 * たとえば、command="INSERT" ならば、1行分のデータを選択された行番号の次に挿入します。
044 * また、追加、変更、削除された、DBTableModelオブジェクト でも、内部には元のデータを
045 * 持っているため、command="RESET" で元の状態に戻すことが可能です。
046 *
047 * @og.formSample
048 * ●形式:
049 *       ・<og:entry command="…">
050 *             <og:columnSet command="…" />
051 *         </og:entry>
052 *       ・<og:entry command="…" />
053 *             ・・・columnSetを使わない場合でもresult.jspから次画面(insert,modify,copy.jsp等)に
054 *                にDBTableModelをもっていく場合には、必ず2を書いてください。
055 *                (取消のとき、エンジン内でDBTableModelを操作するのに使用する為)
056 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します)
057 *
058 * ●Tag定義:
059 *   <og:entry
060 *       command          ○【TAG】コマンド (INSERT/COPY/MODIFY/DELETE/ENTRY/CHANGE/RESET/ALLRESET/ALLACTION/RESETDATA/INSERTONE/REALDELETE/REQENTRY)を設定します(必須)
061 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
062 *       repeatCount        【TAG】指定の回数分だけ、繰り返し処理を行う回数を指定します(初期値:1)
063 *       tableId            【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID
064 *       useConsistency     【TAG】Consistency キー による整合性チェックを行うかどうかを指定します(初期値:true)
065 *       selectedAll        【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)
066 *       strictCheck        【TAG】(通常は使いません)カラムIDの存在チェックを行うかどうか[true/false]を指定します(初期値:true)
067 *       noTransition       【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します
068 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
069 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
070 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
071 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
072 *       caseIf             【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
073 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
074 *   >   ... Body ...
075 *   </og:entry>
076 *
077 * ●使用例
078 *    <og:entry command="{@command}"  >
079 *        <og:columnSet command="{@command}" columnId="ECNO"   action="CLEAR" />
080 *        <og:columnSet command="{@command}" columnId="JYOKYO" action="SET" value="1" />
081 *    </og:entry>
082 *
083 *    <og:entry command="MODIFY" rows="1" >
084 *        <og:columnSet  command="MODIFY" columnId="key" action="TBLSET" value="[key][lang]"/>
085 *    </og:entry>
086 *
087 *    action="ADD" は、DBTypeに依存した方法で、既存の値を、+1 します。
088 *    <og:entry command="{@command}" repeatCount="5" >
089 *        <og:columnSet  command="{@command}" columnId="YKNO" action="ADD" />
090 *    </og:entry>
091 *
092 *    action="ADD" は、DBTypeに依存した方法で、既存の値に、value の値を加算します。
093 *    <og:entry command="{@command}" repeatCount="5" >
094 *        <og:columnSet  command="{@command}" columnId="YKNO" action="ADD" value="5" />
095 *    </og:entry>
096 *
097 *    command属性 は、columnSetタグのcommand属性と同一の場合のみ、処理します。
098 *    [command属性]
099 *      INSERT     新規
100 *      COPY       複写
101 *      MODIFY     変更
102 *      DELETE     削除
103 *      ENTRY      エントリー
104 *      CHANGE     チェンジ
105 *      RESET      リセット         (RESET_ACTION_ALL_USE=true で、ALLRESET が呼ばれます)
106 *      ALLRESET   全件リセット
107 *      ALLACTION  オールアクション
108 *      RESETDATA  リセットデータ
109 *      INSERTONE  新規(1行のみ)
110 *      REALDELETE 物理削除
111 *      REQENTRY   リクエスト変数設定
112 *
113 *    command属性 は、columnSetタグで指定します。
114 *    [action属性]
115 *      DEFAULT カラムリソースで定義した初期値をセットします。
116 *      CLEAR   値をクリア(ゼロストリング "" )します。
117 *      ADD     現在の値を +1 します。  0 ⇒ 1 , A ⇒ B , 9 ⇒ 10。value属性と併用すれば、指定の値を加算できます。
118 *      SET     value で設定した値を 新しい値として登録します。
119 *      NULLSET 元の値が NULL の場合だけ、value で設定した新しい値を登録します。
120 *      LOWER   小文字に変換します。
121 *      UPPER   大文字に変換します。
122 *      COPY    value にコピー元のカラムIDをセットすれば、その値を代入します。
123 *      TBLSET  DBTableModel の内容を取り込んで指定の columnId カラムに設定します。[カラム名] で指定できます。
124 *              また、これは文字列を解析して、 value を作成しますので,文字列連結等に使用できます。
125 *      WRTCTRL writableControl を使用したカラムデータの先頭アンダーバーを削除します。
126 *      DBMENU  DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。
127 *      REQSET  valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。
128 *      SEQSET  valueの初期値を利用して、1レコードごとに、+1した値をセットします。
129 *      PREFIX  valueの値を後ろから検索し、指定のカラム値の前半部分を取得します(記号は含みません)。
130 *      SUFIX   valueの値を後ろから検索し、指定のカラム値の後半部分を取得します(記号は含みません)。
131 *      その他  カラムのDBType の valueAction メソッドを呼び出します。自由に設定可能です。
132 *
133 *    [strictCheck属性]は、カラムIDの存在チェックを行うかどうかを指定します(初期値:true)
134 *      true    カラムIDがDBTableModel に存在しない場合は、エラーになる。
135 *      false   カラムIDがDBTableModel に存在しない場合は、無視する。
136 *
137 * @og.group 画面登録
138 *
139 * @version  4.0
140 * @author       Kazuhiko Hasegawa
141 * @since    JDK5.0,
142 */
143public class EntryTag extends CommonTagSupport {
144        /** このプログラムのVERSION文字列を設定します。   {@value} */
145        private static final String VERSION = "6.4.3.4 (2016/03/11)" ;
146        private static final long serialVersionUID = 643420160311L ;
147
148        /** command 引数に渡す事の出来る コマンド  新規 {@value} */
149        public static final String CMD_INSERT   = "INSERT" ;
150        /** command 引数に渡す事の出来る コマンド  複写 {@value} */
151        public static final String CMD_COPY             = "COPY" ;
152        /** command 引数に渡す事の出来る コマンド  変更 {@value} */
153        public static final String CMD_MODIFY   = "MODIFY" ;
154        /** command 引数に渡す事の出来る コマンド  削除 {@value} */
155        public static final String CMD_DELETE   = "DELETE" ;
156        /** command 引数に渡す事の出来る コマンド  エントリー {@value} */
157        public static final String CMD_ENTRY    = "ENTRY" ;
158        /** command 引数に渡す事の出来る コマンド  チェンジ {@value} */
159        public static final String CMD_CHANGE   = "CHANGE" ;
160        /** command 引数に渡す事の出来る コマンド  リセット {@value} */
161        public static final String CMD_RESET    = "RESET" ;
162        /** command 引数に渡す事の出来る コマンド  全件リセット {@value} */
163        public static final String CMD_ALLRESET         = "ALLRESET" ;  // 3.5.6.3 (2004/07/12)
164        /** command 引数に渡す事の出来る コマンド  オールアクション{@value} */
165        public static final String CMD_ALLACTION        = "ALLACTION" ;
166        /** command 引数に渡す事の出来る コマンド  リセット(データのみ){@value} */
167        public static final String CMD_RESETDATA        = "RESETDATA" ;         // 4.3.3.0 (2008/10/01)
168        /** command 引数に渡す事の出来る コマンド  追加(1行のみ){@value} */
169        public static final String CMD_INSERTONE        = "INSERTONE" ;         // 5.1.5.0 (2010/04/01)
170        /** command 引数に渡す事の出来る コマンド  物理削除 {@value} */
171        public static final String CMD_REALDELETE       = "REALDELETE" ;                // 5.1.6.0 (2010/05/01)
172        /** command 引数に渡す事の出来る コマンド  リクエスト変数設定 {@value} */
173        public static final String CMD_REQENTRY         = "REQENTRY" ;                  // 5.6.1.2 (2013/02/22)
174        // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
175        private static final Set<String> COMMAND_SET = new ArraySet<>(
176                                                        CMD_INSERT,CMD_COPY,CMD_MODIFY,CMD_DELETE,CMD_ENTRY,CMD_CHANGE,CMD_ALLACTION,
177                                                        CMD_RESET,CMD_ALLRESET,CMD_RESETDATA,CMD_INSERTONE,CMD_REALDELETE,CMD_REQENTRY );
178
179        /** action 引数に渡す事の出来る アクションコマンド  初期値:{@value} */
180        public static final String ACT_DEFAULT  = "DEFAULT" ;
181        /** action 引数に渡す事の出来る アクションコマンド  クリア {@value} */
182        public static final String ACT_CLEAR    = "CLEAR" ;
183        /** action 引数に渡す事の出来る アクションコマンド  +1 {@value} */
184        public static final String ACT_ADD      = "ADD" ;
185        /** action 引数に渡す事の出来る アクションコマンド  小文字化{@value} */
186        public static final String ACT_LOWER    = "LOWER" ;
187        /** action 引数に渡す事の出来る アクションコマンド  大文字化{@value} */
188        public static final String ACT_UPPER    = "UPPER" ;
189        /** action 引数に渡す事の出来る アクションコマンド  コピー {@value} */
190        public static final String ACT_COPY     = "COPY" ;
191        /** action 引数に渡す事の出来る アクションコマンド  セット {@value} */
192        public static final String ACT_SET      = "SET" ;
193        // 3.4.0.3 (2003/09/10) NULLSET Action を追加します。
194        /** action 引数に渡す事の出来る アクションコマンド  NULLセット {@value} */
195        public static final String ACT_NULLSET  = "NULLSET" ;
196        /** action 引数に渡す事の出来る アクションコマンド  テーブルセット {@value} */
197        public static final String ACT_TBLSET   = "TBLSET" ;
198        /** action 引数に渡す事の出来る アクションコマンド  ライトコントロール {@value} */
199        public static final String ACT_WRTCTRL  = "WRTCTRL" ;           // 3.8.1.5 (2006/03/30)
200        /** action 引数に渡す事の出来る アクションコマンド  DBメニュー {@value} */
201        public static final String ACT_DBMENU  = "DBMENU" ;             // 3.8.5.3 (2006/08/07)
202        /** action 引数に渡す事の出来る アクションコマンド  リクエスト値セット {@value} */
203        public static final String ACT_REQSET  = "REQSET" ;             // 5.4.2.1 (2011/12/09)
204        /** action 引数に渡す事の出来る アクションコマンド  連番値セット {@value} */
205        public static final String ACT_SEQSET  = "SEQSET" ;             // 5.6.5.2 (2013/06/21)
206        /** action 引数に渡す事の出来る アクションコマンド  PREFIX値セット {@value} */
207        public static final String ACT_PREFIX  = "PREFIX" ;             // 5.6.6.1 (2013/07/12)
208        /** action 引数に渡す事の出来る アクションコマンド  SUFIX値セット {@value} */
209        public static final String ACT_SUFIX   = "SUFIX" ;              // 5.6.6.1 (2013/07/12)
210
211        // 3.5.6.0 (2004/06/18) すべてを protected から private に変更します。
212        private transient       DBTableModel            table   ;
213        private transient       List<Attributes>        values  ;               // 6.3.9.0 (2015/11/06) transient 追加
214
215        private String                          tableId         = HybsSystem.TBL_MDL_KEY;
216        private String                          command         ;
217        private int[]                           rowNo           ;
218
219        // 3.5.4.2 (2003/12/15) 指定の回数繰り返す機能を追加します。
220        private int                             repeatCount     = 1;
221
222        // 3.5.5.7 (2004/05/10) Consistency キー による整合性チェックを行うかどうかを指定します。
223        private boolean                 useConsistency  = HybsSystem.sysBool( "USE_CONSISTENCY" );
224
225        // 3.8.1.1 (2005/11/21) 全件選択されたこととして、処理します。
226        private boolean selectedAll     ;
227
228        // 3.5.6.4 (2004/07/16) RESET コマンドのデフォルト処理 に、ALLRESET を
229        // 使用するかどうかを指定します(初期値:false(使用しない))。
230        // 6.2.6.0 (2015/06/19) 初期値:true(使用する)にします。
231        private final boolean RESET_ACTION_ALL_USE = HybsSystem.sysBool( "RESET_ACTION_ALL_USE" );
232
233        // 4.0.0 (2006/09/31) カラムIDの存在チェックを行うかどうかを指定します。
234        private boolean strictCheck     = true;
235
236        private boolean noTransition;           // 4.3.3.0 (2008/10/01) 追加
237
238        // 5.6.5.2 (2013/06/21) SEQSET アクションのカウンター
239        private int seqsetCnt   ;
240
241        /**
242         * デフォルトコンストラクター
243         *
244         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
245         */
246        public EntryTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
247
248        /**
249         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
250         *
251         * @og.rev 5.1.9.0 (2010/08/01) 戻り値を、EVAL_BODY_INCLUDE → EVAL_BODY_BUFFERED に変更
252         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
253         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
254         *
255         * @return      後続処理の指示
256         */
257        @Override
258        public int doStartTag() {
259                // 6.3.4.0 (2015/08/01) useTag() の追加と、if条件の反転
260                // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method
261                return useTag() && check( command, COMMAND_SET ) ? EVAL_BODY_BUFFERED : SKIP_BODY;
262
263        }
264
265        /**
266         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
267         *
268         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
269         * @og.rev 3.5.5.5 (2004/04/23) 登録時の 整合性パラメータチェックを行います。
270         * @og.rev 3.5.5.6 (2004/04/27) JSP画面の作成不具合。ENTRY系で、command を投げた場合は、無視します。
271         * @og.rev 3.5.5.7 (2004/05/10) Consistency キー による整合性チェックを行うかどうかを指定します。
272         * @og.rev 3.5.5.8 (2004/05/20) Consistency キー による整合性チェックを checkConsistency() に集約します。
273         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
274         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
275         * @og.rev 4.3.8.0 (2009/08/01) noTransition値取得のメソッド名変更
276         * @og.rev 5.1.3.0 (2010/02/01) noTransitionのコントロールは、requestで行う。
277         * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応
278         * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。
279         *
280         * @return      後続処理の指示
281         */
282        @Override
283        public int doEndTag() {
284                debugPrint();           // 4.0.0 (2005/02/28)
285                if( !useTag() ) { return EVAL_PAGE ; }  // 6.3.4.0 (2015/08/01)
286
287                // noTransition = isNoTransitionRequest() || noTransition; // 4.3.3.0 (2008/10/01) 追加
288                noTransition = isNoTransitionRequest(); // 5.1.3.0 (2010/02/01)
289                startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
290                table = (DBTableModel)getObject( tableId );
291                if( table != null && check( command, COMMAND_SET ) ) {
292                        if( ! checkConsistency() ) { return SKIP_PAGE ; }
293                        if( rowNo == null ) { rowNo = getParameterRows(); }             // 4.0.0 (2005/01/31)
294
295                        commandExec( command );
296
297                        // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
298                        if( ! commitTableObject( tableId, table ) ) {
299                                jspPrint( "EntryTag Query処理が割り込まれました。DBTableModel は登録しません。" );
300                                return SKIP_PAGE;
301                        }
302                }
303
304                return EVAL_PAGE ;
305        }
306
307        /**
308         * タグリブオブジェクトをリリースします。
309         *
310         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
311         *
312         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
313         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
314         * @og.rev 3.5.4.2 (2003/12/15) 指定の回数繰り返す機能を追加します。
315         * @og.rev 3.5.5.7 (2004/05/10) Consistency キー による整合性チェックを行うかどうかを指定します。
316         * @og.rev 3.8.1.1 (2005/11/21) selectedAll 追加。全件選択されたこととして、処理します。
317         * @og.rev 4.0.0.0 (2006/09/31) strictCheck 追加。
318         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性を追加します。
319         * @og.rev 5.6.5.2 (2013/06/21) seqsetCnt 属性を追加します。
320         *
321         */
322        @Override
323        protected void release2() {
324                super.release2();
325                tableId         = HybsSystem.TBL_MDL_KEY;
326                table           = null;
327                command         = null;
328                rowNo           = null;
329                values          = null;
330                repeatCount     = 1;                    // 3.5.4.2 (2003/12/15)
331                useConsistency  = HybsSystem.sysBool( "USE_CONSISTENCY" );              // 3.5.5.7 (2004/05/10)
332                selectedAll = false;            // 3.8.1.1 (2005/11/21)
333                strictCheck = true;                     // 4.0.0 (2006/09/31)
334                noTransition= false;            // 4.3.3.0 (2008/10/01) 追加
335                seqsetCnt       = 0;                    // 5.6.5.2 (2013/06/21) SEQSET アクションのカウンター
336        }
337
338        /**
339         * 内部タグの ColumnSetTag より、個々のカラムの値を書き換える為の属性を指定します。
340         *
341         * 複数の値を受け取って、後ほど、すべてのカラムに対して処理を行います。
342         *
343         * @og.rev 3.1.0.0 (2003/03/20) Vector を使用している箇所で、非同期でも構わない箇所を、ArrayList に置換え。
344         * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。
345         *
346         * @param   attri       属性リスト
347         */
348        protected void setAttributes( final Attributes attri ) {
349                if( values == null ) { values = new ArrayList<>(); }
350                if( command.equalsIgnoreCase( attri.get( "command" ) ) ) {
351                        values.add( attri );
352                }
353        }
354
355        /**
356         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
357         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
358         *
359         * @og.tag
360         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
361         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
362         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
363         * この tableId 属性を利用して、メモリ空間を分けます。
364         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。
365         *
366         * @param       id テーブルID (sessionに登録する時のID)
367         */
368        public void setTableId( final String id ) {
369                tableId   = nval( getRequestParameter( id ),tableId );  // 3.8.0.9 (2005/10/17)
370        }
371
372        /**
373         * 【TAG】コマンド (INSERT,COPY,MODIFY,DELETE,ENTRY,CHANGE,ALLACTION,RESET)をセットします。
374         *
375         * @og.tag
376         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
377         * フィールド定数値のいづれかを、指定できます。
378         *
379         * @param       cmd コマンド (public static final 宣言されている文字列)
380         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.CMD_INSERT">コマンド定数</a>
381         */
382        public void setCommand( final String cmd ) {
383                final String cmd2 = getRequestParameter( cmd );
384                if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
385        }
386
387        /**
388         * コマンドを実行します。
389         *
390         * コマンドは,HTMLから(get/post)指定されますので,setCommand()メソッドで
391         * 登録します。
392         * コマンドを登録すると同時に,実行も行ないます。
393         *
394         * @og.rev 3.5.6.3 (2004/07/12) ALLRESET コマンドを追加する。
395         * @og.rev 4.3.3.0 (2008/10/01) RESETDATA コマンドを追加する。
396         * @og.rev 5.1.5.0 (2010/04/01) INSERTONE コマンドを追加する。
397         * @og.rev 5.1.6.0 (2010/05/01) REALDELETE コマンドを追加する。
398         * @og.rev 5.6.1.2 (2013/02/22) REQENTRY コマンドを追加する。
399         *
400         * @param   command コマンド (public static final 宣言されている文字列)
401         */
402        private void commandExec( final String command ) {
403
404                table.setDefaultRowWritable( false );
405                table.setDefaultRowChecked(  false );
406
407                if( CMD_INSERT.equals(      command ) ) { insert() ; }
408                else if( CMD_COPY.equals(   command ) ) { copy()   ; }
409                else if( CMD_MODIFY.equals( command ) ) { modify() ; }
410                else if( CMD_CHANGE.equals( command ) ) { change() ; }
411                else if( CMD_DELETE.equals( command ) ) { delete() ; }
412                else if( CMD_ENTRY.equals(  command ) ) { entry()  ; }
413                else if( CMD_RESET.equals(  command ) ) {
414                                if( RESET_ACTION_ALL_USE )              { allReset() ; }                // 3.5.6.4 (2004/07/16)
415                                else                                                    { reset()    ; }
416                }
417                else if( CMD_ALLRESET.equals(    command ) ) { allReset()  ; }  // 3.5.6.3 (2004/07/12)
418                else if( CMD_ALLACTION.equals(   command ) ) { allAction() ; }
419                else if( CMD_RESETDATA.equals(   command ) ) { resetData() ; }  // 4.3.3.0 (2008/10/01)
420                else if( CMD_INSERTONE.equals(   command ) ) { insertOne() ; }  // 5.1.5.0 (2010/04/01)
421                else if( CMD_REALDELETE.equals(  command ) ) { realDelete() ; } // 5.1.6.0 (2010/05/01)
422                else if( CMD_REQENTRY.equals(    command ) ) { reqEntry()  ; }  // 5.6.1.2 (2013/02/22)
423        }
424
425        /**
426         * DBTableModelに行を追加します。
427         *
428         * 注意:writableカラムの暫定対応が入っています。単純な空白データを
429         * インサートすると、カラムデータが null になる為、 制御がおかしく
430         * なります。
431         *
432         * @og.rev 3.5.4.2 (2003/12/15) repeatCount による繰り返し処理を追加
433         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性対応
434         *
435         */
436        private void insert() {
437                if( rowNo.length == 0 ) { rowNo = new int[] { -1 }; }
438
439                final boolean rowWritableFlag = "WRITABLE".equalsIgnoreCase( table.getColumnName( 0 ) );        // writable 対策
440                // src の作成は、各チェック毎に行う必要はない。最初の一度だけでよい。
441                String[] src = new String[ table.getColumnCount() ];
442                for( int j=0; j<src.length; j++ ) {
443                        final DBColumn dbColumn = table.getDBColumn( j );
444                        src[j] = dbColumn.getDefault();
445                }
446                if( rowWritableFlag ) { src[0] = "true"; }      // writable 対策
447
448                final int rowCount = table.getRowCount();
449
450                // 逆順にINSERTしないと、行番号がずれてしまう。
451                for( int i=rowNo.length-1; i>=0; i-- ) {
452                        int row = rowNo[i];
453                        for( int cnt=0; cnt<repeatCount; cnt++ ) {
454                                if( cnt >= 1 ) {                // 2回目以降
455                                        src = table.getValues( row );
456                                }
457
458                                String[] dst = new String[ table.getColumnCount() ];
459                                System.arraycopy( src,0,dst,0,dst.length );
460                                dst = setColumnValues( dst );
461
462                                // 4.3.3.0 (2008/10/01) noTransition属性対応
463                                if( noTransition ) { row = rowCount; }
464                                else { row ++; }                                        // 指定行の下に追加する。
465                                table.addValues( dst,row );
466                                table.setRowWritable( row,true );
467                                table.setRowChecked(  row,true );
468                        }
469                }
470        }
471
472        /**
473         * DBTableModelに行を追加し、チェックされた行の値をセットします。
474         *
475         * @og.rev 3.5.4.2 (2003/12/15) repeatCount による繰り返し処理を追加
476         * @og.rev 4.3.3.0 (2008/10/01) noTransition 属性対応
477         *
478         */
479        private void copy() {
480                if( rowNo.length == 0 ) { insert() ; return ;}
481
482                final int rowCount = table.getRowCount();
483
484                // 逆順にCOPYしないと、行番号がずれてしまう。
485                for( int i=rowNo.length-1; i>=0; i-- ) {
486                        for( int cnt=0; cnt<repeatCount; cnt++ ) {
487                                final String[] src = table.getValues( rowNo[i]+cnt );
488                                String[] dst = new String[ table.getColumnCount() ];
489                                System.arraycopy( src,0,dst,0,dst.length );
490                                dst = setColumnValues( dst );
491
492                                // 4.3.3.0 (2008/10/01) noTransition属性対応
493                                int row = -1;
494                                if( noTransition ) { row = rowCount; }
495                                else { row = rowNo[i] + cnt + 1; }                      // 指定行の下に追加する。
496
497                                table.addValues( dst,row );
498                                table.setRowWritable( row,true );
499                                table.setRowChecked(  row,true );
500                        }
501                }
502        }
503
504        /**
505         * DBTableModelの行を書込み可とます。
506         *
507         * @og.rev 4.3.4.6 (2009/01/15) 画面遷移なし登録で既に改廃Cがセットされている場合は、columnSetタグの処理を行わない。
508         *
509         */
510        private void modify() {
511                for( int i=0; i<rowNo.length; i++ ) {
512                        final String[] src = table.getValues( rowNo[i] );
513                        String[] dst = new String[ table.getColumnCount() ];
514                        System.arraycopy( src,0,dst,0,dst.length );
515
516                        // 4.3.4.6 (2009/01/15)
517                        // 画面遷移なし登録の場合、既に改廃Cが付いている(編集されている)場合は、
518                        // columnSetによる値のセットを行わない。
519                        // (同じコマンドで複数のボタンを割り当てている場合、複数回の変更・削除によって、先に登録された
520                        // 値が削除されてしまうため。
521                        if( !( noTransition && table.getModifyType( rowNo[i] ) != null && table.getModifyType( rowNo[i] ).length() > 0 ) ){
522                                dst = setColumnValues( dst );
523                        }
524
525                        table.setValues( dst,rowNo[i] );
526                        table.setRowWritable( rowNo[i],true );
527                        table.setRowChecked(  rowNo[i],true );
528                }
529        }
530
531        /**
532         * DBTableModelの行を変更します。
533
534         * @og.rev 4.3.4.6 (2009/01/15) 画面遷移なし登録で既に改廃Cがセットされている場合は、columnSetタグの処理を行わない。
535         *
536         */
537        private void change() {
538                for( int i=0; i<rowNo.length; i++ ) {
539                        final String[] src = table.getValues( rowNo[i] );
540                        String[] dst = new String[ table.getColumnCount() ];
541                        System.arraycopy( src,0,dst,0,dst.length );
542
543                        // 4.3.4.6 (2009/01/15)
544                        if( !( noTransition && table.getModifyType( rowNo[i] ) != null && table.getModifyType( rowNo[i] ).length() > 0 ) ){
545                                dst = setColumnValues( dst );
546                        }
547
548                        table.setValues( dst,rowNo[i] );
549                }
550        }
551
552        /**
553         * DBTableModelの行を削除します。
554         *
555         * @og.rev 3.5.4.2 (2003/12/15) DELETE時にも値の書き換えができるようにします。
556         * @og.rev 4.3.4.6 (2009/01/15) 画面遷移なし登録で既に改廃Cがセットされている場合は、columnSetタグの処理を行わない。
557         *
558         */
559        private void delete() {
560                for( int i=0; i<rowNo.length; i++ ) {
561                        // 3.5.4.2 (2003/12/15) 書き換え処理を追加
562                        final String[] src = table.getValues( rowNo[i] );
563                        String[] dst = new String[ table.getColumnCount() ];
564                        System.arraycopy( src,0,dst,0,dst.length );
565
566                        // 4.3.4.6 (2009/01/15)
567                        if( !( noTransition && table.getModifyType( rowNo[i] ) != null && table.getModifyType( rowNo[i] ).length() > 0 ) ){
568                                dst = setColumnValues( dst );
569                        }
570
571                        table.rowDelete( dst,rowNo[i] );
572                        table.setRowWritable( rowNo[i],true );
573                        table.setRowChecked( rowNo[i],true );
574                }
575        }
576
577        /**
578         * リクエスト情報から、セットされたカラム名と値を取り出し、設定します。
579         *
580         * 設定値は、個々のキー+"__" + 行番号 です。
581         * よって、値は,一つだけ設定されています。
582         *
583         * @og.rev 3.5.3.1 (2003/10/31) チェックボックスカラムを指定します。
584         * @og.rev 3.6.0.6 (2004/10/22) chboxNames 属性は廃止します。
585         * @og.rev 5.6.1.2 (2013/02/22) setRequestValuesメソッドの互換性の対応。
586         */
587        private void entry() {
588                if( rowNo.length > 0 ) {
589                        setRequestValues( false );              // 5.6.1.2 (2013/02/22) 互換性
590                        for( int i=0; i<rowNo.length; i++ ) {
591                                final String[] src = table.getValues( rowNo[i] );
592                                String[] dst = new String[ table.getColumnCount() ];
593                                System.arraycopy( src,0,dst,0,dst.length );
594                                dst = setColumnValues( dst );
595
596                                table.setValues( dst,rowNo[i] );
597                                table.setRowWritable( rowNo[i],true );
598                                table.setRowChecked(  rowNo[i],true );
599                        }
600                }
601        }
602
603        /**
604         * リクエスト情報のテーブルモデルデータを、リセットします。
605         *
606         * @og.rev 5.6.5.2 (2013/06/21) 行ループを 0~最終行の 降順で廻します。
607         */
608        private void reset() {
609                for( int i=rowNo.length-1; i>=0; i-- ) {
610                        table.resetRow( rowNo[i] );
611                }
612        }
613
614        /**
615         * テーブルモデルデータを、全件リセットします。
616         *
617         * @og.rev 3.5.6.3 (2004/07/12) 新規作成
618         * @og.rev 5.6.5.2 (2013/06/21) 行ループを 0~最終行の 降順で廻します。
619         * @og.rev 6.2.6.0 (2015/06/19) 行ループを 0~最終行の 降順で廻してなかった。
620         */
621        private void allReset() {
622                final int rowCount = table.getRowCount();
623                for( int row=rowCount-1; row>=0; row-- ) {
624                        table.resetRow( row );
625                }
626        }
627
628        /**
629         * DBTableModelの全ての行に対して,値をセットします。
630         *
631         * @og.rev 5.6.5.2 (2013/06/21) 行ループを 0~最終行の 降順で廻します。
632         * @og.rev 6.2.6.0 (2015/06/19) 行ループを 0~最終行の 降順で廻してなかった。
633         */
634        private void allAction() {
635                final int rowCount = table.getRowCount();
636                for( int row=rowCount-1; row>=0; row-- ) {
637                        final String[] src = table.getValues( row );
638                        String[] dst = new String[ table.getColumnCount() ];
639                        System.arraycopy( src,0,dst,0,dst.length );
640                        dst = setColumnValues( dst );
641
642                        table.setValues( dst,row );
643                        table.setRowWritable( row,true );
644                        table.setRowChecked(  row,true );
645                }
646        }
647
648        /**
649         * リクエスト情報のテーブルモデルデータを、リセットします。
650         * (但し、リセットされた行は、チェックされた状態のままになります)
651         *
652         * @og.rev 4.3.3.0 (2008/10/01) 新規作成
653         * @og.rev 5.6.5.2 (2013/06/21) 行ループを 0~最終行の 降順で廻します。
654         * @og.rev 6.2.6.0 (2015/06/19) 行ループを 0~最終行の 降順で廻してなかった。
655         */
656        private void resetData() {
657                for( int i=rowNo.length-1; i>=0; i-- ) {
658                        final String cdkh = table.getModifyType( rowNo[i] );
659                        table.resetRow( rowNo[i] );
660                        // 更新又は、削除の時のみ書き込み可能になる。
661                        if( DBTableModel.UPDATE_TYPE.equals( cdkh ) || DBTableModel.DELETE_TYPE.equals( cdkh ) ) {
662                                table.setRowWritable( rowNo[i],true );
663                                table.setRowChecked(  rowNo[i],true );
664                        }
665                }
666        }
667
668        /**
669         * DBTableModelに行を追加します。(1行のみ)
670         *
671         * 行が選択されているかどうかに関わらず、1行のみを追加します。
672         * (動きとしては、行が選択されていない状態でINSERTコマンドを発行した場合と同じです)
673         *
674         * @og.rev 5.1.5.0 (2010/04/01) 新規作成
675         *
676         */
677        private void insertOne() {
678                rowNo = new int[0];
679                insert();
680        }
681
682        /**
683         * DBTableModelの行を物理削除します。
684         *
685         * 通常のデータベース等で削除する場合は、DELETE行も残しておかないと、どの行を削除するか
686         * 判らなくなります。また、アプリケーションによっては、削除ではなく、フラグだけを立てる
687         * ケースもあるため、現在の commend="DELETE" では、論理削除+値の書き換えも可能になっています。
688         * ここでの物理削除は、WriteTable など、ファイル出力時には、その行そのものをなくしておくほうが
689         * 良いケースがあるためです。
690         *
691         * @og.rev 5.1.6.0 (2010/05/01) REALDELETE コマンドを追加する。
692         */
693        private void realDelete() {
694                // 逆順にしないと、行番号がずれてしまう。
695                for( int i=rowNo.length-1; i>=0; i-- ) {
696                        table.removeValue( rowNo[i] );
697                }
698        }
699
700        /**
701         * リクエスト情報から、セットされたカラム名と値を取り出し、設定します。
702         *
703         * 設定値は、個々のキー+"__" + 行番号 です。
704         * ENTRYコマンドとの違いは、h_rowSel と無関係に、リクエストされた変数すべてを
705         * 処理します。
706         *
707         * @og.rev 5.6.1.2 (2013/02/22) 新規追加
708         */
709        private void reqEntry() {
710                setRequestValues( true );       // リクエストされた変数すべてを処理
711                final int rowCount = table.getRowCount();
712                for( int row=0; row<rowCount; row++ ) {
713                        final String[] src = table.getValues( row );
714                        String[] dst = new String[ table.getColumnCount() ];
715                        System.arraycopy( src,0,dst,0,dst.length );
716                        dst = setColumnValues( dst );
717
718                        table.setValues( dst,row );
719                        table.setRowWritable( row,true );
720                        table.setRowChecked(  row,true );
721                }
722        }
723
724        /**
725         * リクエスト情報から、セットされたカラム名と値を取り出し、設定します。
726         *
727         * 設定値は、個々のキー+"__" + 行番号 です。
728         * よって、値は,一つだけ設定されています。
729         * 引数のフラグは、選択行番号に関係なく、全件処理するかどうか[true:する/false:しない]を指定できます。
730         *
731         * @og.rev 3.1.0.0 (2003/03/20) 名前と行番号の区切り記号を "^" から "__" に変更。
732         * @og.rev 3.5.5.0 (2004/03/12) 名前と行番号の区切り記号("__")を、HybsSystem.JOINT_STRING  に変更。
733         * @og.rev 3.6.0.6 (2004/10/22) chboxNames 属性は廃止します。
734         * @og.rev 3.8.0.1 (2005/06/17) チェックボックス対応で、エラーチェックをPL/SQLで行う場合の処理機能の追加
735         * @og.rev 3.8.0.2 (2005/07/11) チェックボックス対応で、判定を DBColumnのgetEditor()を使用します
736         * @og.rev 4.0.0.0 (2006/09/31) strictCheck 追加。
737         * @og.rev 4.3.7.3 (2009/06/22) HSQLDB対応でリクエストが空文字の場合はnull文字に変換する
738         * @og.rev 5.0.0.2 (2009/09/15) XSS対応(ALLはチェックしない)
739         * @og.rev 5.6.1.2 (2013/02/22) isAllRow 引数追加
740         *
741         * @param isAllRows 全件処理 [true:する/false:しない]
742         */
743        private void setRequestValues( final boolean isAllRows ) {
744                final Enumeration<?> enume = getParameterNames();               // 4.3.3.6 (2008/11/15) Generics警告対応
745
746                while( enume.hasMoreElements() ) {
747                        final String key  = (String)(enume.nextElement());
748                        final int    idx  = key.lastIndexOf(HybsSystem.JOINT_STRING);
749
750                        if( idx > 0 ) {
751                                final String    column  = key.substring(0,idx);
752                                final int               clmNo   = table.getColumnNo( column,strictCheck );
753                                if( clmNo < 0 ) { continue; }   // strictCheck 対応
754                                final DBColumn dbColumn = table.getDBColumn( clmNo );
755                                final int      row      = Integer.parseInt( key.substring(idx + 2) );
756                                // 5.0.0.2 (2009/09/15) 文字種別ALLはXSSチェックしない
757                                // String   val      = dbColumn.valueSet( getRequestValue( key ) );
758                                String   val = null;
759                                if( "ALL".equals( dbColumn.getDbType() ) ){
760                                        val = dbColumn.valueSet( getRequestValue( key, false ) );
761                                }
762                                else{
763                                        val = dbColumn.valueSet( getRequestValue( key ) );
764                                }
765
766                                // 3.6.0.6 (2004/10/22) チェックボックスはマルチでデータが来ます。
767                                // 3.8.0.2 (2005/07/11) 判定を DBColumnのgetEditor()を使用
768                                if( "0".equals(val) && "CHBOX".equals( dbColumn.getEditor() ) ) {
769                                        final String[] vals = getRequestValues( key );
770                                        if( vals != null ) {
771                                                for( int i=0; i<vals.length; i++ ) {
772                                                        if( "1".equals( vals[i] ) ) { val = "1"; break; }
773                                                }
774                                        }
775                                }
776
777                                // 5.6.1.2 (2013/02/22) リクエスト変数すべてのデータを設定
778                                if( isAllRows ) {
779                                        // 4.3.7.3 (2009/06/22) HSQLDB対応
780                                        if( val != null && val.isEmpty() ){
781                                                val = null;
782                                        }
783                                        table.setValue(row, column, val );
784                                }
785                                // 従来のロジック(チェックを外してSUBMITするケースを想定している。)
786                                else {
787                                        // rowNo は、getParameterRows メソッドでソートされているので、
788                                        // java.util.Arrays#binarySearch(int[] a, int key) が使えるはず。
789                                        // 十分にテストしていないため、今は変更しない。
790                                        for( int i=0; i<rowNo.length; i++ ) {
791                                                if( rowNo[i] == row ) {
792                                                        // 4.3.7.3 (2009/06/22) HSQLDB対応
793                                                        if( val != null && val.isEmpty() ){
794                                                                val = null;
795                                                        }
796                                                        table.setValue(row, column, val );
797                                                }
798                                        }
799                                }
800                        }
801                }
802        }
803
804        /**
805         * ColumnSetTag で指定された条件を元に、その行の値を書き換えます。
806         *
807         * @og.rev 3.6.0.6 (2004/10/22) conditionKey と、 conditionList 属性を追加
808         * @og.rev 3.8.1.5 (2006/03/30) writableControl を使用したカラムデータの先頭アンダーバーを削除します。
809         * @og.rev 4.0.0.0 (2006/09/31) strictCheck 追加。
810         * @og.rev 4.3.7.3 (2009/06/22) HSQLDB対応で空文字→NULL
811         * @og.rev 5.6.5.2 (2013/06/21) valueの初期値を利用して、1レコードごとに、+1した値をセットします。
812         * @og.rev 5.7.8.0 (2014/07/04) actionExec の引数を columnId ではなく、DBColumnオブジェクト に変更します。
813         * @og.rev 6.4.3.4 (2016/03/11) Formatterに新しいコンストラクターを追加する。
814         *
815         * @param       val 指定行データ配列
816         *
817         * @return      変更後の指定行データ配列
818         */
819        private String[] setColumnValues( final String[] val ) {
820                if( values != null ) {
821                        final int size = values.size();
822                        for( int i=0; i<size; i++ ) {
823                                final Attributes attri = values.get( i );
824                                final String columnId = attri.get( "columnId" );
825                                final int clmNo = table.getColumnNo( columnId,strictCheck );
826                                if( clmNo < 0 ) { continue; }   // strictCheck 対応
827                                final String action = attri.get( "action" );
828                                final String newVal = attri.get( "value"  );
829                                final String oldVal = val[clmNo];
830
831                                // 3.6.0.6 (2004/10/22) 条件による処理の実行可否判定
832                                final String conditionList = attri.get( "conditionList" );
833                                if( conditionList != null ) {   // null の場合は、無条件実行
834                                        final String conditionKey = attri.get( "conditionKey" );
835                                        final int condClmNo = table.getColumnNo( conditionKey );
836                                        final String condValue = "|" + val[condClmNo] + "|";
837                                        if( conditionList.indexOf( condValue ) < 0 ) {
838                                                continue;
839                                        }
840                                }
841
842                                if( ACT_COPY.equals( action ) ) {
843                                        final int copyClmNo = table.getColumnNo( newVal );      // newVal はコピー元カラム名
844                                        val[clmNo] = val[copyClmNo];
845                                }
846                                else if( ACT_TBLSET.equals( action ) ) {
847                                        final ArrayDataModel model = new ArrayDataModel( table.getNames() );
848                                        model.setValues( val,0 );
849                                        final Formatter format = new Formatter( model,newVal ); // 6.4.3.4 (2016/03/11)
850                                        val[clmNo] = format.getFormatString( 0 );
851                                }
852                                // 3.8.1.5 (2006/03/30) writableControl を使用したカラムデータの先頭アンダーバーを削除します。
853                                else if( ACT_WRTCTRL.equals( action ) ) {
854                                        if( StringUtil.startsChar( oldVal , '_' ) ) {                   // 6.2.0.0 (2015/02/27) 1文字 String.startsWith
855                                                val[clmNo] = oldVal.substring( 1 );
856                                        }
857                                }
858                                // 3.8.5.3 (2006/08/07) DBMENUでパラメータ設定(コロン連結文字)を使用したカラムデータの先頭データのみにします。
859                                else if( ACT_DBMENU.equals( action ) ) {
860                                        if( oldVal != null && oldVal.length() > 0 ) {
861                                                final int adrs = oldVal.indexOf( ':' );
862                                                if( adrs >= 0 ) {
863                                                        val[clmNo] = oldVal.substring( 0,adrs );
864                                                }
865                                        }
866                                }
867                                // 5.4.2.1 (2011/12/09) valueで指定したカラムの値をキーに、リクエスト変数から値を取出し、セットします。
868                                else if( ACT_REQSET.equals( action ) ) {
869                                        if( newVal != null && newVal.length() > 0 ) {
870                                                final int reqClmNo = table.getColumnNo( newVal );       // newVal はリクエスト取得元カラム名
871                                                String reqClm = val[reqClmNo];                          // この時点では、コロン引数が付いている可能性がある。
872
873                                                final int adrs = reqClm.indexOf( ':' );                 // 先頭がカラム名
874                                                if( adrs >= 0 ) {
875                                                        reqClm = reqClm.substring( 0,adrs );    // コロンより前方の分だけ取り出す。
876                                                }
877                                                val[clmNo] = getRequestValue( reqClm );
878                                        }
879                                }
880                                // 5.6.5.2 (2013/06/21) valueの初期値を利用して、1レコードごとに、+1した値をセットします。
881                                else if( ACT_SEQSET.equals( action ) ) {
882                                        int intVal = seqsetCnt ;
883                                        if( newVal != null && newVal.length() > 0 ) {
884                                                intVal += Integer.parseInt( newVal );           // value の設定値
885                                        }
886                                        val[clmNo] = String.valueOf( intVal );
887                                }
888                                else {
889                                        // 5.7.8.0 (2014/07/04) actionExec の引数を columnId ではなく、DBColumnオブジェクト に変更します。
890                                        final DBColumn dbClm = table.getDBColumn( clmNo );
891                                        val[clmNo] = actionExec( action,dbClm,oldVal,newVal );
892                                }
893
894                                // 4.3.7.3 (2009/06/22) HSQLDB対応
895                                if( val[clmNo] != null && val[clmNo].isEmpty()){
896                                        val[clmNo] = null;
897                                }
898                        }
899                }
900                seqsetCnt ++ ;          // // 5.6.5.2 (2013/06/21) SEQSET のカウンター。
901
902                return val;
903        }
904
905        /**
906         * アクションを実行します。
907         *
908         * アクションは,指定のアクションコマンドに対応する処理を入力データに対して行います。
909         *
910         * @og.rev 3.4.0.3 (2003/09/10) NULLSET Action を追加します。
911         * @og.rev 5.6.0.3 (2012/01/24) ADD Action に、value引数の値を加算する機能を追加します。
912         * @og.rev 5.6.6.1 (2013/07/12) action に、PREFIX,SUFIX を追加します。
913         * @og.rev 5.7.8.0 (2014/07/04) columnId ではなく、DBColumnオブジェクト に変更します。
914         *
915         * @param   action アクションコマンド
916         * @param   dbColumn DBColumnオブジェクト
917         * @param   oldValue 入力データ(旧データ)
918         * @param   newValue 入力データ(新データ)
919         *
920         * @return      実行後のデータ
921         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.EntryTag.ACT_DEFAULT">アクション定数</a>
922         */
923        private String actionExec( final String action,final DBColumn dbColumn,final String oldValue,final String newValue ) {
924                String rtnVal = oldValue;
925
926                if( ACT_DEFAULT.equals(    action ) ) { rtnVal = dbColumn.getDefault(); }
927                else if( ACT_CLEAR.equals( action ) ) { rtnVal = ""; }
928                else if( ACT_SET.equals(   action ) ) { rtnVal = dbColumn.valueSet( newValue ); }
929                else if( ACT_ADD.equals(   action ) ) { rtnVal = dbColumn.valueAdd( oldValue,newValue ); }      // 5.6.0.3 (2012/01/24)
930                else if( ACT_LOWER.equals( action ) ) {
931                        if( oldValue == null ) { rtnVal = dbColumn.getDefault();  }
932                        else                   { rtnVal = oldValue.toLowerCase(Locale.JAPAN); }
933                }
934                else if( ACT_UPPER.equals( action ) ) {
935                        if( oldValue == null ) { rtnVal = dbColumn.getDefault();  }
936                        else                   { rtnVal = oldValue.toUpperCase(Locale.JAPAN); }
937                }
938                // 3.4.0.3 (2003/09/10) NULLSET Action を追加します。
939                else if( ACT_NULLSET.equals( action ) ) {
940                        if( oldValue == null || oldValue.isEmpty() ) {
941                                rtnVal = dbColumn.valueSet( newValue );
942                        }
943                }
944                // 5.6.6.1 (2013/07/12) PREFIX Action を追加します。
945                else if( ACT_PREFIX.equals( action ) ) {
946                        if( oldValue != null && oldValue.length() > 0 && newValue != null && newValue.length() > 0 ) {
947                                final int indx = oldValue.lastIndexOf( newValue );
948                                if( indx >= 0 ) {
949                                        rtnVal = oldValue.substring( 0,indx );
950                                }
951                        }
952                }
953                // 5.6.6.1 (2013/07/12) SUFIX Action を追加します。
954                else if( ACT_SUFIX.equals( action ) ) {
955                        if( oldValue != null && oldValue.length() > 0 && newValue != null && newValue.length() > 0 ) {
956                                final int indx = oldValue.lastIndexOf( newValue );
957                                if( indx >= 0 ) {
958                                        rtnVal = oldValue.substring( indx+1 );          // 分割記号は含まないので+1する。
959                                }
960                        }
961                }
962                else {
963                        rtnVal = dbColumn.valueAction( action,oldValue,newValue );
964                }
965
966                if( rtnVal == null ) { rtnVal = dbColumn.getDefault(); }
967
968                return rtnVal;
969        }
970
971        /**
972         * 【TAG】指定の回数分だけ、繰り返し処理を行う回数を指定します(初期値:1)。
973         *
974         * @og.tag
975         * 追加や複写時に、指定の回数分だけ、処理を繰り返して、新規に行を
976         * 作成します。
977         * 繰り返しは、指定の行に対して行われ、繰り返し毎に、直前に作成された
978         * 行を元に処理します。これは、例えば、columnSet で、action="ADD"の場合に、
979         * 繰り返す毎に、ADD処理が実行されることを意味します。
980         * 行が指定されていない場合は、先頭空行に追加します。
981         * 初期値は、1回です。
982         *
983         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
984         *
985         * @param       rc      繰り返し処理回数(初期値:1)
986         */
987        public void setRepeatCount( final String rc ) {
988                repeatCount = nval( getRequestParameter( rc ),repeatCount );
989        }
990
991        /**
992         * 【TAG】Consistency キー による整合性チェックを行うかどうか[true/false]を指定します(初期値:true)。
993         *
994         * @og.tag
995         * 検索結果を DBTableModel にセットする時に、整合性キーの Consistency キーを
996         * 作成します。これを、Viewタグでhidden出力しておき、Entryタグでデータ書き換え時に
997         * 整合性チェックを行います。これは、IEの戻るボタンで戻った場合に、画面の
998         * キーと検索結果の DBTableModel の内容が一致しない場合のエラーチェックに
999         * なります。
1000         * この属性は、何らかのケースで、このエラーチェックを行いたくない場合に、
1001         * false に設定することで、整合性チェックを行いません。
1002         * 初期値は、true(整合性チェックを行う)です。
1003         *
1004         * @og.rev 3.5.5.7 (2004/05/10) 新規登録
1005         *
1006         * @param       ck      整合性チェック [true:行う/false:行わない]
1007         */
1008        public void setUseConsistency( final String ck ) {
1009                useConsistency = nval( getRequestParameter( ck ),useConsistency );
1010        }
1011
1012        /**
1013         * DBTableModel の 整合性パラメータとリクエスト情報を比較チェックします。
1014         * リクエスト情報は、その DBTableModel が出力された view で hidden 属性で
1015         * 設定されます。
1016         * 設定されるキーは、tableId が変更されていなければ、HybsSystem.CONSISTENCY_KEY です。
1017         * 変更されていれば、HybsSystem.CONSISTENCY_KEY + tableId です。
1018         *
1019         * @og.rev 3.5.5.8 (2004/05/20) Consistency キー による整合性チェックを checkConsistency() に集約します。
1020         * @og.rev 6.4.2.1 (2016/02/05) useConsistency の判定条件を見直します。
1021         *
1022         * @return チェック結果  true:正常/false:異常
1023         * @see org.opengion.hayabusa.common.HybsSystem#CONSISTENCY_KEY
1024         */
1025        private boolean checkConsistency() {
1026                boolean rtn = true;
1027
1028                // 6.4.2.1 (2016/02/05) useConsistency の判定条件を、見直します。
1029                if( useConsistency ) {
1030                        final String consisKey = getRequestValue( HybsSystem.CONSISTENCY_KEY );
1031                        if( consisKey != null && consisKey.length() > 0 ) {
1032                                if( ! consisKey.equals( table.getConsistencyKey() ) ) {
1033
1034                                        final ErrorMessage errMsgObj = new ErrorMessage( "Consistency Key Check Error!" );
1035                                        errMsgObj.addMessage( 0,ErrorMessage.NG,"ERR0033.1" );                  // 画面とデータの整合性チェックでエラーが出ました。
1036                                        errMsgObj.addMessage( 0,ErrorMessage.NG,"ERR0033.2" );                  // すでにデータは更新されている為、その画面からは登録できません。
1037                                        errMsgObj.addMessage( 0,ErrorMessage.NG,"ERR0033.3" );                  // ブラウザの戻るボタンで戻り、登録すると、このエラーが出ます。
1038                                        jspPrint( TaglibUtil.makeHTMLErrorTable( errMsgObj,getResource() ) );
1039                                        rtn = false;
1040                                }
1041                        }
1042                        else {
1043                                System.out.println( "EntryTag:Consistency Key is null" );
1044                        }
1045                }
1046                return rtn ;
1047
1048        }
1049
1050        /**
1051         * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行を処理の対象とします。
1052         *
1053         * @og.rev 3.8.1.1 (2005/11/21) selectedAll 追加。全件選択されたこととして、処理します。
1054         * @og.rev 4.0.0.0 (2005/01/31) getParameterRows() を使用するように変更
1055         *
1056         * @return      選択行の配列
1057         * @og.rtnNotNull
1058         */
1059        @Override
1060        protected int[] getParameterRows() {
1061                final int[] rowNo ;
1062                if( selectedAll ) {
1063                        final int rowCnt = table.getRowCount();         // 3.5.5.7 (2004/05/10)
1064                        rowNo = new int[ rowCnt ];
1065                        for( int i=0; i<rowCnt; i++ ) {
1066                                rowNo[i] = i;
1067                        }
1068                } else {
1069                        rowNo = super.getParameterRows();               // 4.0.0 (2005/01/31)
1070                }
1071                return rowNo ;
1072        }
1073
1074        /**
1075         * 【TAG】データを全件選択済みとして処理するかどうか[true/false]を指定します(初期値:false)。
1076         *
1077         * @og.tag
1078         * 全てのデータを選択済みデータとして扱って処理します。
1079         * 全件処理する場合に、(true/false)を指定します。
1080         * 初期値は false です。
1081         *
1082         * @param  all 全件選択済み処理 [true:全件選択済み/false:通常]
1083         */
1084        public void setSelectedAll( final String all ) {
1085                selectedAll = nval( getRequestParameter( all ),selectedAll );
1086        }
1087
1088        /**
1089         * 【TAG】(通常は使いません)カラムIDの存在チェックを行うかどうか[true/false]を指定します(初期値:true)。
1090         *
1091         * @og.tag
1092         * true の場合、カラムIDがDBTableModel に存在しない場合は、エラーになります。
1093         * false の場合、カラムIDがDBTableModel に存在しない場合は、無視します。
1094         * これは、検索条件によって、設定されるカラムが異なる場合でも、entryタグを
1095         * 正常に動作させたい場合に、使用します。
1096         * 初期値は true (チェックを行う) です。
1097         *
1098         * @param  check 存在チェック [true:行う/false:行わない]
1099         */
1100        public void setStrictCheck( final String check ) {
1101                strictCheck = nval( getRequestParameter( check ),strictCheck );
1102        }
1103
1104        /**
1105         * 【TAG】(通常は使いません)画面遷移を行わない形式の登録方法を使用するかを指定します。
1106         *
1107         * @og.tag
1108         * 画面遷移なしの登録を行うかどうかを指定します。
1109         * trueが指定された場合、entryタグでは、行の追加・複写時にDBTableModel上の最終行にデータを
1110         * 追加します。
1111         * 画面遷移なしモードの場合、途中行に挿入された場合、既にクライアントに出力されている
1112         * チェックボックスの行番号や各入力フィールドの変数名との整合性を合わせるためには、
1113         * 編集行以降の各変数値を全て再計算する必要があります。
1114         * この処理は、レスポンス悪化に繋がるため、DBTableModel上は、中間に行の挿入を行いません。
1115         * 但し画面表示上は、通常通り選択行の直下に行が挿入されるため、DBTableModelの順番と標準順が
1116         * 異なります。(エンジン側では、各チェックボックスの値で行を識別しているため、問題は発生しません)
1117         *
1118         * この値は、og:headタグで設定値、または前画面からの値を継承するため、通常、この属性ではセットしません。
1119         *
1120         * @og.rev 4.3.3.0 (2008/10/01) 新規追加
1121         * @og.rev 5.1.3.0 (2010/02/01) noTransition、ajaxSubmitのコントロールは、requestで行う。
1122         *
1123         * @param   noTrnstn 画面遷移を行わない形式の登録方法を使用するか
1124         */
1125        public void setNoTransition( final String noTrnstn ) {
1126                setNoTransitionRequest( nval( getRequestParameter( noTrnstn ), isNoTransitionRequest() ) );
1127        }
1128
1129        /**
1130         * このオブジェクトの文字列表現を返します。
1131         * 基本的にデバッグ目的に使用します。
1132         *
1133         * @return このクラスの文字列表現
1134         * @og.rtnNotNull
1135         */
1136        @Override
1137        public String toString() {
1138                return ToString.title( this.getClass().getName() )
1139                                .println( "VERSION"                                     ,VERSION                                )
1140                                .println( "tableId"                                     ,tableId                                )
1141                                .println( "command"                                     ,command                                )
1142                                .println( "rowNo"                               ,rowNo                          )
1143                                .println( "repeatCount"                         ,repeatCount                    )
1144                                .println( "useConsistency"                      ,useConsistency                 )
1145                                .println( "selectedAll"                         ,selectedAll                    )
1146                                .println( "strictCheck"                         ,strictCheck                    )
1147                                .println( "noTransition"                        ,noTransition                   )
1148                                .println( "RESET_ACTION_ALL_USE"        ,RESET_ACTION_ALL_USE   )
1149                                .println( "Other..."                            ,getAttributes().getAttribute() )
1150                                .fixForm().toString() ;
1151        }
1152}