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}