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 java.util.concurrent.ConcurrentMap;                                      // 6.4.3.3 (2016/03/04)
019import java.util.concurrent.ConcurrentHashMap;                          // 6.4.3.1 (2016/02/12) refactoring
020import java.util.Locale ;
021
022import org.opengion.hayabusa.common.HybsSystem;
023import org.opengion.hayabusa.common.SystemManager;
024import org.opengion.fukurou.util.Cleanable;
025
026/**
027 * DBCellRenderer/DBCellEditor オブジェクトを取得する為に使用するファクトリクラスです。
028 *
029 *  DBCell オブジェクト の識別ID を元に、DBCellFactory.newInstance( String id )
030 * メソッドで、DBCell オブジェクトを取得します。
031 *
032 * @og.group データ表示
033 * @og.group データ編集
034 *
035 * @version  4.0
036 * @author   Kazuhiko Hasegawa
037 * @since    JDK5.0,
038 */
039public final class DBCellFactory {
040        private static final String DEFAULT_RENDERER    = "LABEL";
041        private static final String DEFAULT_EDITOR              = "TEXT";
042        /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */
043        private static final ConcurrentMap<String,CellRenderer> REN_MAP = new ConcurrentHashMap<>();    // 6.4.1.1 (2016/01/16) rMap → REN_MAP refactoring
044        /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */
045        private static final ConcurrentMap<String,CellEditor>   EDT_MAP = new ConcurrentHashMap<>();    // 6.4.1.1 (2016/01/16) eMap → EDT_MAP refactoring
046
047        // 4.0.0 (2005/01/31) Cleanable インターフェースによる初期化処理
048        static {
049                final Cleanable clr = new Cleanable() {
050                        /**
051                         * 初期化(クリア)します。
052                         * 主に、キャッシュクリアで利用します。
053                         */
054                        public void clear() {
055                                DBCellFactory.clear();
056                        }
057                };
058
059                SystemManager.addCleanable( clr );
060        }
061
062        /**
063         * デフォルトコンストラクターをprivateにして、
064         * オブジェクトの生成をさせないようにする。
065         *
066         */
067        private DBCellFactory() {
068        }
069
070        /**
071         * 識別id に応じた DBCell オブジェクトを取得します。
072         *
073         * @og.rev 2.1.2.1 (2002/11/27) id が指定されていない場合の デフォルトを指定するように変更。
074         * @og.rev 3.1.1.1 (2003/04/03) DBCell のファクトリクラスに DBColumn オブジェクトを渡す。
075         * @og.rev 3.1.2.1 (2003/04/10) synchronized の方法を修正。
076         * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。
077         * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、Renderer. から、Renderer_ に変更します。
078         * @og.rev 6.0.4.0 (2014/11/28) NullPointerException が発生するので、事前にチェックします。
079         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
080         * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。
081         *
082         * @param   id DBCell インターフェースを実装したサブクラスの識別id
083         * @param       clm     DBColumnオブジェクト
084         *
085         * @return  DBCellオブジェクト
086         * @og.rtnNotNull
087         */
088        public static CellRenderer newRenderer( final String id,final DBColumn clm ) {
089                final String type = id == null ? DEFAULT_RENDERER : id.toUpperCase(Locale.JAPAN) ;
090
091                // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし
092                final CellRenderer cell = REN_MAP.computeIfAbsent( type ,k -> HybsSystem.newInstance( "Renderer_" , k ) );
093
094                return cell.newInstance( clm );
095        }
096
097        /**
098         * 識別id に応じた DBCell オブジェクトを取得します。
099         *
100         * @og.rev 2.1.2.1 (2002/11/27) id が指定されていない場合の デフォルトを指定するように変更。
101         * @og.rev 3.1.1.1 (2003/04/03) DBCell のファクトリクラスに DBColumn オブジェクトを渡す。
102         * @og.rev 3.1.2.1 (2003/04/10) synchronized の方法を修正。
103         * @og.rev 3.5.6.0 (2004/06/18) 各種プラグイン関連付け設定を、システムパラメータ に記述します。
104         * @og.rev 4.0.0.0 (2005/01/31) キーの指定を、Editor. から、Editor_ に変更します。
105         * @og.rev 6.0.4.0 (2014/11/28) NullPointerException が発生するので、事前にチェックします。
106         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
107         * @og.rev 6.4.3.3 (2016/03/04) HybsSystem.newInstance(String,String) への置き換え。
108         *
109         * @param   id DBCell インターフェースを実装したサブクラスの識別id
110         * @param       clm     DBColumnオブジェクト
111         *
112         * @return  DBCellオブジェクト
113         * @og.rtnNotNull
114         */
115        public static CellEditor newEditor( final String id,final DBColumn clm ) {
116                final String type = id == null ? DEFAULT_EDITOR : id.toUpperCase(Locale.JAPAN) ;
117
118                // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし
119                return EDT_MAP.computeIfAbsent( type , k -> HybsSystem.newInstance( "Editor_" , k ) ).newInstance( clm );
120        }
121
122        /**
123         * DBCell オブジェクトをプールからすべて削除します。
124         * システム全体を初期化するときや、動作が不安定になったときに行います。
125         * プールの方法自体が一種のキャッシュ的な使いかたしかしていない為、
126         * 実行中でも、いつでもプールを初期化できます。
127         *
128         * @og.rev 3.1.1.1 (2003/04/03) キャッシュクリアメソッドを新規追加。
129         * @og.rev 3.1.2.1 (2003/04/10) synchronized の方法を修正。
130         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。
131         */
132        public static void clear() {
133                REN_MAP.clear();
134                EDT_MAP.clear();
135        }
136}