    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.util.LogWriter;
    019import org.opengion.fukurou.util.StringUtil;
    020import org.opengion.fukurou.util.HybsEntry;
    021import org.opengion.fukurou.util.HybsDateUtil;
    022
    023import java.util.Calendar;
    024import java.util.Set;
    025import java.util.Map;
    026import java.util.HashMap;
    027import java.util.List;
    028import java.util.ArrayList;
    029import java.util.Iterator;
    030import java.util.Arrays;
    031
    032import java.net.InetAddress;
    033import java.net.UnknownHostException;
    034
    035/**
    036 * 共通的に、使用されるシステム関連メソッドを集約したクラスです。
    037 *
    038 * 全変数は、public static final 宣言されています。
    039 * メソッドは、日付取得，エラーメッセージ処理 を行っています。
    040 *
    041 * @og.group 初期化
    042 *
    043 * @version  4.0
    044 * @author       Kazuhiko Hasegawa
    045 * @since    JDK5.0,
    046 */
    047public final class HybsSystem {
    048
    049        /** バッファの初期容量を通常より若干多い目に設定します。  {@value}  */
    050        public static final int BUFFER_SMALL = 50;
    051
    052        /** バッファの初期容量を通常より多い目に設定します。  {@value}  */
    053        public static final int BUFFER_MIDDLE = 200;
    054
    055        /** バッファの初期容量を通常より大幅に多い目に設定します。  {@value} */
    056        public static final int BUFFER_LARGE  = 500;
    057
    058        /** システム依存の改行記号をセットします。 */
    059        public static final String CR = System.getProperty("line.separator");
    060
    061        /** HTMLでの改行記号( &lt;br /&gt; )をセットします。  */
    062        public static final String BR = "<br />" + CR ;
    063
    064        /** システム依存のファイルセパレーター文字をセットします。 */
    065        public static final char FS = System.getProperty("file.separator").charAt(0);
    066
    067        /** システム設定ＤＢのキーと値を、Map に読み込みます。  */
    068        // 4.0.0 (2005/01/31) システムパラメータの管理オブジェクト
    069        private static Map<String,String> sysParam = null;
    070
    071        // 4.3.1.0 (2008/09/03) リクエストでのみ生成できる設定値のキャッシュ
    072        private static Map<String, String> reqCache = new HashMap<String, String>();
    073
    074        /** URL の /(ルート)に対応する物理ディレクトリ  */
    075        private static String  realPath = null; // 4.0.0 (2005/01/31)
    076
    077        /** リクエスト関係パラメータの初期設定フラグ */
    078        private static boolean paramSetFlag = false;    // 4.0.0 (2005/11/30)
    079
    080        /**
    081         * テーブル表示時のチェックボックスのname属性  {@value}
    082         * テーブル表示時にチェックボックスを表示しておき、どの行が選ばれたかを
    083         * 指定する場合に、その name 属性に指定するキーの値です。
    084         * 受け取る側は、このキーで、request 情報より選ばれた行番号を知ることができます。
    085         */
    086        public static final String ROW_SEL_KEY = "h_rowSel";
    087
    088        /**
    089         * テーブル表示のチェックボックスを特定する id の 名称( id は、この名称＋行番号)   {@value}
    090         */
    091        public static final String ROW_ID_KEY = "cb";   // 3.6.0.0 (2004/09/17)
    092
    093        /** session オブジェクトに関連付ける DBTableModel インスタンスのデフォルトキー {@value} */
    094        public static final String TBL_MDL_KEY = "h_tblmdl" ;
    095
    096        // 3.8.1.1 (2005/11/21) ExcelOut の整合性を取る為の仕掛け
    097        /** session オブジェクトに関連付ける ExcelOut の整合性チェック用のキー */
    098        public static final String TBL_MDL_CONKEY = "h_tblmdlCon" ;
    099
    100        /** session オブジェクトに関連付ける Viewform インスタンスのデフォルトキー {@value} */
    101        public static final String VIEWFORM_KEY = "h_vform" ;
    102
    103        /** session オブジェクトに関連付ける ViewLink インスタンスのデフォルトキー {@value} */
    104        public static final String VIEWLINK_KEY = "h_vlink" ;
    105
    106        /** session オブジェクトに関連付ける ViewMark インスタンスのデフォルトキー {@value} */
    107        public static final String VIEW_MARK_KEY = "h_vmark" ;
    108
    109        // 3.8.6.1 (2006/10/20) 編集時にカラムを置き換える 機能に対応
    110        /** session オブジェクトに関連付ける ViewMark:editor インスタンスのデフォルトキー */
    111        public static final String EDIT_MARK_KEY = "h_emark" ;
    112
    113        /** session オブジェクトに関連付ける UserInfo インスタンスのキー {@value} */
    114        public static final String USERINFO_KEY = "h_uInfo" ;
    115
    116        /** session オブジェクトに関連付ける GUIInfo インスタンスのキー {@value} */
    117        public static final String GUIINFO_KEY = "h_gInfo" ;
    118
    119        /** session オブジェクトに関連付ける リクエスト情報キャッシュのキー {@value} */
    120        public static final String REQ_CACHE_KEY = "h_req" ;
    121
    122        /** session オブジェクトに関連付ける エラーメッセージ情報キャッシュのキー {@value} */
    123        public static final String ERR_MSG_KEY = "h_errMsg" ;
    124
    125        // 2.3.1.0 (2002/12/20) 管理者が全てのユーザーにメッセージを同報できるタグを追加
    126        /** session 管理者がステータスバーに設定するオブジェクトのキー {@value} */
    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.3 (2004/04/09) synchronized 用のロックオブジェクトを作成します。
    178        private static final Object lock = new Object();
    179
    180        // 3.5.5.5 (2004/04/23) DBTableModel の整合性パラメータを hidden で出力します。
    181        /** DBTableModel の整合性パラメータをリクエスト情報より取得するときのキー {@value} */
    182        public static final String CONSISTENCY_KEY = "h_consisKey" ;
    183
    184        // 3.5.5.5 (2004/04/23) 転送不要パラメータの先頭に付けるキーワードです。
    185        /** SubmitTag で出力されるボタンパラメータは、次ページへ転送しません。 {@value} */
    186        public static final String NO_XFER_KEY = "hX_" ;
    187
    188        // 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策用キーワードです。
    189        /** 同一セッションでのマルチ起動された場合に、前に開かれた画面からのアクセスを禁止します。 */
    190        public static final String MULTI_SESSION_CHECK = "MSC" ;
    191
    192        /** 3.8.9.1 (2005/07/29) JFreeChart オブジェクトのキャッシュ {@value}  */
    193        public static final String JF_CHART_CACHE_KEY = "h_chartKey" ;
    194
    195        // 3.8.0.8 (2005/10/03) GET時のURL に使用可能な文字数制限
    196        /** URL に使用可能な文字数は最大 2,083 文字
    197         * http://support.microsoft.com/default.aspx?scid=kb;ja;208427
    198         */
    199        public static final int MAX_GET_LENGTH = 2083 ;
    200
    201        /** 4.0.0 (2005/01/31) GUIのロールを区切る、区切り文字                {@value}  */
    202        public static final char GUI_DELIMITER = '|' ;
    203
    204        /** 4.0.0 (2005/01/31) ローカルリソースのオブジェクト保存時のキー    {@value}  */
    205        public static final String LOCAL_RES_KEY = "h_lclRes" ;
    206
    207        /** 4.0.0 (2005/02/28) Tomcat起動時エラーが発生した場合のエラーキー        {@value}  */
    208        public static final String LOCAL_CONTX_ERR_KEY = "h_lclConErr" ;
    209
    210        /** 4.0.0 (2005/08/31) グループメニューのキャッシュキー {@value} */
    211        public static final String GUI_GR_MENU_CACHE_KEY = "h_grpCache" ;
    212
    213        /** 4.0.0 (2005/09/30) 個人別お気に入りメニューの GE16 登録キーワード       {@value} */
    214        public static final String GUI_FAV_MENU_KEY = "GUI_FAV_MENU_KEY" ;
    215
    216        /** 4.0.0 (2005/06/04) DBTableWriter の columns 属性のセッション登録キーワード  {@value} */
    217        public static final String TBL_WRITER_CLMS = "TBL_WRITER_CLMS" ;
    218
    219        /** 4.1.2.1 (2008/03/13) must 属性をrequest変数にセットする場合の キー {@value} */
    220        public static final String MUST_KEY = "h_must_" ;
    221
    222        /** 4.3.0.0 (2008/07/04) 最後に Queryを実行した情報の保存時のキー {@value} */
    223        public static final String DB_LAST_SQL_KEY = "h_lastSql" ;
    224
    225        /** 4.3.3.0 (2008/10/01) ページ内で画面遷移なしモードを指定しようする場合のキー    {@value}  */
    226        public static final String NO_TRANSITION_MODE_KEY = "h_noTrnsKey" ;
    227
    228        /** 4.3.6.0 (2009/04/01) イベントカラムを利用したかどうかのチェックキー        {@value}  */
    229        public static final String USE_EVENT_COLUMN_KEY = "h_eventColumn" ;
    230
    231        /** 5.1.7.0 (2010/06/01) イベントカラムをラップするspanタグのクラス        {@value}  */
    232        public static final String EVENT_COLUMN_CLASS = "h_evElm";
    233
    234        /** 5.1.7.0 (2010/06/01) イベントカラムをラップするspanタグで、子カラムの書き込み可/不可を設定する属性名     {@value}  */
    235        public static final String EVENT_COLUMN_WRITABLE = "h_evWrtbl";
    236
    237        /** 5.1.7.0 (2010/06/01) イベントカラムをラップするspanタグで、子カラムのIDを設定する属性名   {@value}  */
    238        public static final String EVENT_COLUMN_ID = "h_evCid";
    239
    240        /** 5.1.7.0 (2010/06/01) イベントカラムをラップするspanタグで、子カラムの初期値を設定する属性名  {@value}  */
    241        public static final String EVENT_COLUMN_INITVAL = "h_evVal";
    242
    243        /** 4.3.7.0 (2009/06/01) linkタグのurlCheckキーを出力する際のパラメーターキー       {@value}  */
    244        public static final String URL_CHECK_KEY = "h_urlCheck" ;
    245
    246        /** 4.3.7.5 (2009/07/08) ページ内でajaxSubmitを利用する場合のキー      {@value}  */
    247        public static final String USE_AJAX_SUBMIT_KEY = "h_ajaxSubmit" ;
    248
    249        /** 5.1.6.0 (2010/05/01) Viewでソート済みかどうかを判定する際のキー        {@value} */
    250        public static final String VIEW_SORT_KEY = "h_viewSrt";
    251
    252        /** 5.1.9.0 (2010/08/01) トランザクションを実現する際のキー      {@value} */
    253        public static final String TRANSACTION_KEY = "h_tran";
    254
    255        /** 5.2.2.0 (2010/11/01) URLの引数部をハッシュする際のリクエストキー        {@value} */
    256        public static final String URL_HASH_REQ_KEY = "h_r";
    257
    258        /** 5.3.2.0 (2011/02/01) リクエストパラメーターのキー一覧を保存する際のキー      {@value} */
    259        public static final String PARAM_NAMES_KEY = "h_prmNms";
    260
    261        /** 5.3.6.0 (2011/06/01) クエリを呼び出し時のフォーカスを制御するためのキー      {@value} */
    262        public static final String QUERY_FOCUS_KEY = "h_qryFcs";
    263
    264        // 5.5.9.1 (2012/12/07) セッション作成時に、セッションIDを保存しておく、規定のキー
    265        public static final String SESSION_KEY = "h_session_key";
    266
    267        // 5.7.6.2 (2014/05/16) セッション作成時に、セッションIDを保存しておく、規定のキー
    268        public static final String IE_HTML5_KEY = "h_html5_key";
    269
    270        /**
    271         * 帳票エンコーディング   {@value}
    272         * 設定されていない場合は、UTF-8 に設定されます。
    273         */
    274        public static final String REPORT_ENCODE = "UTF-8" ;
    275
    276        /** 実行しているサーバーの名称 */
    277        public static final String HOST_NAME ;
    278        /** 実行しているサーバーのIPアドレス */
    279        public static final String HOST_ADRS ;
    280
    281        static {
    282                String dmnHost ;
    283                String dnmAdrs ;
    284                try {
    285                        InetAddress address = InetAddress.getLocalHost();
    286                        dmnHost = address.getHostName() ;
    287                        dnmAdrs = address.getHostAddress() ;
    288                }
    289                catch( UnknownHostException ex ) {
    290                        dmnHost = "Unknown";
    291                        dnmAdrs = "Unknown";
    292                }
    293                HOST_NAME = dmnHost;
    294                HOST_ADRS = dnmAdrs;
    295        }
    296
    297        /**
    298         * デフォルトコンストラクターをprivateにして、
    299         * オブジェクトの生成をさせないようにする。
    300         *
    301         */
    302        private HybsSystem() {}
    303
    304        /**
    305         * 内部システムリソースマップオブジェクトを設定します。
    306         *
    307         * @og.rev 3.5.3.1 (2003/10/31) 新規作成
    308         * @og.rev 4.0.0.0 (2005/01/31) Ver4 のシステムパラメータ情報の取得処理を追加します。
    309         * @og.rev 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをキャッシュから復元
    310         *
    311         * @param       param   システムリソースマップ
    312         */
    313        public static void setInitialData( final Map<String,String> param ) {
    314                synchronized( lock ) {
    315                        sysParam        = param;
    316                        realPath        = param.get( "REAL_PATH" );     // 4.0.0 (2005/01/31)
    317                        // 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをキャッシュから復元
    318                        if( paramSetFlag ) {
    319                                sysParam.putAll( reqCache );
    320                        }
    321                }
    322
    323                System.out.println( "    [" + sysParam.get( "CONTEXT_NAME" ) + "] のシステムパラメータが、[" + sysParam.size() + "] 件設定されました。" );
    324        }
    325
    326        /**
    327         * システムパラメータ情報を取得します。
    328         * Ver3 では、プロパティーファイルでリソースを提供している為、
    329         * 立ち上げタイミングとの関係で始めて使用する場合にデータを取得します。
    330         *
    331         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    332         *
    333         * @param       key     システムパラメータのキー
    334         *
    335         * @return      システムパラメータ の値
    336         */
    337        private static String getParam( final String key ) {
    338                synchronized( lock ) {
    339                        return sysParam.get( key );
    340                }
    341        }
    342
    343        /**
    344         * システムパラメータの追加情報セットが終了しているかどうかを取得します。
    345         * 設定処理を行うかどうかの判定に使用します。
    346         *
    347         * @og.rev 4.0.0.0 (2005/11/30) 新規作成
    348         *
    349         * @return      true:設定完了 / false:未完了(設定可能)
    350         * @see #setRequestParam( String,String,int,String )
    351         */
    352        public static boolean isParamSet() {
    353                return paramSetFlag;
    354        }
    355
    356        /**
    357         * システムパラメータ情報を追加設定します。
    358         * これは、SERVER_NAME、SERVER_URL、CONTEXT_URL などのリクエストオブジェクトから
    359         * しか取得できない共有情報を、登録する場合に使用します。
    360         * これらの値は、taglib/JspInitTag タグでセットされます。
    361         * セットする前に、isParamSet() で設定済みかどうか判断してください。
    362         * このメソッドは、isParamSet() の値に関係なく、セットします。
    363         *
    364         * @og.rev 4.0.0.0 (2005/01/31) 新規作成
    365         * @og.rev 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLのキャッシュ処理追加
    366         *
    367         * @param       serverName      サーバー名
    368         * @param       scheme  スキーマ
    369         * @param       port    ポート番号
    370         * @param       path    コンテキストパス
    371         * @see #isParamSet()
    372         */
    373        public static void setRequestParam( final String serverName,final String scheme,
    374                                                                                final int port,final String path ) {
    375                synchronized( lock ) {
    376                        sysParam.put( "SERVER_NAME",serverName );
    377
    378                        String portStr = ( port == 80 ) ? "" : ":" + port ;
    379                        String serverURL = scheme + "://" + serverName + portStr ;
    380                        sysParam.put( "SERVER_URL",serverURL + "/" );
    381
    382                        String contextURL = serverURL + path + "/" ;
    383                        sysParam.put( "CONTEXT_URL",contextURL );
    384                        // 4.3.1.0 (2008/09/03) SERVER_NAME,SERVER_URL,CONTEXT_URLをキャッシュして置く
    385                        reqCache.put( "SERVER_NAME",serverName );
    386                        reqCache.put( "SERVER_URL",serverURL + "/" );
    387                        reqCache.put( "CONTEXT_URL",contextURL );
    388                        paramSetFlag = true;
    389                }
    390        }
    391
    392        /**
    393         * 現在日付、時刻を所得します。
    394         * 出力フォーマットは、システムパラメータ の SYS_TIME の
    395         * 設定を適用します。( "yyyy/MM/dd HH:mm:ss" )
    396         *
    397         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    398         *
    399         * @return      現在日付、時刻 ( 例 2001/04/17 15:48:22 )
    400         */
    401        public static String getDate() {
    402                return getDate( getParam( "SYS_TIME" ) );
    403        }
    404
    405        /**
    406         * 指定時刻をデフォルトのフォーマットで、所得します。
    407         * フォーマットの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
    408         * 出力フォーマットは、システムパラメータ の SYS_TIME の
    409         * 設定を適用します。( "yyyy/MM/dd HH:mm:ss" )
    410         *
    411         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    412         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    413         *
    414         * @param       time 指定のカレントタイム
    415         *
    416         * @return      現在日付、時刻( 例 2001/04/17 15:48:22 )
    417         */
    418        public static String getDate( final long time ) {
    419                String form = getParam( "SYS_TIME" );
    420                return HybsDateUtil.getDate( time , form );
    421        }
    422
    423        /**
    424         * 現在日付、時刻をフォーマットを指定して、所得します。
    425         * フォーマットの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
    426         *
    427         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    428         * ※ このメソッドを廃止して、直接 HybsDateUtil を使ってもよいが、とりあえず残しておきます。
    429         *
    430         * @param       form フォーム文字列 ( 例 "yyyy/MM/dd HH:mm:ss.SSS" )
    431         *
    432         * @return      現在日付、時刻
    433         */
    434        public static String getDate( final String form ) {
    435                return HybsDateUtil.getDate( form );
    436        }
    437
    438        /**
    439         * 指定時刻をデフォルトのフォーマットで、所得します。
    440         * フォーマットの指定方法は、java.text.SimpleDateFormat の指定方法と同一です。
    441         * 出力フォーマットは、システムパラメータ の SYS_TIME の
    442         * 設定を適用します。( "yyyy/MM/dd HH:mm:ss" )
    443         *
    444         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
    445         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    446         * ※ このメソッドを廃止して、直接 HybsDateUtil を使ってもよいが、とりあえず残しておきます。
    447         *
    448         * @param       time 指定のカレントタイム
    449         * @param       form フォーム文字列 ( 例 "yyyy/MM/dd HH:mm:ss.SSS" )
    450         *
    451         * @return      現在日付、時刻( 例 2001/04/17 15:48:22 )
    452         */
    453        public static String getDate( final long time,final String form ) {
    454                return HybsDateUtil.getDate( time,form );
    455        }
    456
    457        /**
    458         * システム設定ファイルのデータを所得します。
    459         * キーが存在しない場合は、null を返します。
    460         * キーがnullの場合は、HybsSystemException をスローします。
    461         *
    462         * @og.rev 3.5.5.0 (2004/03/12) {&#064;SYS.XXXX} で使用できる変数を増やします。
    463         * @og.rev 3.5.5.3 (2004/04/09) {&#064;SYS.XXXX} に、DATE というキーを追加します。
    464         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    465         *
    466         * @param       key システム設定 キー
    467         *
    468         * @return      システム設定値
    469         * @throws HybsSystemException キーが null の場合。
    470         */
    471        public static String sys( final String key ) throws HybsSystemException {
    472                if( key == null ) {
    473                        String errMsg = "キーが null です。";
    474                        throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
    475                }
    476
    477                if( "DATE".equals( key ) ) { return getDate() ; }       // 3.5.5.3 (2004/04/09)
    478
    479                String rtn = getParam( key );
    480                if( rtn == null && ! key.startsWith( "h_" ) ) {
    481                        String errMsg = CR + "システムリソースキーが存在しません。key = " + key;
    482                        LogWriter.log( errMsg );
    483                }
    484                return rtn;
    485        }
    486
    487        /**
    488         * システム設定ファイルから、複数のデータを所得します。
    489         * キーが,"ABC" とすれば、それで始まるデータ( ABCD, ABC_01 など)
    490         * を配列で取得できます。
    491         * リターン配列は、ソートされています。
    492         *
    493         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    494         *
    495         * @param       key システム設定 キー(の先頭の部分文字列)
    496         *
    497         * @return      システム設定配列 HybsEntry
    498         */
    499        public static HybsEntry[] sysEntry( final String key ) {
    500
    501                List<HybsEntry> vals = new ArrayList<HybsEntry>();
    502
    503                synchronized( lock ) {
    504                        Iterator<String> keyIte = sysParam.keySet().iterator();         // 4.3.3.6 (2008/11/15) Generics警告対応
    505                        while( keyIte.hasNext() ) {
    506                                String tempKey = keyIte.next();         // 4.3.3.6 (2008/11/15) Generics警告対応
    507                                if( tempKey != null && tempKey.startsWith( key ) ) {
    508                                        HybsEntry entry = new HybsEntry( tempKey,sysParam.get( tempKey ) );
    509                                        vals.add( entry );
    510                                }
    511                        }
    512                }
    513                HybsEntry[] entrys = vals.toArray( new HybsEntry[vals.size()] ) ;
    514                Arrays.sort( entrys );
    515
    516                return entrys;
    517        }
    518
    519        /**
    520         * システム設定ファイルのデータを所得します。
    521         * 特別に,int 型にデータを変換して,渡します。
    522         * 変換できない場合は,NumberFormatException がスローされます。
    523         *
    524         * @og.rev 3.5.3.1 (2003/10/31) エラー時に、判るようにメッセージを出します。
    525         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    526         *
    527         * @param       key システム設定 キー
    528         *
    529         * @return      システム設定値
    530         */
    531        public static int sysInt( final String key ) {
    532                if( key == null ) {
    533                        String errMsg = "キーが null です。";
    534                        throw new HybsSystemException( errMsg );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
    535                }
    536
    537                String tmp = getParam( key );
    538                int rtn ;
    539                try {
    540                        rtn = Integer.parseInt( tmp );
    541                }
    542                catch( NumberFormatException ex2 ) {
    543                        String errMsg = "システムリソース の値が数字ではありません。" + CR
    544                                        + "  Resource key=[" + key + "] val=[" + tmp + "]"  ;
    545                        throw new HybsSystemException( errMsg,ex2 );            // 3.5.5.4 (2004/04/15) 引数の並び順変更
    546                }
    547
    548                return rtn;
    549        }
    550
    551        /**
    552         * システム設定ファイルのデータを所得します。
    553         * 特別に,boolean 型にデータを変換して,渡します。
    554         * 変換できない場合は,NumberFormatException がスローされます。
    555         *
    556         * @og.rev 3.5.6.0 (2004/06/18) Booleanのコンストラクタの代わりに、Boolean.valueOf(...) を使用します。
    557         *
    558         * @param       key システム設定 キー
    559         *
    560         * @return      システム設定値
    561         */
    562        public static boolean sysBool( final String key ) {
    563                return Boolean.valueOf( HybsSystem.sys( key ) ).booleanValue();
    564        }
    565
    566        /**
    567         * システム依存のURL文字列から，実際のディレクトリ名を所得します。
    568         * UNIX と Windows を URL パス名から判断して、実ディレクトリを返します。
    569         * 指定方法は、通常の fileURL 属性と同様に、先頭が、'/' (UNIX) または、２文字目が、
    570         * ":" (Windows)の場合は、指定のURLそのままのディレクトリに、そうでない場合は、
    571         * システムパラメータ の FILE_URL 属性で指定のフォルダの下に、作成されます。
    572         * 相対パス、または、URL の場合は、頭に / を入れないでください。UNIX の
    573         * 絶対パスと判断されます。
    574         * また、絶対パスの最後には、/ を入れておいてください。
    575         *
    576         * @og.rev 4.0.0.0 (2005/01/31) StringUtil.urlAppend メソッドの利用
    577         *
    578         * @param       url URL文字列
    579         *
    580         * @return      ディレクトリ文字列
    581         */
    582        public static String url2dir( final String url ) {
    583                return StringUtil.urlAppend( realPath,url ).replace( '/',FS );
    584        }
    585
    586        /**
    587         * システムリソース情報を取得します。
    588         * 形式は、キー([0])、値([1])の２次元配列です。
    589         * キーでソートされています。
    590         *
    591         * @og.rev 3.5.3.1 (2003/10/31) 新規追加
    592         * @og.rev 4.0.0.0 (2005/01/31) getSystemResource() ⇒ sysParam に変更
    593         *
    594         * @return      システムリソース情報:キー([0])、値([1])の２次元配列
    595         */
    596        public static String[][] getSystemResourceData() {
    597                String[][] rtn ;
    598
    599                synchronized( lock ) {
    600                        Set<Map.Entry<String,String>> entrSet = sysParam.entrySet();
    601                        int size = entrSet.size();
    602                        rtn = new String[2][size];
    603
    604                        Iterator<Map.Entry<String,String>> entrIte = entrSet.iterator();
    605                        for( int i=0; i<size; i++ ) {
    606                                Map.Entry<String,String> entry = entrIte.next();
    607                                rtn[0][i] = entry.getKey();
    608                                rtn[1][i] = entry.getValue();
    609                        }
    610                }
    611                return rtn ;
    612        }
    613
    614        /**
    615         * システムのコンテキスト名を取得します。
    616         * コンテキスト名は、Tomcat の servr.xml で指定する仮想フォルダ名です。
    617         *
    618         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
    619         *
    620         * @return      コンテキスト名(仮想フォルダ名)
    621         */
    622        public static String getContextName() {
    623                return sys( "CONTEXT_NAME" );   // 4.0.0 (2005/01/31)
    624        }
    625
    626        /**
    627         * 指定の引数の日付け文字列(YYYYMMDDHHMMSS)より、カレンダオブジェクトを作成します。
    628         * 引数は、YYYYMMDD の８文字か、YYYYMMDDHHMMSS の１４文字のどちらかです。
    629         *
    630         * @og.rev 3.5.4.8 (2004/02/23) 新規作成
    631         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    632         *
    633         * @param value 日付け文字列(YYYYMMDD または YYYYMMDDHHMMSS)
    634         *
    635         * @return      カレンダオブジェクト
    636         */
    637        public static Calendar getCalendar( final String value ) {
    638                return HybsDateUtil.getCalendar( value );
    639        }
    640
    641        /**
    642         * 指定の引数の日付け文字列(YYYYMMDD)より、差分の日付を計算して返します。
    643         * 引数は、YYYYMMDD と 差分の日数。
    644         *
    645         * @og.rev 4.1.1.0 (2008/01/30) 新規作成
    646         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    647         *
    648         * @param baseDate 日付け文字列(YYYYMMDD)
    649         * @param diff     差分の日数(過去の日付[+]、将来の日付は[-])
    650         *
    651         * @return      結果の日付(YYYYMMDD)
    652         */
    653        public static String getDate( final String baseDate,final int diff ) {
    654                return HybsDateUtil.getDatePlus( baseDate,diff );
    655        }
    656
    657        /**
    658         * 指定されたクラスローダを使って、識別id に応じた オブジェクトを作成します。
    659         * 作成するには、デフォルトコンストラクターが必要です。
    660         * initialize パラメータは true 相当(それまでに初期化されていない場合だけ初期化)です。
    661         *
    662         * @param       cls     作成するクラスのフルネーム
    663         *
    664         * @return      オブジェクト
    665         * @throws RuntimeException 何らかのエラーが発生した場合
    666         */
    667        public static Object newInstance( final String cls ) {
    668                try {
    669                        return Class.forName( cls ).newInstance();
    670                }
    671                catch( ClassNotFoundException ex1 ) {
    672                        String errMsg = "クラスが見つかりません。class=[" + cls + "]" + CR
    673                                                + ex1.getMessage() ;
    674                        throw new RuntimeException( errMsg,ex1 );
    675                }
    676                catch( LinkageError ex2 ) {
    677                        String errMsg = "リンケージが失敗しました。class=[" + cls + "]" + CR
    678                                                + ex2.getMessage();
    679                        throw new RuntimeException( errMsg,ex2 );
    680                }
    681                catch( InstantiationException ex3 ) {
    682                        String errMsg = "インスタンスの生成が失敗しました。class=[" + cls + "]" + CR
    683                                                + ex3.getMessage() ;
    684                        throw new RuntimeException( errMsg,ex3 );
    685                }
    686                catch( IllegalAccessException ex4 ) {
    687                        String errMsg = "クラスまたは初期化子にアクセスできません。class=[" + cls + "]" + CR
    688                                                + ex4.getMessage();
    689                        throw new RuntimeException( errMsg,ex4 );
    690                }
    691                catch( RuntimeException ex5 ) {         // 3.6.0.0 (2004/09/17)
    692                        String errMsg = "予期せぬエラー class=[" + cls + "]" + CR
    693                                                + ex5.getMessage() ;
    694                        throw new RuntimeException( errMsg,ex5 );
    695                }
    696        }
    697}