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