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 org.opengion.fukurou.security.HybsCryptography; // 5.9.6.3 (2016/03/18) 021import org.opengion.fukurou.util.ToString; // 6.8.5.0 (2018/01/09) 022import org.opengion.fukurou.util.HybsDateUtil; // 6.4.2.0 (2016/01/29) 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.fukurou.util.ArraySet; // 6.4.3.4 (2016/03/11) 025import org.opengion.fukurou.db.Transaction; 026import static org.opengion.fukurou.util.StringUtil.nval; 027 028import org.opengion.hayabusa.common.HybsSystem; 029import org.opengion.hayabusa.common.HybsSystemException; 030import org.opengion.hayabusa.db.DBColumn; 031import org.opengion.hayabusa.db.DBTableModel; 032import org.opengion.hayabusa.db.Query; 033import org.opengion.hayabusa.db.QueryFactory; 034 035import java.util.Calendar; 036import java.util.Enumeration; 037import java.util.LinkedHashSet; 038import java.util.Locale; 039import java.util.List; // 7.3.1.1 (2021/02/25) 040import java.util.ArrayList; 041import java.util.Arrays; // 7.3.1.1 (2021/02/25) 042import java.util.Set; 043import java.util.Map; 044import java.util.LinkedHashMap; // 6.4.2.1 (2016/02/05) 045import java.util.stream.Collectors; // 8.1.0.1 (2022/01/07) 046import java.util.function.Predicate; // 8.0.1.2 (2021/11/19) 047import java.text.NumberFormat; // 6.2.4.2 (2015/05/29) 048import java.text.DateFormat; // 8.0.1.2 (2021/11/19) 049import java.text.SimpleDateFormat; // 8.0.1.2 (2021/11/19) 050 051import jakarta.servlet.jsp.PageContext; 052import javax.script.ScriptEngine; 053import javax.script.ScriptEngineManager; 054import javax.script.ScriptException; 055 056/** 057 * JSP上からキー、値を設定することにより、パラメータとして、値を 058 * 取出し可能にするタグです。 059 * 060 * 通常のリクエスト情報と同じ扱いができます(優先順位は、リクエストが上位)。 061 * 062 * 設定した値は、{@XXXX} 形式で 取り出すことができます。 063 * また、command ="GET" で 直接画面に値を書き出すことも可能です。 064 * 065 * ※ このタグは、Transaction タグの対象です。 066 * 067 * <style> 068 * #valueJavaDoc th { vertical-align:top; margin:0px; padding:0px; } 069 * #valueJavaDoc td { text-align:center; margin:0px; padding:0px; } 070 * .act { 071 * background-color: #ccffcc; 072 * height : 160px; 073 * } 074 * .cmd { 075 * background-color: #ffcccc; 076 * width : 80px; 077 * } 078 * .arrow { 079 * border-top: 160px solid #ccffcc; 080 * border-left: 80px solid #ffcccc; 081 * position: absolute; 082 * } 083 * .actarw { margin-left:20px; position: absolute; } 084 * .cmdarw { margin-top:140px; position: absolute; } 085 * </style> 086 * 087 * @og.formSample 088 * ●形式:<og:value command="SET" key="ABC" value="123" /> 089 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 090 * 091 * ●Tag定義: 092 * <og:value 093 * command 【TAG】コマンド (SET,GET,REMOVE,CLEAR,SQL,SETTBL,GETTBL,KEYTBL,SETMEM,SQLGET,DEBUG)をセットします(初期値:SET) 094 * action 【TAG】アクション(UPPER,LOWER,MESSAGE,APPEND,ALL_APPEND,MAP,ALL_MAP,MAPOBJ,ALL_MAPOBJ,LIST,ALL_LIST,LIST_CSV,ALL_LIST_CSV, 095 * MERGE,FIRST,VIEWFIRST,ROW_APPEND,REPLACE,INDEX_OF,LASTINDEX_OF,SUBSTR,LENGTH,SET,ALL_SET,SET_CSV,ALL_SET_CSV, 096 * SPLIT,SPLIT_LIST,FOR,FOR_LIST,FORTM,FORTM_LIST,MAX_MIN,ALL_MAX_MIN,ADD,CASE,ESCAPE,TO_DATE,DAY_WEEK, 097 * URL_ENCODE,URL_ENCODE2,URL_DECODE,TRIM,HASH,TO_NUMBER,HMCSV,CRYPT_ENC,CRYPT_DEC,REQUEST,FORMAT)をセットします 098 * 7.3.0.0 (2021/01/06) EXEC 廃止 099 * key 【TAG】パラメータ に登録するキーをセットします 100 * value 【TAG】パラメータ に登録する値をセットします 101 * defaultVal 【TAG】value値がNULLの場合に、この初期値を設定します 102 * separator 【TAG】各種アクションの文字列を連結/分解する項目区切り文字をセットします(初期値:",") 103 * useMultiRows 【TAG】マルチデータ(複数件検索)を使用するかどうか[true/false]を指定します(初期値:false) 104 * scope 【TAG】キャッシュする場合のスコープ(request,session)を指定します(初期値:request) 105 * tableId 【TAG】sessionから取得する DBTableModelオブジェクトの ID 106 * tblScope 【TAG】DBTableModel から取得する場合のスコープ(request,session)を指定します(初期値:session) 107 * dbid 【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します 108 * xssCheck 【TAG】パラメータの HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します (初期値:USE_XSS_CHECK[=true]) 109 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 110 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 111 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 112 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 113 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 114 * fromVal 【TAG】部分文字列置換の 置換え前の部分文字列(from)を指定します・・・HMCSVの開始時刻にも使用します 115 * toVal 【TAG】部分文字列置換の 置換え後の部分文字列(to)を指定します・・・HMCSVの終了時刻にも使用します 116 * skipVal 【TAG】HMCSVで使用する、ステップ時間を分で指定します(例:1時間=60 , 2時間=120 , 45分=45 など) 6.8.4.1 (2017/12/18) 117 * useSkipOver 【TAG】HMCSVで使用する、toVal と skipValで、toVal の手前で止める(false)か、追い越して止める(true)を指定します。8.4.2.0 (2023/03/03) 118 * format 【TAG】actionが、FORMAT,FOR,FOR_LIST,FORTM,FORTM_LIST の場合の文字列変換フォーマットを指定します。8.0.1.2 (2021/11/19) 119 * cryptKey 【TAG】暗号化と復号化で利用する、暗号化キーを指定します。 120 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 5.10.4.0 (2018/10/05) 121 * > ... Body ... 122 * </og:value> 123 * 124 * 【廃止】5.1.8.0 (2010/07/01) 物理削除 125 * // nullSet 【廃止】value が NULL の時に、設定するかどうか[true/false]を指定します(初期値:true) 126 * 127 * ●使用例 128 * ・ <og:value command="SET" key="ABC" value="123" /> 129 * ・ <og:value command="SQL">SELECT 1 TEST FROM DUAL</og:value> 130 * ・ <og:value command="SET" key="DEF" value="{@NOCOMMAND}" defaultVal="0000" /> 131 * ・ <og:value command="GET" key="NOKEY" defaultVal="NODATA" /> 132 * ・ <og:value command="SET" key="{@ABC}4" value="TEST1234" /> 133 * ・ <og:value command="GET" key="ABC" /> 134 * ・ <og:value command="SET" action="LOWER" key="LOWERTEST" value="ABCDEF" /> ⇒ abcdef 135 * ・ <og:value command="GET" key="LOWERTEST" /> 136 * ・ <og:value command="GET" action="UPPER" key="LOWERTEST" /> 137 * ・ <og:value command="REMOVE" key="ABC" /> 138 * ・ <og:value command="SET" action="FORMAT" key="ABC" value="15" format="%05d" <del>fromVal="%05d"</del> /> ⇒ 00015 139 * 140 * <table class="plain" id="valueJavaDoc"> 141 * <caption>command 一覧と使用可能 action の対応表</caption> 142 * <tr> 143 * <th><span class="arrow">Key</span><span class="actarw">action</span><span class="cmdarw">command</span></th> 144 * <th class="act">UPPER<br>LOWER<br>MESSAGE<br>DAY_WEEK<br>MERGE<br>REPLACE<br> 145 * INDEX_OF<br>LASTINDEX_OF<br>SUBSTR<br>LENGTH<br>ADD<br>CASE<br> 146 * ESCAPE<br>URL_ENCODE<br>URL_ENCODE2<br>URL_DECODE<br>TRIM<br>HASH<br> 147 * TO_NUMBER<br>FORMAT</th> 148 * <th class="act">APPEND<br>ALL_APPEND</th> 149 * <th class="act">MAP<br>ALL_MAP<br>MAPOBJ<br>ALL_MAPOBJ<br>LIST<br>LIST_CSV<br>ALL_LIST<br>ALL_LIST_CSV<br>SET<br>SET_CSV<br>ALL_SET<br>ALL_SET_CSV</th> 150 * <th class="act">FIRST<br>VIEWFIRST</th> 151 * <th class="act">ROW_APPEND</th> 152 * <th class="act">SPLIT<br>SPLIT_LIST<br>FOR<br>FOR_LIST<br><br>FORTM<br>FORTM_LIST<br>MAX_MIN<br>ALL_MAX_MIN</th> 153 * <th class="act">HMCSV</th> <!-- 6.8.4.1 (2017/12/18) --> 154 * </tr> 155 * <tr><td class="cmd">SET </td><td>○</td><td>○</td><td>×</td><td>×</td><td>×</td><td>○</td><td>○</td></tr> 156 * <tr><td class="cmd">GET </td><td>○</td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td><td>○</td></tr> 157 * <tr><td class="cmd">REMOVE </td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td></tr> 158 * <tr><td class="cmd">CLEAR </td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td><td>×</td></tr> 159 * <tr><td class="cmd">SQL </td><td>×</td><td>×</td><td>○</td><td>×</td><td>○</td><td>×</td><td>×</td></tr> 160 * <tr><td class="cmd">SETTBL </td><td>○</td><td>○</td><td>○</td><td>○</td><td>×</td><td>○</td><td>×</td></tr> 161 * <tr><td class="cmd">GETTBL </td><td>○</td><td>○</td><td>×</td><td>○</td><td>×</td><td>×</td><td>×</td></tr> 162 * <tr><td class="cmd">KEYTBL </td><td>○</td><td>○</td><td>×</td><td>○</td><td>×</td><td>○</td><td>×</td></tr> 163 * <tr><td class="cmd">SETMEM </td><td>○</td><td>○</td><td>×</td><td>×</td><td>×</td><td>○</td><td>×</td></tr> 164 * <tr><td class="cmd">SQLGET </td><td>×</td><td>×</td><td>×</td><td>×</td><td>○</td><td>×</td><td>×</td></tr> 165 * </table> 166 * 167 * @og.group その他部品 168 * 169 * @version 4.0 170 * @author M.Endou 171 * @since JDK5.0, 172 */ 173public class ValueTag extends CommonTagSupport { 174 /** このプログラムのVERSION文字列を設定します。 {@value} */ 175 private static final String VERSION = "8.4.2.0 (2023/03/03)" ; 176 private static final long serialVersionUID = 842020230303L ; 177 178 /** command 引数に渡す事の出来る コマンド セット {@value} */ 179 public static final String CMD_SET = "SET"; 180 /** command 引数に渡す事の出来る コマンド ゲット {@value} */ 181 public static final String CMD_GET = "GET"; 182 /** command 引数に渡す事の出来る コマンド リムーブ {@value} */ 183 public static final String CMD_REMOVE = "REMOVE"; 184 /** command 引数に渡す事の出来る コマンド クリア {@value} */ 185 public static final String CMD_CLEAR = "CLEAR"; 186 /** command 引数に渡す事の出来る コマンド SQL {@value} */ 187 public static final String CMD_SQL = "SQL"; 188 /** command 引数に渡す事の出来る コマンド セットテーブル {@value} */ 189 public static final String CMD_SETTBL = "SETTBL"; 190 /** command 引数に渡す事の出来る コマンド ゲットテーブル {@value} */ 191 public static final String CMD_GETTBL = "GETTBL"; 192 /** command 引数に渡す事の出来る コマンド キーテーブル {@value} */ 193 public static final String CMD_KEYTBL = "KEYTBL"; 194 /** command 引数に渡す事の出来る コマンド セットメモリ {@value} */ 195 public static final String CMD_SETMEM = "SETMEM"; // 3.7.1.0 (2005/04/15) 196 /** command 引数に渡す事の出来る コマンド SQLゲット {@value} */ 197 public static final String CMD_SQLGET = "SQLGET"; // 5.1.7.0 (2010/06/01) SQLGET対応 198 /** command 引数に渡す事の出来る コマンド デバッグ {@value} */ 199 public static final String CMD_DEBUG = "DEBUG"; // 6.7.7.2 (2017/04/14) 200 201 // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 202 private static final Set<String> COMMAND_SET = new ArraySet<>( CMD_SET , CMD_GET , CMD_REMOVE , CMD_SQL , CMD_SETTBL , CMD_GETTBL , 203 CMD_KEYTBL , CMD_CLEAR , CMD_SETMEM, CMD_SQLGET ); 204 205 /** action 引数に渡す事の出来る アクション アッパー(大文字化) {@value} */ 206 public static final String ACT_UPPER = "UPPER" ; 207 /** action 引数に渡す事の出来る アクション ローワー(小文字化) {@value} */ 208 public static final String ACT_LOWER = "LOWER" ; 209 /** action 引数に渡す事の出来る アクション メッセージ変換 {@value} */ 210 public static final String ACT_MESSAGE = "MESSAGE" ; 211 /** action 引数に渡す事の出来る アクション データアペンド {@value} */ 212 public static final String ACT_APPEND = "APPEND" ; 213 /** action 引数に渡す事の出来る アクション オールアペンド {@value} */ 214 public static final String ACT_ALL_APPEND = "ALL_APPEND" ; // 3.6.1.0 (2005/01/05) 215 /** action 引数に渡す事の出来る アクション MAP {@value} */ 216 public static final String ACT_MAP = "MAP" ; // 5.5.0.3 (2012/03/12) 217 /** action 引数に渡す事の出来る アクション ALL_MAP {@value} */ 218 public static final String ACT_ALL_MAP = "ALL_MAP" ; // 5.5.0.3 (2012/03/12) 219 /** action 引数に渡す事の出来る アクション MAP {@value} */ 220 public static final String ACT_MAPOBJ = "MAPOBJ" ; // 6.2.4.2 (2015/05/29) 221 /** action 引数に渡す事の出来る アクション ALL_MAP {@value} */ 222 public static final String ACT_ALL_MAPOBJ = "ALL_MAPOBJ" ; // 6.2.4.2 (2015/05/29) 223 /** action 引数に渡す事の出来る アクション LIST {@value} */ 224 public static final String ACT_LIST = "LIST" ; // 4.3.7.5 (2009/07/13) 225 /** action 引数に渡す事の出来る アクション ALL_LIST {@value} */ 226 public static final String ACT_ALL_LIST = "ALL_LIST" ; // 4.3.7.5 (2009/07/13) 227 /** action 引数に渡す事の出来る アクション LIST_CSV {@value} */ 228 public static final String ACT_LIST_CSV = "LIST_CSV" ; // 8.1.0.1 (2022/01/07) 229 /** action 引数に渡す事の出来る アクション ALL_LIST_CSV {@value} */ 230 public static final String ACT_ALL_LIST_CSV = "ALL_LIST_CSV" ; // 8.1.0.1 (2022/01/07) 231 /** action 引数に渡す事の出来る アクション SET {@value} */ 232 public static final String ACT_SET = "SET" ; // 8.1.0.1 (2022/01/07) 233 /** action 引数に渡す事の出来る アクション ALL_SET {@value} */ 234 public static final String ACT_ALL_SET = "ALL_SET" ; // 8.1.0.1 (2022/01/07) 235 /** action 引数に渡す事の出来る アクション SET_CSV {@value} */ 236 public static final String ACT_SET_CSV = "SET_CSV" ; // 8.1.0.1 (2022/01/07) 237 /** action 引数に渡す事の出来る アクション ALL_SET_CSV {@value} */ 238 public static final String ACT_ALL_SET_CSV = "ALL_SET_CSV" ; // 8.1.0.1 (2022/01/07) 239 /** action 引数に渡す事の出来る アクション 日付前方まるめ {@value} */ 240 public static final String ACT_DAY_WEEK = "DAY_WEEK" ; // 3.7.1.0 (2005/04/15) 241 /** action 引数に渡す事の出来る アクション マージ {@value} */ 242 public static final String ACT_MERGE = "MERGE" ; // 3.7.1.1 (2005/05/23) 243 /** action 引数に渡す事の出来る アクション ファースト {@value} */ 244 public static final String ACT_FIRST = "FIRST" ; // 3.8.0.4 (2005/08/08) 245 /** action 引数に渡す事の出来る アクション ビューファースト {@value} */ 246 public static final String ACT_VIEWFIRST = "VIEWFIRST" ; // 7.3.1.1 (2021/02/25) 247 /** action 引数に渡す事の出来る アクション 縦横回転 {@value} */ 248 public static final String ACT_ROW_APPEND = "ROW_APPEND" ; // 3.8.9.2 (2007/07/28) 249 /** action 引数に渡す事の出来る アクション 文字列置換 {@value} */ 250 public static final String ACT_REPLACE = "REPLACE" ; // 5.2.2.0 (2010/11/01) 251 /** action 引数に渡す事の出来る アクション 部分文字列 {@value} */ 252 public static final String ACT_SUBSTR = "SUBSTR" ; // 5.2.2.0 (2010/11/01) 253 /** action 引数に渡す事の出来る アクション 文字数(char数) {@value} */ 254 public static final String ACT_LENGTH = "LENGTH" ; // 7.2.6.0 (2020/06/30) 255 /** action 引数に渡す事の出来る アクション INDEX_OF数 {@value} */ 256 public static final String ACT_INDEX_OF = "INDEX_OF" ; // 7.2.6.0 (2020/06/30) 257 /** action 引数に渡す事の出来る アクション LASTINDEX_OF数 {@value} */ 258 public static final String ACT_LASTINDEX_OF = "LASTINDEX_OF" ; // 7.2.6.0 (2020/06/30) 259 /** action 引数に渡す事の出来る アクション 文字列分割 {@value} */ 260 public static final String ACT_SPLIT = "SPLIT" ; // 5.2.2.0 (2010/11/01) 261 /** action 引数に渡す事の出来る アクション 文字列分割後LIST登録 {@value} */ 262 public static final String ACT_SPLIT_LIST = "SPLIT_LIST" ; // 7.3.1.1 (2021/02/25) 263 /** action 引数に渡す事の出来る アクション fromVal,toVal,skipVal を使用した連結文字列を作成する {@value} */ 264 public static final String ACT_FOR = "FOR" ; // 7.3.1.1 (2021/02/25) 265 /** action 引数に渡す事の出来る アクション fromVal,toVal,skipVal を使用した文字列をLIST登録 {@value} */ 266 public static final String ACT_FOR_LIST = "FOR_LIST" ; // 7.3.1.1 (2021/02/25) 267 /** action 引数に渡す事の出来る アクション fromVal,toVal,skipVal を使用した日付文字列を作成する {@value} */ 268 public static final String ACT_FORTM = "FORTM" ; // 8.0.1.2 (2021/11/19) 269 /** action 引数に渡す事の出来る アクション fromVal,toVal,skipVal を使用した日付文字列をLIST登録 {@value} */ 270 public static final String ACT_FORTM_LIST = "FORTM_LIST" ; // 8.0.1.2 (2021/11/19) 271 /** action 引数に渡す事の出来る アクション 最大_最小値 {@value} */ 272 public static final String ACT_MAX_MIN = "MAX_MIN" ; // 5.6.4.3 (2013/05/24) 273 /** action 引数に渡す事の出来る アクション ALL_最大_最小値 {@value} */ 274 public static final String ACT_ALL_MAX_MIN = "ALL_MAX_MIN" ; // 5.6.4.3 (2013/05/24) 275 /** action 引数に渡す事の出来る アクション 計算処理結果 {@value} */ 276 public static final String ACT_EXEC = "EXEC" ; // 5.7.7.2 (2014/06/20) 277 /** action 引数に渡す事の出来る アクション 値をプラスする {@value} */ 278 public static final String ACT_ADD = "ADD" ; // 7.3.0.0 (2021/01/06) 279 /** action 引数に渡す事の出来る アクション 条件分岐 {@value} */ 280 public static final String ACT_CASE = "CASE" ; // 5.7.7.2 (2014/06/20) 281 /** action 引数に渡す事の出来る アクション HTML上のエスケープ文字 {@value} */ 282 public static final String ACT_ESCAPE = "ESCAPE" ; // 6.3.5.0 (2015/08/08) 283 /** action 引数に渡す事の出来る アクション UTF-8 でURLエンコード {@value} */ 284 public static final String ACT_ENCODE = "URL_ENCODE" ; // 6.9.7.0 (2018/05/14) 285 /** action 引数に渡す事の出来る アクション UTF-8 で部分URLエンコード {@value} */ 286 public static final String ACT_ENCODE2 = "URL_ENCODE2" ; // 6.9.7.0 (2018/05/14) 287 /** action 引数に渡す事の出来る アクション UTF-8 でURLデコード {@value} */ 288 public static final String ACT_DECODE = "URL_DECODE" ; // 6.9.7.0 (2018/05/14) 289 /** action 引数に渡す事の出来る アクション スペース削除 {@value} */ 290 public static final String ACT_TRIM = "TRIM" ; // 6.4.1.2 (2016/01/22) 291// /** action 引数に渡す事の出来る アクション MD5 {@value} */ 292// public static final String ACT_MD5 = "MD5" ; // 5.9.6.3 (2016/03/18) 8.1.2.0 (2022/03/10) Delete 293 /** action 引数に渡す事の出来る アクション HASH {@value} */ 294 public static final String ACT_HASH = "HASH" ; // 8.1.2.0 (2022/03/10) Add 295 /** action 引数に渡す事の出来る アクション TO_NUMBER {@value} */ 296 public static final String ACT_TO_NUMBER = "TO_NUMBER" ; // 6.7.4.0 (2017/02/10) 297 /** action 引数に渡す事の出来る アクション TO_DATE {@value} */ 298 public static final String ACT_TO_DATE = "TO_DATE" ; // 8.0.1.2 (2021/11/19) 299 /** action 引数に渡す事の出来る アクション HMCSV {@value} */ 300 public static final String ACT_HMCSV = "HMCSV" ; // 6.8.4.1 (2017/12/18) 301 /** action 引数に渡す事の出来る アクション CRYPT_ENC {@value} */ 302 public static final String ACT_CRYPT_ENC = "CRYPT_ENC"; // 5.10.4.0 (2018/10/05) 303 /** action 引数に渡す事の出来る アクション CRYPT_DEC {@value} */ 304 public static final String ACT_CRYPT_DEC = "CRYPT_DEC"; // 5.10.4.0 (2018/10/05) 305 /** action 引数に渡す事の出来る アクション REQUEST {@value} */ 306 public static final String ACT_REQUEST = "REQUEST"; // 7.2.6.1 (2020/07/17) 307 /** action 引数に渡す事の出来る アクション FORMAT {@value} */ 308 public static final String ACT_FORMAT = "FORMAT"; // 7.4.2.0 (2021/05/08) 309 310 /** action 引数に渡す事の出来る アクション リスト */ 311 // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 312 // 6.8.4.1 (2017/12/18) ACT_HMCSV 313 // 6.9.7.0 (2018/05/14) ACT_ENCODE , ACT_ENCODE2 , ACT_DECODE 314 // 5.10.4.0 (2018/10/05) ACT_CRYPT_ENC, ACT_CRYPT_DEC 315 // 7.2.6.0 (2020/06/30) ACT_LENGTH 316 // 7.3.0.0 (2021/01/06) ACT_ADD , (ACT_EXECは基本廃止) 317 // 7.4.2.0 (2021/05/08) ACT_FORMAT追加 318 // 8.0.1.2 (2021/11/19) ACT_TO_DATE,ACT_FORTM,ACT_FORTM_LIST 追加 319 // 8.1.2.0 (2022/03/10) ACT_MD5 を ACT_HASH に変更 320 private static final Set<String> ACTION_SET = new ArraySet<>( 321 ACT_UPPER,ACT_LOWER,ACT_MESSAGE,ACT_APPEND,ACT_ALL_APPEND, 322 ACT_MAP,ACT_ALL_MAP,ACT_MAPOBJ,ACT_ALL_MAPOBJ,ACT_LIST,ACT_LIST_CSV,ACT_ALL_LIST,ACT_ALL_LIST_CSV,ACT_SET,ACT_SET_CSV,ACT_ALL_SET,ACT_ALL_SET_CSV, 323 ACT_DAY_WEEK,ACT_MERGE,ACT_FIRST,ACT_VIEWFIRST,ACT_ROW_APPEND,ACT_REPLACE,ACT_INDEX_OF,ACT_LASTINDEX_OF,ACT_SUBSTR,ACT_LENGTH, 324 ACT_SPLIT,ACT_SPLIT_LIST,ACT_FOR,ACT_FOR_LIST,ACT_FORTM,ACT_FORTM_LIST,ACT_MAX_MIN,ACT_ALL_MAX_MIN,ACT_EXEC, 325 ACT_CASE,ACT_ESCAPE,ACT_ENCODE,ACT_ENCODE2,ACT_DECODE, 326 ACT_TRIM,ACT_HASH,ACT_TO_NUMBER,ACT_TO_DATE,ACT_HMCSV,ACT_CRYPT_ENC,ACT_CRYPT_DEC,ACT_REQUEST,ACT_ADD,ACT_FORMAT 327 ); 328 329// /** 6.8.4.1 (2017/12/18) action="HMCSV" で、ループ制限します。 */ 330// 8.2.0.1 (2022/06/17) MAX_CNT 廃止 331// public static final int MAX_CNT = 361; // 8.0.1.2 (2021/11/19) 300 → 361 に変更(360まで許可する) 332 333 /** 8.0.1.2 (2021/11/19) 日付のフォーマットの初期値 */ 334 public static final String YMDHMS = "yyyyMMddHHmmss" ; 335 private static final String HASH_CODE = HybsSystem.sys( "FILE_HASH_CODE" ); // 8.1.2.0 (2022/03/10) 336 337 private transient DBTableModel table; 338 339 private String tableId = HybsSystem.TBL_MDL_KEY; 340 private String command = CMD_SET; 341 private String key ; 342 private String inValue ; // 3.5.4.0 (2003/11/25) 343 private String value ; 344 private String defaultVal ; 345 private String action ; 346 private String dbid ; // 4.0.0.0 (2007/10/10) dbid の初期値を、"DEFAULT" から null に変更 347 private String scope = "request"; // "request","session" 348 private String tblScope = "session"; // 5.1.2.0 (2010/01/01) DBTableModel の取得先のscope 349 private String separator = ","; // 項目区切り文字 350 private boolean useMultiRows ; // 3.2.4.0 (2003/06/12) マルチデータ(複数件検索)を使用するかしないか。初期値:使用せず 351 private boolean xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.1.7.0 (2010/06/01) XSS対策 352 353 private String fromVal ; // 5.2.2.0 (2010/11/01) 354 private String toVal ; // 5.2.2.0 (2010/11/01) 355 private String skipVal ; // 6.8.4.1 (2017/12/18) 356 private boolean useSkipOver ; // 8.4.2.0 (2023/03/03) skipValで、toVal を追い越して止める場合は、true 357 private String format ; // 8.0.1.2 (2021/11/19) 358 private String cryptKey ; // 5.10.4.0 (2018/10/05) 暗号化キー 359 360 private boolean tmpSelectedAll ; // 5.6.4.3 (2013/05/24) action="ALL_xxx"を tmpSelectedAll="true" で内部処理します。 361 362 /** 363 * デフォルトコンストラクター 364 * 365 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 366 */ 367 public ValueTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 368 369 /** 370 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 371 * 372 * @og.rev 3.1.7.0 (2003/05/02) isNullSet 属性が true(初期値)のときは、リクエスト情報から値を取得。 373 * @og.rev 3.1.7.0 (2003/05/02) scope 属性を設定するタイミングを、早くする。 374 * @og.rev 3.5.4.0 (2003/11/25) getRequestParameter( value ) メソッドを setValue に移動。 375 * @og.rev 5.1.7.0 (2010/06/01) SQLGET対応 376 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 377 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 378 * @og.rev 6.4.8.1 (2016/07/02) xssCheckを、doStartTag に移動 379 * 380 * @return 後続処理の指示 381 */ 382 @Override 383 public int doStartTag() { 384 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 385 if( useTag() ) { 386 useXssCheck( xssCheck ); // 6.4.8.1 (2016/07/02) 387 388 super.setScope( scope ); // デフォルトscope が "request" なので、再設定している。 389 390 // if( isNullSet ) { 391 // setUseValue( false ); 392 // } 393 394 // 5.1.7.0 (2010/06/01) SQLGET対応 395 if( CMD_SQL.equals( command ) || CMD_SET.equals( command ) || CMD_SQLGET.equals( command ) ) { 396 return EVAL_BODY_BUFFERED ; // Body を評価する 397 } 398 } 399 return SKIP_BODY ; // Body を評価しない 400 } 401 402 /** 403 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 404 * 405 * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。 406 * @og.rev 3.6.0.8 (2004/11/19) エラー発生時に確実にリリースされるように try finally 追加 407 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定 408 * @og.rev 4.0.0.0 (2005/01/31) lang ⇒ ResourceManager へ変更 409 * @og.rev 5.1.7.0 (2010/06/01) SQLGET対応 410 * @og.rev 5.1.7.0 (2010/06/01) XSS解除対応 411 * @og.rev 5.1.9.0 (2010/08/01) TransactionTag 対応。上位に TransactionTag があれば、そこからConnection をもらう。 412 * @og.rev 5.2.1.0 (2010/10/01) command="SET" action="APPEND"でvalueをbody部に書いた場合に動作しないバグを修正 413 * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更 414 * @og.rev 5.3.8.0 (2011/08/01) Transaction発生箇所でclose() 415 * @og.rev 6.3.6.1 (2015/08/28) Transaction でAutoCloseableを使用したtry-with-resources構築に対応。 416 * @og.rev 6.3.6.1 (2015/08/28) QueryFactory.close( Query ) 廃止。Queryはキャッシュしません。 417 * @og.rev 6.4.8.1 (2016/07/02) xssCheckを、doStartTag に移動 418 * @og.rev 8.0.2.0 (2021/11/30) 検索実行前に、SQL文字をdebugPrint出来るように修正 419 * 420 * @return 後続処理の指示(SKIP_BODY) 421 */ 422 @Override 423 public int doAfterBody() { 424 if( value == null || value.length() <= 0 ) { 425 // 5.1.7.0 (2010/06/01) XSS対策 426 427 value = getBodyString(); 428 // 5.2.1.0 (2010/10/01) 429 inValue = getBodyRawString(); 430 431 // 5.1.7.0 (2010/06/01) SQLGET対応 432 if( CMD_SQL.equals( command ) || CMD_SQLGET.equals( command ) ) { 433 // 6.3.6.1 (2015/08/28) Transaction でAutoCloseableを使用したtry-with-resources構築に対応。 434 try( Transaction tran = getTransaction() ) { 435 final Query query = QueryFactory.newInstance(); // 4.0.0 (2005/01/31) 436 value = value.trim(); 437 debugPrint( value ); // 8.0.2.0 (2021/11/30) 438 439 query.setConnection( tran.getConnection( dbid ) ); // 6.3.6.1 (2015/08/28) 440 query.setResourceManager( getResource() ); // 4.0.0 (2005/01/31) 441 query.setStatement( value ); 442 query.execute(); 443 444 table = query.getDBTableModel(); 445 tran.commit(); // 6.3.6.1 (2015/08/28) 446 } // 5.3.8.0 (2011/08/01) Transaction発生箇所でclose() (6.3.6.1 (2015/08/28) Transaction でAutoCloseableを使用) 447 } 448 } 449 450 return SKIP_BODY ; 451 } 452 453 /** 454 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 455 * 456 * @og.rev 3.1.0.1 (2003/03/26) DBTableModelの値をSET/GETできる command , action を追加。 457 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 458 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 459 * @og.rev 3.1.5.0 (2003/04/22) DBTableModel が存在するときのみ実行するロジックになっていたバグ対応。 460 * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得先の tblScope を追加。 461 * @og.rev 5.1.7.0 (2010/06/01) SQLGET対応 462 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 463 * 464 * @return 後続処理の指示 465 */ 466 @Override 467 public int doEndTag() { 468 debugPrint(); // 4.0.0 (2005/02/28) 469 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 470 if( useTag() ) { 471 if( check( command, COMMAND_SET ) ) { 472 if( CMD_SETTBL.equals( command ) || 473 CMD_GETTBL.equals( command ) || 474 CMD_KEYTBL.equals( command ) ) { 475 // table = (DBTableModel)getSessionAttribute( tableId ); 476 // 5.1.2.0 (2010/01/01) DBTableModel の取得先の tblScope を追加。 477 if( "session".equals( tblScope ) ) { table = (DBTableModel) getSessionAttribute( tableId ); } 478 else if( "request".equals( tblScope ) ) { table = (DBTableModel) getRequestAttribute( tableId ); } 479 else { 480 final String errMsg = "このスコープはサポートされていません。[" + tblScope + "]"; 481 throw new IllegalArgumentException( errMsg ); 482 } 483 } 484 } 485 486 commandExec( command ); 487 488 // 5.1.7.0 (2010/06/01) SQLGET対応 489 if( CMD_GET.equals( command ) || CMD_GETTBL.equals( command ) || CMD_SQLGET.equals( command ) ) { 490 if( value != null ) { jspPrint( value ); } 491 } 492 } 493 return EVAL_PAGE ; 494 } 495 496 /** 497 * タグリブオブジェクトをリリースします。 498 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 499 * 500 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 501 * @og.rev 3.1.0.1 (2003/03/26) DBTableModelの値をSET/GETできる command , action を追加。 502 * @og.rev 3.1.0.1 (2003/03/26) query 属性を削除します。 503 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 504 * @og.rev 3.2.4.0 (2003/06/12) マルチデータ(複数件検索)を使用するかしないか。 505 * @og.rev 3.5.4.0 (2003/11/25) inValue 変数の追加 506 * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値を、"DEFAULT" から null に変更 507 * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得先の tblScope を追加。 508 * @og.rev 5.1.7.0 (2010/06/01) XSS解除対応 509 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 510 * @og.rev 5.2.2.0 (2010/11/01) fromVal , toVal 属性 追加 511 * @og.rev 5.6.4.3 (2013/05/24) parameter 属性は、未使用なので削除 512 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加。action="ALL_xxx"を tmpSelectedAll="true" に置き換えます。 513 * @og.rev 6.8.4.1 (2017/12/18) skipVal 属性 追加 514 * @og.rev 5.10.4.0 (2018/10/03) CRYPT追加 515 * @og.rev 8.0.1.2 (2021/11/19) format 属性 追加 516 * @og.rev 8.4.2.0 (2023/03/03) HMCSV,FORTM,FORTM_LIST に、追い越し制御(useSkipOver)を追加する。 517 * 518 */ 519 @Override 520 protected void release2() { 521 super.release2(); 522 tableId = HybsSystem.TBL_MDL_KEY; 523 command = CMD_SET; 524 key = null; 525 value = null; 526 defaultVal = null; 527 action = null; 528 table = null; 529 dbid = null; 530 scope = "request"; // "request","session" 531 tblScope = "session"; // 5.1.2.0 (2010/01/01) DBTableModel の取得先のscope 532 separator = ","; 533 useMultiRows = false; 534 inValue = null; // 3.5.4.0 (2003/11/25) 535 xssCheck = HybsSystem.sysBool( "USE_XSS_CHECK" ); // 5.1.7.0 (2010/06/01) XSS解除対応 536 fromVal = null; // 5.2.2.0 (2010/11/01) 537 toVal = null; // 5.2.2.0 (2010/11/01) 538 skipVal = null; // 6.8.4.1 (2017/12/18) 539 useSkipOver = false; // 8.4.2.0 (2023/03/03) 追い越し制御(useSkipOver)を追加 540 format = null; // 8.0.1.2 (2021/11/19) 541 cryptKey = null; // 5.10.4.0 (2018/10/05) 542 tmpSelectedAll = false; // 5.6.4.3 (2013/05/24) 543 } 544 545 /** 546 * コマンドを実行します。 547 * 548 * コマンドは、HTMLから(get/post)指定されますので、CMD_xxx で設定される 549 * フィールド定数値のいづれかを、指定できます。 550 * コマンドを登録すると同時に、実行も行ないます。 551 * 552 * @og.rev 3.1.0.1 (2003/03/26) command に、SETTBL / GETTBL / KEYTBL / CLEAR を追加。 553 * @og.rev 3.1.0.1 (2003/03/26) query 属性を削除します。 554 * @og.rev 3.1.7.0 (2003/05/02) scope 属性を設定するタイミングを、早くする。 555 * @og.rev 3.7.1.0 (2005/04/15) command に、SETMEM を追加。 556 * @og.rev 5.1.7.0 (2010/06/01) SQLGET対応 557 * @og.rev 6.7.7.2 (2017/04/14) command に、DEBUG 追加 558 * @og.rev 8.0.0.0 (2021/07/09) action="ADD" の時は、valueのnull時にdefaultValを設定しない。 559 * 560 * @param command コマンド (public static final 宣言されている文字列) 561 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ValueTag.CMD_GET">コマンド定数</a> 562 */ 563 private void commandExec( final String command ) { 564 565 if( CMD_SQL.equals( command ) ) { 566 setSQLAttribute( table ); 567 } 568 else if( CMD_SQLGET.equals( command ) ) { 569 value = getSQLAttribute( table ); 570 } 571 else if( CMD_SET.equals( command ) ) { 572 // 8.0.0.0 (2021/07/09) action="ADD" の時は、valueのnull時にdefaultValを設定しない。 573 if( !ACT_ADD.equals( action ) ) { // つまり、ADD 以外は、設定する。 574 value = nval( value, defaultVal ); 575 } 576 setAttribute( key,value,action ); 577 } 578 else if( CMD_GET.equals( command ) ) { 579 value = getAttribute( key,action ); 580 } 581 else if( CMD_REMOVE.equals( command ) ) { 582 removeAttribute( key ); 583 } 584 else if( CMD_CLEAR.equals( command ) ) { 585 clearAttribute( key ); 586 } 587 else if( CMD_SETTBL.equals( command ) ) { 588 setTableAttribute( table,key,action ); 589 } 590 else if( CMD_GETTBL.equals( command ) ) { 591 value = getTableAttribute( table,key,action ); 592 } 593 else if( CMD_KEYTBL.equals( command ) ) { 594 setKeyTableAttribute( table,key,value,action ); 595 } 596 else if( CMD_SETMEM.equals( command ) ) { // 3.7.1.0 (2005/04/15) 597 // 8.0.0.0 (2021/07/09) action="ADD" の時は、valueのnull時にdefaultValを設定しない。 598 if( !ACT_ADD.equals( action ) ) { // つまり、ADD 以外は、設定する。 599 value = nval( value, defaultVal ); 600 } 601 setAttribute( key,value,action ); 602 setRequestCacheData( key,(String)getObject( key ) ); 603 } 604 else if( CMD_DEBUG.equals( command ) ) { 605 value = scopeAttributePrint(); // 6.7.7.2 (2017/04/14) 606 } 607 } 608 609 /** 610 * アクションを実行します。 611 * 612 * コマンドは action 属性で指定します。 613 * action コマンド が、 null の場合は、なにも実行しません。 614 * 615 * @og.rev 3.0.1.3 (2003/03/11) MESSAGE action を追加 616 * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処理する様に変更する。 617 * @og.rev 3.7.1.0 (2005/04/15) action に、DAY_WEEK を追加。 618 * @og.rev 3.7.1.1 (2005/05/23) action に、MERGE を追加。 619 * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel ) 620 * @og.rev 5.2.2.0 (2010/11/01) ACT_MERGE 時には、カンマで分解、separator で合成を行います。 621 * @og.rev 5.2.2.0 (2010/11/01) ACT_REPLACE 処理を新規追加します。 622 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。 623 * @og.rev 5.6.6.1 (2013/07/12) value が null の場合は、無視します。 624 * @og.rev 5.7.7.2 (2014/06/20) EXEC と CASE アクションを追加 625 * @og.rev 6.3.1.1 (2015/07/10) action="REPLACE" の、fromVal,toVal は、CSV形式で指定可能にする。 626 * @og.rev 6.3.1.1 (2015/07/10) action="ESCAPE" 追加 627 * @og.rev 6.3.5.0 (2015/08/08) action="ESCAPE" 追加 628 * @og.rev 6.3.9.0 (2015/11/06) 文字列配列を toString() する。 629 * @og.rev 6.4.1.2 (2016/01/22) TRIM アクションを追加。 630 * @og.rev 6.4.2.0 (2016/01/29) HybsDateUtil.getCalendar( String ) を直接利用するように修正します。 631 * @og.rev 5.9.6.3 (2016/02/18) MD5 アクションを追加 632 * @og.rev 6.7.4.0 (2017/02/10) TO_NUMBER アクションを追加 633 * @og.rev 6.8.4.1 (2017/12/18) HMCSV アクションを追加 634 * @og.rev 6.9.1.0 (2018/02/26) HMCSV アクションに、MAX,MIN,HMF を追加 635 * @og.rev 6.9.2.1 (2018/03/12) HybsDateUtil.getDateFormat の メソッド変更(引数の簡素化) 636 * @og.rev 6.9.7.0 (2018/05/14) URL_ENCODE,URL_ENCODE2,URL_DECODE を追加 637 * @og.rev 5.10.4.0 (2018/10/05) CRYPT追加 638 * @og.rev 7.2.6.0 (2020/06/30) INDEX_OF ,LASTINDEX_OF, LENGTH追加 639 * @og.rev 7.2.6.1 (2020/07/17) ACT_REQUEST追加 640 * @og.rev 7.3.0.0 (2021/01/06) JavaScriptエンジンをNashornからGraalJSに移行(ただし、未対応) 641 * @og.rev 7.3.0.0 (2021/01/06) ADDアクションを追加 642 * @og.rev 7.3.1.3 (2021/03/09) REPLACEアクションで、fromVal,toValの分割を、カンマ固定から、separator 使用に変更 643 * @og.rev 7.4.2.0 (2021/05/08) FORMAT追加 644 * @og.rev 8.0.1.2 (2021/11/19) TO_DATE,FORTM,FORTM_LIST追加 645 * @og.rev 8.1.2.0 (2022/03/10) ACT_MD5 を ACT_HASH に変更 646 * @og.rev 8.2.0.1 (2022/06/17) ACT_HMCSV アクションで、fromVal,toVal に日付指定を可能にする。 647 * @og.rev 8.4.2.0 (2023/03/03) HMCSV,FORTM,FORTM_LIST に、追い越し制御(useSkipOver)を追加する。 648 * 649 * @param action コマンド (public static final 宣言されている文字列) 650 * @param value 旧の値 651 * 652 * @return 処理後の値 653 */ 654 private String actionExec( final String action,final String value ) { 655 String rtn = value; 656 657 // 8.2.0.1 (2022/06/17) ACT_HMCSV アクションで、fromVal が null でなく、8桁以上(つまり時:分:秒 でなく年月日を含むケース) 658 final boolean hmCSVfrom = ACT_HMCSV.equals( action ) && fromVal != null && fromVal.length() > 8 ; 659 660 // 5.6.6.1 (2013/07/12) value が null の場合は、無視します。 661// if( action == null || value == null ) { return rtn; } 662 if( action == null || value == null && !hmCSVfrom ) { return rtn; } 663 664 if( ACT_UPPER.equals( action ) ) { 665 // Localeを共通管理するようになった場合、String.toUpperCase( Locale locale )使用の事 666 rtn = value.toUpperCase(Locale.JAPAN); 667 } 668 else if( ACT_LOWER.equals( action ) ) { 669 // Localeを共通管理するようになった場合、String.toLowerCase( Locale locale )使用の事 670 rtn = value.toLowerCase(Locale.JAPAN); 671 } 672 else if( ACT_MESSAGE.equals( action ) ) { 673 // 引数をメッセージリソースのキーとして、メッセージ変換する。 674 rtn = getResource().getLabel( value ); 675 } 676 else if( ACT_DAY_WEEK.equals( action ) ) { 677 // 日付型文字列(YYYYMMDD) の入力データを、開始日を月曜日にセットします。 678 // SUNDAY=1 , MONDAY=2 になります。月曜日との差だけ、前に戻します。 679 // 指定日が日曜日の場合は、次の日(月曜日)に進めます。 680 final Calendar ymd = HybsDateUtil.getCalendar( value ); // 6.4.2.0 (2016/01/29) 681 final int shu = ymd.get( Calendar.DAY_OF_WEEK ) - Calendar.MONDAY ; 682 683 if( shu != 0 ) { ymd.add( Calendar.DATE, -shu ); } 684 685 rtn = DateSet.getDate( ymd.getTimeInMillis() , "yyyyMMdd" ); // 5.5.7.2 (2012/10/09) HybsDateUtil を利用 686 } 687 // 3.7.1.1 (2005/05/23) 688 else if( ACT_MERGE.equals( action ) ) { 689 final Set<String> set = new LinkedHashSet<>(); 690 // 引数をカンマで文字列配列に分解します。 691 final String[] vals = StringUtil.csv2Array( value ); 692 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 693 for( final String str : vals ) { 694 if( str != null && str.length() > 0 ) { 695 set.add( str ); 696 } 697 } 698// final String[] str = StringUtil.csv2Array( value ); 699// for( int i=0; i<str.length; i++ ) { 700// if( str[i] != null && str[i].length() > 0 ) { 701// set.add( str[i] ); 702// } 703// } 704 705 // 分解後、マージ(Setで)されます。 登録順は、キープします。 706 rtn = StringUtil.iterator2line( set.iterator(),separator ); // 5.2.2.0 (2010/11/01) separator 使用 707 } 708 // 5.2.2.0 (2010/11/01) ACT_REPLACE 処理を新規追加 709 else if( ACT_REPLACE.equals( action ) ) { 710 // value.replaceAll( from, to ) という文法で処理します。 711 // 6.0.2.5 (2014/10/31) null でないことがわかっている値の冗長な null チェックがあります。 712 if( fromVal != null && toVal != null ) { 713 // 6.3.1.1 (2015/07/10) CSV形式可能にする。 714 if( fromVal.indexOf( ',' ) < 0 ) { 715 rtn = value.replaceAll( fromVal, toVal ); 716 } 717 else { 718// final String[] frmStr = fromVal.split( "," ); 719// final String[] toStr = toVal.split( "," ); 720 final String[] frmStr = fromVal.split( separator ); // 7.3.1.3 (2021/03/09) カンマ固定から、separator 使用に変更 721 final String[] toStr = toVal.split( separator ); // 7.3.1.3 (2021/03/09) カンマ固定から、separator 使用に変更 722 if( frmStr.length == toStr.length ) { 723 for( int i=0; i<frmStr.length; i++ ) { 724 rtn = rtn.replaceAll( frmStr[i], toStr[i] ); 725 } 726 } 727 else { 728// final String errMsg = "REPLACE時の fromValのカンマの数が、toValの数と一致しません。" 729 final String errMsg = "REPLACE時の fromValとtoValの数と一致しません。(separator=[" + separator + "])" + CR 730 // 6.3.9.0 (2015/11/06) 文字列配列を toString() する。 731 + " fromVal=[" + String.join( ",",frmStr ) + "] , toVal=[" + toVal + "] , value=[" + value + "]"; 732 throw new HybsSystemException( errMsg ); 733 } 734 } 735 } 736 } 737 // 5.2.2.0 (2010/11/01) SUBSTR 処理を新規追加 738 else if( ACT_SUBSTR.equals( action ) ) { 739 // value.substring( from, to ) という文法で処理します。 740 // 6.0.2.5 (2014/10/31) null でないことがわかっている値の冗長な null チェックがあります。 741 final int from = fromVal == null || fromVal.isEmpty() ? 0 : Integer.parseInt( fromVal ); // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses. 742 final int to = toVal == null || toVal.isEmpty() ? value.length() : Integer.parseInt( toVal ); // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses. 743 744 if( from >= value.length() ) { rtn = ""; } 745 else if( to > value.length() ) { rtn = value.substring( from ); } 746 else { 747 rtn = value.substring( from, to ); 748 } 749 } 750 // 7.2.6.0 (2020/06/30) INDEX_OF ,LASTINDEX_OF, LENGTH追加 751 else if( ACT_INDEX_OF.equals( action ) ) { 752 final int from = fromVal == null || fromVal.isEmpty() ? 0 : Integer.parseInt( fromVal ); 753 rtn = String.valueOf( value.indexOf( separator,from ) ); 754 } 755 // 7.2.6.0 (2020/06/30) INDEX_OF ,LASTINDEX_OF, LENGTH追加 756 else if( ACT_LASTINDEX_OF.equals( action ) ) { 757 final int to = toVal == null || toVal.isEmpty() ? value.length() : Integer.parseInt( toVal ); 758 rtn = String.valueOf( value.lastIndexOf( separator,to ) ); 759 } 760 // 7.2.6.0 (2020/06/30) INDEX_OF ,LASTINDEX_OF, LENGTH追加 761 else if( ACT_LENGTH.equals( action ) ) { 762 rtn = String.valueOf( value.length() ); 763 } 764 // 5.7.7.2 (2014/06/20) CASE 処理を新規追加 765 else if( ACT_CASE.equals( action ) ) { 766 // fromVal="A:1 B:2 C:3 D:4" 形式 767 if( fromVal != null && fromVal.length()>0 ) { 768 final String[] keys = StringUtil.csv2Array( fromVal , ' ' ); 769 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 770 for( final String fkey : keys ) { 771 final int idx = fkey.indexOf( ':' ); 772 if( idx >= 0 ) { // 分解した値にコロン(:)がなければ、パス 773 final String key = fkey.substring( 0,idx ); // 左辺(キー) 774 if( value.equalsIgnoreCase( key ) ) { 775 rtn = fkey.substring( idx+1 ); // 右辺(値) 776 break; 777 } 778 } 779 } 780// for( int i=0; i<keys.length; i++ ) { 781// final int idx = keys[i].indexOf( ':' ); 782// if( idx >= 0 ) { // 分解した値にコロン(:)がなければ、パス 783// final String key = keys[i].substring( 0,idx ); // 左辺(キー) 784// if( value.equalsIgnoreCase( key ) ) { 785// rtn = keys[i].substring( idx+1 ); // 右辺(値) 786// break; 787// } 788// } 789// } 790 } 791 } 792 // 5.7.7.2 (2014/06/20) EXEC 処理を新規追加 793 else if( ACT_EXEC.equals( action ) ) { 794// final ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName( "JavaScript" ); 795 ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName( "graal.js" ); // 7.3.0.0 (2021/01/06) 796 797 if( jsEngine == null ) { 798 jsEngine = new ScriptEngineManager().getEngineByName( "nashorn" ); // 7.3.0.0 (2021/01/06) 799 if( jsEngine == null ) { 800 final String errMsg = "ScriptEngine(Nashorn) は、廃止されました。" + CR 801 + " 別の方法に変更するか、GraalJSに移行してください。" + CR 802 + " command=" + command ; 803 throw new HybsSystemException( errMsg ); 804 } 805 } 806 807 try { 808 final Object obj = jsEngine.eval( value ); 809 rtn = String.valueOf( obj ); 810 } 811 catch( final ScriptException ex ) { 812 final String errMsg = "JavaScript式のパースに失敗しました。[" + value + "]"; 813 throw new HybsSystemException( errMsg , ex ); 814 } 815 } 816 // 7.3.0.0 (2021/01/06) ADDアクションを追加 817 else if( ACT_ADD.equals( action ) ) { 818 // defaultVal の 値と、(value またはBODY部の)値を、加算した結果をキー変数にセットします。 819 final int addVal = nval( defaultVal,0 ) + nval( value,0 ); 820 rtn = String.valueOf( addVal ); 821 } 822 // 6.3.5.0 (2015/08/08) action="ESCAPE" 追加 823 else if( ACT_ESCAPE.equals( action ) ) { 824 rtn = StringUtil.htmlFilter( value ); 825 } 826 // 6.9.7.0 (2018/05/14) action="URL_ENCODE" 追加 827 else if( ACT_ENCODE.equals( action ) ) { 828 rtn = StringUtil.urlEncode( value ); 829 } 830 // 6.9.7.0 (2018/05/14) action="URL_ENCODE" 追加 831 else if( ACT_ENCODE2.equals( action ) ) { 832 rtn = StringUtil.urlEncode2( value ); 833 } 834 // 6.9.7.0 (2018/05/14) action="URL_DECODE" 追加 835 else if( ACT_DECODE.equals( action ) ) { 836 rtn = StringUtil.urlDecode( value ); 837 } 838 // 6.4.1.2 (2016/01/22) TRIM アクションを追加。 839 else if( ACT_TRIM.equals( action ) ) { 840 rtn = value.trim(); 841 } 842 // 5.9.6.3 (2016/02/18) 8.1.2.0 (2022/03/10) Delete 843// else if( ACT_MD5.equals( action ) ){ 844// rtn = HybsCryptography.getMD5( value ); 845// } 846 // action="HASH" 追加 8.1.2.0 (2022/03/10) Add 847 else if( ACT_HASH.equals( action ) ){ 848 final String hash = format != null ? format : HASH_CODE ; 849 rtn = HybsCryptography.getHash( hash, value ); 850 } 851 852 // 6.7.4.0 (2017/02/10) 853 else if( ACT_TO_NUMBER.equals( action ) ){ 854 rtn = delChar( value , ch -> ( '-' == ch || '0'<=ch && ch<='9' ) ); 855 856 // final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 857 // for( int i=0; i<value.length(); i++ ) { 858 // final char ch = value.charAt( i ); 859 // if( '-' == ch || '0'<=ch && ch<='9' ) { 860 // buf.append( ch ); 861 // } 862 // } 863 // rtn = buf.toString(); 864 } 865 // 8.0.1.2 (2021/11/19) ACT_TO_NUMBER との違いは、マイナス記号も削除します。 866 else if( ACT_TO_DATE.equals( action ) ){ 867 rtn = delChar( value , ch -> ( '0'<=ch && ch<='9' ) ); 868 869// final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 870// for( int i=0; i<value.length(); i++ ) { 871// final char ch = value.charAt( i ); 872// if( '0'<=ch && ch<='9' ) { 873// buf.append( ch ); 874// } 875// } 876// rtn = buf.toString(); 877 } 878 // 6.8.4.1 (2017/12/18) 879 // 6.9.1.0 (2018/02/26) HMCSV アクションに、MAX,MIN,HMF を追加 880 // 8.2.0.1 (2022/06/17) ACT_HMCSV アクションで、fromVal,toVal に日付指定を可能にする。 881 else if( ACT_HMCSV.equals( action ) && fromVal != null && fromVal.length()>0 ) { 882 fromVal = delChar( fromVal , ch -> ( '0'<=ch && ch<='9' ) ); // フォーマットされていた場合の処理 883 toVal = delChar( toVal , ch -> ( '0'<=ch && ch<='9' ) ); // 884 885 // 8.2.0.1 (2022/06/17) ACT_HMCSV アクションで、fromVal が null でなく、8桁以上(つまり時:分:秒 でなく年月日を含むケース) 886 if( !hmCSVfrom ) { // 上記の否定形なので従来と同じ処理 887 final int fromNum = Integer.parseInt( fromVal ); 888 final int toNum = Integer.parseInt( toVal ); 889 890 // value には、基準となる日付データ 891 fromVal = HybsDateUtil.getDateFormat( "YMDHMS" , value, "HM" , fromNum ); 892 toVal = HybsDateUtil.getDateFormat( "YMDHMS" , value, "HM" , toNum ); // HM (時分形式の加算) 893 } 894 895 final Calendar stCal = HybsDateUtil.getCalendar( fromVal ); 896 final Calendar edCal = HybsDateUtil.getCalendar( toVal ); 897 898 final int field = Calendar.MINUTE ; // 加算するフィールド(単位は分) 899 final int amount = nval( skipVal , 60 ); // 初期値の間隔は、60分 900 if( useSkipOver ) { edCal.add( field, amount ); } // 8.4.2.0 (2023/03/03) 追い越して止める設定 901 902 final DateFormat ymdhms = new SimpleDateFormat( "yyyyMMddHHmmss",Locale.JAPAN ); 903 final DateFormat hmFmt = new SimpleDateFormat( "HH:mm",Locale.JAPAN ); 904 final DateFormat mdhmFmt = new SimpleDateFormat( "M/d HH:mm",Locale.JAPAN ); 905 906 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 907 final StringBuilder slbl = new StringBuilder( BUFFER_MIDDLE ); // 6.9.1.0 (2018/02/26) HMF を追加 908 909 int lastDay = 0; // 日付変更時のチェック用 910 while( stCal.before( edCal ) ) { 911 buf.append( ymdhms.format( stCal.getTime() ) ).append( separator ); 912 913 final int nowDay = stCal.get( Calendar.DATE ) ; 914 if( lastDay == nowDay ) { // 日付が同じ場合 915 slbl.append( hmFmt.format( stCal.getTime() ) ).append( separator ); 916 } 917 else { 918 slbl.append( mdhmFmt.format( stCal.getTime() ) ).append( separator ); 919 } 920 lastDay = nowDay; 921 stCal.add( field, amount ); 922 } 923 if( buf.length() > 0 ) { buf.setLength( buf.length()-separator.length()); } // 最後のseparatorを削除する。 8.2.0.1 (2022/06/17) 924 if( slbl.length() > 0 ) { slbl.setLength( slbl.length()-separator.length()); } // 最後のseparatorを削除する。 8.2.0.1 (2022/06/17) 925 rtn = buf.toString(); 926 927 // MAX,MIN を追加 928 setObject( "MIN." + key , fromVal ); 929 setObject( "MAX." + key , toVal ); 930 setObject( "HMF." + key , slbl.toString() ); 931 } 932 // 6.9.1.0 (2018/02/26) HMCSV アクションで、from~to ではないケース 933 // 6.9.8.0 (2018/05/28) FindBugs:null でないことがわかっている値の冗長な null チェック 934 else if( ACT_HMCSV.equals( action ) && value.contains( "," ) ){ // valueは、nullチェック済み 935 final String[] ymdhms = StringUtil.csv2Array( value ); 936 937 final StringBuilder slbl = new StringBuilder( BUFFER_MIDDLE ); // 6.9.1.0 (2018/02/26) HMF を追加 938 939// String lastS = ymdhms[0].substring( 0,8 ); // 日付部分の比較のための変数 940 String lastS = ""; // 8.2.0.1 (2022/06/17) 日付部分の比較のための変数(初回は空文字列) 941 for( final String timeS : ymdhms ) { 942 final String nowS = timeS.substring( 0,8 ); 943 if( lastS.equals( nowS ) ) { // 日付が同じ場合 944 slbl.append( HybsDateUtil.getDateFormat( "HMF",timeS ) ).append( separator ); // 6.9.2.1 (2018/03/12) 945 } 946 else { 947 slbl.append( HybsDateUtil.getDateFormat( "M/d HH:mm",timeS ) ).append( separator ); // 6.9.2.1 (2018/03/12) 948 } 949 lastS = nowS; // 日付部分の比較のための変数(前回の日付) 950 } 951 if( slbl.length() > 0 ) { slbl.setLength( slbl.length()-separator.length()); } // 最後のseparatorを削除する。 8.2.0.1 (2022/06/17) 952 953 rtn = value; // 元のvalue のまま、返します。 954 955 // 6.9.1.0 (2018/02/26) MAX,MIN を追加 956 setObject( "MIN." + key , ymdhms[0] ); 957 setObject( "MAX." + key , ymdhms[ymdhms.length-1] ); 958 setObject( "HMF." + key , slbl.toString() ); 959 } 960 // 5.10.4.0 (2018/10/05) 961 else if( ACT_CRYPT_ENC.equals( action ) ) { 962 final HybsCryptography hc = new HybsCryptography(cryptKey); 963 rtn = hc.encrypt( value ); 964 } 965 else if( ACT_CRYPT_DEC.equals( action ) ) { 966 final HybsCryptography hc = new HybsCryptography(cryptKey); 967 rtn = hc.decrypt( value ); 968 } 969 // 7.2.6.1 (2020/07/17) 970 else if( ACT_REQUEST.equals( action ) ) { 971 rtn = getRequestParameter( value ); // setValue で変換された結果を、変換します。 972 } 973 // 7.4.2.0 (2021/05/08) FORMAT追加 974// else if( ACT_FORMAT.equals( action ) ) { 975 else if( ACT_FORMAT.equals( action ) && format != null ) { // 8.0.1.2 (2021/11/19) fromVal → format に変更 976 try { 977 final int val = Integer.parseInt(value); 978// rtn = String.format(fromVal, val); 979 rtn = String.format(format, val); // 8.0.1.2 (2021/11/19) 980 } 981 catch( final NumberFormatException ex ) { 982 final String errMsg = "value が数値ではありません。 value=[" + value + "]" ; 983 throw new HybsSystemException( errMsg ); 984 } 985 } 986 987 return rtn; 988 } 989 990 /** 991 * 指定の文字列から、特定のキャラクタを削除します。 992 * 993 * @og.rev 8.0.1.2 (2021/11/19) 新規追加 994 * 995 * @param org キャラクタを削除するオリジナルの文字列 996 * @param isOmit キャラクタ削除の判定処理(Predicate) 997 */ 998 private String delChar( final String org , final Predicate<Character> isOmit ) { 999 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 1000 for( int i=0; i<org.length(); i++ ) { 1001 final char ch = org.charAt( i ); 1002 if( isOmit.test( ch ) ) { 1003 buf.append( ch ); 1004 } 1005 } 1006 return buf.toString(); 1007 } 1008 1009 /** 1010 * 指定のスコープの内部キャッシュ情報を、キーで登録します。 1011 * 1012 * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処理する様に変更する。 1013 * @og.rev 3.5.4.0 (2003/11/25) APPENDアクションを有効にします。 1014 * @og.rev 3.5.6.5 (2004/08/09) APPEND時のセパレータを外部指定の変数を使用 1015 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 1016 * @og.rev 5.2.2.0 (2010/11/01) ACT_SPLIT 追加 1017 * @og.rev 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追加 1018 * @og.rev 5.6.6.1 (2013/07/12) value が null の場合は、無視します。 1019 * @og.rev 7.3.1.1 (2021/02/25) ACT_SPLIT_LIST,ACT_FOR,ACT_FOR_LIST 追加 1020 * @og.rev 8.0.1.2 (2021/11/19) ACT_TO_DATE,ACT_FORTM,ACT_FORTM_LIST 追加 1021 * @og.rev 8.4.2.0 (2023/03/03) HMCSV,FORTM,FORTM_LIST に、追い越し制御(useSkipOver)を追加する。 1022 * 1023 * @param key キー 1024 * @param value 値 1025 * @param action アクション 1026 */ 1027 private void setAttribute( final String key,final String value,final String action ) { 1028 if( key == null || key.isEmpty() ) { 1029 final String errMsg = "key がセットされていません。" 1030 + " command=" + command + " , action=" + action 1031 + " , value=" + value ; // 5.1.8.0 (2010/07/01) errMsg 修正 1032 throw new HybsSystemException( errMsg ); 1033 } 1034 1035 // 7.3.1.1 (2021/02/25) ACT_FOR,ACT_FOR_LIST 追加 1036// final boolean useFor = ACT_FOR.equals( action ) || ACT_FOR_LIST.equals( action ) ; 1037 // 8.0.1.2 (2021/11/19) ACT_FORTM,ACT_FORTM_LIST 追加 1038 final boolean useFor = ACT_FOR.equals( action ) || ACT_FOR_LIST.equals( action ) || ACT_FORTM.equals( action ) || ACT_FORTM_LIST.equals( action ) ; 1039 // 8.2.0.1 (2022/06/17) ACT_HMCSV アクションも追加 1040 final boolean useHmcsv = ACT_HMCSV.equals( action ) ; 1041 1042 // 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 1043 // 5.6.6.1 (2013/07/12) value が null の場合は、無視します。 1044 // 6.4.1.1 (2016/01/16) PMD refactoring. Avoid if (x != y) ..; else ..; 1045// if( value == null ) { 1046// if( value == null && !useFor ) { // 7.3.1.1 (2021/02/25) ACT_FOR,ACT_FOR_LIST は、value 未指定も可能 1047 if( value == null && !useFor && !useHmcsv ) { // 8.2.0.1 (2022/06/17) ACT_HMCSV アクションも追加 1048 setObject( key, null ); // 5.6.6.1 (2013/07/12) value が null の場合 1049 } 1050 else { 1051 if( ACT_APPEND.equals( action ) ) { 1052 final String[] array = getRequestParameterValues( inValue ); 1053 setObject( key, StringUtil.array2line( array,separator ) ); 1054 } 1055 // 5.2.2.0 (2010/11/01) ACT_SPLIT 追加 1056 else if( ACT_SPLIT.equals( action ) ) { 1057 final String[] array = value.split( separator ); 1058 setObject( key , array[0] ); // キー自体には、分割時の先頭の文字列を設定しておく。 1059 for( int i=0; i<array.length; i++ ) { 1060 setObject( key + i , array[i] ); 1061 } 1062 } 1063 // 7.3.1.1 (2021/02/25) ACT_SPLIT_LIST 追加 1064 else if( ACT_SPLIT_LIST.equals( action ) ) { 1065 final String[] array = value.split( separator ); 1066 final List<String> list = Arrays.asList( array ); 1067 setObject( key , list ); 1068 } 1069 1070 // 7.3.1.1 (2021/02/25) ACT_FOR,ACT_FOR_LIST 追加 1071 else if( ACT_FOR.equals( action ) || ACT_FOR_LIST.equals( action ) ) { 1072 final String valKey = value == null ? "" : value ; 1073 1074 final String stStr = nval( fromVal , "0" ); 1075 final String edStr = nval( toVal , "10" ); 1076 final String stpStr = nval( skipVal , "1" ); 1077 1078 final int start = Integer.parseInt( stStr ); 1079 final int end = Integer.parseInt( edStr ); 1080 final int step = Integer.parseInt( stpStr ); 1081 1082 // 8.0.1.2 (2021/11/19) format属性追加に伴い、format指定を優先させる。 1083 if( format == null ) { 1084 // ゼロ埋めフォーマットを判定する。 1085 final int len = stStr.length(); 1086// final String numFmt = len>1 && stStr.charAt(0) == '0' ? "%0" + len + "d" : "%d" ; 1087 format = len>1 && stStr.charAt(0) == '0' ? "%0" + len + "d" : "%d" ; 1088 } 1089 1090 if( ACT_FOR.equals( action ) ) { // ACT_FOR 1091 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 1092 for( int val=start; val<=end; val+=step ) { // 終了は、endを含む 1093// final String val2 = String.format( numFmt , val ); 1094 final String val2 = String.format( format , val ); // 8.0.1.2 (2021/11/19) format属性追加 1095 buf.append( valKey ).append( val2 ).append( separator ); 1096 } 1097// if( buf.length() > 0 ) { buf.setLength( buf.length()-1); } // 最後のseparatorを削除する。 1098 if( buf.length() > 0 ) { buf.setLength( buf.length()-separator.length()); } // 最後のseparatorを削除する。 8.2.0.1 (2022/06/17) 1099 1100 setObject( key , buf.toString() ); 1101 } 1102 else { // ACT_FOR_LIST 1103 final List<String> list = new ArrayList<>(); 1104 for( int val=start; val<=end; val+=step ) { // 終了は、endを含む 1105// final String val2 = String.format( numFmt , val ); 1106 final String val2 = String.format( format , val ); // 8.0.1.2 (2021/11/19) format属性追加 1107 list.add( valKey + val2 ); 1108 } 1109 1110 setObject( key , list ); 1111 } 1112 } 1113 // 8.0.1.2 (2021/11/19) ACT_FORTM,ACT_FORTM_LIST 追加 1114 else if( ACT_FORTM.equals( action ) || ACT_FORTM_LIST.equals( action ) ) { 1115 // FORTM,FORTM_LIST では、fromVal,toVal は、必須になる。 1116 if( StringUtil.isNull(fromVal,toVal) ) { 1117 final String errMsg = "fromVal,toVal は必須です。" 1118 + " command=" + command + " , action=" + action; 1119 throw new HybsSystemException( errMsg ); 1120 } 1121 1122 fromVal = delChar( fromVal , ch -> ( '0'<=ch && ch<='9' ) ); // フォーマットされていた場合の処理 1123 toVal = delChar( toVal , ch -> ( '0'<=ch && ch<='9' ) ); // 1124 1125 final Calendar stCal = HybsDateUtil.getCalendar( fromVal ); 1126 final Calendar edCal = HybsDateUtil.getCalendar( toVal ); 1127 1128 final String stpStr = nval( skipVal , "1" ); // null や、"M" などがあり得るため 1129 final int field = "M".equals( stpStr ) ? Calendar.MONTH : Calendar.DATE ; // 加算するフィールド 1130 final int amount= "M".equals( stpStr ) ? 1 : Integer.parseInt( stpStr ); // 追加量 1131 if( useSkipOver ) { edCal.add( field, amount ); } // 8.4.2.0 (2023/03/03) 追い越して止める設定 1132 1133 if( StringUtil.isNull( format) ) { 1134 format = YMDHMS.substring( 0,fromVal.length() ) ; // format の初期値は、開始日付の長さ 1135 } 1136 final DateFormat formatter = new SimpleDateFormat( format,Locale.JAPAN ); 1137 1138 if( ACT_FORTM.equals( action ) ) { // ACT_FORTM 1139 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 1140 while( stCal.before( edCal ) ) { 1141 buf.append( formatter.format( stCal.getTime() ) ).append( separator ); 1142 stCal.add( field, amount ); 1143 } 1144// if( buf.length() > 0 ) { buf.setLength( buf.length()-1); } // 最後のseparatorを削除する。 1145 if( buf.length() > 0 ) { buf.setLength( buf.length()-separator.length()); } // 最後のseparatorを削除する。 8.2.0.1 (2022/06/17) 1146 1147 setObject( key , buf.toString() ); 1148 } 1149 else { // ACT_FORTM_LIST 1150 final List<String> list = new ArrayList<>(); 1151 while( stCal.before( edCal ) ) { 1152 list.add( formatter.format( stCal.getTime() ) ); 1153 stCal.add( field, amount ); 1154 } 1155 1156 setObject( key , list ); 1157 } 1158 } 1159 // 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追加 1160 else if( ACT_MAX_MIN.equals( action ) ) { 1161 final String[] array = value.split( separator ); 1162 1163 // command="SET" では、数字型としてのみ処理します。 1164 double minNum = Double.MAX_VALUE ; 1165 double maxNum = Double.MIN_VALUE ; 1166 double sumNum = 0d ; 1167 int cntSum = 0; // 平均計算に有効な件数 1168 1169 for( int i=0; i<array.length; i++ ) { 1170 final String val = array[i].trim().replaceAll( ",","" ); // 数字型フォーマットのカンマを取り除く 1171 if( val.isEmpty() ) { continue; } // ゼロ文字列の場合は、取り直し 1172 1173 final double tmp = Double.parseDouble( val ); 1174 if( minNum > tmp ) { minNum = tmp; } 1175 if( maxNum < tmp ) { maxNum = tmp; } 1176 sumNum += tmp ; cntSum++ ; 1177 } 1178 1179 // command="SET" の場合は、数字型の場合のみ使用します。 1180 if( cntSum > 0 ) { 1181 final NumberFormat nf = NumberFormat.getInstance(); 1182 nf.setGroupingUsed( false ); // カンマ編集なし 1183 nf.setMaximumFractionDigits(2); // 最大小数部は2桁 1184 nf.setMinimumFractionDigits(0); // できれば、整数表示 1185 1186 setObject( "MIN." + key,nf.format( minNum ) ); // Double.toString( minNum ) の代わり。 1187 setObject( "MAX." + key,nf.format( maxNum ) ); 1188 setObject( "SUM." + key,nf.format( sumNum ) ); 1189 setObject( "AVG." + key,nf.format( sumNum/cntSum ) ); 1190 } 1191 else { 1192 setObject( "MIN." + key,nval( defaultVal , "" ) ); 1193 setObject( "MAX." + key,nval( defaultVal , "" ) ); 1194 setObject( "SUM." + key,nval( defaultVal , "" ) ); 1195 setObject( "AVG." + key,nval( defaultVal , "" ) ); 1196 } 1197 } 1198 else { 1199 setObject( key, actionExec( action,value ) ); 1200 } 1201 } 1202 } 1203 1204 /** 1205 * 指定のスコープの内部キャッシュ情報を、キーで取得します。 1206 * 1207 * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処理する様に変更する。 1208 * 1209 * @param key キー 1210 * @param action アクション 1211 * 1212 * @return キーに対する内部キャッシュ情報 1213 */ 1214 private String getAttribute( final String key,final String action ) { 1215 if( key == null || key.isEmpty() ) { 1216 final String errMsg = "key がセットされていません。" 1217 + " command=" + command + " , action=" + action; // 5.1.8.0 (2010/07/01) errMsg 修正 1218 throw new HybsSystemException( errMsg ); 1219 } 1220 1221 String rtn = defaultVal; 1222 final Object obj = pageContext.findAttribute( key ); 1223 if( obj != null ) { rtn = obj.toString(); } 1224 1225 return actionExec( action,rtn ); 1226 } 1227 1228 /** 1229 * 指定のスコープの内部キャッシュ情報を削除します。 1230 * 1231 * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処理する様に変更する。 1232 * 1233 * @param key キー 1234 */ 1235 private void removeAttribute( final String key ) { 1236 if( key == null || key.isEmpty() ) { 1237 final String errMsg = "key がセットされていません。" 1238 + " command=" + command ; // 5.1.8.0 (2010/07/01) errMsg 修正 1239 throw new HybsSystemException( errMsg ); 1240 } 1241 removeObject( key ); 1242 } 1243 1244 /** 1245 * セッション/アプリケーションスコープのキャッシュ情報をクリアします。 1246 * 1247 * このクリアは、キーの前方一致で、大文字小文字の区別をせずにクリアします。 1248 * また、キーが null の場合は、"X_" で始めるもの以外のすべての値をクリアします。 1249 * また、Webエンジン内部で使用しているキーは、ここではクリアできません。 1250 * 1251 * @og.rev 3.1.0.1 (2003/03/26) クリアコマンドの追加。 1252 * @og.rev 4.3.4.0 (2008/12/01) PageContextのスコープをクラス変数としてアクセス 1253 * 1254 * @param key キー 1255 */ 1256 private void clearAttribute( final String key ) { 1257 1258 String lowKey = null; 1259 if( key != null ) { lowKey = key.toLowerCase(Locale.JAPAN); } 1260 1261 Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.APPLICATION_SCOPE ); // 4.3.3.6 (2008/11/15) Generics警告対応 1262 while( ekeys.hasMoreElements() ) { 1263 final String ekey = ekeys.nextElement().toLowerCase(Locale.JAPAN); // 4.3.3.6 (2008/11/15) Generics警告対応 1264 if( ! ekey.startsWith( "h_") && ! ekey.startsWith( "x_") && // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 1265 ( lowKey == null || ekey.startsWith( key ) ) ) { 1266 pageContext.removeAttribute( ekey, PageContext.APPLICATION_SCOPE ) ; 1267 } 1268 } 1269 1270 ekeys = pageContext.getAttributeNamesInScope( PageContext.SESSION_SCOPE ); 1271 while( ekeys.hasMoreElements() ) { 1272 final String ekey = String.valueOf( ekeys.nextElement() ).toLowerCase(Locale.JAPAN); 1273 if( ! ekey.startsWith( "h_") && ! ekey.startsWith( "x_") && // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 1274 ( lowKey == null || ekey.startsWith( key ) ) ) { 1275 pageContext.removeAttribute( ekey, PageContext.SESSION_SCOPE ) ; 1276 } 1277 } 1278 } 1279 1280 /** 1281 * 指定のスコープの内部キャッシュ情報を、指定のSQL文より作成します。 1282 * 1283 * @og.rev 3.1.0.1 (2003/03/26) 引数を与えて処理する様に変更する。 1284 * @og.rev 3.2.4.0 (2003/06/12) マルチデータ(複数件検索)を使用するかしないか。 1285 * @og.rev 3.8.6.0 (2006/08/07) nullSet="true"(初期値)の時は、検索結果がゼロ件時に "" をセットする。 1286 * @og.rev 3.8.9.2 (2007/07/28) action="ROW_APPEND" 追加 1287 * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追加 1288 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 1289 * @og.rev 5.5.0.3 (2012/03/12) ACT_MAP アクションの追加 1290 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加。action="ALL_xxx"を tmpSelectedAll="true" に置き換えます。 1291 * @og.rev 6.2.4.2 (2015/05/29) ACT_MAPOBJ アクションの追加 1292 * @og.rev 6.2.6.0 (2015/06/19) キーの判定に、isEmpty() が漏れていた。 1293 * @og.rev 6.4.2.1 (2016/02/05) ACT_MAPOBJ アクションのMapを、TreeMap から LinkedHashMap に変更。 1294 * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。 1295 * @og.rev 6.9.0.2 (2018/02/13) ACT_MAP,(ACT_ALL_MAP) で、第3カラム以降も、キー + '_番号(1~)' で、キーを作成します。 1296 * @og.rev 7.2.6.1 (2020/07/17) ACT_REQUEST追加 1297 * @og.rev 7.3.1.1 (2021/02/25) LIST アクションを、ArrayListからListに変更。 1298 * @og.rev 8.1.0.1 (2022/01/07) ACT_LIST_CSV、ACT_ALL_LIST_CSV,ACT_SET,ACT_ALL_SET,ACT_SET_CSV,ACT_ALL_SET_CSV アクションの追加 1299 * 1300 * @param table DBTableModelオブジェクト 1301 */ 1302 private void setSQLAttribute( final DBTableModel table ) { 1303 if( table == null ) { // 3.8.6.0 (2006/08/07) 1304 return; 1305 } 1306 1307 final int clmCnt = table.getColumnCount(); 1308 final int rowCnt = table.getRowCount(); 1309 String sqlkey ; 1310 String sqlval ; 1311 String sufix = ""; 1312 1313 if( ACT_ROW_APPEND.equals( action ) ) { 1314 final OgBuilder buf = new OgBuilder(); 1315 for( int clmNo=0; clmNo<clmCnt; clmNo++ ) { 1316 // 6.4.4.2 (2016/04/01) 1317 final int clm = clmNo; // ラムダ式の引数に使えるのは、final変数のみ。 1318 buf.clear(); 1319 buf.appendRoop( 0,rowCnt,separator 1320 , row -> table.getValue( row, clm ) ); 1321 sqlkey = table.getColumnName( clm ); 1322 setObject( sqlkey , buf.toString() ); 1323 } 1324 } 1325 // 4.3.7.5 (2009/07/13) ACT_LIST,ACT_LIST_CSV,ACT_ALL_LIST,ACT_ALL_LIST_CSV アクションの追加 1326 // 8.1.0.1 (2022/01/07) ACT_LIST_CSV,ACT_ALL_LIST_CSV 追加 1327// else if( ACT_LIST.equals( action ) ) { 1328 else if( ACT_LIST.equals( action ) || ACT_LIST_CSV.equals( action ) ) { 1329 final boolean useCSV = ACT_LIST_CSV.equals( action ); 1330 for( int clm=0; clm<clmCnt; clm++ ) { 1331// final ArrayList<String> list = new ArrayList<>(); 1332 final List<String> list = new ArrayList<>(); // 7.3.1.1 (2021/02/25) 1333 for( int row=0; row<rowCnt; row++ ) { 1334 sqlval = table.getValue( row, clm ); 1335 list.add( sqlval ); 1336 } 1337 sqlkey = table.getColumnName( clm ); 1338// setObject( sqlkey , list ); 1339 if( useCSV ) { 1340 final String csv = list.stream().collect(Collectors.joining(",")); 1341 setObject( sqlkey,csv ); 1342 } 1343 else { 1344 setObject( sqlkey,list ); 1345 } 1346 } 1347 } 1348 // 8.1.0.1 (2022/01/07) ACT_SET,ACT_ALL_SET,ACT_SET_CSV,ACT_ALL_SET_CSV アクションの追加 1349 else if( ACT_SET.equals( action ) || ACT_SET_CSV.equals( action ) ) { 1350 final boolean useCSV = ACT_SET_CSV.equals( action ); 1351 for( int clm=0; clm<clmCnt; clm++ ) { 1352 final Set<String> set = new LinkedHashSet<>(); 1353 for( int row=0; row<rowCnt; row++ ) { 1354 sqlval = table.getValue( row, clm ); 1355 set.add( sqlval ); 1356 } 1357 sqlkey = table.getColumnName( clm ); 1358// setObject( sqlkey , set ); 1359 if( useCSV ) { 1360 final String csv = set.stream().collect(Collectors.joining(",")); 1361 setObject( sqlkey , csv ); 1362 } 1363 else { 1364 setObject( sqlkey , set ); 1365 } 1366 } 1367 } 1368 // 5.5.0.3 (2012/03/12) ACT_MAP アクションの追加 1369 else if( ACT_MAP.equals( action ) ) { 1370 if( clmCnt < 2 ) { 1371 final String errMsg = "action=MAP 時には、カラムは、2つ以上必要です。カラム数=[" + clmCnt + "]"; 1372 throw new IllegalArgumentException( errMsg ); 1373 } 1374 for( int row=0; row<rowCnt; row++ ) { 1375 sqlkey = table.getValue( row, 0 ); // 0番目カラムがキー 1376 sqlval = table.getValue( row, 1 ); // 1番目カラムが値 1377 setObject( sqlkey , sqlval ); 1378 1379 // 6.9.0.2 (2018/02/13) ACT_MAP,(ACT_ALL_MAP) で、第3カラム以降も、キー + '_番号(1~)' で、キーを作成します。 1380 for( int clm=2; clm<clmCnt; clm++ ) { 1381 final String keyN = sqlkey + "_" + (clm-1); // 第3カラムは、キー + '_1' になります。 1382 sqlval = table.getValue( row, clm ); // N番目カラムの値 1383 setObject( keyN , sqlval ); 1384 } 1385 } 1386 } 1387 // 6.2.4.2 (2015/05/29) ACT_MAPOBJ アクションの追加 1388 else if( ACT_MAPOBJ.equals( action ) ) { 1389 if( clmCnt < 2 ) { 1390 final String errMsg = "action=MAPOBJ 時には、カラムは、2つ以上必要です。カラム数=[" + clmCnt + "]"; 1391 throw new IllegalArgumentException( errMsg ); 1392 } 1393 if( key == null || key.isEmpty() ) { // 6.2.6.0 (2015/06/19) 1394 key = table.getColumnName( 0 ); // key が指定されていない場合は、最初のカラム名 1395 } 1396 final Map<String,String> mapObj = new LinkedHashMap<>(); // 6.4.2.1 (2016/02/05) 1397 1398 for( int row=0; row<rowCnt; row++ ) { 1399 sqlkey = table.getValue( row, 0 ); // 0番目カラムがMapのキー 1400 sqlval = table.getValue( row, 1 ); // 1番目カラムがMapの値 1401 mapObj.put( sqlkey,sqlval ); 1402 } 1403 setObject( key , mapObj ); 1404 } 1405 // 7.2.6.1 (2020/07/17) SQL処理なので、ループで判断させずにactionで分けておきます。 1406 else if( ACT_REQUEST.equals( action ) ) { 1407 for( int row=0; row<rowCnt; row++ ) { 1408 if( useMultiRows ) { sufix = String.valueOf( row ) ; } 1409 for( int clm=0; clm<clmCnt; clm++ ) { 1410 sqlkey = table.getColumnName( clm ); 1411 sqlval = table.getValue( row, clm ); 1412 sqlval = getRequestParameter( sqlval ); // SQLで取得した値を、変換します。 1413 setObject( sqlkey + sufix, sqlval ); 1414 } 1415 if( ! useMultiRows ) { break; } 1416 } 1417 } 1418 else { 1419 // 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 1420 if( rowCnt == 0 ) { 1421 if( useMultiRows ) { sufix = "0" ; } 1422 for( int clm=0; clm<clmCnt; clm++ ) { 1423 sqlkey = table.getColumnName( clm ); 1424 sqlval = ""; 1425 setObject( sqlkey + sufix, sqlval ); 1426 } 1427 } 1428 else { 1429 for( int row=0; row<rowCnt; row++ ) { 1430 if( useMultiRows ) { sufix = String.valueOf( row ) ; } 1431 for( int clm=0; clm<clmCnt; clm++ ) { 1432 sqlkey = table.getColumnName( clm ); 1433 sqlval = table.getValue( row, clm ); 1434 setObject( sqlkey + sufix, sqlval ); 1435 } 1436 if( ! useMultiRows ) { break; } 1437 } 1438 } 1439 } 1440 } 1441 1442 /** 1443 * 指定のSQL文の結果を文字列として画面に出力します。 1444 * 画面に出力される項目は、1項目だけで2項目以降は無視されます。 1445 * 1446 * @og.rev 5.1.7.0 (2010/06/01) SQLGET対応 1447 * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。 1448 * 1449 * @param table DBTableModelオブジェクト 1450 * 1451 * @return SQL文の結果文字列 1452 */ 1453 private String getSQLAttribute( final DBTableModel table ) { 1454 if( table == null ) { // 3.8.6.0 (2006/08/07) 1455 return ""; 1456 } 1457 1458 final int rowCnt = table.getRowCount(); 1459 final String rtn; 1460 if( ACT_ROW_APPEND.equals( action ) ) { 1461 // 6.4.4.2 (2016/04/01) 1462 rtn = new OgBuilder() 1463 .appendRoop( 0,rowCnt,separator 1464 , row -> table.getValue( row, 0 ) ) 1465 .toString(); 1466 } 1467 else if( rowCnt == 0 ) { 1468 rtn = ""; 1469 } 1470 else { 1471 rtn = table.getValue( 0, 0 ); 1472 } 1473 1474 return rtn; 1475 } 1476 1477 /** 1478 * 指定のスコープの内部キャッシュ情報に、DBTableModel の選択された値を登録します。 1479 * 1480 * 複数選択行が存在する場合は、先頭行を処理します。ただし、action="APPEND"の 1481 * 場合は、separator属性で指定された文字を使用して、連結します。 1482 * 1483 * @og.rev 3.1.0.1 (2003/03/26) 新規作成 1484 * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時の処理変更 1485 * @og.rev 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追加 1486 * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追加 1487 * @og.rev 5.1.6.0 (2010/05/01) ALL_APPENDで選択行がない場合に処理されないバグを修正 1488 * @og.rev 5.5.0.3 (2012/03/12) ACT_MAP アクションの追加 1489 * @og.rev 5.6.4.3 (2013/05/24) ACT_MAX_MIN,ACT_ALL_MAX_MIN アクションの追加 1490 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加。action="ALL_xxx"を tmpSelectedAll="true" に置き換えます。 1491 * @og.rev 6.2.4.2 (2015/05/29) ACT_MAPOBJ アクションの追加 1492 * @og.rev 6.4.2.1 (2016/02/05) ACT_MAPOBJ アクションのMapを、TreeMap から LinkedHashMap に変更。 1493 * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。 1494 * @og.rev 6.4.4.2 (2016/04/01) contains 判定を行う新しいメソッドを使用します。 1495 * @og.rev 6.4.6.0 (2016/05/27) isNumber , isDate 追加。 1496 * @og.rev 7.3.1.1 (2021/02/25) LIST アクションを、ArrayListからListに変更。 1497 * @og.rev 8.1.0.1 (2022/01/07) ACT_LIST_CSV、ACT_ALL_LIST_CSV,ACT_SET,ACT_ALL_SET,ACT_SET_CSV,ACT_ALL_SET_CSV アクションの追加 1498 * 1499 * @param table DBTableModelオブジェクト 1500 * @param key キー 1501 * @param action アクション 1502 */ 1503 private void setTableAttribute( final DBTableModel table,final String key,final String action ) { 1504 if( table == null || table.getRowCount() == 0 || table.getColumnCount() == 0 ) { return ; } 1505 1506 final int[] rowNo = getParameterRows(); 1507 // 5.1.6.0 (2010/05/01) 1508 if( rowNo.length == 0 ) { return; } // 5.6.4.3 (2013/05/24) tmpSelectedAll 属性を追加したので、0件判定が使える。 1509 1510 final String[] keys ; 1511 if( key == null || key.isEmpty() ) { 1512 keys = table.getNames(); 1513 } 1514 else if( key.indexOf( ',' ) >= 0 ) { 1515 keys = StringUtil.csv2Array( key , ',' ); // 8.1.0.1 (2022/01/07) キーをカンマ区切りで渡せるようにする。 1516 } 1517 else { 1518 keys = new String[] { key } ; 1519 } 1520 1521 // 5.6.4.3 (2013/05/24) tmpSelectedAll で、ロジックの共通化 1522 if( ACT_APPEND.equals( action ) ) { 1523 final OgBuilder buf = new OgBuilder(); 1524 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1525 for( final String ky : keys ) { 1526 final int clm = table.getColumnNo( ky ); 1527// for( int i=0; i<keys.length; i++ ) { 1528// final int clm = table.getColumnNo( keys[i] ); 1529 // 6.4.4.2 (2016/04/01) 1530 buf.clear(); 1531 buf.appendRoop( 0,rowNo.length,separator 1532 , j -> table.getValue( rowNo[j],clm ) ); 1533 setObject( ky,buf.toString() ); 1534// setObject( keys[i],buf.toString() ); 1535 } 1536 } 1537 1538 // 5.5.0.3 (2012/03/12) ACT_MAP アクションの追加 1539 else if( ACT_MAP.equals( action ) ) { 1540 int keyClm = table.getColumnNo( key ,false ); 1541 int valClm = table.getColumnNo( value ,false ); 1542 1543 if( keyClm < 0 ) { keyClm = 0; } // キーとなるカラムが指定されていない場合は、最初のカラム 1544 if( valClm < 0 ) { valClm = 1; } // 値となるカラムが指定されていない場合は、2番目のカラム 1545 1546 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1547 for( final int row : rowNo ) { 1548 final String mapkey = table.getValue( row, keyClm ); 1549 final String mapval = table.getValue( row, valClm ); 1550 setObject( mapkey , mapval ); 1551 } 1552// for( int j=0; j<rowNo.length; j++ ) { 1553// final String mapkey = table.getValue( rowNo[j], keyClm ); 1554// final String mapval = table.getValue( rowNo[j], valClm ); 1555// setObject( mapkey , mapval ); 1556// } 1557 } 1558 1559 // 6.2.4.2 (2015/05/29) ACT_MAPOBJ アクションの追加 1560 else if( ACT_MAPOBJ.equals( action ) ) { 1561 int keyClm = table.getColumnNo( key ,false ); 1562 int valClm = table.getColumnNo( value ,false ); 1563 1564 if( keyClm < 0 ) { keyClm = 0; } // キーとなるカラムが指定されていない場合は、最初のカラム 1565 if( valClm < 0 ) { valClm = 1; } // 値となるカラムが指定されていない場合は、2番目のカラム 1566 1567 final Map<String,String> mapObj = new LinkedHashMap<>(); // 6.4.2.1 (2016/02/05) 1568 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1569 for( final int row : rowNo ) { 1570 final String mapkey = table.getValue( row, keyClm ); 1571 final String mapval = table.getValue( row, valClm ); 1572 mapObj.put( mapkey,mapval ); 1573 } 1574// for( int j=0; j<rowNo.length; j++ ) { 1575// final String mapkey = table.getValue( rowNo[j], keyClm ); 1576// final String mapval = table.getValue( rowNo[j], valClm ); 1577// mapObj.put( mapkey,mapval ); 1578// } 1579 setObject( key , mapObj ); 1580 } 1581 1582 // 4.3.7.5 (2009/07/13) ACT_LIST,ACT_LIST_CSV,ACT_ALL_LIST,ACT_ALL_LIST_CSV アクションの追加 1583 // 8.1.0.1 (2022/01/07) ACT_LIST_CSV,ACT_ALL_LIST_CSV 追加 1584// else if( ACT_LIST.equals( action ) ) { 1585 else if( ACT_LIST.equals( action ) || ACT_LIST_CSV.equals( action ) ) { 1586 final boolean useCSV = ACT_LIST_CSV.equals( action ); 1587 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1588 for( final String ky : keys ) { 1589 final int clm = table.getColumnNo( ky ); 1590 final List<String> list = new ArrayList<>(); // 7.3.1.1 (2021/02/25) 1591 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1592 for( final int row : rowNo ) { 1593 list.add( table.getValue( row,clm ) ); 1594 } 1595// setObject( ky,list ); 1596 if( useCSV ) { 1597 final String csv = list.stream().collect(Collectors.joining(",")); 1598 setObject( ky,csv ); 1599 } 1600 else { 1601 setObject( ky,list ); 1602 } 1603 } 1604 } 1605 1606 // 8.1.0.1 (2022/01/07) ACT_SET,ACT_ALL_SET,ACT_SET_CSV,ACT_ALL_SET_CSV アクションの追加 1607 else if( ACT_SET.equals( action ) || ACT_SET_CSV.equals( action ) ) { 1608 final boolean useCSV = ACT_SET_CSV.equals( action ); 1609 for( final String ky : keys ) { 1610 final int clm = table.getColumnNo( ky ); 1611 final Set<String> set = new LinkedHashSet<>(); 1612 for( final int row : rowNo ) { 1613 set.add( table.getValue( row,clm ) ); 1614 } 1615// setObject( ky,set ); 1616 if( useCSV ) { 1617 final String csv = set.stream().collect(Collectors.joining(",")); 1618 setObject( ky,csv ); 1619 } 1620 else { 1621 setObject( ky,set ); 1622 } 1623 } 1624 } 1625 1626 // 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追加 1627 else if( ACT_MAX_MIN.equals( action ) ) { 1628 NumberFormat nf = null; 1629 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1630 for( final String ky : keys ) { 1631 final int clm = table.getColumnNo( ky ); 1632// for( int i=0; i<keys.length; i++ ) { 1633// final int clm = table.getColumnNo( keys[i] ); 1634 final DBColumn clmObj = table.getDBColumn( clm ); 1635 // 6.4.4.2 (2016/04/01) contains 判定を行う新しいメソッドを使用します。 1636 final boolean numFlag = clmObj.isNumberType(); // 6.4.6.0 (2016/05/27) 数字型:true 1637 1638 String minVal = null ; 1639 String maxVal = null ; 1640 double minNum = Double.MAX_VALUE ; 1641 double maxNum = Double.MIN_VALUE ; 1642 double sumNum = 0d ; 1643 int cntSum = 0; // 平均計算に有効な件数 1644 1645 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1646 for( final int row : rowNo ) { 1647 final String val = table.getValue( row,clm ); 1648// for( int j=0; j<rowNo.length; j++ ) { 1649// final String val = table.getValue( rowNo[j],clm ); 1650 if( val != null && val.length() > 0 ) { 1651 // 数字として比較 1652 if( numFlag ) { 1653 final double tmp = Double.parseDouble( val ); 1654 if( minNum > tmp ) { minNum = tmp; minVal = val; } 1655 if( maxNum < tmp ) { maxNum = tmp; maxVal = val; } 1656 sumNum += tmp ; cntSum++ ; 1657 } 1658 else { 1659 // 文字列として比較 1660 if( minVal == null || minVal.compareTo( val ) > 0 ) { minVal = val; } // 最初のデータは、必ずセットする。 1661 if( maxVal == null || maxVal.compareTo( val ) < 0 ) { maxVal = val; } // 最初のデータは、必ずセットする。 1662 } 1663 } 1664 } 1665 if( minVal == null ) { minVal = nval( defaultVal , "" ); } // 最後まで値が決まらなければ、""(空文字列) にする。 1666 if( maxVal == null ) { maxVal = nval( defaultVal , "" ); } // 最後まで値が決まらなければ、""(空文字列) にする。 1667 setObject( "MIN." + ky,minVal ); 1668 setObject( "MAX." + ky,maxVal ); 1669// setObject( "MIN." + keys[i],minVal ); 1670// setObject( "MAX." + keys[i],maxVal ); 1671 1672 // SUM と AVG は、数字型の場合のみセットします。 1673 if( cntSum > 0 ) { 1674 if( nf == null ) { 1675 nf = NumberFormat.getInstance(); 1676 nf.setGroupingUsed( false ); // カンマ編集なし 1677 nf.setMaximumFractionDigits(2); // 最大小数部は2桁 1678 nf.setMinimumFractionDigits(0); // できれば、整数表示 1679 } 1680 setObject( "SUM." + ky,nf.format( sumNum ) ); // Double.toString( sumNum ) の代わり。 1681 setObject( "AVG." + ky,nf.format( sumNum/cntSum ) ); 1682// setObject( "SUM." + keys[i],nf.format( sumNum ) ); // Double.toString( sumNum ) の代わり。 1683// setObject( "AVG." + keys[i],nf.format( sumNum/cntSum ) ); 1684 } 1685 else { 1686 setObject( "SUM." + ky,nval( defaultVal , "" ) ); 1687 setObject( "AVG." + ky,nval( defaultVal , "" ) ); 1688// setObject( "SUM." + keys[i],nval( defaultVal , "" ) ); 1689// setObject( "AVG." + keys[i],nval( defaultVal , "" ) ); 1690 } 1691 } 1692 } 1693 else { 1694 // 7.2.9.4 (2020/11/20) PMD:This for loop can be replaced by a foreach loop 1695 for( final String ky : keys ) { 1696 final int clm = table.getColumnNo( ky ); 1697 setAttribute( key,table.getValue( rowNo[0],clm ),action ); 1698 } 1699// for( int i=0; i<keys.length; i++ ) { 1700// final int clm = table.getColumnNo( keys[i] ); 1701// setAttribute( keys[i],table.getValue( rowNo[0],clm ),action ); 1702// } 1703 } 1704 } 1705 1706 /** 1707 * DBTableModel の選択された値を取得します。 1708 * 1709 * 複数選択行が存在する場合は、先頭行を処理します。ただし、action="APPEND"の 1710 * 場合は、separator属性で指定された文字を使用して、連結します。 1711 * 1712 * @og.rev 3.1.0.1 (2003/03/26) 新規作成 1713 * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時の処理変更 1714 * @og.rev 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追加 1715 * @og.rev 5.1.6.0 (2010/05/01) ALL_APPENDで選択行がない場合に処理されないバグを修正 1716 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加。action="ALL_xxx"を tmpSelectedAll="true" に置き換えます。 1717 * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。 1718 * 1719 * @param table DBTableModelオブジェクト 1720 * @param key キー 1721 * @param action アクション 1722 * 1723 * @return DBTableModelの選択された値 1724 */ 1725 private String getTableAttribute( final DBTableModel table,final String key,final String action ) { 1726 if( table == null ) { 1727 final String errMsg = "table がセットされていません。" 1728 + " command=" + command + " , action=" + action 1729 + " , key=" + key ; // 5.1.8.0 (2010/07/01) errMsg 修正 1730 throw new HybsSystemException( errMsg ); 1731 } 1732 1733 if( key == null || key.isEmpty() ) { 1734 final String errMsg = "key がセットされていません。" 1735 + " command=" + command + " , action=" + action; // 5.1.8.0 (2010/07/01) errMsg 修正 1736 throw new HybsSystemException( errMsg ); 1737 } 1738 1739 final int[] rowNo = getParameterRows(); 1740 // 5.1.6.0 (2010/05/01) 1741 if( rowNo.length == 0 ) { return "" ; } // 5.6.4.3 (2013/05/24) tmpSelectedAll 属性を追加したので、0件判定が使える。 1742 1743 // 3.6.1.0 (2005/01/05) ACT_ALL_APPEND アクションの追加 1744 final int clm = table.getColumnNo( key ); 1745 if( ACT_APPEND.equals( action ) ) { 1746 // 6.4.4.2 (2016/04/01) 1747 return new OgBuilder() 1748 .appendRoop( 0,rowNo.length,separator 1749 , j -> table.getValue( rowNo[j],clm ) ) 1750 .toString(); 1751 } 1752 else { 1753 return actionExec( action,table.getValue( rowNo[0],clm ) ); 1754 } 1755 } 1756 1757 /** 1758 * 指定のスコープの内部キャッシュ情報に、DBTableModel の選択された値を登録します。 1759 * 1760 * これは、key で指定したカラムの値をキーとして、value で指定したカラムの値を 1761 * value 値として設定します。 1762 * setTableAttribute が、カラム(横持ち)データを処理するのに対して、 1763 * ロウ(縦持ち)データを処理することが出来ます。 1764 * 1765 * 8.1.0.1 (2022/01/07) 1766 * command="SETTBL" の場合の action="APPEND,LIST,SET,MAX_MIN" の場合は、 1767 * key をカンマで分解して、複数指定できるようにします。 1768 * 1769 * @og.rev 3.1.0.1 (2003/03/26) 新規作成 1770 * @og.rev 3.3.3.3 (2003/08/06) key 情報がデータの値になっていた。バグ修正。 1771 * @og.rev 3.5.6.5 (2004/08/09) ACT_APPEND 時の処理変更 1772 * @og.rev 6.4.4.2 (2016/04/01) StringBuilderの代わりに、OgBuilderを使用する。 1773 * 1774 * @param table DBTableModelオブジェクト 1775 * @param key キー 1776 * @param value 値 1777 * @param action アクション 1778 */ 1779 private void setKeyTableAttribute( final DBTableModel table,final String key,final String value,final String action ) { 1780 if( table == null ) { return ; } 1781 1782 if( key == null || key.isEmpty() ) { 1783 final String errMsg = "key がセットされていません。" 1784 + " command=" + command + " , action=" + action 1785 + " , value=" + value ; // 5.1.8.0 (2010/07/01) errMsg 修正 1786 throw new HybsSystemException( errMsg ); 1787 } 1788 1789 final int[] rowNo = getParameterRows(); 1790 if( rowNo.length == 0 ) { return ; } 1791 1792 final int[] valClm ; 1793 if( value == null || value.isEmpty() ) { 1794 final String[] vals = table.getNames(); 1795 valClm = new int[vals.length]; 1796 for( int i=0; i<vals.length; i++ ) { 1797 valClm[i] = table.getColumnNo( vals[i] ); 1798 } 1799 } 1800 else { 1801 valClm = new int[] { table.getColumnNo( value ) } ; 1802 } 1803 1804 // 6.4.4.2 (2016/04/01) 1805 final OgBuilder buf = new OgBuilder(); 1806 for( int j=0; j<rowNo.length; j++ ) { 1807 final String rowKey = key + j ; 1808 final int rNo = rowNo[j]; 1809 if( ACT_APPEND.equals( action ) ) { 1810 buf.clear(); 1811 buf.appendRoop( 0,valClm.length,separator 1812 , i -> table.getValue( rNo,valClm[i] ) ); 1813 setObject( rowKey,buf.toString() ); 1814 } 1815 else { 1816 setAttribute( rowKey,table.getValue( rNo,valClm[0] ),action ); 1817 } 1818 } 1819 } 1820 1821 /** 1822 * 指定のスコープに登録されているパラメータ(アトリビュート)を返します。 1823 * 1824 * 従来は、debug="true" で出力していましたが、情報量が多すぎるため、 1825 * それぞれ指定することが出来るようにします。 1826 * 1827 * @og.rev 6.7.7.2 (2017/04/14) command に、DEBUG 追加 1828 * 1829 * @return scopeに応じた値 1830 */ 1831 private String scopeAttributePrint() { 1832 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 1833 .append( "====================================" ).append( CR ); 1834 1835 if( "application".equals( scope ) ) { 1836 rtn.append( "APPLICATION_SCOPE:" ).append( CR ); 1837 1838 final Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.APPLICATION_SCOPE ); // 4.3.3.6 (2008/11/15) Generics警告対応 1839 while( ekeys.hasMoreElements() ) { 1840 final String ekey = ekeys.nextElement(); // 4.3.3.6 (2008/11/15) Generics警告対応 1841 // 6.0.2.5 (2014/10/31) char を append する。 1842 rtn.append( " key=[" ).append( ekey ) 1843 .append( "] value=[" ) 1844 .append( pageContext.getAttribute( ekey,PageContext.APPLICATION_SCOPE ) ) 1845 .append( ']' ).append( CR ); 1846 } 1847 } 1848 1849 if( "session".equals( scope ) ) { 1850 rtn.append( "SESSION_SCOPE:" ).append( CR ); 1851 final Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.SESSION_SCOPE ); 1852 while( ekeys.hasMoreElements() ) { 1853 final String ekey = String.valueOf( ekeys.nextElement() ); 1854 // 6.0.2.5 (2014/10/31) char を append する。 1855 rtn.append( " key=[" ).append( ekey ) 1856 .append( "] value=[" ) 1857 .append( pageContext.getAttribute( ekey,PageContext.SESSION_SCOPE ) ) 1858 .append( ']' ).append( CR ); 1859 } 1860 } 1861 1862 if( "request".equals( scope ) ) { 1863 rtn.append( "REQUEST_SCOPE:" ).append( CR ); 1864 final Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.REQUEST_SCOPE ); 1865 while( ekeys.hasMoreElements() ) { 1866 final String ekey = String.valueOf( ekeys.nextElement() ); 1867 // 6.0.2.5 (2014/10/31) char を append する。 1868 rtn.append( " key=[" ).append( ekey ) 1869 .append( "] value=[" ) 1870 .append( pageContext.getAttribute( ekey,PageContext.REQUEST_SCOPE ) ) 1871 .append( ']' ).append( CR ); 1872 } 1873 } 1874 1875 if( "page".equals( scope ) ) { 1876 rtn.append( "PAGE_SCOPE:" ).append( CR ); 1877 final Enumeration<String> ekeys = pageContext.getAttributeNamesInScope( PageContext.PAGE_SCOPE ); 1878 while( ekeys.hasMoreElements() ) { 1879 final String ekey = String.valueOf( ekeys.nextElement() ); 1880 // 6.0.2.5 (2014/10/31) char を append する。 1881 rtn.append( " key=[" ).append( ekey ) 1882 .append( "] value=[" ) 1883 .append( pageContext.getAttribute( ekey,PageContext.PAGE_SCOPE ) ) 1884 .append( ']' ).append( CR ); 1885 } 1886 } 1887 1888 rtn.append( "====================================" ).append( CR ); 1889 1890 return rtn.toString(); 1891 } 1892 1893 /** 1894 * 表示データの HybsSystem.ROW_SEL_KEY を元に、選ばれた 行を処理の対象とします。 1895 * 1896 * action="FIRST" 処理と、tmpSelectedAll 属性追加に伴う処理を、Override します。 1897 * 1898 * @og.rev 3.1.0.1 (2003/03/26) 新規作成 1899 * @og.rev 4.0.0.0 (2005/01/31) メイン処理を、super class で対応 1900 * @og.rev 3.8.0.4 (2005/08/08) action="FIRST" 機能の追加 1901 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性の追加に伴い、全件選択状態のデータを作成します。 1902 * @og.rev 7.3.1.1 (2021/02/25) action="VIEWFIRST" 機能の追加 1903 * 1904 * @return 選択行の配列 1905 * @og.rtnNotNull 1906 */ 1907 @Override 1908 protected int[] getParameterRows() { 1909 final int[] rowNo ; 1910 // 3.8.0.4 (2005/08/08) action="FIRST" 機能の追加 1911 if( ACT_FIRST.equals( action ) ) { 1912 rowNo = new int[] { 0 }; 1913 } 1914 // 7.3.1.1 (2021/02/25) action="VIEWFIRST" 機能の追加 1915 else if( ACT_VIEWFIRST.equals( action ) ) { 1916 final int startNo = nval( getRequestCacheData( "startNo" ),0 ); // viewFormでリクエストキャッシュに登録している値を取り出す。 1917 rowNo = new int[] { startNo }; 1918 } 1919 // 5.6.4.3 (2013/05/24) tmpSelectedAll 属性の追加 1920 else if( tmpSelectedAll ) { 1921 final int rowCnt = table.getRowCount(); 1922 rowNo = new int[ rowCnt ]; 1923 for( int i=0; i<rowCnt; i++ ) { 1924 rowNo[i] = i; 1925 } 1926 } 1927 else { 1928 rowNo = super.getParameterRows() ; 1929 } 1930 return rowNo ; 1931 } 1932 1933 /** 1934 * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します 1935 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。 1936 * 1937 * @og.tag 1938 * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に 1939 * 渡す場合に、通常は、session を利用します。その場合の登録キーです。 1940 * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、 1941 * この tableId 属性を利用して、メモリ空間を分けます。 1942 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value HybsSystem#TBL_MDL_KEY}])。 1943 * 1944 * @param id テーブルID (sessionに登録する時のID) 1945 */ 1946 public void setTableId( final String id ) { 1947 tableId = nval( getRequestParameter( id ),tableId ); 1948 } 1949 1950 /** 1951 * 【TAG】コマンド (SET,GET,REMOVE,SQL,SETTBL,GETTBL,KEYTBL,CLEAR,SETMEM)をセットします(初期値:SET)。 1952 * 1953 * @og.tag 1954 * コマンドは、HTMLから(get/post)指定されますので、CMD_xxx で設定される 1955 * フィールド定数値のいづれかを、指定できます。 1956 * 何も設定されない、または、null の場合は、"SET" が初期値にセットされます。 1957 * 1958 * CLEAR 以外のすべての処理は、指定のスコープの内部キャッシュ情報に対して行われます。 1959 * <table class="plain"> 1960 * <caption>コマンド 一覧</caption> 1961 * <tr><th>command </th><th>名称 </th><th>機能</th></tr> 1962 * <tr><td>SET </td><td>セット </td><td>指定のキーに、value値を登録します。</td></tr> 1963 * <tr><td>GET </td><td>ゲット </td><td>指定のキーの値を画面に出力します。</td></tr> 1964 * <tr><td>REMOVE </td><td>リムーブ </td><td>指定のキーの値を削除します。</td></tr> 1965 * <tr><td>CLEAR </td><td>クリア </td><td>セッション/アプリケーションスコープのキャッシュ情報をクリアします。</td></tr> 1966 * <tr><td>SQL </td><td>SQL </td><td>指定のSQL文の実行結果を、カラム名をキーとして設定します。(useMultiRows="false" 時は、最初のデータを使用)</td></tr> 1967 * <tr><td>SQLGET </td><td>SQLゲット</td><td>指定のSQL文の実行結果を、画面に出力します。(2項目以降は無視されます)。</td></tr> 1968 * <tr><td>SETTBL </td><td>セットテーブル </td><td>指定のキーに、DBTableModel の選択されたカラム(横持ち)の値を登録します。</td></tr> 1969 * <tr><td>GETTBL </td><td>ゲットテーブル </td><td>指定のキーに、DBTableModel の選択されたカラム(横持ち)の値を画面に出力します。</td></tr> 1970 * <tr><td>KEYTBL </td><td>キーテーブル </td><td>指定のキーに、DBTableModel の選択されたロウ(縦持ち)の値を登録します。</td></tr> 1971 * <tr><td>SETMEM </td><td>セットメモリ </td><td>指定のキーに、value値を内部キャッシュに登録します。</td></tr> 1972 * <tr><td>DEBUG </td><td>デバッグ </td><td>指定のスコープに登録されているパラメータ(アトリビュート)を返します。</td></tr> 1973 * </table> 1974 * 1975 * @og.rev 3.1.0.1 (2003/03/26) 指定のコマンド以外は、エラーとするように変更。 1976 * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します。 1977 * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。 1978 * @og.rev 6.7.7.2 (2017/04/14) command に、DEBUG 追加 1979 * 1980 * @param cmd コマンド (public static final 宣言されている文字列) 1981 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ValueTag.CMD_GET">コマンド定数</a> 1982 */ 1983 public void setCommand( final String cmd ) { 1984 command = nval( getRequestParameter( cmd ),command ).toUpperCase(Locale.JAPAN); 1985 1986 if( !check( command, COMMAND_SET ) ) { 1987 final String errMsg = "指定のコマンドは実行できません。コマンドエラー" + CR 1988 + "command=[" + command + "] " + CR 1989 + "commandList=[" + String.join( ", " , COMMAND_SET ) + "]" ; 1990 throw new HybsSystemException( errMsg ); 1991 } 1992 } 1993 1994 /** 1995 * 【TAG】アクション(UPPER,LOWER,MESSAGE,APPEND,ALL_APPEND,MAP,ALL_MAP,MAPOBJ,ALL_MAPOBJ,LIST,ALL_LIST,SET,ALL_SET,DAY_WEEK, 1996 * MERGE,FIRST,VIEWFIRST,ROW_APPEND,REPLACE,INDEX_OF,LASTINDEX_OF,SUBSTR,LENGTH, 1997 * SPLIT,SPLIT_LIST,FOR,FOR_LIST,FORTM,FORTM_LIST,MAX_MIN,ALL_MAX_MIN,ADD,CASE,ESCAPE, 1998 * URL_ENCODE,URL_ENCODE2,URL_DECODE,TRIM,HASH,TO_NUMBER,TO_DATE,HMCSV,CRYPT_ENC,CRYPT_DEC,REQUEST,FORMAT)をセットします。 1999 * 2000 * @og.tag 2001 * アクションは、HTMLから(get/post)指定されますので、ACT_xxx で設定される 2002 * フィールド定数値のいづれかを、指定できます。 2003 * 無指定の場合は、なにもしません。 2004 * 2005 * <table class="plain"> 2006 * <caption>アクション 一覧</caption> 2007 * <tr><th>action </th><th>名称 </th><th>機能</th></tr> 2008 * <tr><td>UPPER </td><td>アッパー(大文字化) </td><td>value値を大文字に変換します。</td></tr> 2009 * <tr><td>LOWER </td><td>ローワー(小文字化) </td><td>value値を小文字に変換します。</td></tr> 2010 * <tr><td>MESSAGE </td><td>メッセージ変換 </td><td>引数をメッセージリソースのキーとして、メッセージ変換します。</td></tr> 2011 * <tr><td>APPEND </td><td>データアペンド </td><td>複数リクエストや複数選択時に値を連結します。</td></tr> 2012 * <tr><td>ALL_APPEND </td><td>オールアペンド </td><td>SETTBL,GETTBL 時に、チェック行以外の全行を対象に値の連結を行います。</td></tr> 2013 * <tr><td>MAP </td><td>マップ </td><td>検索結果やTableModelのkeyをキーに、valueを値に一括設定します。※③</td></tr> 2014 * <tr><td>ALL_MAP </td><td>オールマップ </td><td>全行を対象に検索結果やTableModelのkeyをキーに、valueを値に一括設定します。※③</td></tr> 2015 * <tr><td>MAPOBJ </td><td>マップオブジェクト </td><td>検索結果やTableModelのkeyに、キーと値のMapを設定します。6.2.4.2 (2015/05/29)</td></tr> 2016 * <tr><td>ALL_MAPOBJ </td><td>オールマップオブジェクト </td><td>全行を対象に検索結果やTableModelのkeyに、キーと値のMapを設定します。6.2.4.2 (2015/05/29)</td></tr> 2017 * <tr><td>LIST </td><td>リスト </td><td>複数リクエストや複数選択時に値をArrayListにセットします。4.3.7.5 (2009/07/13)</td></tr> 2018 * <tr><td>LIST_CSV </td><td>リストCSV </td><td>複数リクエストや複数選択時に値をArrayListにセット後CSV化します。8.1.0.1 (2022/01/07)</td></tr> 2019 * <tr><td>ALL_LIST </td><td>オールリスト </td><td>全行を対象に値をArrayListにセットします。4.3.7.5 (2009/07/13)</td></tr> 2020 * <tr><td>ALL_LIST_CSV</td><td>オールリストCSV </td><td>全行を対象に値をArrayListにセットセット後CSV化します。8.1.0.1 (2022/01/07)</td></tr> 2021 * <tr><td>SET </td><td>セット </td><td>複数リクエストや複数選択時に値を順序を保持したユニークな集合(LinkedHashSet)にします。8.1.0.1 (2022/01/07)</td></tr> 2022 * <tr><td>SET_CSV </td><td>セットCSV </td><td>複数リクエストや複数選択時に値を順序を保持したユニークな集合(LinkedHashSet)後CSV化します。8.1.0.1 (2022/01/07)</td></tr> 2023 * <tr><td>ALL_SET </td><td>オールセット </td><td>全行を対象に値を順序を保持したユニークな集合(LinkedHashSet)にします。8.1.0.1 (2022/01/07)</td></tr> 2024 * <tr><td>ALL_SET_CSV </td><td>オールセットCSV </td><td>全行を対象に値を順序を保持したユニークな集合(LinkedHashSet)後CSV化にします。8.1.0.1 (2022/01/07)</td></tr> 2025 * <tr><td>DAY_WEEK </td><td>日付前方まるめ </td><td>日付型文字列(YYYYMMDD) の値を、月曜日に変換します。</td></tr> 2026 * <tr><td> </td><td> </td><td>指定日が日曜日の場合は、次の日(月曜日)に進めます。その他は、週始めに戻します。</td></tr> 2027 * <tr><td>MERGE </td><td>データのマージ </td><td>重複を除く、ユニークな値に、マージします。(カンマで分解、separatorで合成)</td></tr> 2028 * <tr><td>FIRST </td><td>1件目取得 </td><td>最初の1件目を強制的に選択状態にして、処理を行います。</td></tr> 2029 * <tr><td>VIEWFIRST </td><td>表示1件目取得 </td><td>7.3.1.1 (2021/02/25) 現在表示の1件目を強制的に選択状態にして、処理を行います。</td></tr> 2030 * <tr><td>ROW_APPEND </td><td>検索結果の連結 </td><td>検索結果の行方向のデータを連結します。</td></tr> 2031 * <tr><td>REPLACE </td><td>文字列置換 </td><td>value の値から、指定された正規表現(from)の部分文字列を、部分文字列(to)で置換します。</td></tr> 2032 * <tr><td>INDEX_OF </td><td>最初に出現する位置</td><td>value の値から、指定された(separator)が、fromVal以降に最初に出現する位置。※⑤</td></tr> 2033 * <tr><td>LASTINDEX_OF</td><td>最後に出現する位置</td><td>value の値から、指定された(separator)が、toVal以前に最後に出現する位置。※⑤</td></tr> 2034 * <tr><td>SUBSTR </td><td>部分文字列 </td><td>value の値から、指定された(fromVal)から(toVal)の部分文字列を作成します。</td></tr> 2035 * <tr><td>LENGTH </td><td>文字数(char数) </td><td>value の文字数(char数)をカウントします。</td></tr> 2036 * <tr><td>SPLIT </td><td>文字列分割 </td><td>value の値から、指定されたseparatorで分割した文字列を作成します。(key+0~連番)</td></tr> 2037 * <tr><td>SPLIT_LIST </td><td>文字列分割LIST登録</td><td>value の値から、指定されたseparatorで分割した文字列をLISTに登録します。 7.3.1.1 (2021/02/25)</td></tr> 2038 * <tr><td>FOR </td><td>繰返文字合成 </td><td>value の値に、fromVal,toVal(同値含む),skipVal を使用した連結文字列を作成する。7.3.1.1 (2021/02/25)※⑥</td></tr> 2039 * <tr><td>FOR_LIST </td><td>繰返文字合成LIST登録</td><td>value の値に、fromVal,toVal(同値含む),skipVal を使用した文字列をLISTに登録します。 7.3.1.1 (2021/02/25)※⑥</td></tr> 2040 * <tr><td>FORTM </td><td>繰返日付文字合成 </td><td>fromVal,toVal(同値含まず),skipVal を使用した連結日付文字列(format指定可)を作成する。8.0.1.2 (2021/11/19)※⑦</td></tr> 2041 * <tr><td>FORTM_LIST </td><td>繰返日付文字合成LIST登録</td><td>fromVal,toVal(同値含まず),skipVal を使用した日付文字列(format指定可)をLISTに登録します。 8.0.1.2 (2021/11/19)※⑦</td></tr> 2042 * <tr><td>MAX_MIN </td><td>最大_最小値 </td><td>選択行のkeyのカラムの最小値,最大値を、MIN.キー、MAX.キー の値にセットします。 5.6.4.3 (2013/05/24) ※①</td></tr> 2043 * <tr><td>ALL_MAX_MIN </td><td>最大_最小値 </td><td>全行を対象にkeyのカラムの最小値,最大値を、MIN.キー、MAX.キー の値にセットします。 5.6.4.3 (2013/05/24) ※①</td></tr> 2044 * <tr><td>EXEC 廃止 </td><td>計算結果 </td><td>【廃止】value またはBODY部の値を、JavaScriptで計算した結果をセットします。7.3.0.0 (2021/01/06)</td></tr> 2045 * <tr><td>ADD </td><td>計算結果 </td><td>defaultVal の 値と、(value またはBODY部の)値を、加算した結果をキー変数にセットします。7.3.0.0 (2021/01/06)</td></tr> 2046 * <tr><td>CASE </td><td>条件分岐 </td><td>fromVal="A:1 B:2 C:3 D:4" 形式の値を元に、value値(左辺)に一致する右辺をセットします。 5.7.7.2 (2014/06/20) ※②</td></tr> 2047 * <tr><td>ESCAPE </td><td>エスケープ文字 </td><td>HTML上のエスケープ文字(&lt;,&gt;,&quot;,&apos;,&amp;)を変換します。</td></tr> 2048 * <tr><td>URL_ENCODE </td><td>URLエンコード </td><td>UTF-8 で、URLエンコードを行います。</td></tr> 2049 * <tr><td>URL_ENCODE2 </td><td>ASCII以外の文字のURLエンコード</td><td>UTF-8 で、ASCII以外の文字の、URLエンコードします。</td></tr> 2050 * <tr><td>URL_DECODE </td><td>URLデコード </td><td>UTF-8 でURLエンコードされた文字列をデコードします。</td></tr> 2051 * <tr><td>TRIM </td><td>スペース削除 </td><td>両端空白文字(スペース、タブ、改行等)を削除します。6.4.1.2 (2016/01/22)</td></tr> 2052 * <tr><td>MD5 </td><td>MD5変換 </td><td>【廃止】値をMD5変換します。 8.1.2.0 (2022/03/10)</td></tr> 2053 * <tr><td>HASH </td><td>ハッシュ変換 </td><td>値をformatに指定されたハッシュコードで計算します。 8.1.2.0 (2022/03/10)</td></tr> 2054 * <tr><td>TO_NUMBER </td><td>数値変換 </td><td>値から、数値以外の文字を削除します。例えば、日付、金額など、区切り記号等を削除します。6.7.4.0 (2017/02/10)</td></tr> 2055 * <tr><td>TO_DATE </td><td>日付変換 </td><td>日付文字列から、数値以外の文字を削除します。(/,-,:,' ',Tなどを削除) 8.0.1.2 (2021/11/19)※⑧</td></tr> 2056 * <tr><td>HMCSV </td><td>時間(分)分割CSV </td><td>fromVal,toVal(同値含まず),skipVal(ステップ時間)を分で指定します(例:1時間=60,2時間=120,45分=45など)。 2057 * <tr><td> </td><td> </td><td>valueには、初期日付(YMD形式)を設定します。6.8.4.1 (2017/12/18)※④</td></tr> 2058 * <tr><td>CRYPT_ENC </td><td>暗号化変換 </td><td>HybsCryptographyによる暗号化を行います。暗号化キーは、cryptKey 属性で指定します。5.10.4.0 (2018/10/05)</td></tr> 2059 * <tr><td>CRYPT_DEC </td><td>暗号化復号 </td><td>HybsCryptographyによる復号化を行います。復号化キーは、cryptKey 属性で指定します。5.10.4.0 (2018/10/05)</td></tr> 2060 * <tr><td>REQUEST </td><td>リクエスト変数変換 </td><td>SQLなどで直接取得したデータを、リクエスト変換({@XXXX}変換)します。7.2.6.1 (2020/07/17)</td></tr> 2061 * <tr><td>FORMAT </td><td>数字フォーマット変換 </td><td>value(数字)の値から、format<del>fromVal</del>に指定された書式文字列に変換します。7.4.2.0 (2021/05/08)</td></tr> 2062 * </table> 2063 * 2064 * ※① MAX_MIN,ALL_MAX_MIN については、DBTableModelのカラムのCLS_NAMEが、NUMBER,INTEGER,DECIMAL の場合は、数字型(double)に変換して比較します。 2065 * 数字型(double)の場合だけ、合計(SUM.キー) と 平均(AVG.キー)計算も同時に行います。 2066 * それ以外の場合は、文字列比較を行います。(command="SETTBL" のみ) 2067 * command="SET" の場合は、数字型(double)として、value の値を、separator で分解したうえで、最大、最小、合計、平均 を計算し、 2068 * それぞれを、MIN.キー、MAX.キー、SUM.キー、AVG.キー 変数にセットします。 2069 * 数字に変換できなかった場合は、エラーになります。 2070 * null は、無視され(平均を求める場合の母数としても無視)、すべてが nulll の場合は、ゼロ文字列("")になります。 2071 * ゼロ文字列("") の場合に、defaultVal 属性が設定されていると、defaultVal が設定されます。 2072 * ※② CASE は、fromVal="A:1 B:2 C:3 D:4" 形式の値に対して、コロン(:)で分解し、value値(左辺)が、一致する右辺を返します。 2073 * fromVal の値は、スペースで分割され、コロン(:)が存在する左辺(キー)と右辺(値)に分解し、value値とキーを比較し、 2074 * 一致すれば、右辺の値を返します。 2075 * valueがnullの場合、defaultVal が設定されており、その値で、fromVal の値と比較します。 2076 * 一致する値がなければ、元の value が返されます。 2077 * ※③ command="SQL"のMAP,ALL_MAP で、select key,val from TABLE のように、キーと値のみのMapを作成していましたが、 2078 * 第3引数以降も、Mapを作成するようにします。 6.9.0.2 (2018/02/13) 2079 * 具体的には、select key,val,val1,val2,val3 ・・・ from TABLE とすると、key,val の関係は、従来どおりで、 2080 * val1 は、key + '_1' , val2 は、key + '_2' ・・・ という風に登録します。 2081 * ※④ HMCSV アクションを実行すると、MIN(fromValの日付),MAX(toVal(同値含まず)の日付),HMF(日付の時:分ラベル) を追加します。 2082 * fromVal,toVal を指定せず、valueに、CSV形式の日付データを渡した場合は、MIN,MAX,HMF のみ求めます。 6.9.1.0 (2018/02/26) 2083 * ※⑤ INDEX_OF( value.indexOf(separator,fromVal); )は、検索対象の部分文字列をseparatorに、検索開始位置のインデックスをfromVal にセットします。 2084 * LASTINDEX_OF( value.lastIndexOf(separator,toVal); )は、検索対象の部分文字列をseparatorに、 2085 * 検索開始位置のインデックスをtoVal にセットします。(fromValではないことを注意) 7.2.6.0 (2020/06/30) 2086 * ※⑥ FOR は、valueに指定の文字列(未指定時は空文字列)に、fromVal ~ toVal(同値含む) を skipVal づつの数字文字列を合成した文字列を、separator で連結します。 2087 * fromVal に、"000" など、先頭0で始まる2桁以上の文字列を指定した場合は、先頭ゼロ埋めの文字列を生成します。 2088 * FOR_LIST は、同じ処理の結果を、Listオブジェクトに登録します。( c:forEach で取り出すことができます) 7.3.1.1 (2021/02/25) 2089 * format属性で、生成する文字列をフォーマット(String#formatメソッド)できます。 2090 * ※⑦ FORTM、FORTM_LIST は、FOR、FOR_LISTと同じく繰り返し文字列を生成しますが、文字列は日付フォーマットになります。 2091 * fromValから、toVal(同値含まず)まで、skipValが数字の場合は、その数だけ日付送りします。"M" 記号だけ特殊で、月送りします。 8.0.1.2 (2021/11/19) 2092 * format属性で、生成する日付文字列をフォーマット(HybsDateUtil#getDateFormatメソッド)できます。 2093 * ※⑧ TO_DATE は、日付フォーマットから、不要な文字を削除します。(/,-,:,' ',Tなどを削除) 2094 * 日付文字列としての整合性は、保証していません。 8.0.1.2 (2021/11/19) 2095 * 2096 * @og.rev 3.1.0.1 (2003/03/26) 指定のアクション以外は、エラーとするように変更。 2097 * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します。 2098 * @og.rev 4.3.7.5 (2009/07/13) ACT_LIST、ACT_ALL_LIST アクションの追加(JavaDocのみ修正) 2099 * @og.rev 5.6.4.3 (2013/05/24) ACT_MAX_MIN アクションの追加(JavaDocのみ修正) 2100 * @og.rev 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加にともなう修正。action="ALL_xxx"は、tmpSelectedAll=true にします。 2101 * @og.rev 5.7.7.2 (2014/06/20) EXEC と CASE アクションを追加 2102 * @og.rev 6.2.4.2 (2015/05/29) MAPOBJ , ALL_MAPOBJ アクションの追加 2103 * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。 2104 * @og.rev 6.4.1.2 (2016/01/22) TRIM アクションを追加。 2105 * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 2106 * @og.rev 6.7.4.0 (2017/02/10) TO_NUMBER アクションを追加。 2107 * @og.rev 6.8.4.1 (2017/12/18) HMCSV アクションを追加 2108 * @og.rev 8.0.1.2 (2021/11/19) ACT_TO_DATE,ACT_FORTM,ACT_FORTM_LIST 追加 2109 * @og.rev 8.1.0.1 (2022/01/07) ACT_LIST_CSV、ACT_ALL_LIST_CSV,ACT_SET,ACT_ALL_SET,ACT_SET_CSV,ACT_ALL_SET_CSV アクションの追加 2110 * 2111 * @param act アクション (public static final 宣言されている文字列) 2112 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ValueTag.ACT_APPEND">アクション定数</a> 2113 */ 2114 public void setAction( final String act ) { 2115 action = nval( getRequestParameter( act ),action ); 2116 2117 if( action != null && !check( action, ACTION_SET ) ) { 2118 final String errMsg = "指定のアクションは実行できません。アクションエラー" + CR 2119 + "action=[" + action + "] " + CR 2120 + "actionList=[" + String.join( ", " , ACTION_SET ) + "]" ; 2121 throw new HybsSystemException( errMsg ); 2122 } 2123 2124 // 5.6.4.3 (2013/05/24) tmpSelectedAll 属性追加。action="ALL_xxx"を tmpSelectedAll="true" に置き換えます。 2125 if( action != null && action.startsWith( "ALL_" ) ) { 2126 action = action.substring( 4 ); // "ALL_" の4文字分削除 2127 tmpSelectedAll = true; 2128 } 2129 } 2130 2131 /** 2132 * 【TAG】パラメータ に登録するキーをセットします。 2133 * 2134 * @og.tag パラメータ に登録するキーをセットします。 2135 * 2136 * @og.rev 3.0.1.3 (2003/03/11) キーを toUpperCase している箇所を削除 2137 * @og.rev 6.2.6.0 (2015/06/19) キーのnull判定は行わない。(個別のメソッド内で実施している。) 2138 * 2139 * @param key1 登録キー 2140 */ 2141 public void setKey( final String key1 ) { 2142 key = nval( getRequestParameter( key1 ),key ) ; 2143 } 2144 2145 /** 2146 * 【TAG】パラメータ に登録する値をセットします。 2147 * 2148 * @og.tag パラメータ に登録する値をセットします。 2149 * 2150 * @og.rev 3.1.7.0 (2003/05/02) isNullSet 属性が true(初期値)のときは、リクエスト情報から値を取得。 2151 * @og.rev 3.5.4.0 (2003/11/25) getRequestParameter( value ) メソッドを setValue に移動。 2152 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 2153 * 2154 * @param val 登録値 2155 */ 2156 public void setValue( final String val ) { 2157 inValue = val; // 3.5.4.0 (2003/11/25) 入力変数も、キープしておく。 2158 value = getRequestParameter( inValue ); 2159 } 2160 2161 /** 2162 * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。 2163 * 2164 * @og.tag 2165 * value属性に値がセットされていないときに、この初期値を使用します。 2166 * 2167 * 8.4.3.0 (2023/03/31) defaultVal の設定値の取り扱い(変更なし) 2168 * {@XXXX} は、リクエスト変数 ⇒ valueタグセット値 を確認 2169 * 値がなければ、""(空文字列) となる。 2170 * 通常の固定値は、そのまま使用される(""(空文字列)も有効 2171 * defaultVal属性を使用しない場合は、 2172 * null のままで、適用されるので、value属性をきちんと登録してください。 2173 * 2174 * @param val 初期値 2175 */ 2176 public void setDefaultVal( final String val ) { 2177 defaultVal = getRequestParameter( val ); 2178 } 2179 2180// /** 2181// * 【廃止】value が NULL の時に、設定するかどうか[true/false]を指定します(初期値:true)。 2182// * 2183// * @og.tag 2184// * true の場合は、null のときでもセットします。 2185// * false の場合は、null のときは、既存の値を置き換えません。 2186// * 初期値は、null のときでもセットするです。 ("true") 2187// * 2188// * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 2189// * @og.rev 6.9.5.0 (2018/04/23) 物理的に廃止 2190// * 2191// * @param flag NULL時設定有無 [true:設定する/それ以外:設定しない] 2192// * @deprecated 5.1.8.0 (2010/07/01) 廃止。 2193// */ 2194// @Deprecated public void setNullSet( final String flag ) { 2195// // 廃止予定 2196// } 2197 2198 /** 2199 * 【TAG】(通常は使いません)Queryオブジェクトを作成する時のDB接続IDを指定します。 2200 * 2201 * @og.tag Queryオブジェクトを作成する時のDB接続IDを指定します。 2202 * 2203 * @param id データベース接続ID 2204 */ 2205 public void setDbid( final String id ) { 2206 dbid = nval( getRequestParameter( id ),dbid ); 2207 } 2208 2209 /** 2210 * 【TAG】キャッシュする場合のスコープ(request,session)を指定します(初期値:request)。 2211 * 2212 * @og.tag 2213 * "request","session" が指定できます。 2214 * 初期値は、 "request" です。 2215 * 2216 * @param scp スコープ 2217 */ 2218 @Override 2219 public void setScope( final String scp ) { 2220 scope = nval( getRequestParameter( scp ),scope ); 2221 } 2222 2223 /** 2224 * 【TAG】DBTableModel から取得する場合のスコープ(request,session)を指定します(初期値:session)。 2225 * 2226 * @og.tag 2227 * "request","session" が指定できます。 2228 * 初期値は、 "session" です。 2229 * 2230 * @og.rev 5.1.2.0 (2010/01/01) DBTableModel の取得先のscope 2231 * 2232 * @param scp スコープ 2233 */ 2234 public void setTblScope( final String scp ) { 2235 tblScope = nval( getRequestParameter( scp ),tblScope ); 2236 } 2237 2238 /** 2239 * 【TAG】マルチデータ(複数件検索)を使用するかどうか[true/false]を指定します(初期値:false)。 2240 * 2241 * @og.tag 2242 * command="SQL" の場合に、複数行検索した結果を、キー+行番号 というキーを作成して 2243 * 値を設定するかどうかを指定します。 2244 * false の場合は、従来どおり、検索カラム名がキーになります。 2245 * 初期値は、false です。 2246 * 2247 * @og.rev 3.2.4.0 (2003/06/12) 新規追加 2248 * 2249 * @param flag 複数件検索 [true:使用する/false:使用しない] 2250 */ 2251 public void setUseMultiRows( final String flag ) { 2252 useMultiRows = nval( getRequestParameter( flag ),useMultiRows ); 2253 } 2254 2255 /** 2256 * 【TAG】各種アクションの文字列を連結/分解する項目区切り文字をセットします(初期値:",")。 2257 * 2258 * @og.tag 2259 * 各種アクションに基づく処理において、文字列の区切りを指定するのに使用します。 2260 * APPEND、ROW_APPEND 時には、文字列の連結に使用します。 2261 * MERGE の場合は、カンマで分解後、このセパレータでMERGE処理を行い、再び、連結します。 2262 * 初期値は、"," に設定されています。 2263 * 2264 * @og.rev 3.5.6.5 (2004/08/09) 新規追加 2265 * 2266 * @param sepa 項目区切り文字 (初期値:",") 2267 */ 2268 public void setSeparator( final String sepa ) { 2269 separator = nval( getRequestParameter( sepa ),separator ); 2270 } 2271 2272 /** 2273 * 【TAG】パラメータの HTMLTag開始/終了文字(><) 存在チェックを実施するかどうか[true/false]を設定します 2274 * (初期値:USE_XSS_CHECK[={@og.value SystemData#USE_XSS_CHECK}])。 2275 * 2276 * @og.tag 2277 * クロスサイトスクリプティング(XSS)対策の一環としてless/greater than signについてのチェックを行います。 2278 * (><) が含まれていたエラーにする(true)/かノーチェックか(false)を指定します。 2279 * (初期値:システム定数のUSE_XSS_CHECK[={@og.value SystemData#USE_XSS_CHECK}])。 2280 * 2281 * @og.rev 5.1.7.0 (2010/06/01) 新規追加 2282 * 2283 * @param flag XSSチェック [true:する/false:しない] 2284 * @see org.opengion.hayabusa.common.SystemData#USE_XSS_CHECK 2285 */ 2286 public void setXssCheck( final String flag ) { 2287 xssCheck = nval( getRequestParameter( flag ),xssCheck ); 2288 } 2289 2290 /** 2291 * 【TAG】部分文字列置換の 置換え前の部分文字列(from)を指定します。 2292 * 2293 * @og.tag 2294 * value の値から、指定された正規表現(from)に一致する、この文字列の各部分文字列に対し、 2295 * 指定された文字列(to)で置換します。 2296 * value.replaceAll( from, to ) という文法で処理します。 2297 * 2298 * ※ action="CASE" 時は、fromVal="A:1 B:2 C:3 D:4" 形式で指定可能です。 2299 * ※ action="SUBSTR" 時は、fromVal は、数字 のみ設定可能です。 2300 * ※ action="REPLACE" 時は、fromVal は、CSV形式で、複数のリプレースキーを指定できます。 2301 * 例: @1,@2,@3・・ 2302 * ※ action="FOR,FOR_LIST" 時は、繰り返し文字列の作成開始文字を指定します。 2303 * ※ action="FORTM,FORTM_LIST" 時は、繰り返し日付文字列の作成開始日付を指定します。 2304 * ※ action="HMCSV" 時は、時刻のCSVリストの開始日付を指定します。 2305 * 2306 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 2307 * 2308 * @param from 置換え前の部分文字列 2309 * @see #setToVal(String) 2310 */ 2311 public void setFromVal( final String from ) { 2312 fromVal = nval( getRequestParameter( from ),fromVal ); 2313 } 2314 2315 /** 2316 * 【TAG】部分文字列置換の 置換え後の部分文字列(to)を指定します。 2317 * 2318 * @og.tag 2319 * value の値から、指定された正規表現(from)に一致する、この文字列の各部分文字列に対し、 2320 * 指定された文字列(to)で置換します。 2321 * value.replaceAll( from, to ) という文法で処理します。 2322 * 2323 * ※ action="SUBSTR" 時は、toVal は、数字 のみ設定可能です。 2324 * ※ action="REPLACE" 時は、toVal は、CSV形式で、複数の置換え後の文字列を指定できます。 2325 * 例: VLA1,VAL2,VAL・・ 2326 * ※ action="REPLACE" 時に、toVal='""' を指定すると、ゼロ文字列としてfromValの削除になります。 2327 * ※ action="FOR,FOR_LIST" 時は、繰り返し文字列の作成終了文字を指定します(結果に同値を含みます)。 2328 * ※ action="FORTM,FORTM_LIST" 時は、繰り返し日付文字列の作成終了日付を指定します(結果に同値は含みません)。 2329 * ※ action="HMCSV" 時は、時刻のCSVリストの終了日付を指定します(結果に同値は含みません)。 2330 * 2331 * ※ 8.4.2.0 (2023/03/03) 2332 * "HMCSV,FORTM,FORTM_LIST" は、同値を含みませんが、飛び越えて指定したい場合(範囲指定で 2333 * 内側に入れたい場合など)には、useSkipOver で追い越し制御をできるようにします。 2334 * 2335 * @og.rev 5.2.2.0 (2010/11/01) 新規追加 2336 * @og.rev 7.3.2.2 (2021/03/31) REPLACEアクションで、toVal に、長さゼロの文字列が扱えるように変更。 2337 * 2338 * @param to 置換え後の部分文字列 2339 * @see #setFromVal(String) 2340 */ 2341 public void setToVal( final String to ) { 2342 toVal = nval( getRequestParameter( to ),toVal ); 2343 2344 if( "\"\"".equals( toVal ) ) { toVal = ""; } // 7.3.2.2 (2021/03/31) 長さゼロの文字列対応 2345 } 2346 2347 /** 2348 * 【TAG】HMCSV,FOR,FOR_LIST,FORTM,FORTM_LISTで使用する、ステップ数を指定します。 2349 * 2350 * @og.tag 2351 * fromVal と、toVal を組み合わせて、使用します。 2352 * action="HMCSV" で、時刻のCSVリストを作成する場合は、ステップ時間を分で指定します(例:1時間=60 , 2時間=120 , 45分=45 など) 2353 * 例えば、value="20171213" fromVal="0600" toVal="1000" skipVal="45" とすると、 2354 * 201712130600,201712130645,201712130730,201712130815,201712130900,201712130945 という文字列を作成します。 2355 * デフォルトは、60分(1時間)です。 2356 * 2357 * action=FOR,FOR_LIST のステップ数の指定時は、一般的な数字です。 2358 * 2359 * action=FORTM,FORTM_LIST のステップ数の指定時は、日数になります。(HMCSVの基準と異なるので注意) 2360 * 特殊系として、"M" を指定した場合は、月毎になります。 2361 * 2362 * skipVal には、マイナスやゼロは、指定できません。 2363 * 2364 * @og.rev 6.8.4.1 (2017/12/18) skipVal 属性 追加 2365 * 2366 * @param skip HMCSVで使用する、ステップ時間を分で指定 2367 */ 2368 public void setSkipVal( final String skip ) { 2369 skipVal = nval( getRequestParameter( skip ),skipVal ); 2370 if( !StringUtil.isNull( skipVal ) ) { 2371 final char ch = skipVal.charAt(0); 2372 if( ch == '-' || ch == '0' ) { 2373 final String errMsg = "skipVal属性には、マイナスやゼロは、指定できません。" 2374 + " skipVal=[" + skipVal + "]" + CR ; 2375 throw new HybsSystemException( errMsg ); 2376 } 2377 } 2378 } 2379 2380 /** 2381 * 【TAG】HMCSVで使用する、toVal と skipValで、toVal の手前(同値を含む)で止める(false)か、追い越した値で止める(true)を指定します(初期値:false)。 2382 * 2383 * @og.tag 2384 * 日付ループで、fromVal ~ toVal で、skipVal 毎に増分させますが、停止条件を指定します。 2385 * toVal を超えない範囲で止める場合は、false(初期値)で、追い越した値で止める場合は、true に設定します。 2386 * 例えば、1 ~ 10 まで、2づつ増分する場合、false : 1,3,5,7,9 となり、true : 1,3,5,7,9,11 となります。 2387 * ※ 対象は、HMCSV、FORTM、FORTM_LIST の日付系の処理に限定します。 2388 * skipVal を使用する、FOR、FOR_LISTは、この設定に無関係に、toVal 以内(同値を含む)で終了します。 2389 * 初期値は、false です。 2390 * 2391 * @og.rev 8.4.2.0 (2023/03/03) HMCSV,FORTM,FORTM_LIST に、追い越し制御(useSkipOver)を追加する。 2392 * 2393 * @param flag skipVal増分時の停止条件 [true:toVal以上/false:toVal以内] 2394 */ 2395 public void setUseSkipOver( final String flag ) { 2396 useSkipOver = nval( getRequestParameter( flag ),useSkipOver ); 2397 } 2398 2399 /** 2400 * 【TAG】actionが、FORMAT,FOR,FOR_LIST,FORTM,FORTM_LIST の場合の文字列変換フォーマットを指定します。 2401 * 2402 * @og.tag 2403 * FORMAT,FOR,FOR_LIST の場合に生成する文字列のフォーマットは、String#formatメソッド を使用します。 2404 * FORTM,FORTM_LIST の場合に生成する日付文字列のフォーマットは、HybsDateUtil#getDateFormatメソッド を使用します。 2405 * 2406 * @og.rev 8.0.1.2 (2021/11/19) format 属性 追加 2407 * 2408 * @param fmt 数値や日付に変換する場合のフォーマットを指定 2409 */ 2410 public void setFormat( final String fmt ) { 2411 format = nval( getRequestParameter( fmt ),format ); 2412 } 2413 2414 /** 2415 * 【TAG】暗号化、復号化に利用する暗号化キーを指定します。 2416 * 2417 * @og.tag 2418 * 暗号化キーをしています。 2419 * 未設定の場合は、エンジンで用意されているキーを利用します。 2420 * 暗号化キーは8の倍数の文字数が推奨されています。 2421 * 2422 * @og.rev 5.10.4.0 (2018/10/05) 新規追加 2423 * 2424 * @param cKey 暗号化キー 2425 */ 2426 public void setCryptKey( final String cKey ) { 2427 cryptKey = nval( getRequestParameter( cKey ), cryptKey); 2428 } 2429 2430 /** 2431 * このオブジェクトの文字列表現を返します。 2432 * 基本的にデバッグ目的に使用します。 2433 * 2434 * @og.rev 4.3.4.0 (2008/12/01) PageContextのスコープをクラス変数としてアクセス 2435 * @og.rev 5.1.8.0 (2010/07/01) isNullSet 属性 廃止 2436 * @og.rev 6.7.7.2 (2017/04/14) 属性の追加と、各スコープ変数の表示廃止 2437 * 2438 * @return このクラスの文字列表現 2439 * @og.rtnNotNull 2440 */ 2441 @Override 2442 public String toString() { 2443 return ToString.title( this.getClass().getName() ) 2444 .println( "VERSION" ,VERSION ) 2445 .println( "tableId" ,tableId ) 2446 .println( "command" ,command ) 2447 .println( "action" ,action ) 2448 .println( "key" ,key ) 2449 .println( "inValue" ,inValue ) 2450 .println( "value" ,value ) 2451 .println( "defaultVal" ,defaultVal ) 2452 .println( "dbid" ,dbid ) 2453 .println( "scope" ,scope ) 2454 .println( "tblScope" ,tblScope ) // 6.7.7.2 (2017/04/14) 2455 .println( "separator" ,separator ) 2456 .println( "useMultiRows" ,useMultiRows ) 2457 .println( "xssCheck" ,xssCheck ) // 6.7.7.2 (2017/04/14) 2458 .println( "fromVal" ,fromVal ) // 6.7.7.2 (2017/04/14) 2459 .println( "toVal" ,toVal ) // 6.7.7.2 (2017/04/14) 2460 .println( "skipVal" ,skipVal ) // 6.8.4.1 (2017/12/18) 2461 .println( "tmpSelectedAll" ,tmpSelectedAll ) // 6.7.7.2 (2017/04/14) 2462 .println( "Other..." ,getAttributes().getAttribute() ) 2463 .fixForm().toString() ; 2464 } 2465}