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     */
016    package org.opengion.hayabusa.resource;
017    
018    import java.util.HashMap;
019    import java.util.Locale;
020    import java.util.Map;
021    
022    import org.opengion.fukurou.db.DBUtil;
023    import org.opengion.fukurou.util.ApplicationInfo;
024    import org.opengion.fukurou.util.StringUtil;
025    import org.opengion.hayabusa.common.HybsSystem;
026    
027    /**
028     * ãƒ??タロールã¯ã€ãƒ‡ãƒ¼ã‚¿ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’管ç?™ã‚‹ã‚¯ãƒ©ã‚¹ã§ã™ã?
029     *
030     * ãƒ??タロールæƒ??ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ­ãƒ¼ãƒ«ãƒžã‚¹ã‚¿(GEA06)ã§ç®¡ç?•れã¾ã™ã?
031     *
032     * ã‚るユーザーã®ãƒ??タロールæƒ??ã«å¯¾ã—ã¦ã²ã‚‚ã¤ãデータロールマスタã®
033     * カラãƒ??æ¡ä»¶å€¤ã€æ¡ä»¶å¼ã?ä¸?¦§ã«å¯¾ã—ã¦ã€ã‚«ãƒ©ãƒ?˜ä½ã«æ¡ä»¶å¼ã‚’構築ã—ã¾ã™ã?
034     *
035     * ã“ã?クラスã§ã¯ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä½œæ?時ã«ãƒ??タロールマスタã®DBを直接検索ã—ã¦ã?¾ã™ã?
036     * ã“ã?ãŸã‚ã€ãƒ‡ãƒ¼ã‚¿å¤‰æ›´æ™‚ã?変更å†?®¹ã‚’次回ログイン時ã‹ã‚‰åæ˜?•ã›ã‚‹ãŸã‚ã€?
037     * 自身ã®ã‚ªãƒ–ジェクトキャãƒ?‚·ãƒ¥ã¯ä¿æŒã—ã¦ã?¾ã›ã‚“ã€?
038     *
039     * ã¾ãŸã?å?¡ä»¶å¼ã«ã¤ã?¦ã€?ã¤ã®ã‚«ãƒ©ãƒ?«å¯¾ã—ã¦è¤?•°ã®æ¡ä»¶å¼ãŒé©ç”¨ã•れるå?åˆã?
040     * æ¡ä»¶å¼ãŒ"="ã¾ãŸã?"LIKE"ã?‘ã®å ´åˆã?ã€?OR"çµåˆã•れã¾ã™ã?
041     * "!="åŠã?"NOT LIKE"æ¡ä»¶ã?ã¤ã§ã‚‚å«ã¾ã‚Œã‚‹å ´åˆã?ã€?AND"çµåˆã•れã¾ã™ã?
042     *
043     * ãƒ??タロールãŒNULLã®å ´åˆã?å…¨ãƒ??ã‚¿ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã¨ãªã‚Šã?æ¡ä»¶å¼ã¨ã—ã¦ã¯ã€?
044     *  "LIKE '%'" ãŒä»˜åŠ ã•れã¾ã™ã?
045     * ã¾ãŸã?'--'ã®å ´åˆã?å…¨ãƒ??ã‚¿ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒä¸å¯èƒ½ã¨ãªã‚Šã?æ¡ä»¶å¼ã¨ã—ã¦ã¯ã€?
046     *  "NOT LIKE '%'" ãŒä»˜åŠ ã•れã¾ã™ã?
047     * ユーザーã®ãƒ??ã‚¿ãƒ­ãƒ¼ãƒ«ãŒæŒ‡å®šã•れã¦ã?‚‹ã«ã‚‚é–¢ã‚らãšã?ãƒ??ã‚¿ãƒ­ãƒ¼ãƒ«ã®æ¤œç´¢ãŒã§ããªã?
048     * å ´åˆã?ã€å?ç¦æ­¢ã«ãªã‚Šã¾ã™ã?
049     *
050     * 検索æ¡ä»¶ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ†ãƒ¼ãƒ–ルååˆã¯ã€ãƒ†ãƒ¼ãƒ–ルåã?別åãŒæŒ?®šã•れãŸå ´åˆã?
051     * æ¡ä»¶ã®å–å¾—ã™ã‚‹éš›ã«ã¯ã€ãƒ†ãƒ¼ãƒ–ルåã?無視ã•れã¾ã™ãŒã€è¿”ã•れるæ¡ä»¶ã«ã¯ã€ãƒ†ãƒ¼ãƒ–ルå?
052     * ã¯ä»˜åŠ ã•れãŸçŠ¶æ…‹ã«ãªã‚Šã¾ã™ã?
053     *
054     * ä¾?
055     *  ABC(=)              BCD(=)          �(CLM = 'ABC' or CLM = 'BCD' )
056     *  ABC(=)              BCD(LIKE)       �(CLM = 'ABC' or CLM like 'BCD%' )
057     *  ABC(=)              BCD(!=)         �(CLM = 'ABC' and CLM != 'BCD' )
058     *  ABC(LIKE)   BCD(LIKE)       �(CLM like 'ABC%' or CLM like 'BCD%' )
059     *  ABC(LIKE)   BCD(!=)         �(CLM like 'ABC%' and CLM != 'BCD' )
060     *  ABC(LIKE)   BCD(!=)         �(CLM != 'ABC' and CLM != 'BCD' )
061     *  ABC(=)              BCD(=)          â‡?(A.CLM = 'ABC' or A.CLM = 'BCD' ) ※ {@SEC.A.CLM}ã§ã‚¢ã‚¯ã‚»ã‚¹
062     *
063     * @og.rev 4.4.0.0 (2009/08/02) æ–°è¦ä½œæ?
064     * @og.group リソース管ç?
065     *
066     * @version  4.0
067     * @author   Hiroki Nakamura
068     * @since    JDK5.0,
069     */
070    public final class DataRole {
071            private static final String QUERY_GEA06_SELECT
072                                            = "select CLM, CVALUE, VALCDTN from GEA06"
073                                                    + " where SYSTEM_ID = ? and DROLE = ? and FGJ = '1'";
074    
075            private static final int IDX_CLM        = 0;
076            private static final int IDX_CVALUE     = 1;
077            private static final int IDX_VALCDTN= 2;
078    
079            private static final DataRole FULL_ACCESS_DATAROLE_OBJ = new DataRole( true ) ;
080            private static final DataRole FULL_DENY_DATAROLE_OBJ = new DataRole( false ) ;
081    
082            private static final String FULL_ACCESS_CONDITION = null ;
083            private static final String FULL_DENY_CONDITION = " NOT LIKE '%'" ;
084            private static final String FULL_DENY_DROLES_KEY = "--";
085    
086            private final Map<String,String> cdtnMap = new HashMap<String,String>( HybsSystem.BUFFER_SMALL );
087    
088            private final String                    droles ;                // �?タロールズ
089            private final String                    systemId ;              // シスãƒ?ƒ ID
090            private final ApplicationInfo   appInfo ;
091            private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );          // 5.5.5.1 (2012/08/07) リソース系DBID 付ã‘忘れ対å¿?
092    
093            private boolean         isFullAcess             = false;
094            private boolean         isFullDeny              = false;
095    
096            /**
097             * 固定データロール(å…¨ã‚¢ã‚¯ã‚»ã‚¹å¯ or 全アクセスä¸å¯)ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’生æˆã—ã¾ã™ã?
098             *
099             * @param isFull true:å…¨ã‚¢ã‚¯ã‚»ã‚¹å¯ false:全アクセスä¸å¯
100             */
101            private DataRole( final boolean isFull ) {
102                    droles = null;
103                    systemId = null;
104                    appInfo = null;
105    
106                    if( isFull )    { isFullAcess = true; }
107                    else                    { isFullDeny = true; }
108            }
109    
110            /**
111             * ロールæ–?­—å?ã‹ã‚‰ã€ãƒ‡ãƒ¼ã‚¿ãƒ­ãƒ¼ãƒ«ãƒžã‚¹ã‚¿(GEA05)を検索ã—ã?カラãƒ?˜ä½ã?
112             * æ¡ä»¶å¼ã‚’生æ?ã—ã¾ã™ã?
113             *
114             * @param droles "|"ã§åŒºåˆ?‚‰ã‚ŒãŸ ãƒ??タロールæ–?­—å?
115             * @param systemId シスãƒ?ƒ ID
116             * @param appInfo 接続情報
117             */
118            private DataRole( final String droles,final String systemId, final ApplicationInfo appInfo ) {
119                    this.droles = droles ;          // �?タロールズ
120                    this.systemId = systemId;       // シスãƒ?ƒ ID
121                    this.appInfo = appInfo ;
122    
123                    if( appInfo != null ) {
124                            appInfo.setModuleInfo( "DataRole",null,"CreateInstance" );
125                    }
126    
127                    String[] drole = StringUtil.csv2Array( droles, '|' );
128                    if( drole == null || drole.length == 0 ) {
129                            isFullAcess = true;
130                            return;
131                    }
132                    else {
133                            makeConditionMap( drole );
134                    }
135            }
136    
137            /**
138             * ロールæ–?­—å?ã‹ã‚‰ã€ãƒ‡ãƒ¼ã‚¿ãƒ­ãƒ¼ãƒ«ãƒžã‚¹ã‚¿(GEA05)を検索ã—ã?カラãƒ?˜ä½ã?
139             * æ¡ä»¶å¼ã‚’生æ?ã—ã¾ã™ã?
140             *
141             * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付ã‘忘れ対ç­?
142             *
143             * @param drole ãƒ??タロールæ–?­—å?ã®é…å?
144             */
145            private void makeConditionMap( final String[] drole ) {
146    //              String[][] vals = null;
147                    String clm = null;
148                    String cvalue =null;
149                    String valcdtn = null;
150                    for( int i=0; i<drole.length; i++ ) {
151                            String[] args = new String[] { systemId, drole[i] };
152    //                      String[][] vals = DBUtil.dbExecute( QUERY_GEA06_SELECT,args,appInfo );
153                            String[][] vals = DBUtil.dbExecute( QUERY_GEA06_SELECT,args,appInfo, DBID );    // 5.5.5.1 (2012/08/07)
154                            for( int j=0; j<vals.length; j++ ) {
155                                    clm = vals[j][IDX_CLM];
156                                    cvalue = vals[j][IDX_CVALUE];
157                                    valcdtn = vals[j][IDX_VALCDTN];
158    
159                                    String cdtn = cdtnMap.get( clm );
160                                    if( cdtn == null ) { cdtn = ""; }
161                                    else if( "=".equals( valcdtn ) || "LIKE".equalsIgnoreCase( valcdtn ) ) {
162                                            cdtn += " or ";
163                                    }
164                                    else {
165                                            cdtn += " and ";
166                                    }
167                                    cdtn += clm + " " + valcdtn + " '" + cvalue;
168                                    if( valcdtn.toUpperCase( Locale.JAPAN ).indexOf( "LIKE" ) >= 0 ) {
169                                            cdtn += "%";
170                                    }
171                                    cdtn += "'";
172    
173                                    if( cdtn.indexOf( " and " ) >= 0 ) { cdtn = cdtn.replace( " or ", "and" ); }
174    
175                                    cdtnMap.put( clm, cdtn );
176                            }
177                    }
178            }
179    
180            /**
181             * ロールæ–?­—å?ã‹ã‚‰ã€ãƒ‡ãƒ¼ã‚¿ãƒ­ãƒ¼ãƒ«ãƒžã‚¹ã‚¿(GEA05)を検索ã—ã?カラãƒ?˜ä½ã?
182             * æ¡ä»¶å¼ã‚’生æ?ã—ã¾ã™ã?
183             *
184             * @param       droles  "|"ã§åŒºåˆ?‚‰ã‚ŒãŸ ãƒ??タロールæ–?­—å?
185             * @param systemId シスãƒ?ƒ ID
186             * @param appInfo 接続情報
187             *
188             * @return �?タロールオブジェク�
189             */
190            public static DataRole newInstance( final String droles, final String systemId, final ApplicationInfo appInfo ) {
191                    if( droles == null || droles.length() == 0 ) {
192                            return FULL_ACCESS_DATAROLE_OBJ;
193                    }
194                    else if( FULL_DENY_DROLES_KEY.equals( droles ) ) {
195                            return FULL_DENY_DATAROLE_OBJ;
196                    }
197    
198    //              DataRole dataRole = new DataRole( droles, systemId, appInfo );
199    //              return dataRole;
200                    return new DataRole( droles, systemId, appInfo );
201            }
202    
203            /**
204             * ロールズを返ã—ã¾ã™ã?
205             *
206             * @return ロールズæ–?­—å?
207             */
208            public String getDataRoles() { return droles; }
209    
210            /**
211             * ロールズを返ã—ã¾ã™ã?
212             *
213             * @og.rev 4.4.0.1 (2009/08/08) ãƒ??ブルIDãŒä»˜åŠ ã•れã¦ã?‚‹å ´åˆã?æ¡ä»¶ã‚’追åŠ?
214             *
215             * @param clm カラ�
216             *
217             * @return ロールズæ–?­—å?
218             */
219            public String getCondition( final String clm ) {
220                    if( isFullAcess ) { return FULL_ACCESS_CONDITION; }
221                    if( isFullDeny ) { return "(" + clm + FULL_DENY_CONDITION + ")"; }
222    
223                    String rtn = null;
224                    if( clm.indexOf( '.' ) >= 0 ) {
225                            String clmTmp = clm.substring( clm.lastIndexOf( '.' ) + 1 );
226                            rtn = cdtnMap.get( clmTmp );
227                            if( rtn == null || rtn.length() == 0 ) {
228                                    return "(" + clm + FULL_DENY_CONDITION + ")";
229                            }
230                            return "(" + rtn.replace( clmTmp, clm ) + ")";
231                    }
232                    else {
233                            rtn = cdtnMap.get( clm );
234                            if( rtn == null || rtn.length() == 0 ) {
235                                    return "(" + clm + FULL_DENY_CONDITION + ")";
236                            }
237                            return "(" + rtn + ")";
238                    }
239            }
240    
241            /** オブジェクトã?識別å­ã¨ã—ã¦?Œè©³ç´°ãªãƒ¦ãƒ¼ã‚¶ãƒ¼æƒ??ã‚’è¿”ã—ã¾ã™ã?
242             *
243             * @return  詳細ãªç”»é¢æƒ??
244             */
245            @Override
246            public String toString() {
247                    StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
248                    rtn.append( "droles  : " ).append( droles ).append( HybsSystem.CR );
249                    return rtn.toString();
250            }
251    }