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