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 d5f0072f5de20a986cdb70cbecb7c91ed6b1b16d Author: Benoit Tellier <[email protected]> AuthorDate: Sun Nov 17 21:02:51 2019 +0700 [Refactoring] MockProtocolHandlerLoader should rely on Guice --- server/protocols/protocols-library/pom.xml | 5 + .../lib/mock/MockProtocolHandlerLoader.java | 112 +++++++-------------- server/protocols/protocols-pop3/pom.xml | 5 + .../apache/james/pop3server/POP3ServerTest.java | 16 +-- server/protocols/protocols-smtp/pom.xml | 5 + .../apache/james/smtpserver/SMTPServerTest.java | 30 +++--- 6 files changed, 72 insertions(+), 101 deletions(-) diff --git a/server/protocols/protocols-library/pom.xml b/server/protocols/protocols-library/pom.xml index f5f8692..1ba9320 100644 --- a/server/protocols/protocols-library/pom.xml +++ b/server/protocols/protocols-library/pom.xml @@ -62,6 +62,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>io.netty</groupId> <artifactId>netty</artifactId> </dependency> diff --git a/server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerLoader.java b/server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerLoader.java index d0fa6fe..cb56515 100644 --- a/server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerLoader.java +++ b/server/protocols/protocols-library/src/test/java/org/apache/james/protocols/lib/mock/MockProtocolHandlerLoader.java @@ -1,31 +1,57 @@ package org.apache.james.protocols.lib.mock; -import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import javax.inject.Inject; -import javax.inject.Named; import org.apache.commons.configuration2.Configuration; -import org.apache.james.metrics.api.MetricFactory; -import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.protocols.api.handler.ProtocolHandler; import org.apache.james.protocols.lib.handler.ProtocolHandlerLoader; +import com.google.common.collect.ImmutableList; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.Module; + public class MockProtocolHandlerLoader implements ProtocolHandlerLoader { + public static class Builder { + private final ImmutableList.Builder<Module> modules; + + private Builder() { + modules = ImmutableList.builder(); + } + + public <T, U extends T> Builder put(Module module) { + modules.add(module); + return this; + } + + public MockProtocolHandlerLoader build() { + return new MockProtocolHandlerLoader(Guice.createInjector(modules.build())); + } + } + + public static Builder builder() { + return new Builder(); + } + + private final Injector injector; + private final List<Object> loaderRegistry = new ArrayList<>(); + + private MockProtocolHandlerLoader(Injector injector) { + this.injector = injector; + } + @Override public ProtocolHandler load(String name, Configuration config) throws LoadingException { try { - ProtocolHandler obj = create(name); - injectResources(obj); + Class<?> aClass = Thread.currentThread().getContextClassLoader().loadClass(name); + ProtocolHandler obj = (ProtocolHandler) injector.getInstance(aClass); postConstruct(obj); init(obj, config); synchronized (this) { @@ -37,32 +63,6 @@ public class MockProtocolHandlerLoader implements ProtocolHandlerLoader { } } - private final Map<String, Object> servicesByName = new HashMap<>(); - private final Map<Class<?>, Object> servicesByType = new HashMap<>(); - - public Object get(String name) { - return servicesByName.get(name); - } - - public Object get(Class<?> type) { - return servicesByType.get(type); - } - - public <T, U extends T> void put(String role, Class<T> serviceType, U instance) { - servicesByName.put(role, instance); - servicesByType.put(serviceType, instance); - } - - private final List<Object> loaderRegistry = new ArrayList<>(); - - protected ProtocolHandler create(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { - try { - return (ProtocolHandler) Thread.currentThread().getContextClassLoader().loadClass(className).newInstance(); - } catch (InstantiationException e) { - return (ProtocolHandler) Thread.currentThread().getContextClassLoader().loadClass(className).getConstructor(MetricFactory.class).newInstance(new NoopMetricFactory()); - } - } - /** * Dispose all loaded instances by calling the method of the instances which * is annotated with @PreDestroy @@ -102,43 +102,6 @@ public class MockProtocolHandlerLoader implements ProtocolHandlerLoader { } } - private void injectResources(Object resource) { - final Method[] methods = resource.getClass().getMethods(); - for (Method method : methods) { - final Inject injectAnnotation = method.getAnnotation(Inject.class); - if (injectAnnotation != null) { - Object service = null; - String name = null; - Annotation[][] paramAnnotations = method.getParameterAnnotations(); - if (paramAnnotations.length == 1) { - if (paramAnnotations[0].length == 1) { - if (paramAnnotations[0][0].annotationType().equals(Named.class)) { - name = ((Named) paramAnnotations[0][0]).value(); - } - } - } - if (name != null) { - // Name indicates a service - service = get(name); - } - Class<?>[] parameterTypes = method.getParameterTypes(); - if (parameterTypes.length == 1) { - service = get(parameterTypes[0]); - } - if (service != null) { - try { - Object[] args = { service }; - method.invoke(resource, args); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource " + service, e); - } - } else { - throw new RuntimeException("Injection failed for object " + resource + " on method " + method + " with resource name " + name + ", because no mapping was found"); - } - } - } - } - private void init(Object resource, Configuration config) throws IllegalAccessException, InvocationTargetException { Method[] methods = resource.getClass().getMethods(); for (Method method : methods) { @@ -154,9 +117,4 @@ public class MockProtocolHandlerLoader implements ProtocolHandlerLoader { && method.getParameterTypes().length == 1 && method.getParameterTypes()[0].equals(Configuration.class); } - - public Object getObjectForName(String name) { - return get(name); - } - } diff --git a/server/protocols/protocols-pop3/pom.xml b/server/protocols/protocols-pop3/pom.xml index c0a384b..60c797e 100644 --- a/server/protocols/protocols-pop3/pom.xml +++ b/server/protocols/protocols-pop3/pom.xml @@ -94,6 +94,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <scope>test</scope> diff --git a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java index 00d6d96..b07fee9 100644 --- a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java +++ b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java @@ -55,6 +55,8 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; +import com.google.inject.name.Names; + public class POP3ServerTest { private static final DomainList NO_DOMAIN_LIST = null; @@ -716,9 +718,6 @@ public class POP3ServerTest { } protected void setUpServiceManager() throws Exception { - protocolHandlerChain = new MockProtocolHandlerLoader(); - protocolHandlerChain.put("usersrepository", UsersRepository.class, usersRepository); - mailboxManager = InMemoryIntegrationResources.builder() .authenticator((userid, passwd) -> { try { @@ -737,12 +736,13 @@ public class POP3ServerTest { .storeQuotaManager() .build() .getMailboxManager(); - - protocolHandlerChain.put("mailboxmanager", MailboxManager.class, mailboxManager); - fileSystem = new MockFileSystem(); - protocolHandlerChain.put("fileSystem", FileSystem.class, fileSystem); - + + protocolHandlerChain = MockProtocolHandlerLoader.builder() + .put(binder -> binder.bind(UsersRepository.class).toInstance(usersRepository)) + .put(binder -> binder.bind(MailboxManager.class).annotatedWith(Names.named("mailboxmanager")).toInstance(mailboxManager)) + .put(binder -> binder.bind(FileSystem.class).toInstance(fileSystem)) + .build(); } private void setupTestMails(MailboxSession session, MessageManager mailbox) throws MailboxException { diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml index bf3968b..125125e 100644 --- a/server/protocols/protocols-smtp/pom.xml +++ b/server/protocols/protocols-smtp/pom.xml @@ -130,6 +130,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <scope>test</scope> + </dependency> + <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> </dependency> diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java index 2bed383..ac5f4f9 100644 --- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java +++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java @@ -61,6 +61,8 @@ import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore; import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore; import org.apache.james.mailrepository.memory.TestingMailRepositoryLoader; import org.apache.james.metrics.api.Metric; +import org.apache.james.metrics.api.MetricFactory; +import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.protocols.api.utils.ProtocolServerUtils; import org.apache.james.protocols.lib.mock.MockProtocolHandlerLoader; import org.apache.james.protocols.netty.AbstractChannelPipelineFactory; @@ -85,6 +87,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; +import com.google.inject.TypeLiteral; public class SMTPServerTest { @@ -244,28 +247,23 @@ public class SMTPServerTest { } protected void setUpFakeLoader() throws Exception { - - chain = new MockProtocolHandlerLoader(); - - chain.put("usersrepository", UsersRepository.class, usersRepository); - dnsServer = new AlterableDNSServer(); - chain.put("dnsservice", DNSService.class, dnsServer); - - chain.put("mailStore", MailRepositoryStore.class, mailRepositoryStore); - - chain.put("fileSystem", FileSystem.class, fileSystem); - MemoryRecipientRewriteTable rewriteTable = new MemoryRecipientRewriteTable(); - chain.put("recipientrewritetable", RecipientRewriteTable.class, rewriteTable); - queueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory()); queue = queueFactory.createQueue(MailQueueFactory.SPOOL); - chain.put("mailqueuefactory", MailQueueFactory.class, queueFactory); MemoryDomainList domainList = new MemoryDomainList(mock(DNSService.class)); domainList.addDomain(Domain.LOCALHOST); - chain.put("domainlist", DomainList.class, domainList); - + + chain = MockProtocolHandlerLoader.builder() + .put(binder -> binder.bind(DomainList.class).toInstance(domainList)) + .put(binder -> binder.bind(new TypeLiteral<MailQueueFactory<?>>() {}).toInstance(queueFactory)) + .put(binder -> binder.bind(RecipientRewriteTable.class).toInstance(rewriteTable)) + .put(binder -> binder.bind(FileSystem.class).toInstance(fileSystem)) + .put(binder -> binder.bind(MailRepositoryStore.class).toInstance(mailRepositoryStore)) + .put(binder -> binder.bind(DNSService.class).toInstance(dnsServer)) + .put(binder -> binder.bind(UsersRepository.class).toInstance(usersRepository)) + .put(binder -> binder.bind(MetricFactory.class).to(NoopMetricFactory.class)) + .build(); } @Test --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
