    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.common;
    017
    018import org.opengion.fukurou.system.OgRuntimeException ;                                                 // 6.4.2.0 (2016/01/29)
    019import org.opengion.fukurou.system.LogWriter;
    020import org.opengion.fukurou.system.DateSet;                                                                             // 6.4.2.0 (2016/01/29)
    021import org.opengion.fukurou.system.MsgUtil;                                                                             // 6.4.3.2 (2016/02/19)
    022// import org.opengion.fukurou.system.HybsConst;                                                                // 5.10.9.0 (2019/03/01)
    023import org.opengion.fukurou.util.StringUtil;
    024import org.opengion.fukurou.util.HybsEntry;
    025import static org.opengion.fukurou.system.HybsConst.CR;                                                 // 6.1.0.0 (2014/12/26) refactoring
    026import static org.opengion.fukurou.system.HybsConst.FS;                                                 // 6.1.0.0 (2014/12/26) refactoring
    027import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;                              // 6.2.6.0 (2015/06/19)
    028
    029import java.util.Set;
    030import java.util.TreeSet;                                                                                                               // 6.4.3.3 (2016/03/04)
    031
    032import java.util.Map;
    033import java.util.concurrent.ConcurrentMap;                                                                              // 6.4.3.3 (2016/03/04)
    034import java.util.concurrent.ConcurrentHashMap;                                                                  // 6.4.3.1 (2016/02/12) refactoring
    035import java.util.concurrent.ConcurrentSkipListMap;                                                              // 6.4.3.3 (2016/03/04)
    036import java.util.Locale;                                                                                                                // 6.4.3.2 (2016/02/19)
    037import java.io.File;                                                                                                                    // 6.2.4.1 (2015/05/22) REAL_PATH 対応
    038// 8.0.0.0 (2021/07/01) fukurou.system.HybsConst に移植
    039// import java.net.InetAddress;                                                                                                 //
    040// import java.net.UnknownHostException;                                                                                // 7.0.6.4 (2019/11/29) ｴﾗｰ全てを捉える
    041// import java.net.NetworkInterface;                                                                                    // 7.3.1.1 (2021/02/25)
    042// import java.util.Enumeration;                                                                                                // 7.3.1.1 (2021/02/25)
    043
    044import javax.print.PrintServiceLookup;                                                                                  // 6.2.6.0 (2015/06/19)
    045import javax.print.PrintService;                                                                                                // 6.2.6.0 (2015/06/19)
    046
    047/**
    048 * 共通的に、使用されるｼｽﾃﾑ関連ﾒｿｯﾄﾞを集約したｸﾗｽです。
    049 *
    050 * 全変数は、public static final 宣言されています。
    051 * ﾒｿｯﾄﾞは、日付取得、ｴﾗｰﾒｯｾｰｼﾞ処理 を行っています。
    052 *
    053 * @og.group 初期化
    054 *
    055 * @version     4.0
    056 * @author      Kazuhiko Hasegawa
    057 * @since       JDK5.0,
    058 */
    059public final class HybsSystem {
    060
    061        /** ｼｽﾃﾑ設定DBのｷｰと値を、Map に読み込みます。 */
    062        // 4.0.0 (2005/01/31) ｼｽﾃﾑﾊﾟﾗﾒｰﾀの管理ｵﾌﾞｼﾞｪｸﾄ
    063        /** 6.4.3.1 (2016/02/12) ConcurrentHashMap で同期処理を行います。 */
    064        private static final ConcurrentMap<String,String> SYS_MAP = new ConcurrentHashMap<>();          // 6.4.3.3 (2016/03/04)
    065
    066        // 4.3.1.0 (2008/09/03) ﾘｸｴｽﾄでのみ生成できる設定値のｷｬｯｼｭ
    067        /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */
    068        private static final ConcurrentMap<String, String> REQ_CACHE = new ConcurrentHashMap<>();       // 6.4.9.1 (2016/08/05) reqCache → REQ_CACHE 変更
    069
    070        /** URL の /(ﾙｰﾄ)に対応する物理ﾃﾞｨﾚｸﾄﾘ */
    071        private static String  realPath ;                                               // 4.0.0 (2005/01/31)
    072
    073        /** ﾘｸｴｽﾄ関係ﾊﾟﾗﾒｰﾀの初期設定ﾌﾗｸﾞ */
    074        private static boolean paramSetFlag     ;                                       // 4.0.0 (2005/11/30)
    075
    076        /**
    077         * ﾃｰﾌﾞﾙ表示時のﾁｪｯｸﾎﾞｯｸｽのname属性  {@value}
    078         * ﾃｰﾌﾞﾙ表示時にﾁｪｯｸﾎﾞｯｸｽを表示しておき、どの行が選ばれたかを
    079         * 指定する場合に、その name 属性に指定するｷｰの値です。
    080         * 受け取る側は、このｷｰで、request 情報より選ばれた行番号を知ることができます。
    081         */
    082        public static final String ROW_SEL_KEY = "h_rowSel";
    083
    084        /**
    085         * ﾃｰﾌﾞﾙ表示のﾁｪｯｸﾎﾞｯｸｽを特定する id の 名称( id は、この名称＋行番号) {@value}
    086         */
    087        public static final String ROW_ID_KEY = "cb";   // 3.6.0.0 (2004/09/17)
    088
    089        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける DBTableModel ｲﾝｽﾀﾝｽのﾃﾞﾌｫﾙﾄｷｰ {@value} */
    090        public static final String TBL_MDL_KEY = "h_tblmdl" ;
    091
    092        // 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
    093        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ExcelOut の整合性ﾁｪｯｸ用のｷｰ */
    094        public static final String TBL_MDL_CONKEY = "h_tblmdlCon" ;
    095
    096        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける Viewform ｲﾝｽﾀﾝｽのﾃﾞﾌｫﾙﾄｷｰ {@value} */
    097        public static final String VIEWFORM_KEY = "h_vform" ;
    098
    099        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ViewLink ｲﾝｽﾀﾝｽのﾃﾞﾌｫﾙﾄｷｰ {@value} */
    100        public static final String VIEWLINK_KEY = "h_vlink" ;
    101
    102        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ViewMark ｲﾝｽﾀﾝｽのﾃﾞﾌｫﾙﾄｷｰ {@value} */
    103        public static final String VIEW_MARK_KEY = "h_vmark" ;
    104
    105        // 3.8.6.1 (2006/10/20) 編集時にｶﾗﾑを置き換える 機能に対応
    106        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ViewMark:editor ｲﾝｽﾀﾝｽのﾃﾞﾌｫﾙﾄｷｰ */
    107        public static final String EDIT_MARK_KEY = "h_emark" ;
    108
    109        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける UserInfo ｲﾝｽﾀﾝｽのｷｰ {@value} */
    110        public static final String USERINFO_KEY = "h_uInfo" ;
    111
    112        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける GUIInfo ｲﾝｽﾀﾝｽのｷｰ {@value} */
    113        public static final String GUIINFO_KEY = "h_gInfo" ;
    114
    115        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ﾘｸｴｽﾄ情報ｷｬｯｼｭのｷｰ {@value} */
    116        public static final String REQ_CACHE_KEY = "h_req" ;
    117
    118        /** session ｵﾌﾞｼﾞｪｸﾄに関連付ける ｴﾗｰﾒｯｾｰｼﾞ情報ｷｬｯｼｭのｷｰ {@value} */
    119        public static final String ERR_MSG_KEY = "h_errMsg" ;
    120
    121        /** 6.4.4.1 (2016/03/18) application ｵﾌﾞｼﾞｪｸﾄに関連付ける 共通ﾒｯｾｰｼﾞ情報のｷｰ {@value} */
    122        public static final String COMMON_MSG_KEY = "h_cmnMsg" ;
    123
    124        // 2.3.1.0 (2002/12/20) 管理者が全てのﾕｰｻﾞｰにﾒｯｾｰｼﾞを同報できるﾀｸﾞを追加
    125        // /** session 管理者がｽﾃｰﾀｽﾊﾞｰに設定するｵﾌﾞｼﾞｪｸﾄのｷｰ {@value} */
    126        // 7.4.4.0 (2021/06/30) openGionV8事前準備(未使用の為廃止)
    127        // public static final String ST_BAR_OBJ_KEY = "h_stBar" ;
    128
    129        // 3.0.0.0 (2002/12/25) SceduleTag 追加の伴う、Timerｵﾌﾞｼﾞｪｸﾄの管理用ｷｰ追加
    130        /** Timerｵﾌﾞｼﾞｪｸﾄの管理用ｷｰ {@value} */
    131        public static final String SCEDULE_KEY = "h_timer" ;
    132
    133        // 3.0.0.0 (2002/12/25) SceduleTag 追加の伴う、Timerｵﾌﾞｼﾞｪｸﾄの管理用ｷｰ追加
    134        /** TimerTaskｵﾌﾞｼﾞｪｸﾄの管理用ｷｰ {@value} */
    135        public static final String SCEDULE_TASK_KEY = "h_timer_task" ;
    136
    137        // 3.1.2.0 (2003/04/07) ｿｰｽｺｰﾄﾞ中の固定値を、定義ﾌｧｲﾙを使用するように変更する。
    138        /** Forward時の転送先ﾍﾟｰｼﾞ名をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    139        public static final String FORWARD_PAGE_KEY = "h_fpg" ;
    140
    141        // 3.1.2.0 (2003/04/07) ｿｰｽｺｰﾄﾞ中の固定値を、定義ﾌｧｲﾙを使用するように変更する。
    142        /** Forward時の転送元ﾍﾟｰｼﾞ名をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    143        public static final String REVIEW_PAGE_KEY = "h_rpg" ;
    144
    145        // 3.1.8.0 (2003/05/16) BACK_GAMENID のｷｬｯｼｭ方法を、通常のﾘｸｴｽﾄ情報と分離して、管理する。
    146        /** BACK_GAMENID情報をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    147        public static final String BACK_GAMENID_KEY = "h_bgid" ;
    148
    149        // 4.0.1.0 (2007/12/17) BACK_ADDRESS のｷｬｯｼｭ方法を、通常のﾘｸｴｽﾄ情報と分離して、管理する。
    150        /** BACK_GAMENID情報をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    151        public static final String BACK_ADDRESS_KEY = "h_bgadrs" ;
    152
    153        // 3.7.0.3 (2005/03/01) 戻るﾘﾝｸで戻る行番号を指定します。(BACK_GAMENIDとｾｯﾄ)
    154        /** BACK_ROW情報をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    155        public static final String BACK_ROW_KEY = "h_brow" ;
    156
    157        // 3.1.9.0 (2003/05/16) ShellTag で、Shell ｵﾌﾞｼﾞｪｸﾄをｷｰﾌﾟする為のｷｰを作成。
    158        /** Shell ｵﾌﾞｼﾞｪｸﾄをｾｯｼｮﾝに登録するときのｷｰ {@value} */
    159        public static final String SHELL_KEEP_KEY = "h_shKeepKey" ;
    160
    161        // 3.5.0.0 (2003/09/17) ﾕｰｻﾞｰ変更時の、旧ﾕｰｻﾞｰIDのをｷｰﾌﾟする為のｷｰを作成。
    162        /** oldUserId 文字列をｾｯｼｮﾝに登録するときのｷｰ {@value} */
    163        public static final String OLD_USERID_KEY = "h_oldID" ;
    164
    165        // 3.5.4.7 (2004/02/06) DBTableModelのｿｰﾄ時のｶﾗﾑ名の受け渡しｷｰ。
    166        /** sortColumns 文字列をﾘｸｴｽﾄ情報より取得するときのｷｰ {@value} */
    167        public static final String SORT_COLUMNS = "h_sortClmns" ;
    168
    169        // 3.5.4.7 (2004/02/06) DBTableModelのｿｰﾄ時のｿｰﾄ方向の受け渡しｷｰ。
    170        /** sortAscending をﾘｸｴｽﾄ情報より取得するときのｷｰ {@value} */
    171        public static final String SORT_ASCENDING = "h_sortAsc" ;
    172
    173        // 3.5.5.0 (2004/03/12) ｷｰ＋行番号の連結文字列(例：__)を設定します。
    174        /** ｶﾗﾑID(連結文字列)行番号の連結文字列を定義 {@value} */
    175        public static final String JOINT_STRING = "__" ;
    176
    177        // 3.5.5.5 (2004/04/23) DBTableModel の整合性ﾊﾟﾗﾒｰﾀを hidden で出力します。
    178        /** DBTableModel の整合性ﾊﾟﾗﾒｰﾀをﾘｸｴｽﾄ情報より取得するときのｷｰ {@value} */
    179        public static final String CONSISTENCY_KEY = "h_consisKey" ;
    180
    181        // 3.5.5.5 (2004/04/23) 転送不要ﾊﾟﾗﾒｰﾀの先頭に付けるｷｰﾜｰﾄﾞです。
    182        /** SubmitTag で出力されるﾎﾞﾀﾝﾊﾟﾗﾒｰﾀは、次ﾍﾟｰｼﾞへ転送しません。 {@value} */
    183        public static final String NO_XFER_KEY = "hX_" ;
    184
    185        // 3.8.0.0 (2005/06/07) 同一ｾｯｼｮﾝでのﾏﾙﾁ起動対策用ｷｰﾜｰﾄﾞです。
    186        /** 同一ｾｯｼｮﾝでのﾏﾙﾁ起動された場合に、前に開かれた画面からのｱｸｾｽを禁止します。 */
    187        public static final String MULTI_SESSION_CHECK = "MSC" ;
    188
    189        /** 3.8.9.1 (2005/07/29) JFreeChart ｵﾌﾞｼﾞｪｸﾄのｷｬｯｼｭ {@value} */
    190        public static final String JF_CHART_CACHE_KEY = "h_chartKey" ;
    191
    192        // 3.8.0.8 (2005/10/03) GET時のURL に使用可能な文字数制限
    193        /** URL に使用可能な文字数は最大 2,083 文字
    194         * http://support.microsoft.com/default.aspx?scid=kb;ja;208427
    195         */
    196        public static final int MAX_GET_LENGTH = 2083 ;
    197
    198        /** 4.0.0 (2005/01/31) GUIのﾛｰﾙを区切る、区切り文字 {@value} */
    199        public static final char GUI_DELIMITER = '|' ;
    200
    201        /** 4.0.0 (2005/01/31) ﾛｰｶﾙﾘｿｰｽのｵﾌﾞｼﾞｪｸﾄ保存時のｷｰ {@value} */
    202        public static final String LOCAL_RES_KEY = "h_lclRes" ;
    203
    204        /** 4.0.0 (2005/02/28) Tomcat起動時ｴﾗｰが発生した場合のｴﾗｰｷｰ {@value} */
    205        public static final String LOCAL_CONTX_ERR_KEY = "h_lclConErr" ;
    206
    207        /** 4.0.0 (2005/08/31) ｸﾞﾙｰﾌﾟﾒﾆｭｰのｷｬｯｼｭｷｰ {@value} */
    208        public static final String GUI_GR_MENU_CACHE_KEY = "h_grpCache" ;
    209
    210        // /** 4.0.0 (2005/09/30) 個人別お気に入りﾒﾆｭｰの GE20 登録ｷｰﾜｰﾄﾞ   {@value} */
    211        // 7.4.4.0 (2021/06/30) openGionV8事前準備(未使用の為廃止)
    212        // public static final String GUI_FAV_MENU_KEY = "GUI_FAV_MENU_KEY" ;
    213
    214        // /** 4.0.0 (2005/06/04) DBTableWriter の columns 属性のｾｯｼｮﾝ登録ｷｰﾜｰﾄﾞ {@value} */
    215        // 7.4.4.0 (2021/06/30) openGionV8事前準備(未使用の為廃止)
    216        // public static final String TBL_WRITER_CLMS = "TBL_WRITER_CLMS" ;
    217
    218        /** 4.1.2.1 (2008/03/13) must 属性をrequest変数にｾｯﾄする場合のｷｰ {@value} */
    219        public static final String MUST_KEY = "h_must_" ;
    220
    221        /** 6.2.0.0 (2015/02/27) aimai 属性をrequest変数にｾｯﾄする場合のｷｰ {@value} */
    222        public static final String AIMAI_KEY = "h_aimai_" ;
    223
    224        /** 4.3.0.0 (2008/07/04) 最後に Queryを実行した情報の保存時のｷｰ {@value} */
    225        public static final String DB_LAST_SQL_KEY = "h_lastSql" ;
    226
    227        /** 4.3.3.0 (2008/10/01) ﾍﾟｰｼﾞ内で画面遷移なしﾓｰﾄﾞを指定しようする場合のｷｰ {@value} */
    228        public static final String NO_TRANSITION_MODE_KEY = "h_noTrnsKey" ;
    229
    230        /** 4.3.6.0 (2009/04/01) ｲﾍﾞﾝﾄｶﾗﾑを利用したかどうかのﾁｪｯｸｷｰ {@value} */
    231        public static final String USE_EVENT_COLUMN_KEY = "h_eventColumn" ;
    232
    233        /** 5.1.7.0 (2010/06/01) ｲﾍﾞﾝﾄｶﾗﾑをﾗｯﾌﾟするspanﾀｸﾞのｸﾗｽ {@value} */
    234        public static final String EVENT_COLUMN_CLASS = "h_evElm";
    235
    236        /** 5.1.7.0 (2010/06/01) ｲﾍﾞﾝﾄｶﾗﾑをﾗｯﾌﾟするspanﾀｸﾞで、子ｶﾗﾑの書き込み可/不可を設定する属性名 {@value} */
    237        public static final String EVENT_COLUMN_WRITABLE = "h_evWrtbl";
    238
    239        /** 5.1.7.0 (2010/06/01) ｲﾍﾞﾝﾄｶﾗﾑをﾗｯﾌﾟするspanﾀｸﾞで、子ｶﾗﾑのIDを設定する属性名 {@value} */
    240        public static final String EVENT_COLUMN_ID = "h_evCid";
    241
    242        /** 5.1.7.0 (2010/06/01) ｲﾍﾞﾝﾄｶﾗﾑをﾗｯﾌﾟするspanﾀｸﾞで、子ｶﾗﾑの初期値を設定する属性名 {@value} */
    243        public static final String EVENT_COLUMN_INITVAL = "h_evVal";
    244
    245        /** 4.3.7.0 (2009/06/01) linkﾀｸﾞのurlCheckｷｰを出力する際のﾊﾟﾗﾒｰﾀｰｷｰ {@value} */
    246        public static final String URL_CHECK_KEY = "h_urlCheck" ;
    247
    248        /** 4.3.7.5 (2009/07/08) ﾍﾟｰｼﾞ内でajaxSubmitを利用する場合のｷｰ {@value} */
    249        public static final String USE_AJAX_SUBMIT_KEY = "h_ajaxSubmit" ;
    250
    251        /** 5.1.6.0 (2010/05/01) Viewでｿｰﾄ済みかどうかを判定する際のｷｰ {@value} */
    252        public static final String VIEW_SORT_KEY = "h_viewSrt";
    253
    254        // /** 5.1.9.0 (2010/08/01) ﾄﾗﾝｻﾞｸｼｮﾝを実現する際のｷｰ {@value} */
    255        // 7.4.4.0 (2021/06/30) openGionV8事前準備(未使用の為廃止)
    256        // public static final String TRANSACTION_KEY = "h_tran";
    257
    258        /** 5.2.2.0 (2010/11/01) URLの引数部をﾊｯｼｭする際のﾘｸｴｽﾄｷｰ {@value} */
    259        public static final String URL_HASH_REQ_KEY = "h_r";
    260
    261        /** 5.3.2.0 (2011/02/01) ﾘｸｴｽﾄﾊﾟﾗﾒｰﾀｰのｷｰ一覧を保存する際のｷｰ {@value} */
    262        public static final String PARAM_NAMES_KEY = "h_prmNms";
    263
    264        /** 5.3.6.0 (2011/06/01) ｸｴﾘを呼び出し時のﾌｫｰｶｽを制御するためのｷｰ {@value} */
    265        public static final String QUERY_FOCUS_KEY = "h_qryFcs";
    266
    267        /** 5.5.9.1 (2012/12/07) ｾｯｼｮﾝ作成時に、ｾｯｼｮﾝIDを保存しておく、規定のｷｰ {@value} */
    268        public static final String SESSION_KEY = "h_session_key";
    269
    270//      /** 5.7.6.2 (2014/05/16) ｾｯｼｮﾝ作成時に、ｾｯｼｮﾝIDを保存しておく、規定のｷｰ {@value} */
    271//      public static final String IE_HTML5_KEY = "h_html5_key";                                        // 8.5.2.0 (2023/07/14) Delete
    272
    273        /** 6.4.5.2 (2016/05/06) UPLOADから呼ばれたかどうかを判定するための、規定のｷｰ {@value} */
    274        public static final String USE_UPLOAD_KEY = "h_UPLOAD";
    275
    276//      // 8.0.0.1 (2021/10/08) USE_STR_CONV_KEY 廃止
    277//      /** 6.8.4.2 (2017/12/25) ｴﾝｺｰﾄﾞ変換対応対応のｷｰ(fileDownloadｻｰﾌﾞﾚｯﾄでｴﾝｺｰﾄﾞをON/OFF指定に利用) {@value} */
    278//      public static final String USE_STR_CONV_KEY = "useStringConvert";
    279
    280        // /**
    281        // * 帳票ｴﾝｺｰﾃﾞｨﾝｸﾞ {@value}
    282        // * 設定されていない場合は、UTF-8 に設定されます。
    283        // */
    284        // 7.4.4.0 (2021/06/30) openGionV8事前準備(未使用の為廃止)
    285        // public static final String REPORT_ENCODE = "UTF-8" ;
    286
    287//      /** 7.0.6.4 (2019/11/29) ｺﾝﾃｷｽﾄがﾛｰﾄﾞされた時刻(yyyyMMddHHmmss) */
    288//      8.3.0.0 (2022/08/01) SYS_MAP に登録する。
    289//      public static final String START_TIME = DateSet.getDate( "yyyyMMddHHmmss" );
    290
    291        /** 8.0.0.0 (2021/07/01) 実行しているｻｰﾊﾞｰの名称 */
    292        public static final String HOST_NAME = org.opengion.fukurou.system.HybsConst.HOST_NAME;
    293        /** 8.0.0.0 (2021/07/01) 実行しているｻｰﾊﾞｰのIPｱﾄﾞﾚｽ */
    294        public static final String HOST_ADRS = org.opengion.fukurou.system.HybsConst.HOST_ADRS;
    295
    296//      static {
    297//              String dmnHost ;
    298//              String dmnAdrs ;
    299//              try {
    300//                      final InetAddress address = InetAddress.getLocalHost();
    301//                      dmnHost = address.getHostName() ;
    302//                      dmnAdrs = address.getHostAddress() ;
    303//              }
    304////            catch( final UnknownHostException ex ) {
    305//              catch( final Throwable th ) {                                           // 7.0.6.4 (2019/11/29) ｴﾗｰ全てを捉える
    306//                      dmnHost = "Unknown";
    307//                      dmnAdrs = "Unknown";
    308//              }
    309//              HOST_NAME = dmnHost;
    310//              HOST_ADRS = dmnAdrs;
    311//      }
    312
    313//      /**
    314//       * ﾎｽﾄ名と、IPｱﾄﾞﾚｽを取得
    315//       *
    316//       * Java VM が実行しているﾎｽﾄ名と、IPｱﾄﾞﾚｽを取得します。
    317//       * InetAddress.getLocalHost().getHostName() で求められる値は、Virtual ｱﾄﾞﾚｽなどの
    318//       * 複数考えられる為、出来るだけ直接設定されているIPｱﾄﾞﾚｽに近い値を取得するようにします。
    319//       * でも、完全には特定できないと思われます。
    320//       *
    321//       * @og.rev 7.3.1.1 (2021/02/25) ﾎｽﾄ名と、IPｱﾄﾞﾚｽを取得
    322//       * @og.rev 8.0.0.0 (2021/07/01) fukurou.system.HybsConst に移植
    323//       */
    324//      static {
    325//              String dmnHost = "Unknown" ;
    326//              String dmnAdrs = "Unknown" ;
    327//              try {
    328//                      boolean isNext = true;
    329//                      final Enumeration<NetworkInterface> enuIfs = NetworkInterface.getNetworkInterfaces();
    330//                      while( isNext && enuIfs.hasMoreElements() ) {
    331//                              final NetworkInterface ni = enuIfs.nextElement();
    332//
    333//                              final String displayName = ni.getDisplayName();
    334//                              if( displayName.contains("Virtual") ) { continue; }
    335//
    336//                              final Enumeration<InetAddress> enuIP = ni.getInetAddresses();
    337//                              while( isNext && enuIP.hasMoreElements() ) {
    338//                                      final InetAddress adrs = enuIP.nextElement();
    339//
    340//                                      if( adrs.isLinkLocalAddress() || adrs.isLoopbackAddress() ) { continue; }
    341//
    342//                                      dmnHost = adrs.getHostName() ;                  // adrs.getCanonicalHostName() はとりあえず使わないでおく。
    343//                                      dmnAdrs = adrs.getHostAddress() ;
    344//                                      isNext = false;
    345//                                      break;
    346//                              }
    347//                      }
    348//              }
    349//              catch( final Throwable th ) {
    350//                      System.err.println( "HOST_NAME and HOST_ADRS Unknown!" );
    351//              }
    352//              HOST_NAME = dmnHost;
    353//              HOST_ADRS = dmnAdrs;
    354//      }
    355
    356        /**
    357         * ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰをprivateにして、
    358         * ｵﾌﾞｼﾞｪｸﾄの生成をさせないようにする。
    359         *
    360         */
    361        private HybsSystem() {}
    362
    363        /**
    364         * 内部ｼｽﾃﾑﾘｿｰｽﾏｯﾌﾟｵﾌﾞｼﾞｪｸﾄを設定します。
    365         *
    366         * @og.rev 3.5.3.1 (2003/10/31) 新規作成
    367         * @og.rev 4.0.0.0 (2005/01/31) Ver4 のｼｽﾃﾑﾊﾟﾗﾒｰﾀ情報の取得処理を追加します。
    368         * @og.rev 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをｷｬｯｼｭから復元
    369         * @og.rev 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをｷｬｯｼｭから復元
    370         * @og.rev 6.2.4.1 (2015/05/22) REAL_PATH 対応。realPath は、setInitialData ではなく、setRealPathﾒｿｯﾄﾞで設定する。
    371         * @og.rev 6.4.3.1 (2016/02/12) ConcurrentHashMap で同期処理を行います。
    372         * @og.rev 6.4.3.3 (2016/03/04) SYS_MAP を、ConcurrentHashMap で同期するため、not null制限ﾁｪｯｸを追加します。
    373         * @og.rev 6.4.9.1 (2016/08/05) reqCache → REQ_CACHE 変更
    374         *
    375         * @param       param   ｼｽﾃﾑﾘｿｰｽﾏｯﾌﾟ
    376         */
    377        public static void setInitialData( final Map<String,String> param ) {
    378                // key,val の not null 制限が解除できないので、とりあえず、ConcurrentHashMap で対応。
    379                SYS_MAP.clear();                                                                        // 初期化した上で、全部ｺﾋﾟｰします。
    380                if( param != null ) {
    381                        // 6.4.3.3 (2016/03/04) SYS_MAP を、ConcurrentHashMap で同期するため、not null制限ﾁｪｯｸを追加します。
    382                        param.forEach( (k,v) -> { if( k != null && v != null ) { SYS_MAP.put( k,v ); } } );
    383                }
    384                // 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをｷｬｯｼｭから復元
    385                if( paramSetFlag ) {
    386                        SYS_MAP.putAll( REQ_CACHE );                                    // 6.4.9.1 (2016/08/05)
    387                }
    388
    389                // 8.3.0.0 (2022/08/01) SYS 変数で受け取れるように、変更
    390                SYS_MAP.put( "START_TIME",DateSet.getDate( "yyyyMMddHHmmss" ) );
    391
    392                System.out.println( "    [" + SYS_MAP.get( "CONTEXT_NAME" ) + "] のシステムパラメータが、[" + SYS_MAP.size() + "] 件設定されました。" );
    393        }
    394
    395        /**
    396         * 内部ｼｽﾃﾑﾊﾟﾗﾒｰﾀ に、realPath を設定します。
    397         *
    398         * その際、Tomcatのﾊﾞｰｼﾞｮﾝ(過去の一部ﾊﾞｰｼﾞｮﾝ)で、最後のﾌｧｲﾙｾﾊﾟﾚｰﾀが
    399         * 付かないｹｰｽがありましたので、付ける方向で、統一します。
    400         * このﾒｿｯﾄﾞは、SystemParameter#loadInitialParameter( ServletContext , String )からのみ
    401         * 呼ばれることを想定しています。
    402         *
    403         * @og.rev 6.2.4.1 (2015/05/22) REAL_PATH 対応。realPath は、setInitialData ではなく、setRealPathﾒｿｯﾄﾞで設定する。
    404         *
    405         * @param       path    context.getRealPath( "" ) を引数で渡してきます。
    406         */
    407        /* default */ static void setRealPath( final String path ) {
    408                if( path != null && path.endsWith( File.separator ) ) {
    409                        realPath = path ;                                                                               // 後ろにｾﾊﾟﾚｰﾀが付いていれば、そのまま。
    410                }
    411                else {
    412                        realPath = path + File.separator ;                                              // 付いていなければ、付ける。
    413                }
    414        }
    415
    416        /**
    417         * 内部ｼｽﾃﾑﾊﾟﾗﾒｰﾀ に、realPath を取得します。
    418         *
    419         * その際、Tomcatのﾊﾞｰｼﾞｮﾝ(過去の一部ﾊﾞｰｼﾞｮﾝ)で、最後のﾌｧｲﾙｾﾊﾟﾚｰﾀが
    420         * 付かないｹｰｽがありましたので、付ける方向で、統一します。
    421         *
    422         * @og.rev 6.2.4.1 (2015/05/22) REAL_PATH 対応。realPath は、setInitialData ではなく、setRealPathﾒｿｯﾄﾞで設定する。
    423         *
    424         * @return      REAL_PATH       ｺﾝﾃｷｽﾄのﾄｯﾌﾟﾊﾟｽ
    425         */
    426        public static String getRealPath() {
    427                return realPath ;
    428        }
    429
    430        /**
    431         * ｼｽﾃﾑﾊﾟﾗﾒｰﾀ情報を取得します。
    432         * Ver3 では、ﾌﾟﾛﾊﾟﾃｨｰﾌｧｲﾙでﾘｿｰｽを提供している為、
    433         * 立ち上げﾀｲﾐﾝｸﾞとの関係で始めて使用する場合にﾃﾞｰﾀを取得します。
    434         *
    435         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    436         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
    437         *
    438         * @param       key     ｼｽﾃﾑﾊﾟﾗﾒｰﾀのｷｰ(not null)
    439         * @return      ｼｽﾃﾑﾊﾟﾗﾒｰﾀの値
    440         */
    441        private static String getParam( final String key ) {
    442                        return SYS_MAP.get( key );
    443        }
    444
    445        /**
    446         * ｼｽﾃﾑﾊﾟﾗﾒｰﾀの追加情報ｾｯﾄが終了しているかどうかを取得します。
    447         * 設定処理を行うかどうかの判定に使用します。
    448         *
    449         * @og.rev 4.0.0.0 (2005/11/30) 新規作成
    450         *
    451         * @return      true:設定完了 / false:未完了(設定可能)
    452         * @see #setRequestParam( String,String,int,String )
    453         */
    454        public static boolean isParamSet() {
    455                return paramSetFlag;
    456        }
    457
    458        /**
    459         * ｼｽﾃﾑﾊﾟﾗﾒｰﾀ情報を追加設定します。
    460         * これは、SERVER_NAME、SERVER_URL、CONTEXT_URL などのﾘｸｴｽﾄｵﾌﾞｼﾞｪｸﾄから
    461         * しか取得できない共有情報を、登録する場合に使用します。
    462         * これらの値は、taglib/JspInitTag ﾀｸﾞでｾｯﾄされます。
    463         * ｾｯﾄする前に、isParamSet() で設定済みかどうか判断してください。
    464         * このﾒｿｯﾄﾞは、isParamSet() の値に関係なく、ｾｯﾄします。
    465         *
    466         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    467         * @og.rev 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLのｷｬｯｼｭ処理追加
    468         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
    469         * @og.rev 6.4.9.1 (2016/08/05) reqCache → REQ_CACHE 変更
    470         *
    471         * @param       serverName      ｻｰﾊﾞｰ名
    472         * @param       scheme          ｽｷｰﾏ
    473         * @param       port            ﾎﾟｰﾄ番号
    474         * @param       path            ｺﾝﾃｷｽﾄﾊﾟｽ
    475         * @see #isParamSet()
    476         */
    477        public static void setRequestParam( final String serverName,final String scheme,
    478                                                                                final int port,final String path ) {
    479
    480                        final String portStr = ( port == 80 ) ? "" : ":" + port ;
    481                        final String serverURL = scheme + "://" + serverName + portStr ;
    482                        final String contextURL = serverURL + path + "/" ;
    483
    484                        SYS_MAP.put( "SERVER_NAME"      , serverName );
    485                        SYS_MAP.put( "SERVER_URL"       , serverURL + "/" );
    486                        SYS_MAP.put( "CONTEXT_URL"      , contextURL );
    487
    488                        // 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをｷｬｯｼｭして置く
    489                        // 6.4.9.1 (2016/08/05) reqCache → REQ_CACHE 変更
    490                        REQ_CACHE.put( "SERVER_NAME"    , serverName );
    491                        REQ_CACHE.put( "SERVER_URL"             , serverURL + "/" );
    492                        REQ_CACHE.put( "CONTEXT_URL"    , contextURL );
    493                        paramSetFlag = true;
    494        }
    495
    496        /**
    497         * 現在日付、時刻を所得します。
    498         * 出力ﾌｫｰﾏｯﾄは、ｼｽﾃﾑﾊﾟﾗﾒｰﾀ の SYS_TIME の
    499         * 設定を適用します。( "yyyy/MM/dd HH:mm:ss" )
    500         *
    501         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    502         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
    503         *
    504         * @return      現在日付、時刻 ( 例 2001/04/17 15:48:22 )
    505         */
    506        public static String getDate() {
    507                return DateSet.getDate( getParam( "SYS_TIME" ) );
    508        }
    509
    510        /**
    511         * 指定時刻をﾃﾞﾌｫﾙﾄのﾌｫｰﾏｯﾄで、所得します。
    512         * ﾌｫｰﾏｯﾄの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
    513         * 出力ﾌｫｰﾏｯﾄは、ｼｽﾃﾑﾊﾟﾗﾒｰﾀ の SYS_TIME の
    514         * 設定を適用します。( "yyyy/MM/dd HH:mm:ss" )
    515         *
    516         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    517         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    518         *
    519         * @param       time    指定のｶﾚﾝﾄﾀｲﾑ
    520         *
    521         * @return      現在日付、時刻( 例 2001/04/17 15:48:22 )
    522         */
    523        public static String getDate( final long time ) {
    524                final String form = getParam( "SYS_TIME" );
    525                return DateSet.getDate( time , form );
    526        }
    527
    528        /**
    529         * ｼｽﾃﾑ設定ﾌｧｲﾙのﾃﾞｰﾀを所得します。
    530         * ｷｰが存在しない場合は、null を返します。
    531         * ｷｰがnullの場合は、HybsSystemException をｽﾛｰします。
    532         *
    533         * @og.rev 6.7.4.1 (2017/02/17) ｷｰが存在しなかった場合のﾛｸﾞ出力を出すかどうか(true:出す)
    534         *
    535         * @param       key     ｼｽﾃﾑ設定 ｷｰ
    536         * @return      ｼｽﾃﾑ設定値
    537         * @og.rtnNotNull
    538         * @throws      HybsSystemException ｷｰが null の場合。
    539         */
    540        public static String sys( final String key ) throws HybsSystemException {
    541                return sys( key , true );
    542        }
    543
    544        /**
    545         * ｼｽﾃﾑ設定ﾌｧｲﾙのﾃﾞｰﾀを所得します。
    546         * ｷｰが存在しない場合は、null を返します。
    547         * ｷｰがnullの場合は、HybsSystemException をｽﾛｰします。
    548         *
    549         * @og.rev 3.5.5.0 (2004/03/12) {&#064;SYS.XXXX} で使用できる変数を増やします。
    550         * @og.rev 3.5.5.3 (2004/04/09) {&#064;SYS.XXXX} に、DATE というｷｰを追加します。
    551         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    552         * @og.rev 6.7.4.1 (2017/02/17) ｷｰが存在しなかった場合のﾛｸﾞ出力を出すかどうか(true:出す)
    553         *
    554         * @param       key                     ｼｽﾃﾑ設定 ｷｰ
    555         * @param       useNoKeyLog     ｼｽﾃﾑﾘｿｰｽｷｰが存在しない場合に、ﾛｸﾞ出力するかどうか [true:出力する/false:出力しない]
    556         * @return      ｼｽﾃﾑ設定値
    557         * @og.rtnNotNull
    558         * @throws      HybsSystemException ｷｰが null の場合。
    559         */
    560        public static String sys( final String key , final boolean useNoKeyLog ) throws HybsSystemException {
    561                if( key == null ) {
    562                        final String errMsg = "キーが null です。";
    563                        throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
    564                }
    565
    566                if( "DATE".equals( key ) ) { return getDate() ; }       // 3.5.5.3 (2004/04/09)
    567
    568                final String rtn = getParam( key );
    569                if( rtn == null && ! key.startsWith( "h_" ) && useNoKeyLog ) {
    570                        final String errMsg = CR + "システムリソースキーが存在しません。key = " + key;
    571                        LogWriter.log( errMsg );
    572                }
    573                return rtn;
    574        }
    575
    576        /**
    577         * ｼｽﾃﾑ設定ﾌｧｲﾙから、複数のﾃﾞｰﾀを所得します。
    578         * ｷｰが、"ABC" とすれば、それで始まるﾃﾞｰﾀ( ABCD, ABC_01 など)
    579         * を配列で取得できます。
    580         * ﾘﾀｰﾝ配列は、ｿｰﾄされています。
    581         *
    582         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    583         * @og.rev 6.3.9.0 (2015/11/06) Map.keySet() ではなく、Map.entrySet() を使う様に変更。
    584         * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。
    585         *
    586         * @param       key     ｼｽﾃﾑ設定 ｷｰ(の先頭の部分文字列)
    587         * @return      ｼｽﾃﾑ設定配列 HybsEntry
    588         */
    589        public static HybsEntry[] sysEntry( final String key ) {
    590                final Set<HybsEntry> entSet = new TreeSet<>();
    591
    592                // 6.4.3.3 (2016/03/04) SYS_MAP を、ConcurrentHashMap で同期するため、not null制限ﾁｪｯｸを追加します。
    593                SYS_MAP.forEach( (k,v) -> { if( k.startsWith( key ) ) { entSet.add( new HybsEntry( k,v ) ); } } );
    594
    595                return entSet.toArray( new HybsEntry[entSet.size()] );
    596        }
    597
    598        /**
    599         * ｼｽﾃﾑ設定ﾌｧｲﾙのﾃﾞｰﾀを所得します。
    600         * 特別に、int 型にﾃﾞｰﾀを変換して渡します。
    601         * 変換できない場合は、NumberFormatException がｽﾛｰされます。
    602         *
    603         * @og.rev 3.5.3.1 (2003/10/31) ｴﾗｰ時に、判るようにﾒｯｾｰｼﾞを出します。
    604         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    605         *
    606         * @param       key     ｼｽﾃﾑ設定 ｷｰ
    607         * @return      ｼｽﾃﾑ設定値
    608         */
    609        public static int sysInt( final String key ) {
    610                if( key == null ) {
    611                        final String errMsg = "キーが null です。";
    612                        throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
    613                }
    614
    615                final String tmp = getParam( key );
    616                int rtn ;
    617                try {
    618                        rtn = Integer.parseInt( tmp );
    619                }
    620                catch( final NumberFormatException ex2 ) {
    621                        final String errMsg = "システムリソース の値が数字ではありません。" + CR
    622                                        + "  Resource key=[" + key + "] val=[" + tmp + "]"  ;
    623                        throw new HybsSystemException( errMsg,ex2 );    // 3.5.5.4 (2004/04/15) 引数の並び順変更
    624                }
    625
    626                return rtn;
    627        }
    628
    629        /**
    630         * ｼｽﾃﾑ設定ﾌｧｲﾙのﾃﾞｰﾀを所得します。
    631         * 特別に、boolean 型にﾃﾞｰﾀを変換して渡します。
    632         * 変換できない場合は、NumberFormatException がｽﾛｰされます。
    633         *
    634         * @og.rev 3.5.6.0 (2004/06/18) Booleanのｺﾝｽﾄﾗｸﾀの代わりに、Boolean.valueOf(...) を使用します。
    635         *
    636         * @param       key     ｼｽﾃﾑ設定 ｷｰ
    637         * @return      ｼｽﾃﾑ設定値
    638         */
    639        public static boolean sysBool( final String key ) {
    640                return Boolean.parseBoolean( HybsSystem.sys( key ) );                                   // 6.1.0.0 (2014/12/26) refactoring
    641        }
    642
    643        /**
    644         * ｼｽﾃﾑ依存のURL文字列から、実際のﾃﾞｨﾚｸﾄﾘ名を所得します。
    645         * UNIX と Windows を URL ﾊﾟｽ名から判断して、実ﾃﾞｨﾚｸﾄﾘを返します。
    646         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、2文字目が、
    647         * ":" (Windows)の場合は、指定のURLそのままのﾃﾞｨﾚｸﾄﾘに、そうでない場合は、
    648         * ｼｽﾃﾑﾊﾟﾗﾒｰﾀ の FILE_URL 属性で指定のﾌｫﾙﾀﾞの下に、作成されます。
    649         * 相対ﾊﾟｽ、または、URL の場合は、頭に / を入れないでください。UNIX の
    650         * 絶対ﾊﾟｽと判断されます。
    651         * また、絶対ﾊﾟｽの最後には、/ を入れておいてください。
    652         *
    653         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend ﾒｿｯﾄﾞの利用
    654         * @og.rev 6.4.2.1 (2016/02/05) 引数をすべて、StringUtil.urlAppend していきます。
    655         * @og.rev 5.10.9.0 (2019/03/01) ｸﾗｳﾄﾞｽﾄﾚｰｼﾞ対応を追加。
    656         * @og.rev 7.0.2.2 (2019/03/25) StringBuilder を使わなくします。
    657         *
    658         * @param       urls    URL文字列(可変長配列)
    659         * @return      ﾃﾞｨﾚｸﾄﾘ文字列
    660         */
    661        public static String url2dir( final String... urls ) {
    662//              return StringUtil.urlAppend( realPath,urls ).replace( '/',FS );
    663//              // 5.10.9.0 (2019/03/01) ADD
    664//              final StringBuilder sb = new StringBuilder( BUFFER_MIDDLE );
    665
    666                // \を/に変換する処理を追加。
    667                final String path = StringUtil.urlAppend( realPath,urls ).replace('\\','/').replace( '/',FS );
    668
    669                // linux環境かつ、2文字目が「:」Windows環境のﾄﾞﾗｲﾌﾞ指定の場合は、頭に「/」を付与して、絶対ﾊﾟｽとして扱う。
    670                return FS == '/' && path.charAt(1) == ':' ? "/" + path : path ;
    671
    672                // linux環境かつ、2文字目が「:」Windows環境のﾄﾞﾗｲﾌﾞ指定の場合は、頭に「/」を付与して、絶対ﾊﾟｽとして扱う。
    673//              if(FS == '/' && path.charAt(1) == ':') {
    674//                      sb.append("/").append(path);
    675//              }else {
    676//                      sb.append(path);
    677//              }
    678//
    679//              return sb.toString();
    680        }
    681
    682        /**
    683         * 絶対ﾊﾟｽと判断されるものは変換せず、それ以外を絶対ﾊﾟｽに変換します。
    684         *
    685         * @og.rev 5.10.9.2 (2019/03/15) ｸﾗｳﾄﾞｽﾄﾚｰｼﾞ対応を追加。
    686         * @og.rev 7.0.2.2 (2019/03/25) StringBuilder を使わなくします。
    687         * @og.rev 5.10.21.1 (2020/04/21) \\から開始するﾃﾞｨﾚｸﾄﾘについても無変換の対象とします。
    688         * @og.rev 7.2.6.2 (2020/07/29) 引数がｾﾞﾛ文字列の場合の処理追加。
    689         *
    690         * @param       url     URL文字列
    691         * @return      ﾃﾞｨﾚｸﾄﾘ文字列
    692         */
    693        public static String url2absPath( final String url ) {
    694                if( url == null || url.isEmpty() ) { return ""; }                                               // 7.2.6.2 (2020/07/29)
    695
    696                final String absPath ;
    697
    698                // 2文字目が「:」の場合はそのままWindowsの絶対ﾊﾟｽとして扱う。
    699//              if( url.charAt(1) == ':' ) {
    700                if( url.charAt(1) == ':' || url.startsWith( "\\\\" )) {                                 // 5.10.21.1
    701                        absPath = url;
    702                }
    703                else {
    704                        // それ以外は絶対ﾊﾟｽに変換する
    705                        final String path = StringUtil.urlAppend( realPath,url ).replace('\\','/').replace( '/',FS );
    706//                      absPath = new File( path ).getAbsolutePath().toString();                        // spotbugs:String.toString() を呼び出すのは冗長です。
    707                        absPath = new File( path ).getAbsolutePath();
    708                }
    709
    710                return absPath;
    711
    712//              // 5.10.9.0 (2019/03/01) ADD
    713//              final StringBuilder sb = new StringBuilder(BUFFER_MIDDLE);
    714//
    715//              // 2文字目が「:」の場合はそのままWindowsの絶対ﾊﾟｽとして扱う。
    716//              if( url.charAt(1) == ':' ) {
    717//                      sb.append(url);
    718//              }
    719//              else {
    720//                      //　それ以外は絶対ﾊﾟｽに変換する
    721//                      final String path = StringUtil.urlAppend( realPath,url ).replace('\\','/').replace( '/',FS );
    722//                      sb.append( new File( path ).getAbsolutePath().toString() );
    723//              }
    724//
    725//              return sb.toString();
    726        }
    727
    728        /**
    729         * ｼｽﾃﾑﾘｿｰｽ情報を取得します。
    730         * 形式は、Map です。
    731         * 実質的には、ｷｰでｿｰﾃｨﾝｸﾞされた、ConcurrentSkipListMap を返します。
    732         *
    733         * @og.rev 6.4.3.3 (2016/03/04) 配列返しではなく、Map を返します。
    734         *
    735         * @return      ｼｽﾃﾑﾘｿｰｽ情報:ｷｰ([0])、値([1])の2次元配列
    736         */
    737        public static ConcurrentMap<String,String> getSystemResourceMap() {
    738                return new ConcurrentSkipListMap<String,String>( SYS_MAP );
    739        }
    740
    741        /**
    742         * ｼｽﾃﾑのｺﾝﾃｷｽﾄ名を取得します。
    743         * ｺﾝﾃｷｽﾄ名は、Tomcat の servr.xml で指定する仮想ﾌｫﾙﾀﾞ名です。
    744         *
    745         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    746         *
    747         * @return      ｺﾝﾃｷｽﾄ名(仮想ﾌｫﾙﾀﾞ名)
    748         */
    749        public static String getContextName() {
    750                return sys( "CONTEXT_NAME" );   // 4.0.0 (2005/01/31)
    751        }
    752
    753        /**
    754         * ｻｰﾊﾞｰのﾌﾟﾘﾝﾀｰ一覧のｽﾍﾟｰｽ区切り文字列を返します。
    755         * ﾌﾟﾘﾝﾀ名にｽﾍﾟｰｽが含まれる場合は、前後にﾀﾞﾌﾞﾙｸｵｰﾄを付けます。
    756         * ここで求めた値は、"SYS.PRINTER" で、取得可能です。(最初の取得時に内部ｷｬｯｼｭされます。)
    757         * SystemData#OMIT_PRINTER_NAMES に登録されている一覧名と先頭一致するﾌﾟﾘﾝﾀは除外します。
    758         * 例えば、Windows等で、初めから登録されている Fax,Microsoft XPS などは、不要なのでOMITします。
    759         *
    760         * @og.rev 6.2.6.0 (2015/06/19) ｻｰﾊﾞｰのﾌﾟﾘﾝﾀｰ一覧のｽﾍﾟｰｽ区切り文字列対応。
    761         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
    762         * @og.rev 7.2.4.0 (2020/05/11) bufに何もｾｯﾄされなかった場合、ﾏｲﾅｽｴﾗｰになった。
    763         *
    764         * @return      ｻｰﾊﾞｰのﾌﾟﾘﾝﾀｰ一覧のｽﾍﾟｰｽ区切り文字列
    765         */
    766        public static String getPrinter() {
    767                String rtn = getParam( "PRINTER" );
    768                if( rtn == null ) {
    769                        final String[] omitNames = HybsSystem.sys( "OMIT_PRINTER_NAMES" ).split( "," ) ;
    770
    771                        final PrintService[] service = PrintServiceLookup.lookupPrintServices( null,null );
    772
    773                        final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ) ;
    774                        for( int i=0; i<service.length; i++ ) {
    775                                final String name = service[i].getName() ;
    776                                boolean isAdd = true;                                           // true:追加する/false:追加しない
    777                                for( int j=0; j<omitNames.length; j++ ) {
    778                                        if( name.startsWith( omitNames[j] ) ) { isAdd = false; break; }
    779                                }
    780                                if( isAdd ) {
    781                                        if( name.contains( " " ) ) {
    782                                                buf.append( '"' ).append( name ).append( "\" " );
    783                                        }
    784                                        else {
    785                                                buf.append( name ).append( ' ' );
    786                                        }
    787                                }
    788                        }
    789                        if( buf.length() > 0 ) {                                                // 7.2.4.0 (2020/05/11)
    790                                buf.setLength( buf.length()-1 );                        // 最後のｽﾍﾟｰｽを削除
    791                        }
    792
    793                        rtn = buf.toString();
    794                        SYS_MAP.put( "PRINTER",rtn );
    795                }
    796                return rtn ;
    797        }
    798
    799        /**
    800         * HybsSystem.sys から識別idとなるｸﾗｽ名を取得して、ｵﾌﾞｼﾞｪｸﾄを作成します。
    801         * 簡易的なﾒｿｯﾄﾞです。
    802         *
    803         * @og.rev 6.4.3.3 (2016/03/04) 新規作成。
    804         *
    805         * @param       <T>             ｷｬｽﾄされて生成される新しいｵﾌﾞｼﾞｪｸﾄ
    806         * @param       sysKey  ｸﾗｽのｷｰとなるID(共通ｷｰ)
    807         * @param       cls             作成するｸﾗｽの個別ｷｰ
    808         *
    809         * @return      Tｵﾌﾞｼﾞｪｸﾄ
    810         * @throws      RuntimeException 何らかのｴﾗｰが発生した場合
    811         */
    812        @SuppressWarnings(value={"unchecked"})
    813        public static <T> T newInstance( final String sysKey,final String cls ) {
    814                final String clsStr = HybsSystem.sys( sysKey + cls );
    815
    816                // NullPointerException が発生するので、事前にﾁｪｯｸします。
    817                if( clsStr == null ) {
    818                        final String errMsg = sysKey + " クラスが見つかりません。class=" + sysKey + cls;
    819                        throw new OgRuntimeException( errMsg );
    820                }
    821
    822                return (T) newInstance( clsStr );
    823        }
    824
    825        /**
    826         * 標準のｸﾗｽﾛｰﾀﾞを使って、識別id に応じた ｵﾌﾞｼﾞｪｸﾄを作成します。
    827         * 作成するには、ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰが必要です。
    828         *
    829         * @og.rev 6.4.3.3 (2016/03/04) ﾘﾌﾚｸｼｮﾝ系の見直しと、例外の共通ｸﾗｽに置き換えます。
    830         * @og.rev 6.8.2.3 (2017/11/10) java9対応(cls.newInstance() → cls.getDeclaredConstructor().newInstance())
    831         *
    832         * @param       <T>     ｷｬｽﾄされて生成される新しいｵﾌﾞｼﾞｪｸﾄ
    833         * @param       cls     作成するｸﾗｽのﾌﾙﾈｰﾑ(識別id)
    834         *
    835         * @return      Tｵﾌﾞｼﾞｪｸﾄ
    836         * @throws      RuntimeException 何らかのｴﾗｰが発生した場合
    837         */
    838        @SuppressWarnings(value={"unchecked"})
    839        public static <T> T newInstance( final String cls ) {
    840                try {
    841                        return (T) Class.forName( cls ).getDeclaredConstructor().newInstance(); // 6.8.2.3 (2017/11/10)
    842                }
    843                catch( final ReflectiveOperationException ex ) {
    844                        final String errMsg = "Class.forName( String ).newInstance() 処理に失敗しました class=[" + cls + "]" + CR
    845                                                + ex.getMessage() ;
    846                        throw new OgRuntimeException( errMsg,ex );
    847                }
    848        }
    849
    850        /**
    851         * "org.opengion.hayabusa.message" の Locale.JAPANESE ﾘｿｰｽから取得するﾒｯｾｰｼﾞを文字列で返します。
    852         *
    853         * id と引数を受け取り、ResourceBundle と、MessageFormat.format で加工した
    854         * 文字列を返します。
    855         * baseName は、F_BS_NM で、Locale に、Locale.JAPANESE を指定したﾒｯｾｰｼﾞを作成します。
    856         * hayabusaﾊﾟｯｹｰｼﾞと、pluginﾊﾟｯｹｰｼﾞで主に使われる、ﾒｯｾｰｼﾞの取得方法です。
    857         *
    858         * @og.rev 6.4.3.2 (2016/02/19) 新規追加
    859         *
    860         * @param       id              ﾘｿｰｽのｷｰとなるID。
    861         * @param       args    ﾘｿｰｽを、MessageFormat.format で加工する場合の引数。
    862         * @return      MessageFormat.formatで加工された文字列
    863         * @see         MsgUtil#H_BS_NM
    864         */
    865        public static String getMsg( final String id , final Object... args ) {
    866                return MsgUtil.getMsg( MsgUtil.H_BS_NM , Locale.JAPANESE , id , args );
    867        }
    868
    869        /**
    870         * 入力文字列に、{&#064;SYS},{&#064;ENV} の文字列変換を行います。
    871         *
    872         *   {&#064;SYS.XXX}  ｼｽﾃﾑﾘｿｰｽMapを元に、文字列を変換します。
    873         *   {&#064;ENV.XXX}  環境変数(Javaｵﾌﾟｼｮﾝ)の文字列を変換します。(java -Dkey=value ｵﾌﾟｼｮﾝ)
    874         *
    875         * @og.rev 6.9.0.1 (2018/02/05) 新規追加
    876         *
    877         * @param       inMsg   入力文字列(nullの場合、そのまま返します)
    878         * @return  変換後文字列
    879         */
    880        public static String changeParam( final String inMsg ) {
    881                if( inMsg == null ) { return inMsg; }
    882
    883                String message = inMsg;
    884
    885                // {@SYS.XXXX} 変数の置換処理
    886                int adrs = message.indexOf( "{@SYS." ) ;
    887                while( adrs >= 0 ) {
    888                        final int end = message.indexOf( '}',adrs ) ;
    889                        final String key = message.substring( adrs+6,end );                     // 6 = "{@SYS.".length のこと。
    890                        final String oldData = "{@SYS." + key + "}" ;
    891                        final String newData = SYS_MAP.getOrDefault( key , "" );        // SYS_MAP は、ConcurrentMap なので、null は、返らない。
    892                        message = StringUtil.replace( message,oldData,newData );
    893                        adrs = message.indexOf( "{@SYS.",adrs ) ;
    894                }
    895                // {@ENV.XXXX} 変数の置換処理
    896                adrs = message.indexOf( "{@ENV." ) ;
    897                while( adrs >= 0 ) {
    898                        final int end = message.indexOf( '}',adrs ) ;
    899                        final String key = message.substring( adrs+6,end );                     // 6 = "{@ENV.".length のこと。
    900                        final String oldData = "{@ENV." + key + "}" ;
    901                        final String newData = System.getProperty( key,"" );
    902                        message = StringUtil.replace( message,oldData,newData );
    903                        adrs = message.indexOf( "{@ENV.",adrs ) ;
    904                }
    905
    906                return message;
    907        }
    908}