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