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 <btell...@linagora.com> Authored: Fri Jun 8 13:51:57 2018 +0700 Committer: benwa <btell...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org