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}