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 java.util.Arrays;
019    import java.util.Collections;
020    import java.util.HashMap;
021    import java.util.HashSet;
022    import java.util.LinkedHashMap;
023    import java.util.Map;
024    import java.util.Set;
025    
026    import org.opengion.fukurou.util.ErrMsg;
027    import org.opengion.fukurou.util.StringUtil;
028    import org.opengion.hayabusa.common.HybsSystem;
029    import org.opengion.hayabusa.db.DBColumn;
030    import org.opengion.hayabusa.db.DBColumnConfig;
031    
032    /**
033     * java.util.ResourceBundle クラスをè¤?•°ç®¡ç?™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã§ã™ã?
034     *
035     * ResourceManager ã¯ã€?
036     *      LabelResource.properties   ラベルリソース(ãƒ??ブル定義ã‚?‚«ãƒ©ãƒ?ãªã©ã®ç”»é¢ã«è¡¨ç¤ºã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹)
037     *      CodeResource.properties    コードリソース(é¸æŠžãƒ‡ãƒ¼ã‚¿ãªã©ãƒ—ルãƒ?‚¦ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§é¸æŠžã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹)
038     *      MessageResource.properties メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹(エラーコードやメãƒ?‚»ãƒ¼ã‚¸ãªã©ã‚’表示ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹)
039     *
040     * ã®?“ã¤ã®ãƒ—ロパティーファイルをå?éƒ¨ã«æŒã£ã¦ãŠã‚Š,ãれãžã‚Œã®ãƒ¡ã‚½ãƒ?ƒ‰ã«ã‚ˆã‚Š??
041     * リソースã®è¿”ã™å€¤ã‚’決ã‚ã¦ã?¾ã™ã?
042     *
043     * ResourceManagerã¯,å˜ç‹¬ã§ã‚‚生æˆã§ãã¾ã™ãŒ?Œå„ユーザー毎ã«ä½œæ?ã™ã‚‹ã‚ˆã‚Šã‚?
044     * ResourceFactory#newInstance( lang )メソãƒ?ƒ‰ã‚ˆã‚Šç”Ÿæ?ã—ãŸæ–¹ã?プã?リングã•れるã?ã§
045     * 効çŽ?š„ã§ã™ã?
046     *
047     * リソース作æ?æ™‚ã«æŒ?®šã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«ã¯,ISO è¨?ªžã‚³ãƒ¼ãƒ?ISO-639 ã§å®šç¾©ã•れã‚?2 æ¡ã?å°æ–‡å­?
048     * <a href ="http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt">
049     * http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt</a>を使用ã—ã¦ä¸‹ã•ã??
050     * ãŸã ã—,å?部çš?« Locale を構築ã—ã¦ã?¾ã™ãŒ,ãã?æ­£ã—ã•ã¯,ãƒã‚§ãƒ?‚¯ã•れã¦ã?¾ã›ã‚“ã®ã§,
051     * æŒ?®šã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«ã«å¿œã˜ã?properties ファイルを用æ„ã—ã¦ãŠã„ã¦ä¸‹ã•ã??
052     *
053     * 日本語ã?å ´åˆã?, è¨?ªžã‚³ãƒ¼ãƒ‰ã? "jp" ãªã®ã§??
054     *      LabelResource_jp.properties   ラベルリソース(日本�
055     *      CodeResource_jp.properties    コードリソース(日本�
056     *      MessageResource_jp.properties メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹(日本èª?
057     *
058     * を用æ„ã—ã¦ä¸‹ã•ã??
059     *
060     * CodeResource ã«ã¤ã?¦ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã‹ã‚‰ CodeSelectionオブジェクトを
061     * 作æ?ã—ã¦åˆ©ç”¨ã—ã¾ã™ã?ã“ã?ã€CodeSelectionオブジェクトã?作æ?方法ã¨ã—ã¦ã€?
062     * ?“é?りè?ãˆã‚‰ã‚Œã¾ã™ã?
063     * ?‘ã¤ç›®ã¯ã€æ¯Žå›ž è¦æ±‚ãŒç™ºç”Ÿã™ã‚‹æ¯Žã« CodeSelection を作æ?ã—ã?プã?ルã—ã¦ã?ã¾ã™ã?ã“ã†ã™ã‚‹ã“ã¨ã§ã€?
064     * åˆã‚ã¦ä½¿ç”¨ã•れãŸã¨ãã ã‘オブジェクト化ã•れã¾ã™ã?ã§ã€ãƒ¡ãƒ¢ãƒªã®ç¯?´?Œå¯èƒ½ã§ã™ã?ãŸã ã—ã?
065     * プã?ルã«ãƒ’ットã—ãªã‹ã£ãŸå?åˆã?ã€ã‚„ã¯ã‚Šãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰æ¤œç´¢ã—ã¾ã™ã?ã§ã€å?ã€?ƒ’ãƒ?ƒˆã—ãªã?
066     * キーã«å¯¾ã—ã¦ã¯ã€æ¯Žå›žãƒªã‚½ãƒ¼ã‚¹ã‚’検索ã™ã‚‹ãŸã‚ã€?žåйçŽ?§ã™ã?
067     * ?’ã¤ã‚ã?ã€å?ã€?ƒ’ãƒ?ƒˆã—ãªã?‚­ãƒ¼ã«å¯¾ã—ã¦ã€NullCodeSelectionオブジェクトを登録ã—ã¦ãŠãã“ã¨ã§ã€?
068     * プã?ルã«ãŸã‚込んã§è¡Œãã¨è¨?†æ–¹æ³•ã§ã™ã?ã“ã?å ´åˆã?ã€ã‚·ãƒ³ã‚°ãƒ«ãƒˆã?ンã«ã—ã¦ãƒ¡ãƒ¢ãƒªã‚’ç¯?´?—ã¾ã™ãŒã€?
069     * ãれã§ã‚‚ã?ール自体ã?容é‡ã?ã€ç¢ºä¿ã—ã¦ãŠãå¿?¦ãŒã‚りã¾ã™ã?
070     * ?“ã¤ã‚ã?ã€ã“ã® ResourceManager ãŒã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹åŒ–ã•れるã¨ãã«ã€ã™ã¹ã¦ã® CodeSelectionオブジェクトを
071     * ã‚らã‹ã˜ã‚?プã?ルã—ã¦ãŠã方法ã§ã™ã?使ã‚ãªã?CodeSelection もインスタンス化ã™ã‚‹å¤‰ã‚りã«ã€?
072     * キャãƒ?‚·ãƒ¥ã«ãƒ’ットã—ãªã??åˆã?ã€å³ CodeSelection ãŒå­˜åœ¨ã—ãªã?¨åˆ¤æ–­ã§ãã‚‹ãŸã‚ã€?
073     * ã‚‚ã£ã¨ã‚‚パフォーマンスãŒé«˜ããªã‚Šã¾ã™ã?
074     * 本 ResourceManager ã®å®Ÿè£??ã€?¼“ã¤ã‚ã?ã€ã‚らã‹ã˜ã‚ã€ã™ã¹ã¦ã‚’キャãƒ?‚·ãƒ¥ã—ã¦ãŠã方法を
075     * 採用ã—ã¦ã?¾ã™ã?
076     *
077     * @og.group リソース管ç?
078     *
079     * @version  4.0
080     * @author       Kazuhiko Hasegawa
081     * @since    JDK5.0,
082     */
083    public final class ResourceManager {
084            // 4.0.0 (2005/01/31) オラクルã¨Windowsã¨ã®é–“ã? "??ã®æ–?­—化ã‘対ç­?
085            // private static final boolean USE_CHAR_TRANS = HybsSystem.sysBool( "USE_UTF8_CHARACTER_TRANSLATION" ) ;       // 4.0.0 (2005/01/31)
086    
087            private final ColumnDataLoader          columnLoader ;
088            private final CodeDataLoader            codeLoader;
089            private final LabelDataLoader           labelLoader;
090    //      private final MessageDataLoader         messageLoader; 4.0.0.0(2007/10/17)
091            private final GUIDataLoader                     guiLoader;
092    
093            private final Map<String,DBColumn> columnPool = Collections.synchronizedMap( new HashMap<String,DBColumn>( HybsSystem.BUFFER_LARGE ) );
094    //      private final String    systemId ;
095            private final String    lang ;
096    
097            // 5.4.3.4 (2012/01/12) ラベルã®ã‚­ãƒ£ãƒ?‚·ãƒ¥(キャãƒ?‚·ãƒ¥ãƒ©ãƒ™ãƒ«)
098    //      private final Map<String,LabelData> labelPool = Collections.synchronizedMap( new HashMap<String,LabelData>( HybsSystem.BUFFER_LARGE ) );
099    //      private final Map<String,String> labelPool = Collections.synchronizedMap( new HashMap<String,String>( HybsSystem.BUFFER_LARGE ) );
100    
101            /**
102             *      コンストラクター
103             *      シスãƒ?ƒ ?©?¤ã¨è¨?ªžã‚³ãƒ¼ãƒ‰ã‚’æŒ?®šã—ã¦,生æ?ã—ã¾ã™ã?
104             *
105             * @param       systemId シスãƒ?ƒ ?©?¤
106             * @param       lg è¨?ªžã‚³ãƒ¼ãƒ?
107             * @param       initLoad リソースãƒ??ã‚¿ã®å…ˆèª­ã¿å¯å¦(true:先読ã¿ã™ã‚‹)
108             */
109    //      public ResourceManager( final String sysId,final String lg,final boolean initLoad ) {
110            public ResourceManager( final String systemId,final String lg,final boolean initLoad ) {
111    //              this.systemId = sysId;
112                    this.lang         = lg;
113    
114                    columnLoader    = new ColumnDataLoader( systemId,initLoad );
115                    labelLoader             = new LabelDataLoader( systemId,lang,initLoad );
116    //              codeLoader              = new CodeDataLoader( systemId,lang,initLoad );
117                    codeLoader              = new CodeDataLoader( systemId,initLoad,labelLoader ); // 4.0.0.0(2007/10/17)
118    //              messageLoader   = new MessageDataLoader( systemId,lang,initLoad ); 4.0.0.0(2007/10/17)
119                    guiLoader               = new GUIDataLoader( systemId );
120            }
121    
122            /**
123             * 設定ã•れã¦ã?‚‹è¨?ªžã‚’è¿”ã—ã¾ã™ã?
124             *
125             * @return      è¨?ª?
126             */
127            public String getLang() {
128                    return lang;
129            }
130    
131            /**
132             * DBColumn オブジェクトをå–å¾—ã—ã¾ã™ã?
133             * 作æ?ã—ãŸDBColumnオブジェクトã??Œå?部ã«ãƒ—ã?ルã—ã¦ãŠã?ŒåŒã˜ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆè¦æ±‚ãŒ
134             * ã‚ã£ãŸã¨ãã??Œã?ールã®ã‚ªãƒ–ジェクトを利用ã—ã¦,DBColumnã‚’è¿”ã—ã¾ã™ã?
135             *
136             * @og.rev 3.4.0.0 (2003/09/01) ラベルカラãƒ??コードカラãƒ??表示パラメータã€ç·¨é›?ƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã€æ–‡å­—パラメータã®è¿½åŠ??
137             * @og.rev 3.5.6.4 (2004/07/16) 追åŠ?ƒ‘ラメータå–ã‚Šè¾¼ã¿æ™‚ã«ã€?_" ã¯ã€null 扱ã?¨ã™ã‚‹ã€?
138             * @og.rev 3.6.0.7 (2004/11/06) DBColumn ã® official属æ?追åŠ?
139             *
140             * @param       key     カラ�D
141             *
142             * @return      DBColumnオブジェク�
143             */
144            public DBColumn getDBColumn( final String key ) {
145                    DBColumn clm = columnPool.get( key );
146                    if( clm == null ) {
147                            ColumnData clmDt = columnLoader.getColumnData( key );
148                            if( clmDt != null ) {
149                                    String label_clm = clmDt.getLabelColumn();
150                                    String code_clm  = clmDt.getCodeColumn();
151    
152                                    clm = new DBColumn(
153                                                            lang,
154                                                            clmDt,
155                                                            labelLoader.getLabelData( label_clm ),
156                                                            codeLoader.getCodeData( code_clm ) );
157    
158                                    columnPool.put( key,clm );
159                            }
160                    }
161                    return clm;
162            }
163    
164            /**
165             * DBColumn オブジェクトを作æ?ã—ã¾ã™ã?
166             * å†?ƒ¨ã«ãƒ—ã?ルã«å­˜åœ¨ã™ã‚Œã°ãれをã?ãªã‘ã‚Œã°æ–°è¦ã«ä½œæ?ã—ã¾ã™ã?
167             * ãれã§ã‚‚存在ã—ãªã??åˆã?ã€DBColumnConfig よりã€ãƒ©ãƒ™ãƒ«ã¨è¨?ªžã‚’æŒ?®šã—ã¦
168             * æ–°è¦ã«ä½œæ?ã—ã¾ã™ã?
169             *
170             * @param       key     カラ�D
171             *
172             * @return      DBColumnオブジェク�
173             * @see         #getDBColumn( String )
174             */
175            public DBColumn makeDBColumn( final String key ) {
176                    DBColumn dbColumn = getDBColumn( key );
177                    if( dbColumn == null ) {
178                            DBColumnConfig config = new DBColumnConfig( key );
179                            config.setLabelData( getLabelData( key ) );
180                            config.setLang( getLang() );
181                            dbColumn = new DBColumn( config );
182                    }
183                    return dbColumn;
184            }
185    
186            /**
187             * DBColumn オブジェクトをプã?ルã«ç™»éŒ²ã—ã¾ã™ã?
188             * DBColumn ã‚’å‹•çš?«ä½œæ?ã™ã‚‹æ©Ÿè?ã§ã€ä½œæ?ã—ãŸã‚«ãƒ©ãƒ?‚ªãƒ–ジェクトを
189             * プã?ルã«ç™»éŒ²ã™ã‚‹ã“ã¨ã§ã€??常ã®ãƒªã‚½ãƒ¼ã‚¹ã¨åŒã˜ã‚ˆã†ã«åˆ©ç”¨ã§ãるよã†ã«
190             * ã—ã¾ã™ã?
191             *
192             * @og.rev 5.4.2.2 (2011/12/14) æ–°è¦è¿½åŠ?
193             *
194             * @param       key  カラ�D
195             * @param       dbColumn DBColumnオブジェク�
196             */
197            public void setDBColumn( final String key , final DBColumn dbColumn ) {
198                    if( key != null && key.length() > 0 && dbColumn != null ) {
199                            columnPool.put( key,dbColumn );
200                    }
201            }
202    
203            /**
204             * ラベルを独自ã®ãƒ—ã?ル(キャãƒ?‚·ãƒ¥ãƒ©ãƒ™ãƒ«)ã«ç™»éŒ²ã—ã¾ã™ã?
205             * å–り出ã™ã¨ãã?ã€?getLabel( String , boolean ) メソãƒ?ƒ‰ã®
206             * 第?’引数ã«ã€true ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
207             *
208             * @og.rev 5.4.3.4 (2012/01/12) æ–°è¦è¿½åŠ?
209             *
210             * @param       key  カラ�D
211             * @param       labelData LabelDataオブジェク�
212             * @see         #getLabel( String , boolean )
213             */
214    ////    public void setLabelData( final String key , final LabelData labelData ) {
215    //      public void setLabel( final String key , final String label ) {
216    //              if( key != null && !key.isEmpty() && label != null && !label.isEmpty() ) {
217    //                      labelPool.put( key,label );
218    //              }
219    //      }
220    
221            /**
222             * ラベルリソースã‹ã‚‰,ラベルを返ã—ã¾ã™ã?
223             * 引数ã®è¨?ªžã‚³ãƒ¼ãƒ‰ã«å¿œã˜ãŸãƒªã‚½ãƒ¼ã‚¹ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã?,
224             * 引数ã®ãƒ©ãƒ™ãƒ«ã‚­ãƒ¼ãã?ã¾ã¾è¿”ã—ã¾ã™ã?
225             * 独自プã?ル(キャãƒ?‚·ãƒ¥ãƒ©ãƒ™ãƒ«)ã‹ã‚‰å–り出ã™ã¨ãã?ã€useLocalPoolã‚?
226             * true ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?
227             * ãªãŠã?独自プã?ルã¯ã€ãれã?ã¿ã§ã¯ãªãã?ãã“ã«ãªã‘れã°é€šå¸¸ã®
228             * ラベルリソースを検索ã«è¡Œãã¾ã™ã?
229             *
230             * @og.rev 5.4.3.4 (2012/01/12) æ–°è¦è¿½åŠ?
231             *
232             * @param       key ラベルキー
233             * @param       useLocalPool true:キャãƒ?‚·ãƒ¥ãƒ©ãƒ™ãƒ«ã‹ã‚‰
234             *
235             * @return      リソースã«å¿œã˜ãŸãƒ©ãƒ™ãƒ«æ–?­—å?(ç„¡ã‘れ㰠ラベルキー)
236             * @see         #setLabel( String , String )
237             */
238    //      public String getLabel( final String key, final boolean useLocalPool ) {
239    //              // useLocalPool == true ã®å ´åˆã?ã€ãƒ©ãƒ™ãƒ«ã‚­ãƒ£ãƒ?‚·ãƒ¥ã‚’検索ã—ã¾ã™ã?
240    //              // ãã“ã«å­˜åœ¨ã—ãªã??åˆã?ã¾ãŸã?ã€useLocalPool == false ã®å ´åˆã?ã€??常ã®ãƒ©ãƒ™ãƒ«ãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰å€¤ã‚’è¿”ã—ã¾ã™ã?
241    //              if( useLocalPool ) {
242    //                      String label = labelPool.get( key );
243    //                      if( label != null ) { return label; }
244    //              }
245    //
246    //              return getLabel( key );
247    //      }
248    
249            /**
250             * ラベルリソースã‹ã‚‰,ラベルを返ã—ã¾ã™ã?
251             * 引数ã®è¨?ªžã‚³ãƒ¼ãƒ‰ã«å¿œã˜ãŸãƒªã‚½ãƒ¼ã‚¹ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã?,
252             * 引数ã®ãƒ©ãƒ™ãƒ«ã‚­ãƒ¼ãã?ã¾ã¾è¿”ã—ã¾ã™ã?
253             *
254             * @og.rev 4.0.0.0 (2005/01/31) オラクルã¨Windowsã¨ã®é–“ã? "??ã®æ–?­—化ã‘対策中止
255             * @og.rev 4.0.0.0 (2007/10/18) メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã¨ã®çµ±åˆåŒ–
256             *
257             * @param       key ラベルキー
258             *
259             * @return      リソースã«å¿œã˜ãŸãƒ©ãƒ™ãƒ«æ–?­—å?(ç„¡ã‘れ㰠ラベルキー)
260             */
261            public String getLabel( final String key ) {
262                    LabelData lblData = labelLoader.getLabelData( key );
263                    if( lblData != null ) {
264                            String rtn = lblData.getLabel();
265                            if( rtn != null ) {
266                                    return rtn;
267                            }
268                    }
269    
270                    // ãªã‘れ㰠key ã‚’è¿”ã™
271                    return key;
272            }
273    
274            /**
275             * メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰,ã‚­ãƒ¼ã§æŒ?®šã•れãŸãƒ¡ãƒ?‚»ãƒ¼ã‚¸ã«,
276             * å¼•æ•°ã§æŒ?®šã•れãŸå¤‰æ•°å€¤ã‚’ã‚»ãƒ?ƒˆã—ãŸãƒ¡ãƒ?‚»ãƒ¼ã‚¸ã‚’è¿”ã—ã¾ã™ã?
277             *
278             * ã“ã?メãƒ?‚»ãƒ¼ã‚¸ã¯,リソースã§é¸ã°ã‚ŒãŸãƒ­ã‚±ãƒ¼ãƒ«æ¯Žã?メãƒ?‚»ãƒ¼ã‚¸ã«??
279             * MessageFormat#format ã§ãƒ•ォーマットã™ã‚‹äº‹ã«ã‚ˆã‚Š,作æ?ã•れã¾ã™ã?
280             * メãƒ?‚»ãƒ¼ã‚¸ãŒãƒªã‚½ãƒ¼ã‚¹ã«å­˜åœ¨ã—ãªã??åˆã?,キーを返ã—ã¾ã™ã?
281             *
282             * @og.rev 4.0.0.0 (2005/01/31) オラクルã¨Windowsã¨ã®é–“ã? "??ã®æ–?­—化ã‘対ç­?
283             * @og.rev 4.0.0.0 (2007/10/17) メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹çµ±åˆã«ä¼´ã?ƒ©ãƒ™ãƒ«ãƒ­ãƒ¼ãƒ??を使用ã™ã‚‹
284             * @og.rev 4.0.0.0 (2007/10/18) å称変更 getMessage â‡?getLabel
285             * @og.rev 5.1.1.0 (2009/12/01) #xxxxã®å¤‰æ›ã§ã€ã‚«ãƒ©ãƒ?ãŒè¤?•°æŒ?®šã•れã¦ã?‚‹å ´åˆã?対å¿?
286             *
287             * @param       key キー
288             * @param       args メãƒ?‚»ãƒ¼ã‚¸ã®å¼•æ•°
289             *
290             * @return      メãƒ?‚»ãƒ¼ã‚¸(ç„¡ã‘れ㰠キー)
291             */
292            public String getLabel( final String key,final String[] args ) {
293    //              MessageData msgDt = messageLoader.getMessageData( key );
294    
295                    final String msglbl ;
296    
297                    if( args == null ) {
298                            msglbl = getLabel( key );
299                    }
300                    else {
301                            LabelData msgDt = labelLoader.getLabelData( key );
302    
303    //                      int size = ( args == null ) ? 0 : args.length ;
304                            int size = args.length;
305                            String[] msgArgs = new String[size];
306                            for( int i=0; i<size; i++ ) {
307                                    String arg = args[i] ;
308                                    if( arg != null && arg.startsWith( "#" ) ) {
309                                            if( arg.indexOf( ',' ) < 0 ) {
310                                                    msgArgs[i] = getLabel( arg.substring( 1 ) );
311                                            }
312                                            // 5.1.1.0 (2009/12/01) #CLM,LANG,KBSAKU ç­‰é?ç›®åãŒè¤?•°æŒ?®šã§ãるよã†ã«ã™ã‚‹
313                                            else {
314                                                    String[] argArr = StringUtil.csv2Array( arg.substring( 1 ) );
315                                                    StringBuilder argBuf = new StringBuilder();
316                                                    for( int j=0; j<argArr.length; j++ ) {
317                                                            if( j > 0 ) {
318                                                                    argBuf.append( ',' );
319                                                            }
320                                                            argBuf.append( getLabel( argArr[j]) );
321                                                    }
322                                                    msgArgs[i] = getLabel( argBuf.toString() );
323                                            }
324                                    }
325                                    else {
326                                            msgArgs[i] = arg ;
327                                    }
328                            }
329    
330                            msglbl = msgDt.getMessage( msgArgs );
331                    }
332    
333                    return msglbl;
334            }
335    
336            /**
337             * メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰,ErrMsgã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã§æŒ?®šã•れãŸãƒ¡ãƒ?‚»ãƒ¼ã‚¸ã‚’è¿”ã—ã¾ã™ã?
338             *
339             * ã“ã?エラーメãƒ?‚»ãƒ¼ã‚¸ã¯,リソースã§é¸ã°ã‚ŒãŸãƒ­ã‚±ãƒ¼ãƒ«æ¯Žã?メãƒ?‚»ãƒ¼ã‚¸ã«??
340             * MessageFormat#format ã§ãƒ•ォーマットã™ã‚‹äº‹ã«ã‚ˆã‚Š,作æ?ã•れã¾ã™ã?
341             * エラーメãƒ?‚»ãƒ¼ã‚¸ãŒãƒªã‚½ãƒ¼ã‚¹ã«å­˜åœ¨ã—ãªã??åˆã?,エラーコードを返ã—ã¾ã™ã?
342             *
343             * @og.rev 4.0.0.0 (2004/12/31) æ–°è¦è¿½åŠ?
344             * @og.rev 4.0.0.0 (2007/10/18) メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã¨ã®çµ±åˆåŒ–
345             *
346             * @param       errMsg ErrMsgオブジェク�
347             *
348             * @return      エラーメãƒ?‚»ãƒ¼ã‚¸(ç„¡ã‘れ㰠ErrMsgオブジェクトã? toString() )
349             */
350            public String getLabel( final ErrMsg errMsg ) {
351                    String   key  = errMsg.getId();
352                    String[] args = errMsg.getArgs();
353    
354                    return getLabel( key,args );
355            }
356    
357            /**
358             * ラベルリソースã‹ã‚‰,ラベル(短)ã‚’è¿”ã—ã¾ã™ã?
359             * 引数ã®è¨?ªžã‚³ãƒ¼ãƒ‰ã«å¿œã˜ãŸãƒªã‚½ãƒ¼ã‚¹ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã?,
360             * 引数ã®ãƒ©ãƒ™ãƒ«ã‚­ãƒ¼ãã?ã¾ã¾è¿”ã—ã¾ã™ã?
361             *
362             * @og.rev 4.3.3.0 (2008/10/01) æ–°è¦ä½œæ?
363             *
364             * @param       key ラベルキー
365             *
366             * @return      リソースã«å¿œã˜ãŸãƒ©ãƒ™ãƒ«æ–?­—å?(ç„¡ã‘れ㰠ラベルキー)
367             */
368            public String getShortLabel( final String key ) {
369                    LabelData lblData = labelLoader.getLabelData( key );
370                    if( lblData != null ) {
371                            String rtn = lblData.getShortLabel();
372                            if( rtn != null ) {
373                                    return rtn;
374                            }
375                    }
376    
377                    // ãªã‘れ㰠key ã‚’è¿”ã™
378                    return key;
379            }
380    
381            /**
382             * ラベルリソースã‹ã‚‰,概è¦èª¬æ˜Žã‚’è¿”ã—ã¾ã™ã?
383             * キーã®ãƒ??ã‚¿ãŒå­˜åœ¨ã—ãªã??åˆã?nullã‚’è¿”ã—ã¾ã™ã?
384             *
385             * @og.rev 4.3.4.5 (2009/01/08) æ–°è¦ä½œæ?
386             *
387             * @param       key ラベルキー
388             *
389             * @return      リソースã«å¿œã˜ãŸæ¦‚è¦èª¬æ˜?ç„¡ã‘れ㰠null)
390             */
391            public String getDescription( final String key ) {
392                    LabelData lblData = labelLoader.getLabelData( key );
393                    if( lblData != null ) {
394                            String rtn = lblData.getDescription();
395                            if( rtn != null ) {
396                                    return rtn;
397                            }
398                    }
399                    // キーãŒå­˜åœ¨ã—ãªã‘れã°nullã§è¿”ã™
400                    return null;
401            }
402    
403            /**
404             * ラベルリソースã‹ã‚‰,概è¦èª¬æ˜Žã‚’è¿”ã—ã¾ã™ã?
405             * {0},{1}...ã®ç½®æ›ãˆã‚’行ã„ã¾ã™ã?
406             * キーã®ãƒ??ã‚¿ãŒå­˜åœ¨ã—ãªã??åˆã?nullã‚’è¿”ã—ã¾ã™ã?
407             *
408             * @og.rev 4.3.7.6 (2009/07/15) æ–°è¦ä½œæ?
409             *
410             * @param       key ラベルキー
411             * @param       args パラメータ
412             *
413             * @return      リソースã«å¿œã˜ãŸæ¦‚è¦èª¬æ˜?ç„¡ã‘れ㰠null)
414             */
415            public String getDescription( final String key, final String[] args ) {
416                    String rtn = null;
417                    if( args == null ){
418                            rtn = getDescription( key );
419                    }
420                    else{
421                            LabelData lblData = labelLoader.getLabelData( key );
422                            if( lblData != null ) {
423                                    int size = args.length;
424                                    String[] msgArgs = new String[size];
425                                    for( int i=0; i<size; i++ ) {
426                                            String arg = args[i] ;
427                                            if( arg != null && arg.startsWith( "#" ) ) {
428                                                    msgArgs[i] = getLabel( arg.substring( 1 ) );
429                                            }
430                                            else {
431                                                    msgArgs[i] = arg ;
432                                            }
433                                    }
434                                    rtn = lblData.getDescription( msgArgs );
435                            }
436                    }
437                    // キーãŒå­˜åœ¨ã—ãªã‘れã°nullã§è¿”ã‚‹
438                    return rtn;
439            }
440    
441            /**
442             * ラベルリソースã‹ã‚‰,概è¦èª¬æ˜Žã‚’è¿”ã—ã¾ã™ã?
443             * キーã®ãƒ??ã‚¿ãŒå­˜åœ¨ã—ãªã??åˆã?nullã‚’è¿”ã—ã¾ã™ã?
444             *
445             * @og.rev 4.3.7.6 (2009/07/15) æ–°è¦ä½œæ?
446             *
447             * @param       errMsg ErrMsgオブジェク�
448             *
449             * @return      エラーメãƒ?‚»ãƒ¼ã‚¸(キーãŒç„¡ã‘れã°null)
450             */
451            public String getDescription( final ErrMsg errMsg ) {
452                    String   key  = errMsg.getId();
453                    String[] args = errMsg.getArgs();
454    
455                    return getDescription( key,args );
456            }
457    
458            /**
459             * ラベルリソースã‹ã‚‰,ラベルを返ã—ã¾ã™ã?
460             * 引数ã®è¨?ªžã‚³ãƒ¼ãƒ‰ã«å¿œã˜ãŸãƒªã‚½ãƒ¼ã‚¹ãŒç™»éŒ²ã•れã¦ã?ªã??åˆã?,
461             * 引数ã®ãƒ©ãƒ™ãƒ«ã‚­ãƒ¼ãã?ã¾ã¾è¿”ã—ã¾ã™ã?
462             *
463             * @og.rev 4.0.0.0 (2005/01/31) æ–°è¦ä½œæ?
464             *
465             * @param       key ラベルキー
466             *
467             * @return      リソースã«å¿œã˜ãŸãƒ©ãƒ™ãƒ«æ–?­—å?(ç„¡ã‘れ㰠ラベルキー)
468             */
469            public LabelData getLabelData( final String key ) {
470                    return labelLoader.getLabelData( key );
471            }
472    
473            /**
474             * コードリソースã‹ã‚‰,コード文字å?ã‚’è¿”ã—ã¾ã™ã?
475             *
476             * @param       key コードキー
477             *
478             * @return      コードデータオブジェクãƒ?ç„¡ã‘れ㰠null)
479             */
480            public CodeData getCodeData( final String key ) {
481                    return codeLoader.getCodeData( key );
482            }
483    
484            /**
485             * コードリソースã‹ã‚‰,コード文字å?ã‚’è¿”ã—ã¾ã™ã?
486             * 引数ã«QUERYを渡ã™ã“ã¨ã§ã€DBã‹ã‚‰ã€å‹•çš?«ã‚³ãƒ¼ãƒ‰ãƒªã‚½ãƒ¼ã‚¹ã‚’作æ?ã§ãã¾ã™ã?
487             *
488             * @og.rev 5.4.2.2 (2011/12/14) æ–°è¦è¿½åŠ??
489             *
490             * @param       key コードキー
491             * @param       query 検索SQL(引数ã«ã€? ã‚’ä¸?¤æŒã¤)
492             *
493             * @return      コードデータオブジェクãƒ?ç„¡ã‘れ㰠null)
494             */
495            public CodeData getCodeData( final String key,final String query ) {
496                    return codeLoader.getCodeData( key,query );
497            }
498    
499            /**
500             * メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã‹ã‚‰,ã‚­ãƒ¼ã§æŒ?®šã•れãŸãƒ¡ãƒ?‚»ãƒ¼ã‚¸ã‚’è¿”ã—ã¾ã™ã?
501             *
502             * ã“ã?メãƒ?‚»ãƒ¼ã‚¸ã¯,リソースã§é¸ã°ã‚ŒãŸãƒ­ã‚±ãƒ¼ãƒ«æ¯Žã?メãƒ?‚»ãƒ¼ã‚¸ã«??
503             * MessageFormat#format ã§ãƒ•ォーマットã™ã‚‹äº‹ã«ã‚ˆã‚Š,作æ?ã•れã¾ã™ã?
504             * メãƒ?‚»ãƒ¼ã‚¸ãŒãƒªã‚½ãƒ¼ã‚¹ã«å­˜åœ¨ã—ãªã??åˆã?,キーを返ã—ã¾ã™ã?
505             *
506             * @og.rev 4.0.0.0 (2007/10/18) メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã¨ã®çµ±åˆåŒ–ã«ã‚ˆã‚Šå»?­¢
507             *
508             * @param       key キー
509             *
510             * @return      メãƒ?‚»ãƒ¼ã‚¸(ç„¡ã‘れ㰠キー)
511             */
512    //      public String getMessage( final String key ) {
513    //              return getMessage( key,null );
514    //      }
515    
516            /**
517             * æŒ?®šã?キーã®ãƒ¡ãƒ?‚»ãƒ¼ã‚¸ãƒ??タオブジェクトを返ã—ã¾ã™ã?
518             *
519             * ã“ã?メãƒ?‚»ãƒ¼ã‚¸ã‚ªãƒ–ジェクトã?,メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹ã‚ˆã‚Šä½œæ?ã•れã?
520             * オリジナルã®ãƒ¡ãƒ?‚»ãƒ¼ã‚¸ãƒ??タオブジェクãƒ?
521             * メãƒ?‚»ãƒ¼ã‚¸ãƒ??タオブジェクトãŒå­˜åœ¨ã—ãªã??åˆã?,nullã‚’è¿”ã—ã¾ã™ã?
522             *
523             * @og.rev 4.0.0.0 (2007/10/17) DBColumn ã® official属æ?追åŠ?
524             * @og.rev 4.0.0.0 (2007/10/17) メãƒ?‚»ãƒ¼ã‚¸ãƒªã‚½ãƒ¼ã‚¹çµ±åˆã«ä¼´ã?»?­¢
525             *
526             * @param       key キー
527             *
528             * @return      メãƒ?‚»ãƒ¼ã‚¸ãƒ??ã‚¿(ç„¡ã‘れ㰠null)
529             */
530    //      public MessageData getMessageData( final String key ) {
531    //              return messageLoader.getMessageData( key );
532    //      }
533    
534            /**
535             * ログインユーザーã§ä½¿ç”¨ã™ã‚‹ç”»é¢ã‚ªãƒ–ジェクトをã€UserInfoã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?
536             * å??UserInfo ã¯ã€è?åˆ??身ãŒä½¿ç”¨ã™ã‚‹ ç”»é¢ã‚ªãƒ–ジェクトã?ã¿ã‚’管ç?™ã‚‹ã“ã¨ã§ã€?
537             * ç”»é¢ã‚¢ã‚¯ã‚»ã‚¹æœ‰ç„¡ã‚’ã?ã™ã?ã‚?検索ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã?
538             *
539             * @og.rev 3.1.0.1 (2003/03/26) GUIInfo ã®ã‚­ãƒ¼é ?‚µãƒã?トã?為ã«ã€å¼•数追åŠ??
540             * @og.rev 4.0.0.0 (2005/01/31) 使用画é¢ã®Map ã‚?UserInfo ã«ã‚»ãƒ?ƒˆã—ã¾ã™ã?
541             * @og.rev 4.3.0.0 (2008/07/04) ロールモードã?ルãƒå¯¾å¿?
542             * @og.rev 5.2.0.0 (2010/09/01) ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚ˆã‚‹ä¸æ­£ã‚¢ã‚¯ã‚»ã‚¹é˜²æ­¢æ©Ÿè?追åŠ?
543             *
544             * @param       user    æŒ?®šã?ユーザーロールã«å¯¾å¿œã™ã‚‹ç”»é¢ã?‘ã‚’Mapã«ã‚»ãƒ?ƒˆã™ã‚‹ã€?
545             */
546            public void makeGUIInfos( final UserInfo user ) {
547                    GUIData[] guiDatas = guiLoader.getAllData();
548    //              String[] userRoles = StringUtil.csv2Array( user.getRoles(),HybsSystem.GUI_DELIMITER );
549    
550                    // guikey ã«å¯¾ã—ã¦ãƒ¦ãƒ‹ã?クã«ãªã‚‹ã‚ˆã?« Map ã«è¿½åŠ?—ã¾ã™ã?後登録ãŒå„ªå…ˆã•れã¾ã™ã?
551                    Map<String,GUIInfo> guiMap = new HashMap<String,GUIInfo>();
552                    Set<String> forbidAddrSet = new HashSet<String>();
553                    int size = guiDatas.length;
554                    for( int i=0; i<size; i++ ) {
555                            GUIData gui = guiDatas[i];
556    //                      if( user.isRoot() || gui.isAccess( userRoles ) ) {
557                            byte bitMode = user.getAccessBitMode( gui.getRoleMode() );
558                            if(  bitMode > 0 ) {
559                                    String    guikey        = gui.getGuiKey();
560                                    LabelData labelData = getLabelData( gui.getLabelClm() );
561    //                              byte      bitMode       = gui.getAccessBitMode( userRoles,user.isRoot() );
562                                    guiMap.put( guikey,new GUIInfo( gui,labelData,bitMode ) );
563                            }
564                            // 5.2.0.0 (2010/09/01) ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚ˆã‚‹ä¸æ­£ã‚¢ã‚¯ã‚»ã‚¹é˜²æ­¢æ©Ÿè?追åŠ?
565                            else {
566                                    String addr = gui.getAddress();
567                                    if( addr.indexOf( '/' ) < 0 ) {
568                                            forbidAddrSet.add( addr );
569                                    }
570                            }
571                    }
572    
573                    // ã‚‚ã—ã€ç¦æ­¢ãƒªã‚¹ãƒˆã?中ã«ç”»é¢IDé•ã„ã§è¨±å¯ãƒªã‚¹ãƒˆã¨åŒã˜ã‚¢ãƒ‰ãƒ¬ã‚¹ã?
574                    // å«ã¾ã‚Œã¦ã?‚‹å ´åˆã?ã€ç¦æ­¢ãƒªã‚¹ãƒˆä¸­ã‹ã‚‰è©²å½“ã?アドレスを削除ã™ã‚‹ã€?
575                    for( GUIInfo gui : guiMap.values() ) {
576                            String addr = gui.getAddress();
577                            if( forbidAddrSet.contains( gui.getAddress() ) ) {
578                                    forbidAddrSet.remove( addr );
579                            }
580                    }
581    
582                    // GUIInfo ã‚’ãã®é ?•ª(SEQNOé ?ã§ã‚½ãƒ¼ãƒˆã—ç›´ã—ã¾ã™ã?
583                    GUIInfo[] guiInfos = guiMap.values().toArray( new GUIInfo[ guiMap.size() ] ) ;
584                    Arrays.sort( guiInfos );
585                    Map<String,GUIInfo> sortMap = new LinkedHashMap<String,GUIInfo>();
586                    size = guiInfos.length;
587                    for( int i=0; i<size; i++ ) {
588                            GUIInfo guiInfo = guiInfos[i];
589                            String guikey   = guiInfo.getKey();
590                            sortMap.put( guikey,guiInfo );
591                    }
592    
593                    user.setGUIMap( sortMap, forbidAddrSet );
594            }
595    
596            /**
597             * æŒ?®šã•れãŸã‚¯ã‚¨ãƒªã‚’発行ã—ã€ãƒ©ãƒ™ãƒ«ãƒžãƒƒãƒ—を作æ?ã—ã¾ã™ã?
598             *
599             * @og.rev 4.3.4.0 (2008/12/01) æ–°è¦ä½œæ?
600             *
601             * @param       query   ラベルマップを作æ?ã™ã‚‹ã‚¯ã‚¨ãƒª
602             *
603             * @return      ラベルマッ�
604             * @see org.opengion.hayabusa.resource.LabelDataLoader#getLabelMap( String )
605             */
606            public Map<String, LabelData> getLabelMap( final String query ) {
607                    return labelLoader.getLabelMap( query );
608            }
609    
610            /**
611             * リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’キーã«åŸºã¥ã?¦éƒ¨åˆ?‚¯ãƒªã‚¢ã—ã¾ã™ã?
612             * ã“ã“ã§ã¯ã€?ƒ¨åˆ?‚¯ãƒªã‚¢ãªãŸã‚ã€GUIData ã«é–¢ã—ã¦ã¯ã€å?ç?•れã¾ã›ã‚“ã€?
613             * ã¾ãŸã?存在ã—ãªã?‚­ãƒ¼ã‚’指定ã•れãŸãƒªã‚½ãƒ¼ã‚¹ã¯ã€ä½•も処ç?•れã¾ã›ã‚“ã€?
614             *
615             * @og.rev 5.4.3.4 (2012/01/12) labelPool ã®å‰Šé™¤è¿½åŠ?
616             *
617             * @param   key         カラ�?キー
618             */
619            public void clear( final String key ) {
620                    System.out.println( "Key=[" + key + "] ã®éƒ¨åˆ?ƒªã‚½ãƒ¼ã‚¹ã‚¯ãƒªã‚¢ã‚’実施ã—ã¾ã—ãŸã€? );
621                    columnLoader.clear( key );
622                    codeLoader.clear( key );
623                    labelLoader.clear( key );
624    //              messageLoader.clear( key ); 4.0.0.0(2007/10/17)
625                    columnPool.remove( key );
626    //              labelPool.remove( key );        // 5.4.3.4 (2012/01/12)
627            }
628    
629            /**
630             * GUIæƒ??をクリアã—ã¾ã™ã?
631             * ã“ã“ã§ã¯ã€?–¢é€£ã™ã‚‹ãƒ©ãƒ™ãƒ«ã€ã‚³ãƒ¼ãƒ‰ãƒªã‚½ãƒ¼ã‚¹ã®éƒ¨åˆ?‚¯ãƒªã‚¢ã‚‚行ã„ã¾ã™ã?
632             * GUIæƒ??ã¯ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã«ç®¡ç?—ã¦ã?‚‹ãŸã‚ã€ã“ã®å‡¦ç?¼‘回ã”ã¨ã«ã€?
633             * GUIData ã‚’å?ä»¶å†èª­ã¿è¾¼ã¿ã‚’行ã„ã¾ã™ã?ã§ã€ã”注æ„ãã?•ã??
634             *
635             */
636            public void guiClear() {
637                    GUIData[] gui = guiLoader.getAllData();
638    
639                    for( int i=0; i<gui.length; i++ ) {
640                            String key = gui[i].getGuiKey();
641                            labelLoader.clear( key );
642                    }
643                    codeLoader.clear( "CLASSIFY" );
644                    guiLoader.clear();
645            }
646    
647            /**
648             * リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’クリア(åˆæœŸåŒ?ã—ã¾ã™ã?
649             *
650             * @og.rev 5.4.3.4 (2012/01/12) labelPool ã®å‰Šé™¤è¿½åŠ?
651             *
652             */
653            public void clear() {
654                    columnLoader.clear();
655                    codeLoader.clear();
656                    labelLoader.clear();
657    //              messageLoader.clear(); 4.0.0.0(2007/10/17)
658                    guiLoader.clear();
659                    columnPool.clear();
660    //              labelPool.clear();;             // 5.4.3.4 (2012/01/12)
661            }
662    }