001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.resource;
017
018import java.util.Arrays;
019import java.util.Collections;
020import java.util.HashMap;
021import java.util.HashSet;
022import java.util.LinkedHashMap;
023import java.util.Map;
024import java.util.Set;
025
026import org.opengion.fukurou.util.ErrMsg;
027import org.opengion.fukurou.util.StringUtil;
028import org.opengion.hayabusa.common.HybsSystem;
029import org.opengion.hayabusa.db.DBColumn;
030import 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 * の3つのプロパティーファイルを内部に持っており,それぞれのメソッドにより,
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 * 3通り考えられます。
063 * 1つ目は、毎回 要求が発生する毎に CodeSelection を作成し、プールしていきます。こうすることで、
064 * 初めて使用されたときだけオブジェクト化されますので、メモリの節約が可能です。ただし、
065 * プールにヒットしなかった場合は、やはりリソースから検索しますので、元々ヒットしない
066 * キーに対しては、毎回リソースを検索するため、非効率です。
067 * 2つめは、元々ヒットしないキーに対して、NullCodeSelectionオブジェクトを登録しておくことで、
068 * プールにため込んで行くと言う方法です。この場合は、シングルトーンにしてメモリを節約しますが、
069 * それでもプール自体の容量は、確保しておく必要があります。
070 * 3つめは、この ResourceManager がインスタンス化されるときに、すべての CodeSelectionオブジェクトを
071 * あらかじめ プールしておく方法です。使わない CodeSelection もインスタンス化する変わりに、
072 * キャッシュにヒットしない場合は、即 CodeSelection が存在しないと判断できるため、
073 * もっともパフォーマンスが高くなります。
074 * 本 ResourceManager の実装は、3つめの、あらかじめ、すべてをキャッシュしておく方法を
075 * 採用しています。
076 *
077 * @og.group リソース管理
078 *
079 * @version  4.0
080 * @author       Kazuhiko Hasegawa
081 * @since    JDK5.0,
082 */
083public 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         *      システムIDと言語コードを指定して,生成します。
104         *
105         * @param       systemId システムID
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     カラムID
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     カラムID
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  カラムID
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         * 第2引数に、true をセットします。
207         *
208         * @og.rev 5.4.3.4 (2012/01/12) 新規追加
209         *
210         * @param       key  カラムID
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情報は、シーケンスに管理しているため、この処理1回ごとに、
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}