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 }