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