    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}