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}