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     */
016    package org.opengion.hayabusa.servlet;
017    
018    import java.io.File;
019    import java.io.IOException;
020    import java.io.PrintWriter;
021    import java.lang.reflect.Field;
022    import java.net.URL;
023    import java.util.Enumeration;
024    import java.util.Map;
025    import java.util.jar.JarEntry;
026    import java.util.jar.JarFile;
027    
028    import javax.servlet.ServletContext;
029    import javax.servlet.ServletException;
030    import javax.servlet.http.HttpServlet;
031    import javax.servlet.http.HttpServletRequest;
032    import javax.servlet.http.HttpServletResponse;
033    import javax.servlet.http.HttpSession;
034    
035    import org.opengion.fukurou.db.ConnectionFactory;
036    import org.opengion.fukurou.util.Attributes;
037    import org.opengion.fukurou.util.HybsEntry;
038    import org.opengion.fukurou.util.StringUtil;
039    import org.opengion.fukurou.util.Closer ;                               // 5.5.2.6 (2012/05/25)
040    import org.opengion.hayabusa.common.BuildNumber;
041    import org.opengion.hayabusa.common.HybsSystem;
042    import org.opengion.hayabusa.common.SystemManager;
043    import org.opengion.hayabusa.common.SystemParameter;
044    import org.opengion.hayabusa.common.UserSummary;
045    
046    /**
047     * サーバã?管ç�?ƒ…報を取得するAdminサーブレãƒ?ƒˆですã?
048     *
049     * 引数(URL)に応じて、サーバã?の状態結果を返しますã?
050     * ä¸?ˆ¬には、http://サーバã?:ポã?ãƒ?シスãƒ?ƒ ID/jsp/admin?COMMAND=コマンãƒ?の
051     * 形式ã?URL でアクセスしますã?
052     *
053     *  ・COMMAND=infomation
054     *     【サーバã?æƒ??ã€?
055     *        ?¯?³æƒ??      = Windows 7 Service Pack 1
056     *        サーバã?å�?   = 10374232-0004 ( 172.27.26.192 )
057     *        サーブレãƒ?ƒˆ  = Apache Tomcat/7.0.42
058     *        TOMCAT_HOME   = C:/opengionV6/uap/bin//../../apps/tomcat7.0.42
059     *        JDKバã?ジョン = Java HotSpot(TM) Server VM 23.25-b01
060     *        JAVA_HOME     = C:/opengionV6/apps/jdk170u25/jre
061     *
062     *     【実行環å¢??
063     *        REAL_PATH     = C:/opengionV6/uap/webapps/gf/
064     *        バã?ジョンNo  = 6.0.0.0 Release6 Builds (2013233)
065     *        作æ?日æ™?     = 2013/08/21 14:57:29
066     *
067     *     【ログインæƒ??ã€?
068     *        ログイン人数  = 2 å�?( 明細æƒ?? )
069     *
070     *     【メモリæƒ??ã€?
071     *        空きメモリ    = 15977 [KByte]
072     *        合計メモリ    = 32448 [KByte]
073     *        使用çŽ?       = 50 [??
074     *
075     *  ・COMMAND=close
076     *       リソースæƒ??のキャãƒ?‚·ュをå?てクリアしますã?
077     *
078     *  ・COMMAND=loginUser
079     *       現在のログインユーザーの明細æƒ??を表示しますã?
080     *       SORT=[JNAME,ID,ROLES,IPADDRESS,LOGINTIME] ソートキー
081     *       DIREC=[true,false] true:æ˜??/false:降é?
082     *
083     *  ・COMMAND=plugin
084     *       現在のプラグインのバã?ジョンæƒ??を表示しますã?
085     *
086     *  ・COMMAND=systemResource
087     *       現在のシスãƒ?ƒ リソースの設定情報を表示しますã?
088     *
089     *  ・COMMAND=AccessStop
090     *       アクセスストップフィルターの制御(停止、許可)を行いますã?
091     *
092     * @og.rev 3.5.3.0 (2003/10/27) Admin JSP ã‚?Servlet化して、エンジンと共に供給しますã?
093     * @og.rev 4.0.0.0 (2005/08/31) プラグインのバã?ジョンæƒ??の表示機è?を追åŠ?
094     * @og.group そã?他機è?
095     *
096     * @version  4.0
097     * @author   Kazuhiko Hasegawa
098     * @since    JDK5.0,
099     */
100    public final class HybsAdmin extends HttpServlet {
101            private static final long serialVersionUID = 4000 ;     // 4.0.0 (2005/01/31)
102    
103            private static final String CR = HybsSystem.CR ;
104    
105            private static final String JSP = HybsSystem.sys( "JSP" );      // jspフォルãƒ??正規パス
106    
107            private static final String HEADER =
108                    "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"                                                                                             + CR +
109                    "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""                                                   + CR +
110                    "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"                                                   + CR +
111                    "<html xmlns=\"http://www.w3.org/1999/xhtml\" >"                                                                                  + CR +
112                    "<head>"                                                                                                                                                                  + CR +
113                    "    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />"                           + CR +
114                    "    <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />"                                             + CR +
115                    "    <link rel=\"stylesheet\" href=\"" + JSP + "/common/default.css\" type=\"text/css\" />"       + CR +
116                    "    <link rel=\"stylesheet\" href=\"" + JSP + "/custom/custom.css\" type=\"text/css\" />"                                + CR +
117                    "    <title>Hybs Admin</title>"                                                                                                                             + CR +
118                    "</head>"                                                                                                                                                                 + CR;
119    
120            // 3.5.3.1 (2003/10/31) Useræƒ??のãƒ??ブルの設定を、シスãƒ?ƒ リソース より行うã€?
121            private static final String TABLE_HEADER = getTableHeaderTag() ;
122    
123            private static final String OS_INFO      = HybsSystem.sys( "OS_INFO"      );            // Windows 7 Service Pack 1
124            private static final String SERVER_INFO  = HybsSystem.sys( "SERVER_INFO"  );            // 10374232-0004 ( 200.1.50.239 )
125            private static final String SERVLET_INFO = HybsSystem.sys( "SERVLET_INFO" );            // Apache Tomcat/7.0.39
126            private static final String REAL_PATH    = HybsSystem.sys( "REAL_PATH"    );            // C:/opengion/uap/webapps/gf/
127    //      private static final String TOMCAT_WORK  = HybsSystem.sys( "TOMCAT_WORK"  );            // 5.6.7.3 (2013/08/23) TOMCAT_HOME に置き換えã?å»?­¢
128            private static final String TOMCAT_HOME  = HybsSystem.sys( "TOMCAT_HOME"  );            // C:/opengion/apps/tomcat5.5.17
129            private static final String JDK_INFO     = HybsSystem.sys( "JDK_INFO"     );            // Java HotSpot(TM) Server VM 23.25-b01
130            private static final String JAVA_HOME    = HybsSystem.sys( "JAVA_HOME"    );            // C:/opengion/apps/jdk170u25/jre
131            private static final String ENGINE_INFO  = HybsSystem.sys( "ENGINE_INFO"  );            // 5.6.6.0 Release5 Builds (2013182)
132    
133            /**
134             * GET メソãƒ?ƒ‰が呼ばれたときに実行しますã?
135             *
136             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
137             * @og.rev 3.5.4.1 (2003/12/01) getAdminLink() メソãƒ?ƒ‰を追åŠ?
138             *
139             * @param       req     HttpServletRequestオブジェクãƒ?
140             * @param       res     HttpServletResponseオブジェクãƒ?
141             *
142             * @throws ServletException サーブレãƒ?ƒˆ関係ã?エラーが発生したå?合ã?throw されますã?
143             * @throws IOException 入出力エラーが発生したとã�?
144             */
145            @Override
146            public void doGet( final HttpServletRequest req, final HttpServletResponse res)
147                                                                    throws ServletException, IOException {
148    
149                    res.setContentType( "text/html; charset=UTF-8" );
150                    PrintWriter out = res.getWriter();
151    
152                    String command = req.getParameter( "COMMAND" );
153    
154                    out.println( HEADER );
155                    out.println("<body>");
156    
157                    out.print("<h2>");
158                    out.print( req.getServerName() );
159                    out.print( ":" );
160                    out.print( req.getServerPort() );
161                    out.print( req.getContextPath() );
162                    out.println("</h2>");
163    
164                    if( "infomation".equalsIgnoreCase( command ) ) {
165                            out.print( getInfomation() );
166                    }
167                    else if( "close".equalsIgnoreCase( command ) ) {
168                            out.print( getCloseMessage( req.getSession() ) );
169                    }
170                    else if( "loginUser".equalsIgnoreCase( command ) ) {
171                            String sort  = req.getParameter( "sort" );
172                            String direc = req.getParameter( "direc" );
173                            boolean dir = (direc == null) ? true :  Boolean.valueOf( direc ).booleanValue();
174                            out.print( getLoginUser(sort,dir) );
175                    }
176                    else if( "plugin".equalsIgnoreCase( command ) ) {
177                            out.print( getPlugInInfo() );
178                    }
179                    else if( "taglib".equalsIgnoreCase( command ) ) {
180                            out.print( getTaglibInfo() );
181                    }
182                    else if( "systemResource".equalsIgnoreCase( command ) ) {
183                            out.print( getSystemResource() );
184                    }
185                    else if( "AccessStop".equalsIgnoreCase( command ) ) {
186                            out.print( getAccessStop() );
187                    }
188                    else {
189                            out.print( getAdminLink() );            // 3.5.4.1 (2003/12/01) 追åŠ?
190                    }
191    
192                    out.println("</body></html>");
193            }
194    
195            /**
196             * infomation æƒ??を作æ?しますã?
197             *
198             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
199             * @og.rev 5.6.7.3 (2013/08/23) TOMCAT_WORKは、TOMCAT_HOME に置き換えますã?
200             *
201             * @return      infomation�?
202             */
203            private String getInfomation() {
204                    // 4.0.0 (2005/01/31) ログイン数の取得方法ã?変更ã€?
205                    int loginCount = SystemManager.getRunningCount() ;
206    
207                    int freeMemory  = (int)( Runtime.getRuntime().freeMemory()/1024 ) ;
208                    int totalMemory = (int)( Runtime.getRuntime().totalMemory()/1024 );
209                    int useMemoryRatio = (((totalMemory - freeMemory) * 100 )/totalMemory) ;
210    
211                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
212    
213                    rtn.append( "<table border = \"0px\" >" ).append( CR );
214                    tableTr1( rtn,"サーバã?æƒ??" );
215                    tableTr( rtn,"?¯?³æƒ??"          , OS_INFO               );
216                    tableTr( rtn,"サーバã?å�? , SERVER_INFO   );
217                    tableTr( rtn,"サーブレãƒ?ƒˆ"       , SERVLET_INFO  );
218    //              tableTr( rtn,"TOMCAT_WORK"      , TOMCAT_WORK   );              // 5.6.7.3 (2013/08/23) TOMCAT_HOME に置き換えã?å»?­¢
219                    tableTr( rtn,"TOMCAT_HOME"      , TOMCAT_HOME   );              // 5.6.7.3 (2013/08/23)
220                    tableTr( rtn,"JDKバã?ジョン", JDK_INFO           );
221                    tableTr( rtn,"JAVA_HOME"        , JAVA_HOME             );
222    
223                    tableTr1( rtn,"実行環å¢? );
224                    tableTr( rtn,"REAL_PATH"        , REAL_PATH             );
225                    tableTr( rtn,"バã?ジョンNo"      , ENGINE_INFO   );
226                    tableTr( rtn,"作æ?日æ™?           , BuildNumber.TIMESTAMP );
227    
228                    tableTr1( rtn,"ログインæƒ??" );
229                    tableTr( rtn,"ログイン人数"     , String.valueOf( loginCount )," å�?","( <a href=\"admin?COMMAND=loginUser\">明細æƒ??</a> )" );
230    
231                    tableTr1( rtn,"メモリæƒ??" );
232                    tableTr( rtn,"空きメモリ"        , String.valueOf( freeMemory )          , " [KByte]" );
233                    tableTr( rtn,"合計メモリ"        , String.valueOf( totalMemory )         , " [KByte]" );
234                    tableTr( rtn,"使用çŽ?            , String.valueOf( useMemoryRatio )      , " [??"    );
235    
236                    rtn.append( "</table>" ).append( CR );
237                    rtn.append( CR );
238    
239    //              rtn.append( "   <tr><td colspan = \"4\">サーバã?æƒ??</td></tr>" ).append( CR );
240    //              rtn.append( "   <tr><td></td><td>?¯?³æƒ??</td><td>=</td><td>" ).append( OS_INFO ).append( "</td></tr>" ).append( CR );
241    //              rtn.append( "   <tr><td></td><td>サーバã?å�?/td><td>=</td><td>" ).append( SERVER_INFO ).append( "</td></tr>" ).append( CR );
242    //              rtn.append( "   <tr><td></td><td>サーブレãƒ?ƒˆ</td><td>=</td><td>" ).append( SERVLET_INFO ).append( "</td></tr>" ).append( CR );
243    //              rtn.append( "   <tr><td></td><td>REAL_PATH</td><td>=</td><td>" ).append( REAL_PATH ).append( "</td></tr>" ).append( CR );
244    //              rtn.append( "   <tr><td></td><td>TOMCAT_WORK</td><td>=</td><td>" ).append( TOMCAT_WORK ).append( "</td></tr>" ).append( CR );
245    //              rtn.append( "   <tr><td></td><td>JDKバã?ジョン</td><td>=</td><td>" ).append( JDK_INFO ).append( "</td></tr>" ).append( CR );
246    //              rtn.append( "   <tr><td></td><td>JAVA_HOME</td><td>=</td><td>" ).append( JAVA_HOME ).append( "</td></tr>" ).append( CR );
247    //              rtn.append( "   <th><td></td><td colspan = \"2\"></td></th>" ).append( CR );
248    //              rtn.append( "   <tr><td colspan = \"4\">エンジンバã?ジョン</td></tr>" ).append( CR );
249    //              rtn.append( "   <tr><td></td><td>バã?ジョンNo</td><td>=</td><td>" ).append( ENGINE_INFO ).append( "</td></tr>" ).append( CR );
250    //              rtn.append( "   <tr><td></td><td>作æ?日æ™?/td><td>=</td><td>" ).append( BuildNumber.TIMESTAMP ).append( "</td></tr>" ).append( CR );
251    //              rtn.append( "   <th><td></td><td colspan = \"2\"></td></th>" ).append( CR );
252    //              rtn.append( "   <tr><td colspan = \"4\">ログインユーザー</td></tr>" ).append( CR );
253    //              rtn.append( "   <tr><td></td><td>ログイン人数    </td><td>=</td><td>" ).append( loginCount ).append( " å�?" );
254    //              rtn.append( "( <a href=\"admin?COMMAND=loginUser\">明細æƒ??</a> )</td></tr>" ).append( CR );
255    //              rtn.append( "   <tr><td colspan = \"4\">メモリæƒ??</td></tr>" ).append( CR );
256    //              rtn.append( "   <tr><td></td><td>空きメモリ</td><td>=</td><td>" ).append( freeMemory ).append( " [KByte]</td></tr>" ).append( CR );
257    //              rtn.append( "   <tr><td></td><td>合計メモリ</td><td>=</td><td>" ).append( totalMemory ).append( " [KByte]</td></tr>" ).append( CR );
258    //              rtn.append( "   <tr><td></td><td>使用çŽ?/td><td>=</td><td>" ).append( useMemoryRatio ).append( " [??</td></tr>" ).append( CR );
259    //              rtn.append( "</table>" ).append( CR );
260    //              rtn.append( CR );
261    
262                    rtn.append( "<table width=\"50%\" frame=\"box\" border = \"1px\" cellspacing=\"0px\" cellpadding=\"0px\" >" ).append( CR );
263    //              rtn.append( "   <tr><td width=\"" ).append( useMemoryRatio ).append( "%\" bgcolor=\"red\" >" ).append( CR );
264    //              rtn.append( "           <img width=\"100%\" height=\"10px\" src=\"" ).append( JSP ).append( "/image/space.gif\" alt=\"" ).append( useMemoryRatio ).append( "%\"></td>" ).append( CR );
265    //              rtn.append( "           <td></td>" ).append( CR );
266    //              rtn.append( "   </tr>" ).append( CR );
267                    rtn.append( "   <tr><td align=\"center\" width=\"" ).append( useMemoryRatio ).append( "%\" bgcolor=\"red\" >" ).append( CR );
268                    rtn.append( useMemoryRatio ).append( "%</td>" ).append( CR );
269                    rtn.append( "           <td align=\"center\">" ).append( 100-useMemoryRatio ).append( "%</td>" ).append( CR );
270                    rtn.append( "   </tr>" ).append( CR );
271                    rtn.append( "</table>" ).append( CR );
272    
273                    rtn.append( "<hr />" ).append( CR );
274                    rtn.append( "<pre>" ).append( CR );
275                    rtn.append( ConnectionFactory.information() ).append( CR );
276                    rtn.append( "</pre>" ).append( CR );
277    
278                    return rtn.toString();
279            }
280    
281            /**
282             * infomation æƒ??を作æ?しますã?
283             *
284             * @og.rev 5.6.6.0 (2013/07/05) &lt;/td&gt;&lt;/tr&gt;漏れ追åŠ?
285             * @og.rev 5.6.7.3 (2013/08/23) 前後に、ã?】を付けますã?
286             *
287             * @param       buf     æƒ??登録用のStringBuilder(出力と同じオブジェクãƒ?
288             * @param       key     キー
289             *
290             * @return      infomation�?
291             */
292            private StringBuilder tableTr1( final StringBuilder buf, final String key ) {
293    //              buf.append( "<tr><td colspan = \"4\">" ).append( key ).append( CR );
294    //              buf.append( "<tr><td colspan=\"4\"><b>" ).append( key ).append( "</b></td></tr>" ).append( CR );            // td,tr 漏れ追åŠ?
295                    buf.append( "<tr><td colspan=\"4\"><b>ã€? ).append( key ).append( "ã€?/b></td></tr>" ).append( CR );     // 【ã?追åŠ?
296                    return buf ;
297            }
298    
299            /**
300             * infomation æƒ??を作æ?しますã?
301             *
302             * @og.rev 5.6.6.0 (2013/07/05) æœ??の td に、å?角スペã?ス?’å? 追åŠ?
303             *
304             * @param       buf     æƒ??登録用のStringBuilder(出力と同じオブジェクãƒ?
305             * @param       key     キー
306             * @param       val     値の可変長引数
307             *
308             * @return      infomation�?
309             */
310            private StringBuilder tableTr( final StringBuilder buf, final String key, final String... val ) {
311    //              buf.append( "\t<tr><td></td><td>" ).append( key ).append( "</td><td>=</td><td>" );
312                    buf.append( "<tr><td width=\"20px\">ã€?/td><td>" ).append( key ).append( "</td><td> = </td><td>" );                 // 段を作æ?する為に、widthæŒ?®?追åŠ?
313                    for( int i=0; i<val.length; i++ ) {
314                            buf.append( val[i] );
315                    }
316                    buf.append( "</td></tr>" ).append( CR );
317                    return buf ;
318            }
319    
320            /**
321             * close æƒ??を作æ?しますã?
322             *
323             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
324             * @og.rev 3.6.0.0 (2004/09/17) CalendarFactory.clear() を追åŠ?�—ますã?
325             * @og.rev 4.0.0.0 (2005/01/31) Cleanable インターフェースによる初期化å?ç�?
326             * @og.rev 4.1.0.2 (2008/01/29) UserInfoをsessionから消去する(è¶?š«定対å¿?
327             * @og.rev 5.6.6.0 (2013/07/05) UserSummary の削除処ç�??、SystemManager から行うã€?
328             *
329             * @param       session HttpSessionオブジェクãƒ?
330             *
331             * @return      close�?
332             */
333            private String getCloseMessage( final HttpSession session ) {
334    
335                    // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化å?ç�?
336                    SystemManager.allClear( false ) ;
337    
338                    ServletContext context = session.getServletContext();
339                    Map<String,String> param = SystemParameter.makeSystemParameter( context );
340                    HybsSystem.setInitialData( param );                     // 4.0.0 (2005/01/31)
341    
342                    // 5.6.6.0 (2013/07/05) UserSummary の削除処ç�??、SystemManager から行うã€?
343                    SystemManager.removeSession( session ) ;
344    
345    //              UserSummary userInfo = (UserSummary)session.getAttribute( HybsSystem.USERINFO_KEY );
346    ////            if( userInfo != null ) { userInfo.clear(); }
347    //              if( userInfo != null ) { // 4.1.0.2 (2008/01/29)
348    //                      userInfo.clear();
349    //                      session.removeAttribute( HybsSystem.USERINFO_KEY );
350    //              }
351    
352                    String rtn = "<pre>"
353                                            + "キャãƒ?‚·ュæƒ??をクリアーしましたã€?
354                                            + CR
355                                            + "ユーザーæƒ??の初期化に関しては、ブラウザを閉じて、å?ログインがå¿?¦�ですã?"
356                                            + CR
357                                            + ConnectionFactory.information()
358                                            + "</pre>" ;
359                    return rtn ;
360            }
361    
362            // 5.6.6.0 (2013/07/05) getLoginUser( String,boolean ) で、指定するキーをé?列で持っておきますã?
363            // キーは、SystemManager.getRunningUserSummary 処ç�??で大æ–?­—化されるためã?こã?配å?は、表示用と兼用しますã?
364            private static final String[] USER_KEYS = new String[] { "ID","Jname","Roles","IPAddress","LoginTime","LastAccess","LastGamenNm" };
365    
366            /**
367             * loginUser æƒ??を作æ?しますã?
368             *
369             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
370             * @og.rev 3.8.5.3 (2006/08/07) ユーザーæƒ??をソートするためã?キーæƒ??を追åŠ?
371             * @og.rev 3.8.7.0 (2006/12/15) USER.LASTACCESSæƒ??を追åŠ?�—ますã?
372             * @og.rev 4.0.0.0 (2005/01/31) DBColumn の 属æ?(CLS_NM)から、DBTYPEに変更
373             * @og.rev 4.4.0.1 (2009/08/08) æœ?µ‚ログイン画面名称を追åŠ?
374             * @og.rev 5.6.6.0 (2013/07/05) table作æ?処ç�?‚’、変更しますã?
375             *
376             * @param       sort    ソートするキーé ?›®を指å®?
377             * @param       direc   ソートする方å�?[true:æ˜??/false:降é?]
378             *
379             * @return      loginUser�?
380             */
381            private String getLoginUser( final String sort,final boolean direc ) {
382                    // 4.0.0 (2005/01/31) ログイン数の取得方法ã?変更ã€?
383                    int loginCount = SystemManager.getRunningCount() ;
384    
385                    // 4.0.0 (2005/01/31)
386                    UserSummary[] userInfos = SystemManager.getRunningUserSummary( sort,direc );
387    
388                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
389    
390                    rtn.append( "現在 " ).append( loginCount ).append( " 名ã?方がログイン中ですã?" );
391                    rtn.append( CR );
392    
393                    rtn.append( "<table " ).append( TABLE_HEADER ).append( " >" ).append( CR );
394                    rtn.append( " <thead><tr><th>No</th>" );
395    
396                    // 5.6.6.0 (2013/07/05) table作æ?処ç�?‚’、変更しますã?
397                    for( String sortKey : USER_KEYS ) {
398                            rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=" ).append( sortKey )
399                                    .append( "&direc=" ).append( !direc )
400                                    .append( "\">" ).append( sortKey ).append( "</a></th>" );
401                    }
402    
403    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=ID&direc="                        ).append( !direc );
404    //              rtn.append(                             "\">UserID</a></th>" );
405    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=JNAME&direc="             ).append( !direc );
406    //              rtn.append(                             "\">Jname</a></th>" );
407    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=ROLES&direc="             ).append( !direc );
408    //              rtn.append(                             "\">Roles</th>" );
409    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=IPADDRESS&direc=" ).append( !direc );
410    //              rtn.append(                             "\">IPAddress</a></th>" );
411    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=LOGINTIME&direc=" ).append( !direc );
412    //              rtn.append(                             "\">LoginTime</a></th>" );
413    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=LASTACCESS&direc="        ).append( !direc );
414    //              rtn.append(                             "\">LastAccess</a></th>" );
415    //              rtn.append( "  <th><a href=\"?COMMAND=loginUser&sort=LASTGAMENNM&direc=").append( !direc ); // 4.4.0.1 (2009/08/08)
416    //              rtn.append(                             "\">LastGamenName</a></th>" );
417                    rtn.append( " </tr></thead>" ).append( CR );
418                    rtn.append( " <colgroup class=\"S9\" />" ).append( CR );
419                    rtn.append( " <colgroup class=\"X\" span=\"6\" />" ).append( CR );
420                    rtn.append( CR );
421    
422                    for( int i=0; i<userInfos.length; i++ ) {
423                            UserSummary userInfo = userInfos[i] ;
424                            rtn.append( " <tr class=\"row_" ).append( i%2 ).append( "\" >" ).append( CR );
425                            rtn.append( "  <td>" ).append( String.valueOf( i+1 )   ).append( "</td>" ).append( CR );
426                            rtn.append( "  <td>" ).append( userInfo.getUserID()    ).append( "</td>" ).append( CR );
427                            rtn.append( "  <td>" ).append( userInfo.getJname()     ).append( "</td>" ).append( CR );
428                            rtn.append( "  <td>" ).append( userInfo.getRoles()     ).append( "</td>" ).append( CR );
429                            rtn.append( "  <td>" ).append( userInfo.getIPAddress() ).append( "</td>" ).append( CR );
430                            rtn.append( "  <td>" ).append( HybsSystem.getDate( userInfo.getLoginTime() ) ).append( "</td>" ).append( CR );
431                            rtn.append( "  <td>" ).append( userInfo.getAttribute( "LASTACCESS") ).append( "</td>" ).append( CR );
432                            rtn.append( "  <td>" ).append( StringUtil.nval( userInfo.getAttribute( "LASTGAMENNM"), "" ) ).append( "</td>" ).append( CR );  // 4.4.0.1 (2009/08/08)
433                            rtn.append( " </tr>" ).append( CR );
434                    }
435                    rtn.append( "</table>" ).append( CR );
436    
437                    return rtn.toString() ;
438            }
439    
440            /**
441             * PlugIn æƒ??を作æ?しますã?
442             *
443             * @og.rev 4.0.0.0 (2005/08/31) 新規作æ?
444             * @og.rev 5.6.6.0 (2013/07/05) "DBConstValue","Daemon","JspCreate" をã?追åŠ?�—ますã?
445             *
446             * @return      PlugIn�?
447             */
448            private String getPlugInInfo() {
449    
450                    String[] pluginType = new String[] {
451                                                                    "Query","Renderer","Editor","DBType","ViewForm",
452                                                                    "TableReader","TableWriter","TableFilter","ChartWriter","CalendarQuery",
453                                                                    "DBConstValue","Daemon","JspCreate"                                     // 5.6.6.0 (2013/07/05) 追åŠ?
454                                                            } ;
455    
456                    ClassInfo info = new ClassInfo();
457    
458                    for( int j=0; j<pluginType.length; j++ ) {
459                            String type = pluginType[j] ;
460                            HybsEntry[] names = HybsSystem.sysEntry( type + "_" );
461                            for( int i=0; i<names.length; i++ ) {
462                                    String key              = names[i].getKey().substring( type.length()+1 );
463                                    String clsName  = names[i].getValue();
464                                    info.addLine( type,key,clsName );
465                            }
466                    }
467                    return info.getClassInfoData() ;
468            }
469    
470            /**
471             * Taglib æƒ??を作æ?しますã?
472             *
473             * @og.rev 4.0.0.0 (2006/01/31) 新規作æ?
474             * @og.rev 5.3.6.0 (2011/06/01) Taglib クラス名ã?求め方を変更しますã?(jar版ã?み)
475             * @og.rev 5.5.2.6 (2012/05/25) JarFile をã?Closer#zipClose( ZipFile ) メソãƒ?ƒ‰を利用して、close しますã?
476             *
477             * @return      Taglib�?
478             */
479            private String getTaglibInfo() {
480                    ClassInfo info = new ClassInfo();
481    
482                    // 5.5.2.6 (2012/05/25) findbugs対å¿?
483                    JarFile jarFile = null;
484                    try {
485                            ClassLoader loader = Thread.currentThread().getContextClassLoader();
486                            Enumeration<URL> enume = loader.getResources( "org/opengion/hayabusa/taglib/" );          // 4.3.3.6 (2008/11/15) Generics警告対å¿?
487                            while( enume.hasMoreElements() ) {
488                                    URL url = enume.nextElement();          // 4.3.3.6 (2008/11/15) Generics警告対å¿?
489                                    // jar:file:/実ディレクトリ またã?、file:/実ディレクトリ
490                                    String dir = url.getFile();
491                                    if( "jar".equals( url.getProtocol() ) ) {
492                                            // dir = file:/G:/webapps/gf/WEB-INF/lib/hayabusa4.0.0.jar!/org/opengion/hayabusa/taglib 形式ですã?
493                                            String jar = dir.substring(dir.indexOf( ':' )+1,dir.lastIndexOf( '!' ));
494                                            // jar = /G:/webapps/gf/WEB-INF/lib/hayabusa4.0.0.jar 形式にåˆ?‚Š出しますã?
495    //                                      JarFile jarFile = new JarFile( jar );
496                                            jarFile = new JarFile( jar );
497                                            Enumeration<JarEntry> en = jarFile.entries() ;            // 4.3.3.6 (2008/11/15) Generics警告対å¿?
498                                            while( en.hasMoreElements() ) {
499                                                    JarEntry ent = en.nextElement();                // 4.3.3.6 (2008/11/15) Generics警告対å¿?
500                                                    String file = ent.getName();
501                                                    if( ! ent.isDirectory() && file.endsWith( "Tag.class" ) ) {
502                                                            String type             = "Taglib";
503                                                            // 5.3.6.0 (2011/06/01) Taglib クラス名ã?求め方を変更しますã?(jar版ã?み)
504    //                                                      String key              = file.substring( 0,file.length()-6 );
505                                                            String key              = file.substring( file.lastIndexOf( '/' )+1,file.length()-6 );  // -6 はã€?class åˆ?
506    //                                                      String clsName  = "org.opengion.hayabusa.taglib." + key ;
507                                                            String clsName  = file.replace( '/','.' ).substring( 0,file.length()-6 );
508                                                            info.addLine( type,key,clsName );
509                                                    }
510                                            }
511                                            Closer.zipClose( jarFile );             // 5.5.2.6 (2012/05/25) findbugs対å¿?
512                                            jarFile = null;                                 // 正常終äº?™‚に、close() が2回呼ばれるのを防ぐためã?
513                                    }
514                                    else {
515                                            // dir = /G:/webapps/gf/WEB-INF/classes/org/opengion/hayabusa/taglib/ 形式ですã?
516                                            File fileObj = new File( dir );
517                                            File[] list = fileObj.listFiles();
518                                            for( int i=0; i<list.length; i++ ) {
519                                                    String file = list[i].getName() ;
520                                                    if( list[i].isFile() && file.endsWith( "Tag.class" ) ) {
521                                                            String type             = "Taglib";
522                                                            String key              = file.substring( 0,file.length()-6 );
523                                                            String clsName  = "org.opengion.hayabusa.taglib." + key ;
524                                                            info.addLine( type,key,clsName );
525                                                    }
526                                            }
527                                    }
528                            }
529                    }
530                    catch( IOException ex ) {
531                            String errMsg = "taglibファイル読み取りストリーãƒ?‚’失敗しましたã€?
532                                            + CR + ex.getMessage();
533                            throw new RuntimeException( errMsg,ex );
534                    }
535                    finally {
536                            Closer.zipClose( jarFile );             // 5.5.2.6 (2012/05/25) findbugs対å¿?
537                    }
538    
539                    return info.getClassInfoData() ;
540            }
541    
542            /**
543             * クラスæƒ??を表示するためのãƒ??タを管ç�?�—ますã?
544             * ここでは、引数に渡されたã?åˆ?¡?Classify)、名称(Key Name)、クラスå�?Class Name)ã€?
545             * バã?ジョン(Version)æƒ??をテーブル形式で表示しますã?
546             * バã?ジョンæƒ??は、クラス名からã?インスタンスを作æ?して、private static final String VERSION
547             *  フィールドã?値を読み取りますã?
548             *
549             * @og.rev 4.0.0.0 (2006/01/31) 新規作æ?
550             */
551            private static final class ClassInfo {
552                    private final StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
553                    private int cnt = 0;
554    
555                    /**
556                     * コンストラクター
557                     *
558                     * @og.rev 4.0.0.0 (2006/01/31) 新規作æ?
559                     */
560                    public ClassInfo() {
561                            rtn.append( "<table " ).append( TABLE_HEADER ).append( " >" ).append( CR );
562                            rtn.append( "   <thead><tr><th>No</th><th>Classify</th><th>Key Name</th><th>Class Name</th><th>Version</th></tr></thead>" ).append( CR );
563                            rtn.append( "   <colgroup class=\"S9\" />" ).append( CR );
564                            rtn.append( "   <colgroup class=\"X\" />"  ).append( CR );
565                            rtn.append( "   <colgroup class=\"X\" />"  ).append( CR );
566                            rtn.append( "   <colgroup class=\"X\" />"  ).append( CR );
567                            rtn.append( "   <colgroup class=\"X\" />"  ).append( CR );
568                            rtn.append( "   <colgroup class=\"X\" />"  ).append( CR );
569                            rtn.append( CR );
570                    }
571    
572                    /**
573                     * ãƒ??ブル表示用のãƒ??タを追åŠ?�—ますã?
574                     *
575                     * @og.rev 4.0.0.0 (2006/01/31) 新規作æ?
576                     *
577                     * @param       type    タイプ属æ?
578                     * @param       key     キー属æ?
579                     * @param       clsName クラスå�?こã?クラス名からインスタンス化しますã?)
580                     */
581                    public void addLine( final String type, final String key, final String clsName ) {
582                            String version  = getFieldValue( clsName );
583    
584                            boolean isCustom = ( version.compareTo( BuildNumber.VERSION_NO ) > 0 ) ||
585                                                                    version.indexOf( "Pache"   ) >= 0 ||
586                                                                    version.indexOf( "Nightly" ) >= 0 ;
587    
588                            String trType = ( isCustom ) ? "warning" : String.valueOf( cnt%2 );
589    
590                            rtn.append( "   <tr class=\"row_" ).append( trType ).append( "\" >" ).append( CR );
591                            rtn.append( "           <td>" ).append( cnt++    ).append( "</td>" ).append( CR );
592                            rtn.append( "           <td>" ).append( type     ).append( "</td>" ).append( CR );
593                            rtn.append( "           <td>" ).append( key      ).append( "</td>" ).append( CR );
594                            rtn.append( "           <td>" ).append( clsName  ).append( "</td>" ).append( CR );
595                            rtn.append( "           <td>" ).append( version  ).append( "</td>" ).append( CR );
596                            rtn.append( "   </tr>" ).append( CR );
597                    }
598    
599                    /**
600                     * すべてのå†?ƒ¨のãƒ??タを文字å?化して返しますã?
601                     *
602                     * @og.rev 4.0.0.0 (2006/01/31) 新規作æ?
603                     *
604                     * @return      作æ?されたテーブルãƒ??タ
605                     */
606                    public String getClassInfoData() {
607                            rtn.append( "</table>" ).append( CR );
608                            return rtn.toString() ;
609                    }
610    
611                    /**
612                     * æŒ?®šã?オブジェクトã?  VERSION staticフィールドã?値を取得しますã?
613                     *
614                     * @og.rev 4.0.0.0 (2005/08/31) 新規作æ?
615                     *
616                     * @param       clsName æŒ?®šã?クラスを表す名称
617                     * @return      VERSION staticフィールドã?値(エラー時ã?、そのメãƒ?‚»ージ)
618                     */
619                    private String getFieldValue( final String clsName ) {
620                            String rtn ;
621                            try {
622                                    Object obj = HybsSystem.newInstance( clsName );
623                                    Field fld = obj.getClass().getDeclaredField( "VERSION" ) ;
624                                    // privateフィールドã?取得には、accessibleフラグã‚?trueにするå¿?¦�がありますã?
625                                    fld.setAccessible( true );
626    
627                                    rtn = (String)fld.get( null );
628                            }
629                            catch( Throwable ex ) {
630                                    rtn = ex.getMessage();
631                            }
632                            return rtn ;
633                    }
634            }
635    
636            /**
637             * systemResource æƒ??を作æ?しますã?
638             *
639             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
640             * @og.rev 4.0.0.0 (2005/01/31) DBColumn の 属æ?(CLS_NM)から、DBTYPEに変更
641             *
642             * @return      systemResource�?
643             */
644            private String getSystemResource() {
645                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
646    
647                    rtn.append( "<table " ).append( TABLE_HEADER ).append( " >" ).append( CR );
648                    rtn.append( "   <thead><tr><th>No</th><th>Key</th><th>Value</th></tr></thead>" ).append( CR );
649                    rtn.append( "   <colgroup class=\"S9\" />" ).append( CR );
650                    rtn.append( "   <colgroup class=\"X\" span=\"2\" />" ).append( CR );
651                    rtn.append( CR );
652    
653                    String[][] str = HybsSystem.getSystemResourceData();
654                    for( int i=0; i<str[0].length; i++ ) {
655                            rtn.append( "   <tr class=\"row_" ).append( i%2 ).append( "\" >" ).append( CR );
656                            rtn.append( "           <td>" ).append( String.valueOf( i+1 ) ).append( "</td>" ).append( CR );
657                            rtn.append( "           <td>" ).append( str[0][i] ).append( "</td>" ).append( CR );
658                            rtn.append( "           <td>" ).append( str[1][i] ).append( "</td>" ).append( CR );
659                            rtn.append( "   </tr>" ).append( CR );
660                    }
661                    rtn.append( "</table>" ).append( CR );
662    
663                    return rtn.toString();
664            }
665    
666            /**
667             * AccessStop æƒ??を作æ?しますã?
668             *
669             * @og.rev 3.5.3.1 (2003/10/31) 機è?ごとにメソãƒ?ƒ‰を呼び出すよã�?�«修正しますã?
670             * @og.rev 4.0.0.0 (2007/11/29) AccessStopFilter#getStopFilter() â‡?isStopFilter() に変更
671             *
672             * @return      AccessStop�?
673             */
674            private String getAccessStop() {
675    
676    //              boolean flag = org.opengion.hayabusa.filter.AccessStopFilter.getStopFilter();
677                    boolean flag = org.opengion.hayabusa.filter.AccessStopFilter.isStopFilter();
678                    flag = !flag ;
679    
680                    final String rtn ;
681                    if( flag ) {
682                            rtn = "Webアプリケーションのサービスを停止しますã?";
683                    }
684                    else {
685                            rtn = "Webアプリケーションのサービスを開始しますã?";
686                    }
687                    org.opengion.hayabusa.filter.AccessStopFilter.setStopFilter( flag );
688    
689                    return rtn ;
690            }
691    
692            /**
693             * admin リンクæƒ??を作æ?しますã?
694             * 簡易メソãƒ?ƒ‰なので、国際化対応してã�?�¾せんã€?
695             *
696             * @og.rev 3.5.4.1 (2003/12/01) 新規作æ?
697             * @og.rev 5.1.1.2 (2009/12/10) 画面IDを変更
698             * @og.rev 5.6.3.4 (2013/04/26) ?¸?²?¯?¸?˜ファ?šンス 画面を追åŠ?
699             *
700             * @return      アドミンリンクæƒ??
701             */
702            private String getAdminLink() {
703                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
704    
705                    rtn.append( "<table><tr>" ).append( CR );
706                    rtn.append( "<td width=\"10px\"/>" ).append( CR );
707                    rtn.append( "<td>[<a href=\"admin?COMMAND=infomation\" target=\"RESULT\" >状況表示</a>]</td>" ).append( CR );
708                    rtn.append( "<td width=\"10px\"/>" ).append( CR );
709                    rtn.append( "<td>[<a href=\"admin?COMMAND=close\" target=\"RESULT\" >?Œ゚ー?™削除</a>]</td>" ).append( CR );
710                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
711                    rtn.append( "[<a href=\"admin?COMMAND=loginUser\" target=\"RESULT\" >?›ク?žイ?�ユー?»?žー</a>]</td>" ).append( CR );
712                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
713                    rtn.append( "[<a href=\"admin?COMMAND=plugin\" target=\"RESULT\" >?Œ゚ラク?žイ?�情報</a>]</td>" ).append( CR );
714                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
715                    rtn.append( "[<a href=\"admin?COMMAND=taglib\" target=\"RESULT\" >??½¸?žリブ情報</a>]</td>" ).append( CR );
716                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
717                    rtn.append( "[<a href=\"common/quickReference.html\" target=\"RESULT\" >?¸?²?¯?¸?˜ファ?šンス</a>]</td>" ).append( CR );       // 5.6.3.4 (2013/04/26)
718                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
719                    rtn.append( "[<a href=\"admin?COMMAND=systemResource\" target=\"RESULT\" >?¼?½??¾‘リソ?°?½</a>]</td>" ).append( CR );
720                    rtn.append( "<td width=\"10px\"/><td>" ).append( CR );
721    //              rtn.append( "[<a href=\"common/gamen/01_ADMIN/parameter.jsp?GAMENID=ADMIN\" target=\"RESULT\" >Parameter</a>]</td>" ).append( CR );
722                    rtn.append( "[<a href=\"common/gamen/01_ADMIN/parameter.jsp?GAMENID=01_ADMIN\" target=\"RESULT\" >Parameter</a>]</td>" ).append( CR );
723                    rtn.append( "</tr></table>" ).append( CR );
724    
725                    return rtn.toString();
726            }
727    
728            /**
729             * DBTableModel から ãƒ??ブルのタグæ–?­—å?を作æ?して返しますã?
730             *
731             * @og.rev 3.5.3.1 (2003/10/31) Useræƒ??のãƒ??ブルの設定を、シスãƒ?ƒ リソース より行うã€?
732             * @og.rev 5.2.2.0 (2010/11/01) SystemData 見直し漏れの対応ã?
733             *
734             * @return      ãƒ??ブルのタグæ–?­—å?
735             */
736            private static String getTableHeaderTag() {
737                    Attributes attri = new Attributes();
738                    attri.set( "id" ,"viewTable" );         // 3.6.0.5 (2004/10/18)
739                    attri.set( "summary"     ,"layout"        );                    // サマリー
740    
741    //              // 4.0.0 (2005/08/31) ãƒ??ブル表示の CSSファイル利用の有無
742    //              boolean useCSSfile = HybsSystem.sysBool( "USE_HTML_TABLE_CSS" ) ;
743    //
744    //              if( ! useCSSfile ) {
745    //                      attri.set( "summary"     ,"layout"        );                    // サマリー
746    //                      attri.set( "border"      ,HybsSystem.sys( "HTML_BORDER" ) ) ;     // 外枠の太ã�?
747    //                      attri.set( "width"               ,HybsSystem.sys( "HTML_WIDTH" )  ) ;     // 表の大きさ(å¹?ピクセルまたã?,??
748    //                      attri.set( "frame"               ,HybsSystem.sys( "HTML_FRAME" )  ) ;     // 外枠の表示形å¼? void,above,below,lhs,rhs,hsides,vsides,box,border
749    //                      attri.set( "rules"               ,HybsSystem.sys( "HTML_RULES" )  ) ;     // セルを区åˆ?‚‹線ã?形å¼?none,rows,cols,groups,all
750    //                      attri.set( "cellspacing" ,HybsSystem.sys( "HTML_CELLSPACING" ) );  // セルの間隔
751    //                      attri.set( "cellpadding" ,HybsSystem.sys( "HTML_CELLPADDING" ) );  // セルå†??マã?ジン
752    //              }
753    
754                    return attri.getAttribute();
755            }
756    }