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 , 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}