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