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}