JAMES-2418 Strong typing for repository URLs and keys
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/946c68be Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/946c68be Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/946c68be Branch: refs/heads/master Commit: 946c68bea7d8c6f29ea51566436bf4190fa6480f Parents: 7dfda86 Author: benwa <btell...@linagora.com> Authored: Fri Jun 8 11:03:43 2018 +0700 Committer: Matthieu Baechler <matth...@apache.org> Committed: Wed Jun 13 16:57:07 2018 +0200 ---------------------------------------------------------------------- .../data/CassandraMailRepositoryModule.java | 3 +- .../CassandraMailRepositoryIntegrationTest.java | 5 +- .../server/MailStoreRepositoryModule.java | 3 +- .../utils/InMemoryMailRepositoryStore.java | 72 ++++------ .../james/utils/MailRepositoryProbeImpl.java | 13 +- .../james/utils/MailRepositoryProvider.java | 3 +- .../utils/InMemoryMailRepositoryStoreTest.java | 51 +++---- .../MailRepositoryStoreBeanFactory.java | 47 +++---- .../container/spring/tool/James23Importer.java | 6 +- .../mailrepository/api/MailRepositoryStore.java | 8 +- .../mailrepository/file/FileMailRepository.java | 25 ++-- .../mailrepository/file/MBoxMailRepository.java | 27 ++-- .../mailrepository/MBoxMailRepositoryTest.java | 3 +- .../mailrepository/jcr/JCRMailRepository.java | 15 +- .../mailrepository/jdbc/JDBCMailRepository.java | 23 +-- .../lib/AbstractMailRepository.java | 21 +-- .../mock/MockMailRepositoryStore.java | 11 +- .../apache/james/mailets/MailetErrorsTest.java | 35 ++--- .../mailets/NetworkMatcherIntegrationTest.java | 5 +- .../james/mailets/SmtpAuthIntegrationTest.java | 5 +- .../mailets/configuration/CommonProcessors.java | 5 +- .../transport/mailets/GroupMappingTest.java | 5 +- .../transport/mailets/ToRepositoryTest.java | 17 ++- .../mailets/ToSenderDomainRepositoryTest.java | 32 +++-- .../james/transport/mailets/FromRepository.java | 14 +- .../james/transport/mailets/ToRepository.java | 5 +- .../mailets/ToSenderDomainRepository.java | 7 +- .../transport/mailets/ToRepositoryTest.java | 37 +++-- .../mailets/ToSenderDomainRepositoryTest.java | 7 +- .../mailrepository/mailrepository-api/pom.xml | 11 ++ .../james/mailrepository/api/MailKey.java | 66 +++++++++ .../mailrepository/api/MailRepository.java | 12 +- .../mailrepository/api/MailRepositoryUrl.java | 86 ++++++++++++ .../james/mailrepository/api/Protocol.java | 60 ++++++++ .../mailrepository/MailRepositoryContract.java | 140 +++++++++---------- .../james/mailrepository/api/MailKeyTest.java | 54 +++++++ .../api/MailRepositoryUrlTest.java | 71 ++++++++++ .../james/mailrepository/api/ProtocolTest.java | 42 ++++++ .../cassandra/CassandraMailRepository.java | 28 ++-- .../CassandraMailRepositoryCountDAO.java | 13 +- .../CassandraMailRepositoryKeysDAO.java | 20 +-- .../CassandraMailRepositoryMailDAO.java | 18 +-- .../CassandraMailRepositoryCountDAOTest.java | 5 +- .../CassandraMailRepositoryKeysDAOTest.java | 13 +- .../CassandraMailRepositoryMailDAOTest.java | 16 ++- .../cassandra/CassandraMailRepositoryTest.java | 3 +- .../memory/MemoryMailRepository.java | 23 +-- .../dto/ExtendedMailRepositoryResponse.java | 4 +- .../org/apache/james/webadmin/dto/MailKey.java | 50 ------- .../apache/james/webadmin/dto/MailKeyDTO.java | 52 +++++++ .../webadmin/dto/MailRepositoryResponse.java | 12 +- .../webadmin/routes/MailRepositoriesRoutes.java | 46 +++--- .../service/ClearMailRepositoryTask.java | 9 +- .../service/MailRepositoryStoreService.java | 26 ++-- .../service/ReprocessingAllMailsTask.java | 14 +- .../service/ReprocessingOneMailTask.java | 18 +-- .../webadmin/service/ReprocessingService.java | 8 +- .../routes/MailRepositoriesRoutesTest.java | 32 +++-- .../service/MailRepositoryStoreServiceTest.java | 32 +++-- 59 files changed, 966 insertions(+), 528 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 f307440..dc4a7c5 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 @@ -22,6 +22,7 @@ package org.apache.james.modules.data; 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.cassandra.CassandraMailRepository; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryCountDAO; import org.apache.james.mailrepository.cassandra.CassandraMailRepositoryKeysDAO; @@ -67,7 +68,7 @@ public class CassandraMailRepositoryModule extends AbstractModule { } @Override - public MailRepository provide(String url) { + public MailRepository provide(MailRepositoryUrl url) { return new CassandraMailRepository(url, keysDAO, countDAO, mailDAO, objectStore); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java index e694ec9..cf2cbdb 100644 --- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java +++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java @@ -21,6 +21,7 @@ package org.apache.james; import static com.jayway.awaitility.Duration.FIVE_HUNDRED_MILLISECONDS; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.utils.DataProbeImpl; import org.apache.james.utils.MailRepositoryProbeImpl; import org.apache.james.utils.SMTPMessageSender; @@ -35,6 +36,8 @@ import com.jayway.awaitility.core.ConditionFactory; public class CassandraMailRepositoryIntegrationTest { + private static final MailRepositoryUrl SENDER_DENIED_URL = MailRepositoryUrl.from("cassandra://var/mail/sender-denied/"); + @ClassRule public static DockerCassandraRule cassandra = new DockerCassandraRule(); @@ -74,7 +77,7 @@ public class CassandraMailRepositoryIntegrationTest { .sendMessage("den...@other.com", "u...@domain.com"); MailRepositoryProbeImpl repositoryProbe = server.getProbe(MailRepositoryProbeImpl.class); - await.until(() -> repositoryProbe.getRepositoryMailCount("cassandra://var/mail/sender-denied/") == 1); + await.until(() -> repositoryProbe.getRepositoryMailCount(SENDER_DENIED_URL) == 1); } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java ---------------------------------------------------------------------- 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 a7e9eda..0365beb 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,6 +25,7 @@ import org.apache.james.filesystem.api.FileSystem; 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.file.FileMailRepository; import org.apache.james.server.core.configuration.ConfigurationProvider; import org.apache.james.utils.ConfigurationPerformer; @@ -69,7 +70,7 @@ public class MailStoreRepositoryModule extends AbstractModule { } @Override - public MailRepository provide(String url) { + public MailRepository provide(MailRepositoryUrl url) { FileMailRepository fileMailRepository = new FileMailRepository(); fileMailRepository.setFileSystem(fileSystem); return fileMailRepository; http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 2c4fab7..0d87a8d 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 @@ -34,6 +34,8 @@ import org.apache.commons.configuration.HierarchicalConfiguration; 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.Protocol; import org.apache.james.repository.api.Initializable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,36 +45,12 @@ import com.google.common.collect.ImmutableList; import com.google.inject.Inject; public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configurable { - - public static class Destination { - - public static Destination fromUrl(String destinationUrl) throws MailRepositoryStoreException { - return new Destination(destinationUrl, retrieveProtocol(destinationUrl)); - } - - private static String retrieveProtocol(String destination) throws MailRepositoryStoreException { - int protocolSeparatorPosition = destination.indexOf(':'); - if (protocolSeparatorPosition == -1) { - throw new MailRepositoryStoreException("Destination is malformed. Must be a valid URL: " + destination); - } - return destination.substring(0, protocolSeparatorPosition); - } - - private final String url; - private final String protocol; - - public Destination(String url, String protocol) { - this.url = url; - this.protocol = protocol; - } - } - private static final Logger LOGGER = LoggerFactory.getLogger(InMemoryMailRepositoryStore.class); private final Set<MailRepositoryProvider> mailRepositories; - private final ConcurrentMap<String, MailRepository> destinationToRepositoryAssociations; - private final Map<String, MailRepositoryProvider> protocolToRepositoryProvider; - private final Map<String, HierarchicalConfiguration> perProtocolMailRepositoryDefaultConfiguration; + private final ConcurrentMap<MailRepositoryUrl, MailRepository> destinationToRepositoryAssociations; + private final Map<Protocol, MailRepositoryProvider> protocolToRepositoryProvider; + private final Map<Protocol, HierarchicalConfiguration> perProtocolMailRepositoryDefaultConfiguration; private HierarchicalConfiguration configuration; @Inject @@ -84,7 +62,7 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu } @Override - public List<String> getUrls() { + public List<MailRepositoryUrl> getUrls() { return ImmutableList.copyOf(destinationToRepositoryAssociations.keySet()); } @@ -111,23 +89,22 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu } @Override - public Optional<MailRepository> get(String url) { + public Optional<MailRepository> get(MailRepositoryUrl url) { return Optional.ofNullable(destinationToRepositoryAssociations.get(url)); } @Override - public MailRepository select(String destinationUrl) throws MailRepositoryStoreException { - Destination destination = Destination.fromUrl(destinationUrl); - return Optional.ofNullable(destinationToRepositoryAssociations.get(destination.url)) + public MailRepository select(MailRepositoryUrl mailRepositoryUrl) { + return Optional.ofNullable(destinationToRepositoryAssociations.get(mailRepositoryUrl)) .orElseGet(Throwing.supplier( - () -> createNewMailRepository(destination)) + () -> createNewMailRepository(mailRepositoryUrl)) .sneakyThrow()); } - private MailRepository createNewMailRepository(Destination destination) throws MailRepositoryStoreException { - MailRepository newMailRepository = retrieveMailRepository(destination); - newMailRepository = initializeNewRepository(newMailRepository, createRepositoryCombinedConfig(destination)); - MailRepository previousRepository = destinationToRepositoryAssociations.putIfAbsent(destination.url, newMailRepository); + private MailRepository createNewMailRepository(MailRepositoryUrl mailRepositoryUrl) throws MailRepositoryStoreException { + MailRepository newMailRepository = retrieveMailRepository(mailRepositoryUrl); + newMailRepository = initializeNewRepository(newMailRepository, createRepositoryCombinedConfig(mailRepositoryUrl)); + MailRepository previousRepository = destinationToRepositoryAssociations.putIfAbsent(mailRepositoryUrl, newMailRepository); return Optional.ofNullable(previousRepository) .orElse(newMailRepository); } @@ -139,12 +116,12 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu .findAny() .orElseThrow(() -> new ConfigurationException("MailRepository " + className + " has not been registered")); for (String protocol : repositoryConfiguration.getStringArray("protocols.protocol")) { - protocolToRepositoryProvider.put(protocol, usedMailRepository); - registerRepositoryDefaultConfiguration(repositoryConfiguration, protocol); + protocolToRepositoryProvider.put(new Protocol(protocol), usedMailRepository); + registerRepositoryDefaultConfiguration(repositoryConfiguration, new Protocol(protocol)); } } - private void registerRepositoryDefaultConfiguration(HierarchicalConfiguration repositoryConfiguration, String protocol) { + private void registerRepositoryDefaultConfiguration(HierarchicalConfiguration repositoryConfiguration, Protocol protocol) { HierarchicalConfiguration defConf = null; if (repositoryConfiguration.getKeys("config").hasNext()) { defConf = repositoryConfiguration.configurationAt("config"); @@ -154,14 +131,14 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu } } - private CombinedConfiguration createRepositoryCombinedConfig(Destination destination) { + private CombinedConfiguration createRepositoryCombinedConfig(MailRepositoryUrl mailRepositoryUrl) { CombinedConfiguration config = new CombinedConfiguration(); - HierarchicalConfiguration defaultProtocolConfig = perProtocolMailRepositoryDefaultConfiguration.get(destination.protocol); + HierarchicalConfiguration defaultProtocolConfig = perProtocolMailRepositoryDefaultConfiguration.get(mailRepositoryUrl.getProtocol()); if (defaultProtocolConfig != null) { config.addConfiguration(defaultProtocolConfig); } DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); - builder.addProperty("[@destinationURL]", destination.url); + builder.addProperty("[@destinationURL]", mailRepositoryUrl.asString()); config.addConfiguration(builder); return config; } @@ -180,10 +157,11 @@ public class InMemoryMailRepositoryStore implements MailRepositoryStore, Configu } } - private MailRepository retrieveMailRepository(Destination destination) throws MailRepositoryStoreException { - return Optional.ofNullable(protocolToRepositoryProvider.get(destination.protocol)) - .orElseThrow(() -> new MailRepositoryStoreException("No Mail Repository associated with " + destination.protocol)) - .provide(destination.url); + 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); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java ---------------------------------------------------------------------- diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java index f49fedd..71f7dec 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProbeImpl.java @@ -23,7 +23,9 @@ import java.util.List; import javax.inject.Inject; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepositoryStore; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import com.google.common.collect.ImmutableList; @@ -39,23 +41,22 @@ public class MailRepositoryProbeImpl implements GuiceProbe { /** * Get the count of email currently stored in a given repository */ - public long getRepositoryMailCount(String url) throws Exception { + public long getRepositoryMailCount(MailRepositoryUrl url) throws Exception { return repositoryStore.select(url).size(); } - public void createRepository(String url) throws Exception { + public void createRepository(MailRepositoryUrl url) throws Exception { repositoryStore.select(url); } - public List<String> listMailKeys(String url) throws Exception { + public List<MailKey> listMailKeys(MailRepositoryUrl url) throws Exception { return ImmutableList.copyOf( repositoryStore.select(url) .list()); } - public List<String> listRepositoryUrls() { - return ImmutableList.copyOf( - repositoryStore.getUrls()); + public List<MailRepositoryUrl> listRepositoryUrls() { + return ImmutableList.copyOf(repositoryStore.getUrls()); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProvider.java ---------------------------------------------------------------------- diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProvider.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProvider.java index e14bb5e..2338616 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProvider.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/MailRepositoryProvider.java @@ -20,10 +20,11 @@ package org.apache.james.utils; import org.apache.james.mailrepository.api.MailRepository; +import org.apache.james.mailrepository.api.MailRepositoryUrl; public interface MailRepositoryProvider { String canonicalName(); - MailRepository provide(String url); + MailRepository provide(MailRepositoryUrl url); } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/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 3321933..cb1e18a 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 @@ -29,6 +29,7 @@ import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.core.builder.MimeMessageBuilder; 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.file.FileMailRepository; import org.apache.james.mailrepository.memory.MemoryMailRepository; import org.apache.james.modules.server.MailStoreRepositoryModule; @@ -43,6 +44,7 @@ import org.junit.Test; import com.google.common.collect.Sets; public class InMemoryMailRepositoryStoreTest { + private static final MailRepositoryUrl FILE_REPO = MailRepositoryUrl.from("file://repo"); private static class MemoryMailRepositoryProvider implements MailRepositoryProvider { @Override @@ -51,7 +53,7 @@ public class InMemoryMailRepositoryStoreTest { } @Override - public MailRepository provide(String url) { + public MailRepository provide(MailRepositoryUrl url) { return new MemoryMailRepository(); } } @@ -77,23 +79,26 @@ public class InMemoryMailRepositoryStoreTest { } @Test(expected = MailRepositoryStore.MailRepositoryStoreException.class) - public void selectingANonRegisteredProtocolShouldFail() throws Exception { - repositoryStore.select("proto://repo"); + public void selectingANonRegisteredProtocolShouldFail() { + repositoryStore.select(MailRepositoryUrl.from("proto://repo")); } @Test - public void selectingARegisteredProtocolShouldWork() throws Exception { - assertThat(repositoryStore.select("file://repo")).isInstanceOf(FileMailRepository.class); + public void selectingARegisteredProtocolShouldWork() { + assertThat(repositoryStore.select(FILE_REPO)) + .isInstanceOf(FileMailRepository.class); } @Test - public void selectingTwiceARegisteredProtocolWithSameDestinationShouldReturnTheSameResult() throws Exception { - assertThat(repositoryStore.select("file://repo")).isEqualTo(repositoryStore.select("file://repo")); + public void selectingTwiceARegisteredProtocolWithSameDestinationShouldReturnTheSameResult() { + assertThat(repositoryStore.select(FILE_REPO)) + .isEqualTo(repositoryStore.select(FILE_REPO)); } @Test - public void selectingTwiceARegisteredProtocolWithDifferentDestinationShouldReturnDifferentResults() throws Exception { - assertThat(repositoryStore.select("file://repo")).isNotEqualTo(repositoryStore.select("file://repo1")); + public void selectingTwiceARegisteredProtocolWithDifferentDestinationShouldReturnDifferentResults() { + assertThat(repositoryStore.select(FILE_REPO)) + .isNotEqualTo(repositoryStore.select(MailRepositoryUrl.from("file://repo1"))); } @Test @@ -123,10 +128,10 @@ public class InMemoryMailRepositoryStoreTest { } @Test - public void getUrlsShouldReturnUsedUrls() throws Exception { - String url1 = "file://repo1"; - String url2 = "file://repo2"; - String url3 = "file://repo3"; + public void getUrlsShouldReturnUsedUrls() { + MailRepositoryUrl url1 = MailRepositoryUrl.from("file://repo1"); + MailRepositoryUrl url2 = MailRepositoryUrl.from("file://repo2"); + MailRepositoryUrl url3 = MailRepositoryUrl.from("file://repo3"); repositoryStore.select(url1); repositoryStore.select(url2); repositoryStore.select(url3); @@ -134,31 +139,29 @@ public class InMemoryMailRepositoryStoreTest { } @Test - public void getUrlsResultsShouldNotBeDuplicated() throws Exception { - String url1 = "file://repo1"; - repositoryStore.select(url1); - repositoryStore.select(url1); - assertThat(repositoryStore.getUrls()).containsExactly(url1); + public void getUrlsResultsShouldNotBeDuplicated() { + repositoryStore.select(FILE_REPO); + repositoryStore.select(FILE_REPO); + assertThat(repositoryStore.getUrls()).containsExactly(FILE_REPO); } @Test public void getShouldReturnEmptyWhenUrlNotInUse() { - assertThat(repositoryStore.get("file://repo")) + assertThat(repositoryStore.get(FILE_REPO)) .isEmpty(); } @Test - public void getShouldReturnPreviouslyCreatedMailRepository() throws Exception { - String url = "file://repo"; - MailRepository mailRepository = repositoryStore.select(url); + public void getShouldReturnPreviouslyCreatedMailRepository() { + MailRepository mailRepository = repositoryStore.select(FILE_REPO); - assertThat(repositoryStore.get(url)) + assertThat(repositoryStore.get(FILE_REPO)) .contains(mailRepository); } @Test public void selectShouldNotReturnDifferentResultsWhenUsedInAConcurrentEnvironment() throws Exception { - String url = "memory://repo"; + MailRepositoryUrl url = MailRepositoryUrl.from("memory://repo"); int threadCount = 10; int operationCount = 1; http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java ---------------------------------------------------------------------- diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java b/server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java index 2004442..b83af66 100644 --- a/server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java +++ b/server/container/spring/src/main/java/org/apache/james/container/spring/bean/factory/mailrepositorystore/MailRepositoryStoreBeanFactory.java @@ -35,6 +35,8 @@ import org.apache.james.container.spring.bean.factory.AbstractBeanFactory; 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.Protocol; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -49,17 +51,17 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen /** * Map of [destinationURL + type]->Repository */ - private Map<String, MailRepository> repositories; + private Map<MailRepositoryUrl, MailRepository> repositories; /** * Map of [protocol(destinationURL) + type ]->classname of repository; */ - private Map<String, String> classes; + private Map<Protocol, String> classes; /** * Map of [protocol(destinationURL) + type ]->default config for repository. */ - private Map<String, HierarchicalConfiguration> defaultConfigs; + private Map<Protocol, HierarchicalConfiguration> defaultConfigs; /** * The configuration used by the instance @@ -67,7 +69,7 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen private HierarchicalConfiguration configuration; @Override - public void configure(HierarchicalConfiguration configuration) throws ConfigurationException { + public void configure(HierarchicalConfiguration configuration) { this.configuration = configuration; } @@ -88,7 +90,7 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen } @Override - public Optional<MailRepository> get(String url) throws MailRepositoryStoreException { + public Optional<MailRepository> get(MailRepositoryUrl url) { return Optional.ofNullable(repositories.get(url)); } @@ -121,14 +123,14 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen LOGGER.info("Registering Repository instance of class {} to handle {} protocol requests", className, protocol); - if (classes.get(protocol) != null) { + if (classes.get(new Protocol(protocol)) != null) { throw new ConfigurationException("The combination of protocol and type comprise a unique key for repositories. This constraint has been violated. Please check your repository configuration."); } - classes.put(protocol, className); + classes.put(new Protocol(protocol), className); if (defConf != null) { - defaultConfigs.put(protocol, defConf); + defaultConfigs.put(new Protocol(protocol), defConf); } } @@ -153,33 +155,26 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen */ @Override @SuppressWarnings("deprecation") - public synchronized MailRepository select(String destination) throws MailRepositoryStoreException { - int idx = destination.indexOf(':'); - if (idx == -1) { - throw new MailRepositoryStoreException("Destination is malformed. Must be a valid URL: " + destination); - } - String protocol = destination.substring(0, idx); - - String repID = destination; - MailRepository reply = repositories.get(repID); + public synchronized MailRepository select(MailRepositoryUrl destination) throws MailRepositoryStoreException { + MailRepository reply = repositories.get(destination); if (reply != null) { - LOGGER.debug("obtained repository: {},{}", repID, reply.getClass()); + LOGGER.debug("obtained repository: {},{}", destination, reply.getClass()); return reply; } else { - String repClass = classes.get(protocol); - LOGGER.debug("obtained repository: {} to handle: {}", repClass, protocol); + String repClass = classes.get(destination.getProtocol()); + LOGGER.debug("obtained repository: {} to handle: {}", repClass, destination.getProtocol().getValue()); // If default values have been set, create a new repository // configuration element using the default values // and the values in the selector. // If no default values, just use the selector. final CombinedConfiguration config = new CombinedConfiguration(); - HierarchicalConfiguration defConf = defaultConfigs.get(protocol); + HierarchicalConfiguration defConf = defaultConfigs.get(destination.getProtocol()); if (defConf != null) { config.addConfiguration(defConf); } DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); - builder.addProperty("[@destinationURL]", destination); + builder.addProperty("[@destinationURL]", destination.asString()); config.addConfiguration(builder); try { @@ -192,10 +187,10 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen ((Configurable) reply).configure(config); } - reply = (MailRepository) getBeanFactory().initializeBean(reply, protocol); + reply = (MailRepository) getBeanFactory().initializeBean(reply, destination.getProtocol().getValue()); - repositories.put(repID, reply); - LOGGER.info("added repository: {}->{}", repID, repClass); + repositories.put(destination, reply); + LOGGER.info("added repository: {}->{}", defConf, repClass); return reply; } catch (Exception e) { LOGGER.warn("Exception while creating repository: {}", e.getMessage(), e); @@ -206,7 +201,7 @@ public class MailRepositoryStoreBeanFactory extends AbstractBeanFactory implemen } @Override - public synchronized List<String> getUrls() { + public synchronized List<MailRepositoryUrl> getUrls() { return new ArrayList<>(repositories.keySet()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java ---------------------------------------------------------------------- diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java b/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java index 42eeded..c3bccbe 100644 --- a/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java +++ b/server/container/spring/src/main/java/org/apache/james/container/spring/tool/James23Importer.java @@ -33,9 +33,11 @@ import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.exception.MailboxExistsException; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryStore; import org.apache.james.mailrepository.api.MailRepositoryStore.MailRepositoryStoreException; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.server.core.MimeMessageInputStream; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; @@ -135,8 +137,8 @@ public class James23Importer { while (james23userRepositoryIterator.hasNext()) { String userName23 = james23userRepositoryIterator.next(); - MailRepository mailRepository = mailRepositoryStore.select(james23MailRepositoryPath + "/" + userName23); - Iterator<String> mailRepositoryIterator = mailRepository.list(); + MailRepository mailRepository = mailRepositoryStore.select(MailRepositoryUrl.from(james23MailRepositoryPath + "/" + userName23)); + Iterator<MailKey> mailRepositoryIterator = mailRepository.list(); String userName30 = convert23UserTo30(userName23); http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java ---------------------------------------------------------------------- diff --git a/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java index 37f1902..e13c31c 100644 --- a/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java +++ b/server/data/data-api/src/main/java/org/apache/james/mailrepository/api/MailRepositoryStore.java @@ -31,13 +31,13 @@ public interface MailRepositoryStore { * @return repository * @throws MailRepositoryStoreException */ - MailRepository select(String url) throws MailRepositoryStoreException; + MailRepository select(MailRepositoryUrl url) throws MailRepositoryStoreException; /** * Create the {@link MailRepository} for the given url and return it. If the repository already exists, * then no new repository is created, the old one will be returned. */ - default MailRepository create(String url) throws MailRepositoryStoreException { + default MailRepository create(MailRepositoryUrl url) throws MailRepositoryStoreException { return select(url); } @@ -45,7 +45,7 @@ public interface MailRepositoryStore { * Returns the {@link MailRepository} for the given url. * This mail repository will not be created if it does not exist. */ - Optional<MailRepository> get(String url) throws MailRepositoryStoreException; + Optional<MailRepository> get(MailRepositoryUrl url) throws MailRepositoryStoreException; /** * Return a {@link List} which contains all urls of the selected @@ -53,7 +53,7 @@ public interface MailRepositoryStore { * * @return urls */ - List<String> getUrls(); + List<MailRepositoryUrl> getUrls(); class MailRepositoryStoreException extends Exception { public MailRepositoryStoreException(String msg, Throwable t) { http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java index 2123562..1f6b1d1 100644 --- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java +++ b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/FileMailRepository.java @@ -36,6 +36,7 @@ import javax.mail.internet.MimeMessage; import org.apache.commons.configuration.DefaultConfigurationBuilder; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.filesystem.api.FileSystem; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.lib.AbstractMailRepository; import org.apache.james.repository.file.FilePersistentObjectRepository; import org.apache.james.repository.file.FilePersistentStreamRepository; @@ -124,7 +125,7 @@ public class FileMailRepository extends AbstractMailRepository { Collection<String> strandedStreams = (Collection<String>) streamKeys.clone(); strandedStreams.removeAll(objectKeys); for (Object strandedStream : strandedStreams) { - String key = (String) strandedStream; + MailKey key = new MailKey((String) strandedStream); remove(key); } @@ -132,7 +133,7 @@ public class FileMailRepository extends AbstractMailRepository { Collection<String> strandedObjects = (Collection<String>) objectKeys.clone(); strandedObjects.removeAll(streamKeys); for (Object strandedObject : strandedObjects) { - String key = (String) strandedObject; + MailKey key = new MailKey((String) strandedObject); remove(key); } @@ -218,11 +219,11 @@ public class FileMailRepository extends AbstractMailRepository { } @Override - public Mail retrieve(String key) throws MessagingException { + public Mail retrieve(MailKey key) throws MessagingException { try { Mail mc; try { - mc = (Mail) objectRepository.get(key); + mc = (Mail) objectRepository.get(key.asString()); } catch (RuntimeException re) { if (re.getCause() instanceof Error) { LOGGER.warn("Error when retrieving mail, not deleting: {}", re, re); @@ -232,7 +233,7 @@ public class FileMailRepository extends AbstractMailRepository { } return null; } - MimeMessageStreamRepositorySource source = new MimeMessageStreamRepositorySource(streamRepository, destination, key); + MimeMessageStreamRepositorySource source = new MimeMessageStreamRepositorySource(streamRepository, destination, key.asString()); mc.setMessage(new MimeMessageCopyOnWriteProxy(source)); return mc; @@ -243,16 +244,16 @@ public class FileMailRepository extends AbstractMailRepository { } @Override - protected void internalRemove(String key) throws MessagingException { + protected void internalRemove(MailKey key) throws MessagingException { if (keys != null) { - keys.remove(key); + keys.remove(key.asString()); } - streamRepository.remove(key); - objectRepository.remove(key); + streamRepository.remove(key.asString()); + objectRepository.remove(key.asString()); } @Override - public Iterator<String> list() { + public Iterator<MailKey> list() { // Fix ConcurrentModificationException by cloning // the keyset before getting an iterator final ArrayList<String> clone; @@ -270,6 +271,8 @@ public class FileMailRepository extends AbstractMailRepository { Collections.sort(clone); // Keys is a HashSet; impose FIFO for apps } // that need it - return clone.iterator(); + return clone.stream() + .map(MailKey::new) + .iterator(); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java index bcc69bb..e4f8350 100755 --- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java +++ b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java @@ -71,6 +71,7 @@ import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.io.FileUtils; import org.apache.james.lifecycle.api.Configurable; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.server.core.MailImpl; import org.apache.mailet.Mail; @@ -467,7 +468,7 @@ public class MBoxMailRepository implements MailRepository, Configurable { } @Override - public void store(Mail mc) { + public MailKey store(Mail mc) { LOGGER.debug("Will store message to file {}", mboxFile); this.mList = null; @@ -494,16 +495,16 @@ public class MBoxMailRepository implements MailRepository, Configurable { saveFile.writeBytes((fromHeader + "\n")); saveFile.writeBytes((message + "\n")); saveFile.close(); - } catch (FileNotFoundException e) { LOGGER.error("Unable to save(open) file (File not found) {}", mboxFile, e); } catch (IOException e) { LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); } + return MailKey.forMail(mc); } @Override - public Iterator<String> list() { + public Iterator<MailKey> list() { ArrayList<String> keys = loadKeysAsArray(); if (!keys.isEmpty()) { @@ -517,7 +518,9 @@ public class MBoxMailRepository implements MailRepository, Configurable { if (fifo) { Collections.sort(keys); // Keys is a HashSet; impose FIFO for apps that need it } - return keys.iterator(); + return keys.stream() + .map(MailKey::new) + .iterator(); } private ArrayList<String> loadKeysAsArray() { @@ -526,19 +529,19 @@ public class MBoxMailRepository implements MailRepository, Configurable { } @Override - public Mail retrieve(String key) throws MessagingException { + public Mail retrieve(MailKey key) throws MessagingException { loadKeys(); MailImpl res; - MimeMessage foundMessage = findMessage(key); + MimeMessage foundMessage = findMessage(key.asString()); if (foundMessage == null) { LOGGER.error("found message is null!"); return null; } res = new MailImpl(); res.setMessage(foundMessage); - res.setName(key); + res.setName(key.asString()); LOGGER.debug("Retrieving entry for key {}", key); return res; } @@ -669,7 +672,7 @@ public class MBoxMailRepository implements MailRepository, Configurable { } @Override - public void remove(String key) throws MessagingException { + public void remove(MailKey key) throws MessagingException { loadKeys(); try { lockMBox(); @@ -685,23 +688,23 @@ public class MBoxMailRepository implements MailRepository, Configurable { } @Override - public boolean lock(String key) { + public boolean lock(MailKey key) { return false; } @Override - public boolean unlock(String key) { + public boolean unlock(MailKey key) { return false; } @Override - public long size() throws MessagingException { + public long size() { return loadKeysAsArray().size(); } @Override public void removeAll() throws MessagingException { ImmutableList.copyOf(list()) - .forEach(Throwing.<String>consumer(this::remove).sneakyThrow()); + .forEach(Throwing.<MailKey>consumer(this::remove).sneakyThrow()); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java ---------------------------------------------------------------------- diff --git a/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java b/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java index b874cd9..30ff7b0 100644 --- a/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java +++ b/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java @@ -26,6 +26,7 @@ import java.util.Iterator; import org.apache.commons.configuration.DefaultConfigurationBuilder; import org.apache.james.filesystem.api.mock.MockFileSystem; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.file.MBoxMailRepository; import org.junit.Test; @@ -67,7 +68,7 @@ public class MBoxMailRepositoryTest { public void testReadMboxrdFile() throws Exception { MailRepository mr = getMailRepository(); - Iterator<String> keys = mr.list(); + Iterator<MailKey> keys = mr.list(); assertTrue("Two messages in list", keys.hasNext()); keys.next(); http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-jcr/src/main/java/org/apache/james/mailrepository/jcr/JCRMailRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-jcr/src/main/java/org/apache/james/mailrepository/jcr/JCRMailRepository.java b/server/data/data-jcr/src/main/java/org/apache/james/mailrepository/jcr/JCRMailRepository.java index 1f9328c..0f57114 100644 --- a/server/data/data-jcr/src/main/java/org/apache/james/mailrepository/jcr/JCRMailRepository.java +++ b/server/data/data-jcr/src/main/java/org/apache/james/mailrepository/jcr/JCRMailRepository.java @@ -59,6 +59,7 @@ import org.apache.jackrabbit.commons.cnd.CndImporter; import org.apache.jackrabbit.util.ISO9075; import org.apache.jackrabbit.util.Text; import org.apache.james.core.MailAddress; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.lib.AbstractMailRepository; import org.apache.james.server.core.MailImpl; @@ -118,7 +119,7 @@ public class JCRMailRepository extends AbstractMailRepository implements MailRep } @Override - public Iterator<String> list() throws MessagingException { + public Iterator<MailKey> list() throws MessagingException { try { Session session = login(); try { @@ -130,7 +131,9 @@ public class JCRMailRepository extends AbstractMailRepository implements MailRep String name = iterator.nextNode().getName(); keys.add(Text.unescapeIllegalJcrChars(name)); } - return keys.iterator(); + return keys.stream() + .map(MailKey::new) + .iterator(); } finally { session.logout(); } @@ -140,11 +143,11 @@ public class JCRMailRepository extends AbstractMailRepository implements MailRep } @Override - public Mail retrieve(String key) throws MessagingException { + public Mail retrieve(MailKey key) throws MessagingException { try { Session session = login(); try { - String name = toSafeName(key); + String name = toSafeName(key.asString()); QueryManager manager = session.getWorkspace().getQueryManager(); Query query = manager.createQuery("/jcr:root/" + MAIL_PATH + "//element(" + name + ",james:mail)", Query.XPATH); NodeIterator iterator = query.execute().getNodes(); @@ -591,11 +594,11 @@ public class JCRMailRepository extends AbstractMailRepository implements MailRep } @Override - protected void internalRemove(String key) throws MessagingException { + protected void internalRemove(MailKey key) throws MessagingException { try { Session session = login(); try { - String name = ISO9075.encode(Text.escapeIllegalJcrChars(key)); + String name = ISO9075.encode(Text.escapeIllegalJcrChars(key.asString())); QueryManager manager = session.getWorkspace().getQueryManager(); Query query = manager.createQuery("/jcr:root/" + MAIL_PATH + "//element(" + name + ",james:mail)", Query.XPATH); NodeIterator nodes = query.execute().getNodes(); http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java index dae0b7b..31a728e 100644 --- a/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java +++ b/server/data/data-jdbc/src/main/java/org/apache/james/mailrepository/jdbc/JDBCMailRepository.java @@ -53,6 +53,7 @@ import org.apache.commons.configuration.DefaultConfigurationBuilder; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.core.MailAddress; import org.apache.james.filesystem.api.FileSystem; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.lib.AbstractMailRepository; import org.apache.james.repository.file.FilePersistentStreamRepository; import org.apache.james.server.core.MailImpl; @@ -592,7 +593,7 @@ public class JDBCMailRepository extends AbstractMailRepository { @Override @SuppressWarnings("unchecked") - public Mail retrieve(String key) throws MessagingException { + public Mail retrieve(MailKey key) throws MessagingException { if (DEEP_DEBUG) { System.err.println("retrieving " + key); } @@ -606,7 +607,7 @@ public class JDBCMailRepository extends AbstractMailRepository { } retrieveMessage = conn.prepareStatement(sqlQueries.getSqlString("retrieveMessageSQL", true)); - retrieveMessage.setString(1, key); + retrieveMessage.setString(1, key.asString()); retrieveMessage.setString(2, repositoryName); rsMessage = retrieveMessage.executeQuery(); if (DEEP_DEBUG) { @@ -625,7 +626,7 @@ public class JDBCMailRepository extends AbstractMailRepository { try { retrieveMessageAttr = conn.prepareStatement(retrieveMessageAttrSql); - retrieveMessageAttr.setString(1, key); + retrieveMessageAttr.setString(1, key.asString()); retrieveMessageAttr.setString(2, repositoryName); rsMessageAttr = retrieveMessageAttr.executeQuery(); @@ -662,7 +663,7 @@ public class JDBCMailRepository extends AbstractMailRepository { MailImpl mc = new MailImpl(); mc.setAttributesRaw(attributes); - mc.setName(key); + mc.setName(key.asString()); mc.setState(rsMessage.getString(1)); mc.setErrorMessage(rsMessage.getString(2)); String sender = rsMessage.getString(3); @@ -681,7 +682,7 @@ public class JDBCMailRepository extends AbstractMailRepository { mc.setRemoteAddr(rsMessage.getString(6)); mc.setLastUpdated(rsMessage.getTimestamp(7)); - MimeMessageJDBCSource source = new MimeMessageJDBCSource(this, key, sr); + MimeMessageJDBCSource source = new MimeMessageJDBCSource(this, key.asString(), sr); MimeMessageCopyOnWriteProxy message = new MimeMessageCopyOnWriteProxy(source); mc.setMessage(message); return mc; @@ -699,18 +700,18 @@ public class JDBCMailRepository extends AbstractMailRepository { } @Override - protected void internalRemove(String key) throws MessagingException { + protected void internalRemove(MailKey key) throws MessagingException { Connection conn = null; PreparedStatement removeMessage = null; try { conn = datasource.getConnection(); removeMessage = conn.prepareStatement(sqlQueries.getSqlString("removeMessageSQL", true)); - removeMessage.setString(1, key); + removeMessage.setString(1, key.asString()); removeMessage.setString(2, repositoryName); removeMessage.execute(); if (sr != null) { - sr.remove(key); + sr.remove(key.asString()); } } catch (Exception me) { throw new MessagingException("Exception while removing mail: " + me.getMessage(), me); @@ -721,7 +722,7 @@ public class JDBCMailRepository extends AbstractMailRepository { } @Override - public Iterator<String> list() throws MessagingException { + public Iterator<MailKey> list() throws MessagingException { // System.err.println("listing messages"); Connection conn = null; PreparedStatement listMessages = null; @@ -736,7 +737,9 @@ public class JDBCMailRepository extends AbstractMailRepository { while (rsListMessages.next() && !Thread.currentThread().isInterrupted()) { messageList.add(rsListMessages.getString(1)); } - return messageList.iterator(); + return messageList.stream() + .map(MailKey::new) + .iterator(); } catch (Exception me) { throw new MessagingException("Exception while listing mail: " + me.getMessage(), me); } finally { http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java b/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java index bc9b813..4e988e5 100644 --- a/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java +++ b/server/data/data-library/src/main/java/org/apache/james/mailrepository/lib/AbstractMailRepository.java @@ -27,6 +27,7 @@ import javax.mail.MessagingException; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.james.lifecycle.api.Configurable; +import org.apache.james.mailrepository.api.MailKey; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.repository.api.Initializable; import org.apache.mailet.Mail; @@ -73,7 +74,7 @@ public abstract class AbstractMailRepository implements MailRepository, Configur * @return true if successfully released the lock, false otherwise */ @Override - public boolean unlock(String key) { + public boolean unlock(MailKey key) { return lock.unlock(key); } @@ -86,14 +87,14 @@ public abstract class AbstractMailRepository implements MailRepository, Configur * @return true if successfully obtained the lock, false otherwise */ @Override - public boolean lock(String key) { + public boolean lock(MailKey key) { return lock.lock(key); } @Override - public void store(Mail mc) throws MessagingException { + public MailKey store(Mail mc) throws MessagingException { boolean wasLocked = true; - String key = mc.getName(); + MailKey key = MailKey.forMail(mc); try { synchronized (this) { wasLocked = lock.isLocked(key); @@ -103,6 +104,7 @@ public abstract class AbstractMailRepository implements MailRepository, Configur } } internalStore(mc); + return key; } catch (MessagingException e) { LOGGER.error("Exception caught while storing mail {}", key, e); throw e; @@ -124,7 +126,7 @@ public abstract class AbstractMailRepository implements MailRepository, Configur @Override public void remove(Mail mail) throws MessagingException { - remove(mail.getName()); + remove(MailKey.forMail(mail)); } @Override @@ -135,7 +137,7 @@ public abstract class AbstractMailRepository implements MailRepository, Configur } @Override - public void remove(String key) throws MessagingException { + public void remove(MailKey key) throws MessagingException { if (lock(key)) { try { internalRemove(key); @@ -143,12 +145,11 @@ public abstract class AbstractMailRepository implements MailRepository, Configur unlock(key); } } else { - String exceptionBuffer = "Cannot lock " + key + " to remove it"; - throw new MessagingException(exceptionBuffer.toString()); + throw new MessagingException("Cannot lock " + key + " to remove it"); } } - protected abstract void internalRemove(String key) throws MessagingException; + protected abstract void internalRemove(MailKey key) throws MessagingException; @Override public long size() throws MessagingException { @@ -158,6 +159,6 @@ public abstract class AbstractMailRepository implements MailRepository, Configur @Override public void removeAll() throws MessagingException { ImmutableList.copyOf(list()) - .forEach(Throwing.<String>consumer(this::remove).sneakyThrow()); + .forEach(Throwing.<MailKey>consumer(this::remove).sneakyThrow()); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/data/data-library/src/test/java/org/apache/james/mailrepository/mock/MockMailRepositoryStore.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/test/java/org/apache/james/mailrepository/mock/MockMailRepositoryStore.java b/server/data/data-library/src/test/java/org/apache/james/mailrepository/mock/MockMailRepositoryStore.java index ef9e085..f232e43 100644 --- a/server/data/data-library/src/test/java/org/apache/james/mailrepository/mock/MockMailRepositoryStore.java +++ b/server/data/data-library/src/test/java/org/apache/james/mailrepository/mock/MockMailRepositoryStore.java @@ -27,27 +27,28 @@ import java.util.Optional; import org.apache.james.mailrepository.api.MailRepository; import org.apache.james.mailrepository.api.MailRepositoryStore; +import org.apache.james.mailrepository.api.MailRepositoryUrl; public class MockMailRepositoryStore implements MailRepositoryStore { - final Map<String, MailRepository> storedObjectMap = new HashMap<>(); + private final Map<MailRepositoryUrl, MailRepository> storedObjectMap = new HashMap<>(); - public void add(String url, MailRepository obj) { + public void add(MailRepositoryUrl url, MailRepository obj) { storedObjectMap.put(url, obj); } @Override - public MailRepository select(String url) throws MailRepositoryStoreException { + public MailRepository select(MailRepositoryUrl url) { return storedObjectMap.get(url); } @Override - public Optional<MailRepository> get(String url) throws MailRepositoryStoreException { + public Optional<MailRepository> get(MailRepositoryUrl url) { return Optional.ofNullable(storedObjectMap.get(url)); } @Override - public List<String> getUrls() { + public List<MailRepositoryUrl> getUrls() { return new ArrayList<>(storedObjectMap.keySet()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java index ffd8013..0dc9ed0 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/MailetErrorsTest.java @@ -31,6 +31,7 @@ import org.apache.james.mailets.configuration.CommonProcessors; import org.apache.james.mailets.configuration.MailetConfiguration; import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.mailets.configuration.ProcessorConfiguration; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.transport.mailets.ErrorMailet; import org.apache.james.transport.mailets.ErrorMatcher; import org.apache.james.transport.mailets.NoopMailet; @@ -49,7 +50,7 @@ import org.junit.rules.TemporaryFolder; public class MailetErrorsTest { public static final String CUSTOM_PROCESSOR = "custom"; - public static final String CUSTOM_REPOSITORY = "file://var/mail/custom/"; + public static final MailRepositoryUrl CUSTOM_REPOSITORY = MailRepositoryUrl.from("file://var/mail/custom/"); @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -162,7 +163,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)))) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())))) .build(temporaryFolder); MailRepositoryProbeImpl probe = jamesServer.getProbe(MailRepositoryProbeImpl.class); @@ -187,7 +188,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)))) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())))) .build(temporaryFolder); MailRepositoryProbeImpl probe = jamesServer.getProbe(MailRepositoryProbeImpl.class); @@ -292,7 +293,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)))) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())))) .build(temporaryFolder); MailRepositoryProbeImpl probe = jamesServer.getProbe(MailRepositoryProbeImpl.class); @@ -317,7 +318,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)))) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())))) .build(temporaryFolder); MailRepositoryProbeImpl probe = jamesServer.getProbe(MailRepositoryProbeImpl.class); @@ -338,7 +339,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(RuntimeErrorMatcher.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString()) .addProperty("onMatchException", "matchall")) .addMailet(MailetConfiguration.builder() .matcher(All.class) @@ -363,7 +364,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(ErrorMatcher.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString()) .addProperty("onMatchException", "matchall")) .addMailet(MailetConfiguration.builder() .matcher(All.class) @@ -387,11 +388,11 @@ public class MailetErrorsTest { .matcher(HasException.class) .matcherCondition("javax.mail.MessagingException") .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())) .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY))) + .addProperty("repositoryPath", ERROR_REPOSITORY.asString()))) .putProcessor(customProcessor()) .putProcessor(ProcessorConfiguration.root() .addMailet(MailetConfiguration.builder() @@ -416,11 +417,11 @@ public class MailetErrorsTest { .matcher(HasException.class) .matcherCondition("javax.mail.MessagingException") .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())) .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY))) + .addProperty("repositoryPath", ERROR_REPOSITORY.asString()))) .putProcessor(customProcessor()) .putProcessor(ProcessorConfiguration.root() .addMailet(MailetConfiguration.builder() @@ -445,11 +446,11 @@ public class MailetErrorsTest { .matcher(HasException.class) .matcherCondition("javax.mail.MessagingException") .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())) .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY))) + .addProperty("repositoryPath", ERROR_REPOSITORY.asString()))) .putProcessor(customProcessor()) .putProcessor(ProcessorConfiguration.root() .addMailet(MailetConfiguration.builder() @@ -474,11 +475,11 @@ public class MailetErrorsTest { .matcher(HasException.class) .matcherCondition("javax.mail.MessagingException") .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)) + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())) .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY))) + .addProperty("repositoryPath", ERROR_REPOSITORY.asString()))) .putProcessor(customProcessor()) .putProcessor(ProcessorConfiguration.root() .addMailet(MailetConfiguration.builder() @@ -497,7 +498,7 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY)); + .addProperty("repositoryPath", ERROR_REPOSITORY.asString())); } private ProcessorConfiguration.Builder customProcessor() { @@ -506,6 +507,6 @@ public class MailetErrorsTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY)); + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString())); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java index 7fcc013..7132860 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/NetworkMatcherIntegrationTest.java @@ -31,6 +31,7 @@ import org.apache.james.MemoryJamesServerMain; import org.apache.james.mailets.configuration.CommonProcessors; import org.apache.james.mailets.configuration.MailetConfiguration; import org.apache.james.mailets.configuration.ProcessorConfiguration; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.probe.DataProbe; import org.apache.james.transport.mailets.ToProcessor; import org.apache.james.transport.mailets.ToRepository; @@ -48,7 +49,7 @@ import org.junit.rules.TemporaryFolder; public class NetworkMatcherIntegrationTest { private static final String FROM = "fromuser@" + DEFAULT_DOMAIN; - private static final String DROPPED_MAILS = "file://var/mail/dropped-mails/"; + private static final MailRepositoryUrl DROPPED_MAILS = MailRepositoryUrl.from("file://var/mail/dropped-mails/"); @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -77,7 +78,7 @@ public class NetworkMatcherIntegrationTest { return MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", DROPPED_MAILS); + .addProperty("repositoryPath", DROPPED_MAILS.asString()); } @After http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java index 0796b77..4f5085e 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/SmtpAuthIntegrationTest.java @@ -32,6 +32,7 @@ import org.apache.james.mailets.configuration.CommonProcessors; import org.apache.james.mailets.configuration.MailetConfiguration; import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.mailets.configuration.ProcessorConfiguration; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.probe.DataProbe; import org.apache.james.transport.mailets.ToProcessor; import org.apache.james.transport.mailets.ToRepository; @@ -49,7 +50,7 @@ import org.junit.rules.TemporaryFolder; public class SmtpAuthIntegrationTest { private static final String FROM = "fromuser@" + DEFAULT_DOMAIN; - private static final String DROPPED_MAILS = "file://var/mail/dropped-mails/"; + private static final MailRepositoryUrl DROPPED_MAILS = MailRepositoryUrl.from("file://var/mail/dropped-mails/"); @Rule public IMAPMessageReader imapMessageReader = new IMAPMessageReader(); @@ -91,7 +92,7 @@ public class SmtpAuthIntegrationTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", DROPPED_MAILS)); + .addProperty("repositoryPath", DROPPED_MAILS.asString())); } @After http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java index 73daf8b..d465620 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/configuration/CommonProcessors.java @@ -21,6 +21,7 @@ package org.apache.james.mailets.configuration; import org.apache.james.jmap.mailet.VacationMailet; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.transport.mailets.AddDeliveredToHeader; import org.apache.james.transport.mailets.Bounce; import org.apache.james.transport.mailets.DSNBounce; @@ -46,7 +47,7 @@ import org.apache.mailet.Mail; public class CommonProcessors { - public static final String ERROR_REPOSITORY = "file://var/mail/error/"; + public static final MailRepositoryUrl ERROR_REPOSITORY = MailRepositoryUrl.from("file://var/mail/error/"); public static ProcessorConfiguration root() { return ProcessorConfiguration.root() @@ -106,7 +107,7 @@ public class CommonProcessors { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", ERROR_REPOSITORY)) + .addProperty("repositoryPath", ERROR_REPOSITORY.asString())) .build(); } http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java index f0f6ba6..45bbcd8 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingTest.java @@ -39,6 +39,7 @@ import org.apache.james.mailets.configuration.CommonProcessors; import org.apache.james.mailets.configuration.MailetConfiguration; import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.mailets.configuration.ProcessorConfiguration; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.modules.MailboxProbeImpl; import org.apache.james.probe.DataProbe; import org.apache.james.transport.matchers.All; @@ -74,7 +75,7 @@ public class GroupMappingTest { private static final String USER_DOMAIN2 = "user@" + DOMAIN2; private static final String MESSAGE_CONTENT = "any text"; public static final String RRT_ERROR = "rrt-error"; - public static final String RRT_ERROR_REPOSITORY = "file://var/mail/rrt-error/"; + public static final MailRepositoryUrl RRT_ERROR_REPOSITORY = MailRepositoryUrl.from("file://var/mail/rrt-error/"); private TemporaryJamesServer jamesServer; private MimeMessage message; @@ -111,7 +112,7 @@ public class GroupMappingTest { .matcher(All.class) .mailet(ToRepository.class) .addProperty("passThrough", "true") - .addProperty("repositoryPath", RRT_ERROR_REPOSITORY)) + .addProperty("repositoryPath", RRT_ERROR_REPOSITORY.asString())) .addMailet(MailetConfiguration.builder() .matcher(IsSenderInRRTLoop.class) .mailet(Null.class)) http://git-wip-us.apache.org/repos/asf/james-project/blob/946c68be/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java index 04c4abd..0fecd96 100644 --- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java +++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ToRepositoryTest.java @@ -27,13 +27,12 @@ import static org.apache.james.mailets.configuration.Constants.PASSWORD; import static org.apache.james.mailets.configuration.Constants.SMTP_PORT; import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; - import org.apache.james.mailets.TemporaryJamesServer; import org.apache.james.mailets.configuration.MailetConfiguration; import org.apache.james.mailets.configuration.MailetContainer; import org.apache.james.mailets.configuration.ProcessorConfiguration; +import org.apache.james.mailrepository.api.MailKey; +import org.apache.james.mailrepository.api.MailRepositoryUrl; import org.apache.james.probe.DataProbe; import org.apache.james.transport.matchers.All; import org.apache.james.utils.DataProbeImpl; @@ -54,7 +53,7 @@ import com.jayway.restassured.specification.RequestSpecification; public class ToRepositoryTest { private static final String RECIPIENT = "touser@" + DEFAULT_DOMAIN; - public static final String CUSTOM_REPOSITORY = "file://var/mail/custom/"; + public static final MailRepositoryUrl CUSTOM_REPOSITORY = MailRepositoryUrl.from("file://var/mail/custom/"); @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -74,7 +73,7 @@ public class ToRepositoryTest { .addMailet(MailetConfiguration.builder() .matcher(All.class) .mailet(ToRepository.class) - .addProperty("repositoryPath", CUSTOM_REPOSITORY))); + .addProperty("repositoryPath", CUSTOM_REPOSITORY.asString()))); jamesServer = TemporaryJamesServer.builder() .withMailetContainer(mailetContainer) @@ -118,7 +117,7 @@ public class ToRepositoryTest { .queryParam("processor", ProcessorConfiguration.STATE_TRANSPORT) .queryParam("action", "reprocess") .patch(MailRepositoriesRoutes.MAIL_REPOSITORIES - + "/" + URLEncoder.encode(CUSTOM_REPOSITORY, StandardCharsets.UTF_8.displayName()) + + "/" + CUSTOM_REPOSITORY.urlEncoded() + "/mails") .jsonPath() .getString("taskId"); @@ -142,15 +141,15 @@ public class ToRepositoryTest { .sendMessage(RECIPIENT, RECIPIENT); awaitAtMostOneMinute.until(() -> probe.getRepositoryMailCount(CUSTOM_REPOSITORY) == 2); - String key = probe.listMailKeys(CUSTOM_REPOSITORY).get(0); + MailKey key = probe.listMailKeys(CUSTOM_REPOSITORY).get(0); with() .spec(webAdminAPI) .queryParam("processor", ProcessorConfiguration.STATE_TRANSPORT) .queryParam("action", "reprocess") .patch(MailRepositoriesRoutes.MAIL_REPOSITORIES - + "/" + URLEncoder.encode(CUSTOM_REPOSITORY, StandardCharsets.UTF_8.displayName()) - + "/mails/" + key) + + "/" + CUSTOM_REPOSITORY.urlEncoded() + + "/mails/" + key.asString()) .jsonPath() .get("taskId"); --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org