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]
