|
@@ -1,146 +0,0 @@
|
|
|
-/*
|
|
|
|
|
- * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
|
|
- * @copyright Ranides Atterwim
|
|
|
|
|
- * @license WTFPL
|
|
|
|
|
- * @url http://ranides.net/projects/assira
|
|
|
|
|
- */
|
|
|
|
|
-
|
|
|
|
|
-package net.ranides.assira.config;
|
|
|
|
|
-
|
|
|
|
|
-import java.io.File;
|
|
|
|
|
-import java.net.URL;
|
|
|
|
|
-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
|
|
|
|
|
- * konfiguracji. Dzięki menagerowi nie musimy w aplikacji tworzyć globalnie
|
|
|
|
|
- * dostępnych instancji - każdy moduł może zażądać udostępnienia odpowiedniej
|
|
|
|
|
- * konfiguracji na podstawie typu oraz abstrakcyjnej nazwy.
|
|
|
|
|
- *
|
|
|
|
|
- * <p>
|
|
|
|
|
- * Klasa zarządza również zarejestrowanymi fabrykami, obsługującymi różne formaty
|
|
|
|
|
- * konfiguracyjne.
|
|
|
|
|
- * </p>
|
|
|
|
|
- * @author ranides
|
|
|
|
|
- */
|
|
|
|
|
-public final class ConfigManager {
|
|
|
|
|
-
|
|
|
|
|
- private ConfigManager() { /* utility class */ }
|
|
|
|
|
-
|
|
|
|
|
- private static final Cache<String, ConfigFactory> FACTORIES = new Cache<String, ConfigFactory>();
|
|
|
|
|
-
|
|
|
|
|
- private static final Map<String, Configuration> content = Collections.synchronizedMap(new WeakHashMap<String, Configuration>());
|
|
|
|
|
-
|
|
|
|
|
- private static final Map<String, URL> urls = Collections.synchronizedMap(new WeakHashMap<String, URL>());
|
|
|
|
|
-
|
|
|
|
|
- private static final Map<String, File> files = Collections.synchronizedMap(new WeakHashMap<String, File>());
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * Zwraca konfigurację o podanej nazwie oraz typie.
|
|
|
|
|
- * Zwrócona konfiguracja jest załadowana. Jeśli wskazana konfiguracja została już
|
|
|
|
|
- * załadowana do pamięci wcześnej, operacja nie jest powtarzana. Metoda może być
|
|
|
|
|
- * wywoływana wielokrotnie bez negatywnego wpływu na wydajność.
|
|
|
|
|
- * @param fqname "factory:name"
|
|
|
|
|
- * @return
|
|
|
|
|
- */
|
|
|
|
|
- public static Configuration getInstance(String fqname) {
|
|
|
|
|
- String[] params = fqname.split("[ ]*:[ ]*");
|
|
|
|
|
- if(params.length != 2) {
|
|
|
|
|
- throw new IllegalArgumentException("Illegal name of configuration: " + fqname);
|
|
|
|
|
- }
|
|
|
|
|
- return getInstance(params[0], params[1]);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * Zwraca konfigurację o podanej nazwie oraz typie.
|
|
|
|
|
- * Zwrócona konfiguracja jest załadowana. Jeśli wskazana konfiguracja została już
|
|
|
|
|
- * załadowana do pamięci wcześnej, operacja nie jest powtarzana. Metoda może być
|
|
|
|
|
- * wywoływana wielokrotnie bez negatywnego wpływu na wydajność.
|
|
|
|
|
- * @param factory
|
|
|
|
|
- * @param name
|
|
|
|
|
- * @return
|
|
|
|
|
- */
|
|
|
|
|
- private static Configuration getInstance(String factory, String name) {
|
|
|
|
|
- String key = factory + ":" + name;
|
|
|
|
|
- if( !content.containsKey(key) ) {
|
|
|
|
|
- Configuration value;
|
|
|
|
|
- if(urls.containsKey(key)) {
|
|
|
|
|
- value = getFactory(factory).getInstance(name, urls.get(key));
|
|
|
|
|
- } else
|
|
|
|
|
- if(files.containsKey(key)) {
|
|
|
|
|
- value = getFactory(factory).getInstance(name, files.get(key));
|
|
|
|
|
- } else {
|
|
|
|
|
- value = getFactory(factory).getInstance(name);
|
|
|
|
|
- }
|
|
|
|
|
- content.put(key, value.load() );
|
|
|
|
|
- return value;
|
|
|
|
|
- }
|
|
|
|
|
- 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
|
|
|
|
|
- * @return
|
|
|
|
|
- */
|
|
|
|
|
- public static List<String> getAvailableNames(String factory) {
|
|
|
|
|
- final String prefix = factory+":";
|
|
|
|
|
- final List<String> result = new ArrayList<String>(16);
|
|
|
|
|
- for(String key : urls.keySet()) {
|
|
|
|
|
- if(key.startsWith(prefix)) { result.add(key); }
|
|
|
|
|
- }
|
|
|
|
|
- for(String key : files.keySet()) {
|
|
|
|
|
- if(key.startsWith(prefix)) { result.add(key); }
|
|
|
|
|
- }
|
|
|
|
|
- return result;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /**
|
|
|
|
|
- * Rejestruje nową fabrykę konfiguracji.
|
|
|
|
|
- * @param name
|
|
|
|
|
- * @param factory
|
|
|
|
|
- */
|
|
|
|
|
- public static void registerFactory(String name, ConfigFactory factory) {
|
|
|
|
|
- FACTORIES.put(name, factory);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void bind(String fqname, File file) {
|
|
|
|
|
- if(urls.containsKey(fqname)) {
|
|
|
|
|
- throw new IllegalStateException(fqname + " is already binded to URI: " + urls.get(fqname));
|
|
|
|
|
- }
|
|
|
|
|
- if(files.containsKey(fqname)) {
|
|
|
|
|
- throw new IllegalStateException(fqname + " is already binded to file: " + files.get(fqname));
|
|
|
|
|
- }
|
|
|
|
|
- files.put(fqname, file);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- public static void bind(String fqname, URL url) {
|
|
|
|
|
- if(urls.containsKey(fqname)) {
|
|
|
|
|
- throw new IllegalStateException(fqname + " is already binded to URI: " + urls.get(fqname));
|
|
|
|
|
- }
|
|
|
|
|
- if(files.containsKey(fqname)) {
|
|
|
|
|
- throw new IllegalStateException(fqname + " is already binded to file: " + files.get(fqname));
|
|
|
|
|
- }
|
|
|
|
|
- urls.put(fqname, url);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
-}
|
|
|