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    }