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}