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    }