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 eacfeb428f33be1a23aef8662b33158665184bba Author: Benoit Tellier <[email protected]> AuthorDate: Wed Sep 25 09:40:01 2019 +0700 JAMES-2886 MailRepositoryStore can also rely on GuiceGenericLoader --- pom.xml | 6 +++ .../data/CassandraMailRepositoryModule.java | 5 --- .../modules/server/GuiceMailRepositoryLoader.java} | 44 +++++++++++----------- .../modules/server/MailStoreRepositoryModule.java | 8 ++-- .../modules/data/JPAMailRepositoryModule.java | 6 --- .../james/modules/data/MemoryDataModule.java | 5 --- .../memory/MailRepositoryLoader.java} | 14 ++----- .../memory/MemoryMailRepositoryStore.java | 35 ++++++++--------- .../memory/MemoryMailRepositoryStoreTest.java | 24 ++++++------ .../memory/TestingMailRepositoryLoader.java} | 31 ++++----------- server/mailet/mailets/pom.xml | 6 +++ .../mailets/ToSenderDomainRepositoryTest.java | 5 +-- .../mailrepository/api/MailRepositoryProvider.java | 27 ------------- .../cassandra/CassandraMailRepository.java | 16 ++++++-- server/protocols/protocols-smtp/pom.xml | 6 +++ .../apache/james/smtpserver/SMTPServerTest.java | 5 +-- .../webadmin/webadmin-mailrepository/pom.xml | 6 +++ .../routes/MailRepositoriesRoutesTest.java | 5 +-- .../webadmin/service/ReprocessingServiceTest.java | 5 +-- 19 files changed, 107 insertions(+), 152 deletions(-) diff --git a/pom.xml b/pom.xml index bae3b8e..5a60f56 100644 --- a/pom.xml +++ b/pom.xml @@ -1356,6 +1356,12 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>james-server-data-memory</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-deleted-messages-vault</artifactId> <version>${project.version}</version> </dependency> diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java index 3c8830b..b26dcf7 100644 --- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java +++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java @@ -21,7 +21,6 @@ package org.apache.james.modules.data; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; import org.apache.james.backends.cassandra.components.CassandraModule; -import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.cassandra.CassandraMailRepository; @@ -30,7 +29,6 @@ import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryKeysDAO; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryMailDAO; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryMailDaoAPI; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryMailDaoV2; -import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryProvider; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryUrlModule; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryUrlStore; import org.apache.james.mailrepository.cassandra.MergingCassandraMailRepositoryMailDao; @@ -60,9 +58,6 @@ public class CassandraMailRepositoryModule extends AbstractModule { bind(CassandraMailRepositoryMailDaoAPI.class).to(MergingCassandraMailRepositoryMailDao.class); bind(MailRepositoryUrlStore.class).to(CassandraMailRepositoryUrlStore.class); - Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class); - multibinder.addBinding().to(CassandraMailRepositoryProvider.class); - bind(MailStoreRepositoryModule.DefaultItemSupplier.class).toInstance(() -> CASSANDRA_MAILREPOSITORY_DEFAULT_DECLARATION); Multibinder<CassandraModule> cassandraModuleBinder = Multibinder.newSetBinder(binder(), CassandraModule.class); diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java similarity index 50% rename from server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java rename to server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java index 410c46b..c90ff98 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryProvider.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java @@ -17,37 +17,37 @@ * under the License. * ****************************************************************/ -package org.apache.james.mailrepository.cassandra; +package org.apache.james.modules.server; -import javax.inject.Inject; - -import org.apache.james.blob.mail.MimeMessageStore; import org.apache.james.mailrepository.api.MailRepository; -import org.apache.james.mailrepository.api.MailRepositoryProvider; +import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryUrl; +import org.apache.james.mailrepository.memory.MailRepositoryLoader; +import org.apache.james.utils.ClassName; +import org.apache.james.utils.GuiceGenericLoader; + +import com.google.inject.Inject; +import com.google.inject.Module; -public class CassandraMailRepositoryProvider implements MailRepositoryProvider { - private final CassandraMailRepositoryKeysDAO keysDAO; - private final CassandraMailRepositoryCountDAO countDAO; - private final CassandraMailRepositoryMailDaoAPI mailDAO; - private final MimeMessageStore.Factory mimeMessageStoreFactory; +public class GuiceMailRepositoryLoader implements MailRepositoryLoader { + private final GuiceGenericLoader genericLoader; @Inject - public CassandraMailRepositoryProvider(CassandraMailRepositoryKeysDAO keysDAO, CassandraMailRepositoryCountDAO countDAO, - CassandraMailRepositoryMailDaoAPI mailDAO, MimeMessageStore.Factory mimeMessageStoreFactory) { - this.keysDAO = keysDAO; - this.countDAO = countDAO; - this.mailDAO = mailDAO; - this.mimeMessageStoreFactory = mimeMessageStoreFactory; + public GuiceMailRepositoryLoader(GuiceGenericLoader genericLoader) { + this.genericLoader = genericLoader; } @Override - public String canonicalName() { - return CassandraMailRepository.class.getCanonicalName(); - } + public MailRepository load(String fullyQualifiedClassName, MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException { + try { + Module urlModule = binder -> binder.bind(MailRepositoryUrl.class).toInstance(url); - @Override - public MailRepository provide(MailRepositoryUrl url) { - return new CassandraMailRepository(url, keysDAO, countDAO, mailDAO, mimeMessageStoreFactory.mimeMessageStore()); + return genericLoader.<MailRepository>withChildModule(urlModule) + .instanciate(new ClassName(fullyQualifiedClassName)); + } catch (ClassNotFoundException e) { + throw new MailRepositoryStore.MailRepositoryStoreException("No Mail Repository found with class name " + fullyQualifiedClassName); + } catch (ClassCastException e) { + throw new MailRepositoryStore.MailRepositoryStoreException(fullyQualifiedClassName + " is not a MailRepository"); + } } } diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java index 909b3d8..33a1b99 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java @@ -25,10 +25,9 @@ import org.apache.commons.configuration2.HierarchicalConfiguration; import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.ImmutableNode; import org.apache.james.lifecycle.api.Startable; -import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryStore; +import org.apache.james.mailrepository.memory.MailRepositoryLoader; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore; import org.apache.james.server.core.configuration.ConfigurationProvider; import org.apache.james.utils.GuiceProbe; @@ -55,8 +54,9 @@ public class MailStoreRepositoryModule extends AbstractModule { bind(MemoryMailRepositoryStore.class).in(Scopes.SINGLETON); bind(MailRepositoryStore.class).to(MemoryMailRepositoryStore.class); - Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class); - multibinder.addBinding().to(MemoryMailRepositoryProvider.class); + bind(GuiceMailRepositoryLoader.class).in(Scopes.SINGLETON); + bind(MailRepositoryLoader.class).to(GuiceMailRepositoryLoader.class); + Multibinder.newSetBinder(binder(), InitialisationOperation.class).addBinding().to(MailRepositoryStoreModuleInitialisationOperation.class); Multibinder.newSetBinder(binder(), GuiceProbe.class).addBinding().to(MailRepositoryProbeImpl.class); } diff --git a/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java b/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java index 41257af..51c6587 100644 --- a/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java +++ b/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java @@ -20,11 +20,9 @@ package org.apache.james.modules.data; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; -import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.file.FileMailRepository; -import org.apache.james.mailrepository.file.FileMailRepositoryProvider; import org.apache.james.mailrepository.jpa.JPAMailRepositoryUrlStore; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.modules.server.MailStoreRepositoryModule; @@ -32,7 +30,6 @@ import org.apache.james.modules.server.MailStoreRepositoryModule; import com.google.common.collect.ImmutableList; import com.google.inject.AbstractModule; import com.google.inject.Scopes; -import com.google.inject.multibindings.Multibinder; public class JPAMailRepositoryModule extends AbstractModule { private static final MailRepositoryStoreConfiguration.Item FILE_MAILREPOSITORY_DEFAULT_DECLARATION = new MailRepositoryStoreConfiguration.Item( @@ -47,8 +44,5 @@ public class JPAMailRepositoryModule extends AbstractModule { bind(MailRepositoryUrlStore.class).to(JPAMailRepositoryUrlStore.class); bind(MailStoreRepositoryModule.DefaultItemSupplier.class).toInstance(() -> FILE_MAILREPOSITORY_DEFAULT_DECLARATION); - - Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class); - multibinder.addBinding().to(FileMailRepositoryProvider.class); } } diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java index 2b09793..6192990 100644 --- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java +++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java @@ -27,12 +27,10 @@ import org.apache.james.domainlist.api.DomainList; import org.apache.james.domainlist.lib.DomainListConfiguration; import org.apache.james.domainlist.memory.MemoryDomainList; import org.apache.james.lifecycle.api.Startable; -import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.mailrepository.memory.MemoryMailRepository; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore; import org.apache.james.modules.server.MailStoreRepositoryModule; import org.apache.james.rrt.api.RecipientRewriteTable; @@ -83,9 +81,6 @@ public class MemoryDataModule extends AbstractModule { initialisationOperations.addBinding().to(MemoryDomainListInitialisationOperation.class); bind(MailStoreRepositoryModule.DefaultItemSupplier.class).toInstance(() -> MEMORY_MAILREPOSITORY_DEFAULT_DECLARATION); - - Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class); - multibinder.addBinding().to(MemoryMailRepositoryProvider.class); } @Provides diff --git a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryProvider.java b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MailRepositoryLoader.java similarity index 77% rename from server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryProvider.java rename to server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MailRepositoryLoader.java index cdde19d..9e24f64 100644 --- a/server/mailrepository/mailrepository-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryProvider.java +++ b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MailRepositoryLoader.java @@ -20,17 +20,9 @@ package org.apache.james.mailrepository.memory; import org.apache.james.mailrepository.api.MailRepository; -import org.apache.james.mailrepository.api.MailRepositoryProvider; +import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryUrl; -public class MemoryMailRepositoryProvider implements MailRepositoryProvider { - @Override - public String canonicalName() { - return MemoryMailRepository.class.getCanonicalName(); - } - - @Override - public MailRepository provide(MailRepositoryUrl url) { - return new MemoryMailRepository(); - } +public interface MailRepositoryLoader { + MailRepository load(String fullyQualifiedClassName, MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException; } diff --git a/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStore.java b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStore.java index a00714a..61c1069 100644 --- a/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStore.java +++ b/server/data/data-memory/src/main/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStore.java @@ -22,7 +22,6 @@ package org.apache.james.mailrepository.memory; import java.util.HashMap; import java.util.Map; import java.util.Optional; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.stream.Stream; @@ -31,13 +30,11 @@ import javax.inject.Inject; import org.apache.commons.configuration2.CombinedConfiguration; import org.apache.commons.configuration2.HierarchicalConfiguration; -import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.commons.configuration2.tree.ImmutableNode; import org.apache.james.lifecycle.api.Configurable; import org.apache.james.lifecycle.api.Startable; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryPath; -import org.apache.james.mailrepository.api.MailRepositoryProvider; import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; @@ -47,24 +44,25 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.github.fge.lambdas.Throwing; +import com.github.fge.lambdas.functions.ThrowingFunction; public class MemoryMailRepositoryStore implements MailRepositoryStore, Startable { private static final Logger LOGGER = LoggerFactory.getLogger(MemoryMailRepositoryStore.class); private final MailRepositoryUrlStore urlStore; - private final Set<MailRepositoryProvider> mailRepositories; private final ConcurrentMap<MailRepositoryUrl, MailRepository> destinationToRepositoryAssociations; - private final Map<Protocol, MailRepositoryProvider> protocolToRepositoryProvider; + private final Map<Protocol, String> protocolToClass; + private final MailRepositoryLoader mailRepositoryLoader; private final Map<Protocol, HierarchicalConfiguration<ImmutableNode>> perProtocolMailRepositoryDefaultConfiguration; private final MailRepositoryStoreConfiguration configuration; @Inject - public MemoryMailRepositoryStore(MailRepositoryUrlStore urlStore, Set<MailRepositoryProvider> mailRepositories, MailRepositoryStoreConfiguration configuration) { + public MemoryMailRepositoryStore(MailRepositoryUrlStore urlStore, MailRepositoryLoader mailRepositoryLoader, MailRepositoryStoreConfiguration configuration) { this.urlStore = urlStore; - this.mailRepositories = mailRepositories; + this.mailRepositoryLoader = mailRepositoryLoader; this.configuration = configuration; this.destinationToRepositoryAssociations = new ConcurrentHashMap<>(); - this.protocolToRepositoryProvider = new HashMap<>(); + this.protocolToClass = new HashMap<>(); this.perProtocolMailRepositoryDefaultConfiguration = new HashMap<>(); } @@ -76,16 +74,9 @@ public class MemoryMailRepositoryStore implements MailRepositoryStore, Startable } } - private void initEntry(MailRepositoryStoreConfiguration.Item item) throws ConfigurationException { - String className = item.getClassFqdn(); - - MailRepositoryProvider usedMailRepository = mailRepositories.stream() - .filter(mailRepositoryProvider -> mailRepositoryProvider.canonicalName().equals(className)) - .findAny() - .orElseThrow(() -> new ConfigurationException("MailRepository " + className + " has not been registered")); - + private void initEntry(MailRepositoryStoreConfiguration.Item item) { for (Protocol protocol : item.getProtocols()) { - protocolToRepositoryProvider.put(protocol, usedMailRepository); + protocolToClass.put(protocol, item.getClassFqdn()); perProtocolMailRepositoryDefaultConfiguration.put(protocol, item.getConfiguration()); } } @@ -148,8 +139,12 @@ public class MemoryMailRepositoryStore implements MailRepositoryStore, Startable private MailRepository retrieveMailRepository(MailRepositoryUrl mailRepositoryUrl) throws MailRepositoryStoreException { Protocol protocol = mailRepositoryUrl.getProtocol(); - return Optional.ofNullable(protocolToRepositoryProvider.get(protocol)) - .orElseThrow(() -> new MailRepositoryStoreException("No Mail Repository associated with " + protocol.getValue())) - .provide(mailRepositoryUrl); + Optional<String> fullyQualifiedClass = Optional.ofNullable(protocolToClass.get(protocol)); + + ThrowingFunction<String, MailRepository> fqcnToMailRepository = className -> mailRepositoryLoader.load(className, mailRepositoryUrl); + + return fullyQualifiedClass + .map(Throwing.function(fqcnToMailRepository).sneakyThrow()) + .orElseThrow(() -> new MailRepositoryStoreException("No Mail Repository associated with " + protocol.getValue())); } } diff --git a/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStoreTest.java b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStoreTest.java index 007547e..b430595 100644 --- a/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStoreTest.java +++ b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/MemoryMailRepositoryStoreTest.java @@ -25,12 +25,12 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.time.Duration; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; -import org.apache.commons.configuration2.ex.ConfigurationException; import org.apache.james.core.builder.MimeMessageBuilder; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryPath; import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryUrl; +import org.apache.james.mailrepository.api.Protocol; import org.apache.james.server.core.configuration.Configuration; import org.apache.james.server.core.configuration.FileConfigurationProvider; import org.apache.james.server.core.filesystem.FileSystemImpl; @@ -39,8 +39,6 @@ import org.apache.mailet.base.test.FakeMail; import org.junit.Before; import org.junit.Test; -import com.google.common.collect.Sets; - public class MemoryMailRepositoryStoreTest { private static final MailRepositoryUrl MEMORY1_REPO = MailRepositoryUrl.from("memory1://repo"); private static final MailRepositoryUrl UNKNOWN_PROTOCOL_REPO = MailRepositoryUrl.from("toto://repo"); @@ -49,12 +47,14 @@ public class MemoryMailRepositoryStoreTest { private MemoryMailRepositoryUrlStore urlStore; + private TestingMailRepositoryLoader loader; private MemoryMailRepositoryStore repositoryStore; private FileSystemImpl fileSystem; private Configuration configuration; @Before public void setUp() throws Exception { + loader = new TestingMailRepositoryLoader(); configuration = Configuration.builder() .workingDirectory("../") .configurationFromClasspath() @@ -65,10 +65,7 @@ public class MemoryMailRepositoryStoreTest { MailRepositoryStoreConfiguration storeConfiguration = MailRepositoryStoreConfiguration.parse( new FileConfigurationProvider(fileSystem, configuration).getConfiguration("mailrepositorystore")); - repositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet( - new MemoryMailRepositoryProvider(), - new MemoryMailRepositoryProvider()), - storeConfiguration); + repositoryStore = new MemoryMailRepositoryStore(urlStore, loader, storeConfiguration); repositoryStore.init(); } @@ -100,19 +97,20 @@ public class MemoryMailRepositoryStoreTest { MailRepositoryStoreConfiguration storeConfiguration = MailRepositoryStoreConfiguration.parse( new FileConfigurationProvider(fileSystem, configuration).getConfiguration("fakemailrepositorystore")); - repositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet( - new MemoryMailRepositoryProvider()), storeConfiguration); + repositoryStore = new MemoryMailRepositoryStore(urlStore, loader, storeConfiguration); + + repositoryStore.init(); - assertThatThrownBy(() -> repositoryStore.init()) - .isInstanceOf(ConfigurationException.class); + assertThatThrownBy(() -> repositoryStore.select(MailRepositoryUrl.fromPathAndProtocol( + new Protocol("memory"), MailRepositoryPath.from("/var/will/fail")))) + .isInstanceOf(MailRepositoryStore.MailRepositoryStoreException.class); } @Test public void configureShouldNotThrowOnEmptyConfiguration() throws Exception { MailRepositoryStoreConfiguration configuration = MailRepositoryStoreConfiguration.parse(new BaseHierarchicalConfiguration()); - repositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet( - new MemoryMailRepositoryProvider()), configuration); + repositoryStore = new MemoryMailRepositoryStore(urlStore, loader, configuration); repositoryStore.init(); } diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepositoryProvider.java b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/TestingMailRepositoryLoader.java similarity index 63% rename from server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepositoryProvider.java rename to server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/TestingMailRepositoryLoader.java index b8d52ed..93db1f9 100644 --- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepositoryProvider.java +++ b/server/data/data-memory/src/test/java/org/apache/james/mailrepository/memory/TestingMailRepositoryLoader.java @@ -17,33 +17,18 @@ * under the License. * ****************************************************************/ -package org.apache.james.mailrepository.file; +package org.apache.james.mailrepository.memory; -import javax.inject.Inject; - -import org.apache.james.filesystem.api.FileSystem; import org.apache.james.mailrepository.api.MailRepository; -import org.apache.james.mailrepository.api.MailRepositoryProvider; +import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryUrl; -public class FileMailRepositoryProvider implements MailRepositoryProvider { - - private final FileSystem fileSystem; - - @Inject - public FileMailRepositoryProvider(FileSystem fileSystem) { - this.fileSystem = fileSystem; - } - - @Override - public String canonicalName() { - return FileMailRepository.class.getCanonicalName(); - } - +public class TestingMailRepositoryLoader implements MailRepositoryLoader { @Override - public MailRepository provide(MailRepositoryUrl url) { - FileMailRepository fileMailRepository = new FileMailRepository(); - fileMailRepository.setFileSystem(fileSystem); - return fileMailRepository; + public MailRepository load(String fullyQualifiedClassName, MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException { + if (fullyQualifiedClassName.equals(MemoryMailRepository.class.getCanonicalName())) { + return new MemoryMailRepository(); + } + throw new MailRepositoryStore.MailRepositoryStoreException(fullyQualifiedClassName + " is not supported"); } } diff --git a/server/mailet/mailets/pom.xml b/server/mailet/mailets/pom.xml index 8ac7d06..b1c30bf 100644 --- a/server/mailet/mailets/pom.xml +++ b/server/mailet/mailets/pom.xml @@ -127,6 +127,12 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>james-server-data-memory</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-dnsservice-api</artifactId> </dependency> <dependency> diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryTest.java index 34e5a02..ee21b37 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/ToSenderDomainRepositoryTest.java @@ -36,9 +36,9 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.mailrepository.memory.MemoryMailRepository; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore; import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore; +import org.apache.james.mailrepository.memory.TestingMailRepositoryLoader; import org.apache.mailet.Mail; import org.apache.mailet.base.MailAddressFixture; import org.apache.mailet.base.test.FakeMail; @@ -47,7 +47,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; class ToSenderDomainRepositoryTest { @@ -75,7 +74,7 @@ class ToSenderDomainRepositoryTest { MemoryMailRepository.class.getName(), new BaseHierarchicalConfiguration())); - mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet(new MemoryMailRepositoryProvider()), configuration); + mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, new TestingMailRepositoryLoader(), configuration); mailRepositoryStore.init(); } diff --git a/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryProvider.java b/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryProvider.java deleted file mode 100644 index 18ffa96..0000000 --- a/server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mailrepository.api; - -public interface MailRepositoryProvider { - - String canonicalName(); - - MailRepository provide(MailRepositoryUrl url); -} diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java index 08f4f99..277c39d 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java +++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java @@ -22,11 +22,13 @@ package org.apache.james.mailrepository.cassandra; import java.util.Collection; import java.util.Iterator; +import javax.inject.Inject; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.apache.james.blob.api.Store; import org.apache.james.blob.mail.MimeMessagePartsId; +import org.apache.james.blob.mail.MimeMessageStore; import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryUrl; @@ -36,16 +38,22 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public class CassandraMailRepository implements MailRepository { - private final MailRepositoryUrl url; private final CassandraMailRepositoryKeysDAO keysDAO; private final CassandraMailRepositoryCountDAO countDAO; private final CassandraMailRepositoryMailDaoAPI mailDAO; private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore; - public CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO, - CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDaoAPI mailDAO, - Store<MimeMessage, MimeMessagePartsId> mimeMessageStore) { + @Inject + CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO, + CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDaoAPI mailDAO, + MimeMessageStore.Factory mimeMessageStoreFactory) { + this(url, keysDAO, countDAO, mailDAO, mimeMessageStoreFactory.mimeMessageStore()); + } + + CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO, + CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDaoAPI mailDAO, + Store<MimeMessage, MimeMessagePartsId> mimeMessageStore) { this.url = url; this.keysDAO = keysDAO; this.countDAO = countDAO; diff --git a/server/protocols/protocols-smtp/pom.xml b/server/protocols/protocols-smtp/pom.xml index 88eae80..bf3968b 100644 --- a/server/protocols/protocols-smtp/pom.xml +++ b/server/protocols/protocols-smtp/pom.xml @@ -62,6 +62,12 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>james-server-data-memory</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-dnsservice-api</artifactId> </dependency> <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 406f888..e688f48 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 @@ -54,9 +54,9 @@ import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.mailrepository.memory.MemoryMailRepository; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; 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.protocols.api.utils.ProtocolServerUtils; import org.apache.james.protocols.lib.mock.MockProtocolHandlerLoader; @@ -82,7 +82,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; public class SMTPServerTest { @@ -210,7 +209,7 @@ public class SMTPServerTest { MemoryMailRepository.class.getName(), new BaseHierarchicalConfiguration())); - mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet(new MemoryMailRepositoryProvider()), configuration); + mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, new TestingMailRepositoryLoader(), configuration); mailRepositoryStore.init(); } diff --git a/server/protocols/webadmin/webadmin-mailrepository/pom.xml b/server/protocols/webadmin/webadmin-mailrepository/pom.xml index f6126ce..e52a0bb 100644 --- a/server/protocols/webadmin/webadmin-mailrepository/pom.xml +++ b/server/protocols/webadmin/webadmin-mailrepository/pom.xml @@ -58,6 +58,12 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>james-server-data-memory</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>james-server-queue-api</artifactId> </dependency> <dependency> diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java index 8ad526b..967b260 100644 --- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java @@ -56,9 +56,9 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.mailrepository.memory.MemoryMailRepository; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; 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.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; @@ -86,7 +86,6 @@ import org.junit.Before; import org.junit.Test; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; import io.restassured.RestAssured; import io.restassured.builder.RequestSpecBuilder; @@ -1776,7 +1775,7 @@ public class MailRepositoriesRoutesTest { ImmutableList.of(new Protocol("other")), MemoryMailRepository.class.getName(), new BaseHierarchicalConfiguration())); - mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet(new MemoryMailRepositoryProvider()), configuration); + mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, new TestingMailRepositoryLoader(), configuration); mailRepositoryStore.init(); } diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java index e78b819..4c6dca1 100644 --- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java +++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java @@ -33,9 +33,9 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import org.apache.james.mailrepository.memory.MemoryMailRepository; -import org.apache.james.mailrepository.memory.MemoryMailRepositoryProvider; 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.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; @@ -47,7 +47,6 @@ import org.junit.Test; import com.github.fge.lambdas.Throwing; import com.github.fge.lambdas.consumers.ConsumerChainer; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; public class ReprocessingServiceTest { private static final String MEMORY_PROTOCOL = "memory"; @@ -187,7 +186,7 @@ public class ReprocessingServiceTest { MemoryMailRepository.class.getName(), new BaseHierarchicalConfiguration())); - MemoryMailRepositoryStore mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, Sets.newHashSet(new MemoryMailRepositoryProvider()), configuration); + MemoryMailRepositoryStore mailRepositoryStore = new MemoryMailRepositoryStore(urlStore, new TestingMailRepositoryLoader(), configuration); mailRepositoryStore.init(); return mailRepositoryStore; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
