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 /** システム設定DBのキーと値を、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) {@SYS.XXXX} で使用できる変数を増やします。 491 * @og.rev 3.5.5.3 (2004/04/09) {@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) または、2文字目が、 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])の2次元配列 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 * 入力文字列に、{@SYS},{@ENV} の文字列変換を行います。 750 * 751 * {@SYS.XXX} システムリソースMapを元に、文字列を変換します。 752 * {@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}