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