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.system.DateSet; // 6.4.2.0 (2016/01/29) 022import org.opengion.fukurou.util.HybsDateUtil; // 6.4.2.0 (2016/01/29) 023import org.opengion.fukurou.db.ApplicationInfo; 024import org.opengion.fukurou.db.DBUtil; 025 026import java.util.Map; 027import java.util.HashMap; 028import java.util.LinkedHashMap; 029import java.util.Collections; // 6.4.3.1 (2016/02/12) 030 031/** 032 * ユーザーアクセス画面管理テーブルを維持する為のクラスです。 033 * @og.group リソース管理 034 * 035 * @version 4.1.1.0 036 * @author Sen.Li 037 * @since JDK5.0, 038 */ 039public final class UserAccessTable { 040 // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 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=?,NEXTGUI=?" 050 + " WHERE SYSTEM_ID=? AND USERID=? AND GUIKEY=?"; 051 052 private static final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); 053 private static final int GEA09_GUIKEY = 0; 054 private static final int GEA09_SEQNO = 1; 055 private static final int GEA09_NAME_JA = 2; 056 private static final int GEA09_LAST_ACCESS = 3; 057 private static final int GEA09_FGFAVORITE = 4; 058 private static final int GEA09_CLASSIFY = 5; 059 private static final int GEA09_NEXTGUI = 6; // 5.3.0.0 (2010/12/01) 追加 060 private static final String FGFAVORITE_ON = "1"; 061 062 /** フラグキーの enum */ 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 UserAccessTable() { } 072 073 /** 074 * ユーザーアクセス画面管理テーブルを整理します。 075 * このメソッドでは guiMap へのセットをしています(副作用の扱い)。 076 * 077 * @og.rev 4.1.1.0 (2008/01/30) 新規追加 078 * @og.rev 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 079 * @og.rev 6.3.9.0 (2015/11/06) Map.keySet() ではなく、Map.entrySet() を使う様に変更。 080 * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。 081 * @og.rev 6.4.2.0 (2016/01/29) HybsDateUtil.getDatePlus( String,int ) を直接利用するように修正します。 082 * @og.rev 6.4.3.1 (2016/02/12) Collections.unmodifiableMap( Map<? extends K,? extends V> ) で作成された変更不可のMapを返します。 083 * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 084 * 085 * @param guiMap 画面オブジェクトマップへの参照 086 * @param systemId システムID 087 * @param userId ユーザーID 088 * @param lang 言語 089 * 090 * @return お気に入りマップ(Collections.unmodifiableMapされた書き換え不可のMap) 091 */ 092 public static Map<String,FavoriteGUIData> makeAccessDB( 093 final Map<String,GUIInfo> guiMap,final String systemId,final String userId,final String lang ) { 094 final String today = DateSet.getDate( "yyyyMMddHHmmss" ); // 6.4.2.0 (2016/01/29) 095 final Map<String,FgKeys> fgKeyMap = new HashMap<>(); 096 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 097 final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 098 ApplicationInfo appInfo = null; 099 if( USE_DB_APPLICATION_INFO ) { 100 appInfo = new ApplicationInfo(); 101 // ユーザーID,IPアドレス,ホスト名 102 appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 103 // 画面ID,操作,プログラムID 104 appInfo.setModuleInfo( "UserAccessTable",userId,"makeAccessDB" ); 105 } 106 107 // guiMapのキーで、新マップを作成、 108 // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 109 guiMap.keySet().forEach( k -> fgKeyMap.put( k,FgKeys.GUIMAP_ONLY ) ); 110 111 final Map<String,FavoriteGUIData> favoriteGuiMap = new LinkedHashMap<>(); 112 // 4.1.1.0(2008/01/22)ユーザーアクセスの日付を取得し、accessPastDays 前の日付を計算する。 113 final String accessPastDays = HybsSystem.sys( "ACCESS_TOKEI_PAST_DAYS" ); 114 final int diffDate = ( accessPastDays == null ) ? 0 : -Integer.parseInt( accessPastDays ); 115 final String judgeTime = HybsDateUtil.getDatePlus( today.substring( 0,8 ),diffDate ); // 6.4.2.0 (2016/01/29) 116 String lastAccessTime = null; 117 String key = null; 118 String[] args = new String[] { systemId,userId }; 119 final String[][] vals = DBUtil.dbExecute( GEA09_QUERY,args,appInfo,DBID ); 120 final int len = vals.length; 121 122 for( int i=0; i<len; i++ ) { 123 key = vals[i][GEA09_GUIKEY]; 124 final GUIInfo gui = guiMap.get( key ); 125 if( gui == null ) { 126 fgKeyMap.put( key,FgKeys.GEA09_ONLY ); 127 } 128 else { 129 // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 130 final String nxtgui = vals[i][GEA09_NEXTGUI]; 131 if( nxtgui != null ) { 132 final String[] keys = nxtgui.split( "," ); 133 for( final String nextKey : keys ) { 134 gui.setNextGuiKey( nextKey ); // DB から復活 135 } 136 } 137 138 fgKeyMap.remove( key ); 139 // 4.1.1.0(2008/01/22)お気に入りマップの作成 140 if( FGFAVORITE_ON.equals( vals[i][GEA09_FGFAVORITE] ) && gui.isRead() ) { 141 favoriteGuiMap.put( key,new FavoriteGUIData( vals[i][GEA09_GUIKEY],vals[i][GEA09_SEQNO] 142 ,vals[i][GEA09_NAME_JA],vals[i][GEA09_CLASSIFY] ) ); 143 } 144 // 4.1.1.0(2008/01/22)ACCESS_TOKEI_PAST_DAYSに定義された期間以内の画面を格上する。 145 lastAccessTime = vals[i][GEA09_LAST_ACCESS]; 146 // 6.0.0.1 (2014/04/25) These nested if statements could be combined 147 if( lastAccessTime.length() >= 8 && lastAccessTime.compareTo( judgeTime ) >=0 ) { 148 gui.setLevelUp(); 149 } 150 } 151 } 152 153 final ResourceManager resource = ResourceFactory.newInstance( lang ); 154 final String undefined = resource.getLabel( "UNDEFINED" ); 155 // 6.3.9.0 (2015/11/06) Map.keySet() ではなく、Map.entrySet() を使う様に変更。 156 for( final Map.Entry<String,FgKeys> entry : fgKeyMap.entrySet() ) { 157 final String conKey = entry.getKey(); 158 final FgKeys fgKey = entry.getValue(); 159 switch ( fgKey ) { 160 case GUIMAP_ONLY: 161 args = new String[] { systemId,userId,conKey,"9999999",guiMap.get(conKey).getLabel() 162 ,undefined,"1",today,userId,"UsrAccsTbl" }; 163 DBUtil.dbExecute( GEA09_INSERT,args,appInfo,DBID ); 164 break; 165 case GEA09_ONLY: 166 args = new String[] { systemId,userId,conKey }; 167 DBUtil.dbExecute( GEA09_DELETE,args,appInfo,DBID ); 168 break; 169 default: 170 final String errMsg = "guiMapとGEA09の突合せフラグが GUIMAP_ONLY と GEA09_ONLY 以外の値がセットされています。" 171 + "画面ID:" + conKey + " フラグ:" + fgKey; 172 throw new HybsSystemException( errMsg ); 173 } 174 } 175 176 return Collections.unmodifiableMap( favoriteGuiMap ); // 6.4.3.1 (2016/02/12) 177 } 178 179 /** 180 * ユーザーアクセス画面管理テーブルの最終アクセス時間を更新します。 181 * 182 * @og.rev 4.1.1.0 (2008/01/30) 新規追加 183 * @og.rev 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 184 * @og.rev 6.8.4.2 (2017/12/25) nextGuiKeys(NEXTGUI)が、1000Byteのため、文字数制限しておきます。 185 * 186 * @param systemId システムID 187 * @param userId ユーザーID 188 * @param guiKey 画面ID 189 * @param lastAccessTime 画面の最終アクセス時間 190 * @param nextGuiKeys 次にアクセスしている画面IDのCSV文字列 191 */ 192 public static void updateLastAccessTime( final String systemId,final String userId,final String guiKey,final String lastAccessTime,final String nextGuiKeys ) { 193 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 194 final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 195 ApplicationInfo appInfo = null; 196 if( USE_DB_APPLICATION_INFO ) { 197 appInfo = new ApplicationInfo(); 198 // ユーザーID,IPアドレス,ホスト名 199 appInfo.setClientInfo( systemId,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 200 // 画面ID,操作,プログラムID 201 appInfo.setModuleInfo( "UserAccessTable",userId,"updateLastAccessTime" ); 202 } 203 204 // 6.8.4.2 (2017/12/25) nextGuiKeys(NEXTGUI)が、1000Byteのため、文字数制限しておきます。 205 final String nextGui = nextGuiKeys != null && nextGuiKeys.length() > 1000 ? nextGuiKeys.substring( 0,1000 ) : nextGuiKeys ; 206 207 // 5.3.0.0 (2010/12/01) 画面アクセスの履歴(順番)を管理する機能を追加 208 final String[] args = new String[] { lastAccessTime,nextGui,systemId,userId,guiKey }; // 6.8.4.2 (2017/12/25) 209 DBUtil.dbExecute( GEA09_UPDATE,args,appInfo,DBID ); 210 } 211}