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     */
016    package org.opengion.hayabusa.resource;
017    
018    import org.opengion.hayabusa.common.HybsSystem ;
019    import java.util.Map;
020    import java.util.HashSet;
021    import java.util.HashMap;
022    import java.util.LinkedHashMap ;
023    import java.util.Arrays;
024    import 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     */
046    public 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    }