    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&lt;? extends K,? extends V&gt; ) で作成された変更不可の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}