001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.hayabusa.resource;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.fukurou.util.ApplicationInfo;
020    import org.opengion.fukurou.db.DBUtil;
021    
022    import java.util.Map;
023    import java.util.WeakHashMap;
024    import java.util.Collections ;
025    
026    /**
027     * systemId に対応したカラ?ータを作?する??タロードクラスです?
028     *
029     * カラ?ータは??目(CLM)に対して、各種カラ?報を持って?す?
030     * エンジン?で使用して? DBColumn オブジェクト?、RENDERER ?EDITOR など
031     * 実際にはオブジェクトで管?て?すが、この ColumnData では、それらのキーとな?
032     * ??を持って?す?実際に DBColumn オブジェクト?構築時に、各属?オブジェクトを
033     * 生?(また?、キャ?ュから取り出?ます?
034     *
035     * カラ?ータを作?する場合?、同?ラ?、作?区?KBSAKU)違いの場合??
036     * ?大きな作?区?持つコードを使用します?
037     * 作?区?KBSAKU)='0' の??タは、?スタリソースとして、エンジンとともに
038     * 配?れるリソースになります?
039     *
040     * カラ?ータには?つのレベルのオブジェクト作?方法が適用されます?
041     * エンジン?のカラ?ソースファイル(org.opengion.hayabusa.common.data.ColumnResource)は?
042     * 初期作?されるカラ?ソースです?エンジンの更新に対応して、このリソースも同時に
043     * 更新されます?こ?カラ??、最も優先?位?低いリソースで、同?ー??で他?形式?
044     * カラ?あれば、そちらが使用されます?
045     *
046     * 読込フラグ(FGLOAD)='1'のカラ?ソースは、すべて初期起動時に?読み込みされます?
047     * 読込フラグが?'1' 以外???タは、?期起動時には、メモリにキャ?ュされ?
048     * 実際に使用されるまで、オブジェクトが作?されません?
049     * これは、使用されるかど?判らな?ラ?ータを?予め作?しな?とで、メモリの
050     * ??図って?す?
051     *
052     * SYSTEM_ID='**' は、?通リソースです?
053     * これは、シス?間で共通に使用されるリソース??を登録しておきます?
054     *
055     * @og.rev 4.0.0.0 (2004/12/31) 新規作?
056     * @og.group リソース管?
057     *
058     * @version  4.0
059     * @author   Kazuhiko Hasegawa
060     * @since    JDK5.0,
061     */
062    final class ColumnDataLoader {
063            // リソースの接続?を?取得します?
064            private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );
065    
066            // ??リソースの初期?読込のクエリー
067     //private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
068     //                                                                     + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
069     //                                                                     + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
070     //                                                                     + " from GEA03 where SYSTEM_ID in ( ?,'**')"
071     //                                                                     + " and FGJ='1' and FGLOAD = '1'"
072     //                                                                     + " order by SYSTEM_ID,CLM,KBSAKU" ;
073    
074            // 4.3.5.7 (2009/03/22) FGLOADの影響で個別シス?のリソースが読まれな?題?対?
075            private static final String QUERY = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
076                                                                            + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
077                                                                            + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES,"
078                                                                            + "FGLOAD"
079                                                                            + " from GEA03 where SYSTEM_ID in ( ?,'**')"
080                                                                            + " and FGJ='1'"
081                                                                            + " order by SYSTEM_ID,CLM,KBSAKU" ;
082    
083            // ??リソースの個別読込時?クエリー
084            private static final String QUERY2 = "select CLM,CLS_NAME,USE_LENGTH,VIEW_LENGTH,"
085                                                                            + "RENDERER,EDITOR,DBTYPE,DATA_DEFAULT,LABEL_CLM,CODE_CLM,"
086                                                                            + "CLM_PARAM,RENDERER_PARAM,EDITOR_PARAM,TYPE_PARAM,ROLES"
087                                                                            + " from GEA03 where SYSTEM_ID in ( ?,'**')"
088                                                                            + " and CLM=? and FGJ='1'"
089                                                                            + " order by SYSTEM_ID,KBSAKU" ;
090    
091            private final Map<String,ColumnData> pool = Collections.synchronizedMap( new WeakHashMap<String,ColumnData>() );    // キャ?ュ用プ?ル
092            private final String  SYSTEM_ID ;               // シス?ID
093    
094            /** コネクションにアプリケーション??を追記するかど???*/
095            public static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
096    
097            // 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
098            private final ApplicationInfo appInfo;
099    
100            /**
101             *  SystemId 毎に ファクトリオブジェクトを作?します?
102             *
103             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
104             *
105             * @param systemId シス?ID
106             * @param initLoad リソース??タの先読み可否(true:先読みする)
107             */
108            ColumnDataLoader( final String systemId,final boolean initLoad ) {
109                    SYSTEM_ID = systemId;
110    
111                    // 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
112                    if( USE_DB_APPLICATION_INFO ) {
113                            appInfo = new ApplicationInfo();
114                            // ユーザーID,IPアドレス,ホスト名
115                            appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
116                            // 画面ID,操?プログラ?D
117                            appInfo.setModuleInfo( "ColumnDataLoader",null,null );
118                    }
119                    else {
120                            appInfo = null;
121                    }
122    
123                    // ApplicationInfo の設定が終わってから実行します?
124                    if( initLoad ) { loadDBResource(); }
125            }
126    
127            /**
128             * ??リソースより カラ?ータを取得?設定します?
129             * 同?ー(CLM)に対して、?の作?区?KBSAKU)を持つ??タ?
130             * 検索される?合?、作?区?KBSAKU)の大きな値が使用されます?
131             * つまり?より、ローカライズなキーほど、作?区?KBSAKU)に大きな値?
132             * 使用するようにします?
133             *
134             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
135             * @og.rev 4.3.5.7 (2009/03/22) FGLOADの影響でシス?個別リソースが読まれな?題対?
136             *
137             */
138            private void loadDBResource() {
139                    String[] args = new String[] { SYSTEM_ID };
140    
141                    String[][] vals = DBUtil.dbExecute( QUERY,args,appInfo,DBID );
142    
143                    int len = vals.length;
144                    for( int i=0; i<len; i++ ) {
145                            if( "1".equals( vals[i][ColumnData.FG_LOAD] ) ) { // 4.3.5.7 (2009/03/22)
146                                    pool.put( vals[i][0],new ColumnData( vals[i] ) );
147                            }
148                            // より上?作?区?、FGLOAD='0'(個別読込)が来た?合?、下位?FGLOAD='1'(?読込)を??
149                            else if( pool.get( vals[i][0]) != null ){
150                                    pool.remove( vals[i][0] );
151                            }
152                    }
153    
154                    System.out.println( "  ColumnDataLoader [" + len + "] loaded" );
155            }
156    
157            /**
158             * ColumnData オブジェクトを取得します?
159             * 作?したColumnDataオブジェクト???部にプ?ルしておき?同じリソース要求が
160             * あったとき???ールの ColumnDataを返します?
161             * 読込フラグ(FGLOAD)?'1' の??タは、起動時に先読みします?
162             * それ以外???タは、ここでキー要求が発生した時点で読み込みます?
163             * 読込フラグ(FGLOAD) のマ?カー設定モー?useAutoSetting)を使用する(true)場合??
164             * 追?み込み(先読みされて??ラ?に対して、読込フラグ(FGLOAD)?'2' に
165             * 自動設定します?(次回起動時の、?期読み込みは行いません?
166             *
167             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得?為,ApplicationInfoオブジェクトを設?
168             *
169             * @param   key         カラ??キー
170             *
171             * @return  ColumnData  カラ?ブジェク?
172             */
173            public ColumnData getColumnData( final String key ) {
174                    ColumnData column = pool.get( key ) ;
175                    if( column == null ) {
176                            String[] args = new String[] { SYSTEM_ID,key };
177                            String[][] vals = DBUtil.dbExecute( QUERY2,args,appInfo,DBID );         // 個別検索
178    
179                            if( vals.length > 0 ) {
180                                    column = new ColumnData( vals[vals.length-1] );         // ??検索結果が有効
181                                    pool.put( key,column );
182                            }
183                    }
184    
185                    return column ;
186            }
187    
188            /**
189             * ColumnData オブジェクト?キャ?ュを?別にクリアします?
190             * リソース??タの更新など、???更新時に、すべてのキャ?ュ?
191             * 破?る?ではなく?????み破?きる機?です?
192             *
193             * @param   key         カラ??キー
194             */
195            public void clear( final String key ) {
196                    pool.remove( key );
197            }
198    
199            /**
200             * ColumnData オブジェクト?キャ?ュをクリアします?
201             *
202             */
203            public void clear() {
204                    pool.clear();
205            }
206    }