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