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 org.opengion.hayabusa.common.HybsSystem; 019 import org.opengion.hayabusa.common.HybsSystemException; 020 import org.opengion.fukurou.util.StringUtil; 021 022 import java.util.Map; 023 import java.util.WeakHashMap ; 024 import java.util.Collections ; 025 026 /** 027 * ロールモード?、画面オブジェクトやカラ?ブジェクト?ロール-モード制御の??? 028 * 管?るクラスです? 029 * ROLES ??は、AAA|BBB|CCC と 『|』で区?れた?のロールを持って?す? 030 * 通常、ユーザーロールは画面?ラ???ブジェクトに対してロール制御可能です? 031 * ログインユーザーは、???身のロールを?画面?ラ?持って?かを判定します? 032 * 画面に関しては、従来の?ォルトアクセスがなくなり?ロールを登録する場合?? 033 * ? ユーザーロールとの比?行われます?画面ロールを登録しな??合?、アクセス 034 * 可能と判断されます?つまり?画面の場合?、なにも設定しなければ、アクセス可能と 035 * 判断されます? 036 * カラ?ールも同様に、何も設定しなければフルアクセスできます?通常、ほとんどの 037 * ケースでカラ?ールが使われることはありません? 038 * RWMODE ??は、各ロールに対して?つの?で表して?す? 039 * ??-" メニュー非表示 "m" メニュー表示 "p" メニュー表示(強制プル?ン表示) 040 * ??-" アクセス拒否 "r" 読取許可 "w" 読取?書込許可 041 * ??-" 未対? "d" ファイル出? "u" ファイル入? "f" ファイル入出? "o" 表示???み可 "e" 画面編? 042 * 互換性の関係より?"" は?e" と同等とします? 043 * 044 * こ???目を?次つな??--","-r","-w","mr","mw" などの設定を行います? 045 * モードが設定されて?場合?、?通モードとして、すべてのロールに同じモードを 046 * 割り当てます?個別に割り当てる?合?、ROLES ??の後ろに () 付きで追記します? 047 * 例えば、AAA|BBB(-r)|CCC とすれば、BBB ロールの場合?、読取専用になります? 048 * ロールを?つける場合?、AND 演算になります? 049 * 過去(Ver3)のモードとの互換性をとる?合?"rw" は "mw" へ?r-" は"mr" へ変換 050 * してください? 051 * 052 * @og.rev 4.0.0.0 (2004/01/31) 新規作? 053 * @og.rev 4.3.3.0 (2008/10/01) pモード追? 054 * @og.group リソース管? 055 * 056 * @version 4.0 057 * @author Kazuhiko Hasegawa 058 * @since JDK5.0, 059 */ 060 public final class RoleMode { 061 private static final Map<String,RoleMode> roleMap 062 = Collections.synchronizedMap( 063 new WeakHashMap<String,RoleMode>( HybsSystem.BUFFER_SMALL ) 064 ); 065 066 // 4.0.0 (2005/01/31) param属?追? 067 // 4.3.3.0 (2008/10/01) pを追?るため?ビット表現を拡張 068 // public static final byte FULL_MODE = (byte)0x1f; // mwf = 11111 = 0x1f 069 // public static final byte M_MODE = (byte)0x10; // m-- = 10000 = 0x10 070 // public static final byte R_MODE = (byte)0x04; // -r- = 00100 = 0x04 071 // public static final byte W_MODE = (byte)0x0C; // -w- = 01100 = 0x0C 072 // public static final byte D_MODE = (byte)0x01; // --d = 00001 = 0x01 073 // public static final byte U_MODE = (byte)0x02; // --u = 00010 = 0x02 074 // public static final byte F_MODE = (byte)0x03; // --f = 00011 = 0x03 075 076 // /** MODE 定義 ( mwf ) */ 077 // public static final byte FULL_MODE = (byte)0x3f; // mwf = 111111 = 0x3f 078 // /** MODE 定義 ( m-- ) */ 079 // public static final byte M_MODE = (byte)0x30; // m-- = 110000 = 0x30 080 // /** MODE 定義 ( p-- ) */ 081 // public static final byte P_MODE = (byte)0x10; // p-- = 010000 = 0x10 082 // /** MODE 定義 ( -r- ) */ 083 // public static final byte R_MODE = (byte)0x04; // -r- = 000100 = 0x04 084 // /** MODE 定義 ( -w- ) */ 085 // public static final byte W_MODE = (byte)0x0C; // -w- = 001100 = 0x0C 086 // /** MODE 定義 ( --d ) */ 087 // public static final byte D_MODE = (byte)0x01; // --d = 000001 = 0x01 088 // /** MODE 定義 ( --u ) */ 089 // public static final byte U_MODE = (byte)0x02; // --u = 000010 = 0x02 090 // /** MODE 定義 ( --f ) */ 091 // public static final byte F_MODE = (byte)0x03; // --f = 000011 = 0x03 092 // 093 // public static final String DEFAULT_MODE = "mwf"; 094 095 // 5.4.2.0 (2011/12/01) eを追?るため?ビット表現を拡張 096 // /** MODE 定義 ( mwf ) */ 097 // public static final byte FULL_MODE = (byte)0x3f; // mwe = 1111111 = 0x7f 098 // /** MODE 定義 ( m-- ) */ 099 // public static final byte M_MODE = (byte)0x60; // m-- = 1100000 = 0x60 100 // /** MODE 定義 ( p-- ) */ 101 // public static final byte P_MODE = (byte)0x20; // p-- = 0100000 = 0x20 102 // /** MODE 定義 ( -r- ) */ 103 // public static final byte R_MODE = (byte)0x08; // -r- = 0001000 = 0x08 104 // /** MODE 定義 ( -w- ) */ 105 // public static final byte W_MODE = (byte)0x18; // -w- = 0011000 = 0x18 106 // /** MODE 定義 ( --d ) */ 107 // public static final byte D_MODE = (byte)0x02; // --d = 0000010 = 0x02 108 // /** MODE 定義 ( --u ) */ 109 // public static final byte U_MODE = (byte)0x04; // --u = 0000100 = 0x04 110 // /** MODE 定義 ( --f ) */ 111 // public static final byte F_MODE = (byte)0x06; // --f = 0000110 = 0x06 112 // /** MODE 定義 ( --f ) */ 113 // public static final byte E_MODE = (byte)0x07; // --e = 0000111 = 0x07 114 115 116 // 5.5.5.2 (2012/08/10) oを追?るため?ビット表現を拡張 117 /** MODE 定義 ( mwf ) */ 118 public static final byte FULL_MODE = (byte)0x7f; // mwe = 01111111 = 0x7f 119 /** MODE 定義 ( m-- ) */ 120 public static final byte M_MODE = (byte)0xc0; // m-- = 11000000 = 0xc0 121 /** MODE 定義 ( p-- ) */ 122 public static final byte P_MODE = (byte)0x40; // p-- = 01000000 = 0x40 123 /** MODE 定義 ( -r- ) */ 124 public static final byte R_MODE = (byte)0x10; // -r- = 00010000 = 0x10 125 /** MODE 定義 ( -w- ) */ 126 public static final byte W_MODE = (byte)0x30; // -w- = 00110000 = 0x30 127 /** MODE 定義 ( --d ) */ 128 public static final byte D_MODE = (byte)0x04; // --d = 00000100 = 0x04 129 /** MODE 定義 ( --u ) */ 130 public static final byte U_MODE = (byte)0x08; // --u = 00001000 = 0x08 131 /** MODE 定義 ( --f ) */ 132 public static final byte F_MODE = (byte)0x0c; // --f = 00001100 = 0x0c 133 /** MODE 定義 ( --o ) */ 134 public static final byte O_MODE = (byte)0x0e; // --o = 00001110 = 0x0e 135 /** MODE 定義 ( --e ) */ 136 public static final byte E_MODE = (byte)0x0f; // --e = 00001111 = 0x0f 137 138 139 public static final String DEFAULT_MODE = "mwe"; 140 141 private final String roles ; // ロールズ 142 private final String rwmode ; // モー? 143 private final String[] roleArray ; // ロール配? 144 private final byte[] bitModes ; // モード?ビット版(-:00,p:01,m:11 , -:00,r:01,w:11 , -:00,o:01,i:10,f:11) 145 // private final byte comBitMode ; 146 private final boolean fullAccessFlag; // フルアクセス許可時?フラグ 147 // private final boolean oneModeFlag; // ?つのモードですべてのロールを表現する場?true 148 149 private static final RoleMode FULL_ACCESS_ROLE_MODE_OBJ = new RoleMode() ; 150 151 /** 152 * フルアクセスの RoleMode を構築します? 153 * ?からのみ構築できるように private コンストラクタにしておきます? 154 * 155 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 156 */ 157 private RoleMode() { 158 roles = "FullAccess"; 159 rwmode = DEFAULT_MODE; 160 roleArray = null; 161 bitModes = new byte[] { FULL_MODE }; // mwf = 1111111 = 0x7f 162 // comBitMode = FULL_MODE; 163 fullAccessFlag = true; 164 // oneModeFlag = true; 165 } 166 167 /** 168 * ロールとモードを?、RoleModeオブジェクトを構築します? 169 * こ?コンストラクタは、他?パッケージから呼び出せな??? 170 * パッケージプライベ?トにしておきます? 171 * 172 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 173 * 174 * @param roles "|"で区?れた ロール?? 175 * @param mode "|"で区?れ?ロール??と対応付けられたモード文字?。唯??場合?共通モードになる? 176 */ 177 private RoleMode( final String roles,final String mode ) { 178 this.roles = roles ; // ロールズ 179 this.rwmode = mode ; // モー? 180 181 // if( rwmode == null || ( rwmode.length() < 2 ) ) { 182 // String errMsg = "RWMODE の桁数は?桁以上?です?" 183 // + " roles [" + roles + "] Mode [" + rwmode + "]" 184 // + HybsSystem.CR + toString() ; 185 // throw new HybsSystemException( errMsg ); 186 // } 187 188 // roleArray = StringUtil.csv2Array( roles,HybsSystem.GUI_DELIMITER ) ; // ロール配? 189 190 // roles="root" また?、roleArray がな??合?、フルアクセス 191 // fullAccessFlag = "root".equals( roles ) || ( roleArray.length == 0 ); 192 fullAccessFlag = "root".equals( roles ) || ( roles == null ) || ( roles.length() == 0 ); 193 194 // modes が??の場合?、ワンモー? 195 // String[] modes = StringUtil.csv2Array( mode,HybsSystem.GUI_DELIMITER ) ; // モー? 196 // oneModeFlag = ( modes.length == 1 ); 197 198 roleArray = StringUtil.csv2Array( roles,HybsSystem.GUI_DELIMITER ) ; // ロール配? 199 200 // bitModes を求めます??1つは作?します?同時に、roleArray もセ?します? 201 // bitModes = makeBitMode( modes ); 202 bitModes = makeBitMode( roleArray,rwmode ); 203 } 204 205 /** 206 * ロールとモードを?、RoleModeオブジェクトを構築します? 207 * 条件が同?RoleModeオブジェク?があれ?、キャ?ュから返します? 208 * キャ?ュになければ、新規に作?します? 209 * こ?キャ?ュは、完?な?キャ?ュなので、いつクリアされるか保障がありません? 210 * 211 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 212 * 213 * @param roles "|"で区?れた ロール?? 214 * 215 * @return RoleModeオブジェク? 216 */ 217 public static RoleMode newInstance( final String roles ) { 218 if( roles == null || roles.length() == 0 ) { 219 return FULL_ACCESS_ROLE_MODE_OBJ; 220 } 221 222 return newInstance( roles,DEFAULT_MODE ); 223 } 224 225 /** 226 * ロールとモードを?、RoleModeオブジェクトを構築します? 227 * 条件が同?RoleModeオブジェク?があれ?、キャ?ュから返します? 228 * キャ?ュになければ、新規に作?します? 229 * こ?キャ?ュは、完?な?キャ?ュなので、いつクリアされるか保障がありません? 230 * 231 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 232 * 233 * @param roles "|"で区?れた ロール?? 234 * @param mode "|"で区?れ?ロール??と対応付けられたモード文字?。唯??場合?共通モードになる? 235 * 236 * @return RoleModeオブジェク? 237 */ 238 public static RoleMode newInstance( final String roles,final String mode ) { 239 if( mode == null || mode.length() < 2 ) { 240 String errMsg = "RWMODE の桁数は?桁以上?です?" 241 + " roles [" + roles + "] mode [" + mode + "]" 242 + HybsSystem.CR; 243 throw new HybsSystemException( errMsg ); 244 } 245 246 if( ( roles == null || roles.length() == 0 ) && 247 ( "mw".equals( mode ) || DEFAULT_MODE.equals( mode ) ) ) { 248 return FULL_ACCESS_ROLE_MODE_OBJ ; 249 } 250 251 String key = roles + mode ; 252 RoleMode roleMode = roleMap.get( key ); 253 if( roleMode == null ) { 254 roleMode = new RoleMode( roles,mode ); 255 roleMap.put( key,roleMode ); 256 } 257 258 return roleMode; 259 } 260 261 /** 262 * フルアクセスできるRoleModeオブジェクトを返します? 263 * これは、カラ?ブジェクトなど、ほとんどのケースでフルアクセスできる場合に? 264 * 同じオブジェクトを常に返すようにすることで、メモリの??以降?処??共通化? 265 * 図る為の機?です?シングルトン対応?NULLオブジェクトパターンに近いです? 266 * 267 * @return RoleMode フルアクセスできるRoleModeオブジェク? 268 */ 269 // static RoleMode getFullAccessRoleMode() { 270 // return FULL_ACCESS_ROLE_MODE_OBJ ; 271 // } 272 273 /** 274 * ロールズを返します? 275 * 276 * @return ロールズ?? 277 */ 278 public String getRoles() { return roles; } 279 280 /** 281 * モード?列を返します? 282 * 283 * @return モード?? 284 */ 285 public String getMode() { return rwmode; } 286 287 /** 288 * ユーザーロール配?と比?てアクセス可否を返します? 289 * 290 * @param userRoles ユーザーロール配? 291 * 292 * @return アクセスできる(true)/出来な?false) 293 */ 294 // public boolean isAccess( final String[] userRoles ) { 295 // if( fullAccessFlag ) { return ( bitModes[0] > 0 ); } 296 // 297 // // ユーザーロールが無??合?、アクセス不許可 298 // if( userRoles == null || userRoles.length == 0 ) { 299 // return false; 300 // } 301 // 302 // for( int g=0; g<roleArray.length; g++ ) { 303 //// byte bit = ( oneModeFlag ) ? bitModes[0] : bitModes[g] ; 304 // byte bit = bitModes[g] ; 305 // for( int u=0; u<userRoles.length; u++ ) { 306 // // 4.0.0.0 (2007/11/29) 入れ子if の統? 307 // if( bit > 0 && roleArray[g].equalsIgnoreCase( userRoles[u] ) ) { 308 // return true; 309 // } 310 // } 311 // } 312 // return false; 313 // } 314 315 /** 316 * ??ユーザーロールに対する?的なアクセス条件を取得します? 317 * アクセス条件は、?あるユーザーロールの中で、最大のアクセス条件を算?します? 318 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) の?つのロール/モードが設定されて?場合? 319 * ユーザーが?AAA ?の場合??r ですが、AAA|BBB を持って?場合??w になります? 320 * さらに、BBB|CCC と持って?場合??-w:書き込み許可)と(mr:メニューから読取許可)の 321 * 権限により、mw:メニューからの書き込み許可が与えられます? 322 * モード指定がある場合?、AND演算になります? 323 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) と BBB|CCC(-r) の場合?(-r)+(-w)+(mr)*(-r)=-w に 324 * なります?ロールは、OR ですが、モード?、同?ールでのAND になります? 325 * 実際には、メニュー表示の可否は、???ア??系によく用?れます?で、上記?ような 326 * 許可が実際にあるかど?は不?ですが、すべてのモード?OR条件での結合になります? 327 * 328 * @param userRoles ユーザーロール配? 329 * @param isRoot ルートロールフラグ 330 * 331 * @return ビットモード??"--:000","-r:001","-w:010","mr:101","mw:110" に対応した数?0,1,2,5,6) 332 */ 333 // public byte getAccessBitMode( final String[] userRoles,final boolean isRoot ) { 334 // if( fullAccessFlag ) { return bitModes[0]; } 335 // 336 // byte bitMode = 0; 337 // for( int g=0; g<roleArray.length; g++ ) { 338 //// byte bit = ( oneModeFlag ) ? bitModes[0] : bitModes[g] ; 339 // byte bit = bitModes[g] ; 340 // if( isRoot ) { 341 // bitMode |= bit; 342 // } 343 // else { 344 // String role = roleArray[g]; 345 // for( int u=0; u<userRoles.length; u++ ) { 346 // if( role.equalsIgnoreCase( userRoles[u] ) ) { 347 // bitMode |= bit; 348 // break; // ??すれば、?側のループを抜ける? 349 // } 350 // } 351 // } 352 // if( bitMode >= 6 ) { break; } // "mw:110" は?なので、以後判定不要? 353 // } 354 // 355 // return bitMode; 356 // } 357 358 /** 359 * ??ユーザーロールに対する?的なアクセス条件を取得します? 360 * アクセス条件は、?あるユーザーロールの中で、最大のアクセス条件を算?します? 361 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) の?つのロール/モードが設定されて?場合? 362 * ユーザーが?AAA ?の場合??r ですが、AAA|BBB を持って?場合??w になります? 363 * さらに、BBB|CCC と持って?場合??-w:書き込み許可)と(mr:メニューから読取許可)の 364 * 権限により、mw:メニューからの書き込み許可が与えられます? 365 * モード指定がある場合?、AND演算になります? 366 * 例えば、AAA(-r)|BBB(-w)|CCC(mr) と BBB|CCC(-r) の場合?(-r)+(-w)+(mr)*(-r)=-w に 367 * なります?ロールは、OR ですが、モード?、同?ールでのAND になります? 368 * 実際には、メニュー表示の可否は、???ア??系によく用?れます?で、上記?ような 369 * 許可が実際にあるかど?は不?ですが、すべてのモード?OR条件での結合になります? 370 * 371 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 372 * 373 * @param other ロールモー? 374 * 375 * @return アクセスビッ? 376 */ 377 public byte getAccessBitMode( final RoleMode other ) { 378 if( fullAccessFlag || other.fullAccessFlag ) { 379 return (byte)(bitModes[0] & other.bitModes[0]) ; 380 } 381 382 String[] othRoleArray = other.roleArray ; // ロール配? 383 byte[] othBitModes = other.bitModes ; // モード?ビッ? 384 385 byte bitMode = 0; 386 for( int i=0; i<roleArray.length; i++ ) { 387 for( int j=0; j<othRoleArray.length; j++ ) { 388 if( roleArray[i].equals( othRoleArray[j] ) ) { 389 bitMode |= (byte)(bitModes[i] & othBitModes[j]) ; 390 if( bitMode == FULL_MODE ) { return FULL_MODE; } // 途中打ち? 391 } 392 } 393 } 394 395 return bitMode; 396 } 397 398 /** 399 * ビットロールのメニュアクセス可否を返します? 400 * 401 * M_MODE = (byte)0x10; // m-- = 10000 = 0x10 402 * 403 * @param bitMode ビットロール 404 * 405 * @return アクセスできる(true)/出来な?false) 406 */ 407 public static boolean isMenu( final byte bitMode ) { 408 return ( (bitMode & M_MODE) > 0 ); 409 } 410 411 /** 412 * ビットロールのプル?ン化を返します? 413 * 414 * P_MODE = (byte)0x10; // p-- = 010000 = 0x10 415 * 416 * @og.rev 4.3.3.0 (2008/10/01) メソ?追? 417 * @param bitMode ビットロール 418 * 419 * @return true:プル?ン? 420 */ 421 public static boolean isPulldown( final byte bitMode ) { 422 // M_MODEとの比?P_MODEの場合?強制プル?ン? 423 return ( (bitMode & M_MODE) == P_MODE ); 424 } 425 426 /** 427 * ビットロールの読込アクセス可否を返します? 428 * 429 * R_MODE = (byte)0x04; // -r- = 00100 = 0x04 430 * 431 * @param bitMode ビットロール 432 * 433 * @return アクセスできる(true)/出来な?false) 434 */ 435 public static boolean isRead( final byte bitMode ) { 436 return ( (bitMode & R_MODE) > 0 ); 437 } 438 439 /** 440 * ビットロールの書込アクセス可否を返します? 441 * 442 * これは、読込、書込みの判断ではなく?書込みができる? 443 * ど?の判断をして?す? 444 * 読込、書込みの判断は、isAccess を使用してください? 445 * 446 * @param bitMode ビットロール 447 * 448 * @return アクセスできる(true)/出来な?false) 449 */ 450 public static boolean isWrite( final byte bitMode ) { 451 // 注意:W_MODE は、R_MODE と合?されて?ので? 0 で判断できな?? 452 return ( (bitMode & W_MODE) == W_MODE ); 453 } 454 455 /** 456 * ビットロールのメニュアクセス可否を返します? 457 * 458 * これは、読込、書込みの判断です? 459 * W_MODE = (byte)0x0C; // -w- = 01100 = 0x0C 460 * 461 * @param bitMode ビットロール 462 * 463 * @return アクセスできる(true)/出来な?false) 464 */ 465 public static boolean isAccess( final byte bitMode ) { 466 return ( (bitMode & W_MODE) > 0 ); 467 } 468 469 /** 470 * ビットロールのファイルアクセス可否を返します? 471 * 472 * D_MODE = (byte)0x01; // --d = 00001 = 0x01 473 * 474 * @param bitMode ビットロール 475 * 476 * @return アクセスできる(true)/出来な?false) 477 */ 478 public static boolean isDownload( final byte bitMode ) { 479 return ( (bitMode & D_MODE) > 0 ); 480 } 481 482 /** 483 * ビットロールのファイルアクセス可否を返します? 484 * 485 * U_MODE = (byte)0x02; // --u = 00010 = 0x02 486 * 487 * @param bitMode ビットロール 488 * 489 * @return アクセスできる(true)/出来な?false) 490 */ 491 public static boolean isUpload( final byte bitMode ) { 492 return ( (bitMode & U_MODE) > 0 ); 493 } 494 495 /** 496 * ビットロールの画面編?否を返します? 497 * 498 * O_MODE = (byte)0x0e; // --o = 00001110 = 0x0e 499 * E_MODE = (byte)0x0f; // --e = 00001111 = 0x0f 500 * Oモード以上であれば画面編? 501 * 502 * @og.rev 5.4.2.0 (2011/12/01) 新規作? 503 * @og.rev 5.5.5.2 (2012/08/10) oモード追?伴?更 504 * 505 * @param bitMode ビットロール 506 * 507 * @return アクセスできる(true)/出来な?false) 508 */ 509 public static boolean isEdit( final byte bitMode ) { 510 // return ( (bitMode & E_MODE) == E_MODE ); 511 return ( (bitMode & O_MODE) == O_MODE ); 512 } 513 514 /** 515 * ビットロールの画面編??フルコントロール可否を返します? 516 * 517 * O_MODE = (byte)0x0e; // --o = 00001110 = 0x0e 518 * E_MODE = (byte)0x0f; // --e = 00001111 = 0x0f 519 * Eモードならフルコントロール可能 520 * 521 * @og.rev 5.5.5.2 (2012/08/10) 新規作? 522 * 523 * @param bitMode ビットロール 524 * 525 * @return アクセスできる(true)/出来な?false) 526 */ 527 public static boolean isFullEdit( final byte bitMode ) { 528 // return ( (bitMode & E_MODE) == E_MODE ); 529 return ( (bitMode & E_MODE) == E_MODE ); 530 } 531 532 533 /** 534 * こ?画面のmode アクセス条件をビ?化します? 535 * アクセスモード??--","-r","-w","mr","mw" の??り持っており、ロールと同じ 536 * 区???|』で同じ?で?します? 537 * roles がな?、modes が?か?roles と modes の個数が異なる?? 538 * 唯??モー?共通モー?として、modes[0] を割り当てます? 539 * 互換性のため?rw" と "r-" も??きるようにします? 540 * アクセスモード?先?は、メニュー表示許可条件で?:0 m:1 に対応させます? 541 * ?番目は、書き込み許可で?-:00","r:01","w:10" に対応させます? 542 * つまり?"--:000","-r:001","-w:010","mr:101","mw:110" に対応した数?0,1,2,5,6)として? 543 * ?ールの?で値を返します? 544 * 545 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 546 * 547 * @param roles 画面ロール配? 548 * @param mode 画面モー? 549 * 550 * @return ビットモード??"--:000","-r:001","-w:010","mr:101","mw:110" に対応した数?0,1,2,5,6) 551 */ 552 // private byte[] makeBitMode( final String[] modes ) { 553 private byte[] makeBitMode( final String[] roles,final String mode ) { 554 byte[] bits = null; 555 556 byte commnMode = bitMode( mode ); // 共通MODEの設? 557 558 int size = roles.length ; 559 if( size == 0 ) { 560 bits = new byte[] { commnMode }; 561 } 562 else { 563 bits = new byte[size] ; 564 for( int i=0; i<size; i++ ) { 565 String roleMode = null; 566 String role = roles[i]; 567 int adrs = ( role != null ) ? role.indexOf( '(' ) : -1 ; 568 if( adrs >= 0 ) { 569 roleMode = role.substring( adrs+1,role.length() -1 ); 570 // 注意:roleArray に書き戻して?す?(副作用処? 571 roles[i] = role.substring( 0,adrs ); 572 } 573 bits[i] = (byte)(commnMode & bitMode( roleMode )) ; 574 } 575 } 576 577 return bits ; 578 } 579 580 /** 581 * モード文字?に対するビット変換を行います? 582 * RWMODE ??は?つの?で表して?す? 583 * ??-" メニュー非表示 "m" メニュー表示 584 * ??-" アクセス拒否 "r" 読取許可 "w" 読取?書込許可 585 * ??-" 未対? "d" ファイル出? "u" ファイル入? "f" ファイル入出? "e" 画面編?(フル) "o" 画面編?(並替のみ?? 586 * 互換性の関係より?"" は?e" と同等とします? 587 * それぞれのキーワードに対して、ビ?制御を行います? 588 * こ?メソ?には、ロールモー?ロール単位に追?るモー?の判定も 589 * 行う事が出来るよ?、引数?null の場合?、FULL_MODE を返します? 590 * 591 * byte FULL_MODE = (byte)0x7f; // mwf = 1111111 = 0x7f 592 * byte M_MODE = (byte)0x60; // m-- = 1100000 = 0x60 593 * byte P_MODE = (byte)0x20; // p-- = 0100000 = 0x20 594 * byte R_MODE = (byte)0x08; // -r- = 0001000 = 0x08 595 * byte W_MODE = (byte)0x18; // -w- = 0011000 = 0x18 596 * byte D_MODE = (byte)0x02; // --d = 0000010 = 0x02 597 * byte U_MODE = (byte)0x04; // --u = 0000100 = 0x04 598 * byte F_MODE = (byte)0x06; // --f = 0000110 = 0x06 599 * byte E_MODE = (byte)0x07; // --e = 0000111 = 0x07 600 * byte O_MODE = (byte)0x0e; // --o = 00001110 = 0x0e 601 * 602 * @og.rev 4.3.0.0 (2008/07/04) ロールモード?ルチ対? 603 * @og.rev 4.3.3.0 (2008/10/01) ?モード対?mと同じ扱? 604 * @og.rev 5.4.2.0 (2011/12/01) ??ード対? 605 * @og.rev 5.5.5.2 (2012/08/10) oモード対? 606 * 607 * @param mode モード文字? 608 * 609 * @return ビットモー? 610 */ 611 private byte bitMode( final String mode ) { 612 byte bit = 0x00; 613 614 if( mode == null ) { 615 bit = FULL_MODE; 616 } 617 else { 618 int len = mode.length(); 619 for( int i=0; i<len; i++ ) { 620 switch( mode.charAt(i) ) { 621 case 'm' : bit |= M_MODE; break; 622 case 'p' : bit |= P_MODE; break; // 4.3.3.0 (2008/10/01) Pモード追? 623 case 'r' : bit |= R_MODE; break; 624 case 'w' : bit |= W_MODE; break; 625 case 'd' : bit |= D_MODE; break; 626 case 'u' : bit |= U_MODE; break; 627 case 'f' : bit |= F_MODE; break; 628 case 'e' : bit |= E_MODE; break; // 5.4.2.0 (2011/12/01) Eモード追? 629 case 'o' : bit |= O_MODE; break; // 5.5.5.2 (2011/12/10) Oモード追? 630 case '-' : break; 631 default : 632 String errMsg = "RWMODE に不正な記号が使用されて?す?" 633 + " mrwdufe- のみ、使用可能です?" 634 + " roles [" + roles + "] mode [" + mode + "]" 635 + HybsSystem.CR; 636 throw new HybsSystemException( errMsg ); 637 } 638 } 639 // if( len < 3 ) { bit |= F_MODE; } // 互換性暫定対? 640 if( len < 3 ) { bit |= E_MODE; } // 互換性暫定対?// 5.4.2.0 (2011/12/01) 641 642 // RWアクセスできな??合?、ファイルアクセスも禁止します? 643 if( ( bit & W_MODE ) == 0 ) { bit = 0x00; } 644 } 645 646 return bit ; 647 } 648 649 /** 650 * オブジェクト?識別子として?詳細なユーザー??を返します? 651 * 652 * @return 詳細な画面?? 653 */ 654 @Override 655 public String toString() { 656 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 657 rtn.append( "roles : " ).append( roles ).append( HybsSystem.CR ); 658 rtn.append( "rwmode : " ).append( rwmode ).append( HybsSystem.CR ); 659 return rtn.toString(); 660 } 661 }