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