    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 */
    016package org.opengion.hayabusa.db;
    017
    018import org.opengion.hayabusa.common.HybsSystem ;
    019import org.opengion.hayabusa.common.HybsSystemException ;
    020import org.opengion.hayabusa.common.SystemManager ;
    021import org.opengion.hayabusa.resource.CodeData;
    022import org.opengion.fukurou.util.Cleanable;
    023
    024import java.util.Map;
    025import java.util.WeakHashMap ;
    026
    027/**
    028 * Selectionオブジェクトを取得する為に使用するファクトリクラスです。
    029 *
    030 * Selectionオブジェクト のキー(codeName)を元に、オブジェクトをキャッシュ管理
    031 * することが、主な機能です。
    032 *
    033 * @og.rev 3.5.5.7 (2004/05/10) 新規作成
    034 * @og.group 選択データ制御
    035 *
    036 * @version  4.0
    037 * @author   Kazuhiko Hasegawa
    038 * @since    JDK5.0,
    039 */
    040public final class SelectionFactory {
    041        // private static final Map<String,Selection>  codeMap = new WeakHashMap<String,Selection>();
    042        private static final Map<String,Selection>      dbMap           = new WeakHashMap<String,Selection>( HybsSystem.BUFFER_SMALL );
    043        private static final Map<String,Selection>      dbRadioMap      = new WeakHashMap<String,Selection>( HybsSystem.BUFFER_SMALL ); // 4.3.3.6 (2008/11/15)
    044
    045        // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
    046        static {
    047                Cleanable clr = new Cleanable() {
    048                        public void clear() {
    049                                SelectionFactory.clear();
    050                        }
    051                };
    052
    053                SystemManager.addCleanable( clr );
    054        }
    055
    056        /**
    057         *  デフォルトコンストラクターをprivateにして、
    058         *  オブジェクトの生成をさせないようにする。
    059         *
    060         */
    061        private SelectionFactory() {}
    062
    063        /**
    064         * DB検索(SQL)文字列より、データベースSelectionオブジェクトを構築します。
    065         * Selection_DB では、検索行毎のクエリーがあるため、name + query でキャッシュします。
    066         *
    067         * @og.rev 4.0.0.0 (2006/11/15) lang 属性を追加します。
    068         *
    069         * @param   query DB検索(SQL)文字列
    070         * @param       dbid  データベース接続先ID
    071         * @param       lang  リソースを使用する場合の言語
    072         *
    073         * @return  Selectionオブジェクト
    074         */
    075        public static Selection newDBSelection( final String query,final String dbid,final String lang ) {
    076                String key = query+dbid+lang;
    077                Selection select = dbMap.get( key );
    078
    079                if( select == null || select.isTimeOver() ) {
    080                        synchronized( dbMap ) {
    081                                select = new Selection_DB( query,dbid,lang );
    082                                dbMap.put( key,select );
    083                        }
    084                }
    085                return select;
    086        }
    087
    088        /**
    089         * DB検索(SQL)文字列より、データベースSelectionオブジェクトを構築します。
    090         * Selection_DB では、検索行毎のクエリーがあるため、name + query でキャッシュします。
    091         *
    092         * @og.rev 4.3.3.6 (2008/11/15) 新規作成
    093         *
    094         * @param   query DB検索(SQL)文字列
    095         * @param       dbid  データベース接続先ID
    096         * @param       lang  リソースを使用する場合の言語
    097         *
    098         * @return  Selectionオブジェクト
    099         */
    100        public static Selection newDBRadioSelection( final String query,final String dbid,final String lang ) {
    101                String key = query+dbid+lang;
    102                Selection select = dbRadioMap.get( key );
    103
    104                if( select == null || select.isTimeOver() ) {
    105                        synchronized( dbRadioMap ) {
    106                                select = new Selection_DBRADIO( query,dbid,lang );
    107                                dbRadioMap.put( key,select );
    108                        }
    109                }
    110                return select;
    111        }
    112
    113        /**
    114         * 各種Selectionオブジェクトを構築します。
    115         * ここでは、Selectionオブジェクトのタイプが、(KEYVAL,HM,NUM,YMD)について作成されます。
    116         * ここで作成されるオブジェクトは、この、SelectionFactoryではキャッシュしません。
    117         * 各RendererやEditorが共有されているので、そちらでキャッシュされています。
    118         * type が指定のキーワード以外の場合は、Exception が返されます。
    119         * ※ type="NULL" も使用可能です。これは、どんな場合でも、引数の param を返す Selection
    120         * オブジェクトを返します。内部的に、CodeDataが存在しない場合など、エラーメッセージを
    121         * 引数に与えて修正を促すようなケースで使用します。
    122         *
    123         * ※ 指定のタイプが存在しない場合、HybsSystemException が throw されます。
    124         *
    125         * @og.rev 5.7.3.0 (2014/02/07) 新規作成
    126         *
    127         * @param   type  Selectionオブジェクトのタイプ(KEYVAL,HM,NUM,YMD)
    128         * @param       param パラメータ
    129         *
    130         * @return  Selectionオブジェクト
    131         */
    132        public static Selection newSelection( final String type,final String param ) {
    133                Selection select = null;
    134                if( "KEYVAL".equalsIgnoreCase( type ) ) {
    135                        select = new Selection_KEYVAL( param );
    136                }
    137                else if( "HM".equalsIgnoreCase( type ) ) {
    138                        select = new Selection_HM( param );
    139                }
    140                else if( "NUM".equalsIgnoreCase( type ) ) {
    141                        select = new Selection_NUM( param );
    142                }
    143                else if( "YMD".equalsIgnoreCase( type ) ) {
    144                        select = new Selection_YMD( param );
    145                }
    146                else if( "NULL".equalsIgnoreCase( type ) ) {
    147                        select = new Selection_NULL( param );
    148                }
    149                else {
    150                        select = new Selection_NULL( param );
    151                        String errMsg = "指定のタイプ[" + type + "]が、存在しません。タイプ一覧=[KEYVAL,HM,NUM,YMD]" + HybsSystem.CR ;
    152                        throw new HybsSystemException( errMsg );
    153                }
    154
    155                return select;
    156        }
    157
    158        /**
    159         * 各種Selectionオブジェクトを構築します。
    160         * ここでは、Selectionオブジェクトのタイプが、(MENU,RADIO)について作成されます。
    161         * ここで作成されるオブジェクトは、この、SelectionFactoryではキャッシュしません。
    162         * 各RendererやEditorが共有されているので、そちらでキャッシュされています。
    163         * type が指定のキーワード以外の場合は、Exception が返されます。
    164         * codeData オブジェクトが null の場合は、Selectionオブジェクト は null が返されます。
    165         *
    166         * ※ 指定のタイプが存在しない場合、HybsSystemException が throw されます。
    167         *
    168         * @og.rev 5.7.3.0 (2014/02/07) 新規作成
    169         *
    170         * @param   type  Selectionオブジェクトのタイプ(MENU,RADIO)
    171         * @param       codeData CodeDataオブジェクト
    172         *
    173         * @return  Selectionオブジェクト
    174         */
    175        public static Selection newSelection( final String type,final CodeData codeData ) {
    176                Selection select = null;
    177                if( codeData != null ) {
    178                        if( "MENU".equalsIgnoreCase( type ) ) {
    179                                select = new Selection_CODE( codeData );
    180                        }
    181                        else if( "RADIO".equalsIgnoreCase( type ) ) {
    182                                select = new Selection_RADIO( codeData );
    183                        }
    184                        else {
    185                                String errMsg = "指定のタイプ[" + type + "]が、存在しません。タイプ一覧=[MENU,RADIO]" + HybsSystem.CR ;
    186                                throw new HybsSystemException( errMsg );
    187                        }
    188                }
    189
    190                return select;
    191        }
    192
    193        /**
    194         * Selectionオブジェクトをプールからすべて削除します。
    195         * システム全体を初期化するときや、動作が不安定になったときに行います。
    196         * プールの方法自体が,一種のキャッシュ的な使いかたしかしていない為,
    197         * 実行中でも、いつでもプールを初期化できます。
    198         *
    199         * @og.rev 4.3.3.6 (2008/11/15) DBRadioMap追加
    200         */
    201        public static void clear() {
    202                // synchronized( codeMap ) { codeMap.clear(); }
    203                synchronized( dbMap   ) { dbMap.clear(); }
    204                synchronized( dbRadioMap ) { dbRadioMap.clear(); } // 4.3.3.6 (2008/11/15)
    205        }
    206}