ソースを参照

* konfiguracja do poprawy orientacja na ServiceLoader

Ranides Atterwim 13 年 前
コミット
937b5b21c5

+ 3 - 0
src/main/java/net/ranides/assira/config/ConfigFactory.java

@@ -17,6 +17,8 @@ import java.net.URL;
  */
 public interface ConfigFactory {
     
+    String getName();
+    
     /**
      * Tworzy nową instancję fabryki o podanej nazwie
      * @param name
@@ -28,6 +30,7 @@ public interface ConfigFactory {
      * Tworzy nową instancję fabryki o podanej nazwie
      * @param name
      * @return
+     * @todo (ranides) wypieprzyć te file i url. Niech to jakoś sobie fabryka z nazwy wyciąga... ;o
      */
     Configuration getInstance(String name, File file);
     

+ 20 - 5
src/main/java/net/ranides/assira/config/ConfigManager.java

@@ -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) {

+ 2 - 1
src/main/java/net/ranides/assira/config/JSONConfiguration.java

@@ -72,7 +72,8 @@ public class JSONConfiguration extends AbstractConfiguration {
         }
     }
     
-    public static class Factory implements ConfigFactory {
+    // @todo (ranides) to też jest popsute...
+    public static abstract class Factory implements ConfigFactory {
 
         @Override
         public Configuration getInstance(String name) {

+ 7 - 2
src/test/java/net/ranides/assira/config/JSONConfigurationTest.java

@@ -25,8 +25,13 @@ public class JSONConfigurationTest {
     @Test
     public void testSimpleRW() throws IOException {
         File file = FileHelper.createTempFile(".example.json", JSONConfiguration.class);
-        ConfigManager.registerFactory("temp", new JSONConfiguration.Factory());
-        ConfigManager.bind("temp:example", file);
+        ConfigManager.registerFactory("test", new JSONConfiguration.Factory(){
+            @Override
+            public String getName() {
+                return "test";
+            }
+        });
+        ConfigManager.bind("test:example", file);
         
         Configuration source = new JSONConfiguration("example", file);