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 java.util.Map; 020import java.util.HashSet; 021import java.util.HashMap; 022import java.util.LinkedHashMap ; 023import java.util.Arrays; 024import static org.opengion.fukurou.util.StringUtil.nval2; 025 026/** 027 * systemId と lang に対応したコードデータを作成します。 028 * 029 * コードデータは、項目(CLM)に対して、複数のコード(CODE)を持っています。 030 * この複数のコードを表示順に持つことで、プルダウンメニュー等の表示順を指定します。 031 * 032 * コードデータを作成する場合は、同一項目・コードで、作成区分違いの場合は、 033 * 最も大きな作成区分を持つコードを使用します。 034 * 作成区分(KBSAKU)は、他のリソースと異なり、基本的には使用しません。 035 * これは、通常は項目単位に作成区分を持つべきところを、コード単位でしか 036 * 持てないデータベースの設計になっている為です。アプリケーション側で設定条件を 037 * きちんと管理すれば、作成区分を使用できますが、一般にはお奨めできません。 038 * 039 * @og.rev 4.0.0.0 (2004/12/31) 新規作成 040 * @og.group リソース管理 041 * 042 * @version 4.0 043 * @author Kazuhiko Hasegawa 044 * @since JDK5.0, 045 */ 046public final class CodeData { 047 private final boolean USE_MULTI_KEY_SELECT = HybsSystem.sysBool( "USE_MULTI_KEY_SELECT" ) ; 048 049 private static final String SPC = ""; 050 051 /** 内部データのカラム番号 {@value} */ 052 public static final int CLM = 0 ; 053 public static final int CODE = 1 ; 054 public static final int LNAME = 2 ; 055 public static final int SNAME = 3 ; 056 public static final int CODELVL = 4 ; 057 public static final int CODEGRP = 5 ; 058 public static final int CODE_PARAM = 6 ; 059 public static final int ROLES = 7 ; 060 public static final int SYSTEM_ID = 8 ; 061 public static final int KBSAKU = 9 ; 062 public static final int RSNAME = 10; // 4.3.8.0 (2009/08/01) spanが付かない名前短 063 public static final int RLNAME = 11; // 5.6.8.2 (2013/09/20) rawLongLabel対応 064// public static final int MAX_LENGTH = 11; // 5.1.9.0 (2010/08/01) 配列の定義 065 public static final int MAX_LENGTH = 12; // 5.6.8.2 (2013/09/20) 変更 066 067 private final String column ; // 項目 068 private final String[] code ; // コード 069 private final String[] longLabel ; // コード名称(長) 070 private final String[] shortLabel ; // コード名称(短) 071 private final String[] codelebel ; // コードレベル ("1":option要素、"0":optgroup要素) 072 private final String[] codeGroup ; // コードグループ (指定のグループキーで選別する) 073 private final String[] codeParam ; // コードパラメータ 074 private final String[] roles ; // ロール 075 private final boolean[] isUseFlag ; // 5.1.9.0 (2010/08/01) サブセット化するときの有効/無効を指定 076 private final int size ; // コード項目数 077 private final boolean isMultiSelect ; // マルチセレクト 078 private final boolean isUseLebel ; // 5.1.9.0 (2010/08/01) コードレベル機能を利用するかどうか 079 private final boolean isUseParam ; // 5.1.9.0 (2010/08/01) パラメータを利用するかどうか 080 private final boolean isUseGroup ; // 5.1.9.0 (2010/08/01) コードグループを利用するかどうか 081 private final boolean isUseRoleMode ; // 5.1.9.0 (2010/08/01) ロールモードを利用するかどうか 082 083 private final RoleMode[] roleModes ; // 4.3.0.0 (2008/07/04) ロールズとモードを管理するオブジェクト 084 private final String[] rawShortLabel; // 4.3.8.0 (2009/08/01) spanが付かない名前短 085 private final String[] rawLongLabel; // 5.6.8.2 (2013/09/20) 未加工名前長い 086 087 /** 088 * 配列文字列のデータを元に、CodeDataオブジェクトを構築します。 089 * このコンストラクタは、他のパッケージから呼び出せないように、 090 * パッケージプライベートにしておきます。 091 * このコンストラクタは、マスタリソースファイルを想定しています。 092 * 093 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 094 * 095 * @param clm カラム名 096 * @param data CLM,CODE,LNAME,SNAME,CODELVL,CODEGRP,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU,RSNAMEの順番の文字列配列を格納 097 * @param useFlag 使用フラグ配列(サブセット化するときの有効/無効を指定) 098 */ 099 CodeData( final String clm, final Map<String,String[]> data , final boolean[] useFlag ) { 100 this( clm,data ); 101 102 if( useFlag != null && size == useFlag.length ) { 103 for( int i=0; i<size; i++ ) { 104 isUseFlag[i] = useFlag[i]; 105 } 106 } 107 } 108 109 /** 110 * 配列文字列のデータを元に、CodeDataオブジェクトを構築します。 111 * このコンストラクタは、他のパッケージから呼び出せないように、 112 * パッケージプライベートにしておきます。 113 * このコンストラクタは、マスタリソースファイルを想定しています。 114 * 115 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 116 * @og.rev 4.3.8.0 (2009/08/01) rawShortLabel追加 117 * @og.rev 4.3.8.0 (2009/08/01) グループ機能とパラメータの判定、isUseFlag フラグの追加 118 * @og.rev 5.2.2.0 (2010/11/01) "_" の取り扱いの変更 119 * @og.rev 5.6.8.2 (2103/09/20) rawlongLabel追加 120 * 121 * @param clm カラム名 122 * @param data CLM,CODE,LNAME,SNAME,CODELVL,CODEGRP,CODE_PARAM,ROLES,SYSTEM_ID,KBSAKU,RSNAMEの順番の文字列配列を格納 123 */ 124 CodeData( final String clm, final Map<String,String[]> data) { 125 column = clm; 126 127 size = data.size(); 128 String[] cdKeys = data.keySet().toArray( new String[size] ); 129 130 code = new String[size]; 131 shortLabel = new String[size]; 132 longLabel = new String[size]; 133 codelebel = new String[size]; 134 codeGroup = new String[size]; 135 codeParam = new String[size]; 136 roles = new String[size]; 137 roleModes = new RoleMode[size]; 138 isUseFlag = new boolean[size]; // 5.1.9.0 (2010/08/01) サブセットフラグの追加 139 rawShortLabel = new String[size]; 140 rawLongLabel = new String[size]; // 5.6.8.2 (2103/09/20) 141 142 // 1文字目の重複判定により、マルチセレクトの可否を判断します。 143 HashSet<String> set = new HashSet<String>(); 144 boolean isSel = USE_MULTI_KEY_SELECT; // 判定処理を行う。false なら判定処理も行わない。 145 146 // 5.1.9.0 (2010/08/01) コードレベル、コードグループ、パラメータ、ロールの使用可否のフラグ 147 boolean isLbl = false; 148 boolean isPrm = false; 149 boolean isRole = false; 150 boolean isGrp = false; 151 152 for( int i=0; i<size; i++ ) { 153 String[] vals = data.get( cdKeys[i] ); 154 155 code[i] = nval2( vals[CODE],SPC ); 156 157 String lname = nval2( vals[LNAME],SPC ) ; 158 longLabel[i] = lname; 159 160 // null か ゼロ文字列 : LNAME をセット 161 // "_" : ゼロ文字列 162 // それ以外 : そのまま SNAME をセット 163// shortLabel[i] = nval2( vals[SNAME] ,lname ); 164 shortLabel[i] = nval2( vals[SNAME] ,lname , SPC ); // 5.2.2.0 (2010/11/01) 165 166 codelebel[i] = nval2( vals[CODELVL] , SPC ) ; 167 codeGroup[i] = nval2( vals[CODEGRP] , SPC ) ; 168 codeParam[i] = nval2( vals[CODE_PARAM], SPC ) ; 169 roles[i] = nval2( vals[ROLES] , SPC ) ; 170 171 // 5.1.9.0 (2010/08/01) コードレベル機能と、パラメータの使用判定 172 if( !isLbl ) { isLbl = "0".equals( codelebel[i] ); } 173 if( !isPrm ) { isPrm = ! SPC.equals( codeParam[i] ); } 174 if( !isRole ) { isRole = ! SPC.equals( roles[i] ); } 175 if( !isGrp ) { isGrp = ! SPC.equals( codeGroup[i] ); } 176 177 roleModes[i] = RoleMode.newInstance( roles[i] ); // ロールモード 178// rawShortLabel[i] = nval2( vals[RSNAME] , lname ); // 4.3.8.0 (2009/08/01) spanが付かない名前短 179 rawShortLabel[i] = nval2( vals[RSNAME] , lname , SPC ); // 5.2.2.0 (2010/11/01) 180 rawLongLabel[i] = nval2( vals[RLNAME] , lname , SPC ); // 5.6.8.2 (2013/09/20) 181 182 if( isSel && lname.length() > 0 ) { 183 isSel = set.add( lname.substring(0,1) ); // 重複時は false 184 } 185 } 186 187 Arrays.fill( isUseFlag,true ); // 5.1.9.0 (2010/08/01) サブセットフラグの追加 188 189 isMultiSelect = ( USE_MULTI_KEY_SELECT && ! isSel ) ; // flag の反転に注意 190 isUseLebel = isLbl; // 5.1.9.0 (2010/08/01) コードレベル機能を利用するかどうか 191 isUseParam = isPrm; // 5.1.9.0 (2010/08/01) パラメータを利用するかどうか 192 isUseRoleMode = isRole; // 5.1.9.0 (2010/08/01) ロールモードを利用するかどうか 193 isUseGroup = isGrp; // 5.1.9.0 (2010/08/01) コードグループを利用するかどうか 194 } 195 196 /** 197 * コードデータのキーを返します。 198 * 199 * @return コードデータのキー 200 */ 201 public String getColumn() { return column; } 202 203 /** 204 * コードデータのキーを返します。 205 * 206 * @param seqNo 表示順 207 * 208 * @return コードデータのキー 209 */ 210 public String getCodeKey( final int seqNo ) { return code[seqNo] ; } 211 212 /** 213 * コードデータの表示名を返します。 214 * 215 * @param seqNo 表示順 216 * 217 * @return コードデータの表示名 218 */ 219 public String getLongLabel( final int seqNo ) { return longLabel[seqNo]; } 220 221 /** 222 * コードデータの短縮表示名を返します。 223 * 224 * @param seqNo 表示順 225 * 226 * @return コードデータの短縮表示名 227 */ 228 public String getShortLabel( final int seqNo ) { return shortLabel[seqNo]; } 229 230 /** 231 * コード階層を返します。 232 * 233 * 通常のメニューは、階層が "1" になります。optgroup要素として使用する場合は、 234 * 階層を "0" で登録します。 235 * 236 * @param seqNo 表示順 237 * 238 * @return コード階層( "1":option要素、"0":optgroup要素 ) 239 */ 240 public String getCodeLebel( final int seqNo ) { return codelebel[seqNo]; } 241 242 /** 243 * コードグループに所属しているかどうかの判定を返します。 244 * 245 * コードグループとは、コードリソースを複数用意する代わりにグルーピング 246 * しておくことで、複数のコードリソースの代用ができる機能です。 247 * 例えば、管理者用と一般用のコードリソースがある場合、グルーピングしておけば 248 * 一つのコードリソースで使用できます。 249 * なお、引数のgroup や、データベース側の設定値が ゼロ文字列の場合は、 250 * 常に選択されます。 251 * 252 * @og.rev 5.1.9.0 (2010/08/01) 廃止 253 * 254 * @param seqNo 表示順 255 * @param group グループ文字 256 * 257 * @return 所属している場合は、true 258 */ 259// public boolean getCodeGroup( final int seqNo,final String group ) { 260// if( group == null || group.length() == 0 || SPC.equals( codeGroup[seqNo] ) ) { return true; } 261// 262// return ( codeGroup[seqNo].indexOf( group ) >= 0 ); 263// } 264 265 /** 266 * このコードが、使用できるかどうかを、返します。 267 * 268 * コードグループや、コードリストなどで、サブセットを作成する場合、 269 * プルダウンなどの選択肢は、制限しますが、レンデラーのラベルは、制限しません。 270 * これは、既存データを表示させる必要がある為です。 271 * このフラグは、選択肢を作成するときに利用します。 272 * 標準状態で作成した場合は、すべての項目が、true になっています。 273 * 274 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 275 * 276 * @param seqNo 表示順 277 * 278 * @return 使用可能な場合は、true 279 */ 280 public boolean isUse( final int seqNo ) { return isUseFlag[seqNo]; } 281 282 /** 283 * コードパラメータを返します。 284 * 285 * コードパラメータは、メニューの各要素(option要素)に設定するタグの内容を追記します。 286 * ここに記述した文字列をそのまま追記します。 287 * 288 * @param seqNo 表示順 289 * 290 * @return コードパラメータ 291 */ 292 public String getCodeParam( final int seqNo ) { return codeParam[seqNo]; } 293 294 /** 295 * コードロールを取得します。 296 * 297 * @param seqNo 表示順 298 * 299 * @return コードロール 300 */ 301 public String getRoles( final int seqNo ) { return roles[seqNo]; } 302 303 /** 304 * カラムオブジェクトのロールモードを返します。 305 * 306 * @og.rev 4.3.0.0 (2008/07/04) ロールモードマルチ対応 307 * 308 * @param seqNo 表示順 309 * 310 * @return カラムオブジェクトのロールモード 311 */ 312 public RoleMode getRoleMode( final int seqNo ) { return roleModes[seqNo]; } 313 314 /** 315 * ロールモードを、使用しているかどうかを、返します。 316 * 317 * ロールモードを使用している場合は、ロール制御の処理が必要です。 318 * 使用している/いないを事前に判断することで、無駄な処理を削減できます。 319 * 320 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 321 * 322 * @return ロールモードを使用している場合は、true 323 */ 324 public boolean useRoleMode() { return isUseRoleMode; } 325 326 /** 327 * マッチするコードデータのアドレスを返します。 328 * 一致するデータが存在しない場合は、-1 を返します。 329 * 330 * @param key 検索するキー文字列 331 * 332 * @return コードデータのアドレス(なければ、-1) 333 */ 334 public int getAddress( final String key ) { 335 int selected = -1; 336 for( int i=0; i<size; i++ ) { 337 if( code[i].equals( key ) ) { 338 selected = i; 339 break; 340 } 341 } 342 return selected; 343 } 344 345 /** 346 * コードデータの配列数を返します。 347 * 348 * @return コードデータの配列数 349 */ 350 public int getSize() { return size; } 351 352 /** 353 * マルチ・キーセレクトを使用するかどうかを返します。 354 * true:使用する。false:使用しない です。 355 * 使用するにした場合でも、ラベルの先頭文字が重複しない場合は、 356 * IEの自動選択機能によりセレクト可能なため、JavaScript は出力しません。 357 * 358 * @return 選択リストで、マルチ・キーセレクトを使用するかどうか(true:使用する) 359 */ 360 public boolean useMultiSelect() { return isMultiSelect; } 361 362 /** 363 * コードレベル機能を利用するかどうかを返します。 364 * true:使用する。false:使用しない です。 365 * コードレベル機能を利用する場合は、optgroup タグを出力します。 366 * 設定としては、レベル 0 に指定のカラムを optgroup として出力します。 367 * 368 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 369 * 370 * @return コードレベル機能を利用するかどうか(初期値:false:使用しない) 371 */ 372 public boolean useLebel() { return isUseLebel; } 373 374 /** 375 * パラメータを利用するかどうかを返します。 376 * true:使用する。false:使用しない です。 377 * このパラメータは、class 属性として設定される値です。 378 * これを使用して、各種レイアウトなどの指定が可能です。 379 * 380 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 381 * 382 * @return パラメータを利用するかどうか(初期値:false:使用しない) 383 */ 384 public boolean useParam() { return isUseParam; } 385 386 /** 387 * コードグループを利用するかどうかを返します。 388 * true:使用する。false:使用しない です。 389 * このコードグループは、リソースの引数で設定した カンマ区切り文字列に 390 * 対して、値が設定されていたかどうかを返します。 391 * これにより、不要な処理を行う必要がなくなります。 392 * 393 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 394 * 395 * @return パラメータを利用するかどうか(初期値:false:使用しない) 396 */ 397 public boolean useGroup() { return isUseGroup; } 398 399 /** 400 * オブジェクトの識別子として,詳細なコード情報を返します。 401 * キー:ラベル ・・の繰り返し文字列を返します。 402 * 403 * @og.rev 4.1.0.0 (2008/01/18) 新規追加 404 * 405 * @return 詳細なコード情報 406 */ 407 public String toCodeString() { 408 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 409 for( int i=0; i<size; i++ ) { 410 String key = code[i] + ":" ; 411 if( ! longLabel[i].startsWith( key ) ) { 412 rtn.append( key ); 413 } 414 rtn.append( longLabel[i] ); 415 rtn.append( " " ); 416 } 417 return rtn.toString().trim(); 418 } 419 420 /** 421 * コードデータの短縮表示名(spanタグ無し)を返します。 422 * 423 * @og.rev 4.3.8.0 (2009/08/01) 新規追加 424 * 425 * @param seqNo 表示順 426 * 427 * @return コードデータの短縮表示名(spanタグ無し) 428 */ 429 public String getRawShortLabel( final int seqNo ) { return rawShortLabel[seqNo]; } 430 431 /** 432 * 未加工の名前長を返します。 433 * 434 * @og.rev 5.6.8.2 (2013/09/13) 新規追加 435 * 436 * @param seqNo 表示順 437 * 438 * @return コードデータの短縮表示名(spanタグ無し) 439 */ 440 public String getRawLongLabel( final int seqNo ) { return rawLongLabel[seqNo]; } 441 442 /** 443 * 指定のコードに限定された CodeData を構築して返します。 444 * このサブセットは、コードのCSV文字列に基づいて作成されます。 445 * 446 * この CodeData は、本当のサブセットではなく、プルダウンメニューなどの選択肢のリストを 447 * 制限します。これは、一覧表示(レンデラー)では、すべての既存の設定値を表示しておく 448 * 必要があるからです。そして、変更時(エディター)に、選択肢を制限します。 449 * 450 * 引数の codeCsv が、null,ゼロ文字列の場合は、自分自身を返します。(同一です) 451 * 452 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 453 * @og.rev 5.6.8.2 (2013/09/20) rawLongLabel対応 454 * 455 * @param codeCsv 指定のコードをカンマで連結されたもの 456 * 457 * @return 指定のコードに限定された CodeData 458 */ 459 public CodeData subsetList( final String codeCsv ) { 460 if( codeCsv == null || codeCsv.length() == 0 ) { 461 return this; 462 } 463 464 String codes = "," + codeCsv + "," ; 465 466 boolean[] useFlag = new boolean[size] ; 467 468 Map<String,String[]> data = new LinkedHashMap<String,String[]>(); 469 for( int adrs=0; adrs<size; adrs++ ) { 470 String key = code[adrs] ; 471 useFlag[adrs] = ( codes.indexOf( "," + key + "," ) >= 0 ) ; // 存在する場合のみ、true 472 473 String[] vals = new String[MAX_LENGTH]; 474 vals[CLM] = column ; 475 vals[CODE] = key ; 476 vals[LNAME] = longLabel[adrs] ; 477 vals[SNAME] = shortLabel[adrs] ; 478 vals[CODELVL] = codelebel[adrs] ; 479 vals[CODEGRP] = codeGroup[adrs] ; 480 vals[CODE_PARAM]= codeParam[adrs] ; 481 vals[ROLES] = roles[adrs] ; 482 vals[SYSTEM_ID] = null ; 483 vals[KBSAKU] = null ; 484 vals[RSNAME] = rawShortLabel[adrs] ; 485 vals[RLNAME] = rawLongLabel[adrs] ; // 5.6.8.2 (2013/09/20) 486 487 data.put( key,vals ); 488 } 489 490 return new CodeData( column,data,useFlag ); 491 } 492 493 /** 494 * 指定のgroupに所属する限定された CodeData を構築して返します。 495 * このサブセットは、コードグループのCSV文字列に指定に基づいて作成されます。 496 * 497 * この CodeData は、本当のサブセットではなく、プルダウンメニューなどの選択肢のリストを 498 * 制限します。これは、一覧表示(レンデラー)では、すべての既存の設定値を表示しておく 499 * 必要があるからです。そして、変更時(エディター)に、選択肢を制限します。 500 * 501 * 引数の group が、null,ゼロ文字列、または、内部でグループを使用していない場合は、 502 * 自分自身を返します。(同一です) 503 * 引数の group も、内部設定のグループも、カンマ区切りCSV で複数のグループを指定できます。 504 * この場合は、各グループのうち、どれか一つでも該当すれば、使用(true)になります。 505 * 506 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 507 * @og.rev 5.6.8.0 (2013/09/20) rawLongLabel対応 508 * 509 * @param group 指定のコードグループのCSV文字列 510 * 511 * @return 指定のgroupに所属する限定された CodeData 512 */ 513 public CodeData subsetGroup( final String group ) { 514 if( group == null || group.length() == 0 || !isUseGroup ) { 515 return this; 516 } 517 518 String[] keys = group.split( "," ) ; 519 520 boolean[] useFlag = new boolean[size] ; 521 522 Map<String,String[]> data = new LinkedHashMap<String,String[]>(); 523 for( int adrs=0; adrs<size; adrs++ ) { 524 String cdGrp = codeGroup[adrs]; 525 526 boolean flag = SPC.equals( cdGrp ); 527 if( !flag ) { 528 String grpCsv = "," + cdGrp + "," ; 529 for( int i=0; i<keys.length; i++ ) { 530 flag = ( grpCsv.indexOf( keys[i] ) >= 0 ); 531 if( flag ) { break; } 532 } 533 } 534 535 useFlag[adrs] = flag; 536 537 String[] vals = new String[MAX_LENGTH]; 538 vals[CLM] = column ; 539 vals[CODE] = code[adrs] ; 540 vals[LNAME] = longLabel[adrs] ; 541 vals[SNAME] = shortLabel[adrs] ; 542 vals[CODELVL] = codelebel[adrs] ; 543 vals[CODEGRP] = codeGroup[adrs] ; 544 vals[CODE_PARAM]= codeParam[adrs] ; 545 vals[ROLES] = roles[adrs] ; 546 vals[SYSTEM_ID] = null ; 547 vals[KBSAKU] = null ; 548 vals[RSNAME] = rawShortLabel[adrs] ; 549 vals[RLNAME] = rawLongLabel[adrs] ; // 5.6.8.0 (2013/09/20) 550 551 data.put( code[adrs],vals ); 552 } 553 554 return new CodeData( column,data,useFlag ); 555 } 556 557 /** 558 * 指定のコードに限定された CodeData を構築して返します。 559 * このサブセットは、ロールの指定に基づいて作成されます。 560 * 561 * この CodeData は、本当のサブセットではなく、プルダウンメニューなどの選択肢のリストを 562 * 制限します。これは、一覧表示(レンデラー)では、すべての既存の設定値を表示しておく 563 * 必要があるからです。そして、変更時(エディター)に、選択肢を制限します。 564 * 565 * 引数の role が、null または、内部でロールを使用していない場合は、自分自身を返します。(同一です) 566 * 567 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 568 * @og.rev 5.6.8.2 (2013/09/13) rawLongLabel対応 569 * 570 * @param userRole 指定のロール(ユーザーロール) 571 * 572 * @return 指定のコードに限定された CodeData 573 */ 574 public CodeData subsetRole( final RoleMode userRole ) { 575 if( userRole == null || !isUseRoleMode ) { 576 return this; 577 } 578 579 boolean[] useFlag = new boolean[size] ; 580 581 Map<String,String[]> data = new LinkedHashMap<String,String[]>(); 582 for( int adrs=0; adrs<size; adrs++ ) { 583 byte rw = userRole.getAccessBitMode( roleModes[adrs] ); 584 585 useFlag[adrs] = RoleMode.isWrite( rw ) ; // 書き込み可能な場合のみ、true 586 587 String[] vals = new String[MAX_LENGTH]; 588 vals[CLM] = column ; 589 vals[CODE] = code[adrs] ; 590 vals[LNAME] = longLabel[adrs] ; 591 vals[SNAME] = shortLabel[adrs] ; 592 vals[CODELVL] = codelebel[adrs] ; 593 vals[CODEGRP] = codeGroup[adrs] ; 594 vals[CODE_PARAM]= codeParam[adrs] ; 595 vals[ROLES] = roles[adrs] ; 596 vals[SYSTEM_ID] = null ; 597 vals[KBSAKU] = null ; 598 vals[RSNAME] = rawShortLabel[adrs] ; 599 vals[RLNAME] = rawLongLabel[adrs] ; 600 601 data.put( code[adrs],vals ); 602 } 603 604 return new CodeData( column,data,useFlag ); 605 } 606 607 /** 608 * longLabel をキーとした、コードのマップを構築して返します。 609 * これは、ラベルからコード値を見つけるのに使用します。 610 * 611 * ラベルからコード値の逆引きは、同一ラベルが存在する場合がありうるので 612 * 参考情報としてしか、利用できません。 613 * また、ラベルも、短ラベルにたいするコードのマップを作成したい場合もありますが、 614 * 現時点では、対応していません。 615 * (マップに、短ラベル情報も登録すれば、対応可能ですが、ラベルが重複する割合が増えます。) 616 * 主な想定用途は、Rendere で出力したファイルを取り込むときに、ラベルからコードを 617 * 探す場合です。 618 * 619 * @og.rev 5.2.1.0 (2010/10/01) 新規追加 620 * 621 * @return コードのマップ 622 */ 623 public Map<String,String> makeLabelMap() { 624 Map<String,String> map = new HashMap<String,String>(); 625 626 for( int adrs=0; adrs<size; adrs++ ) { 627 map.put( longLabel[adrs] , code[adrs] ); 628 } 629 630 return map; 631 } 632 633 /** 634 * オブジェクトの識別子として,詳細なコード情報を返します。 635 * 636 * @og.rev 4.1.0.0 (2008/01/18) メソッド修正(改行コード削除) 637 * 638 * @return 詳細なコード情報 639 */ 640 @Override 641 public String toString() { 642 return "column = " + toCodeString() ; 643 644// StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 645// rtn.append( "column :" ).append( column ).append( HybsSystem.CR ); 646// for( int i=0; i<size; i++ ) { 647// rtn.append( code[i] ); 648// rtn.append( " " ); 649// rtn.append( longLabel[i] ); 650// rtn.append( " " ); 651// } 652// rtn.append( HybsSystem.CR ); 653// return rtn.toString(); 654 } 655}