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}