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