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}