    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//              // １文字目の重複判定により、マルチセレクトの可否を判断します。
    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}