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 }