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) </td></tr>漏れ追?
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 }