    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 * 設定した値は、{&#064;XXXX} 形式で 取り出すことができます。
    063 * また、command ="GET" で 直接画面に値を書き出すことも可能です。
    064 *
    065 * ※ このﾀｸﾞは、Transaction ﾀｸﾞの対象です。
    066 *
    067 * &lt;style&gt;
    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 * &lt;/style&gt;
    086 *
    087 * @og.formSample
    088 * ●形式：&lt;og:value command="SET" key="ABC" value="123" /&gt;
    089 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    090 *
    091 * ●Tag定義：
    092 *   &lt;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開始/終了文字(&gt;&lt;) 存在ﾁｪｯｸを実施するかどうか[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 *   &gt;   ... Body ...
    122 *   &lt;/og:value&gt;
    123 *
    124 * 【廃止】5.1.8.0 (2010/07/01) 物理削除
    125 *  //   nullSet            【廃止】value が NULL の時に、設定するかどうか[true/false]を指定します(初期値:true)
    126 *
    127 * ●使用例
    128 *     ･ &lt;og:value command="SET" key="ABC" value="123" /&gt;
    129 *     ･ &lt;og:value command="SQL"&gt;SELECT 1 TEST FROM DUAL&lt;/og:value&gt;
    130 *     ･ &lt;og:value command="SET" key="DEF" value="{&#064;NOCOMMAND}" defaultVal="0000" /&gt;
    131 *     ･ &lt;og:value command="GET" key="NOKEY" defaultVal="NODATA" /&gt;
    132 *     ･ &lt;og:value command="SET" key="{&#064;ABC}4" value="TEST1234" /&gt;
    133 *     ･ &lt;og:value command="GET" key="ABC" /&gt;
    134 *     ･ &lt;og:value command="SET" action="LOWER" key="LOWERTEST" value="ABCDEF" /&gt; ⇒ abcdef
    135 *     ･ &lt;og:value command="GET" key="LOWERTEST" /&gt;
    136 *     ･ &lt;og:value command="GET" action="UPPER" key="LOWERTEST" /&gt;
    137 *     ･ &lt;og:value command="REMOVE" key="ABC" /&gt;
    138 *     ･ &lt;og:value command="SET" action="FORMAT" key="ABC" value="15" format="%05d" <del>fromVal="%05d"</del> /&gt; ⇒ 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         * また、Ｗｅｂｴﾝｼﾞﾝ内部で使用しているｷｰは、ここではｸﾘｱできません。
    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>ＳＱＬ    </td><td>指定のSQL文の実行結果を、ｶﾗﾑ名をｷｰとして設定します。(useMultiRows="false" 時は、最初のﾃﾞｰﾀを使用)</td></tr>
    1967         *   <tr><td>SQLGET  </td><td>ＳＱＬｹﾞｯﾄ</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上のｴｽｹｰﾌﾟ文字(&amp;lt;,&amp;gt;,&amp;quot;,&amp;apos;,&amp;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などで直接取得したﾃﾞｰﾀを、ﾘｸｴｽﾄ変換({&#064;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_" の４文字分削除
    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         *   {&#064;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開始/終了文字(&gt;&lt;) 存在ﾁｪｯｸを実施するかどうか[true/false]を設定します
    2274         *              (初期値:USE_XSS_CHECK[={@og.value SystemData#USE_XSS_CHECK}])。
    2275         *
    2276         * @og.tag
    2277         * ｸﾛｽｻｲﾄｽｸﾘﾌﾟﾃｨﾝｸﾞ(XSS)対策の一環としてless/greater than signについてのﾁｪｯｸを行います。
    2278         * (&gt;&lt;) が含まれていたｴﾗｰにする(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}