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 2018/06/14 08:35:23 UTC

[05/13] james-project git commit: JAMES-2418 Mail repository store should rely on persistent storage

JAMES-2418 Mail repository store should rely on persistent storage


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fb4e7c66
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fb4e7c66
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fb4e7c66

Branch: refs/heads/master
Commit: fb4e7c668adda2816665dd346ba463e4eab164ea
Parents: 0f7ec3c
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 8 13:51:57 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Thu Jun 14 15:16:59 2018 +0700

----------------------------------------------------------------------
 .../data/CassandraMailRepositoryModule.java     | 11 ++++--
 server/container/guice/guice-common/pom.xml     |  5 +++
 .../utils/InMemoryMailRepositoryStore.java      | 13 ++++++--
 .../utils/InMemoryMailRepositoryStoreTest.java  | 22 +++++++++---
 .../james/modules/data/JPADataModule.java       |  1 +
 .../modules/data/JPAMailRepositoryModule.java   | 35 ++++++++++++++++++++
 .../james/modules/data/MemoryDataModule.java    |  5 +++
 7 files changed, 82 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/data/CassandraMailRepositoryModule.java
----------------------------------------------------------------------
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 dc4a7c5..7f2cf90 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
@@ -23,10 +23,13 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.api.ObjectStore;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
 import org.apache.james.mailrepository.cassandra.CassandraMailRepository;
 import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryCountDAO;
 import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryKeysDAO;
 import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryMailDAO;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryUrlModule;
+import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryUrlStore;
 import org.apache.james.utils.MailRepositoryProvider;
 
 import com.google.inject.AbstractModule;
