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