This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 53b864cd85bd7581b7e4ace5439a924b5e2ec1d8
Author: Benoit Tellier <[email protected]>
AuthorDate: Tue Oct 22 01:11:03 2019 +0200

    JAMES-2866 Create a single child injector for extensions
    
     - Extensions SINGLETON bindings are preserved
     - Performance enhancement
---
 .../org/apache/james/utils/GuiceGenericLoader.java | 26 +++++++++-------------
 .../apache/james/utils/GuiceMailetLoaderTest.java  |  2 --
 2 files changed, 11 insertions(+), 17 deletions(-)

diff --git 
a/server/container/guice/guice-utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java
 
b/server/container/guice/guice-utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java
index 1163907..97bdb1d 100644
--- 
a/server/container/guice/guice-utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java
+++ 
b/server/container/guice/guice-utils/src/main/java/org/apache/james/utils/GuiceGenericLoader.java
@@ -36,7 +36,6 @@ import com.google.inject.util.Modules;
 
 public class GuiceGenericLoader {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GuiceGenericLoader.class);
-    private static final Module NO_CHILD_MODULE = binder -> { };
 
     @VisibleForTesting
     public static GuiceGenericLoader forTesting(ExtendedClassLoader 
extendedClassLoader) {
@@ -47,19 +46,16 @@ public class GuiceGenericLoader {
         private final Injector injector;
         private final ExtendedClassLoader extendedClassLoader;
         private final NamingScheme namingSheme;
-        private final Module childModule;
 
-        private InvocationPerformer(Injector injector, ExtendedClassLoader 
extendedClassLoader, NamingScheme namingSheme, Module childModule) {
+        private InvocationPerformer(Injector injector, ExtendedClassLoader 
extendedClassLoader, NamingScheme namingSheme) {
             this.injector = injector;
             this.extendedClassLoader = extendedClassLoader;
             this.namingSheme = namingSheme;
-            this.childModule = childModule;
         }
 
         public T instantiate(ClassName className) throws 
ClassNotFoundException {
             Class<T> clazz = locateClass(className, namingSheme);
-            return injector.createChildInjector(childModule)
-                .getInstance(clazz);
+            return injector.getInstance(clazz);
         }
 
         private Class<T> locateClass(ClassName className, NamingScheme 
namingScheme) throws ClassNotFoundException {
@@ -88,35 +84,35 @@ public class GuiceGenericLoader {
 
     private final Injector injector;
     private final ExtendedClassLoader extendedClassLoader;
-    private final Module additionalExtensionBindings;
 
     @Inject
     public GuiceGenericLoader(Injector injector, ExtendedClassLoader 
extendedClassLoader, ExtensionConfiguration extensionConfiguration) {
-        this.injector = injector;
+
         this.extendedClassLoader = extendedClassLoader;
 
-        this.additionalExtensionBindings = 
Modules.combine(extensionConfiguration.getAdditionalGuiceModulesForExtensions()
+        Module additionalExtensionBindings = 
Modules.combine(extensionConfiguration.getAdditionalGuiceModulesForExtensions()
             .stream()
-            .map(Throwing.function(this::<Module>instantiateNoChildModule))
+            .map(Throwing.<ClassName, Module>function(className -> 
instantiateNoChildModule(injector, className)))
             .peek(module -> LOGGER.info("Enabling injects contained in " + 
module.getClass().getCanonicalName()))
             .collect(Guavate.toImmutableList()));
+        this.injector = 
injector.createChildInjector(additionalExtensionBindings);
     }
 
-    private  <T> T instantiateNoChildModule(ClassName className) throws 
ClassNotFoundException {
-        return new InvocationPerformer<T>(injector, extendedClassLoader, 
NamingScheme.IDENTITY, NO_CHILD_MODULE)
+    private <T> T instantiateNoChildModule(Injector injector, ClassName 
className) throws ClassNotFoundException {
+        return new InvocationPerformer<T>(injector, extendedClassLoader, 
NamingScheme.IDENTITY)
             .instantiate(className);
     }
 
     public <T> T instantiate(ClassName className) throws 
ClassNotFoundException {
-        return new InvocationPerformer<T>(injector, extendedClassLoader, 
NamingScheme.IDENTITY, additionalExtensionBindings)
+        return new InvocationPerformer<T>(injector, extendedClassLoader, 
NamingScheme.IDENTITY)
             .instantiate(className);
     }
 
     public <T> InvocationPerformer<T> withNamingSheme(NamingScheme 
namingSheme) {
-        return new InvocationPerformer<>(injector, extendedClassLoader, 
namingSheme, additionalExtensionBindings);
+        return new InvocationPerformer<>(injector, extendedClassLoader, 
namingSheme);
     }
 
     public <T> InvocationPerformer<T> withChildModule(Module childModule) {
-        return new InvocationPerformer<>(injector, extendedClassLoader, 
NamingScheme.IDENTITY, Modules.combine(additionalExtensionBindings, 
childModule));
+        return new 
InvocationPerformer<>(injector.createChildInjector(childModule), 
extendedClassLoader, NamingScheme.IDENTITY);
     }
 }
diff --git 
a/server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMailetLoaderTest.java
 
b/server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMailetLoaderTest.java
index e261c1a..43c2434 100644
--- 
a/server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMailetLoaderTest.java
+++ 
b/server/container/guice/mailet/src/test/java/org/apache/james/utils/GuiceMailetLoaderTest.java
@@ -33,7 +33,6 @@ import org.apache.mailet.Mailet;
 import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailContext;
 import org.apache.mailet.base.test.FakeMailetConfig;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -185,7 +184,6 @@ public class GuiceMailetLoaderTest {
         assertThatCode(() -> 
mailet.service(FakeMail.defaultFakeMail())).doesNotThrowAnyException();
     }
 
-    @Ignore("JAMES-2866 singleton are not shared between extensions")
     @Test
     public void allMailetsShouldShareTheSameSingleton() throws Exception {
         GuiceGenericLoader genericLoader = new GuiceGenericLoader(


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to