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.hayabusa.common.SystemManager;
020 import org.opengion.fukurou.db.DBUtil;
021 import org.opengion.fukurou.util.Cleanable;
022 import org.opengion.fukurou.util.ApplicationInfo;
023
024 import java.util.Map;
025 import java.util.WeakHashMap;
026
027 /**
028 * 事業æ‰?CDJGS) , 年æœ?YYYYMM) に対応した休日カレンãƒ?ƒ‡ータを作æ?するファクトリクラスですã?
029 *
030 * カレンãƒ?ƒ‡ータはã€?¼‘日(DY1)?ž31日(DY31)までの日付けæ¬?�«対してã€?:平日 1:休日 とã�?�†
031 * ãƒ??タを持ってã�?�¾すã?実際には、å?部では true:平日 false:休日 とã�?�†持ち方をしますã?
032 * (カレンãƒ?¼¤?¢は、文字å?ですが、å?部で持つ場合ã?、数字で管ç�?�—てã�?�¾すã?)
033 *
034 * 通常のカレンãƒ?�§は、月毎にã€??’月は、年によって)æœ?¤§日付けが変わりますã?
035 * これは、カレンãƒ?ƒ‡ータクラスとしてはã€?1 を設定しておきますã?
036 *
037 * カレンãƒ?ƒ‡ータにはã€?¼“つのレベルのオブジェクト作æ?方法が適用されますã?
038 * 他ã?リソースの?“つのレベルとは異なりã?エンジンリソースからの読み取りは
039 * 存在しなくã?第?”ã?方法がåŠ?‚�った事によりã€?¼“つの方法になってã�?�¾すã?
040 *
041 * まずã?読込フラグ(FGLOAD)='1'のカレンãƒ?ƒ‡ータは、このCalendarFactoryオブジェクトが
042 * 構築された時に、すべてキャãƒ?‚·ュとしてå†?ƒ¨メモリに読み取りますã?
043 * 読込フラグがã?'1' 以外ã?ãƒ??タは、å?期起動時には、メモリにキャãƒ?‚·ュされã�?
044 * 実際に使用されるまで、オブジェクトが作æ?されませんã€?
045 * カレンãƒ??場合ã?過去の使用される可能性が低いãƒ??タまで、キャãƒ?‚·ュしなã�?§˜にã€?
046 * こã?フラグを使用して、メモリのç¯?´?‚’図ることが可能になりますã?
047 *
048 * 読込フラグ(FGLOAD)自動設定機è?を使用すれば、読み取ったラベルãƒ??タに対してã€?
049 * 読込フラグ(FGLOAD)に '1' をè?動的にセãƒ?ƒˆしますã?こã?機è?により、ä¸?º¦でã‚?
050 * 読み取ったことがあるデータに '1' を付け、次回起動時には、メモリキャãƒ?‚·ュさせã‚?
051 * 事と、ä¸?º¦も読み取ってã�?�ªã�?ƒ‡ータを判別して、データ削除等ã?メンãƒ?ƒŠンスに
052 * 使用することが可能ですã?
053 * カレンãƒ?�«限定すれã?、当面使用されなã�??のカレンãƒ??‘年åˆ?�ªど)を登録する時にã€?
054 * 読込フラグ(FGLOAD)='0' にしておけば、実際に読み取られるまで、メモリキャãƒ?‚·ュ
055 * されなã�?�Ÿめã?さらにメモリ効çŽ?�Œ向上しますã?
056 *
057 * ?’つめã?方法ã?、キャãƒ?‚·ュに存在しなã�??合ã?ã€?¼¤?¢から読み取りますã?
058 *
059 * ?“つめã?、カレンãƒ?‰¹有ã?方法でã€?¼¤?¢にãƒ??タが存在しなã�??合ã?設定ですã?
060 * これは、カレンãƒ?ƒ†ーブル未設定時でもã?カレンãƒ?�¨して使用できるように
061 * 自動的にカレンãƒ?ƒ‡ータを作æ?しますã?日曜日を休日として自動設定しますã?
062 *
063 * @og.rev 3.6.0.0 (2004/09/17) 新規作æ?
064 * @og.group リソース管ç�?
065 *
066 * @version 4.0
067 * @author Kazuhiko Hasegawa
068 * @since JDK5.0,
069 */
070 public final class CalendarFactory {
071 private static final Map<String,CalendarData> pool = new WeakHashMap<String,CalendarData>(); // 4.0.0 (2005/01/31)
072 private static final Map<String,CalendarQuery> queryClassPool = new WeakHashMap<String,CalendarQuery>(); // 4.0.0 (2005/01/31)
073 // 4.0.0.0 PGカレンãƒ??の初期設定をシスãƒ?ƒ リソースに変更
074 // private static final CalendarData PG_CALENDAR_DATA = new CalendarPGData();
075 private static CalendarData pgCalData = null;
076 private static final String PG_CALENDAR_DATA_CLASS = HybsSystem.sys( "DEFAULT_CALENDAR_CLASS");
077 private static final Object lock = new Object();
078
079 // カレンãƒ?¼¤?¢の接続å?をã?取得しますã?
080 private static final String DBID = HybsSystem.sys( "RESOURCE_CALENDAR_DBID" );
081
082 // カレンãƒ?¼¤?¢を使用するかどã�?�‹を指定しますã?(互換モーãƒ?
083 private static boolean useDB = HybsSystem.sysBool( "USE_CALENDAR_DATABASE" );
084
085 // 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
086 private static final ApplicationInfo appInfo;
087
088 // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化å?ç�?
089 static {
090 Cleanable clr = new Cleanable() {
091 public void clear() {
092 CalendarFactory.clear();
093 }
094 };
095
096 SystemManager.addCleanable( clr );
097
098 /** コネクションにアプリケーションæƒ??を追記するかどã�?�‹æŒ?®?*/
099 boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
100
101 // 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
102 if( USE_DB_APPLICATION_INFO ) {
103 String SYSTEM_ID = HybsSystem.sys( "SYSTEM_ID" );
104 appInfo = new ApplicationInfo();
105 // ユーザーID,IPアドレス,ホスト名
106 appInfo.setClientInfo( SYSTEM_ID,HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME );
107 // 画面ID,操ä½?プログラãƒ?D
108 appInfo.setModuleInfo( "CalendarFactory",null,null );
109 }
110 else {
111 appInfo = null;
112 }
113 }
114
115 /**
116 * コンストラクタ
117 * ファクトリクラスの為、private 化してã�?�¾すã?
118 *
119 */
120 private CalendarFactory() { }
121
122 /**
123 * CalendarData オブジェクトを取得しますã?
124 * 作æ?したCalendarDataオブジェクトã??Œå?部にプã?ルしておき?Œ同じリソース要求が
125 * あったときã??Œã?ールの CalendarDataを返しますã?
126 * ?¤?¢にãƒ??タが存在しなã�??合ã?、è?動でカレンãƒ?‚’作æ?しますã?
127 *
128 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
129 * @og.rev 4.0.0.0 (2007/08/29) カレンãƒ??ãƒ??ブルが存在しなã�??合ã?ãƒ?ƒ•ォルトã?カレンãƒ??ãƒ??タをシスãƒ?ƒ リソースで設定すã‚?
130 *
131 * @param cls CalendarQueryオブジェクトを名称を指定しますã?
132 * @param arg1 ãƒ??タベã?ス検索時ã?第?‘引数
133 * @param arg2 ãƒ??タベã?ス検索時ã?第?’引数
134 * @param arg3 ãƒ??タベã?ス検索時ã?第?“引数
135 * @param arg4 ãƒ??タベã?ス検索時ã?第?”引数
136 *
137 * @return CalendarDataオブジェクãƒ?
138 */
139 public static CalendarData getCalendarData( final String cls,final String arg1,final String arg2,final String arg3,final String arg4 ) {
140
141 // 4.0.0.0 PGカレンãƒ??の初期設定をシスãƒ?ƒ リソースに変更
142 synchronized( lock ) {
143 if(pgCalData == null) {
144 pgCalData = (CalendarData)HybsSystem.newInstance(PG_CALENDAR_DATA_CLASS);
145 }
146 }
147
148 // if( ! useDB || cls == null ) { return PG_CALENDAR_DATA; }
149 if( ! useDB || cls == null ) { return pgCalData; }
150
151 CalendarData calData ;
152
153 String key = cls + ":" + arg1 + ":" + arg2 + ":" + arg3 + ":" + arg4 ;
154 synchronized( lock ) {
155 calData = pool.get( key ) ;
156 }
157
158 if( calData == null ) {
159 CalendarQuery query ;
160 synchronized( lock ) {
161 query = queryClassPool.get( cls );
162 if( query == null ) {
163 String queryClass = HybsSystem.sys( "CalendarQuery_" + cls );
164 query = (CalendarQuery)HybsSystem.newInstance( queryClass );
165 queryClassPool.put( cls,query );
166 }
167 }
168
169 String[] args = query.checkArgment( arg1,arg2,arg3,arg4 );
170 String[][] vals = DBUtil.dbExecute( query.getQuery(),args,appInfo,DBID ); // 3.8.7.0 (2006/12/15)
171 boolean isFlat = query.isFlatTable();
172
173 if( vals != null && vals.length > 0 ) {
174 calData = new CalendarDBData( vals,isFlat );
175 // 完å?同期ではなã�??DB処ç�?¸に別にã‚?B処ç�?‚’行いã€?
176 // 先に put されたとしてもã?同ä¸?‚ーに同じ属æ?のオブジェクトを
177 // 登録するã�?�‘なので、実質çš?�ª問題ã?発生しなã�??
178 // これがã?List などのé ?º�が関係すると、このコードã?使えなã�??
179 synchronized( lock ) {
180 pool.put( key,calData );
181 }
182 }
183 else {
184 // カレンãƒ?ƒ†ーブルにãƒ??タが存在しなã�??合ã?
185 // 4.0.0.0 PGカレンãƒ??の初期設定をシスãƒ?ƒ リソースに変更
186 // calData = PG_CALENDAR_DATA;
187 calData = pgCalData;
188 }
189 }
190 return calData ;
191 }
192
193 /**
194 * キャãƒ?‚·ュ(プã?ル)から、すべてのオブジェクトをクリアしますã?
195 *
196 */
197 public static void clear() {
198 synchronized( lock ) {
199 pool.clear();
200 queryClassPool.clear();
201 useDB = HybsSystem.sysBool( "USE_CALENDAR_DATABASE" );
202 }
203 }
204 }