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}