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