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    }