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