You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2019/10/01 02:09:30 UTC
[james-project] 01/03: JAMES-2886 MailRepositoryStore can also rely
on GuiceGenericLoader
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 <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org