    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
    018//import java.text.MessageFormat;                                                                                               // 8.5.2.0 (2023/07/14) Delete
    019//import java.util.List;                                                                                                                // 8.5.2.0 (2023/07/14) Delete
    020//import java.util.Arrays;                                                                                                              // 6.4.7.0 (2016/06/03) 8.5.2.0 (2023/07/14) Delete
    021
    022import org.opengion.hayabusa.common.HybsSystem;
    023import org.opengion.hayabusa.common.HybsSystemException;
    024import org.opengion.hayabusa.common.SystemManager;
    025import org.opengion.fukurou.system.LogWriter;
    026import org.opengion.fukurou.util.Cleanable;
    027import org.opengion.fukurou.util.StringUtil;
    028import org.opengion.fukurou.db.ApplicationInfo;
    029import org.opengion.fukurou.db.DBUtil;
    030
    031/**
    032 * systemId に対応したﾕｰｻﾞｰ情報を作成するﾌｧｸﾄﾘｸﾗｽです。
    033 *
    034 * UserInfoｵﾌﾞｼﾞｪｸﾄは、ｷｬｯｼｭせずに、要求都度、ﾃﾞｰﾀﾍﾞｰｽを検索します。
    035 * これは、ﾕｰｻﾞｰ登録が、他ｼｽﾃﾑより行われる可能性を考慮している為です。
    036 * ﾕｰｻﾞｰｵﾌﾞｼﾞｪｸﾄの要求は、基本的にﾛｸﾞｲﾝ時のみで、その後ｾｯｼｮﾝに
    037 * ｷｰﾌﾟされます。
    038 *
    039 * 検索するｶﾗﾑには、必ず、USERID,LANG,NAME,ROLES がこの順番で含まれており、
    040 * 絞込み条件(?ﾊﾟﾗﾒｰﾀ)として、SYSTEM_ID,USERID がこの順番で指定される必要があります。
    041 * (ｶﾗﾑ名は関係ありません。並び順と意味が重要です。)
    042 * また、検索順(ORDER BY)は、優先順位の低い順に検索してください。使用するのは、一番最後に
    043 * 検索された行を使用します。
    044 * ﾕｰｻﾞｰﾘｿｰｽは、RESOURCE_USER_DBID で指定のﾃﾞｰﾀﾍﾞｰｽから取得します。
    045 * 未定義の場合は、RESOURCE_DBID から、それも未定義の場合は ﾃﾞﾌｫﾙﾄの接続先を
    046 * 使用します。
    047 *
    048 * SYSTEM_ID='**' は、共通ﾘｿｰｽです(ROLESも共通に設定する必要があります。)。
    049 * これは、ｼｽﾃﾑ間で共通に使用されるﾘｿｰｽ情報を登録しておきます。
    050 * SYSTEM_ID は、指定のｼｽﾃﾑIDと**を検索対象にします。**は、全ｼｽﾃﾑ共通の
    051 * 指定のｼｽﾃﾑIDと**と両方存在する場合は、指定のｼｽﾃﾑIDが優先されます。
    052 *
    053 * ver4 では、ﾃﾞﾌｫﾙﾄﾛｰﾙという考え方がなくなりましたので、画面のﾛｰﾙに、
    054 * (*)を明示的に追加し、RWMODE を指定する必要があります。
    055 *
    056 * @og.rev 4.0.0.0 (2004/12/31) 新規作成
    057 * @og.rev 8.5.2.0 (2023/07/14) 一部の機能廃止による修正(問合・ﾄﾗﾌﾞﾙ 0200010980)
    058 * @og.group ﾘｿｰｽ管理
    059 *
    060 * @version     4.0
    061 * @author      Kazuhiko Hasegawa
    062 * @since       JDK5.0,
    063 */
    064public final class UserInfoFactory {
    065
    066        private static final String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
    067
    068        // ﾕｰｻﾞｰﾘｿｰｽの接続先を、取得します。
    069        private static String dbid = StringUtil.nval(
    070                                                                HybsSystem.sys( "RESOURCE_USER_DBID" ) ,
    071                                                                HybsSystem.sys( "RESOURCE_DBID" )
    072                                                        ) ;
    073
    074        // ﾕｰｻﾞｰﾘｿｰｽのｷｰ指定読み込みのｸｴﾘｰ
    075        private static String query                     = HybsSystem.sys( "RESOURCE_USER_SQL" );
    076        private static String queryRole         = HybsSystem.sys( "RESOURCE_USER_ROLE_SQL" );
    077
    078//      // 5.2.0.0 (2010/09/01) LDAP対応 8.5.2.0 (2023/07/14) Delete
    079//      private static String srcType           = HybsSystem.sys( "RESOURCE_USER_SRC_TYPE" );
    080//      private static String[] ldapClm         = StringUtil.csv2Array( HybsSystem.sys( "RESOURCE_USER_LDAP_CLM" ) );
    081//      private static String ldapFilter        = HybsSystem.sys( "RESOURCE_USER_LDAP_FILTER" );
    082//      private static String ldapRoleFilter= HybsSystem.sys( "RESOURCE_USER_ROLE_LDAP_FILTER" );
    083
    084//      private static String searchScope       = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );
    085//      private static String initctx           = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
    086//      private static String providerURL       = HybsSystem.sys( "LDAP_PROVIDER_URL" );
    087//      private static String entrydn           = HybsSystem.sys( "LDAP_ENTRYDN" );
    088//      private static String password          = HybsSystem.sys( "LDAP_PASSWORD" );
    089//      private static String searchbase        = HybsSystem.sys( "LDAP_SEARCH_BASE" );
    090
    091        private static final Object LOCK = new Object();                                                        // 6.4.1.1 (2016/01/16) lock → LOCK  refactoring
    092
    093        /** ｺﾈｸｼｮﾝにｱﾌﾟﾘｹｰｼｮﾝ情報を追記するかどうか指定 */
    094        public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
    095
    096        // 4.0.0 (2005/01/31) Cleanable ｲﾝﾀｰﾌｪｰｽによる初期化処理
    097        static {
    098                final Cleanable clr = new Cleanable() {
    099                        /**
    100                         * 初期化(ｸﾘｱ)します。
    101                         * 主に、ｷｬｯｼｭｸﾘｱで利用します。
    102                         */
    103                        public void clear() {
    104                                UserInfoFactory.clear();
    105                        }
    106                };
    107
    108                SystemManager.addCleanable( clr );
    109        }
    110
    111        /**
    112         * ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰをprivateにして、
    113         * ｵﾌﾞｼﾞｪｸﾄの生成をさせないようにする。
    114         */
    115        private UserInfoFactory() {
    116        }
    117
    118        /**
    119         * UserInfo ｵﾌﾞｼﾞｪｸﾄを取得します。
    120         *
    121         * UserInfoｵﾌﾞｼﾞｪｸﾄは、ｷｬｯｼｭせずに、要求都度、ﾃﾞｰﾀﾍﾞｰｽを検索します。
    122         * これは、ﾕｰｻﾞｰ登録が、他ｼｽﾃﾑより行われる可能性を考慮している為です。
    123         * ﾕｰｻﾞｰｵﾌﾞｼﾞｪｸﾄの要求は、基本的にﾛｸﾞｲﾝ時のみで、その後ｾｯｼｮﾝに
    124         * ｷｰﾌﾟされます。
    125         *
    126         * @og.rev 3.7.0.4 (2005/03/18) ｹﾞｽﾄﾛｸﾞｲﾝ機能追加
    127         * @og.rev 4.0.0.0 (2007/10/31) ﾛｰﾙ指定でのﾛｸﾞｲﾝ機能追加
    128         * @og.rev 4.3.4.0 (2008/12/01) GE20(ﾕｰｻﾞｰ定数)へ登録するかのﾌﾗｸﾞへの対応
    129         * @og.rev 4.4.0.0 (2009/08/02) ﾃﾞｰﾀﾛｰﾙ対応
    130         * @og.rev 5.2.0.0 (2010/09/01) LDAP対応
    131         * @og.rev 5.3.6.0 (2011/06/01) GE20の読み込みをUserInfo内に移動
    132         * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(DataRole.java廃止)
    133         * @og.rev 8.5.2.0 (2023/07/14) 一部の機能廃止による修正(問合・ﾄﾗﾌﾞﾙ 0200010980)
    134         *
    135         * @param       userID          ﾕｰｻﾞｰID
    136         * @param       ipAddress       ﾛｸﾞｲﾝ端末のIPｱﾄﾞﾚｽ
    137         * @param       roles           ﾃﾞｰﾀﾛｰﾙ
    138         * @return      UserInfoｵﾌﾞｼﾞｪｸﾄ
    139         */
    140        public static UserInfo newInstance( final String userID,final String ipAddress,final String roles ) {
    141                // 3.8.7.0 (2006/12/15) アクセスログ取得の為、ApplicationInfoオブジェクトを設定
    142                ApplicationInfo appInfo = null ;
    143                if( USE_DB_APPLICATION_INFO ) {
    144                        appInfo = new ApplicationInfo();
    145                        // ﾕｰｻﾞｰID,IPｱﾄﾞﾚｽ,ﾎｽﾄ名
    146                        appInfo.setClientInfo( userID,ipAddress,null );
    147                        // 画面ID,操作,ﾌﾟﾛｸﾞﾗﾑID
    148                        appInfo.setModuleInfo( "UserInfoFactory",null,"newInstance" );
    149                }
    150
    151                String[][] vals;
    152//              if( "LDAP".equalsIgnoreCase( srcType ) ) {                                                              // 8.5.2.0 (2023/07/14) Delete
    153//                      vals = getValsByLdap( userID, roles );                                                          // 8.5.2.0 (2023/07/14) Delete
    154//              }                                                                                                                                               // 8.5.2.0 (2023/07/14) Delete
    155//              else {                                                                                                                                  // 8.5.2.0 (2023/07/14) Delete
    156                        vals = getVals( userID, roles, appInfo );
    157//              }                                                                                                                                               // 8.5.2.0 (2023/07/14) Delete
    158
    159                final UserInfo info ;
    160                final int len = vals.length ;   // ｼｽﾃﾑID ** を含む。
    161        //      if( len >= 1 && vals[0].length >= 5 ) {                                                                 // 7.4.4.0 (2021/06/30) Modify
    162                if( len >= 1 && vals[0].length >= 4 ) {
    163                        // ｼｽﾃﾑIDでｿｰﾄされる。SYSTEM_ID="**"は最初に現れるので、最後を取得
    164                        info = new UserInfo(
    165                                                                userID          ,                       // userID
    166                                                                vals[len-1][1]  ,               // lang
    167                                                                vals[len-1][2]  ,               // jname
    168                                                                vals[len-1][3]  ,               // roles
    169        //                                                      vals[len-1][4]  ,               // droles // 4.4.0.0 (2009/08/02) 7.4.4.0 (2021/06/30) Delete
    170                                                                SYSTEM_ID               ,               // systemId
    171                                                                ipAddress               ,               // ipAddress
    172                                                                appInfo                 ) ;             // ApplicationInfo
    173                }
    174                else {
    175        //              final String errMsg = "UserInfo のデータ(USERID,LANG,NAME,ROLES,DROLES)が取得できません。"   // 7.4.4.0 (2021/06/30) Modify
    176                        final String errMsg = "UserInfo のデータ(USERID,LANG,NAME,ROLES)が取得できません。"
    177                                                + " Key [" + userID + "]"
    178                                                + " SQL [" + query + "]" ;
    179                        LogWriter.log( errMsg );
    180                        throw new HybsSystemException( errMsg );
    181                }
    182
    183                return info ;
    184        }
    185
    186        /**
    187         * UserInfoFactoryをｸﾘｱします。
    188         *
    189         * @og.rev 5.2.0.0 (2010/09/01) LDAP対応
    190         * @og.rev 8.5.2.0 (2023/07/14) 一部の機能廃止による修正(問合・ﾄﾗﾌﾞﾙ 0200010980)
    191         */
    192        public static void clear() {
    193                synchronized( LOCK ) {
    194                        dbid = StringUtil.nval(
    195                                                                        HybsSystem.sys( "RESOURCE_USER_DBID" ) ,
    196                                                                        HybsSystem.sys( "RESOURCE_DBID" )
    197                                                                ) ;
    198                        query = HybsSystem.sys( "RESOURCE_USER_SQL" );
    199                        queryRole = HybsSystem.sys( "RESOURCE_USER_ROLE_SQL" );
    200
    201//                      // 5.2.0.0 (2010/09/01) LDAP対応 8.5.2.0 (2023/07/14) Delete
    202//                      srcType                 = HybsSystem.sys( "RESOURCE_USER_SRC_TYPE" );
    203//                      ldapClm                 = StringUtil.csv2Array( HybsSystem.sys( "RESOURCE_USER_LDAP_CLM" ) );
    204//                      ldapFilter              = HybsSystem.sys( "RESOURCE_USER_LDAP_FILTER" );
    205//                      ldapRoleFilter  = HybsSystem.sys( "RESOURCE_USER_ROLE_LDAP_FILTER" );
    206
    207//                      searchScope             = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );
    208//                      initctx                 = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
    209//                      providerURL             = HybsSystem.sys( "LDAP_PROVIDER_URL" );
    210//                      entrydn                 = HybsSystem.sys( "LDAP_ENTRYDN" );
    211//                      password                = HybsSystem.sys( "LDAP_PASSWORD" );
    212//                      searchbase              = HybsSystem.sys( "LDAP_SEARCH_BASE" );
    213                }
    214        }
    215
    216        /**
    217         * DBからﾕｰｻﾞｰﾘｿｰｽの情報を取得します。
    218         *
    219         * @og.rev 5.2.0.0 (2010/09/01) 新規作成
    220         *
    221         * @param       userId  ﾕｰｻﾞｰID
    222         * @param       roles   ﾛｰﾙ
    223         * @param       appInfo DB接続情報
    224         * @return      ﾕｰｻﾞｰﾘｿｰｽ情報
    225         */
    226        private static String[][] getVals( final String userId, final String roles, final ApplicationInfo appInfo ) {
    227                String[] args;
    228                String[][] rtn;
    229
    230                if( roles == null || roles.isEmpty() ) {
    231                        args = new String[] { SYSTEM_ID,userId };
    232                        synchronized( LOCK ) {
    233                                rtn = DBUtil.dbExecute( query,args,appInfo,dbid );
    234                        }
    235                }
    236                // 4.0.0.0 (2007/10/31)
    237                else {
    238                        args = new String[] { SYSTEM_ID,userId,roles };
    239                        synchronized( LOCK ) {
    240                                rtn = DBUtil.dbExecute( queryRole,args,appInfo,dbid );
    241                        }
    242                }
    243
    244                return rtn;
    245        }
    246
    247//      /**
    248//       * LDAPからﾕｰｻﾞｰﾘｿｰｽの情報を取得します。
    249//       *
    250//       * @og.rev 5.2.0.0 (2010/09/01) 新規作成
    251//       * @og.rev 6.4.7.0 (2016/06/03) IllegalArgumentException が発生した場合に、見えるようにする。
    252//       * @og.rev 7.4.4.0 (2021/06/30) openGionV8事前準備(DataRole.java廃止)
    253//       * @og.rev 8.5.2.0 (2023/07/14) 一部の機能廃止による修正(問合・ﾄﾗﾌﾞﾙ 0200010980)
    254//       *
    255//       * @param       userId  ﾕｰｻﾞｰID
    256//       * @param       roles   ﾛｰﾙ
    257//       * @return ﾕｰｻﾞｰﾘｿｰｽ情報
    258//       */
    259//      private static String[][] getValsByLdap( final String userId, final String roles ) {
    260//              final LDAPSearch serch = new LDAPSearch();
    261//              serch.setSearchScope( searchScope ) ;
    262//              serch.setInitctx( initctx ) ;
    263//              serch.setProviderURL( providerURL ) ;
    264//              serch.setSearchbase( searchbase ) ;
    265//              if( entrydn != null  ) { serch.setEntrydn( entrydn ) ; }
    266//              if( password != null ) { serch.setPassword( password ) ; }
    267//              serch.setAttributes( ldapClm ) ;
    268//              serch.init();
    269//
    270//              // 6.4.2.1 (2016/02/05) PMD refactoring. Useless parentheses.
    271//              String filter = roles == null || roles.isEmpty() ? ldapFilter : ldapRoleFilter;
    272//              final String[] args = roles == null || roles.isEmpty() ? new String[] { SYSTEM_ID,userId } : new String[] { SYSTEM_ID,userId,roles };
    273//
    274//              // 6.4.7.0 (2016/06/03) IllegalArgumentException が発生した場合に、見えるようにする。
    275//              try {
    276//                      filter = MessageFormat.format( filter,(Object[])args );
    277//              }
    278//              catch( final IllegalArgumentException ex ) {
    279//                      final String errMsg = "MessageFormatエラー:"
    280//                                              + " Pattern [" + filter + "]"
    281//                                              + " Arguments [" + Arrays.toString( (Object[])args ) + "]" ;
    282//                      throw new HybsSystemException( errMsg,ex );
    283//              }
    284//
    285//              final List<String[]> list = serch.search( filter );
    286//
    287//              String[][] rtn = null;
    288//              if( !list.isEmpty() ) {                 // 6.1.1.0 (2015/01/17) refactoring
    289//                      rtn = new String[1][];
    290//                      rtn[0] = list.get( 0 );
    291//                      rtn[0][1] = StringUtil.nval( rtn[0][1], "ja" );                 // 言語のﾃﾞﾌｫﾙﾄ値は、'ja'
    292//                      rtn[0][2] = StringUtil.nval( rtn[0][2], rtn[0][0] );    // 名称のﾃﾞﾌｫﾙﾄ値は、ﾕｰｻﾞｰID
    293//                      rtn[0][3] = StringUtil.nval( rtn[0][3], ldapClm[3] );   // ﾛｰﾙｽﾞの初期値は、ﾛｰﾙに設定された項目名
    294//      //              rtn[0][4] = StringUtil.nval( rtn[0][4], "" );                   // 7.4.4.0 (2021/06/30) Delete
    295//              }
    296//
    297//              return rtn;
    298//      }
    299}