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