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.fukurou.util;
017
018import java.util.Map;
019import java.util.Collections;                                                   // 6.4.1.1 (2016/01/16)
020import java.util.LinkedHashMap;                                                 // 6.4.3.3 (2016/03/04)
021
022/**
023 * HybsLoaderを生成するためのファクトリクラスです。
024 * HybsLoaderは、ソースディレクトリをキーとして、キャッシュされます。
025 *
026 * @og.rev 5.1.1.0 (2009/12/01) 新規作成
027 * @og.rev 6.4.3.3 (2016/03/04) キャッシュを、WeakHashMapから、LinkedHashMap(固定容量) に変更します。
028 * @og.group 業務ロジック
029 *
030 * @version 5.0
031 * @author Hiroki Nakamura
032 * @since JDK1.6,
033 */
034public final class HybsLoaderFactory {
035        private static final int SIZE = 1000;           // 6.4.3.3 (2016/03/04) 固定容量の指定。
036
037        /**
038         * LinkedHashMap は、反復順序を持つMapインタフェースで、データ件数を固定に設定します。
039         * ここでは、マップに新しいマッピングが追加されると、自動的に古いマッピングを削除するポリシーを
040         * 適用するために、removeEldestEntry(Map.Entry)メソッドをオーバーライドしています。
041         * 古いマッピングの定義は、コンストラクタの、順序付けモードで指定でき、アクセス順ならtrue、挿入順ならfalse です。
042         * ここでは、固定の個数分だけ、キャッシュし、あふれた古い分は、順次キャッシュから追い出されていきます。
043         * Collections.synchronizedMap で、同期処理を行います。
044         */
045        private static final Map<String,HybsLoader> LOADER_MAP = Collections.synchronizedMap( new LinkedHashMap<String,HybsLoader>( SIZE*2,0.75f,true ) {               // アクセス順
046                private static final long serialVersionUID = 643320160304L ;
047                /**
048                 * このマップが一番古いエントリを削除するはずの場合にtrueを返します。
049                 *
050                 * @og.rev 6.4.3.3 (2016/03/04) キャッシュを、世代交代のWeakHashMapから、LinkedHashMap(固定容量) に変更します。
051                 *
052                 * @param       eldest  もっとも以前にマップに挿入されたエントリ
053                 *
054                 * @return      もっとも古いエントリをマップから削除すべき場合はtrue。そのエントリを保持すべき場合はfalse
055                 */
056                @Override
057                protected boolean removeEldestEntry( final Map.Entry<String,HybsLoader> eldest ) {
058                        return size() > SIZE;
059                }
060        } );
061
062        /**
063         * オブジェクトの生成を禁止します。
064         */
065        private HybsLoaderFactory() {}
066
067        /**
068         * HybsLoaderオブジェクトを取得します。
069         *
070         * @og.rev 6.4.3.1 (2016/02/12) Collections.synchronizedMap に置き換え。
071         * @og.rev 6.4.3.3 (2016/03/04) Map#computeIfAbsent で対応する。
072         *
073         * @param option HybsLoaderを生成するための設定情報
074         *
075         * @return HybsLoaderオブジェクト
076         */
077        public static HybsLoader getLoader( final HybsLoaderConfig option ) {
078                // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし
079                return LOADER_MAP.computeIfAbsent( option.getSrcDir() , k -> new HybsLoader( option ) );
080        }
081}