@@ -37,15 +40,19 @@ import com.google.inject.multibindings.Multibinder;
 public class CassandraMailRepositoryModule extends AbstractModule {
     @Override
     protected void configure() {
+        bind(CassandraMailRepositoryUrlStore.class).in(Scopes.SINGLETON);
         bind(CassandraMailRepositoryKeysDAO.class).in(Scopes.SINGLETON);
         bind(CassandraMailRepositoryCountDAO.class).in(Scopes.SINGLETON);
         bind(CassandraMailRepositoryMailDAO.class).in(Scopes.SINGLETON);
 
+        bind(MailRepositoryUrlStore.class).to(CassandraMailRepositoryUrlStore.class);
+
         Multibinder<MailRepositoryProvider> multibinder = Multibinder.newSetBinder(binder(), MailRepositoryProvider.class);
         multibinder.addBinding().to(CassandraMailRepositoryProvider.class);
 
-        Multibinder.newSetBinder(binder(), CassandraModule.class).addBinding()
-            .to(org.apache.james.mailrepository.cassandra.CassandraMailRepositoryModule.class);
+        Multibinder<CassandraModule> cassandraModuleBinder = Multibinder.newSetBinder(binder(), CassandraModule.class);
+        cassandraModuleBinder.addBinding().to(org.apache.james.mailrepository.cassandra.CassandraMailRepositoryModule.class);
+        cassandraModuleBinder.addBinding().to(CassandraMailRepositoryUrlModule.class);
     }
 
     public static class CassandraMailRepositoryProvider implements MailRepositoryProvider {

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/guice-common/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/pom.xml b/server/container/guice/guice-common/pom.xml
index 9f03660..caec572 100644
--- a/server/container/guice/guice-common/pom.xml
+++ b/server/container/guice/guice-common/pom.xml
@@ -56,6 +56,11 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-server-data-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-dnsservice-api</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
index 0d87a8d..6ec37a4 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/InMemoryMailRepositoryStore.java
@@ -35,6 +35,7 @@ import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
 import org.apache.james.mailrepository.api.Protocol;
 import org.apache.james.repository.api.Initializable;
 import org.slf4j.Logger;
@@ -47,6 +48,7 @@ import com.google.inject.Inject;
 public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configurable {
     private static final Logger LOGGER = LoggerFactory.getLogger(InMemoryMailRepositoryStore.class);
 
+    private final MailRepositoryUrlStore urlStore;
     private final Set<MailRepositoryProvider> mailRepositories;
     private final ConcurrentMap<MailRepositoryUrl, MailRepository> destinationToRepositoryAssociations;
     private final Map<Protocol, MailRepositoryProvider> protocolToRepositoryProvider;
@@ -54,7 +56,8 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu
     private HierarchicalConfiguration configuration;
 
     @Inject
-    public InMemoryMailRepositoryStore(Set<MailRepositoryProvider> mailRepositories) {
+    public InMemoryMailRepositoryStore(MailRepositoryUrlStore urlStore, Set<MailRepositoryProvider> mailRepositories) {
+        this.urlStore = urlStore;
         this.mailRepositories = mailRepositories;
         this.destinationToRepositoryAssociations = new ConcurrentHashMap<>();
         this.protocolToRepositoryProvider = new HashMap<>();
@@ -63,7 +66,7 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu
 
     @Override
     public List<MailRepositoryUrl> getUrls() {
-        return ImmutableList.copyOf(destinationToRepositoryAssociations.keySet());
+        return ImmutableList.copyOf(urlStore.list());
     }
 
     @Override
@@ -90,7 +93,10 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu
 
     @Override
     public Optional<MailRepository> get(MailRepositoryUrl url) {
-        return Optional.ofNullable(destinationToRepositoryAssociations.get(url));
+        if (urlStore.contains(url)) {
+            return Optional.of(select(url));
+        }
+        return Optional.empty();
     }
 
     @Override
@@ -102,6 +108,7 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu
     }
 
     private MailRepository createNewMailRepository(MailRepositoryUrl mailRepositoryUrl) throws MailRepositoryStoreException {
+        urlStore.add(mailRepositoryUrl);
         MailRepository newMailRepository = retrieveMailRepository(mailRepositoryUrl);
         newMailRepository = initializeNewRepository(newMailRepository, createRepositoryCombinedConfig(mailRepositoryUrl));
         MailRepository previousRepository = destinationToRepositoryAssociations.putIfAbsent(mailRepositoryUrl, newMailRepository);

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/guice-common/src/test/java/org/apache/james/utils/InMemoryMailRepositoryStoreTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/InMemoryMailRepositoryStoreTest.java b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/InMemoryMailRepositoryStoreTest.java
index cb1e18a..f373bbe 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/InMemoryMailRepositoryStoreTest.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/InMemoryMailRepositoryStoreTest.java
@@ -32,6 +32,7 @@ import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.mailrepository.file.FileMailRepository;
 import org.apache.james.mailrepository.memory.MemoryMailRepository;
+import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore;
 import org.apache.james.modules.server.MailStoreRepositoryModule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.server.core.configuration.FileConfigurationProvider;
@@ -46,6 +47,8 @@ import com.google.common.collect.Sets;
 public class InMemoryMailRepositoryStoreTest {
     private static final MailRepositoryUrl FILE_REPO = MailRepositoryUrl.from("file://repo");
 
+    private MemoryMailRepositoryUrlStore urlStore;
+
     private static class MemoryMailRepositoryProvider implements MailRepositoryProvider {
         @Override
         public String canonicalName() {
@@ -69,9 +72,10 @@ public class InMemoryMailRepositoryStoreTest {
             .configurationFromClasspath()
             .build();
         fileSystem = new FileSystemImpl(configuration.directories());
-        repositoryStore = new InMemoryMailRepositoryStore(Sets.newHashSet(
-                new MailStoreRepositoryModule.FileMailRepositoryProvider(
-                        fileSystem),
+        urlStore = new MemoryMailRepositoryUrlStore();
+        MailStoreRepositoryModule.FileMailRepositoryProvider fileProvider = new MailStoreRepositoryModule.FileMailRepositoryProvider(fileSystem);
+        repositoryStore = new InMemoryMailRepositoryStore(urlStore, Sets.newHashSet(
+            fileProvider,
                 new MemoryMailRepositoryProvider()));
         repositoryStore.configure(new FileConfigurationProvider(fileSystem, configuration)
             .getConfiguration("mailrepositorystore"));
@@ -103,7 +107,7 @@ public class InMemoryMailRepositoryStoreTest {
 
     @Test
     public void configureShouldThrowWhenNonValidClassesAreProvided() throws Exception {
-        repositoryStore = new InMemoryMailRepositoryStore(Sets.newHashSet(
+        repositoryStore = new InMemoryMailRepositoryStore(urlStore, Sets.newHashSet(
             new MailStoreRepositoryModule.FileMailRepositoryProvider(
                 fileSystem)));
         repositoryStore.configure(new FileConfigurationProvider(fileSystem, configuration).getConfiguration("fakemailrepositorystore"));
@@ -114,7 +118,7 @@ public class InMemoryMailRepositoryStoreTest {
 
     @Test
     public void configureShouldNotThrowOnEmptyConfiguration() throws Exception {
-        repositoryStore = new InMemoryMailRepositoryStore(Sets.newHashSet(
+        repositoryStore = new InMemoryMailRepositoryStore(urlStore, Sets.newHashSet(
             new MailStoreRepositoryModule.FileMailRepositoryProvider(
                 fileSystem)));
         repositoryStore.configure(new HierarchicalConfiguration());
@@ -152,6 +156,14 @@ public class InMemoryMailRepositoryStoreTest {
     }
 
     @Test
+    public void getShouldReturnRepositoryWhenUrlExists() {
+        urlStore.add(FILE_REPO);
+
+        assertThat(repositoryStore.get(FILE_REPO))
+            .isNotEmpty();
+    }
+
+    @Test
     public void getShouldReturnPreviouslyCreatedMailRepository() {
         MailRepository mailRepository = repositoryStore.select(FILE_REPO);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPADataModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPADataModule.java b/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPADataModule.java
index ec8023e..ee79def 100644
--- a/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPADataModule.java
+++ b/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPADataModule.java
@@ -27,6 +27,7 @@ public class JPADataModule extends AbstractModule {
         install(new JPAUsersRepositoryModule());
         install(new JPADomainListModule());
         install(new JPARecipientRewriteTableModule());
+        install(new JPAMailRepositoryModule());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..5e9f398
--- /dev/null
+++ b/server/container/guice/jpa-common-guice/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java
@@ -0,0 +1,35 @@
+/****************************************************************
+ * 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.modules.data;
+
+import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
+import org.apache.james.mailrepository.jpa.JPAMailRepositoryUrlStore;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
+
+public class JPAMailRepositoryModule extends AbstractModule {
+    @Override
+    protected void configure() {
+        bind(JPAMailRepositoryUrlStore.class).in(Scopes.SINGLETON);
+
+        bind(MailRepositoryUrlStore.class).to(JPAMailRepositoryUrlStore.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/fb4e7c66/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/data/MemoryDataModule.java
----------------------------------------------------------------------
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 f5c4c80..6fd5de2 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
@@ -25,6 +25,8 @@ import org.apache.commons.configuration.ConfigurationException;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.lifecycle.api.Configurable;
+import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
+import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore;
 import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.memory.MemoryRecipientRewriteTable;
 import org.apache.james.server.core.configuration.ConfigurationProvider;
@@ -51,6 +53,9 @@ public class MemoryDataModule extends AbstractModule {
         bind(MemoryRecipientRewriteTable.class).in(Scopes.SINGLETON);
         bind(RecipientRewriteTable.class).to(MemoryRecipientRewriteTable.class);
 
+        bind(MemoryMailRepositoryUrlStore.class).in(Scopes.SINGLETON);
+        bind(MailRepositoryUrlStore.class).to(MemoryMailRepositoryUrlStore.class);
+
         bind(MemoryUsersRepository.class).toInstance(MemoryUsersRepository.withVirtualHosting());
         bind(UsersRepository.class).to(MemoryUsersRepository.class);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org