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 }