    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( 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}