    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 * の３つのプロパティーファイルを内部に持っており,それぞれのメソッドにより，
    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 */
    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         *      システムＩＤと言語コードを指定して,生成します。
    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     カラム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         * 第２引数に、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情報は、シーケンスに管理しているため、この処理１回ごとに、
    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}