    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.resource;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020
    021import org.opengion.fukurou.util.ApplicationInfo;
    022import org.opengion.fukurou.db.DBUtil;
    023
    024import java.util.Map;
    025import java.util.HashMap;
    026import java.util.LinkedHashMap;
    027
    028/**
    029 * ユーザーアクセス画面管理テーブルを維持する為のクラスです。
    030 * @og.group リソース管理
    031 *
    032 * @version  4.1.1.0
    033 * @author   Sen.Li
    034 * @since    JDK5.0,
    035 */
    036public final class UserAccessTable {
    037        // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    038//      private static final String GEA09_QUERY  = "SELECT GUIKEY,SEQNO,NAME_JA,LAST_ACCESS,FGFAVORITE,CLASSIFY FROM GEA09"
    039//                                                                      + " WHERE SYSTEM_ID=? AND USERID=?"
    040//                                                                      + " ORDER BY SEQNO,CLASSIFY,GUIKEY";
    041        private static final String GEA09_QUERY  = "SELECT GUIKEY,SEQNO,NAME_JA,LAST_ACCESS,FGFAVORITE,CLASSIFY,NEXTGUI FROM GEA09"
    042                                                                        + " WHERE SYSTEM_ID=? AND USERID=?"
    043                                                                        + " ORDER BY SEQNO,CLASSIFY,GUIKEY";
    044        private static final String GEA09_DELETE = "DELETE FROM GEA09"
    045                                                                        + " WHERE SYSTEM_ID=? AND USERID=? AND GUIKEY=?";
    046        private static final String GEA09_INSERT = "INSERT INTO GEA09(SYSTEM_ID,USERID,GUIKEY,SEQNO,NAME_JA,CLASSIFY,FGJ"
    047                                                                        + ",DYSET,USRSET,PGUPD) VALUES(?,?,?,?,?,?,?,?,?,?)";
    048        // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    049//      private static final String GEA09_UPDATE = "UPDATE GEA09 SET LAST_ACCESS=?"
    050//                                                                      + " WHERE SYSTEM_ID=? AND USERID=? AND GUIKEY=?";
    051        private static final String GEA09_UPDATE = "UPDATE GEA09 SET LAST_ACCESS=?,NEXTGUI=?"
    052                                                                        + " WHERE SYSTEM_ID=? AND USERID=? AND GUIKEY=?";
    053
    054        private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
    055        private static final int GEA09_GUIKEY           = 0;
    056        private static final int GEA09_SEQNO            = 1;
    057        private static final int GEA09_NAME_JA          = 2;
    058        private static final int GEA09_LAST_ACCESS      = 3;
    059        private static final int GEA09_FGFAVORITE       = 4;
    060        private static final int GEA09_CLASSIFY         = 5;
    061        private static final int GEA09_NEXTGUI          = 6;    // 5.3.0.0 (2010/12/01) 追加
    062        private static final String  FGFAVORITE_ON      = "1";
    063        private static enum FgKeys { GUIMAP_ONLY,GEA09_ONLY };
    064
    065        /**
    066         * コンストラクター
    067         * オブジェクトを作成できないように、privateにします。
    068         *
    069         * @og.rev 4.3.1.1 (2008/08/23) コンストラクタは、void 宣言を付けません。
    070         */
    071//      private void UserAccessTable() { }
    072        private UserAccessTable() { }
    073
    074        /**
    075         * ユーザーアクセス画面管理テーブルを整理します。
    076         * このメソッドでは guiMap へのセットをしています(副作用の扱い)。
    077         *
    078         * @og.rev 4.1.1.0 (2008/01/30) 新規追加
    079         * @og.rev 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    080         *
    081         * @param  guiMap               画面オブジェクトマップへの参照
    082         * @param  systemId             システムID
    083         * @param  userId               ユーザーID
    084         * @param  lang                 言語
    085         *
    086         * @return      お気に入りマップ
    087         */
    088        public static Map<String,FavoriteGUIData> makeAccessDB(
    089                                                        final Map<String,GUIInfo> guiMap,final String systemId,final String userId,final String lang ) {
    090                String today                    = HybsSystem.getDate( "yyyyMMddHHmmss" );
    091                Map<String,FgKeys>        conGuiKey = new HashMap<String,FgKeys>();
    092                /** コネクションにアプリケーション情報を追記するかどうか指定 */
    093                boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    094                ApplicationInfo appInfo = null;
    095                if( USE_DB_APPLICATION_INFO ) {
    096                        appInfo = new ApplicationInfo();
    097                        // ユーザーID,IPアドレス,ホスト名
    098                        appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    099                        // 画面ID,操作,プログラムID
    100                        appInfo.setModuleInfo( "UserAccessTable",userId,"makeAccessDB" );
    101                }
    102
    103                // guiMapのキーで、新マップを作成、
    104                for( String conKey : guiMap.keySet() ) {
    105                        conGuiKey.put( conKey,FgKeys.GUIMAP_ONLY );
    106                }
    107
    108                Map<String,FavoriteGUIData> favoriteGuiMap = new LinkedHashMap<String,FavoriteGUIData>();
    109                // 4.1.1.0(2008/01/22)ユーザーアクセスの日付を取得し、accessPastDays 前の日付を計算する。
    110                String accessPastDays   = HybsSystem.sys( "ACCESS_TOKEI_PAST_DAYS" );
    111                int    diffDate                 = ( accessPastDays == null ) ? 0 : -Integer.parseInt( accessPastDays );
    112                String judgeTime                = HybsSystem.getDate( today.substring( 0,8 ),diffDate );
    113                String lastAccessTime   = null;
    114                String key                              = null;
    115                String[]   args                 = new String[] { systemId,userId };
    116                String[][] vals                 = DBUtil.dbExecute( GEA09_QUERY,args,appInfo,DBID );
    117                int len                                 = vals.length;
    118
    119                for( int i=0; i<len; i++ ) {
    120                        key = vals[i][GEA09_GUIKEY];
    121                        GUIInfo gui = guiMap.get( key );
    122                        if( gui == null ) {
    123                                conGuiKey.put( key,FgKeys.GEA09_ONLY );
    124                        }
    125                        else {
    126                                // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    127                                String nxtgui = vals[i][GEA09_NEXTGUI];
    128                                if( nxtgui != null ) {
    129                                        String[] keys = nxtgui.split( "," );
    130                                        for( String nextKey : keys ) {
    131                                                gui.setNextGuiKey( nextKey );           // DB から復活
    132                                        }
    133                                }
    134
    135                                conGuiKey.remove( key );
    136                                // 4.1.1.0(2008/01/22)お気に入りマップの作成
    137                                if( FGFAVORITE_ON.equals( vals[i][GEA09_FGFAVORITE] ) && gui.isRead() ) {
    138                                        favoriteGuiMap.put( key,new FavoriteGUIData( vals[i][GEA09_GUIKEY],vals[i][GEA09_SEQNO]
    139                                                ,vals[i][GEA09_NAME_JA],vals[i][GEA09_CLASSIFY] ) );
    140                                }
    141                                // 4.1.1.0(2008/01/22)ACCESS_TOKEI_PAST_DAYSに定義された期間以内の画面を格上する。
    142                                lastAccessTime = vals[i][GEA09_LAST_ACCESS];
    143                                if( lastAccessTime.length() >= 8 ) {
    144                                        if( lastAccessTime.compareTo( judgeTime ) >=0 ) {
    145                                                gui.setLevelUp();
    146                                        }
    147                                }
    148                        }
    149                }
    150
    151                ResourceManager resource = ResourceFactory.newInstance( lang );
    152                String undefined = resource.getLabel( "UNDEFINED" );
    153                FgKeys fgKey = null;
    154                for( String conKey : conGuiKey.keySet() ) {
    155                        fgKey = conGuiKey.get( conKey );
    156                        switch ( fgKey ) {
    157                                case GUIMAP_ONLY:
    158                                        args = new String[] { systemId,userId,conKey,"9999999",guiMap.get(conKey).getLabel()
    159                                                                                  ,undefined,"1",today,userId,"UsrAccsTbl" };
    160                        DBUtil.dbExecute( GEA09_INSERT,args,appInfo,DBID );
    161                                        break;
    162                                case GEA09_ONLY:
    163                                        args = new String[] { systemId,userId,conKey };
    164                                        DBUtil.dbExecute( GEA09_DELETE,args,appInfo,DBID );
    165                                        break;
    166                                default:
    167                                        String errMsg = "guiMapとGEA09の突合せフラグが GUIMAP_ONLY と GEA09_ONLY 以外の値がセットされています。"
    168                                                                  + "画面ID：" + conKey + " フラグ：" + fgKey;
    169                                        throw new HybsSystemException( errMsg );
    170                        }
    171                }
    172                return favoriteGuiMap;
    173        }
    174
    175        /**
    176         * ユーザーアクセス画面管理テーブルの最終アクセス時間を更新します。
    177         *
    178         * @og.rev 4.1.1.0 (2008/01/30) 新規追加
    179         * @og.rev 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    180         *
    181         * @param systemId                      システムID
    182         * @param userId                        ユーザーID
    183         * @param guiKey                        画面ID
    184         * @param lastAccessTime        画面の最終アクセス時間
    185         * @param nextGuiKeys           次にアクセスしている画面IDのCSV文字列
    186         */
    187//      public static void updateLastAccessTime( final String systemId,final String userId,final String guiKey,final String lastAccessTime ) {
    188        public static void updateLastAccessTime( final String systemId,final String userId,final String guiKey,final String lastAccessTime,final String nextGuiKeys ) {
    189                /** コネクションにアプリケーション情報を追記するかどうか指定 */
    190                boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    191                ApplicationInfo appInfo = null;
    192                if( USE_DB_APPLICATION_INFO ) {
    193                        appInfo = new ApplicationInfo();
    194                        // ユーザーID,IPアドレス,ホスト名
    195                        appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
    196                        // 画面ID,操作,プログラムID
    197                        appInfo.setModuleInfo( "UserAccessTable",userId,"updateLastAccessTime" );
    198                }
    199
    200                // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加
    201//              String[] args = new String[] { lastAccessTime,systemId,userId,guiKey };
    202                String[] args = new String[] { lastAccessTime,nextGuiKeys,systemId,userId,guiKey };
    203                DBUtil.dbExecute( GEA09_UPDATE,args,appInfo,DBID );
    204        }
    205}