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