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    }