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