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 }