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