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