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        // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseDiamondOperator 対応
046        private static final Map<String,HybsLoader> LOADER_MAP = Collections.synchronizedMap( new LinkedHashMap<>( SIZE*2,0.75f,true ) {                // アクセス順
047                private static final long serialVersionUID = 643320160304L ;
048                /**
049                 * このマップが一番古いエントリを削除するはずの場合にtrueを返します。
050                 *
051                 * @og.rev 6.4.3.3 (2016/03/04) キャッシュを、世代交代のWeakHashMapから、LinkedHashMap(固定容量) に変更します。
052                 *
053                 * @param       eldest  もっとも以前にマップに挿入されたエントリ
054                 *
055                 * @return      もっとも古いエントリをマップから削除すべき場合はtrue。そのエントリを保持すべき場合はfalse
056                 */
057                @Override
058                protected boolean removeEldestEntry( final Map.Entry<String,HybsLoader> eldest ) {
059                        return size() > SIZE;
060                }
061        } );
062
063        /**
064         * デフォルトコンストラクターをprivateにして、
065         * オブジェクトの生成をさせないようにする。
066         */
067        private HybsLoaderFactory() {}
068
069        /**
070         * HybsLoaderオブジェクトを取得します。
071         *
072         * @og.rev 6.4.3.1 (2016/02/12) Collections.synchronizedMap に置き換え。
073         * @og.rev 6.4.3.3 (2016/03/04) Map#computeIfAbsent で対応する。
074         *
075         * @param option HybsLoaderを生成するための設定情報
076         *
077         * @return HybsLoaderオブジェクト
078         */
079        public static HybsLoader getLoader( final HybsLoaderConfig option ) {
080                // Map#computeIfAbsent : 戻り値は、既存の、または計算された値。追加有り、置換なし、削除なし
081                return LOADER_MAP.computeIfAbsent( option.getSrcDir() , k -> new HybsLoader( option ) );
082        }
083}