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