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