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 */
016package org.opengion.hayabusa.resource;
017
018import org.opengion.hayabusa.common.HybsSystem;
019import org.opengion.hayabusa.common.HybsSystemException;
020import org.opengion.fukurou.util.StringUtil;
021
022import java.util.Map;
023import java.util.WeakHashMap ;
024import java.util.Collections ;
025
026/**
027 * ロールモードは、画面オブジェクトやカラムオブジェクトのロール-モード制御の情報を
028 * 管理するクラスです。
029 * ROLES 情報は、AAA|BBB|CCC と 『|』で区切られた複数のロールを持っています。
030 * 通常、ユーザーロールは画面やカラムの各オブジェクトに対してロール制御可能です。
031 * ログインユーザーは、自分自身のロールを、画面やカラムが持っているかを判定します。
032 * 画面に関しては、従来のデフォルトアクセスがなくなり、ロールを登録する場合は、
033 * 必ず ユーザーロールとの比較が行われます。画面ロールを登録しない場合は、アクセス
034 * 可能と判断されます。つまり、画面の場合は、なにも設定しなければ、アクセス可能と
035 * 判断されます。
036 * カラムロールも同様に、何も設定しなければフルアクセスできます。通常、ほとんどの
037 * ケースでカラムロールが使われることはありません。
038 * RWMODE 情報は、各ロールに対して、3つの項目で表しています。
039 *   1:"-" メニュー非表示   "m" メニュー表示  "p" メニュー表示(強制プルダウン表示)
040 *   2:"-" アクセス拒否     "r" 読取許可      "w" 読取、書込許可
041 *   3:"-" 未対応           "d" ファイル出力  "u" ファイル入力  "f" ファイル入出力
042 *       … このd,u,f では、【出力方法設定】タブは表示されません。
043 *       "o" 表示順編集のみ可  … この設定では、【表示項目設定】 タブで位置と表示順のみ変更できます。
044 *       "e" 画面編集可        … この設定で、編集機能がフルに使えます。
045 *       互換性の関係より、"" は、"e"  と同等とします。
046 *       設定キーの関係より、"o" と "e" を設定すると、"f" が自動的に設定されます。
047 *
048 * この3項目を順次つないで、"--","-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 */
064public 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        // 5.5.5.2 (2012/08/10) oを追加するため、ビット表現を拡張
071        // 5.7.4.3 (2014/03/28) publicをprivateに変更します。
072        /** MODE 定義 全許可                         ( mwe ) */
073        private static final byte FULL_MODE = (byte)0x7f;       // mwe = 01 11 11 11 = 0x7f
074        /** MODE 定義 メニュー表示                      ( m-- ) */
075        private static final byte M_MODE    = (byte)0xc0;       // m-- = 11 00 00 00 = 0xc0
076        /** MODE 定義 強制プルダウン表示   ( p-- ) */
077        private static final byte P_MODE    = (byte)0x40;       // p-- = 01 00 00 00 = 0x40
078
079        /** MODE 定義 読取許可                                ( -r- ) */
080        private static final byte R_MODE    = (byte)0x10;       // -r- = 00 01 00 00 = 0x10
081        /** MODE 定義 書込許可                                ( -w- ) */
082        private static final byte W_MODE    = (byte)0x30;       // -w- = 00 11 00 00 = 0x30
083
084        /** MODE 定義 ファイル出力                      ( --d ) */
085        private static final byte D_MODE    = (byte)0x04;       // --d = 00 00 01 00 = 0x04
086        /** MODE 定義 ファイル入力                      ( --u ) */
087        private static final byte U_MODE    = (byte)0x08;       // --u = 00 00 10 00 = 0x08
088        /** MODE 定義 ファイル入出力             ( --f ) */
089        private static final byte F_MODE    = (byte)0x0c;       // --f = 00 00 11 00 = 0x0c
090
091        /** MODE 定義 表示順編集のみ可            ( --o ) */
092        private static final byte O_MODE    = (byte)0x0e;       // --o = 00 00 11 10 = 0x0e
093                                                                                                                //                ~   ←【出力方法設定】タブの表示
094                                                                                                                //                 ~  ←【表示項目設定】タブの表示順使用
095        /** MODE 定義 画面編集可                       ( --e ) */
096        private static final byte E_MODE    = (byte)0x0f;       // --e = 00 00 11 11 = 0x0f
097
098        /** 初期のモード */
099        public static final String DEFAULT_MODE = "mwe";
100
101        private final String    roles ;                 // ロールズ
102        private final String    rwmode ;                // モード
103        private final String[]  roleArray ;             // ロール配列
104        private final byte[]    bitModes ;              // モードのビット版(-:00, p:01, m:11,
105                                                                                        //                                      -:00, r:01, w:11,
106                                                                                        //                                      -:000, d:010, u:100, f:110, o:111, e:111)
107        private final boolean   fullAccessFlag; // フルアクセス許可時のフラグ
108
109        private static final RoleMode FULL_ACCESS_ROLE_MODE_OBJ = new RoleMode() ;
110
111        /**
112         * フルアクセスの RoleMode を構築します。
113         * 内部からのみ構築できるように private コンストラクタにしておきます。
114         *
115         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
116         */
117        private RoleMode() {
118                roles                   = "FullAccess";
119                rwmode                  = DEFAULT_MODE;
120                roleArray               = null;
121                bitModes                = new byte[] { FULL_MODE };             // mwf = 01111111 = 0x7f
122                fullAccessFlag  = true;
123        }
124
125        /**
126         * ロールとモードを元に、RoleModeオブジェクトを構築します。
127         * このコンストラクタは、他のパッケージから呼び出せないように、
128         * パッケージプライベートにしておきます。
129         *
130         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
131         *
132         * @param       roles   "|"で区切られた ロール文字列
133         * @param       mode    "|"で区切られ、ロール文字列と対応付けられたモード文字列。唯一の場合は共通モードになる。
134         */
135        private RoleMode( final String roles,final String mode ) {
136                this.roles      = roles ;               // ロールズ
137                this.rwmode     = mode ;                // モード
138
139                // roles="root" または、roleArray がない場合は、フルアクセス
140                fullAccessFlag = "root".equals( roles ) || roles == null || roles.length() == 0 ;
141
142                roleArray = StringUtil.csv2Array( roles,HybsSystem.GUI_DELIMITER ) ;    // ロール配列
143
144                // bitModes を求めます。最低1つは作成します。同時に、roleArray もセットします。
145                bitModes = makeBitMode( roleArray,rwmode );
146        }
147
148        /**
149         * ロールとモードを元に、RoleModeオブジェクトを構築します。
150         * 条件が同じ RoleModeオブジェクト があれば、キャッシュから返します。
151         * キャッシュになければ、新規に作成します。
152         * このキャッシュは、完全な内部キャッシュなので、いつクリアされるか保障がありません。
153         *
154         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
155         *
156         * @param       roles   "|"で区切られた ロール文字列
157         *
158         * @return      RoleModeオブジェクト
159         */
160        public static RoleMode newInstance( final String roles ) {
161                if( roles == null || roles.length() == 0 ) {
162                        return FULL_ACCESS_ROLE_MODE_OBJ;
163                }
164
165                return newInstance( roles,DEFAULT_MODE );
166        }
167
168        /**
169         * ロールとモードを元に、RoleModeオブジェクトを構築します。
170         * 条件が同じ RoleModeオブジェクト があれば、キャッシュから返します。
171         * キャッシュになければ、新規に作成します。
172         * このキャッシュは、完全な内部キャッシュなので、いつクリアされるか保障がありません。
173         *
174         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
175         *
176         * @param       roles   "|"で区切られた ロール文字列
177         * @param       mode    "|"で区切られ、ロール文字列と対応付けられたモード文字列。唯一の場合は共通モードになる。
178         *
179         * @return      RoleModeオブジェクト
180         */
181        public static RoleMode newInstance( final String roles,final String mode ) {
182                if( mode == null || mode.length() < 2 ) {
183                        String errMsg = "RWMODE の桁数は、2桁以上必要です。"
184                                                + " roles [" + roles + "]  mode [" + mode + "]"
185                                                + HybsSystem.CR;
186                        throw new HybsSystemException( errMsg );
187                }
188
189                if( ( roles == null || roles.length() == 0 ) &&
190                        ( "mw".equals( mode ) || DEFAULT_MODE.equals( mode ) ) ) {
191                                return FULL_ACCESS_ROLE_MODE_OBJ ;
192                }
193
194                String key = roles + mode ;
195                RoleMode roleMode = roleMap.get( key );
196                if( roleMode == null ) {
197                        roleMode = new RoleMode( roles,mode );
198                        roleMap.put( key,roleMode );
199                }
200
201                return roleMode;
202        }
203
204        /**
205         * ロールズを返します。
206         *
207         * @return ロールズ文字列
208         */
209        public String getRoles() { return roles; }
210
211        /**
212         * モード配列を返します。
213         *
214         * @return モード配列
215         */
216        public String getMode() { return rwmode; }
217
218        /**
219         * 指定のユーザーロールに対する最終的なアクセス条件を取得します。
220         * アクセス条件は、複数あるユーザーロールの中で、最大のアクセス条件を算出します。
221         * 例えば、AAA(-r)|BBB(-w)|CCC(mr) の3つのロール/モードが設定されている場合、
222         * ユーザーが、AAA だけの場合は、-r ですが、AAA|BBB を持っている場合は、-w になります。
223         * さらに、BBB|CCC と持っている場合は、(-w:書き込み許可)と(mr:メニューから読取許可)の
224         * 権限により、mw:メニューからの書き込み許可が与えられます。
225         * モード指定がある場合は、AND演算になります。
226         * 例えば、AAA(-r)|BBB(-w)|CCC(mr) と BBB|CCC(-r) の場合、(-r)+(-w)+(mr)*(-r)=-w に
227         * なります。ロールは、OR ですが、モードは、同一ロールでのAND になります。
228         * 実際には、メニュー表示の可否は、ポップアップ系によく用いられますので、上記のような
229         * 許可が実際にあるかどうかは不明ですが、すべてのモードのOR条件での結合になります。
230         *
231         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
232         *
233         * @param       other   ロールモード
234         *
235         * @return アクセスビット
236         */
237        public byte getAccessBitMode( final RoleMode other ) {
238                if( fullAccessFlag || other.fullAccessFlag ) {
239                        return (byte)(bitModes[0] & other.bitModes[0]) ;
240                }
241
242                String[] othRoleArray = other.roleArray ;               // ロール配列
243                byte[]   othBitModes  = other.bitModes ;                // モードのビット
244
245                byte bitMode = 0;
246                for( int i=0; i<roleArray.length; i++ ) {
247                        for( int j=0; j<othRoleArray.length; j++ ) {
248                                if( roleArray[i].equals( othRoleArray[j] ) ) {
249                                        bitMode |= (byte)(bitModes[i] & othBitModes[j]) ;
250                                        if( bitMode == FULL_MODE ) { return FULL_MODE; }        // 途中打ち切り
251                                }
252                        }
253                }
254
255                return bitMode;
256        }
257
258        /**
259         * ビットロールのメニュー表示可否を返します。
260         *
261         * ロールが、m## , p## の場合に、true になります。
262         * これは、メニューに表示されるかどうかの判定に使われます。
263         *
264         * @param       bitMode ビットロール
265         *
266         * @return メニュー表示できる(true)/出来ない(false)
267         */
268        public static boolean isMenu( final byte bitMode ) {
269                return (bitMode & M_MODE) > 0 ;
270        }
271
272        /**
273         * ビットロールのプルダウン化を返します。
274         *
275         * ロールが、p## の場合に、true になります。
276         * ボタンメニュー時でも強制的に従来のプルダウンにします。
277         * 今後は廃止の方向です。
278         *
279         * @og.rev 4.3.3.0 (2008/10/01) メソッド追加
280         * @param       bitMode ビットロール
281         *
282         * @return true:プルダウン化
283         */
284        public static boolean isPulldown( final byte bitMode ) {
285                // M_MODEとの比較でP_MODEの場合は強制プルダウン化
286                return (bitMode & M_MODE) == P_MODE ;
287        }
288
289        /**
290         * ビットロールの読込アクセス可否を返します。
291         *
292         * ロールが、#r# , #w# の場合に、true になります。
293         * 読み取り属性がある場合、画面が利用可能になります。
294         * #-# の場合は、画面へのアクセスができないため、
295         * メニューアクセス許可を与える、m-# の設定は無意味です。
296         * この場合は、メニューにも表示されません。
297         *
298         * @param       bitMode ビットロール
299         *
300         * @return 読込アクセスできる(true)/出来ない(false)
301         */
302        public static boolean isRead( final byte bitMode ) {
303                return (bitMode & R_MODE) > 0 ;
304        }
305
306        /**
307         * ビットロールの書込アクセス可否を返します。
308         *
309         * ロールが、#w# の場合に、true になります。
310         *
311         * これは、読込、書込みの判断ではなく、書込みができるか
312         * どうかの判断をしています。
313         * 画面にアクセスできるかどうかの判断は、isAccess を使用してください。
314         *
315         * @param       bitMode ビットロール
316         *
317         * @return 書込アクセスできる(true)/出来ない(false)
318         */
319        public static boolean isWrite( final byte bitMode ) {
320                // 注意:W_MODE は、R_MODE と合成されているので、> 0 で判断できない。
321                return (bitMode & W_MODE) == W_MODE ;
322        }
323
324        /**
325         * ビットロールの画面アクセス可否を返します。
326         *
327         * これは、画面にアクセスできるかどうかの判断です。
328         * ロールが、#r# , #w# の場合に、true になります。
329         * 現時点では、isRead(byte) と計算方法は異なりますが、同じ結果になっています。
330         * これは、たまたま、現時点のロールの種類がそうなっているだけで、将来的に
331         * 同じかどうかは、保障されていません。
332         * よって、読み取り許可と、画面アクセス許可は、分けて考えてください。
333         *
334         * @param       bitMode ビットロール
335         *
336         * @return 画面アクセスできる(true)/出来ない(false)
337         */
338        public static boolean isAccess( final byte bitMode ) {
339                return (bitMode & W_MODE) > 0 ;
340        }
341
342        /**
343         * ビットロールのファイル出力可否を返します。
344         *
345         * ロールが、##d , ##f , ##o , ##e(= ##) の場合に、true になります。
346         * ##u の場合に、false になります。
347         * ファイル出力の可否を判定します。
348         * ## は、互換性の関係で、##e と同じです。
349         *
350         * @param       bitMode ビットロール
351         *
352         * @return ファイル出力できる(true)/出来ない(false)
353         */
354        public static boolean isDownload( final byte bitMode ) {
355                return (bitMode & D_MODE) > 0 ;
356        }
357
358        /**
359         * ビットロールのファイル入力可否を返します。
360         *
361         * ロールが、##u , ##f , ##o , ##e(= ##) の場合に、true になります。
362         * ##d の場合に、false になります。
363         * ファイル入力の可否を判定します。
364         * ## は、互換性の関係で、##e と同じです。
365         * ダウンロードはさせないが、アップロードを行う場合に使います。
366         * ここでのアップロードとは、基本的にデータの取り込みになりますので、
367         * アップロードのみという扱いは、あまりありません。
368         *
369         * @param       bitMode ビットロール
370         *
371         * @return ファイル入力できる(true)/出来ない(false)
372         */
373        public static boolean isUpload( final byte bitMode ) {
374                return (bitMode & U_MODE) > 0 ;
375        }
376
377        /**
378         * ビットロールの画面編集可否を返します。
379         *
380         * ロールが、##o , ##e(= ##) の場合に、true になります。
381         * このビットロールだけ特殊で、フラグが ON の場合に、機能制限がかかります。
382         *
383         * @og.rev 5.4.2.0 (2011/12/01) 新規作成
384         * @og.rev 5.5.5.2 (2012/08/10) oモード追加に伴い変更
385         *
386         * @param       bitMode ビットロール
387         *
388         * @return アクセスできる(true)/出来ない(false)
389         */
390        public static boolean isEdit( final byte bitMode ) {
391                // return ( (bitMode & E_MODE) == E_MODE );
392                return (bitMode & O_MODE) == O_MODE ;
393        }
394        
395        /**
396         * ビットロールの画面編集のフルコントロール可否を返します。
397         *
398         * ロールが、##e(= ##) の場合に、true になります。
399         * これは、フルコントロールの状態を指します。
400         *
401         * @og.rev 5.5.5.2 (2012/08/10) 新規作成
402         *
403         * @param       bitMode ビットロール
404         *
405         * @return アクセスできる(true)/出来ない(false)
406         */
407        public static boolean isFullEdit( final byte bitMode ) {
408                // return ( (bitMode & E_MODE) == E_MODE );
409                return (bitMode & E_MODE) == E_MODE ;
410        }
411
412
413        /**
414         * この画面のmode アクセス条件をビット化します。
415         *
416         * RWMODE 情報は、各ロールに対して、3つの項目で表しています。
417         *   1:"-" メニュー非表示   "m" メニュー表示  "p" メニュー表示(強制プルダウン表示)
418         *   2:"-" アクセス拒否     "r" 読取許可      "w" 読取、書込許可
419         *   3:"-" 未対応           "d" ファイル出力  "u" ファイル入力  "f" ファイル入出力
420         *       … このd,u,f では、【出力方法設定】タブは表示されません。
421         *       "o" 表示順編集のみ可  … この設定では、【表示項目設定】 タブで位置と表示順のみ変更できます。
422         *       "e" 画面編集可        … この設定で、編集機能がフルに使えます。
423         *       互換性の関係より、"" は、"e"  と同等とします。
424         *
425         * 区切り文字『|』で同じ順序で指定します。
426         * roles がないか、modes が一つか、roles と modes の個数が異なる場合
427         * 唯一のモード(共通モード)として、modes[0] を割り当てます。
428         * 互換性のため、"rw" と "r-" も処理できるようにします。
429         * この3項目を順次つないで、"--","-r","-w","mr","mw" などの設定を行います。
430         * モードが設定されている場合は、共通モードとして、すべてのロールに同じモードを
431         * 割り当てます。個別に割り当てる場合は、ROLES 情報の後ろに () 付きで追記します。
432         * 例えば、AAA|BBB(-r)|CCC とすれば、BBB ロールの場合は、読取専用になります。
433         * ロールをぶつける場合は、AND 演算になります。
434         *
435         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
436         *
437         * @param       roles   画面ロール配列
438         * @param       mode    画面モード
439         *
440         * @return  ビットモード配列 "--:000","-r:001","-w:010","mr:101","mw:110" に対応した数字(0,1,2,5,6)
441         */
442        private byte[] makeBitMode( final String[] roles,final String mode ) {
443                byte[] bits = null;
444
445                byte commnMode = bitMode( mode );               // 共通MODEの設定
446
447                int size = roles.length ;
448                if( size == 0 ) {
449                        bits = new byte[] { commnMode };
450                }
451                else {
452                        bits = new byte[size] ;
453                        for( int i=0; i<size; i++ ) {
454                                String roleMode = null;
455                                String role = roles[i];
456                                int adrs = ( role != null ) ? role.indexOf( '(' ) : -1 ;
457                                if( adrs >= 0 ) {
458                                        roleMode = role.substring( adrs+1,role.length() -1 );
459                                        // 注意:roleArray に書き戻しています。(副作用処理)
460                                        roles[i] = role.substring( 0,adrs );
461                                }
462                                bits[i] = (byte)(commnMode & bitMode( roleMode )) ;
463                        }
464                }
465
466                return bits ;
467        }
468
469        /**
470         * モード文字列に対するビット変換を行います。
471         *
472         * RWMODE 情報は、3つの項目で表しています。
473         *   1:"-" メニュー非表示   "m" メニュー表示
474         *   2:"-" アクセス拒否     "r" 読取許可      "w" 読取、書込許可
475         *   3:"-" 未対応           "d" ファイル出力  "u" ファイル入力  "f" ファイル入出力
476         *       … このd,u,f では、【出力方法設定】タブは表示されません。
477         *       "o" 表示順編集のみ可  … この設定では、【表示項目設定】 タブで位置と表示順のみ変更できます。
478         *       "e" 画面編集可        … この設定で、編集機能がフルに使えます。
479         *       互換性の関係より、"" は、"e"  と同等とします。
480         *
481         * それぞれのキーワードに対して、ビット制御を行います。
482         * このメソッドには、ロールモード(ロール単位に追加するモード)の判定も
483         * 行う事が出来るように、引数が null の場合は、FULL_MODE を返します。
484         *
485         *       全許可                                    ( mwe )  FULL_MODE
486         *       メニュー表示                 ( m-- )  M_MODE
487         *       強制プルダウン表示              ( p-- )  P_MODE
488         *       読取許可                           ( -r- )  R_MODE
489         *       書込許可                           ( -w- )  W_MODE
490         *       ファイル出力                 ( --d )  D_MODE
491         *       ファイル入力                 ( --u )  U_MODE
492         *       ファイル入出力                        ( --f )  F_MODE
493         *       表示順編集のみ可               ( --o )  O_MODE
494         *       画面編集可                          ( --e )  E_MODE
495         *
496         * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応
497         * @og.rev 4.3.3.0 (2008/10/01) pモード対応(mと同じ扱い)
498         * @og.rev 5.4.2.0 (2011/12/01) eモード対応
499         * @og.rev 5.5.5.2 (2012/08/10) oモード対応
500         *
501         * @param       mode    モード文字列
502         *
503         * @return      ビットモード
504         */
505        private byte bitMode( final String mode ) {
506                byte bit = 0x00;
507
508                if( mode == null ) {
509                        bit = FULL_MODE;
510                }
511                else {
512                        int len = mode.length();
513                        for( int i=0; i<len; i++ ) {
514                                switch( mode.charAt(i) ) {
515                                        case 'm' : bit |= M_MODE; break;
516                                        case 'p' : bit |= P_MODE; break; // 4.3.3.0 (2008/10/01) Pモード追加
517                                        case 'r' : bit |= R_MODE; break;
518                                        case 'w' : bit |= W_MODE; break;
519                                        case 'd' : bit |= D_MODE; break;
520                                        case 'u' : bit |= U_MODE; break;
521                                        case 'f' : bit |= F_MODE; break;
522                                        case 'e' : bit |= E_MODE; break; // 5.4.2.0 (2011/12/01) Eモード追加
523                                        case 'o' : bit |= O_MODE; break; // 5.5.5.2 (2011/12/10) Oモード追加
524                                        case '-' : break;
525                                        default  :
526                                                String errMsg = "RWMODE に不正な記号が使用されています。"
527                                                                        + " mrwdufe- のみ、使用可能です。"
528                                                                        + " roles [" + roles + "]  mode [" + mode + "]"
529                                                                        + HybsSystem.CR;
530                                                throw new HybsSystemException( errMsg );
531                                }
532                        }
533                        if( len < 3 ) { bit |= E_MODE; }        // 互換性暫定対応 // 5.4.2.0 (2011/12/01)
534
535                        // RWアクセスできない場合は、ファイルアクセスも禁止します。
536                        if( ( bit & W_MODE ) == 0 ) { bit = 0x00; }
537                }
538
539                return bit ;
540        }
541
542        /**
543         * オブジェクトの識別子として,詳細なユーザー情報を返します。
544         *
545         * @return  詳細な画面情報
546         */
547        @Override
548        public String toString() {
549                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
550                rtn.append( "roles  : " ).append( roles  ).append( HybsSystem.CR );
551                rtn.append( "rwmode : " ).append( rwmode ).append( HybsSystem.CR );
552                return rtn.toString();
553        }
554}