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