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    }