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.fukurou.util.HybsDateUtil;
019    import static org.opengion.fukurou.util.StringUtil.nval;
020    
021    import java.io.IOException;
022    import java.io.ObjectInputStream;
023    import java.io.ObjectOutputStream;
024    // import java.text.DateFormat;
025    // import java.text.SimpleDateFormat;
026    import java.util.Calendar;
027    import java.util.Enumeration;
028    import java.util.LinkedHashSet;
029    import java.util.Locale;
030    import java.util.ArrayList;
031    import java.util.Set;
032    import java.text.NumberFormat;
033    
034    import javax.servlet.jsp.PageContext;
035    
036    import org.opengion.hayabusa.common.HybsSystem;
037    import org.opengion.hayabusa.common.HybsSystemException;
038    import org.opengion.hayabusa.db.DBColumn;
039    import org.opengion.hayabusa.db.DBTableModel;
040    import org.opengion.hayabusa.db.Query;
041    import org.opengion.hayabusa.db.QueryFactory;
042    import org.opengion.fukurou.util.StringUtil;
043    import org.opengion.fukurou.db.Transaction;
044    import org.opengion.fukurou.db.TransactionReal;
045    
046    /**
047     * JSP上からキー、?を設定することにより、リクエスト情報として、??
048     * 取?し可能にするタグです?
049     *
050     * 通常のリクエスト情報と同じ扱?できま?優先?位?、Valueタグが上??
051     *
052     * 設定した?は、{@XXXX} 形式で 取り出すことができます?
053     * また?command ="GET" で 直接画面に値を書き?すことも可能です?
054     *
055     * ※ こ?タグは、Transaction タグの対象です?
056     *
057     * @og.formSample
058     * ●形式?lt;og:value command="SET" key="ABC" value="123" />
059     * ●body?あ?
060     *
061     * ●Tag定義??
062     *   <og:value
063     *       command            【TAG】コマン?SET,GET,REMOVE,SQL,SETTBL,GETTBL,KEYTBL,CLEAR,SETMEM)をセ?しま?初期値:SET)
064     *       action             【TAG】アクション(UPPER,LOWER,MESSAGE,APPEND,ALL_APPEND,MAP,ALL_MAP,LIST,ALL_LIST,DAY_WEEK,MERGE,FIRST,ROW_APPEND,REPLACE,SUBSTR,SPLIT,MAX_MIN,ALL_MAX_MIN)をセ?しま?
065     *       key                【TAG】リクエスト情報 に登録するキーをセ?しま?
066     *       value              【TAG】リクエスト情報 に登録する値をセ?しま?
067     *       defaultVal         【TAG】value値がNULLの場合に、この初期値を設定しま?
068     *       nullSet            【?】value ?NULL の時に、設定するかど?[true/false]を指定しま?初期値:true)
069     *       separator          【TAG】各種アクションの??を???する?区??をセ?しま?初期値:",")
070     *       useMultiRows       【TAG】?ルチデータ(?件検索)を使用するかど?[true/false]を指定しま?初期値:false)
071     *       scope              【TAG】キャ?ュする場合?スコー?request,session)を指定しま?初期値:request)
072     *       tableId            【TAG】sessionから取得す?DBTableModelオブジェクト? ID
073     *       tblScope           【TAG】DBTableModel から取得する?合?スコー?request,session)を指定しま?初期値:session)
074     *       dbid               【TAG?通常は使?せん)Queryオブジェクトを作?する時?DB接続IDを指定しま?
075     *       xssCheck           【TAG】リクエスト情報の HTMLTag開?終??><) 存在チェ?を実施するかど?[true/false]を設定しま?(初期値:USE_XSS_CHECK[=true])
076     *       caseKey            【TAG】このタグ自体を利用するかど?の条件キーを指定しま?初期値:null)
077     *       caseVal            【TAG】このタグ自体を利用するかど?の条件値を指定しま?初期値:null)
078     *       toVal              【TAG】部?字?置換? 置換え後?部?字?(to)を指定しま?
079     *       fromVal            【TAG】部?字?置換? 置換え前?部?字?(from)を指定しま?
080     *       debug              【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
081     *   >   ... Body ...
082     *   </og:value>
083     *
084     * ●使用?
085     *     ・ <og:value command="SET" key="ABC" value="123" />
086     *     ・ <og:value command="SQL">SELECT 1 TEST FROM DUAL</og:value>
087     *     ・ <og:value command="SET" key="DEF" value="{@NOCOMMAND}" defaultVal="0000" />
088     *     ・ <og:value command="GET" key="NOKEY" defaultVal="NODATA" />
089     *     ・ <og:value command="SET" key="{@ABC}4" value="TEST1234" />
090     *     ・ <og:value command="GET" key="ABC" />
091     *     ・ <og:value command="SET" action="LOWER" key="LOWERTEST" value="ABCDEF" />
092     *     ・ <og:value command="GET" key="LOWERTEST" />
093     *     ・ <og:value command="GET" action="UPPER" key="LOWERTEST" />
094     *     ・ <og:value command="REMOVE" key="ABC" />
095     *
096     * <style type="text/css">
097     *   #valueJavaDoc th { text-align:center; vertical-align: middle; writing-mode: tb-rl; }
098     *   #valueJavaDoc td { text-align:center; }
099     * </style>
100     *
101     * <table border="1" frame="box" rules="all" id="valueJavaDoc">
102     * <tr><th></th><th>UPPER</th><th>LOWER</th><th>MESSAGE</th><th>APPEND</th><th>ALL_APPEND</th><th>MAP</th><th>ALL_MAP</th><th>LIST</th><th>ALL_LIST</th>
103     * <th>DAY_WEEK</th><th>MERGE</th><th>FIRST</th><th>ROW_APPEND</th><th>REPLACE</th><th>SUBSTR</th><th>SPLIT</th><th>MAX_MIN</th><th>ALL_MAX_MIN</th></tr>
104     * <tr><td>SET   </td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
105     * <tr><td>GET   </td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
106     * <tr><td>REMOVE</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
107     * <tr><td>CLEAR </td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
108     * <tr><td>SQL   </td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
109     * <tr><td>SETTBL</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
110     * <tr><td>GETTBL</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
111     * <tr><td>KEYTBL</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
112     * <tr><td>SETMEM</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
113     * <tr><td>SQLGET</td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td><td>?/td></tr>
114     * </table>
115     *
116     * @og.group そ?他部?
117     *
118     * @version  4.0
119     * @author   M.Endou
120     * @since    JDK5.0,
121     */
122    public class ValueTag extends CommonTagSupport {
123            //* こ?プログラ??VERSION??を設定します?       {@value} */
124            private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
125    
126            private static final long serialVersionUID = 566120130712L ;
127    
128            /** command 引数に渡す事?出来?コマン? セ? {@value} */
129            public static final String CMD_SET              = "SET";
130            /** command 引数に渡す事?出来?コマン? ゲ? {@value} */
131            public static final String CMD_GET              = "GET";
132            /** command 引数に渡す事?出来?コマン? リ???{@value} */
133            public static final String CMD_REMOVE   = "REMOVE";
134            /** command 引数に渡す事?出来?コマン? クリア {@value} */
135            public static final String CMD_CLEAR    = "CLEAR";
136            /** command 引数に渡す事?出来?コマン? ??? {@value} */
137            public static final String CMD_SQL              = "SQL";
138            /** command 引数に渡す事?出来?コマン? セ???ブル {@value} */
139            public static final String CMD_SETTBL   = "SETTBL";
140            /** command 引数に渡す事?出来?コマン? ゲ???ブル {@value} */
141            public static final String CMD_GETTBL   = "GETTBL";
142            /** command 引数に渡す事?出来?コマン? キー??ブル {@value} */
143            public static final String CMD_KEYTBL   = "KEYTBL";
144            /** command 引数に渡す事?出来?コマン? セ?メモリ {@value} */
145            public static final String CMD_SETMEM   = "SETMEM";                     // 3.7.1.0 (2005/04/15)
146            /** command 引数に渡す事?出来?コマン? ???ゲ? {@value} */
147            public static final String CMD_SQLGET   = "SQLGET";                     // 5.1.7.0 (2010/06/01) SQLGET対?
148    
149            /** command 引数に渡す事?出来?コマン?リス? */
150            private static final String[] COMMAND_LIST = new String[] {
151                            CMD_SET , CMD_GET , CMD_REMOVE , CMD_SQL , CMD_SETTBL , CMD_GETTBL ,
152                            CMD_KEYTBL , CMD_CLEAR , CMD_SETMEM, CMD_SQLGET };
153    
154            /** action 引数に渡す事?出来?アクション  ア?ー(大?化) {@value} */
155            public static final String ACT_UPPER            = "UPPER" ;
156            /** action 引数に渡す事?出来?アクション  ローワー(小文字化) {@value} */
157            public static final String ACT_LOWER            = "LOWER" ;
158            /** action 引数に渡す事?出来?アクション  メ?ージ変換 {@value} */
159            public static final String ACT_MESSAGE          = "MESSAGE" ;
160            /** action 引数に渡す事?出来?アクション  ??タアペン?{@value} */
161            public static final String ACT_APPEND           = "APPEND" ;
162            /** action 引数に渡す事?出来?アクション  オールアペン?{@value} */
163            public static final String ACT_ALL_APPEND       = "ALL_APPEND" ;                // 3.6.1.0 (2005/01/05)
164            /** action 引数に渡す事?出来?アクション  MAP {@value} */
165            public static final String ACT_MAP                      = "MAP" ;                               // 5.5.0.3 (2012/03/12)
166            /** action 引数に渡す事?出来?アクション  ALL_MAP {@value} */
167            public static final String ACT_ALL_MAP          = "ALL_MAP" ;                   // 5.5.0.3 (2012/03/12)
168            /** action 引数に渡す事?出来?アクション  LIST {@value} */
169            public static final String ACT_LIST                     = "LIST" ;                              // 4.3.7.5 (2009/07/13)
170            /** action 引数に渡す事?出来?アクション  ALL_LIST {@value} */
171            public static final String ACT_ALL_LIST         = "ALL_LIST" ;                  // 4.3.7.5 (2009/07/13)
172            /** action 引数に渡す事?出来?アクション  日付前方まるめ {@value} */
173            public static final String ACT_DAY_WEEK         = "DAY_WEEK" ;                  // 3.7.1.0 (2005/04/15)
174            /** action 引数に渡す事?出来?アクション  マ?ジ {@value} */
175            public static final String ACT_MERGE            = "MERGE" ;                             // 3.7.1.1 (2005/05/23)
176            /** action 引数に渡す事?出来?アクション  ファース?{@value} */
177            public static final String ACT_FIRST            = "FIRST" ;                             // 3.8.0.4 (2005/08/08)
178            /** action 引数に渡す事?出来?アクション  縦横回転 {@value} */
179            public static final String ACT_ROW_APPEND       = "ROW_APPEND" ;                // 3.8.9.2 (2007/07/28)
180            /** action 引数に渡す事?出来?アクション  ??置?{@value} */
181            public static final String ACT_REPLACE          = "REPLACE" ;                   // 5.2.2.0 (2010/11/01)
182            /** action 引数に渡す事?出来?アクション  部?字? {@value} */
183            public static final String ACT_SUBSTR           = "SUBSTR" ;                    // 5.2.2.0 (2010/11/01)
184            /** action 引数に渡す事?出来?アクション  ??? {@value} */
185            public static final String ACT_SPLIT            = "SPLIT" ;                             // 5.2.2.0 (2010/11/01)
186            /** action 引数に渡す事?出来?アクション  ?_?? {@value} */
187            public static final String ACT_MAX_MIN          = "MAX_MIN" ;                                   // 5.6.4.3 (2013/05/24)
188            /** action 引数に渡す事?出来?アクション  ALL_?_?? {@value} */
189            public static final String ACT_ALL_MAX_MIN      = "ALL_MAX_MIN" ;                               // 5.6.4.3 (2013/05/24)
190    
191            /** action 引数に渡す事?出来?アクション リス? */
192            private static final String[] ACTION_LIST = new String[] {
193    //              ACT_UPPER , ACT_LOWER , ACT_MESSAGE , ACT_APPEND , ACT_ALL_APPEND , ACT_DAY_WEEK , ACT_MERGE , ACT_FIRST };
194    //              ACT_UPPER , ACT_LOWER , ACT_MESSAGE , ACT_APPEND , ACT_ALL_APPEND , ACT_LIST, ACT_ALL_LIST , ACT_DAY_WEEK , ACT_MERGE , ACT_FIRST , ACT_ROW_APPEND };
195    //              ACT_UPPER , ACT_LOWER , ACT_MESSAGE , ACT_APPEND , ACT_ALL_APPEND , ACT_LIST, ACT_ALL_LIST ,
196                    ACT_UPPER , ACT_LOWER , ACT_MESSAGE , ACT_APPEND , ACT_ALL_APPEND , ACT_MAP , ACT_ALL_MAP , ACT_LIST, ACT_ALL_LIST ,
197    //              ACT_DAY_WEEK , ACT_MERGE , ACT_FIRST , ACT_ROW_APPEND , ACT_REPLACE , ACT_SUBSTR , ACT_SPLIT };
198                    ACT_DAY_WEEK , ACT_MERGE , ACT_FIRST , ACT_ROW_APPEND , ACT_REPLACE , ACT_SUBSTR , ACT_SPLIT , ACT_MAX_MIN , ACT_ALL_MAX_MIN
199            };
200    
201            private String                  tableId         = HybsSystem.TBL_MDL_KEY;
202            private String                  command         = CMD_SET;
203            private String                  key                     = null;
204            private String                  inValue         = null;         // 3.5.4.0 (2003/11/25)
205            private String                  value           = null;
206            private String                  defaultVal      = null;
207            private String                  action          = null;
208    //      private boolean                 isNullSet       = true;         // NULL のときにセ?し直すかど??.1.8.0 (2010/07/01) ?
209            private transient DBTableModel  table           = null;
210            // 4.0.0.0 (2007/10/10) dbid の初期値を?"DEFAULT" から null に変更
211    //      private String                  dbid            = "DEFAULT";
212            private String                  dbid            = null;
213            private String                  scope           = "request";    // "request","session"
214            private String                  tblScope        = "session";    // 5.1.2.0 (2010/01/01) DBTableModel の取得?のscope
215            private String                  separator       = ",";   // ?区???
216    //      private String                  parameter       = null;                 // 5.6.4.3 (2013/05/24) 未使用なので削除
217            // 3.2.4.0 (2003/06/12) マルチデータ(?件検索)を使用するかしな??
218            private boolean                 useMultiRows    = false;        // 初期値:使用せず
219    
220            private boolean                 xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.1.7.0 (2010/06/01) XSS対?
221    
222            private String  fromVal         = null;         // 5.2.2.0 (2010/11/01)
223            private String  toVal           = null;         // 5.2.2.0 (2010/11/01)
224    
225            private boolean tmpSelectedAll  = false;        // 5.6.4.3 (2013/05/24) action="ALL_xxx"?tmpSelectedAll="true" で?処?ます?
226    
227            /**
228             * Taglibの開始タグが見つかったときに処??doStartTag() ?オーバ?ライドします?
229             *
230             * @og.rev 3.1.7.0 (2003/05/02) isNullSet 属??true(初期値)のとき?、リクエスト情報から値を取得?
231             * @og.rev 3.1.7.0 (2003/05/02) scope 属?を設定するタイミングを?早くする?
232             * @og.rev 3.5.4.0 (2003/11/25) getRequestParameter( value ) メソ??setValue に移動?
233             * @og.rev 5.1.7.0 (2010/06/01) SQLGET対?
234             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
235             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
236             *
237             * @return      後続????
238             */
239            @Override
240            public int doStartTag() {
241                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
242                    if( useTag() ) {
243                            super.setScope( scope );                // ?ォル?cope ?"request" なので、?設定して??
244    
245            //              if( isNullSet ) {
246            //                      setUseValue( false );
247            //              }
248    
249                            // 5.1.7.0 (2010/06/01) SQLGET対?
250                            if( CMD_SQL.equals( command ) || CMD_SET.equals( command ) || CMD_SQLGET.equals( command ) ) {
251                                    return ( EVAL_BODY_BUFFERED );          // Body を評価する
252                            }
253    //                      else {
254    //                              return ( SKIP_BODY );                           // Body を評価しな?
255    //                      }
256                    }
257                    return ( SKIP_BODY );                           // Body を評価しな?
258            }
259    
260            /**
261             * Taglibのタグ本体を処??doAfterBody() ?オーバ?ライドします?
262             *
263             * @og.rev 3.1.1.0 (2003/03/28) ボディの?を取得する??、CommonTagSupport で行う?
264             * @og.rev 3.6.0.8 (2004/11/19) エラー発生時に確実にリリースされるよ? try finally 追?
265             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
266             * @og.rev 4.0.0.0 (2005/01/31) lang ?ResourceManager へ変更
267             * @og.rev 5.1.7.0 (2010/06/01) SQLGET対?
268             * @og.rev 5.1.7.0 (2010/06/01) XSS解除対?
269             * @og.rev 5.1.9.0 (2010/08/01) TransactionTag 対応?上位に TransactionTag があれ?、そこからConnection をもらう?
270             * @og.rev 5.2.1.0 (2010/10/01) command="SET" action="APPEND"でvalueをbody部に書?場合に動作しな?グを修正
271             * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
272             * @og.rev 5.3.8.0 (2011/08/01) Transaction発生?でclose()
273             *
274             * @return      後続????(SKIP_BODY)
275             */
276            @Override
277            public int doAfterBody() {
278                    if( value == null || value.length() <= 0 ) {
279                            // 5.1.7.0 (2010/06/01) XSS対?
280                            useXssCheck( xssCheck );
281    
282                            value = getBodyString();
283                            // 5.2.1.0 (2010/10/01)
284                            inValue = getBodyRawString();
285    
286                            // 5.1.7.0 (2010/06/01) SQLGET対?
287                            if( CMD_SQL.equals( command ) || CMD_SQLGET.equals( command ) ) {
288                                    Query query = QueryFactory.newInstance();               // 4.0.0 (2005/01/31)
289                                    Transaction tran = null;
290                                    try {
291                                            value = value.trim();
292    
293                                            // 5.1.9.0 (2010/08/01) TransactionTag 対?
294    //                                      final Transaction tran ;
295                                            TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
296                                            if( tranTag == null ) {
297    //                                              tran = new TransactionReal( dbid,getApplicationInfo() );
298                                                    tran = new TransactionReal( getApplicationInfo() );             // 5.3.7.0 (2011/07/01) 引数変更
299                                            }
300                                            else {
301                                                    tran = tranTag.getTransaction();
302                                            }
303                                            query.setTransaction( dbid,tran );      // 5.1.9.0 (2010/08/01) TransactionTag 対?
304    
305    //                                      query.setConnectionID( dbid );
306                                            query.setResourceManager( getResource() );      // 4.0.0 (2005/01/31)
307    
308                                            query.setStatement( value );
309    //                                      query.setApplicationInfo( getApplicationInfo() );       // 3.8.7.0 (2006/12/15)
310                                            query.execute();
311    
312                                            table = query.getDBTableModel();
313                                    }
314                                    finally {
315    //                                      if( query != null ) { query.close(); }
316                                            QueryFactory.close( query );
317                                            if( tran != null ) { tran.close(); }            // 5.3.8.0 (2011/08/01) Transaction発生?でclose()
318                                    }
319                            }
320                    }
321    
322                    return ( SKIP_BODY );
323            }
324    
325            /**
326             * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
327             *
328             * @og.rev 3.1.0.1 (2003/03/26) DBTableModelの値をSET/GETできる command , action を追??
329             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
330             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
331             * @og.rev 3.1.5.0 (2003/04/22) DBTableModel が存在するとき?み実行するロジ?になって?バグ対応?
332             * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得?の tblScope を追??
333             * @og.rev 5.1.7.0 (2010/06/01) SQLGET対?
334             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
335             *
336             * @return      後続????
337             */
338            @Override
339            public int doEndTag() {
340                    debugPrint();           // 4.0.0 (2005/02/28)
341                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属?対?
342                    if( useTag() ) {
343                            if( check( command, COMMAND_LIST ) ) {
344                                    if( CMD_SETTBL.equals( command ) ||
345                                            CMD_GETTBL.equals( command ) ||
346                                            CMD_KEYTBL.equals( command ) ) {
347            //                                      table = (DBTableModel)getSessionAttribute( tableId );
348                                                    // 5.1.2.0 (2010/01/01) DBTableModel の取得?の tblScope を追??
349                                                    if( "session".equals( tblScope ) ) { table = (DBTableModel) getSessionAttribute( tableId ); }
350                                                    else if( "request".equals( tblScope ) ) { table = (DBTableModel) getRequestAttribute( tableId ); }
351                                                    else {
352                                                            String errMsg = "こ?スコープ?サポ?トされて?せん?" + tblScope + "]";
353                                                            throw new IllegalArgumentException( errMsg );
354                                                    }
355                                    }
356                            }
357    
358                            commandExec( command );
359    
360                            // 5.1.7.0 (2010/06/01) SQLGET対?
361                            if( CMD_GET.equals( command ) || CMD_GETTBL.equals( command ) || CMD_SQLGET.equals( command ) ) {
362                                    if( value != null ) { jspPrint( value ); }
363                            }
364                    }
365                    return(EVAL_PAGE);
366            }
367    
368            /**
369             * タグリブオブジェクトをリリースします?
370             * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
371             *
372             * @og.rev 2.0.0.4 (2002/09/27) カスタ?グの release() メソ?を?追?
373             * @og.rev 3.1.0.1 (2003/03/26) DBTableModelの値をSET/GETできる command , action を追??
374             * @og.rev 3.1.0.1 (2003/03/26) query 属?を削除します?
375             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応?release2() ?doEndTag()で呼ぶ?
376             * @og.rev 3.2.4.0 (2003/06/12) マルチデータ(?件検索)を使用するかしな??
377             * @og.rev 3.5.4.0 (2003/11/25) inValue 変数の追?
378             * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値を?"DEFAULT" から null に変更
379             * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得?の tblScope を追??
380             * @og.rev 5.1.7.0 (2010/06/01) XSS解除対?
381             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
382             * @og.rev 5.2.2.0 (2010/11/01) fromVal , toVal 属? 追?
383             * @og.rev 5.6.4.3 (2013/05/24) parameter 属?は、未使用なので削除
384             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追??action="ALL_xxx"?tmpSelectedAll="true" に置き換えます?
385             *
386             */
387            @Override
388            protected void release2() {
389                    super.release2();
390                    tableId         = HybsSystem.TBL_MDL_KEY;
391                    command         = CMD_SET;
392                    key                     = null;
393                    value           = null;
394                    defaultVal      = null;
395                    action          = null;
396    //              isNullSet       = true;                 // NULL のときにセ?し直すかど??
397                    table           = null;
398    //              dbid            = "DEFAULT";
399                    dbid            = null;
400                    scope           = "request";    // "request","session"
401                    tblScope        = "session";    // 5.1.2.0 (2010/01/01) DBTableModel の取得?のscope
402                    separator       = ",";
403    //              parameter       = null;                 // 5.6.4.3 (2013/05/24) 未使用なので削除
404                    useMultiRows = false;
405                    tmpSelectedAll  = false;                // 5.6.4.3 (2013/05/24)
406                    inValue         = null;                 // 3.5.4.0 (2003/11/25)
407                    xssCheck        = HybsSystem.sysBool( "USE_XSS_CHECK" );        // 5.1.7.0 (2010/06/01) XSS解除対?
408                    fromVal         = null;         // 5.2.2.0 (2010/11/01)
409                    toVal           = null;         // 5.2.2.0 (2010/11/01)
410            }
411    
412            /**
413             * コマンドを実行します?
414             *
415             * コマンド?,HTMLから(get/post)?されます?で,CMD_xxx で設定される
416             * フィールド定数値の?れかを??できます?
417             * コマンドを登録すると同時に,実行も行な?す?
418             *
419             * @og.rev 3.1.0.1 (2003/03/26) command に、SETTBL / GETTBL / KEYTBL / CLEAR を追??
420             * @og.rev 3.1.0.1 (2003/03/26) query 属?を削除します?
421             * @og.rev 3.1.7.0 (2003/05/02) scope 属?を設定するタイミングを?早くする?
422             * @og.rev 3.7.1.0 (2005/04/15) command に、SETMEM を追??
423             * @og.rev 5.1.7.0 (2010/06/01) SQLGET対?
424             *
425             * @param       command コマン?public static final 宣?れて???)
426             * @see         <a href="{&#064;docRoot}/constant-values.html#org.opengion.hayabusa.taglib.ValueTag.CMD_GET">コマンド定数</a>
427             */
428            private void commandExec( final String command ) {
429    
430                    if( CMD_SQL.equals( command ) ) {
431                            setSQLAttribute( table );
432                    }
433                    else if( CMD_SQLGET.equals( command ) ) {
434                            value = getSQLAttribute( table );
435                    }
436                    else if( CMD_SET.equals( command ) ) {
437                            value = nval( value, defaultVal );
438                            setAttribute( key,value,action );
439                    }
440                    else if( CMD_GET.equals( command ) ) {
441                            value = getAttribute( key,action );
442                    }
443                    else if( CMD_REMOVE.equals( command ) ) {
444                            removeAttribute( key );
445                    }
446                    else if( CMD_CLEAR.equals( command ) ) {
447                            clearAttribute( key );
448                    }
449                    else if( CMD_SETTBL.equals( command ) ) {
450                            setTableAttribute( table,key,action );
451                    }
452                    else if( CMD_GETTBL.equals( command ) ) {
453                            value = getTableAttribute( table,key,action );
454                    }
455                    else if( CMD_KEYTBL.equals( command ) ) {
456                            setKeyTableAttribute( table,key,value,action );
457                    }
458                    else if( CMD_SETMEM.equals( command ) ) {               // 3.7.1.0 (2005/04/15)
459                            value = nval( value, defaultVal );
460                            setAttribute( key,value,action );
461                            setRequestCacheData( key,(String)getObject( key ) );
462                    }
463            }
464    
465            /**
466             * アクションを実行します?
467             *
468             * コマンド? action 属?で?します?
469             * action コマン?が? null の場合?、なにも実行しません?
470             *
471             * @og.rev 3.0.1.3 (2003/03/11) MESSAGE action を追?
472             * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処?る様に変更する?
473             * @og.rev 3.7.1.0 (2005/04/15) action に、DAY_WEEK を追??
474             * @og.rev 3.7.1.1 (2005/05/23) action に、MERGE を追??
475             * @og.rev 4.0.0.0 (2007/10/18) メ?ージリソース統? getResource().getMessage > getResource().getLabel )
476             * @og.rev 5.2.2.0 (2010/11/01) ACT_MERGE 時には、カンマで?、separator で合?を行います?
477             * @og.rev 5.2.2.0 (2010/11/01) ACT_REPLACE 処?新規追?ます?
478             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します?
479             * @og.rev 5.6.6.1 (2013/07/12) value ?null の場合?、無視します?
480             *
481             * @param action        コマン?public static final 宣?れて???)
482             * @param value         旧の値
483             *
484             * @return      処??値
485             */
486            private String actionExec( final String action,final String value ) {
487                    String rtn = value;
488    
489                    // 5.6.6.1 (2013/07/12) value ?null の場合?、無視します?
490    //              if( action == null ) { return rtn; }
491                    if( action == null || value == null ) { return rtn; }
492    
493                    if( ACT_UPPER.equals( action ) ) {
494                            // Localeを?通管?るよ?なった?合?String.toUpperCase( Locale locale )使用の?
495                            rtn = value.toUpperCase(Locale.JAPAN);
496                    }
497                    else if( ACT_LOWER.equals( action ) ) {
498                            // Localeを?通管?るよ?なった?合?String.toLowerCase( Locale locale )使用の?
499                            rtn = value.toLowerCase(Locale.JAPAN);
500                    }
501                    else if( ACT_MESSAGE.equals( action ) ) {
502                            // 引数をメ?ージリソースのキーとして、メ?ージ変換する?
503    //                      rtn = getResource().getMessage( value );
504                            rtn = getResource().getLabel( value );
505                    }
506                    else if( ACT_DAY_WEEK.equals( action ) ) {
507                            // 日付型??(YYYYMMDD) の入力データを?開始日を月曜日にセ?します?
508                            // SUNDAY=1 , MONDAY=2 になります?月曜日との差?、前に戻します?
509                            // ?日が日曜日の場合?、次の日(月曜日)に進めます?
510                            Calendar ymd = HybsSystem.getCalendar( value );
511                            int shu = ymd.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ;
512    
513                            if( shu != 0 ) { ymd.add( Calendar.DATE, -shu ); }
514    
515    //                      DateFormat formatter = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
516    //                      rtn = formatter.format( ymd.getTime() );
517                            rtn = HybsDateUtil.getDate( ymd.getTimeInMillis() , "yyyyMMdd" );               // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
518                    }
519                    // 3.7.1.1 (2005/05/23)
520                    else if( ACT_MERGE.equals( action ) ) {
521                            // 引数をカンマで??配?に?します?
522                            String[] str = StringUtil.csv2Array( value );
523                            Set<String> set = new LinkedHashSet<String>();
524                            for( int i=0; i<str.length; i++ ) {
525                                    if( str[i] != null && str[i].length() > 0 ) {
526                                            set.add( str[i] );
527                                    }
528                            }
529    
530                            // ?後?マ?ジ(Setで)されます? 登録??、キープします?
531    //                      rtn = StringUtil.iterator2line( set.iterator(),"," );
532                            rtn = StringUtil.iterator2line( set.iterator(),separator );     // 5.2.2.0 (2010/11/01) separator 使用
533                    }
534                    // 5.2.2.0 (2010/11/01) ACT_REPLACE 処?新規追?
535                    else if( ACT_REPLACE.equals( action ) ) {
536                            // value.replaceAll( from, to ) と??で処?ます?
537                            if( value != null && fromVal != null && toVal != null ) {
538                                    rtn = value.replaceAll( fromVal, toVal );
539                            }
540                    }
541                    // 5.2.2.0 (2010/11/01) SUBSTR 処?新規追?
542                    else if( ACT_SUBSTR.equals( action ) ) {
543                            // value.substring( from, to ) と??で処?ます?
544                            if( value != null) {
545                                    int from = (fromVal==null||fromVal.length()==0) ? 0              : Integer.parseInt( fromVal );
546                                    int to   = (  toVal==null||  toVal.length()==0) ? value.length() : Integer.parseInt( toVal );
547    
548                                    rtn = value.substring( from, to );
549                            }
550                    }
551    
552                    return rtn;
553            }
554    
555            /**
556             * ??スコープ??キャ?ュ??を?キーで登録します?
557             *
558             * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処?る様に変更する?
559             * @og.rev 3.5.4.0 (2003/11/25) APPENDアクションを有効にします?
560             * @og.rev 3.5.6.5 (2004/08/09) APPEND時?セパレータを外部??変数を使用
561             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
562             * @og.rev 5.2.2.0 (2010/11/01) ACT_SPLIT 追?
563             * @og.rev 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追?
564             * @og.rev 5.6.6.1 (2013/07/12) value ?null の場合?、無視します?
565             *
566             * @param key           キー
567             * @param value         値
568             * @param action        アクション
569             */
570            private void setAttribute( final String key,final String value,final String action ) {
571                    if( key == null || key.length() == 0 ) {
572                            String errMsg = "key がセ?されて?せん?
573                                                    + " command=" + command + " , action=" + action
574                                                    + " , value=" + value ;                 // 5.1.8.0 (2010/07/01) errMsg 修正
575                            throw new HybsSystemException( errMsg );
576                    }
577    
578                    // 5.1.8.0 (2010/07/01) isNullSet 属? ?
579    //              if( isNullSet || ( !isNullSet && ( value != null && value.length() > 0 ) ) ) {
580                    // 5.6.6.1 (2013/07/12) value ?null の場合?、無視します?
581                    if( value != null ) {
582                            if( ACT_APPEND.equals( action ) ) {
583                                    String[] array = getRequestParameterValues( inValue );
584                                    setObject( key, StringUtil.array2line( array,separator ) );
585                            }
586                            // 5.2.2.0 (2010/11/01) ACT_SPLIT 追?
587                            else if( ACT_SPLIT.equals( action ) )  {
588                                    String[] array = value.split( separator );
589                                    setObject( key , array[0] );            // キー自体には、?割時?先?の??を設定しておく?
590                                    for( int i=0; i<array.length; i++ ) {
591                                            setObject( key + i , array[i] );
592                                    }
593                            }
594                            // 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追?
595                            else if( ACT_MAX_MIN.equals( action ) )  {
596                                    String[] array = value.split( separator );
597    
598                                    // command="SET" では、数字型としてのみ処?ます?
599                                    double minNum = Double.MAX_VALUE ;
600                                    double maxNum = Double.MIN_VALUE ;
601                                    double sumNum = 0d ;
602                                    int    cntSum = 0;              // 平?算に有効な件数
603    
604                                    for( int i=0; i<array.length; i++ ) {
605                                            String val = array[i].trim().replaceAll( ",","" );              // 数字型フォーマット?カンマを取り除?
606                                            if( val.isEmpty() ) { continue; }               // ゼロ??の場合?、取り直?
607    
608                                            double tmp = Double.parseDouble( val );
609                                            if( minNum > tmp ) { minNum = tmp; }
610                                            if( maxNum < tmp ) { maxNum = tmp; }
611                                            sumNum += tmp ;  cntSum++ ;
612                                    }
613    
614                                    // command="SET" の場合?、数字型の場合?み使用します?
615                                    if( cntSum > 0 ) {
616                                            NumberFormat nf = NumberFormat.getInstance();
617                                            nf.setGroupingUsed( false );                                    // カンマ編??
618                                            nf.setMaximumFractionDigits(2);                                 // ?小数部は??
619                                            nf.setMinimumFractionDigits(0);                                 // できれば、整数表示
620    
621                                            setObject( "MIN." + key,nf.format( minNum ) );          // Double.toString( minNum ) の代わり?
622                                            setObject( "MAX." + key,nf.format( maxNum ) );
623                                            setObject( "SUM." + key,nf.format( sumNum ) );
624                                            setObject( "AVG." + key,nf.format( sumNum/cntSum ) );
625                                    }
626                                    else {
627                                            setObject( "MIN." + key,nval( defaultVal , "" ) );
628                                            setObject( "MAX." + key,nval( defaultVal , "" ) );
629                                            setObject( "SUM." + key,nval( defaultVal , "" ) );
630                                            setObject( "AVG." + key,nval( defaultVal , "" ) );
631                                    }
632                            }
633                            else {
634                                    setObject( key, actionExec( action,value ) );
635                            }
636                    }
637                    else {
638                            setObject( key, null );                 // 5.6.6.1 (2013/07/12) value ?null の場?
639                    }
640            }
641    
642            /**
643             * ??スコープ??キャ?ュ??を?キーで取得します?
644             *
645             * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処?る様に変更する?
646             *
647             * @param key           キー
648             * @param action        アクション
649             *
650             * @return      キーに対する?キャ?ュ??
651             */
652            private String getAttribute( final String key,final String action ) {
653                    if( key == null || key.length() == 0 ) {
654                            String errMsg = "key がセ?されて?せん?
655                                                    + " command=" + command + " , action=" + action;        // 5.1.8.0 (2010/07/01) errMsg 修正
656                            throw new HybsSystemException( errMsg );
657                    }
658    
659                    String rtn = defaultVal;
660                    Object obj = pageContext.findAttribute( key );
661                    if( obj != null ) { rtn = obj.toString(); }
662    
663                    return actionExec( action,rtn );
664            }
665    
666            /**
667             * ??スコープ??キャ?ュ??を削除します?
668             *
669             * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処?る様に変更する?
670             *
671             * @param key           キー
672             */
673            private void removeAttribute( final String key ) {
674                    if( key == null || key.length() == 0 ) {
675                            String errMsg = "key がセ?されて?せん?
676                                                    + " command=" + command ;                       // 5.1.8.0 (2010/07/01) errMsg 修正
677                            throw new HybsSystemException( errMsg );
678                    }
679                    removeObject( key );
680            }
681    
682            /**
683             * セ?ョン/アプリケーションスコープ?キャ?ュ??をクリアします?
684             *
685             * こ?クリアは、キーの前方??で、大?小文字?区別をせずにクリアします?
686             * また?キー?null の場合??X_" で始めるもの以外?すべての値をクリアします?
687             * また????エンジン?で使用して?キーは、ここではクリアできません?
688             *
689             * @og.rev 3.1.0.1 (2003/03/26) クリアコマンド?追??
690             * @og.rev 4.3.4.0 (2008/12/01) PageContextのスコープをクラス変数としてアクセス
691             *
692             * @param key           キー
693             */
694            private void clearAttribute( final String key ) {
695    
696                    String lowKey = null;
697                    if( key != null ) { lowKey = key.toLowerCase(Locale.JAPAN); }
698    
699                    Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.APPLICATION_SCOPE );                // 4.3.3.6 (2008/11/15) Generics警告対?
700                    while ( ekeys.hasMoreElements() ) {
701    //                      String ekey = String.valueOf( ekeys.nextElement() ).toLowerCase(Locale.JAPAN);
702                            String ekey = ekeys.nextElement().toLowerCase(Locale.JAPAN);            // 4.3.3.6 (2008/11/15) Generics警告対?
703                            if( ( ! ekey.startsWith( "h_") && ! ekey.startsWith( "x_") ) &&
704                                    (  lowKey == null || ekey.startsWith( key ) ) ) {
705                                            pageContext.removeAttribute( ekey, PageContext.APPLICATION_SCOPE ) ;
706                            }
707                    }
708    
709                    ekeys = pageContext.getAttributeNamesInScope( PageContext.SESSION_SCOPE );
710                    while ( ekeys.hasMoreElements() ) {
711                            String ekey = String.valueOf( ekeys.nextElement() ).toLowerCase(Locale.JAPAN);
712                            if( ( ! ekey.startsWith( "h_") && ! ekey.startsWith( "x_") ) &&
713                                    (  lowKey == null || ekey.startsWith( key ) ) ) {
714                                            pageContext.removeAttribute( ekey, PageContext.SESSION_SCOPE ) ;
715                            }
716                    }
717            }
718    
719            /**
720             * ??スコープ??キャ?ュ??を???SQL?り作?します?
721             *
722             * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処?る様に変更する?
723             * @og.rev 3.2.4.0 (2003/06/12) マルチデータ(?件検索)を使用するかしな??
724             * @og.rev 3.8.6.0 (2006/08/07) nullSet="true"(初期値)の時?、検索結果がゼロ件時に "" をセ?する?
725             * @og.rev 3.8.9.2 (2007/07/28) action="ROW_APPEND" 追?
726             * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追?
727             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
728             * @og.rev 5.5.0.3 (2012/03/12) ACT_MAP アクションの追?
729             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追??action="ALL_xxx"?tmpSelectedAll="true" に置き換えます?
730             *
731             * @param table DBTableModelオブジェク?
732             */
733            private void setSQLAttribute( final DBTableModel table ) {
734                    if( table == null ) {           // 3.8.6.0 (2006/08/07)
735                            return;
736                    }
737    
738                    int clmCnt = table.getColumnCount();
739                    int rowCnt = table.getRowCount();
740                    String sqlkey ;
741                    String sqlval ;
742                    String sufix = "";
743    
744                    if( ACT_ROW_APPEND.equals( action ) ) {
745                            for( int clm = 0; clm < clmCnt; clm++ ) {
746                                    StringBuilder buf = new StringBuilder();
747                                    for( int row=0; row<rowCnt; row++ ) {
748                                            sqlval = table.getValue( row, clm );
749                                            if( row > 0 ) { buf.append( separator ); }
750                                            buf.append( sqlval );
751                                    }
752                                    sqlkey = table.getColumnName( clm );
753                                    setObject( sqlkey , buf.toString() );
754                            }
755                    }
756                    // 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追?
757    //              else if( ACT_ALL_LIST.equals( action ) || ACT_LIST.equals( action ) ) {
758                    else if( ACT_LIST.equals( action ) ) {
759                            for( int clm = 0; clm < clmCnt; clm++ ) {
760                                    ArrayList<String> list = new ArrayList<String>();
761                                    for( int row=0; row<rowCnt; row++ ) {
762                                            sqlval = table.getValue( row, clm );
763                                            list.add( sqlval );
764                                    }
765                                    sqlkey = table.getColumnName( clm );
766                                    setObject( sqlkey , list );
767                            }
768                    }
769                    // 5.5.0.3 (2012/03/12) ACT_MAP アクションの追?
770    //              else if( ACT_ALL_MAP.equals( action ) || ACT_MAP.equals( action )  ) {
771                    else if( ACT_MAP.equals( action )  ) {
772                            if( clmCnt < 2 ) {
773                                    String errMsg = "action=MAP 時には、カラ???つ以上?です?カラ?=[" + clmCnt + "]";
774                                    throw new IllegalArgumentException( errMsg );
775                            }
776                            for( int row=0; row<rowCnt; row++ ) {
777                                    sqlkey = table.getValue( row, 0 );                      // 0番目カラ?キー
778                                    sqlval = table.getValue( row, 1 );                      // 1番目カラ?値
779                                    setObject( sqlkey , sqlval );
780                            }
781                    }
782                    else {
783                            // 5.1.8.0 (2010/07/01) isNullSet 属? ?
784    //                      if( isNullSet && rowCnt == 0 ) {
785                            if( rowCnt == 0 ) {
786                                    if( useMultiRows ) { sufix = "0" ; }
787                                    for( int clm = 0; clm < clmCnt; clm++ ) {
788                                            sqlkey = table.getColumnName( clm );
789                                            sqlval = "";
790                                            setObject( sqlkey + sufix, sqlval );
791                                    }
792                            }
793                            else {
794                                    for( int row=0; row<rowCnt; row++ ) {
795                                            if( useMultiRows ) { sufix = String.valueOf( row ) ; }
796                                            for( int clm = 0; clm < clmCnt; clm++ ) {
797                                                    sqlkey = table.getColumnName( clm );
798                                                    sqlval = table.getValue( row, clm );
799                                                    setObject( sqlkey + sufix, sqlval );
800                                            }
801                                            if( ! useMultiRows ) { break; }
802                                    }
803                            }
804                    }
805            }
806    
807            /**
808             * ??SQL??結果を文字?として画面に出力します?
809             * 画面に出力される?は???で2?以降?無視されます?
810             *
811             * @og.rev 5.1.7.0 (2010/06/01) SQLGET対?
812             *
813             * @param table DBTableModelオブジェク?
814             *
815             * @return SQL??結果??
816             */
817            private String getSQLAttribute( final DBTableModel table ) {
818                    if( table == null ) {           // 3.8.6.0 (2006/08/07)
819                            return "";
820                    }
821    
822                    int rowCnt = table.getRowCount();
823                    final String rtn;
824                    if( ACT_ROW_APPEND.equals( action ) ) {
825                            StringBuilder buf = new StringBuilder();
826                            for( int row=0; row<rowCnt; row++ ) {
827                                    if( row > 0 ) { buf.append( separator ); }
828                                    buf.append( table.getValue( row, 0 ) );
829                            }
830                            rtn = buf.toString();
831                    }
832                    else if ( rowCnt == 0 ) {
833                            rtn = "";
834                    }
835                    else {
836                            rtn = table.getValue( 0, 0 );
837                    }
838    
839                    return rtn;
840            }
841    
842            /**
843             * ??スコープ??キャ?ュ??に、DBTableModel の選択された値を登録します?
844             *
845             * ?選択行が存在する場合?、?頭行を処?ます?ただし?action="APPEND"の
846             * 場合?、separator属?で?された?を使用して??結します?
847             *
848             * @og.rev 3.1.0.1 (2003/03/26) 新規作?
849             * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時?処?更
850             * @og.rev 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追?
851             * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追?
852             * @og.rev 5.1.6.0 (2010/05/01) ALL_APPENDで選択行がな??合に処?れな?グを修正
853             * @og.rev 5.5.0.3 (2012/03/12) ACT_MAP アクションの追?
854             * @og.rev 5.6.4.3 (2013/05/24) ACT_MAX_MIN,ACT_ALL_MAX_MIN アクションの追?
855             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追??action="ALL_xxx"?tmpSelectedAll="true" に置き換えます?
856             *
857             * @param table         DBTableModelオブジェク?
858             * @param key           キー
859             * @param action        アクション
860             */
861            private void setTableAttribute( final DBTableModel table,final String key,final String action ) {
862                    if( table == null || table.getRowCount() == 0 || table.getColumnCount() == 0 ) { return ; }
863    
864                    int[] rowNo = getParameterRows();
865                    // 5.1.6.0 (2010/05/01)
866    //              if( rowNo.length == 0 ) { return ; }
867    //              if( rowNo.length == 0 && !ACT_ALL_APPEND.equals( action ) ) { return; }
868                    if( rowNo.length == 0 ) { return; }                             // 5.6.4.3 (2013/05/24) tmpSelectedAll 属?を追?た?で?件判定が使える?
869    
870                    final String[] keys ;
871                    if( key == null || key.length() == 0 ) {
872                            keys = table.getNames();
873                    }
874                    else {
875                            keys = new String[] { key } ;
876                    }
877    
878                    // 5.6.4.3 (2013/05/24) tmpSelectedAll で、ロジ?の共通化
879                    if( ACT_APPEND.equals( action ) ) {
880                            for( int i=0; i<keys.length; i++ ) {
881                                    int clm = table.getColumnNo( keys[i] );
882                                    StringBuilder val = new StringBuilder();
883                                    val.append( table.getValue( rowNo[0],clm ) );
884                                    for( int j=1; j<rowNo.length; j++ ) {
885                                            val.append( separator );
886                                            val.append( table.getValue( rowNo[j],clm ) );
887                                    }
888                                    setObject( keys[i],val.toString() );
889                            }
890                    }
891    //              // 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追?
892    //              else if( ACT_ALL_APPEND.equals( action ) ) {
893    //                      int size = table.getRowCount();
894    //                      for( int i=0; i<keys.length; i++ ) {
895    //                              int clm = table.getColumnNo( keys[i] );
896    //                              StringBuilder val = new StringBuilder();
897    //                              val.append( table.getValue( 0,clm ) );
898    //                              for( int row=1; row<size; row++ ) {                                  // コピ?注意?separator の append の関係で、row=1 から開?
899    //                                      val.append( separator );
900    //                                      val.append( table.getValue( row,clm ) );
901    //                              }
902    //                              setObject( keys[i],val.toString() );
903    //                      }
904    //              }
905                    // 5.5.0.3 (2012/03/12) ACT_MAP アクションの追?
906                    else if( ACT_MAP.equals( action ) ) {
907                            int keyClm = table.getColumnNo( key   ,false );
908                            int valClm = table.getColumnNo( value ,false );
909    
910                            if( keyClm < 0 ) { keyClm = 0; }     // キーとなるカラ??されて???合?、最初?カラ?
911                            if( valClm < 0 ) { valClm = 1; }     // 値となるカラ??されて???合??番目のカラ?
912    
913                            for( int j=0; j<rowNo.length; j++ ) {
914                                    String mapkey = table.getValue( rowNo[j], keyClm );
915                                    String mapval = table.getValue( rowNo[j], valClm );
916                                    setObject( mapkey , mapval );
917                            }
918                    }
919    //              // 5.5.0.3 (2012/03/12) ACT_ALL_MAP アクションの追?
920    //              else if( ACT_ALL_MAP.equals( action ) ) {
921    //                      int keyClm = table.getColumnNo( key   ,false );
922    //                      int valClm = table.getColumnNo( value ,false );
923    //
924    //                      if( keyClm < 0 ) { keyClm = 0; }     // キーとなるカラ??されて???合?、最初?カラ?
925    //                      if( valClm < 0 ) { valClm = 1; }     // 値となるカラ??されて???合??番目のカラ?
926    //
927    //                      int size = table.getRowCount();
928    ////                    for( int row=1; row<size; row++ ) {
929    //                      for( int row=0; row<size; row++ ) {                                                          // 5.6.4.3 (2013/05/24) なぜか、row=1 から始まって??
930    //                              String mapkey = table.getValue( row, keyClm );
931    //                              String mapval = table.getValue( row, valClm );
932    //                              setObject( mapkey , mapval );
933    //                      }
934    //              }
935                    // 4.3.7.5 (2009/07/13) ACT_LIST アクションの追?
936                    else if( ACT_LIST.equals( action ) ) {
937                            for( int i=0; i<keys.length; i++ ) {
938                                    int clm = table.getColumnNo( keys[i] );
939                                    ArrayList<String> list = new ArrayList<String>();
940                                    for( int j=0; j<rowNo.length; j++ ) {
941                                            list.add( table.getValue( rowNo[j],clm ) );
942                                    }
943                                    setObject( keys[i],list );
944                            }
945                    }
946    //              // 4.3.7.5 (2009/07/13) ACT_ALL_LIST アクションの追?
947    //              else if( ACT_ALL_LIST.equals( action ) ) {
948    //                      int size = table.getRowCount();
949    //                      for( int i=0; i<keys.length; i++ ) {
950    //                              int clm = table.getColumnNo( keys[i] );
951    //                              ArrayList<String> list = new ArrayList<String>();
952    //                              for( int row=0; row<size; row++ ) {
953    //                                      list.add( table.getValue( row,clm ) );
954    //                              }
955    //                              setObject( keys[i],list );
956    //                      }
957    //              }
958                    // 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追?
959                    else if( ACT_MAX_MIN.equals( action ) ) {
960                            NumberFormat nf = null;
961                            for( int i=0; i<keys.length; i++ ) {
962                                    int clm = table.getColumnNo( keys[i] );
963                                    DBColumn clmObj = table.getDBColumn( clm );
964                                    String clsNm = clmObj.getClassName();                   // NUMBER,INTEGER,DECIMAL が数字型?
965    
966                                    boolean numFlag = "NUMBER,INTEGER,DECIMAL".indexOf( clsNm ) >= 0 ;           // 数字型:true
967    
968                                    String minVal = null ;
969                                    String maxVal = null ;
970                                    double minNum = Double.MAX_VALUE ;
971                                    double maxNum = Double.MIN_VALUE ;
972                                    double sumNum = 0d ;
973                                    int    cntSum = 0;              // 平?算に有効な件数
974    
975                                    for( int j=0; j<rowNo.length; j++ ) {
976                                            String val = table.getValue( rowNo[j],clm );
977                                            if( val != null && val.length() > 0 ) {
978                                                    // 数字として比?
979                                                    if( numFlag ) {
980                                                            double tmp = Double.parseDouble( val );
981                                                            if( minNum > tmp ) { minNum = tmp; minVal = val; }
982                                                            if( maxNum < tmp ) { maxNum = tmp; maxVal = val; }
983                                                            sumNum += tmp ;  cntSum++ ;
984                                                    }
985                                                    else {
986                                                            // ??として比?
987                                                            if( minVal == null || minVal.compareTo( val ) > 0 ) { minVal = val; }        // ??の??タは、?セ?する?
988                                                            if( maxVal == null || maxVal.compareTo( val ) < 0 ) { maxVal = val; }        // ??の??タは、?セ?する?
989                                                    }
990                                            }
991                                    }
992                                    if( minVal == null ) { minVal = nval( defaultVal , "" ); }              // ?まで値が決まらなければ?"(空??) にする?
993                                    if( maxVal == null ) { maxVal = nval( defaultVal , "" ); }              // ?まで値が決まらなければ?"(空??) にする?
994                                    setObject( "MIN." + keys[i],minVal );
995                                    setObject( "MAX." + keys[i],maxVal );
996    
997                                    // SUM と AVG は、数字型の場合?みセ?します?
998                                    if( cntSum > 0 ) {
999                                            if( nf == null ) {
1000                                                    nf = NumberFormat.getInstance();
1001                                                    nf.setGroupingUsed( false );                                    // カンマ編??
1002                                                    nf.setMaximumFractionDigits(2);                                 // ?小数部は??
1003                                                    nf.setMinimumFractionDigits(0);                                 // できれば、整数表示
1004                                            }
1005                                            setObject( "SUM." + keys[i],nf.format( sumNum ) );              // Double.toString( sumNum ) の代わり?
1006                                            setObject( "AVG." + keys[i],nf.format( sumNum/cntSum ) );
1007                                    }
1008                                    else {
1009                                            setObject( "SUM." + keys[i],nval( defaultVal , "" ) );
1010                                            setObject( "AVG." + keys[i],nval( defaultVal , "" ) );
1011                                    }
1012                            }
1013                    }
1014    //              // 5.6.4.3 (2013/05/24) ACT_ALL_MAX_MIN アクションの追?
1015    //              else if( ACT_ALL_MAX_MIN.equals( action ) ) {
1016    //                      int size = table.getRowCount();
1017    //                      for( int i=0; i<keys.length; i++ ) {
1018    //                              int clm = table.getColumnNo( keys[i] );
1019    //                              DBColumn clmObj = table.getDBColumn( clm );
1020    //                              String clsNm = clmObj.getClassName();                   // NUMBER,INTEGER,DECIMAL が数字型?
1021    //
1022    //                              boolean numFlag = "NUMBER,INTEGER,DECIMAL".indexOf( clsNm ) >= 0 ;           // 数字型:true
1023    //
1024    //                              String minVal = null ;
1025    //                              String maxVal = null ;
1026    //                              double minNum = Double.MAX_VALUE ;
1027    //                              double maxNum = Double.MIN_VALUE ;
1028    //                              double sumNum = 0d ;
1029    //                              int    cntSum = 0;              // 平?算に有効な件数
1030    //
1031    //                              for( int row=0; row<size; row++ ) {
1032    //                                      String val = table.getValue( row,clm );
1033    //                                      if( val != null && val.length() > 0 ) {
1034    //                                              // 数字として比?
1035    //                                              if( numFlag ) {
1036    //                                                      double tmp = Double.parseDouble( val );
1037    //                                                      if( minNum > tmp ) { minNum = tmp; minVal = val; }
1038    //                                                      if( maxNum < tmp ) { maxNum = tmp; maxVal = val; }
1039    //                                                      sumNum += tmp ;  cntSum++ ;
1040    //                                              }
1041    //                                              else {
1042    //                                                      // ??として比?
1043    //                                                      if( minVal == null || minVal.compareTo( val ) > 0 ) { minVal = val; }        // ??の??タは、?セ?する?
1044    //                                                      if( maxVal == null || maxVal.compareTo( val ) < 0 ) { maxVal = val; }        // ??の??タは、?セ?する?
1045    //                                              }
1046    //                                      }
1047    //                              }
1048    //                              if( minVal == null ) { minVal = nval( defaultVal , "" ); }              // ?まで値が決まらなければ?"(空??) にする?
1049    //                              if( maxVal == null ) { maxVal = nval( defaultVal , "" ); }              // ?まで値が決まらなければ?"(空??) にする?
1050    //                              setObject( "MIN." + keys[i],minVal );
1051    //                              setObject( "MAX." + keys[i],maxVal );
1052    //
1053    //                              // SUM と AVG は、数字型の場合?みセ?します?
1054    //                              if( cntSum > 0 ) {
1055    //                                      NumberFormat nf = NumberFormat.getInstance();
1056    //                                      nf.setGroupingUsed( false );                                    // カンマ編??
1057    //                                      nf.setMaximumFractionDigits(2);                                 // ?小数部は??
1058    //                                      nf.setMinimumFractionDigits(0);                                 // できれば、整数表示
1059    //
1060    //                                      setObject( "SUM." + keys[i],nf.format( sumNum ) );              // Double.toString( sumNum ) の代わり?
1061    //                                      setObject( "AVG." + keys[i],nf.format( sumNum/cntSum ) );
1062    //                              }
1063    //                              else {
1064    //                                      setObject( "SUM." + keys[i],nval( defaultVal , "" ) );
1065    //                                      setObject( "AVG." + keys[i],nval( defaultVal , "" ) );
1066    //                              }
1067    //                      }
1068    //              }
1069                    else {
1070                            for( int i=0; i<keys.length; i++ ) {
1071                                    int clm = table.getColumnNo( keys[i] );
1072                                    setAttribute( keys[i],table.getValue( rowNo[0],clm ),action );
1073                            }
1074                    }
1075            }
1076    
1077            /**
1078             * DBTableModel の選択された値を取得します?
1079             *
1080             * ?選択行が存在する場合?、?頭行を処?ます?ただし?action="APPEND"の
1081             * 場合?、separator属?で?された?を使用して??結します?
1082             *
1083             * @og.rev 3.1.0.1 (2003/03/26) 新規作?
1084             * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時?処?更
1085             * @og.rev 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追?
1086             * @og.rev 5.1.6.0 (2010/05/01) ALL_APPENDで選択行がな??合に処?れな?グを修正
1087             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追??action="ALL_xxx"?tmpSelectedAll="true" に置き換えます?
1088             *
1089             * @param       table   DBTableModelオブジェク?
1090             * @param       key             キー
1091             * @param       action  アクション
1092             *
1093             * @return      DBTableModelの選択された値
1094             */
1095            private String getTableAttribute( final DBTableModel table,final String key,final String action ) {
1096                    if( table == null ) {
1097                            String errMsg = "table がセ?されて?せん?
1098                                                    + " command=" + command + " , action=" + action
1099                                                    + " , key=" + key ;                     // 5.1.8.0 (2010/07/01) errMsg 修正
1100                            throw new HybsSystemException( errMsg );
1101                    }
1102    
1103                    if( key == null || key.length() == 0 ) {
1104                            String errMsg = "key がセ?されて?せん?
1105                                                    + " command=" + command + " , action=" + action;                        // 5.1.8.0 (2010/07/01) errMsg 修正
1106                            throw new HybsSystemException( errMsg );
1107                    }
1108    
1109                    int[] rowNo = getParameterRows();
1110                    // 5.1.6.0 (2010/05/01)
1111    //              if( rowNo.length == 0 ) { return "" ; }
1112    //              if( rowNo.length == 0 && !ACT_ALL_APPEND.equals( action ) ) { return "" ; }
1113                    if( rowNo.length == 0 ) { return "" ; }                         // 5.6.4.3 (2013/05/24) tmpSelectedAll 属?を追?た?で?件判定が使える?
1114    
1115                    // 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追?
1116                    int clm = table.getColumnNo( key );
1117                    if( ACT_APPEND.equals( action ) ) {
1118                            StringBuilder val = new StringBuilder();
1119                            val.append( table.getValue( rowNo[0],clm ) );
1120                            for( int j=1; j<rowNo.length; j++ ) {
1121                                    val.append( separator );
1122                                    val.append( table.getValue( rowNo[j],clm ) );
1123                            }
1124                            return val.toString() ;
1125                    }
1126    //              else if( ACT_ALL_APPEND.equals( action ) ) {
1127    //                      StringBuilder val = new StringBuilder();
1128    //                      val.append( table.getValue( 0,clm ) );
1129    //                      int size = table.getRowCount();
1130    //                      for( int row=1; row<size; row++ ) {
1131    //                              val.append( separator );
1132    //                              val.append( table.getValue( row,clm ) );
1133    //                      }
1134    //                      return val.toString() ;
1135    //              }
1136                    else {
1137                            return actionExec( action,table.getValue( rowNo[0],clm ) );
1138                    }
1139            }
1140    
1141            /**
1142             * ??スコープ??キャ?ュ??に、DBTableModel の選択された値を登録します?
1143             *
1144             * これは、key で?したカラ??値をキーとして、value で?したカラ??値?
1145             * value 値として設定します?
1146             * setTableAttribute が?カラ?横持ち)??タを??る?に対して?
1147             * ロウ(縦持ち)??タを??ることが?来ます?
1148             *
1149             * @og.rev 3.1.0.1 (2003/03/26) 新規作?
1150             * @og.rev 3.3.3.3 (2003/08/06) key ??がデータの値になって?。バグ修正?
1151             * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時?処?更
1152             *
1153             * @param table         DBTableModelオブジェク?
1154             * @param key           キー
1155             * @param value         値
1156             * @param action        アクション
1157             */
1158            private void setKeyTableAttribute( final DBTableModel table,final String key,final String value,final String action ) {
1159                    if( table == null ) { return ; }
1160    
1161                    if( key == null || key.length() == 0 ) {
1162                            String errMsg = "key がセ?されて?せん?
1163                                                    + " command=" + command + " , action=" + action
1164                                                    + " , value=" + value ;                 // 5.1.8.0 (2010/07/01) errMsg 修正
1165                            throw new HybsSystemException( errMsg );
1166                    }
1167    
1168                    int[] rowNo = getParameterRows();
1169                    if( rowNo.length == 0 ) { return ; }
1170    
1171                    final int[] valClm ;
1172                    if( value == null || value.length() == 0 ) {
1173                            String[] vals = table.getNames();
1174                            valClm = new int[vals.length];
1175                            for( int i=0; i<vals.length; i++ ) {
1176                                    valClm[i] = table.getColumnNo( vals[i] );
1177                            }
1178                    }
1179                    else {
1180                            valClm = new int[] { table.getColumnNo( value ) } ;
1181                    }
1182    
1183            // 3.3.3.3 (2003/08/06) key ??がデータの値になって?。バグ修正?
1184            //      3.5.6.5 (2004/08/09) ロジ?変更
1185                    for( int j=0; j<rowNo.length; j++ ) {
1186                            String rowKey = key + j ;
1187                            if( ACT_APPEND.equals( action ) ) {
1188                                    StringBuilder val = new StringBuilder();
1189                                    val.append( table.getValue( rowNo[j],valClm[0] ) );
1190                                    for( int i=1; i<valClm.length; i++ ) {
1191                                            val.append( separator );
1192                                            val.append( table.getValue( rowNo[j],valClm[i] ) );
1193                                    }
1194                                    setObject( rowKey,val.toString() );
1195                            }
1196                            else {
1197                                    setAttribute( rowKey,table.getValue( rowNo[j],valClm[0] ),action );
1198                            }
1199                    }
1200            }
1201    
1202            /**
1203             * 表示??タの HybsSystem.ROW_SEL_KEY を?に?ばれた 行を処??対象とします?
1204             *
1205             * action="FIRST" 処?、tmpSelectedAll 属?追?伴???、Override します?
1206             *
1207             * @og.rev 3.1.0.1 (2003/03/26) 新規作?
1208             * @og.rev 4.0.0.0 (2005/01/31) メイン処?、super class で対?
1209             * @og.rev 3.8.0.4 (2005/08/08) action="FIRST" 機?の追?
1210             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?の追?伴??全件選択状態???タを作?します?
1211             *
1212             * @return      選択行?配?
1213             */
1214            @Override
1215            protected int[] getParameterRows() {
1216                    final int[] rowNo ;
1217                    // 3.8.0.4 (2005/08/08) action="FIRST" 機?の追?
1218                    if( ACT_FIRST.equals( action ) ) {
1219    //                      return new int[] { 0 };
1220                            rowNo = new int[] { 0 };
1221                    }
1222                    // 5.6.4.3 (2013/05/24) tmpSelectedAll 属?の追?
1223                    else if( tmpSelectedAll ) {
1224                            int rowCnt = table.getRowCount();
1225                            rowNo = new int[ rowCnt ];
1226                            for( int i=0; i<rowCnt; i++ ) {
1227                                    rowNo[i] = i;
1228                            }
1229                    }
1230                    else {
1231    //                      return super.getParameterRows() ;
1232                            rowNo = super.getParameterRows() ;
1233                    }
1234                    return rowNo ;
1235            }
1236    
1237            /**
1238             * 【TAG】sessionから取得す?DBTableModelオブジェクト? ID?
1239             *
1240             * @og.tag
1241             * 初期値は、HybsSystem.TBL_MDL_KEY です?
1242             *
1243             * @og.rev 3.1.0.1 (2003/03/26) DBTableModelの値をSET/GETできる command , action を追??
1244             *
1245             * @param       id sessionに登録する時? ID
1246             */
1247            public void setTableId( final String id ) {
1248                    tableId   = nval( getRequestParameter( id ),tableId );
1249            }
1250    
1251            /**
1252             * 【TAG】コマン?SET,GET,REMOVE,SQL,SETTBL,GETTBL,KEYTBL,CLEAR,SETMEM)をセ?しま?初期値:SET)?
1253             *
1254             * @og.tag
1255             * コマンド?,HTMLから(get/post)?されます?で,CMD_xxx で設定される
1256             * フィールド定数値の?れかを??できます?
1257             * 何も設定されな??また?、null の場合??SET" が?期?にセ?されます?
1258             *
1259             * CLEAR 以外?すべての処??、指定?スコープ??キャ?ュ??に対して行われます?
1260             * <table border="1" frame="box" rules="all" >
1261             * <th><td>command  </td><td>名称                       </td><td>機?</td></th>
1262             * <tr><td>SET              </td><td>セ?              </td><td>??キーに、value値を登録します?</td></tr>
1263             * <tr><td>GET              </td><td>ゲ?              </td><td>??キーの値を画面に出力します?</td></tr>
1264             * <tr><td>REMOVE   </td><td>リ???            </td><td>??キーの値を削除します?</td></tr>
1265             * <tr><td>CLEAR    </td><td>クリア             </td><td>セ?ョン/アプリケーションスコープ?キャ?ュ??をクリアします?</td></tr>
1266             * <tr><td>SQL              </td><td>???             </td><td>??SQL??実行結果を?カラ?をキーとして設定します?</td></tr>
1267             * <tr><td>SQLGET   </td><td>???ゲ?        </td><td>??SQL??実行結果を?画面に出力します?(2?以降?無視されま??/td></tr>
1268             * <tr><td>SETTBL   </td><td>セ???ブル </td><td>??キーに、DBTableModel の選択されたカラ?横持ち)の値を登録します?</td></tr>
1269             * <tr><td>GETTBL   </td><td>ゲ???ブル </td><td>??キーに、DBTableModel の選択されたカラ?横持ち)の値を画面に出力します?</td></tr>
1270             * <tr><td>KEYTBL   </td><td>キー??ブル         </td><td>??キーに、DBTableModel の選択されたロウ(縦持ち)の値を登録します?</td></tr>
1271             * <tr><td>SETMEM   </td><td>セ?メモリ        </td><td>??キーに、value値を?部キャ?ュに登録します?</td></tr>
1272             * </table>
1273             *
1274             * @og.rev 3.1.0.1 (2003/03/26) ??コマンド以外?、エラーとするように変更?
1275             * @og.rev 3.5.6.2 (2004/07/05) ??の連結にStringBuilderを使用します?
1276             *
1277             * @param       cmd コマン?public static final 宣?れて???)
1278             * @see         <a href="{&#064;docRoot}/constant-values.html#org.opengion.hayabusa.taglib.ValueTag.CMD_GET">コマンド定数</a>
1279             */
1280            public void setCommand( final String cmd ) {
1281                    command = nval( getRequestParameter( cmd ),command ).toUpperCase(Locale.JAPAN);
1282    
1283                    if( !check( command, COMMAND_LIST ) ) {
1284                            StringBuilder errMsg = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1285                            errMsg.append( "??コマンド?実行できません。コマンドエラー" );
1286                            errMsg.append( HybsSystem.CR );
1287                            errMsg.append( "command=[" ).append( command ).append( "] " );
1288                            errMsg.append( HybsSystem.CR );
1289                            for( int i=0; i<COMMAND_LIST.length; i++ ) {
1290                                    errMsg.append( " | " );
1291                                    errMsg.append( COMMAND_LIST[i] );
1292                            }
1293                            errMsg.append( " | " );
1294                            throw new HybsSystemException( errMsg.toString() );
1295                    }
1296            }
1297    
1298            /**
1299             * 【TAG】アクション(UPPER,LOWER,MESSAGE,APPEND,ALL_APPEND,MAP,ALL_MAP,LIST,ALL_LIST,DAY_WEEK,MERGE,FIRST,ROW_APPEND,REPLACE,SUBSTR,SPLIT,MAX_MIN,ALL_MAX_MIN)をセ?します?
1300             *
1301             * @og.tag
1302             * アクションは,HTMLから(get/post)?されます?で,ACT_xxx で設定される
1303             * フィールド定数値の?れかを??できます?
1304             * 無??場合?、なにもしません?
1305             *
1306             * <table border="1" frame="box" rules="all" >
1307             * <tr><th>action           </th><th>名称                               </th><th>機?</th></tr>
1308             * <tr><td>UPPER            </td><td>ア?ー(大?化)   </td><td>value値を大?に変換します?</td></tr>
1309             * <tr><td>LOWER            </td><td>ローワー(小文字化) </td><td>value値を小文字に変換します?</td></tr>
1310             * <tr><td>MESSAGE          </td><td>メ?ージ変換       </td><td>引数をメ?ージリソースのキーとして、メ?ージ変換します?</td></tr>
1311             * <tr><td>APPEND           </td><td>??タアペン?       </td><td>?リクエストや?選択時に値を?結します?</td></tr>
1312             * <tr><td>ALL_APPEND       </td><td>オールアペン?</td><td>SETTBL,GETTBL 時に、チェ?行以外?全行を対象に値の連結を行います?</td></tr>
1313             * <tr><td>MAP                      </td><td>マッ?                      </td><td>検索結果やTableModelのkeyをキーに、value?を値に?設定します?</td></tr>
1314             * <tr><td>ALL_MAP          </td><td>オールマッ?        </td><td>全行を対象に検索結果やTableModelのkeyをキーに、value?を値に?設定します?</td></tr>
1315             * <tr><td>LIST                     </td><td>リス?                     </td><td>?リクエストや?選択時に値をArrayListにセ?します?</td></tr>
1316             * <tr><td>ALL_LIST         </td><td>オールリス?       </td><td>全行を対象に値をArrayListにセ?します?</td></tr>
1317             * <tr><td>DAY_WEEK         </td><td>日付前方まるめ       </td><td>日付型??(YYYYMMDD) の値を?月曜日に変換します?</td></tr>
1318             * <tr><td>                         </td><td>                                   </td><td>?日が日曜日の場合?、次の日(月曜日)に進めます?そ?他???始めに戻します?</td></tr>
1319             * <tr><td>MERGE            </td><td>??タのマ?ジ               </td><td>重?除く?ユニ?クな値に、?ージします?(カンマで?、separatorで合?)</td></tr>
1320             * <tr><td>FIRST            </td><td>?件目取?         </td><td>??の?件目を強制?選択状態にして、??行います?</td></tr>
1321             * <tr><td>ROW_APPEND       </td><td>検索結果の連?      </td><td>検索結果の行方向???タを?結します?</td></tr>
1322             * <tr><td>REPLACE          </td><td>??置?          </td><td>value の値から、指定された正規表現(from)の部?字?を?部?字?(to)で置換します?</td></tr>
1323             * <tr><td>SUBSTR           </td><td>部?字?                   </td><td>value の値から、指定された(from)から(to)の部?字?を作?します?</td></tr>
1324             * <tr><td>SPLIT            </td><td>???                   </td><td>value の値から、指定されたseparatorで?した??を作?します?(key+0??番)</td></tr>
1325             * <tr><td>MAX_MIN          </td><td>?_??         </td><td>選択行?keyのカラ????,?値を?MIN.キー、MAX.キー の値にセ?します?※??/td></tr>
1326             * <tr><td>ALL_MAX_MIN      </td><td>?_??         </td><td>全行を対象にkeyのカラ????,?値を?MIN.キー、MAX.キー の値にセ?します?※??/td></tr>
1327             * </table>
1328             *
1329             * ※??MAX_MIN,ALL_MAX_MIN  につ?は、DBTableModelのカラ??CLS_NAMEが?NUMBER,INTEGER,DECIMAL の場合?、数字型(double)に変換して比?ます?
1330             *    数字型(double)の場合だけ?合?SUM.キー) と 平?AVG.キー)計算も同時に行います?
1331             *    それ以外?場合?、文字?比?行います???ommand="SETTBL" のみ??
1332             *    command="SET" の場合?、数字型(double)として、value の値を?separator で?した?で、最大、最小?合計?平?を計算し?
1333             *    それぞれを?MIN.キー、MAX.キー、SUM.キー、AVG.キー 変数にセ?します?
1334             *    数字に変換できなかった?合?、エラーになります?
1335             *    null は、無視さ?平?求める?合?母数としても無?、すべて?nulll の場合?、ゼロ??("")になります?
1336             *    ゼロ??("") の場合に、defaultVal 属?が設定されて?と、defaultVal が設定されます?
1337             *
1338             * @og.rev 3.1.0.1 (2003/03/26) ??アクション以外?、エラーとするように変更?
1339             * @og.rev 3.5.6.2 (2004/07/05) ??の連結にStringBuilderを使用します?
1340             * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追?JavaDocのみ修正)
1341             * @og.rev 5.6.4.3 (2013/05/24) ACTMAX_MIN アクションの追?JavaDocのみ修正)
1342             * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追?ともな?正。action="ALL_xxx"は、tmpSelectedAll=true にします?
1343             *
1344             * @param       act アクション(public static final 宣?れて???)
1345             * @see         <a href="{&#064;docRoot}/constant-values.html#org.opengion.hayabusa.taglib.ValueTag.ACT_APPEND">アクション定数</a>
1346             */
1347            public void setAction( final String act ) {
1348                    action = nval( getRequestParameter( act ),action );
1349    
1350                    if( action != null && !check( action, ACTION_LIST ) ) {
1351                            StringBuilder errMsg = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1352                            errMsg.append( "??アクションは実行できません。アクションエラー" );
1353                            errMsg.append( HybsSystem.CR );
1354                            errMsg.append( "action=[" ).append( action ).append( "] " );
1355                            errMsg.append( HybsSystem.CR );
1356                            for( int i=0; i<ACTION_LIST.length; i++ ) {
1357                                    errMsg.append( " | " );
1358                                    errMsg.append( ACTION_LIST[i] );
1359                            }
1360                            errMsg.append( " | " );
1361                            throw new HybsSystemException( errMsg.toString() );
1362                    }
1363    
1364                    // 5.6.4.3 (2013/05/24) tmpSelectedAll 属?追??action="ALL_xxx"?tmpSelectedAll="true" に置き換えます?
1365                    if( action != null && action.startsWith( "ALL_" ) ) {
1366                            action      = action.substring( 4 );    // "ALL_" の?文字?削除
1367                            tmpSelectedAll = true;
1368                    }
1369            }
1370    
1371            /**
1372             * 【TAG】リクエスト情報 に登録するキーをセ?します?
1373             *
1374             * @og.tag リクエスト情報 に登録するキーをセ?します?
1375             *
1376             * @og.rev 3.0.1.3 (2003/03/11) キー?toUpperCase して??を削除
1377             *
1378             * @param       key1 リクエスト情報に登録するキー
1379             */
1380            public void setKey( final String key1 ) {
1381                    key = nval( getRequestParameter( key1 ),key ) ;
1382                    if( key == null ) {
1383                            String errMsg = "key がセ?されて?せん?
1384                                                    + " command=" + command + " , action=" + action;                        // 5.1.8.0 (2010/07/01) errMsg 修正
1385                            throw new HybsSystemException( errMsg );
1386                    }
1387            }
1388    
1389            /**
1390             * 【TAG】リクエスト情報 に登録する値をセ?します?
1391             *
1392             * @og.tag リクエスト情報 に登録する値をセ?します?
1393             *
1394             * @og.rev 3.1.7.0 (2003/05/02) isNullSet 属??true(初期値)のとき?、リクエスト情報から値を取得?
1395             * @og.rev 3.5.4.0 (2003/11/25) getRequestParameter( value ) メソ??setValue に移動?
1396             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
1397             *
1398             * @param       val     リクエスト情報に登録する値
1399             */
1400            public void setValue( final String val ) {
1401                    inValue = val;          // 3.5.4.0 (2003/11/25) 入力変数も?キープしておく?
1402                    value = getRequestParameter( inValue );
1403            }
1404    
1405            /**
1406             * 【TAG】value値がNULLの場合に、この初期値を設定します?
1407             *
1408             * @og.tag
1409             * value値がNULLの場合に、この初期値をセ?します?
1410             *
1411             * @param       val 初期値
1412             */
1413            public void setDefaultVal( final String val ) {
1414                    defaultVal = getRequestParameter( val );
1415            }
1416    
1417            /**
1418             * 【?】value ?NULL の時に、設定するかど?[true/false]を指定しま?初期値:true)?
1419             *
1420             * @og.tag
1421             * true の場合?, null のときでもセ?します?
1422             * false の場合?, null のとき?、既存?値を置き換えません?
1423             * 初期値は、null のときでもセ?するです? ("true")
1424             *
1425             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
1426             *
1427             * @param   flag NULL の時に設定するかど? [true:設定す?それ以?設定しない]
1428             * @deprecated 5.1.8.0 (2010/07/01) ??
1429             */
1430            @Deprecated public void setNullSet( final String flag ) {
1431    //              isNullSet = nval( getRequestParameter( flag ),isNullSet );
1432            }
1433    
1434            /**
1435             * 【TAG?通常は使?せん)Queryオブジェクトを作?する時?DB接続IDを指定します?
1436             *
1437             * @og.tag Queryオブジェクトを作?する時?DB接続IDを指定します?
1438             *
1439             * @param       id ??タベ?ス接続ID
1440             */
1441            public void setDbid( final String id ) {
1442                    dbid = nval( getRequestParameter( id ),dbid );
1443            }
1444    
1445            /**
1446             * 【TAG】キャ?ュする場合?スコー?request,session)を指定しま?初期値:request)?
1447             *
1448             * @og.tag
1449             * "request","session" が指定できます?
1450             * 初期値は?"request" です?
1451             *
1452             * @param       scp     スコー?
1453             */
1454            @Override
1455            public void setScope( final String scp ) {
1456                    scope = nval( getRequestParameter( scp ),scope );
1457            }
1458    
1459            /**
1460             * 【TAG】DBTableModel から取得する?合?スコー?request,session)を指定しま?初期値:session)?
1461             *
1462             * @og.tag
1463             * "request","session" が指定できます?
1464             * 初期値は?"session" です?
1465             *
1466             * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得?のscope
1467             *
1468             * @param       scp     スコー?
1469             */
1470            public void setTblScope( final String scp ) {
1471                    tblScope = nval( getRequestParameter( scp ),tblScope );
1472            }
1473    
1474            /**
1475             * 【??未使用)アクションの処?ラメータを設定します?
1476             *
1477             * @og.tag アクションの処?ラメータを設定します?
1478             *
1479             * @og.rev 3.1.0.1 (2003/03/26) パラメーター属?の追??
1480             * @og.rev 5.6.4.3 (2013/05/24) 未使用なので削除
1481             *
1482             * @param       param パラメータ
1483             */
1484    //      public void setParameter( final String param ) {
1485    //              parameter = nval( getRequestParameter( param ),parameter );
1486    //      }
1487    
1488            /**
1489             * 【TAG】?ルチデータ(?件検索)を使用するかど?[true/false]を指定しま?初期値:false)?
1490             *
1491             * @og.tag
1492             * command="SQL" の場合に、?行検索した結果を?キー?行番号 と?キーを作?して
1493             * 値を設定するかど?を指定します?
1494             * false の場合?、従来どおり、検索カラ?がキーになります?
1495             * 初期値は、false です?
1496             *
1497             * @og.rev 3.2.4.0 (2003/06/12) 新規追?
1498             *
1499             * @param   flag ?件検索 [true:使用する/false:使用しない]
1500             */
1501            public void setUseMultiRows( final String flag ) {
1502                    useMultiRows = nval( getRequestParameter( flag ),useMultiRows );
1503            }
1504    
1505            /**
1506             * 【TAG】各種アクションの??を???する?区??をセ?しま?初期値:",")?
1507             *
1508             * @og.tag
1509             * ?アクションに基づく??おいて、文字?の区?を指定する?に使用します?
1510             * APPEND?del>ALL_APPEND?/del>ROW_APPEND 時には、文字?の連結に使用します?
1511             * MERGE の場合?、カンマで?後?こ?セパレータでMERGE処?行い、?び??結します?
1512             * 初期値は?," に設定されて?す?
1513             *
1514             * @og.rev 3.5.6.5 (2004/08/09) 新規追?
1515             *
1516             * @param   sepa ?区???初期値:",")
1517             */
1518            public void setSeparator( final String sepa ) {
1519                    separator = nval( getRequestParameter( sepa ),separator );
1520            }
1521    
1522            /**
1523             * 【TAG】リクエスト情報の HTMLTag開?終??&gt;&lt;) 存在チェ?を実施するかど?[true/false]を設定しま?
1524             *              (初期値:USE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])?
1525             *
1526             * @og.tag
1527             * クロスサイトスクリプティング(XSS)対策??としてless/greater than signにつ?のチェ?を行います?
1528             * (&gt;&lt;) が含まれて?エラーにする(true)?かノ?チェ??false)を指定します?
1529             * (初期値:シス?定数のUSE_XSS_CHECK[={@og.value org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK}])?
1530             *
1531             * @og.rev 5.1.7.0 (2010/06/01) 新規追?
1532             *
1533             * @param       flag    XSSチェ? [true:する/false:しない]
1534             * @see         org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK
1535             */
1536            public void setXssCheck( final String flag ) {
1537                    xssCheck = nval( getRequestParameter( flag ),xssCheck );
1538            }
1539    
1540            /**
1541             * 【TAG】部?字?置換? 置換え前?部?字?(from)を指定します?
1542             *
1543             * @og.tag
1544             * value の値から、指定された正規表現(from)に??する、この??の??字?に対し?
1545             * ?された??(to)で置換します?
1546             * value.replaceAll( from, to ) と??で処?ます?
1547             *
1548             * @og.rev 5.2.2.0 (2010/11/01) 新規追?
1549             *
1550             * @param       from    置換え前?部?字?
1551             * @see         #setToVal(String)
1552             */
1553            public void setFromVal( final String from ) {
1554                    fromVal = nval( getRequestParameter( from ),fromVal );
1555            }
1556    
1557            /**
1558             * 【TAG】部?字?置換? 置換え後?部?字?(to)を指定します?
1559             *
1560             * @og.tag
1561             * value の値から、指定された正規表現(from)に??する、この??の??字?に対し?
1562             * ?された??(to)で置換します?
1563             * value.replaceAll( from, to ) と??で処?ます?
1564             *
1565             * @og.rev 5.2.2.0 (2010/11/01) 新規追?
1566             *
1567             * @param       to      置換え後?部?字?
1568             * @see         #setFromVal(String)
1569             */
1570            public void setToVal( final String to ) {
1571                    toVal = nval( getRequestParameter( to ),toVal );
1572            }
1573    
1574            /**
1575             * シリアライズ用のカスタ?リアライズ書き込みメソ?
1576             *
1577             * @og.rev 4.0.0.0 (2006/09/31) 新規追?
1578             * @serialData
1579             *
1580             * @param       strm    ObjectOutputStreamオブジェク?
1581             */
1582            private void writeObject( final ObjectOutputStream strm ) throws IOException {
1583                    strm.defaultWriteObject();
1584            }
1585    
1586            /**
1587             * シリアライズ用のカスタ?リアライズ読み込みメソ?
1588             *
1589             * ここでは、transient 宣?れた?変数の??初期化が?なフィールド?み設定します?
1590             *
1591             * @og.rev 4.0.0.0 (2006/09/31) 新規追?
1592             * @serialData
1593             *
1594             * @param       strm    ObjectInputStreamオブジェク?
1595             * @see #release2()
1596             */
1597            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
1598                    strm.defaultReadObject();
1599            }
1600    
1601            /**
1602             * こ?オブジェクト???表現を返します?
1603             * 基本???目?使用します?
1604             *
1605             * @og.rev 4.3.4.0 (2008/12/01) PageContextのスコープをクラス変数としてアクセス
1606             * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属? ?
1607             *
1608             * @return こ?クラスの??表現
1609             */
1610            @Override
1611            public String toString() {
1612                    String rtnStr = org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
1613                                    .println( "VERSION"                     ,VERSION                )
1614                                    .println( "tableId"                     ,tableId                )
1615                                    .println( "command"                     ,command                )
1616                                    .println( "key"                         ,key                    )
1617                                    .println( "inValue"                     ,inValue                )
1618                                    .println( "value"                       ,value                  )
1619                                    .println( "defaultVal"          ,defaultVal             )
1620                                    .println( "action"                      ,action                 )
1621    //                              .println( "isNullSet"           ,isNullSet              )
1622                                    .println( "dbid"                        ,dbid                   )
1623                                    .println( "scope"                       ,scope                  )
1624                                    .println( "separator"           ,separator              )
1625    //                              .println( "parameter"           ,parameter              )               5.6.4.3 (2013/05/24) 未使用なので削除
1626                                    .println( "useMultiRows"        ,useMultiRows   )
1627                                    .println( "COMMAND_LIST"        ,COMMAND_LIST   )
1628                                    .println( "ACTION_LIST"         ,ACTION_LIST    )
1629                                    .println( "Other..."    ,getAttributes().getAttribute() )
1630                                    .fixForm().toString() ;
1631    
1632                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
1633                    rtn.append( HybsSystem.CR ).append( "====================================" ).append( HybsSystem.CR );
1634    
1635                    rtn.append( "APPLICATION_SCOPE:" ).append( HybsSystem.CR );
1636    
1637                    Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.APPLICATION_SCOPE );        // 4.3.3.6 (2008/11/15) Generics警告対?
1638                    while ( ekeys.hasMoreElements() ) {
1639    //                      String ekey = String.valueOf( ekeys.nextElement() );
1640                            String ekey = ekeys.nextElement();              // 4.3.3.6 (2008/11/15) Generics警告対?
1641                            rtn.append( "  key=[" ).append( ekey ).append( "] " );
1642                            rtn.append( "value=[" ).append( pageContext.getAttribute( ekey,PageContext.APPLICATION_SCOPE ) ).append( "]" );
1643                            rtn.append( HybsSystem.CR );
1644                    }
1645    
1646                    rtn.append( "SESSION_SCOPE:" ).append( HybsSystem.CR );
1647                    ekeys = pageContext.getAttributeNamesInScope( PageContext.SESSION_SCOPE );
1648                    while ( ekeys.hasMoreElements() ) {
1649                            String ekey = String.valueOf( ekeys.nextElement() );
1650                            rtn.append( "  key=[" ).append( ekey ).append( "] " );
1651                            rtn.append( "value=[" ).append( pageContext.getAttribute( ekey,PageContext.SESSION_SCOPE ) ).append( "]" );
1652                            rtn.append( HybsSystem.CR );
1653                    }
1654    
1655                    rtn.append( "REQUEST_SCOPE:" ).append( HybsSystem.CR );
1656                    ekeys = pageContext.getAttributeNamesInScope( PageContext.REQUEST_SCOPE );
1657                    while ( ekeys.hasMoreElements() ) {
1658                            String ekey = String.valueOf( ekeys.nextElement() );
1659                            rtn.append( "  key=[" ).append( ekey ).append( "] " );
1660                            rtn.append( "value=[" ).append( pageContext.getAttribute( ekey,PageContext.REQUEST_SCOPE ) ).append( "]" );
1661                            rtn.append( HybsSystem.CR );
1662                    }
1663    
1664                    rtn.append( "PAGE_SCOPE:" ).append( HybsSystem.CR );
1665                    ekeys = pageContext.getAttributeNamesInScope( PageContext.PAGE_SCOPE );
1666                    while ( ekeys.hasMoreElements() ) {
1667                            String ekey = String.valueOf( ekeys.nextElement() );
1668                            rtn.append( "  key=[" ).append( ekey ).append( "] " );
1669                            rtn.append( "value=[" ).append( pageContext.getAttribute( ekey,PageContext.PAGE_SCOPE ) ).append( "]" );
1670                            rtn.append( HybsSystem.CR );
1671                    }
1672                    rtn.append( "====================================" ).append( HybsSystem.CR );
1673    
1674                    return rtnStr + rtn.toString();
1675            }
1676    }