(no commit message)
[utils] / support / inject / src / main / java / org / wamblee / inject / InjectorFactoryBuilder.java
index d8190919db6a0ca2f2e0163b541521b3edf55a04..197311a8b262927ee39d9b45e6a9fcea79940217 100644 (file)
@@ -20,19 +20,56 @@ import java.util.ServiceLoader;
 
 /**
  * Utility for obtaining an implementation of the {@link InjectorFactory} using
- * {@link ServiceLoader}.
+ * {@link ServiceLoader} and for obtaining a {@link SimpleInjector}. 
+ * 
+ * The builder takes care that the factory and simple injector are built only once. 
+ * For test code, make sure to call {@link #setInjectorFactory(InjectorFactory)}
+ * before each test case to force the retrieval of a new factory and injector. This 
+ * is important because if the simple injector is not created again it will use 
+ * cached {@link Injector} instances from other tests. 
  * 
  * @author Erik Brakkee
  */
 public class InjectorFactoryBuilder {
 
+    private static InjectorFactory FACTORY;
+    
+    private static SimpleInjector INJECTOR; 
+
     /**
-     * Gets the injector factory by using the first one found using 
-     * {@link ServiceLoader}. 
+     * Sets the injector factory. This is useful for testing. 
+     * @param aFactory Factory to use. 
+     */
+    public static void setInjectorFactory(InjectorFactory aFactory) {
+        FACTORY = aFactory;
+        INJECTOR = new SimpleInjector(aFactory);
+    }
+
+    /**
+     * Gets the injector factory by using the first one found using
+     * {@link ServiceLoader}.
      * 
-     * @return InjectorFactory. 
+     * @return InjectorFactory.
      */
     public static InjectorFactory getInjectorFactory() {
+        if (FACTORY == null) {
+            FACTORY = findInjectorFactory(); 
+            INJECTOR = new SimpleInjector(FACTORY);
+        }
+        return FACTORY;
+    }
+    
+    public static SimpleInjector getInjector() { 
+        getInjectorFactory();
+        return INJECTOR;
+    }
+
+    /**
+     * Finds the injector factory musing <code>ServiceLoader</code>
+     * 
+     * @return InjectorFactory.
+     */
+    private static InjectorFactory findInjectorFactory() {
         ServiceLoader<InjectorFactory> factories = ServiceLoader
             .load(InjectorFactory.class);
         try {