Start making the component system more dynamic
[lgpl/argeo-commons.git] / org.argeo.enterprise / src / org / argeo / util / register / StaticRegister.java
index 0c55bddb2dda02eab787fc822aec1345d7835102..c186aff08fdf49714ccc38584e739160a14a75de 100644 (file)
@@ -2,16 +2,44 @@ package org.argeo.util.register;
 
 import java.util.HashSet;
 import java.util.IdentityHashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
 
 /** A minimal component register. */
 public class StaticRegister {
        private final static AtomicBoolean started = new AtomicBoolean(false);
        private final static IdentityHashMap<Object, Component<?>> components = new IdentityHashMap<>();
 
+       public static Consumer<Component<?>> asConsumer() {
+               return (c) -> registerComponent(c);
+       }
+
+//     public static BiFunction<Class<?>, Predicate<Map<String, Object>>, Component<?>> asProvider() {
+//
+//     }
+
+       static synchronized <T> Component<? extends T> find(Class<T> clss, Predicate<Map<String, Object>> filter) {
+               Set<Component<? extends T>> result = new HashSet<>();
+               instances: for (Object instance : components.keySet()) {
+                       if (!clss.isAssignableFrom(instance.getClass()))
+                               continue instances;
+                       Component<? extends T> component = (Component<? extends T>) components.get(instance);
+
+                       // TODO filter
+                       if (component.isPublishedType(clss))
+                               result.add(component);
+               }
+               if (result.isEmpty())
+                       return null;
+               return result.iterator().next();
+
+       }
+
        static synchronized void registerComponent(Component<?> component) {
                if (started.get()) // TODO make it really dynamic
                        throw new IllegalStateException("Already activated");
@@ -62,4 +90,8 @@ public class StaticRegister {
                }
        }
 
+       synchronized static void clear() {
+               components.clear();
+       }
+
 }