MAILBOX-266 ElasticSearch client should be instanciated once Note : this commit includes a complete rework of how James MPT SMPT tests works. - Rely on the guice project (which highlight the initialization problem and that it brakes SMPT) - Better manage resources
This was needed because ElasticSearch was never truly configured before. Which you can do with a client provider (you end up never instanciating the client) but not if you rely on a real client. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6628e4f4 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6628e4f4 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6628e4f4 Branch: refs/heads/master Commit: 6628e4f40fdbbf4a93bf995c1fb1779e4884e9fa Parents: 7f02ab7 Author: Benoit Tellier <btell...@linagora.com> Authored: Fri Apr 1 14:57:52 2016 +0700 Committer: Benoit Tellier <btell...@linagora.com> Committed: Wed Apr 6 16:18:45 2016 +0700 ---------------------------------------------------------------------- .../elasticsearch/DeleteByQueryPerformer.java | 30 +++-- .../elasticsearch/ElasticSearchIndexer.java | 34 +++--- .../elasticsearch/IndexCreationFactory.java | 16 ++- .../elasticsearch/NodeMappingFactory.java | 24 ++-- .../search/ElasticSearchSearcher.java | 19 ++- .../elasticsearch/ElasticSearchIndexerTest.java | 4 +- .../ElasticSearchIntegrationTest.java | 9 +- .../search/ScrollIterableTest.java | 4 +- .../apache/james/mpt/api/SmtpHostSystem.java | 24 ---- .../host/ElasticSearchHostSystem.java | 10 +- .../apache/james/mpt/smtp/SmtpTestModule.java | 82 +------------ .../smtp/host/CassandraJamesSmtpHostSystem.java | 115 +++++++++++++++++++ .../mpt/smtp/host/JamesSmtpHostSystem.java | 80 ------------- .../apache/james/mpt/smtp/ForwardSmtpTest.java | 18 +-- .../apache/james/mpt/smtp/SmtpHostSystem.java | 31 +++++ .../mailbox/ElasticSearchMailboxModule.java | 17 +-- .../modules/CassandraJmapServerModule.java | 67 +++++++++++ .../james/modules/TestElasticSearchModule.java | 6 +- .../apache/james/utils/GuiceServerProbe.java | 16 ++- .../CassandraGetMailboxesMethodTest.java | 2 +- .../CassandraGetMessageListMethodTest.java | 2 +- .../CassandraGetMessagesMethodTest.java | 2 +- .../CassandraJmapAuthenticationTest.java | 2 +- .../CassandraSetMailboxesMethodTest.java | 2 +- .../CassandraSetMessagesMethodTest.java | 2 +- .../jmap/servers/CassandraJmapServerModule.java | 64 ----------- 26 files changed, 317 insertions(+), 365 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java index f2a54fa..772432c 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java @@ -40,18 +40,18 @@ public class DeleteByQueryPerformer { public static final int DEFAULT_BATCH_SIZE = 100; public static final TimeValue TIMEOUT = new TimeValue(60000); - private final ClientProvider clientProvider; + private final Client client; private final ExecutorService executor; private final int batchSize; @Inject - public DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor) { - this(clientProvider, executor, DEFAULT_BATCH_SIZE); + public DeleteByQueryPerformer(Client client, @Named("AsyncExecutor") ExecutorService executor) { + this(client, executor, DEFAULT_BATCH_SIZE); } @VisibleForTesting - DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor, int batchSize) { - this.clientProvider = clientProvider; + DeleteByQueryPerformer(Client client, @Named("AsyncExecutor") ExecutorService executor, int batchSize) { + this.client = client; this.executor = executor; this.batchSize = batchSize; } @@ -62,17 +62,15 @@ public class DeleteByQueryPerformer { } protected void doDeleteByQuery(QueryBuilder queryBuilder) { - try (Client client = clientProvider.get()) { - new ScrollIterable(client, - client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX) - .setTypes(ElasticSearchIndexer.MESSAGE_TYPE) - .setScroll(TIMEOUT) - .setNoFields() - .setQuery(queryBuilder) - .setSize(batchSize)) - .stream() - .forEach(searchResponse -> deleteRetrievedIds(client, searchResponse)); - } + new ScrollIterable(client, + client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX) + .setTypes(ElasticSearchIndexer.MESSAGE_TYPE) + .setScroll(TIMEOUT) + .setNoFields() + .setQuery(queryBuilder) + .setSize(batchSize)) + .stream() + .forEach(searchResponse -> deleteRetrievedIds(client, searchResponse)); } private ListenableActionFuture<BulkResponse> deleteRetrievedIds(Client client, SearchResponse searchResponse) { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java index 1292b28..5f99fd6 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java @@ -56,40 +56,34 @@ public class ElasticSearchIndexer { public static final String MAILBOX_INDEX = "mailbox"; public static final String MESSAGE_TYPE = "message"; - private final ClientProvider clientProvider; + private final Client client; private final DeleteByQueryPerformer deleteByQueryPerformer; @Inject - public ElasticSearchIndexer(ClientProvider clientProvider, DeleteByQueryPerformer deleteByQueryPerformer) { - this.clientProvider = clientProvider; + public ElasticSearchIndexer(Client client, DeleteByQueryPerformer deleteByQueryPerformer) { + this.client = client; this.deleteByQueryPerformer = deleteByQueryPerformer; } public IndexResponse indexMessage(String id, String content) { checkArgument(content); - try (Client client = clientProvider.get()) { - return client.prepareIndex(MAILBOX_INDEX, MESSAGE_TYPE, id) - .setSource(content) - .get(); - } + return client.prepareIndex(MAILBOX_INDEX, MESSAGE_TYPE, id) + .setSource(content) + .get(); } public BulkResponse updateMessages(List<UpdatedRepresentation> updatedDocumentParts) { Preconditions.checkNotNull(updatedDocumentParts); - try (Client client = clientProvider.get()) { - BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); - updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId()) - .setDoc(updatedDocumentPart.getUpdatedDocumentPart()))); - return bulkRequestBuilder.get(); - } + BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); + updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId()) + .setDoc(updatedDocumentPart.getUpdatedDocumentPart()))); + return bulkRequestBuilder.get(); } - + public BulkResponse deleteMessages(List<String> ids) { - try (Client client = clientProvider.get()) { - BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); - ids.forEach(id -> bulkRequestBuilder.add(client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id))); - return bulkRequestBuilder.get(); - } + BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); + ids.forEach(id -> bulkRequestBuilder.add(client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id))); + return bulkRequestBuilder.get(); } public Void deleteAllMatchingQuery(QueryBuilder queryBuilder) { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java index 6cf0933..c4a8060 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java @@ -36,33 +36,31 @@ public class IndexCreationFactory { private static final int DEFAULT_NB_REPLICA = 0; public static final String CASE_INSENSITIVE = "case_insensitive"; - public static ClientProvider createIndex(ClientProvider clientProvider, int nbShards, int nbReplica) { + public static Client createIndex(Client client, int nbShards, int nbReplica) { try { - return createIndex(clientProvider, generateSetting(nbShards, nbReplica)); + return createIndex(client, generateSetting(nbShards, nbReplica)); } catch (IOException e) { LOGGER.error("Error while creating index : ", e); - return clientProvider; + return client; } } - public static ClientProvider createIndex(ClientProvider clientProvider) { - return createIndex(clientProvider, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA); + public static Client createIndex(Client client) { + return createIndex(client, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA); } - private static ClientProvider createIndex(ClientProvider clientProvider, XContentBuilder settings) { + private static Client createIndex(Client client, XContentBuilder settings) { try { - try (Client client = clientProvider.get()) { client.admin() .indices() .prepareCreate(ElasticSearchIndexer.MAILBOX_INDEX) .setSettings(settings) .execute() .actionGet(); - } } catch (IndexAlreadyExistsException exception) { LOGGER.info("Index [" + ElasticSearchIndexer.MAILBOX_INDEX + "] already exist"); } - return clientProvider; + return client; } private static XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java index 85b5b05..f74da92 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java @@ -45,21 +45,19 @@ public class NodeMappingFactory { public static final String RAW = "raw"; public static final String ANALYZER = "analyzer"; - public static ClientProvider applyMapping(ClientProvider clientProvider) { - return applyMapping(clientProvider, getMappingContent()); + public static Client applyMapping(Client client) { + return applyMapping(client, getMappingContent()); } - public static ClientProvider applyMapping(ClientProvider clientProvider, XContentBuilder mappingsSources) { - try (Client client = clientProvider.get()) { - client.admin() - .indices() - .preparePutMapping(ElasticSearchIndexer.MAILBOX_INDEX) - .setType(ElasticSearchIndexer.MESSAGE_TYPE) - .setSource(mappingsSources) - .execute() - .actionGet(); - } - return clientProvider; + public static Client applyMapping(Client client, XContentBuilder mappingsSources) { + client.admin() + .indices() + .preparePutMapping(ElasticSearchIndexer.MAILBOX_INDEX) + .setType(ElasticSearchIndexer.MESSAGE_TYPE) + .setSource(mappingsSources) + .execute() + .actionGet(); + return client; } private static XContentBuilder getMappingContent() { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java index b5e1792..39e74c2 100644 --- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java +++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java @@ -26,7 +26,6 @@ import java.util.stream.StreamSupport; import javax.inject.Inject; -import org.apache.james.mailbox.elasticsearch.ClientProvider; import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants; import org.apache.james.mailbox.elasticsearch.query.QueryConverter; @@ -49,27 +48,25 @@ public class ElasticSearchSearcher<Id extends MailboxId> { private static final TimeValue TIMEOUT = new TimeValue(60000); public static final int DEFAULT_SIZE = 100; - private final ClientProvider clientProvider; + private final Client client; private final QueryConverter queryConverter; private final int size; @Inject - public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter) { - this(clientProvider, queryConverter, DEFAULT_SIZE); + public ElasticSearchSearcher(Client client, QueryConverter queryConverter) { + this(client, queryConverter, DEFAULT_SIZE); } - public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter, int size) { - this.clientProvider = clientProvider; + public ElasticSearchSearcher(Client client, QueryConverter queryConverter, int size) { + this.client = client; this.queryConverter = queryConverter; this.size = size; } public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException { - try (Client client = clientProvider.get()) { - return new ScrollIterable(client, getSearchRequestBuilder(client, mailbox, searchQuery)).stream() - .flatMap(this::transformResponseToUidStream) - .iterator(); - } + return new ScrollIterable(client, getSearchRequestBuilder(client, mailbox, searchQuery)).stream() + .flatMap(this::transformResponseToUidStream) + .iterator(); } private SearchRequestBuilder getSearchRequestBuilder(Client client, Mailbox<Id> mailbox, SearchQuery searchQuery) { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java index f5e30c8..2acca41 100644 --- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java +++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java @@ -56,14 +56,14 @@ public class ElasticSearchIndexerTest { public void setup() throws IOException { node = embeddedElasticSearch.getNode(); TestingClientProvider clientProvider = new TestingClientProvider(node); - DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) { + DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider.get(), Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) { @Override public Void perform(QueryBuilder queryBuilder) { doDeleteByQuery(queryBuilder); return null; } }; - testee = new ElasticSearchIndexer(clientProvider, deleteByQueryPerformer); + testee = new ElasticSearchIndexer(clientProvider.get(), deleteByQueryPerformer); } @Test http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java index e2ddc84..90f9844 100644 --- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java +++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java @@ -49,6 +49,7 @@ import org.apache.james.mailbox.store.MockAuthenticator; import org.apache.james.mailbox.store.StoreMailboxManager; import org.apache.james.mailbox.store.StoreMessageManager; import org.apache.james.mailbox.store.mail.model.Mailbox; +import org.elasticsearch.client.Client; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -165,13 +166,13 @@ public class ElasticSearchIntegrationTest { } private void initializeMailboxManager() throws Exception { - ClientProvider clientProvider = NodeMappingFactory.applyMapping( - IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode())) + Client client = NodeMappingFactory.applyMapping( + IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get()) ); MailboxSessionMapperFactory<InMemoryId> mapperFactory = new InMemoryMailboxSessionMapperFactory(); elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory, - new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), BATCH_SIZE)), - new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter()), SEARCH_SIZE), + new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor(), BATCH_SIZE)), + new ElasticSearchSearcher<>(client, new QueryConverter(new CriterionConverter()), SEARCH_SIZE), new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris"))); storeMailboxManager = new InMemoryMailboxManager( mapperFactory, http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java ---------------------------------------------------------------------- diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java index 2d574f0..75313a1 100644 --- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java +++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java @@ -62,9 +62,9 @@ public class ScrollIterableTest { @Before public void setUp() throws Exception { clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode()); - IndexCreationFactory.createIndex(clientProvider); + IndexCreationFactory.createIndex(clientProvider.get()); embeddedElasticSearch.awaitForElasticSearch(); - NodeMappingFactory.applyMapping(clientProvider, getMappingsSources()); + NodeMappingFactory.applyMapping(clientProvider.get(), getMappingsSources()); } private XContentBuilder getMappingsSources() throws IOException { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java deleted file mode 100644 index 575115d..0000000 --- a/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java +++ /dev/null @@ -1,24 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mpt.api; - -public interface SmtpHostSystem extends HostSystem { - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java index d90329b..f15a71b 100644 --- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java +++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java @@ -32,7 +32,6 @@ import org.apache.james.mailbox.acl.GroupMembershipResolver; import org.apache.james.mailbox.acl.MailboxACLResolver; import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; -import org.apache.james.mailbox.elasticsearch.ClientProvider; import org.apache.james.mailbox.elasticsearch.DeleteByQueryPerformer; import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; @@ -58,6 +57,7 @@ import org.apache.james.mpt.api.ImapFeatures; import org.apache.james.mpt.api.ImapFeatures.Feature; import org.apache.james.mpt.host.JamesImapHostSystem; import org.apache.james.mpt.imapmailbox.MailboxCreationDelegate; +import org.elasticsearch.client.Client; import com.google.common.base.Throwables; @@ -95,8 +95,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem { } private void initFields() { - ClientProvider clientProvider = NodeMappingFactory.applyMapping( - IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode())) + Client client = NodeMappingFactory.applyMapping( + IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get()) ); userManager = new MockAuthenticator(); @@ -104,8 +104,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem { ElasticSearchListeningMessageSearchIndex<InMemoryId> searchIndex = new ElasticSearchListeningMessageSearchIndex<>( factory, - new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor())), - new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter())), + new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor())), + new ElasticSearchSearcher<>(client, new QueryConverter(new CriterionConverter())), new MessageToElasticSearchJson(new DefaultTextExtractor())); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java ---------------------------------------------------------------------- diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java index 493f8ff..7e1d3fd 100644 --- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java +++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java @@ -18,93 +18,15 @@ ****************************************************************/ package org.apache.james.mpt.smtp; -import java.io.IOException; +import org.apache.james.mpt.smtp.host.CassandraJamesSmtpHostSystem; -import org.apache.james.CassandraJamesServerMain; -import org.apache.james.backends.cassandra.CassandraCluster; -import org.apache.james.backends.cassandra.init.CassandraModuleComposite; -import org.apache.james.dnsservice.api.DNSService; -import org.apache.james.domainlist.api.DomainList; -import org.apache.james.domainlist.cassandra.CassandraDomainListModule; -import org.apache.james.jmap.JMAPConfiguration; -import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; -import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule; -import org.apache.james.mailbox.elasticsearch.ClientProvider; -import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; -import org.apache.james.modules.CommonServicesModule; -import org.apache.james.modules.MailetProcessingModule; -import org.apache.james.modules.ProtocolsModule; -import org.apache.james.modules.TestFilesystemModule; -import org.apache.james.mpt.api.SmtpHostSystem; -import org.apache.james.mpt.smtp.dns.InMemoryDNSService; -import org.apache.james.mpt.smtp.host.JamesSmtpHostSystem; -import org.apache.james.rrt.cassandra.CassandraRRTModule; -import org.apache.james.user.api.UsersRepository; -import org.apache.james.user.cassandra.CassandraUsersRepositoryModule; -import org.apache.james.utils.ConfigurationsPerformer; -import org.junit.rules.TemporaryFolder; - -import com.datastax.driver.core.Session; import com.google.inject.AbstractModule; -import com.google.inject.Module; -import com.google.inject.Provides; -import com.google.inject.Scopes; -import com.google.inject.Singleton; -import com.google.inject.util.Modules; public class SmtpTestModule extends AbstractModule { - private final TemporaryFolder folder = new TemporaryFolder(); - private final CassandraCluster cassandraClusterSingleton; - private final EmbeddedElasticSearch embeddedElasticSearch; - - public SmtpTestModule() throws IOException { - folder.create(); - CassandraModuleComposite cassandraModuleComposite = new CassandraModuleComposite( - new CassandraMailboxModule(), - new CassandraMessageModule(), - new CassandraDomainListModule(), - new CassandraUsersRepositoryModule(), - new CassandraRRTModule()); - cassandraClusterSingleton = CassandraCluster.create(cassandraModuleComposite); - - embeddedElasticSearch = new EmbeddedElasticSearch(folder); - } - @Override protected void configure() { - Module cassandra = (binder) -> binder.bind(Session.class).toInstance(cassandraClusterSingleton.getConf()); - Module dns = (binder) -> { - binder.bind(InMemoryDNSService.class).in(Scopes.SINGLETON); - binder.bind(DNSService.class).to(InMemoryDNSService.class); - }; - Module elasticSearch = (binder) -> binder.bind(ClientProvider.class).toInstance(() -> embeddedElasticSearch.getNode().client()); - Module jmap = (binder) -> { - binder.bind(JMAPConfiguration.class).toInstance( - JMAPConfiguration.builder() - .keystore("keystore") - .secret("james72laBalle") - .randomPort() - .build()); - }; - - install(Modules - .override( - CassandraJamesServerMain.cassandraServerModule, - new CommonServicesModule<>(CassandraJamesServerMain.cassandraId), - new ProtocolsModule<>(CassandraJamesServerMain.cassandraId), - new MailetProcessingModule()) - .with(new TestFilesystemModule(folder), - cassandra, - dns, - elasticSearch, - jmap)); + bind(SmtpHostSystem.class).to(CassandraJamesSmtpHostSystem.class); } - - @Provides - @Singleton - public SmtpHostSystem provideHostSystem(ConfigurationsPerformer configurationsPerformer, DomainList domainList, UsersRepository usersRepository) throws Exception { - return new JamesSmtpHostSystem(configurationsPerformer, domainList, usersRepository); - } } http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java new file mode 100644 index 0000000..7cd0040 --- /dev/null +++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java @@ -0,0 +1,115 @@ +/**************************************************************** + * 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.mpt.smtp.host; + +import java.util.Iterator; + +import org.apache.james.CassandraJamesServerMain; +import org.apache.james.GuiceJamesServer; +import org.apache.james.backends.cassandra.EmbeddedCassandra; +import org.apache.james.dnsservice.api.DNSService; +import org.apache.james.mailbox.cassandra.CassandraId; +import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; +import org.apache.james.modules.CassandraJmapServerModule; +import org.apache.james.mpt.smtp.SmtpHostSystem; +import org.apache.james.mpt.monitor.SystemLoggingMonitor; +import org.apache.james.mpt.session.ExternalSessionFactory; +import org.apache.james.mpt.smtp.dns.InMemoryDNSService; +import org.junit.rules.TemporaryFolder; + +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import com.google.inject.TypeLiteral; + +public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory implements SmtpHostSystem { + + private TemporaryFolder folder; + private EmbeddedCassandra embeddedCassandra; + private EmbeddedElasticSearch embeddedElasticSearch; + + private GuiceJamesServer<CassandraId> jamesServer; + private InMemoryDNSService inMemoryDNSService; + + + public CassandraJamesSmtpHostSystem() { + super("localhost", 1025, new SystemLoggingMonitor(), "220 mydomain.tld smtp"); + } + + @Override + public boolean addUser(String userAtDomain, String password) throws Exception { + Preconditions.checkArgument(userAtDomain.contains("@"), "The 'user' should contain the 'domain'"); + Iterator<String> split = Splitter.on("@").split(userAtDomain).iterator(); + split.next(); + String domain = split.next(); + + createDomainIfNeeded(domain); + jamesServer.serverProbe().addUser(userAtDomain, password); + return true; + } + + private void createDomainIfNeeded(String domain) throws Exception { + if (!jamesServer.serverProbe().containsDomain(domain)) { + jamesServer.serverProbe().addDomain(domain); + } + } + + @Override + public void addAddressMapping(String user, String domain, String address) throws Exception { + jamesServer.serverProbe().addAddressMapping(user, domain, address); + } + + @Override + public void beforeTests() throws Exception { + } + + @Override + public void afterTests() throws Exception { + } + + @Override + public void beforeTest() throws Exception { + inMemoryDNSService = new InMemoryDNSService(); + folder = new TemporaryFolder(); + folder.create(); + embeddedElasticSearch = new EmbeddedElasticSearch(folder.getRoot().toPath()); + embeddedElasticSearch.before(); + embeddedCassandra = EmbeddedCassandra.createStartServer(); + jamesServer = createJamesServer(); + jamesServer.start(); + } + + @Override + public void afterTest() throws Exception { + jamesServer.stop(); + embeddedElasticSearch.after(); + folder.delete(); + } + + public InMemoryDNSService getInMemoryDnsService() { + return inMemoryDNSService; + } + + protected GuiceJamesServer<CassandraId> createJamesServer() { + return new GuiceJamesServer<>(new TypeLiteral<CassandraId>(){}) + .combineWith(CassandraJamesServerMain.cassandraServerModule) + .overrideWith(new CassandraJmapServerModule(folder::getRoot, embeddedElasticSearch, embeddedCassandra), + (binder) -> binder.bind(DNSService.class).toInstance(inMemoryDNSService)); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java deleted file mode 100644 index caf46f7..0000000 --- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.mpt.smtp.host; - -import java.util.Iterator; - -import org.apache.james.domainlist.api.DomainList; -import org.apache.james.mpt.api.SmtpHostSystem; -import org.apache.james.mpt.monitor.SystemLoggingMonitor; -import org.apache.james.mpt.session.ExternalSessionFactory; -import org.apache.james.user.api.UsersRepository; -import org.apache.james.utils.ConfigurationsPerformer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Preconditions; -import com.google.common.base.Splitter; - -public class JamesSmtpHostSystem extends ExternalSessionFactory implements SmtpHostSystem { - - private static final Logger LOGGER = LoggerFactory.getLogger(JamesSmtpHostSystem.class); - - private final DomainList domainList; - private final UsersRepository usersRepository; - private final ConfigurationsPerformer configurationsPerformer; - - public JamesSmtpHostSystem(ConfigurationsPerformer configurationsPerformer, DomainList domainList, UsersRepository usersRepository) { - super("localhost", 1025, new SystemLoggingMonitor(), "220 mydomain.tld smtp"); - this.configurationsPerformer = configurationsPerformer; - this.domainList = domainList; - this.usersRepository = usersRepository; - } - - @Override - public boolean addUser(String userAtDomain, String password) throws Exception { - Preconditions.checkArgument(userAtDomain.contains("@"), "The 'user' should contain the 'domain'"); - Iterator<String> split = Splitter.on("@").split(userAtDomain).iterator(); - split.next(); - String domain = split.next(); - - domainList.addDomain(domain); - usersRepository.addUser(userAtDomain, password); - return true; - } - - @Override - public void beforeTests() throws Exception { - } - - @Override - public void afterTests() throws Exception { - } - - @Override - public void beforeTest() throws Exception { - LOGGER.info("Initializing modules"); - configurationsPerformer.initModules(); - } - - @Override - public void afterTest() throws Exception { - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java ---------------------------------------------------------------------- diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java index ac7d2bd..fbfc138 100644 --- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java +++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java @@ -28,11 +28,9 @@ import java.util.Locale; import javax.inject.Inject; -import org.apache.james.mpt.api.SmtpHostSystem; import org.apache.james.mpt.script.AbstractSimpleScriptedTestProtocol; -import org.apache.james.mpt.smtp.dns.InMemoryDNSService; -import org.apache.james.rrt.api.RecipientRewriteTable; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -61,12 +59,6 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol { @Inject private static SmtpHostSystem hostSystem; - @Inject - private static RecipientRewriteTable recipientRewriteTable; - - @Inject - private static InMemoryDNSService dnsService; - public ForwardSmtpTest() throws Exception { super(hostSystem, USER_AT_DOMAIN, PASSWORD, "/org/apache/james/smtp/scripts/"); } @@ -75,14 +67,16 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol { public void setUp() throws Exception { super.setUp(); InetAddress containerIp = InetAddresses.forString(fakeSmtp.getContainerInfo().getNetworkSettings().getIpAddress()); - dnsService.registerRecord("yopmail.com", new InetAddress[]{containerIp}, ImmutableList.of("yopmail.com"), ImmutableList.of()); - recipientRewriteTable.addAddressMapping(USER, DOMAIN, "r...@yopmail.com"); + hostSystem.getInMemoryDnsService() + .registerRecord("yopmail.com", new InetAddress[]{containerIp}, ImmutableList.of("yopmail.com"), ImmutableList.of()); + hostSystem.addAddressMapping(USER, DOMAIN, "r...@yopmail.com"); - RestAssured.port = Integer.valueOf("80"); + RestAssured.port = 80; RestAssured.baseURI = "http://" + containerIp.getHostAddress(); RestAssured.config = newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8)); } + @Ignore("Due to chaotic initialisation of Guice project, DomainList is not initialized when RemoteDelivery is initialized. Hence a NullPointer exception is thrown on default domain location") @Test public void forwardingAnEmailShouldWork() throws Exception { scriptTest("helo", Locale.US); http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java new file mode 100644 index 0000000..65805ce --- /dev/null +++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java @@ -0,0 +1,31 @@ +/**************************************************************** + * 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.mpt.smtp; + +import org.apache.james.mpt.api.HostSystem; +import org.apache.james.mpt.smtp.dns.InMemoryDNSService; + +public interface SmtpHostSystem extends HostSystem { + + void addAddressMapping(String user, String domain, String address) throws Exception; + + InMemoryDNSService getInMemoryDnsService(); + +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java index 7fc7638..d3c5368 100644 --- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java +++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java @@ -36,6 +36,7 @@ import org.apache.james.mailbox.elasticsearch.events.ElasticSearchListeningMessa import org.apache.james.mailbox.store.extractor.TextExtractor; import org.apache.james.mailbox.store.search.MessageSearchIndex; import org.apache.james.mailbox.tika.extractor.TikaTextExtractor; +import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.NoNodeAvailableException; import com.google.inject.AbstractModule; @@ -56,18 +57,18 @@ public class ElasticSearchMailboxModule extends AbstractModule { @Provides @Singleton - protected ClientProvider provideClientProvider(FileSystem fileSystem, AsyncRetryExecutor executor) throws ConfigurationException, FileNotFoundException, ExecutionException, InterruptedException { + protected Client provideClientProvider(FileSystem fileSystem, AsyncRetryExecutor executor) throws ConfigurationException, FileNotFoundException, ExecutionException, InterruptedException { PropertiesConfiguration propertiesReader = new PropertiesConfiguration(fileSystem.getFile(FileSystem.FILE_PROTOCOL_AND_CONF + "elasticsearch.properties")); ClientProvider clientProvider = new ClientProviderImpl(propertiesReader.getString("elasticsearch.masterHost"), propertiesReader.getInt("elasticsearch.port")); - getRetryer(executor, propertiesReader) - .getWithRetry(ctx -> IndexCreationFactory.createIndex(clientProvider, - propertiesReader.getInt("elasticsearch.nb.shards"), - propertiesReader.getInt("elasticsearch.nb.replica"))) - .get(); - NodeMappingFactory.applyMapping(clientProvider); - return clientProvider; + Client client = getRetryer(executor, propertiesReader) + .getWithRetry(ctx -> clientProvider.get()).get(); + IndexCreationFactory.createIndex(client, + propertiesReader.getInt("elasticsearch.nb.shards"), + propertiesReader.getInt("elasticsearch.nb.replica")); + NodeMappingFactory.applyMapping(client); + return client; } private static AsyncRetryExecutor getRetryer(AsyncRetryExecutor executor, PropertiesConfiguration configuration) { http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java new file mode 100644 index 0000000..69de08a --- /dev/null +++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java @@ -0,0 +1,67 @@ +/**************************************************************** + * 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; + +import java.io.File; +import java.util.function.Supplier; + +import javax.inject.Singleton; + +import org.apache.james.backends.cassandra.CassandraCluster; +import org.apache.james.backends.cassandra.EmbeddedCassandra; +import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; +import org.junit.rules.TemporaryFolder; + +import com.datastax.driver.core.Session; +import com.google.inject.AbstractModule; +import com.google.inject.Provides; + +public class CassandraJmapServerModule extends AbstractModule { + + private static final int LIMIT_TO_3_MESSAGES = 3; + private final Supplier<File> fileSupplier; + private final EmbeddedElasticSearch embeddedElasticSearch; + private final EmbeddedCassandra cassandra; + + public CassandraJmapServerModule(Supplier<File> fileSupplier, EmbeddedElasticSearch embeddedElasticSearch, EmbeddedCassandra cassandra) { + this.fileSupplier = fileSupplier; + this.embeddedElasticSearch = embeddedElasticSearch; + this.cassandra = cassandra; + } + + public CassandraJmapServerModule(TemporaryFolder temporaryFolder, EmbeddedElasticSearch embeddedElasticSearch, EmbeddedCassandra cassandra) { + this(temporaryFolder::getRoot, embeddedElasticSearch, cassandra); + } + + + @Override + protected void configure() { + install(new TestElasticSearchModule(embeddedElasticSearch)); + install(new TestFilesystemModule(fileSupplier)); + install(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES)); + bind(EmbeddedCassandra.class).toInstance(cassandra); + } + + @Provides + @Singleton + Session provideSession(CassandraCluster initializedCassandra) { + return initializedCassandra.getConf(); + } +} http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java ---------------------------------------------------------------------- diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java index 6da278f..2254476 100644 --- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java +++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java @@ -21,11 +21,11 @@ package org.apache.james.modules; import com.google.inject.AbstractModule; import com.google.inject.Provides; -import org.apache.james.mailbox.elasticsearch.ClientProvider; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.apache.james.mailbox.elasticsearch.IndexCreationFactory; import org.apache.james.mailbox.elasticsearch.NodeMappingFactory; import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider; +import org.elasticsearch.client.Client; import javax.inject.Singleton; @@ -44,9 +44,9 @@ public class TestElasticSearchModule extends AbstractModule{ @Provides @Singleton - protected ClientProvider provideClientProvider() { + protected Client provideClientProvider() { return NodeMappingFactory.applyMapping( - IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode())) + IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get()) ); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java ---------------------------------------------------------------------- diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java index a2d687e..11a6369 100644 --- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java +++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java @@ -45,6 +45,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper; import org.apache.james.mailbox.store.mail.MailboxMapperFactory; import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MailboxId; +import org.apache.james.rrt.api.RecipientRewriteTable; import org.apache.james.rrt.lib.Mappings; import org.apache.james.sieverepository.api.SieveRepository; import org.apache.james.user.api.UsersRepository; @@ -64,15 +65,18 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro private final DomainList domainList; private final UsersRepository usersRepository; private final SieveRepository sieveRepository; + private final RecipientRewriteTable recipientRewriteTable; @Inject private GuiceServerProbe(MailboxManager mailboxManager, MailboxMapperFactory<Id> mailboxMapperFactory, - DomainList domainList, UsersRepository usersRepository, SieveRepository sieveRepository) { + DomainList domainList, UsersRepository usersRepository, SieveRepository sieveRepository, + RecipientRewriteTable recipientRewriteTable) { this.mailboxManager = mailboxManager; this.mailboxMapperFactory = mailboxMapperFactory; this.domainList = domainList; this.usersRepository = usersRepository; this.sieveRepository = sieveRepository; + this.recipientRewriteTable = recipientRewriteTable; } @Override @@ -121,17 +125,17 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro @Override public Map<String, Mappings> listMappings() throws Exception { - throw new NotImplementedException(); + return recipientRewriteTable.getAllMappings(); } @Override public void addAddressMapping(String user, String domain, String toAddress) throws Exception { - throw new NotImplementedException(); + recipientRewriteTable.addAddressMapping(user, domain, toAddress); } @Override public void removeAddressMapping(String user, String domain, String fromAddress) throws Exception { - throw new NotImplementedException(); + recipientRewriteTable.removeAddressMapping(user, domain, fromAddress); } @Override @@ -141,12 +145,12 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro @Override public void addRegexMapping(String user, String domain, String regex) throws Exception { - throw new NotImplementedException(); + recipientRewriteTable.addRegexMapping(user, domain, regex); } @Override public void removeRegexMapping(String user, String domain, String regex) throws Exception { - throw new NotImplementedException(); + recipientRewriteTable.removeRegexMapping(user, domain, regex); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java index f414f16..84ddbec 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java @@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain; import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.methods.integration.GetMailboxesMethodTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.junit.Rule; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java index 44496bd..ca5dffc 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java @@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain; import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.methods.integration.GetMessageListMethodTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.junit.Rule; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java index 716b95b..b5f7e0f 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java @@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain; import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.methods.integration.GetMessagesMethodTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.junit.Rule; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java index d9c653f..3f7eeb8 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java @@ -23,7 +23,7 @@ import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.FixedDateZonedDateTimeProvider; import org.apache.james.jmap.JMAPAuthenticationTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.jmap.utils.ZonedDateTimeProvider; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java index d5757b8..aeff7a4 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java @@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain; import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.methods.integration.SetMailboxesMethodTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.junit.Rule; import org.junit.rules.RuleChain; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java index e71ed96..90c52b7 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java @@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain; import org.apache.james.GuiceJamesServer; import org.apache.james.backends.cassandra.EmbeddedCassandra; import org.apache.james.jmap.methods.integration.SetMessagesMethodTest; -import org.apache.james.jmap.servers.CassandraJmapServerModule; +import org.apache.james.modules.CassandraJmapServerModule; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; import org.junit.Rule; http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java deleted file mode 100644 index e9c9c3c..0000000 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.jmap.servers; - -import javax.inject.Singleton; - -import org.apache.james.backends.cassandra.CassandraCluster; -import org.apache.james.backends.cassandra.EmbeddedCassandra; -import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch; -import org.apache.james.modules.TestElasticSearchModule; -import org.apache.james.modules.TestFilesystemModule; -import org.apache.james.modules.TestJMAPServerModule; -import org.junit.rules.TemporaryFolder; - -import com.datastax.driver.core.Session; -import com.google.inject.AbstractModule; -import com.google.inject.Provides; - -public class CassandraJmapServerModule extends AbstractModule { - - private static final int LIMIT_TO_3_MESSAGES = 3; - private final TemporaryFolder temporaryFolder; - private final EmbeddedElasticSearch embeddedElasticSearch; - private final EmbeddedCassandra cassandra; - - public CassandraJmapServerModule(TemporaryFolder temporaryFolder, - EmbeddedElasticSearch embeddedElasticSearch, - EmbeddedCassandra cassandra) { - this.temporaryFolder = temporaryFolder; - this.embeddedElasticSearch = embeddedElasticSearch; - this.cassandra = cassandra; - } - - @Override - protected void configure() { - install(new TestElasticSearchModule(embeddedElasticSearch)); - install(new TestFilesystemModule(temporaryFolder)); - install(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES)); - bind(EmbeddedCassandra.class).toInstance(cassandra); - } - - @Provides - @Singleton - Session provideSession(CassandraCluster initializedCassandra) { - return initializedCassandra.getConf(); - } -} --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org