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.servlet; 017 018import org.opengion.fukurou.system.OgRuntimeException; // 6.4.2.0 (2016/01/29) 019import java.io.File; 020import java.io.IOException; 021import java.io.PrintWriter; 022import java.lang.reflect.Field; 023import java.net.URL; 024import java.util.Enumeration; 025import java.util.Map; 026import java.util.concurrent.ConcurrentMap; // 6.4.3.3 (2016/03/04) 027import java.util.jar.JarEntry; 028import java.util.jar.JarFile; 029 030import jakarta.servlet.ServletContext; 031import jakarta.servlet.ServletException; 032import jakarta.servlet.http.HttpServlet; 033import jakarta.servlet.http.HttpServletRequest; 034import jakarta.servlet.http.HttpServletResponse; 035import jakarta.servlet.http.HttpSession; 036 037import org.opengion.fukurou.db.ConnectionFactory; 038import org.opengion.fukurou.util.Attributes; 039import org.opengion.fukurou.util.HybsEntry; 040import org.opengion.fukurou.util.StringUtil; 041import org.opengion.fukurou.fileexec.MainProcess; // 7.2.5.0 (2020/06/01) 042import org.opengion.fukurou.system.BuildNumber; // 6.4.2.0 (2016/01/29) hayabusa.common.BuildNumber → fukurou.system.BuildNumber に移動 043import org.opengion.fukurou.system.Closer; // 5.5.2.6 (2012/05/25) 044import org.opengion.hayabusa.common.HybsSystem; 045import org.opengion.hayabusa.common.SystemManager; 046import org.opengion.hayabusa.common.SystemParameter; 047import org.opengion.hayabusa.common.UserSummary; 048import static org.opengion.fukurou.system.HybsConst.CR; // 6.1.0.0 (2014/12/26) 049import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 6.1.0.0 (2014/12/26) refactoring 050 051import org.opengion.hayabusa.resource.ResourceFactory; // 5.9.1.0 (2015/10/02) 052import org.opengion.hayabusa.resource.UserInfo; // 5.9.1.0 (2015/10/02) 053 054import jakarta.servlet.ServletRegistration; // 6.3.4.0 (2015/08/01) 055import jakarta.servlet.FilterRegistration; // 6.3.4.0 (2015/08/01) 056import jakarta.servlet.annotation.WebServlet; // 7.3.0.0 (2021/01/06) 057 058/** 059 * サーバー管理情報を取得するAdminサーブレットです。 060 * 061 * 引数(URL)に応じて、サーバーの状態結果を返します。 062 * 一般には、http://サーバー:ポート/システムID/jsp/admin?COMMAND=コマンド の 063 * 形式のURL でアクセスします。 064 * 065 * ・COMMAND=infomation 066 * 【サーバー情報】 067 * OS情報 = Windows 7 Service Pack 1 x86 (32) 068 * サーバー名 = 10374232-0004 ( 172.27.26.164 ) 069 * サーブレット = Apache Tomcat/8.0.22 070 * TOMCAT_HOME = C:\opengionV6\apps\tomcat8.0.22 071 * JDKバージョン = Java HotSpot(TM) Server VM 1.8.0_45-b15 072 * JAVA_HOME = C:\opengionV6\apps\jdk180u45\jre 073 * 【実行環境】 074 * REAL_PATH = C:/opengionV6/uap/webapps/gf/ 075 * バージョンNo = openGion 6.2.4.0 Release6 Builds (2015142) 076 * 作成日時 = 2015/05/22 15:31:53 077 * 【ログイン情報】 078 * ログイン人数 = 2 名 ( 明細情報 ) 079 * 【メモリ情報】 080 * 空きメモリ = 129 [MByte] 081 * 合計メモリ = 209 [MByte] 082 * 使用率 = 38 [%] 083 * 【ディスク情報】 084 * 085 * ・COMMAND=close 086 * リソース情報のキャッシュを全てクリアします。 087 * 088 * ・COMMAND=loginUser 089 * 現在のログインユーザーの明細情報を表示します。 090 * SORT=[JNAME,ID,ROLES,IPADDRESS,LOGINTIME] ソートキー 091 * DIREC=[true,false] true:昇順/false:降順 092 * ・COMMAND=systemResource 093 * 現在のシステムリソースの設定情報を表示します。 094 * 095 * ・COMMAND=AccessStop&stop=[true/false] 096 * アクセスストップフィルターの制御(停止、許可)を行います。 097 * ・common/gamen/01_ADMIN/parameter.jsp 098 * 現在のシステムリソースの設定情報を表示します。 099 * 100 * ・common/gamen/01_ADMIN/systemInfo.jsp 101 * システム定数のシステム起動情報を表示します。 102 * 103 * ※ 7.1.0.0 (2020/01/20) 104 * ・common/gamen/01_ADMIN/logLink.jsp 105 * Tomcatのlogを表示します。 106 * 107 * ※ 7.1.0.0 (2020/01/20) 108 * ・common/gamen/01_ADMIN/serviceRestart.jsp 109 * Tomcatのサービスを再起動(停止―開始)します。 110 * 111 * @og.rev 3.5.3.0 (2003/10/27) Admin JSP を Servlet化して、エンジンと共に供給します。 112 * @og.rev 4.0.0.0 (2005/08/31) プラグインのバージョン情報の表示機能を追加 113 * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応 114 * @og.group その他機能 115 * 116 * @version 4.0 117 * @author Kazuhiko Hasegawa 118 * @since JDK5.0, 119 */ 120@WebServlet( "/jsp/admin" ) 121public final class HybsAdmin extends HttpServlet { 122 private static final long serialVersionUID = 624120150522L ; // 6.2.4.1 (2015/05/22) 123 124 private static final String JSP = HybsSystem.sys( "JSP" ); // jspフォルダの正規パス 125 126 private static final long MB = 1024*1024 ; // 6.2.4.1 (2015/05/22) 127 private static final long GB = 1024*1024*1024 ; // 6.2.4.1 (2015/05/22) 128 129 // 7.0.1.0 (2018/10/15) XHTML → HTML5 対応 130 // 8.1.0.0 (2021/12/28) HTML5 準拠に見直し 131// private static final String HEADER = 132// "<!DOCTYPE html>" + CR + 133// "<html class=\"headtype-query\">" + CR + 134// "<head>" + CR + 135// " <meta charset=\"UTF-8\" >" + CR + 136// " <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >" + CR + 137// " <link rel=\"stylesheet\" href=\"" + JSP + "/common/default.css\" type=\"text/css\" >" + CR + 138// " <link rel=\"stylesheet\" href=\"" + JSP + "/custom/custom.css\" type=\"text/css\" >" + CR + 139// " <title>Hybs Admin</title>" + CR + 140// "</head>" + CR; 141 142 // 8.1.0.0 (2021/12/28) HTML5 準拠に見直し(lang="ja",content="IE=edge" 不要,type="text/css" 不要) 143 private static final String HEADER = 144 "<!DOCTYPE html>" + CR + 145 "<html lang=\"ja\" class=\"headtype-query\">" + CR + 146 "<head>" + CR + 147 " <meta charset=\"UTF-8\" >" + CR + 148 " <link rel=\"stylesheet\" href=\"" + JSP + "/common/default.css\" >" + CR + 149 " <link rel=\"stylesheet\" href=\"" + JSP + "/custom/custom.css\" >" + CR + 150 " <title>Hybs Admin</title>" + CR + 151 "</head>" + CR; 152 153 // 3.5.3.1 (2003/10/31) User情報のテーブルの設定を、システムリソース より行う。 154 private static final String TABLE_HEADER = getTableHeaderTag() ; 155 156 // 5.6.6.0 (2013/07/05) getLoginUser( String,boolean ) で、指定するキーを配列で持っておきます。 157 // キーは、SystemManager.getRunningUserSummary 処理内で大文字化されるため、この配列は、表示用と兼用します。 158 private static final String[] USER_KEYS = { "ID","Jname","Roles","IPAddress","LoginTime","LastAccess","LastGamenNm" }; 159 160 // 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 161// private static final String TABLE_WAKU = "<table style=\"margin: 0px 0px 0px 20px;\" frame=\"box\" border=\"1px\" cellspacing=\"0px\" cellpadding=\"0px\" " ; 162 private static final String TABLE_WAKU = "<table border=\"1px\" style=\"margin-left:20px; border-width:medium; border-style:solid; border-collapse:collapse; "; // 8.2.0.2 (2022/06/24) Modify 163 private static final String TABLE_END = "</table>" + CR ; 164 165 // 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 166 private static final String COMMON_MESSAGE = 167 "【共通メッセージを表示する場合は、このテキストフィールドに入力してください。】<br>" + CR + 168 "<form method=\"GET\" action=\"" + JSP + "/admin\" target=\"RESULT\" >" + CR + 169 " <input name=\"message\" size=\"50\" >" + CR + 170 " <button type=\"submit\" name=\"type\" value=\"set\" >Set</button>" + CR + 171 " <button type=\"submit\" name=\"type\" value=\"clear\" >Clear</button>" + CR + 172 " <input type=\"hidden\" name=\"COMMAND\" value=\"commonMessage\" >" + CR + 173 "</form><br><br>" + CR ; 174 175 // 7.1.0.0 (2020/01/27) static で定義しておきます。 176 private static final String[] PLUGIN_TYPE = new String[] { 177 "Query","Renderer","Editor","DBType","ViewForm", 178 "TableReader","TableWriter","TableFilter","ChartWriter","CalendarQuery", 179 "DBConstValue","Daemon","JspCreate" // 5.6.6.0 (2013/07/05) 追加 180 } ; 181 182 // 7.1.0.0 (2020/01/27) static で定義しておきます。 183 private static final String TD_CMD = " <td> [<a href=\"" + JSP + "/admin?COMMAND=" ; 184 private static final String TD_QREF= " <td> [<a href=\"" + JSP + "/common/quickReference.html" ; // クイックリファレンス 専用 185 private static final String TD_GMN = " <td> [<a href=\"" + JSP + "/common/gamen/01_ADMIN/" ; 186 private static final String YESNO = "\" onclick=\"return confirm( '実行してよろしいでしょうか?' );" ; 187 private static final String TGT = "\" target=\"RESULT\" >" ; 188 private static final String END_TD = "</a>]</td>" + CR ; 189 190 private static final String INFOMATION = TD_CMD + "infomation" + TGT + "状況表示" + END_TD ; 191 private static final String CLOSE = TD_CMD + "close" + TGT + "プール削除" + END_TD ; 192 private static final String LOGIN_USER = TD_CMD + "loginUser" + TGT + "ログインユーザー" + END_TD ; 193 private static final String QUICK_REFERENCE = TD_QREF + TGT + "クイックリファレンス" + END_TD ; 194 private static final String SYSTEM_RESOURCE = TD_CMD + "systemResource" + TGT + "システムリソース" + END_TD ; 195 private static final String PARAMETER = TD_GMN + "parameter.jsp?GAMENID=01_ADMIN" + TGT + "パラメータ"+ END_TD ; 196 private static final String LOGLINK = TD_GMN + "logLink.jsp" + TGT + "ログ" + END_TD ; 197 private static final String SERVICE_RESTART = TD_GMN + "serviceRestart.jsp" + YESNO + TGT + "サービス再起動" + END_TD ; 198 199 private static final String PLUGIN = TD_CMD + "plugin" + TGT + "プラグイン情報" + END_TD ; 200 private static final String TAGLIB = TD_CMD + "taglib" + TGT + "タグリブ情報" + END_TD ; 201 private static final String REGISTRATION = TD_CMD + "registrationInfo" + TGT + "Servlet/Filter" + END_TD ; 202 private static final String SYSTEM_INFO = TD_GMN + "systemInfo.jsp" + TGT + "システム状況" + END_TD ; 203 private static final String ACCESS_STOP = "<td colspan=\"2\"> アクセス制限" 204 + "[<a href=\"" + JSP + "/admin?COMMAND=AccessStop&stop=true" + TGT + "停止</a>]/" 205 + "[<a href=\"" + JSP + "/admin?COMMAND=AccessStop&stop=false" + TGT + "開始" + END_TD ; 206 207 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 208 private static final String TD_TD = "</td><td>" ; // tdの終了とtdの開始を連結したもの 209 private static final String TD_TR = "</td></tr>" + CR ; // tdの終了とtrの終了を連結したもの 210 211 /** 212 * fileexecのMainProcess の処理が起動しているかどうかを表示。 213 * 214 * @og.rev 7.2.5.0 (2020/06/01) fileexecのMainProcess の処理が起動しているかどうかを表示 215 * 216 * @return fileexecの起動情報 217 * @og.rtnNotNull 218 */ 219 public static String fileExecCmnt() { 220 final boolean isStart = MainProcess.isStarted(); 221 return "ファイル取込(" + ( isStart ? "起動中" : "停止中" ) + ") " ; 222 223// return "<td colspan=\"2\"> ファイル取込(" 224// + ( isStart ? "起動中" : "停止中" ) + ") " 225// + "[<a href=\"" + JSP + "/admin?COMMAND=fileexec&start=" + !isStart + TGT // 他の admin もJSP が必要なはず。 226// + "<b>" + ( isStart ? "待機する" : "実行する" ) + "</b>" + END_TD 227// + "<td> 起動するには、システム定数で、パラメータID=USE_FILEEXEC を、true に登録してください。(要[プール削除])</td>" ; 228 } 229 230 /** 231 * GET メソッドが呼ばれたときに実行します。 232 * 233 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 234 * @og.rev 3.5.4.1 (2003/12/01) getAdminLink() メソッドを追加 235 * @og.rev 6.3.8.0 (2015/09/11) AccessStop を外部から制御できるように、コマンドと状態を受けるようにする。 236 * @og.rev 5.9.1.0 (2015/10/02) UserInfoセット機能追加 237 * @og.rev 6.3.8.3 (2015/10/03) Servlet/Filter 情報を作成。 238 * @og.rev 6.3.9.1 (2015/11/27) 3項演算子を || or && で簡素化できる(PMD)。 239 * @og.rev 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージを設定します。 240// * @og.rev 7.2.5.0 (2020/06/01) fileexecのMainProcess の処理が起動しているかどうかを表示 241 * 242 * @param req HttpServletRequestオブジェクト 243 * @param res HttpServletResponseオブジェクト 244 * 245 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 246 * @throws IOException 入出力エラーが発生したとき 247 */ 248 @Override 249 public void doGet( final HttpServletRequest req, final HttpServletResponse res) 250 throws ServletException, IOException { 251 252 req.setCharacterEncoding( "UTF-8" ); // 6.4.4.1 (2016/03/18) 253 res.setContentType( "text/html; charset=UTF-8" ); 254 final PrintWriter out = res.getWriter(); 255 256 final String command = req.getParameter( "COMMAND" ); 257 258 out.println( HEADER ); 259 out.println( "<body>" ); 260 261// out.print("<h2>"); 262 out.print("<div style=\"font-size:1.5em;\">"); 263 out.print( req.getServerName() ); 264 out.print( ":" ); 265 out.print( req.getServerPort() ); 266 out.print( req.getContextPath() ); 267// out.println("</h2>"); 268 out.println("</div>"); 269 270 if( "infomation".equalsIgnoreCase( command ) ) { 271 out.print( getInfomation() ); 272 } 273 else if( "close".equalsIgnoreCase( command ) ) { 274 out.print( getCloseMessage( req.getSession() ) ); 275 } 276 else if( "loginUser".equalsIgnoreCase( command ) ) { 277 final String sort = req.getParameter( "sort" ); 278 final String direc = req.getParameter( "direc" ); 279 // 6.3.9.1 (2015/11/27) 3項演算子を || or && で簡素化できる(PMD)。 280 final boolean dir = direc == null || Boolean.parseBoolean( direc ); // 6.3.9.1 (2015/11/27) 281 282 out.print( COMMON_MESSAGE ); // 6.4.4.1 (2016/03/18) 283 out.print( getLoginUser(sort,dir) ); 284 } 285 // 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージを設定します。 286 else if( "commonMessage".equalsIgnoreCase( command ) ) { 287 final String type = req.getParameter( "type" ); 288 final String message = req.getParameter( "message" ); 289 out.print( setCommonMessage( type , message , req.getSession() ) ); 290 } 291 else if( "plugin".equalsIgnoreCase( command ) ) { 292 out.print( getPlugInInfo() ); 293 } 294 else if( "taglib".equalsIgnoreCase( command ) ) { 295 out.print( getTaglibInfo() ); 296 } 297 else if( "systemResource".equalsIgnoreCase( command ) ) { 298 out.print( getSystemResource() ); 299 } 300 // 6.3.8.0 (2015/09/11) AccessStop を外部から制御できるように、コマンドと状態を受けるようにする。 301 else if( "AccessStop".equalsIgnoreCase( command ) ) { 302 out.print( getAccessStop( req.getParameter( "stop" ) ) ); // 6.3.8.0 (2015/09/11) 303 } 304 // 5.9.1.0 (2015/10/02) UserInfoセット機能追加 305 else if( "UserInfo".equalsIgnoreCase( command ) ){ // 5.9.1.0 (2015/10/02) 306 out.print( setUserinfo( req ) ); 307 } 308 // 6.3.8.3 (2015/10/03) Servlet/Filter 情報を作成。 309 else if( "registrationInfo".equalsIgnoreCase( command ) ) { 310 out.print( getRegistrationMessage( req.getSession() ) ); 311 } 312// else if( "fileexec".equalsIgnoreCase( command ) ) { // 7.2.5.0 (2020/06/01) 313// out.print( getFileExecInfo( req.getParameter( "start" ) ) ); 314// } 315 else { 316 out.print( getAdminLink() ); // 3.5.4.1 (2003/12/01) 追加 317 } 318 319 out.println("</body></html>"); 320 } 321 322 /** 323 * infomation 情報を作成します。 324 * 325 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 326 * @og.rev 5.6.7.3 (2013/08/23) TOMCAT_WORKは、TOMCAT_HOME に置き換えます。 327 * @og.rev 6.2.4.1 (2015/05/22) ディスク容量を求めます。 328 * @og.rev 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 329 * @og.rev 6.3.9.0 (2015/11/06) 整数値演算なので、Math.round 不要 330 * @og.rev 6.5.0.1 (2016/10/21) ENGINE_INFO は、直接、BuildNumber から取得する。 331 * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 332 * @og.rev 7.1.0.0 (2020/01/20) OFFICE_HOME,EXT_DIR,SYS_LOG_URL,LOGS_DIR 環境変数の追加。 333 * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応 334 * 335 * @return infomation情報 336 * @og.rtnNotNull 337 */ 338 private String getInfomation() { 339 // 4.0.0 (2005/01/31) ログイン数の取得方法の変更。 340 final int loginCount = SystemManager.getRunningCount() ; 341 342 final long freeMemory = Runtime.getRuntime().freeMemory()/MB ; // 6.3.9.0 (2015/11/06) 整数値演算なので、Math.round 不要 343 final long totalMemory = Runtime.getRuntime().totalMemory()/MB; // 6.3.9.0 (2015/11/06) 整数値演算なので、Math.round 不要 344 final long useMemoryRatio = (totalMemory-freeMemory)*100/totalMemory ; // 6.3.9.0 (2015/11/06) 整数値演算なので、Math.round 不要 345 final String bgCls = useMemoryRatio <= 50 ? "OK" : useMemoryRatio <= 80 ? "CAUT" : "NG" ; // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 346 347 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 348 349 rtn.append( "<table border = \"0px\" >" ); 350// // 7.1.0.0 (2020/01/20) static定義をやめて、getInfomation() メソッド内で都度呼びます。 351 tableTr1( rtn,"サーバー情報" ); 352 tableTr( rtn,"OS情報" , BuildNumber.OS_INFO ); // 6.5.0.1 (2016/10/21) 353 tableTr( rtn,"サーバー名" , HybsSystem.sys( "SERVER_INFO" ) ); // 10759278-0002 354 tableTr( rtn,"サーブレット" , HybsSystem.sys( "SERVLET_INFO" ) ); // Apache Tomcat/X.X.XX 355 tableTr( rtn,"TOMCAT_HOME" , HybsSystem.sys( "TOMCAT_HOME" ) ); // /apps/tomcatX.X.XX 356 tableTr( rtn," ログフォルダ" , HybsSystem.sys( "TOMCAT_LOGS" ) ); // /apps/tomcatX.X.XX/logs 357 tableTr( rtn,"JDKバージョン" , BuildNumber.JDK_INFO ); // OpenJDK 64-Bit Server VM 11.0.5+10-LTS 358 tableTr( rtn,"JAVA_HOME" , HybsSystem.sys( "JAVA_HOME" ) ); // apps/jdkX.X.X 359 tableTr( rtn," 拡張フォルダ" , HybsSystem.sys( "EXT_DIR" ) ); // /uap/bin/../../apps/endorsedX.X.X 360 tableTr( rtn,"OFFICE_HOME" , HybsSystem.sys( "OFFICE_HOME" ) ); // /uap/bin/../../apps/LibreOffice_X.X.X 361 362// // 7.1.0.0 (2020/01/20) static定義をやめて、getInfomation() メソッド内で都度呼びます。 363 tableTr1( rtn,"実行環境" ); 364 tableTr( rtn,"サービス起動" , HybsSystem.sys( "IS_SERVICE" ) , " [ " , HybsSystem.sys( "SERVICE_NAME" ) , " ] " ); // true [ サービス名 ] 365 tableTr( rtn,"REAL_PATH" , HybsSystem.sys( "REAL_PATH" ) ); // /uap/webapps/gf/ 366 tableTr( rtn,"バージョンNo" , BuildNumber.ENGINE_INFO ); // 7.1.0.0 Release7 Builds (26324783) 367 tableTr( rtn,"作成日時" , BuildNumber.TIMESTAMP ); // 2020/01/20 11:23:37 368 369 tableTr1( rtn,"ログイン情報" ); 370 tableTr( rtn,"ログイン人数" , String.valueOf( loginCount )," 名 ","( <a href=\"admin?COMMAND=loginUser\">明細情報</a> )" ); 371 372 tableTr1( rtn,"メモリ情報" ); 373 tableTr( rtn,"空きメモリ" , String.valueOf( freeMemory ) , " [MByte]" ); // 6.2.4.1 (2015/05/22) 単位を MB に変更 374 tableTr( rtn,"合計メモリ" , String.valueOf( totalMemory ) , " [MByte]" ); // 6.2.4.1 (2015/05/22) 単位を MB に変更 375 tableTr( rtn,"使用率" , String.valueOf( useMemoryRatio ) , " [%]" ); 376 rtn.append( TABLE_END ) 377 // 6.2.4.1 (2015/05/22) default.css で、memory、disc、discTD を定義 378// .append( TABLE_WAKU ).append( "width=\"300px\" >" ).append( CR ) 379 .append( TABLE_WAKU ).append( "width:300px;\" >" ).append( CR ) // 8.2.0.2 (2022/06/24) Modify 380 .append( "\t<tr><td class=\"memory " ).append( bgCls ).append( "\" style=\"width:" ) 381 .append( useMemoryRatio ).append( "%;\" >" ).append( useMemoryRatio ).append( "%</td>" ) 382 .append( "<td class=\"BIT\">" ).append( 100-useMemoryRatio ).append( "%</td></tr>" ).append( CR ) 383 .append( TABLE_END ) 384 385 // 6.2.4.1 (2015/05/22) ディスク容量を求めます。 386 .append( "<table border=\"0px\" >" ).append( CR ); 387 tableTr1( rtn,"ディスク情報" ); 388 rtn.append( TABLE_END ) 389// .append( TABLE_WAKU ).append( "width=\"500px\" >" ).append( CR ) 390 .append( TABLE_WAKU ).append( "width:500px;\" >" ).append( CR ) // 8.2.0.2 (2022/06/24) Modify 391 .append( "<th>名前</th><th>合計サイズ</th><th>空き領域</th><th>使用率</th></tr>" ).append( CR ).append( CR ); 392 393 final File[] driv = File.listRoots(); 394 for( final File file : driv ) { 395 // 6.3.9.0 (2015/11/06) 整数値演算なので、Math.round 不要 396 final long total = file.getTotalSpace()/GB ; // パーティションのサイズ 397 final long usable = file.getUsableSpace()/GB ; // 仮想マシンが利用できるバイト数 398 tableTr2( rtn, file.getPath() , total , usable ); // ディスク容量専用3 399 } 400 rtn.append( TABLE_END ) 401 402 // information 403 .append( "<hr>" ).append( CR ) // 7.0.1.0 (2018/10/15) XHTML → HTML5 404 .append( "<pre>" ).append( CR ) 405 .append( ConnectionFactory.information() ).append( CR ) 406 .append( "</pre>" ).append( CR ); 407 408 return rtn.toString(); 409 } 410 411 /** 412 * infomation 情報を作成します。 413 * 414 * @og.rev 5.6.6.0 (2013/07/05) </td></tr>漏れ追加 415 * @og.rev 5.6.7.3 (2013/08/23) 前後に、【】を付けます。 416 * 417 * @param buf 情報登録用のStringBuilder 418 * @param key キー 419 * 420 * @return infomation情報(入力bufと同じオブジェクト) 421 * @og.rtnNotNull 422 */ 423 private StringBuilder tableTr1( final StringBuilder buf, final String key ) { 424 return buf.append( "\t<tr><td colspan=\"4\"><b>【" ) 425 .append( key ).append( "】</b></td></tr>" ) 426 .append( CR ); // 【】追加 427 } 428 429 /** 430 * infomation 情報を作成します。 431 * 432 * @og.rev 5.6.6.0 (2013/07/05) 最初の td に、全角スペース2個 追加 433 * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応 434 * 435 * @param buf 情報登録用のStringBuilder 436 * @param key キー 437 * @param val 値の可変長引数 438 * 439 * @return infomation情報(入力bufと同じオブジェクト) 440 * @og.rtnNotNull 441 */ 442 private StringBuilder tableTr( final StringBuilder buf, final String key, final String... val ) { 443 // 段を作成する為に、width指定 追加 444// buf.append( "\t<tr><td width=\"20px\"> </td><td>" ).append( key ).append( "</td><td> = </td><td>" ); 445 buf.append( "\t<tr><td style=\"width:20px;\"> </td><td>" ).append( key ).append( "</td><td> = </td><td>" ); // 8.2.0.2 (2022/06/24) Modify 446 for( int i=0; i<val.length; i++ ) { 447 buf.append( val[i] ); 448 } 449// return buf.append( "</td></tr>" ).append( CR ); 450 return buf.append( TD_TR ); 451 } 452 453 /** 454 * infomation 情報を作成します。 455 * 456 * @og.rev 6.2.4.1 (2015/05/22) ディスク容量専用 457 * @og.rev 6.2.4.2 (2015/05/29) total が 0 の場合の対応 458 * @og.rev 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 459 * 460 * @param buf 情報登録用のStringBuilder 461 * @param name ドライブ名 462 * @param total パーティションのサイズ(GB) 463 * @param usable 仮想マシンが利用できるサイズ(GB) 464 * 465 * @return infomation情報(入力bufと同じオブジェクト) 466 * @og.rtnNotNull 467 */ 468 private StringBuilder tableTr2( final StringBuilder buf, final String name, final long total, final long usable ) { 469 final long useRatio = total == 0L ? 0L : (total-usable)*100/total ; // 6.3.9.0 (2015/11/06) findBugs 470 471 final String bgCls = useRatio <= 50 ? "OK" : useRatio <= 80 ? "CAUT" : useRatio <= 95 ? "WARN" : "NG" ; // 6.9.7.0 (2018/05/14) PMD Useless parentheses. 472 473// return buf.append( "\t<tr><td class=\"BIT\">" ).append( name ).append( "</td>" ) 474// .append( "<td class=\"S9\" >" ).append( total ).append( " GB</td>" ) 475// .append( "<td class=\"S9\" >" ).append( usable ).append( " GB</td>" ).append( CR ) 476// .append( "\t\t<td class=\"discTD\" ><span class=\"disc " ).append( bgCls ) 477// .append( "\" style=\"width:" ).append( useRatio ).append( "%;\" >" ) 478// .append( useRatio ).append( "%</span> </td></tr>" ).append( CR ); 479 480 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 481 return buf.append( "\t<tr><td class=\"BIT\">" ) 482 .append( name ).append( "</td><td class=\"S9\" >" ) 483 .append( total ).append( " GB</td><td class=\"S9\" >" ) 484 .append( usable ).append( " GB</td>" ).append( CR ) 485 .append( "\t\t<td class=\"discTD\" ><span class=\"disc " ) 486 .append( bgCls ).append( "\" style=\"width:" ) 487 .append( useRatio ).append( "%;\" >" ) 488 .append( useRatio ).append( "%</span> </td></tr>" ).append( CR ); 489 } 490 491 /** 492 * close 情報を作成します。 493 * 494 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 495 * @og.rev 3.6.0.0 (2004/09/17) CalendarFactory.clear() を追加します。 496 * @og.rev 4.0.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理 497 * @og.rev 4.1.0.2 (2008/01/29) UserInfoをsessionから消去する(超暫定対応) 498 * @og.rev 5.6.6.0 (2013/07/05) UserSummary の削除処理は、SystemManager から行う。 499 * @og.rev 6.3.7.0 (2015/09/04) ファイナライズを呼び出します。 500 * @og.rev 7.2.9.4 (2020/11/20) PMD:Do not explicitly trigger a garbage collection. 501 * 502 * @param session HttpSessionオブジェクト 503 * 504 * @return close情報 505 * @og.rtnNotNull 506 */ 507 private String getCloseMessage( final HttpSession session ) { 508 509 // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理 510 SystemManager.allClear( false ) ; 511 512 final ServletContext context = session.getServletContext(); 513 final Map<String,String> param = SystemParameter.makeSystemParameter( context ); 514 HybsSystem.setInitialData( param ); // 4.0.0 (2005/01/31) 515 516 // 5.6.6.0 (2013/07/05) UserSummary の削除処理は、SystemManager から行う。 517 SystemManager.removeSession( session ) ; 518 519 // 6.3.7.0 (2015/09/04) ファイナライズを呼び出します。 520 // 7.2.9.4 (2020/11/20) PMD:Do not explicitly trigger a garbage collection. 521// System.runFinalization(); 522// // System.gc(); // 取りあえず、GCは呼びません。 523 524 return "<pre>" 525 + "キャッシュ情報をクリアしました。" + CR 526 + "ユーザー情報の初期化に関しては、ブラウザを閉じて、再ログインが必要です。" + CR 527 + ConnectionFactory.information() 528 + "</pre>" ; 529 } 530 531 /** 532 * loginUser 情報を作成します。 533 * 534 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 535 * @og.rev 3.8.5.3 (2006/08/07) ユーザー情報をソートするためのキー情報を追加 536 * @og.rev 3.8.7.0 (2006/12/15) USER.LASTACCESS情報を追加します。 537 * @og.rev 4.0.0.0 (2005/01/31) DBColumn の 属性(CLS_NM)から、DBTYPEに変更 538 * @og.rev 4.4.0.1 (2009/08/08) 最終ログイン画面名称を追加 539 * @og.rev 5.6.6.0 (2013/07/05) table作成処理を、変更します。 540 * @og.rev 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 541 * @og.rev 5.9.1.2 (2015/10/23) 自己終了警告対応 542 * @og.rev 7.0.4.0 (2019/05/31) colgroup 廃止 543 * @og.rev 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 544 * 545 * @param sort ソートするキー項目を指定 546 * @param direc ソートする方向 [true:昇順/false:降順] 547 * 548 * @return loginUser情報 549 * @og.rtnNotNull 550 */ 551 private String getLoginUser( final String sort,final boolean direc ) { 552 // 4.0.0 (2005/01/31) ログイン数の取得方法の変更。 553 final int loginCount = SystemManager.getRunningCount() ; 554 555 // 4.0.0 (2005/01/31) 556 final UserSummary[] userInfos = SystemManager.getRunningUserSummary( sort,direc ); 557 558 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 559 .append( "現在 " ).append( loginCount ).append( " 名の方がログイン中です。" ).append( CR ) 560 .append( "<table " ).append( TABLE_HEADER ).append( " >" ) 561 .append( "<thead><tr><th>No</th>" ); 562 563 // 5.6.6.0 (2013/07/05) table作成処理を、変更します。 564 for( final String sortKey : USER_KEYS ) { 565 rtn.append( "<th><a href=\"?COMMAND=loginUser&sort=" ).append( sortKey ) 566 .append( "&direc=" ).append( !direc ) 567 .append( "\">" ).append( sortKey ).append( "</a></th>" ); 568 } 569 570 // 7.0.4.0 (2019/05/31) colgroup 廃止 571 rtn.append( "</tr></thead>" ).append( CR ) 572 .append( CR ); 573 574// for( int i=0; i<userInfos.length; i++ ) { 575// final UserSummary userInfo = userInfos[i] ; 576// rtn.append( " <tr class=\"row_" ).append( i%2 ).append( "\" >" ) 577// .append( "<td class='S9'>" ).append( String.valueOf( i+1 ) ).append( "</td>" ) // 7.0.4.0 (2019/05/31) 578// .append( "<td>" ).append( userInfo.getUserID() ).append( "</td>" ) 579// .append( "<td>" ).append( userInfo.getJname() ).append( "</td>" ) 580// .append( "<td>" ).append( userInfo.getRoles() ).append( "</td>" ) 581// .append( "<td>" ).append( userInfo.getIPAddress() ).append( "</td>" ) 582// .append( "<td>" ).append( HybsSystem.getDate( userInfo.getLoginTime() ) ).append( "</td>" ) 583// .append( "<td>" ).append( userInfo.getAttribute( "LASTACCESS" ) ).append( "</td>" ) 584// .append( "<td>" ).append( StringUtil.nval( userInfo.getAttribute( "LASTGAMENNM" ), "" ) ).append( "</td>" ) // 4.4.0.1 (2009/08/08) 585// .append( " </tr>" ).append( CR ); 586// } 587 588 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 589 for( int i=0; i<userInfos.length; i++ ) { 590 final UserSummary userInfo = userInfos[i] ; 591 rtn.append( " <tr class=\"row_" ).append( i%2 ) 592 .append( "\" ><td class='S9'>" ).append( String.valueOf( i+1 ) ) // 7.0.4.0 (2019/05/31) 593 .append( TD_TD ).append( userInfo.getUserID() ) 594 .append( TD_TD ).append( userInfo.getJname() ) 595 .append( TD_TD ).append( userInfo.getRoles() ) 596 .append( TD_TD ).append( userInfo.getIPAddress() ) 597 .append( TD_TD ).append( HybsSystem.getDate( userInfo.getLoginTime() ) ) 598 .append( TD_TD ).append( userInfo.getAttribute( "LASTACCESS" ) ) 599 .append( TD_TD ).append( StringUtil.nval( userInfo.getAttribute( "LASTGAMENNM" ), "" ) ) // 4.4.0.1 (2009/08/08) 600 .append( TD_TR ); 601 } 602 return rtn.append( TABLE_END ).toString(); 603 } 604 605 /** 606 * PlugIn 情報を作成します。 607 * 608 * @og.rev 4.0.0.0 (2005/08/31) 新規作成 609 * @og.rev 5.6.6.0 (2013/07/05) "DBConstValue","Daemon","JspCreate" を、追加します。 610 * @og.rev 7.1.0.0 (2020/01/27) pluginType をstatic で定義しておきます。 611 * 612 * @return PlugIn情報 613 * @og.rtnNotNull 614 */ 615 private String getPlugInInfo() { 616 final ClassInfo info = new ClassInfo(); 617 618 for( int j=0; j<PLUGIN_TYPE.length; j++ ) { 619 final String type = PLUGIN_TYPE[j] ; 620 final HybsEntry[] names = HybsSystem.sysEntry( type + "_" ); 621 for( int i=0; i<names.length; i++ ) { 622 final String key = names[i].getKey().substring( type.length()+1 ); 623 final String clsName = names[i].getValue(); 624 info.addLine( type,key,clsName ); 625 } 626 } 627 return info.getClassInfoData() ; 628 } 629 630 /** 631 * Taglib 情報を作成します。 632 * 633 * @og.rev 4.0.0.0 (2006/01/31) 新規作成 634 * @og.rev 5.3.6.0 (2011/06/01) Taglib クラス名の求め方を変更します。(jar版のみ) 635 * @og.rev 5.5.2.6 (2012/05/25) JarFile を、Closer#zipClose( ZipFile ) メソッドを利用して、close します。 636 * @og.rev 6.8.5.1 (2018/01/15) ファイル名は、##バージョン番号を変換しておく必要がある。 637 * 638 * @return Taglib情報 639 * @og.rtnNotNull 640 */ 641 private String getTaglibInfo() { 642 final ClassInfo info = new ClassInfo(); 643 644 // 5.5.2.6 (2012/05/25) findbugs対応 645 JarFile jarFile = null; 646 try { 647 final ClassLoader loader = Thread.currentThread().getContextClassLoader(); 648 final Enumeration<URL> enume = loader.getResources( "org/opengion/hayabusa/taglib/" ); // 4.3.3.6 (2008/11/15) Generics警告対応 649 while( enume.hasMoreElements() ) { 650 final URL url = enume.nextElement(); // 4.3.3.6 (2008/11/15) Generics警告対応 651 // jar:file:/実ディレクトリ または、file:/実ディレクトリ 652 final String dir = url.getFile().replaceAll( "%23%23","##" ); // 6.8.5.1 (2018/01/15) 653 if( "jar".equals( url.getProtocol() ) ) { 654 // dir = file:/G:/webapps/gf/WEB-INF/lib/hayabusa4.0.0.jar!/org/opengion/hayabusa/taglib 形式です。 655 final String jar = dir.substring(dir.indexOf( ':' )+1,dir.lastIndexOf( '!' )); 656 // jar = /G:/webapps/gf/WEB-INF/lib/hayabusa4.0.0.jar 形式に切り出します。 657 jarFile = new JarFile( jar ); 658 final Enumeration<JarEntry> en = jarFile.entries() ; // 4.3.3.6 (2008/11/15) Generics警告対応 659 while( en.hasMoreElements() ) { 660 final JarEntry ent = en.nextElement(); // 4.3.3.6 (2008/11/15) Generics警告対応 661 final String file = ent.getName(); 662 if( ! ent.isDirectory() && file.endsWith( "Tag.class" ) ) { 663 final String type = "Taglib_jar"; 664 // 5.3.6.0 (2011/06/01) Taglib クラス名の求め方を変更します。(jar版のみ) 665 final String key = file.substring( file.lastIndexOf( '/' )+1,file.length()-6 ); // -6 は、.class 分 666 final String clsName = file.replace( '/','.' ).substring( 0,file.length()-6 ); 667 info.addLine( type,key,clsName ); 668 } 669 } 670 Closer.zipClose( jarFile ); // 5.5.2.6 (2012/05/25) findbugs対応 671 jarFile = null; // 正常終了時に、close() が2回呼ばれるのを防ぐため。 672 } 673 else { 674 // dir = /G:/webapps/gf/WEB-INF/classes/org/opengion/hayabusa/taglib/ 形式です。 675 final File[] list = new File( dir ).listFiles(); 676 // 6.3.9.0 (2015/11/06) null になっている可能性がある(findbugs) 677 if( list != null ) { 678 for( final File file : list ) { 679 final String name = file.getName() ; 680 if( file.isFile() && name.endsWith( "Tag.class" ) ) { 681 final String type = "Taglib_file"; 682 final String key = name.substring( 0,name.length()-6 ); 683 final String clsName = "org.opengion.hayabusa.taglib." + key ; 684 info.addLine( type,key,clsName ); 685 } 686 } 687 } 688 } 689 } 690 } 691 catch( final IOException ex ) { 692 final String errMsg = "taglibファイル読み取りストリームを失敗しました。" 693 + CR + ex.getMessage(); 694 throw new OgRuntimeException( errMsg,ex ); 695 } 696 finally { 697 Closer.zipClose( jarFile ); // 5.5.2.6 (2012/05/25) findbugs対応 698 } 699 700 return info.getClassInfoData() ; 701 } 702 703 /** 704 * クラス情報を表示するためのデータを管理します。 705 * ここでは、引数に渡された、分類(Classify)、名称(Key Name)、クラス名(Class Name)、 706 * バージョン(Version)情報をテーブル形式で表示します。 707 * バージョン情報は、クラス名から、インスタンスを作成して、private static final String VERSION 708 * フィールドの値を読み取ります。 709 * 710 * @og.rev 4.0.0.0 (2006/01/31) 新規作成 711 * @og.rev 7.0.4.0 (2019/05/31) colgroup 廃止 712 * @og.rev 7.1.0.0 (2020/01/27) ヘッダー部分をstatic で定義しておきます。 713 */ 714 private static final class ClassInfo { 715 private static final String HEADER = 716 "<table " + TABLE_HEADER + " >" + CR + 717 " <thead><tr><th>No</th><th>Classify</th><th>Key Name</th><th>Class Name</th><th>Version</th></tr></thead>" + CR ; 718 719 private final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 720 private int cnt; 721 722 /** 723 * コンストラクター 724 * 725 * @og.rev 4.0.0.0 (2006/01/31) 新規作成 726 * @og.rev 5.9.1.2 (2015/10/23) 自己終了警告対応 727 * @og.rev 7.1.0.0 (2020/01/27) ヘッダー部分をstatic で定義しておきます。 728 */ 729 public ClassInfo() { 730 rtn.append( HEADER ); // 7.1.0.0 (2020/01/27) 731 } 732 733 /** 734 * テーブル表示用のデータを追加します。 735 * 736 * @og.rev 4.0.0.0 (2006/01/31) 新規作成 737 * @og.rev 7.0.4.0 (2019/05/31) colgroup 廃止 738 * @og.rev 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 739 * 740 * @param type タイプ属性 741 * @param key キー属性 742 * @param clsName クラス名(このクラス名からインスタンス化します。) 743 */ 744 public void addLine( final String type, final String key, final String clsName ) { 745 final String version = getFieldValue( clsName ); 746 747 final boolean isCustom = version.compareTo( BuildNumber.VERSION_NO ) > 0 748 || version.indexOf( "Pache" ) >= 0 749 || version.indexOf( "Nightly" ) >= 0 ; 750 751 final String trType = isCustom ? "warning" : String.valueOf( cnt%2 ); 752 753// rtn.append( "<tr class=\"row_" ).append( trType ).append( "\" >" ) 754// .append( "<td class='S9'>" ).append( cnt++ ).append( "</td>" ) // 7.0.4.0 (2019/05/31) 755// .append( "<td>" ).append( type ).append( "</td>" ) 756// .append( "<td>" ).append( key ).append( "</td>" ) 757// .append( "<td>" ).append( clsName ).append( "</td>" ) 758// .append( "<td>" ).append( version ).append( "</td>" ) 759// .append( "</tr>" ).append( CR ); 760 761 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 762 rtn.append( "<tr class=\"row_" ).append( trType ) 763 .append( "\" ><td class='S9'>" ).append( cnt++ ) // 7.0.4.0 (2019/05/31) 764 .append( TD_TD ).append( type ) 765 .append( TD_TD ).append( key ) 766 .append( TD_TD ).append( clsName ) 767 .append( TD_TD ).append( version ) 768 .append( TD_TR ); 769 } 770 771 /** 772 * すべての内部のデータを文字列化して返します。 773 * 774 * @og.rev 4.0.0.0 (2006/01/31) 新規作成 775 * @og.rev 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 776 * 777 * @return 作成されたテーブルデータ 778 * @og.rtnNotNull 779 */ 780 public String getClassInfoData() { 781 return rtn.append( TABLE_END ).toString(); 782 } 783 784 /** 785 * 指定のオブジェクトの VERSION staticフィールドの値を取得します。 786 * 787 * @og.rev 4.0.0.0 (2005/08/31) 新規作成 788 * @og.rev 6.4.3.3 (2016/03/04) HybsSystem#newInstance(String) ではなく、直接Class#forName(String)から、求めます。 789 * 790 * @param clsName 指定のクラスを表す名称 791 * @return VERSIONフィールドの値(エラー時は、そのメッセージ) 792 */ 793 private String getFieldValue( final String clsName ) { 794 String rtn ; 795 try { 796 final Field fld = Class.forName( clsName ).getDeclaredField( "VERSION" ) ; 797 798 // privateフィールドの取得には、accessibleフラグを trueにする必要があります。 799 fld.setAccessible( true ); 800 801 rtn = (String)fld.get( null ); 802 } 803 catch( final Throwable ex ) { 804 rtn = ex.getMessage(); 805 } 806 return rtn ; 807 } 808 } 809 810 /** 811 * systemResource 情報を作成します。 812 * 813 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 814 * @og.rev 4.0.0.0 (2005/01/31) DBColumn の 属性(CLS_NM)から、DBTYPEに変更 815 * @og.rev 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 816 * @og.rev 5.9.1.2 (2015/10/23) 自己終了警告対応 817 * @og.rev 6.4.3.3 (2016/03/04) 配列返しではなく、Map を返します。 818 * @og.rev 7.0.4.0 (2019/05/31) colgroup 廃止 819 * @og.rev 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 820 * 821 * @return systemResource情報 822 * @og.rtnNotNull 823 */ 824 private String getSystemResource() { 825 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 826 .append( "<table " ).append( TABLE_HEADER ).append( " >" ).append( CR ) 827 .append( "<thead><tr><th>No</th><th>Key</th><th>Value</th></tr></thead>" ).append( CR ) 828 .append( CR ); 829 830 // 6.4.3.3 (2016/03/04) 配列返しではなく、Map を返します。 831 final ConcurrentMap<String,String> rscMap = HybsSystem.getSystemResourceMap(); 832 int i=0; 833// for( final Map.Entry<String,String> entry : rscMap.entrySet() ) { 834// rtn.append( "<tr class=\"row_" ).append( i%2 ).append( "\" >" ).append( CR ) 835// .append( "<td class='S9'>" ).append( ++i ).append( "</td>" ) // 7.0.4.0 (2019/05/31) 836// .append( "<td>" ).append( entry.getKey() ).append( "</td>" ) 837// .append( "<td>" ).append( entry.getValue() ).append( "</td>" ) 838// .append( "</tr>" ).append( CR ); 839// } 840 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 841 for( final Map.Entry<String,String> entry : rscMap.entrySet() ) { 842 rtn.append( "<tr class=\"row_" ).append( i%2 ) 843 .append( "\" ><td class='S9'>" ).append( ++i ) // 7.0.4.0 (2019/05/31) 844 .append( TD_TD ).append( entry.getKey() ) 845 .append( TD_TD ).append( entry.getValue() ) 846 .append( TD_TR ); 847 } 848 return rtn.append( TABLE_END ).toString(); 849 } 850 851 /** 852 * AccessStop 情報を作成します。 853 * 854 * @og.rev 3.5.3.1 (2003/10/31) 機能ごとにメソッドを呼び出すように修正します。 855 * @og.rev 4.0.0.0 (2007/11/29) AccessStopFilter#getStopFilter() ⇒ isStopFilter() に変更 856 * @og.rev 6.1.1.0 (2015/01/17) パッケージを import するのと、ロジック見直し。 857 * @og.rev 6.3.8.0 (2015/09/11) AccessStop を外部から制御できるように、コマンドと状態を受けるようにする。 858 * @og.rev 7.1.0.0 (2020/01/20) 本物のサービスと混同しないようにメッセージを変更します。 859 * 860 * @param isStop true:停止/false:実行 861 * @return AccessStop情報 862 * @og.rtnNotNull 863 */ 864 private String getAccessStop( final String isStop ) { 865 final boolean flag = Boolean.parseBoolean( isStop ); // 6.3.8.0 (2015/09/11) 866 867 return flag ? "Webアプリケーションへのアクセスを停止します。" 868 : "Webアプリケーションへのアクセスを開始します。"; 869 } 870 871// /** 872// * fileexecのMainProcess 情報を作成します。 873// * 874// * @og.rev 7.2.5.0 (2020/06/01) fileexecのMainProcess の処理が起動しているかどうかを表示 875// * 876// * @param isStart true:実行/false停止: 877// * @return fileexec情報 878// * @og.rtnNotNull 879// */ 880// private String getFileExecInfo( final String isStart ) { 881// final String reload = "<script>parent.QUERY.location.reload(true);</script>" ; 882// 883// final String msg ; 884// 885// if( Boolean.parseBoolean( isStart ) ) { 886// MainProcess.start(); 887// msg = "ファイル取込処理を実行しました。"; 888// } 889// else { 890// MainProcess.shutdown( false ); // 再実行できるようにしておきます。 891// msg = "ファイル取込処理を停止しました。"; 892// } 893// 894// return msg + reload; 895// } 896 897 /** 898 * application オブジェクトに関連付ける 共通メッセージを設定します。 899 * 900 * 取り出しは、errorMessageタグで行います。これは、個々のrequest.jsp に組み込まれている 901 * メッセージなので、ここで登録したメッセージは、同時に、すべてのアクセスしているユーザーが 902 * 見ることになります。 903 * 904 * @og.rev 6.4.4.1 (2016/03/18) application オブジェクトに関連付ける 共通メッセージを設定します。 905 * @og.rev 6.8.5.0 (2018/01/09) 共通メッセージで、strongタグのバグ修正と、class="common_msg" 追加。 906 * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 907 * 908 * @param type [set/clear] を指定します。 909 * @param message 共通メッセージを指定します。 910 * @param session HttpSessionオブジェクト 911 * 912 * @return Servlet/Filter情報 913 * @og.rtnNotNull 914 */ 915 private String setCommonMessage( final String type , final String message , final HttpSession session ) { 916 final ServletContext context = session.getServletContext(); 917 918 String rtMsg = ""; 919 if( "set".equalsIgnoreCase( type ) && message != null && message.length() > 0 ) { 920 rtMsg = "<strong class=\"common_msg\">" + message + "</strong><br>"; // 7.0.1.0 (2018/10/15) 921 context.setAttribute( HybsSystem.COMMON_MSG_KEY,rtMsg ); 922 } 923 else if( "get".equalsIgnoreCase( type ) ) { 924 rtMsg = (String)context.getAttribute( HybsSystem.COMMON_MSG_KEY ); 925 } 926 else if( "clear".equalsIgnoreCase( type ) ) { 927 context.removeAttribute( HybsSystem.COMMON_MSG_KEY ); 928 } 929 930 return rtMsg; 931 } 932 933 /** 934 * Servlet/Filter 情報を作成します。 935 * 936 * @og.rev 6.3.8.3 (2015/10/03) Servlet/Filter 情報を作成。 937 * @og.rev 5.9.1.2 (2015/10/23) 自己終了警告対応 938 * @og.rev 7.0.4.0 (2019/05/31) colgroup 廃止 939 * @og.rev 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 940 * 941 * @param session HttpSessionオブジェクト 942 * 943 * @return Servlet/Filter情報 944 * @og.rtnNotNull 945 */ 946 private String getRegistrationMessage( final HttpSession session ) { 947 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ) 948 // 速度よりソースの見易さ 949 .append( "<table " ).append( TABLE_HEADER ).append( " >" ) 950 .append( "<thead><tr><th>No</th><th>Type</th><th>Key</th><th>Class</th><th>Mappings</th></tr></thead>" ) 951 .append( CR ); 952 953 int no = 0; 954 final ServletContext context = session.getServletContext(); 955 for( final ServletRegistration reg : context.getServletRegistrations().values() ) { 956// // 速度よりソースの見易さ 957// rtn.append( "<tr class=\"row_" ).append( no%2 ).append( "\" >" ) 958// .append( "<td class='S9'>" ).append( String.valueOf( ++no ) ).append( "</td>" ) // 7.0.4.0 (2019/05/31) 959// .append( "<td>Servlet</td>" ) 960// .append( "<td>" ).append( reg.getName() ).append( "</td>" ) 961// .append( "<td>" ).append( reg.getClassName() ).append( "</td>" ) 962// .append( "<td>" ).append( reg.getMappings() ).append( "</td>" ) 963// .append( "</tr>" ).append( CR ); 964 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 965 rtn.append( "<tr class=\"row_" ).append( no%2 ) 966 .append( "\" ><td class='S9'>" ).append( String.valueOf( ++no ) ) // 7.0.4.0 (2019/05/31) 967 .append( TD_TD ).append( "Servlet" ) 968 .append( TD_TD ).append( reg.getName() ) 969 .append( TD_TD ).append( reg.getClassName() ) 970 .append( TD_TD ).append( reg.getMappings() ) 971 .append( TD_TR ); 972 } 973 974 for( final FilterRegistration reg : context.getFilterRegistrations().values() ) { 975// // 速度よりソースの見易さ 976// rtn.append( "<tr class=\"row_" ).append( no%2 ).append( "\" >" ) 977// .append( "<td class='S9'>" ).append( String.valueOf( ++no ) ).append( "</td>" ) // 7.0.4.0 (2019/05/31) 978// .append( "<td>Filter</td>" ) 979// .append( "<td>" ).append( reg.getName() ).append( "</td>" ) 980// .append( "<td>" ).append( reg.getClassName() ).append( "</td>" ) 981// .append( "<td>" ).append( reg.getUrlPatternMappings() ).append( "</td>" ) 982// .append( "</tr>" ).append( CR ); 983 // 7.2.6.0 (2020/06/30) StringBuilderの連結部見直し 984 rtn.append( "<tr class=\"row_" ).append( no%2 ) 985 .append( "\" ><td class='S9'>" ).append( String.valueOf( ++no ) ) // 7.0.4.0 (2019/05/31) 986 .append( TD_TD ).append( "Filter" ) 987 .append( TD_TD ).append( reg.getName() ) 988 .append( TD_TD ).append( reg.getClassName() ) 989 .append( TD_TD ).append( reg.getUrlPatternMappings() ) 990 .append( TD_TR ); 991 } 992 return rtn.append( TABLE_END ).toString(); 993 } 994 995 /** 996 * admin リンク情報を作成します。 997 * 簡易メソッドなので、国際化対応していません。 998 * 999 * @og.rev 3.5.4.1 (2003/12/01) 新規作成 1000 * @og.rev 5.1.1.2 (2009/12/10) 画面IDを変更 1001 * @og.rev 5.6.3.4 (2013/04/26) クイックリファレンス 画面を追加 1002 * @og.rev 6.3.6.1 (2015/08/28) <table> 枠の指定と、</table> の static final String 化 1003 * @og.rev 6.3.8.0 (2015/09/11) AccessStop を外部から制御できるように、コマンドと状態を受けるようにする。 1004 * @og.rev 6.9.2.1 (2018/03/12) リンクが横に長くなってきたので、2段に折り返します。 1005 * @og.rev 7.0.0.1 (2018/10/09) 一旦、[プラグイン情報],[タグリブ情報],[Servlet/Filter情報],[システム状況] を削除します。 1006 * @og.rev 7.0.1.0 (2018/10/15) XHTML → HTML5 対応(空要素の、"/>" 止めを、">" に変更します)。 1007 * @og.rev 7.1.0.0 (2020/01/20) logLink.jsp 、serviceRestart.jsp 追加。AccessStopのON/OFF追加 1008 * @og.rev 7.1.0.0 (2020/01/27) static で定義しておきます。 1009 * 1010 * @return アドミンリンク情報 1011 * @og.rtnNotNull 1012 */ 1013 private String getAdminLink() { 1014 // 7.1.0.0 (2020/01/20) AccessStopのON/OFF追加 1015 final String accessStop = "true".equalsIgnoreCase( System.getProperty( "AccessStopFilter" ) ) 1016 ? ACCESS_STOP : "" ; 1017 1018 // 7.1.0.0 (2020/01/20) logLink.jsp 、serviceRestart.jsp 追加 1019 final String serviceRestart = "true".equalsIgnoreCase( HybsSystem.sys( "IS_SERVICE" ) ) 1020 ? SERVICE_RESTART : "" ; 1021 1022 // 7.1.0.0 (2020/01/27) static で定義しておきます。 1023 return new StringBuilder( BUFFER_MIDDLE ) 1024 .append( "<style> body { overflow-y: hidden; } </style>" ) 1025 .append( "<table><tr>" ).append( CR ) 1026 .append( INFOMATION ) 1027 .append( CLOSE ) 1028 .append( LOGIN_USER ) 1029 .append( QUICK_REFERENCE ) 1030 .append( SYSTEM_RESOURCE ) 1031 .append( PARAMETER ) 1032 .append( LOGLINK ) 1033 .append( serviceRestart ) 1034// .append( "</tr>" ).append( CR ).append( "<tr><td /><td />" ).append( CR ) 1035 .append( "</tr>" ).append( CR ).append( "<tr><td />" ).append( CR ) // 7.2.5.0 (2020/06/01) 1036 .append( PLUGIN ) 1037 .append( TAGLIB ) 1038 .append( REGISTRATION ) 1039 .append( SYSTEM_INFO ) 1040 .append( accessStop ) 1041 // .append( fileExecCmnt() ) // 7.2.5.0 (2020/06/01) 1042 .append( "</tr>" ).append( TABLE_END ) 1043 .toString(); 1044 } 1045 1046 /** 1047 * DBTableModel から テーブルのタグ文字列を作成して返します。 1048 * 1049 * @og.rev 3.5.3.1 (2003/10/31) User情報のテーブルの設定を、システムリソース より行う。 1050 * @og.rev 5.2.2.0 (2010/11/01) SystemData 見直し漏れの対応。 1051 * @og.rev 8.2.0.2 (2022/06/24) HTML5廃止対応 1052 * 1053 * @return テーブルのタグ文字列 1054 * @og.rtnNotNull 1055 */ 1056 private static String getTableHeaderTag() { 1057 // 6.1.1.0 (2015/01/17) Attributesの連結記述 1058 return new Attributes() 1059 .set( "id" ,"viewTable" ) // 3.6.0.5 (2004/10/18) 1060// .set( "summary" ,"layout" ) // サマリー 8.2.0.2 (2022/06/24) Delete 1061 .getAttribute(); 1062 } 1063 1064 /** 1065 * userInfo 情報をセットします。 1066 * 現状、このメソッドではLANGのみ設定可能です。 1067 * (予約語以外のセットはuserInfoタグで行う) 1068 * 1069 * LANGではuserInfoを切り替えた後にユーザのGUIInfoを再ロードします。 1070 * 1071 * @og.rev 5.9.1.0 (2015/10/02) 新規作成 1072 * 1073 * @param req HttpServletRequestオブジェクト 1074 * @return 結果情報 1075 */ 1076 private String setUserinfo( final HttpServletRequest req ) { 1077 final HttpSession session = req.getSession(); 1078 final UserInfo userInfo = (UserInfo)(session.getAttribute( HybsSystem.USERINFO_KEY )); 1079 1080 final String infoLang = req.getParameter( "LANG" ); 1081 1082 String rtn = null ; 1083 if( userInfo != null && infoLang != null && infoLang.length() > 0) { 1084 userInfo.setLang( infoLang ); 1085 ResourceFactory.newInstance( userInfo.getLang() ).makeGUIInfos( userInfo ); 1086 rtn = "User language : " + infoLang; 1087 } 1088 1089 if( rtn == null || rtn.length() == 0 ) { 1090 rtn = "Error"; 1091 } 1092 1093 return rtn ; 1094 } 1095}