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.common; 017 018import java.io.Serializable; 019import java.sql.Connection; 020import java.sql.PreparedStatement; 021import java.sql.SQLException; 022import java.util.ArrayList; 023import java.util.Arrays; 024import java.util.Comparator; 025import java.util.HashMap; 026import java.util.List; 027import java.util.Map; 028import java.util.Locale; 029 030import javax.servlet.http.HttpSession; 031 032import org.opengion.fukurou.db.ConnectionFactory; 033import org.opengion.fukurou.util.Cleanable; 034import org.opengion.fukurou.util.Closer; 035import org.opengion.fukurou.util.LogWriter; 036import org.opengion.fukurou.db.DBSimpleTable; 037 038/** 039 * Webアプリケーション全体で使用しているオブジェクト類のトータルの管理クラスです。 040 * 041 * SystemManager は、 042 * 043 * session オブジェクトの管理とアクセス/開放 044 * 045 * の作業を行います。 046 * 047 * 上記のクラス(staticメソッド)へのアクセスは、もちろん直接呼び出して 048 * 操作することも可能ですが、サーバーのクリーンシャットダウン時やセッションの 049 * 開放時、初期化処理など、ある種の統合的なトリガを受けて、関係するクラスに 050 * イベントを伝えるようにすることで、Webアプリケーションサーバーとのやり取りを 051 * 一元管理する目的で作成されています。 052 * 053 * @og.group 初期化 054 * 055 * @version 4.0 056 * @author Kazuhiko Hasegawa 057 * @since JDK5.0, 058 */ 059public final class SystemManager { 060 // 3.1.0.0 (2003/03/20) Hashtable を使用している箇所で、非同期でも構わない箇所を、HashMap に置換え。 061 private static final Map<String,UserSummary> map = new HashMap<String,UserSummary>( HybsSystem.BUFFER_MIDDLE ); 062 063 /** 4.0.0 (2005/01/31) Cleanable インターフェースを実装したオブジェクトを管理します。 */ 064 private static final List<Cleanable> clearList = new ArrayList<Cleanable>() ; 065 066 /** 4.3.6.2 (2009/04/15) Context終了時のみclear()される Cleanable ブジェクトを管理します。 */ 067 private static final List<Cleanable> contextClearList = new ArrayList<Cleanable>() ; 068 069 // 4.1.0.0 (2008/01/11) GE12クリア用 070 // 4.3.6.6 (2009/05/15) ENGINE_INFOは削除しない 071 /** エンジン個別(SYSTEM_ID='個別' KBSAKU='0' CONTXT_PATH='自身')パラメータの一括削除のクエリー {@value} */ 072 private static final String DEL_SYS = "DELETE FROM GE12 WHERE SYSTEM_ID=? AND KBSAKU='0' AND CONTXT_PATH=? AND PARAM_ID != 'ENGINE_INFO'"; 073 074 /** 075 * デフォルトコンストラクターをprivateにして、 076 * オブジェクトの生成をさせないようにする。 077 * 078 */ 079 private SystemManager() { 080 } 081 082 /** 083 * session を記録します。 084 * 085 * 管理者権限で、強制ログアウトさせる場合などに、使用します。 086 * Servlet 2.1 では、HttpSessio#getSessionContext() より取り出した 087 * HttpSessionContextのgetSession(java.lang.String sessionId) で 088 * すべての session を取り出せましたが,Deprecated になりました。 089 * セキュリティー上、好ましくない処理ですので,注意して使用してください。 090 * common\session_init.jsp より登録します 091 * 092 * @og.rev 5.5.9.1 (2012/12/07) セッション作成時に、規定のキーでセッションIDを保存しておく。 093 * 094 * @param session Httpセッション 095 */ 096 public static void addSession( final HttpSession session ) { 097 String sessionID = session.getId(); 098 099 UserSummary userInfo = (UserSummary)session.getAttribute( HybsSystem.USERINFO_KEY ); 100 if( userInfo != null ) { 101 synchronized( map ) { 102 map.put( sessionID,userInfo ); 103 } 104 session.setAttribute( HybsSystem.SESSION_KEY, sessionID ); // 5.5.9.1 (2012/12/07) セッションIDを保存 105 } 106 } 107 108 /** 109 * session を削除します。 110 * 111 * 管理者権限で、強制ログアウトさせる場合などに、使用します。 112 * Servlet 2.1 では、HttpSessio#getSessionContext() より取り出した 113 * HttpSessionContextのgetSession(java.lang.String sessionId) で 114 * すべての session を取り出せましたが,Deprecated になりました。 115 * セキュリティー上、好ましくない処理ですので,注意して使用してください。 116 * 117 * @og.rev 5.5.9.1 (2012/12/07) セッション作成時に登録した規定のキーで userInfo を削除します。 118 * @og.rev 5.6.6.0 (2013/07/05) セッションの Attribute に SESSION_KEY で登録している sessionID も削除します。 119 * 120 * @param session Httpセッション 121 */ 122// public static void removeSession( final String sessionID ) { 123 public static void removeSession( final HttpSession session ) { 124 125 String sessionID = (String)session.getAttribute( HybsSystem.SESSION_KEY ); // 5.5.9.1 (2012/12/07) セッションIDを取り出し 126 127 // 5.6.6.0 (2013/07/05) userInfo の map からの削除とuserInfo の clear を簡素化。 128 synchronized( map ) { 129 UserSummary userInfo = map.remove( sessionID ); 130 if( userInfo != null ) { userInfo.clear(); } 131 } 132 133// final UserSummary userInfo ; 134// synchronized( map ) { 135// userInfo = map.remove( sessionID ); 136// } 137// if( userInfo != null ) { userInfo.clear(); } 138 139 // 5.6.6.0 (2013/07/05) セッションの Attribute に SESSION_KEY で登録している sessionID も削除します。 140 session.removeAttribute( HybsSystem.USERINFO_KEY ); 141 session.removeAttribute( HybsSystem.SESSION_KEY ); 142 } 143 144 /** 145 * すべてのシステムにログイン中のUserSummary オブジェクトを取得します。 146 * 147 * キーは、UserSummary の Attribute も含めた値が使用できます。 148 * 引数のキーは、内部で大文字に変換されたのち、内部キーとして使用されます。 149 * 150 * @og.rev 4.0.0.0 (2005/01/31) 内部ロジック大幅変更 151 * @og.rev 5.6.6.0 (2013/07/05) Comparator の作り方を、簡素化します。キーの指定範囲も増やします。 152 * 153 * @param key ソートするキー項目を指定 154 * @param direction ソートする方向[true:昇順/false:降順] 155 * 156 * @return ログイン中のオブジェクト 157 */ 158 public static UserSummary[] getRunningUserSummary( final String key,final boolean direction ) { 159 final UserSummary[] users ; 160 synchronized( map ) { 161 users = map.values().toArray( new UserSummary[map.size()] ); 162 } 163 164 if( key != null ) { 165// Comparator<UserSummary> comp = getUserSummaryComparator( key,direction ); 166 Comparator<UserSummary> comp = new ATTRI_Comparator( key.toUpperCase( Locale.JAPAN ),direction ); 167 Arrays.sort( users,comp ); 168 } 169 170 return users ; 171 } 172 173 /** 174 * システムにログイン中の、すべてのセッション数を、取得します。 175 * 176 * ちなみに、不正なデータが存在した場合は、ここでMapから削除しておきます。 177 * 178 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 179 * 180 * @return ログイン中の有効なすべてのセッション数 181 */ 182 public static int getRunningCount() { 183 final int rtnSize; 184 synchronized( map ) { 185 String[] keys = map.keySet().toArray( new String[map.size()] ); 186 for( int i=0; i<keys.length; i++ ) { 187 if( map.get( keys[i] ) == null ) { 188 map.remove( keys[i] ); 189 } 190 } 191 rtnSize = map.size() ; 192 } 193 194 return rtnSize; 195 } 196 197 /** 198 * contextDestroyed 時に、すべてのセッションを、invalidate()します。 199 * 注意:キャッシュで内部管理していたセッションが、すべて無効化されてしまいます。 200 * よって、内部にセッションを管理しなくなったため、invalidate() もできません。 201 * 不具合が出るかもしれません。 202 * 203 * @og.rev 3.5.2.1 (2003/10/27) 新規作成 204 * @og.rev 4.0.0.0 (2005/01/31) セッション ⇒ UserSummary に変更 205 */ 206 static void sessionDestroyed() { 207 final UserSummary[] users ; 208 synchronized( map ) { 209 users = map.values().toArray( new UserSummary[map.size()] ); 210 map.clear(); 211 } 212 213 for( int i=0; i<users.length; i++ ) { 214 users[i].clear(); 215 } 216 System.out.println( " [" + users.length + "] Session Destroyed " ); 217 } 218 219 /** 220 * 初期化したいオブジェクトを登録します。 221 * オブジェクトは、Cleanable インターフェースを実装しておく必要があります。 222 * 実際に、clear() する場合は、ここで登録した全てのオブジェクトの clear() 223 * メソッドが呼び出されます。 224 * 225 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 226 * @og.rev 4.3.6.2 (2009/04/15) コンテキスト終了時のみのclear()対応 227 * 228 * @param obj インターフェースの実装 229 */ 230 public static void addCleanable( final Cleanable obj ) { 231// synchronized( clearList ) { 232// clearList.add( obj ); 233// } 234 addCleanable( obj, false ); 235 } 236 237 /** 238 * 初期化したいオブジェクトを登録します。 239 * オブジェクトは、Cleanable インターフェースを実装しておく必要があります。 240 * 実際に、clear() する場合は、ここで登録した全てのオブジェクトの clear() 241 * メソッドが呼び出されます。 242 * 243 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 244 * @og.rev 4.3.6.2 (2009/04/15) コンテキスト終了時のみのclear()対応 245 * 246 * @param obj インターフェースの実装 247 * @param flag trueの場合、コンテキスト停止時のみclear()を呼び出す 248 */ 249 public static void addCleanable( final Cleanable obj, final boolean flag ) { 250 if( flag ) { 251 synchronized( contextClearList ) { 252 contextClearList.add( obj ); 253 } 254 } 255 else { 256 synchronized( clearList ) { 257 clearList.add( obj ); 258 } 259 } 260 } 261 262 /** 263 * addCleanable( final Cleanable ) で登録したすべてのオブジェクトを初期化します。 264 * 処理は、Cleanable インターフェースの clear()メソッドを順次呼び出します。 265 * 266 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 267 * @og.rev 4.3.6.2 (2009/04/15) コンテキスト終了時のみのclear()対応 268 * 269 * @param flag 完全終了時に、true 270 */ 271 public static void allClear( final boolean flag ) { 272 final Cleanable[] clr ; 273 synchronized( clearList ) { 274 clr = clearList.toArray( new Cleanable[clearList.size()] ); 275 if( flag ) { clearList.clear() ; } // contextDestroyed の場合のみ実行 276 } 277 // 登録の逆順で処理していきます。 278 for( int i=clr.length-1; i>=0; i-- ) { 279 clr[i].clear(); 280 } 281 282 // コンテキスト停止時のみclear() 283 if( flag ) { 284 final Cleanable[] clr2 ; 285 synchronized( contextClearList ) { 286 clr2 = contextClearList.toArray( new Cleanable[contextClearList.size()] ); 287 contextClearList.clear(); 288 } 289 // 登録の逆順で処理していきます。 290 for( int i=clr2.length-1; i>=0; i-- ) { 291 clr2[i].clear(); 292 } 293 } 294 } 295 296 /** 297 * GE12からCONTXT PATHをhost:port/context/で登録している物を削除します。 298 * (web.xmlにTOMCAT_PORTを指定した場合に上記CONTEXT_PATHで登録されます) 299 * 300 * @og.rev 4.1.0.0 (2007/12/26) 新規作成 301 * @og.rev 5.5.4.5 (2012/07/27) 初期起動時のDB接続先は、RESOURCE_DBID とする。 302 */ 303 protected static void clearGE12() { 304 String HOST_URL = HybsSystem.sys( "HOST_URL" ); 305 String RESOURCE_DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.4.5 (2012/07/27) 初期起動時のDB接続先 306 if( HOST_URL != null && !"**".equals( HOST_URL ) ) { 307 Connection connection = null; 308 PreparedStatement pstmt = null; 309 try { 310// connection = ConnectionFactory.connection( null, null ); 311 connection = ConnectionFactory.connection( RESOURCE_DBID, null ); // 5.5.4.5 (2012/07/27) 初期起動時のDB接続先は、RESOURCE_DBID とする。 312 pstmt = connection.prepareStatement( DEL_SYS ); 313 pstmt.setString( 1, HybsSystem.sys( "SYSTEM_ID" ) ); 314 pstmt.setString( 2, HOST_URL ); 315 int delCnt = pstmt.executeUpdate(); 316 connection.commit(); 317 System.out.println( HOST_URL + " DELETE FROM GE12[" + delCnt + "]" ); 318 } catch (HybsSystemException e) { 319 LogWriter.log( e ); 320 } catch (SQLException e) { 321 Closer.rollback( connection ); 322 LogWriter.log( e ); 323 } 324 finally { 325 Closer.stmtClose( pstmt ); 326 ConnectionFactory.close( connection, null ); 327 } 328 } 329 } 330 331 /** 332 * soffice.binをkillする処理をcallします。 333 * 334 * @og.rev 4.3.0.0 (2008/07/18) 新規作成 335 * @og.rev 5.2.2.0 (2010/11/01) 循環参照解消のため、SystemManager から ProcessFactory へ移動 336 */ 337// protected static void sofficeKill() { 338// System.out.println("Kill all soffice.bin"); 339// ProcessFactory.kill(); 340// } 341 342 // deleteGUIAccessInfo() メソッドでしか使用しない、定数宣言 343 private static final int C_DEL_SYSTEM_ID = 0; 344 private static final int C_DEL_DYSET = 1; 345 346 /** 347 * アクセス統計テーブル(GE15)の再編成を行います。 348 * データの保存期間については、システムリソースのACCESS_TOKEI_ALIVE_DAYSで指定します。 349 * データの作成された日時を基準として、上記の期間よりも古いデータは、物理削除されます。 350 * ACCESS_TOKEI_ALIVE_DAYSが指定されていない場合、データの削除は行われません。 351 * 352 * @og.rev 5.0.2.0 (2009/11/01) 新規作成 353 * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策 354 */ 355 protected static void deleteGUIAccessInfo() { 356 String aliveDays = HybsSystem.sys( "ACCESS_TOKEI_ALIVE_DAYS" ); 357 if( aliveDays == null || aliveDays.length() == 0 ) { 358 return; 359 } 360 String delBaseDate = HybsSystem.getDate( HybsSystem.getDate( "yyyyMMdd" ), -1 * Integer.valueOf( aliveDays ) ); 361 362 String[] names = new String[] { "SYSTEM_ID","DYSET" }; 363 String[] values = new String[names.length]; 364 values[C_DEL_SYSTEM_ID ] = HybsSystem.sys( "SYSTEM_ID" ); 365 values[C_DEL_DYSET ] = delBaseDate + "000000"; 366 367 String RESOURCE_DBID = HybsSystem.sys( "RESOURCE_DBID" ); // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応 368 DBSimpleTable dbTable = new DBSimpleTable( names ); 369 dbTable.setApplicationInfo( null ); 370 dbTable.setConnectionID( RESOURCE_DBID ); // 5.5.5.1 (2012/08/07) 371 dbTable.setTable( "GE15" ); 372 dbTable.setWhere( "SYSTEM_ID = [SYSTEM_ID] and DYSET <= [DYSET]" ); 373 374 boolean okFlag = false; 375 try { 376 dbTable.startDelete(); 377 dbTable.execute( values ); 378 okFlag = true; 379 } 380 catch (SQLException ex) { 381 LogWriter.log( " アクセス統計テーブル削除時にエラーが発生しました" ); 382 LogWriter.log( ex.getMessage() ); 383 } 384 finally { 385 int cnt = dbTable.close( okFlag ); 386 System.out.println(); 387 System.out.println( " アクセス統計テーブルから、[" + cnt + "]件、削除しました。" ); 388 } 389 } 390 391 /** 392 * UserSummary の指定のキーに対応した項目をソートする Comparator を返します。 393 * 394 * キーは、JNAME,ID,IPADDRESS,LOGINTIME のうちのどれかです。 395 * 396 * @og.rev 3.8.5.3 (2006/08/07) 新規追加 397 * @og.rev 5.6.6.0 (2013/07/05) Comparator の作り方を、簡素化します。そのため、廃止。 398 * 399 * @param key ソートするキー項目を指定 400 * @param direction ソートする方向[true:昇順/false:降順] 401 * 402 * @return 指定のキーに対応した項目をソートする Comparator 403 */ 404// public static Comparator<UserSummary> getUserSummaryComparator( final String key,final boolean direction ) { 405// if( "JNAME,ID,ROLES,IPADDRESS,LOGINTIME".indexOf( key ) < 0 ) { 406// String errMsg = "ソートキーには、JNAME,ID,ROLES,IPADDRESS,LOGINTIME 以外は指定できません。" 407// + " Key=" + key ; 408// throw new HybsSystemException( errMsg ); 409// } 410// 411// Comparator<UserSummary> comp = null; 412// 413// if( "JNAME".equals( key ) ) { 414// comp = new JNAME_Comparator( direction ); 415// } 416// else if( "ID".equals( key ) ) { 417// comp = new ID_Comparator( direction ); 418// } 419// else if( "ROLES".equals( key ) ) { 420// comp = new ROLES_Comparator( direction ); 421// } 422// else if( "IPADDRESS".equals( key ) ) { 423// comp = new IPADDRESS_Comparator( direction ); 424// } 425// else if( "LOGINTIME".equals( key ) ) { 426// comp = new LOGINTIME_Comparator( direction ); 427// } 428// 429// return comp ; 430// } 431 432 /** 433 * UserSummary の Attribute で比較する Comparator 内部クラスの定義。 434 * 435 * key が、Attribute のキーになりますが、使用するのは、大文字化してからです。 436 * 437 * @og.rev 5.6.6.0 (2013/07/05) 新規追加 438 */ 439 private static final class ATTRI_Comparator implements Comparator<UserSummary>, Serializable { 440 private static final long serialVersionUID = 5660 ; // 5.6.6.0 (2013/07/05) 441 private final String key ; 442 private final boolean direct ; 443 444 /** 445 * ソートの方向を引数にとるコンストラクタ。 446 * 447 * @og.rev 5.6.6.0 (2013/07/05) 新規追加 448 * 449 * @param direction ソートの方向[true:昇順/false:降順] 450 */ 451 public ATTRI_Comparator( final String key,final boolean direction ) { 452 this.key = key; 453 direct = direction; 454 } 455 456 /** 457 * getAttribute 比較メソッド 458 * インタフェース Comparable の 実装です。 459 * 460 * キーとして、getAttribute( String ) の取得結果を使用する為、null もあり得ます。その場合、equals 整合性は取れませんが、 461 * 処理としては、正常に動作するようにしておきます。つまり、null はもっとも小さい値とし、比較対象がともに null の 462 * 場合は、同じと判断します。 463 * 464 * @og.rev 5.6.6.0 (2013/07/05) 新規追加 465 * 466 * @param o1 比較対象の最初のオブジェクト 467 * @param o2 比較対象の 2 番目のオブジェクト 468 * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 469 */ 470 public int compare( final UserSummary o1, final UserSummary o2 ) { 471 String key1 = o1.getAttribute( key ); 472 String key2 = o2.getAttribute( key ); 473 474 int rtn ; 475 if( key1 == null && key2 == null ) { rtn = 0; } 476 else if( key1 == null ) { rtn = -1; } 477 else if( key2 == null ) { rtn = 1; } 478 else { rtn = key1.compareTo( key2 ) ; } 479 480 return ( direct ) ? rtn : -rtn; // マイナス 0 が気になるが、まあ、良しとする。 481 } 482 } 483 484// /** 485// * JNAME で比較する Comparator 内部クラスの定義。 486// * 487// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 488// * @og.rev 5.6.6.0 (2013/07/05) ATTRI_Comparator に統合のため、廃止 489// */ 490// private static final class JNAME_Comparator implements Comparator<UserSummary>, Serializable { 491// private static final long serialVersionUID = 4000 ; // 4.0.0 (2006/09/31) 492// private final boolean direct ; 493// 494// /** 495// * ソートの方向を引数にとるコンストラクタ。 496// * 497// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 498// * 499// * @param direction ソートの方向[true:昇順/false:降順] 500// */ 501// public JNAME_Comparator( final boolean direction ) { 502// direct = direction; 503// } 504// 505// /** 506// * getJname 比較メソッド 507// * インタフェース Comparable の 実装です。 508// * 509// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 510// * 511// * @param o1 比較対象の最初のオブジェクト 512// * @param o2 比較対象の 2 番目のオブジェクト 513// * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 514// */ 515// public int compare( final UserSummary o1, final UserSummary o2 ) { 516// String key1 = o1.getJname(); 517// String key2 = o2.getJname(); 518// return ( direct ) ? key1.compareTo( key2 ) : key2.compareTo( key1 ); 519// } 520// } 521// 522// /** 523// * ID で比較する Comparator 内部クラスの定義。 524// * 525// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 526// * @og.rev 5.6.6.0 (2013/07/05) ATTRI_Comparator に統合のため、廃止 527// */ 528// private static final class ID_Comparator implements Comparator<UserSummary>, Serializable { 529// private static final long serialVersionUID = 4000 ; // 4.0.0 (2006/09/31) 530// private final boolean direct ; 531// 532// /** 533// * ソートの方向を引数にとるコンストラクタ。 534// * 535// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 536// * 537// * @param direction ソートの方向[true:昇順/false:降順] 538// */ 539// public ID_Comparator( final boolean direction ) { 540// direct = direction; 541// } 542// 543// /** 544// * getUserID 比較メソッド 545// * インタフェース Comparable の 実装です。 546// * 547// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 548// * 549// * @param o1 比較対象の最初のオブジェクト 550// * @param o2 比較対象の 2 番目のオブジェクト 551// * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 552// */ 553// public int compare( final UserSummary o1, final UserSummary o2 ) { 554// String key1 = o1.getUserID(); 555// String key2 = o2.getUserID(); 556// return ( direct ) ? key1.compareTo( key2 ) : key2.compareTo( key1 ); 557// } 558// } 559// 560// /** 561// * ROLES で比較する Comparator 内部クラスの定義。 562// * 563// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 564// * @og.rev 5.6.6.0 (2013/07/05) ATTRI_Comparator に統合のため、廃止 565// */ 566// private static final class ROLES_Comparator implements Comparator<UserSummary>, Serializable { 567// private static final long serialVersionUID = 4000 ; // 4.0.0 (2006/09/31) 568// private final boolean direct ; 569// 570// /** 571// * ソートの方向を引数にとるコンストラクタ。 572// * 573// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 574// * 575// * @param direction ソートの方向[true:昇順/false:降順] 576// */ 577// public ROLES_Comparator( final boolean direction ) { 578// direct = direction; 579// } 580// 581// /** 582// * getRoles 比較メソッド 583// * インタフェース Comparable の 実装です。 584// * 585// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 586// * 587// * @param o1 比較対象の最初のオブジェクト 588// * @param o2 比較対象の 2 番目のオブジェクト 589// * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 590// */ 591// public int compare( final UserSummary o1, final UserSummary o2 ) { 592// String key1 = o1.getRoles(); 593// String key2 = o2.getRoles(); 594// return ( direct ) ? key1.compareTo( key2 ) : key2.compareTo( key1 ); 595// } 596// } 597// 598// /** 599// * IPADDRESS で比較する Comparator 内部クラスの定義。 600// * 601// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 602// * @og.rev 5.6.6.0 (2013/07/05) ATTRI_Comparator に統合のため、廃止 603// */ 604// private static final class IPADDRESS_Comparator implements Comparator<UserSummary>, Serializable { 605// private static final long serialVersionUID = 4000 ; // 4.0.0 (2006/09/31) 606// private final boolean direct ; 607// 608// /** 609// * ソートの方向を引数にとるコンストラクタ。 610// * 611// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 612// * 613// * @param direction ソートの方向[true:昇順/false:降順] 614// */ 615// public IPADDRESS_Comparator( final boolean direction ) { 616// direct = direction; 617// } 618// 619// /** 620// * getIPAddress 比較メソッド 621// * インタフェース Comparable の 実装です。 622// * 623// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 624// * 625// * @param o1 比較対象の最初のオブジェクト 626// * @param o2 比較対象の 2 番目のオブジェクト 627// * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 628// */ 629// public int compare( final UserSummary o1, final UserSummary o2 ) { 630// String key1 = o1.getIPAddress(); 631// String key2 = o2.getIPAddress(); 632// return ( direct ) ? key1.compareTo( key2 ) : key2.compareTo( key1 ); 633// } 634// } 635// 636// /** 637// * LOGINTIME で比較する Comparator 内部クラスの定義。 638// * 639// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 640// * @og.rev 5.6.6.0 (2013/07/05) ATTRI_Comparator に統合のため、廃止 641// */ 642// private static final class LOGINTIME_Comparator implements Comparator<UserSummary>, Serializable { 643// private static final long serialVersionUID = 4000 ; // 4.0.0 (2006/09/31) 644// private final boolean direct ; 645// 646// /** 647// * ソートの方向を引数にとるコンストラクタ。 648// * 649// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 650// * 651// * @param direction ソートの方向[true:昇順/false:降順] 652// */ 653// public LOGINTIME_Comparator( final boolean direction ) { 654// direct = direction; 655// } 656// 657// /** 658// * getLoginTime 比較メソッド 659// * インタフェース Comparable の 実装です。 660// * 661// * @og.rev 4.0.0.0 (2006/09/31) 新規追加 662// * 663// * @param o1 比較対象の最初のオブジェクト 664// * @param o2 比較対象の 2 番目のオブジェクト 665// * @return 最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、最初の引数が 2 番目の引数より大きい場合は正の整数 666// */ 667// public int compare( final UserSummary o1, final UserSummary o2 ) { 668// long key1 = o1.getLoginTime(); 669// long key2 = o2.getLoginTime(); 670// int rtn = (direct) ? 1:-1 ; 671// return ( key1 == key2 ) ? 0 : (key1 < key2) ? rtn : -rtn ; 672// } 673// } 674}