|
|
@@ -13,7 +13,9 @@ import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.ServiceLoader;
|
|
|
import java.util.WeakHashMap;
|
|
|
+import net.ranides.assira.collection.map.Cache;
|
|
|
|
|
|
/**
|
|
|
* Klasa zarządzająca cyklem wyszukiwania, ładowania i dostępem do poszczególnych
|
|
|
@@ -31,7 +33,7 @@ public final class ConfigManager {
|
|
|
|
|
|
private ConfigManager() { /* utility class */ }
|
|
|
|
|
|
- private static final Map<String, ConfigFactory> factories = Collections.synchronizedMap(new WeakHashMap<String, ConfigFactory>());
|
|
|
+ private static final Cache<String, ConfigFactory> FACTORIES = new Cache<String, ConfigFactory>();
|
|
|
|
|
|
private static final Map<String, Configuration> content = Collections.synchronizedMap(new WeakHashMap<String, Configuration>());
|
|
|
|
|
|
@@ -69,12 +71,12 @@ public final class ConfigManager {
|
|
|
if( !content.containsKey(key) ) {
|
|
|
Configuration value;
|
|
|
if(urls.containsKey(key)) {
|
|
|
- value = factories.get(factory).getInstance(name, urls.get(key));
|
|
|
+ value = getFactory(factory).getInstance(name, urls.get(key));
|
|
|
} else
|
|
|
if(files.containsKey(key)) {
|
|
|
- value = factories.get(factory).getInstance(name, files.get(key));
|
|
|
+ value = getFactory(factory).getInstance(name, files.get(key));
|
|
|
} else {
|
|
|
- value = factories.get(factory).getInstance(name);
|
|
|
+ value = getFactory(factory).getInstance(name);
|
|
|
}
|
|
|
content.put(key, value.load() );
|
|
|
return value;
|
|
|
@@ -82,6 +84,19 @@ public final class ConfigManager {
|
|
|
return content.get(name);
|
|
|
}
|
|
|
|
|
|
+ private static ConfigFactory getFactory(String name) {
|
|
|
+ if( FACTORIES.containsKey(name) ) {
|
|
|
+ return FACTORIES.get(name);
|
|
|
+ }
|
|
|
+ for(ConfigFactory item : ServiceLoader.load(ConfigFactory.class) ) {
|
|
|
+ if( name.equals(item.getName()) ) {
|
|
|
+ FACTORIES.put(name, item);
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw new ConfigException("ConfigFactory not found: " + name);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Zwraca listę konfiguracji przyporządkowanych do danej fabryki.
|
|
|
* @param factory
|
|
|
@@ -105,7 +120,7 @@ public final class ConfigManager {
|
|
|
* @param factory
|
|
|
*/
|
|
|
public static void registerFactory(String name, ConfigFactory factory) {
|
|
|
- factories.put(name, factory);
|
|
|
+ FACTORIES.put(name, factory);
|
|
|
}
|
|
|
|
|
|
public static void bind(String fqname, File file) {
|