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}