Author: btellier Date: Mon Jun 29 08:36:12 2015 New Revision: 1688133 URL: http://svn.apache.org/r1688133 Log: MAILBOX-155 Replacing ISO_OFFSET_DATE_TIME
Added: james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java james/mailbox/trunk/elasticsearch/src/test/resources/documents/frnog.eml james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail1.eml james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail2.eml james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail3.eml james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail4.eml Modified: james/mailbox/trunk/elasticsearch/pom.xml james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java james/mailbox/trunk/elasticsearch/src/main/resources/META-INF/spring/mailbox-elasticsearch.xml james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.eml james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.json Modified: james/mailbox/trunk/elasticsearch/pom.xml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/pom.xml?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/pom.xml (original) +++ james/mailbox/trunk/elasticsearch/pom.xml Mon Jun 29 08:36:12 2015 @@ -97,10 +97,6 @@ <scope>test</scope> </dependency> <dependency> - <groupId>org.apache.james</groupId> - <artifactId>apache-james-mailbox-store</artifactId> - </dependency> - <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.10.4</version> @@ -144,6 +140,11 @@ <artifactId>groovy-all</artifactId> <version>2.3.2</version> </dependency> + <dependency> + <groupId>org.apache.james</groupId> + <artifactId>apache-james-mailbox-memory</artifactId> + <scope>test</scope> + </dependency> </dependencies> <profiles> Modified: james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java (original) +++ james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java Mon Jun 29 08:36:12 2015 @@ -22,10 +22,10 @@ import java.util.Iterator; import javax.mail.Flags; -import org.apache.commons.lang.NotImplementedException; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson; +import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.model.MessageRange.Type; @@ -42,22 +42,23 @@ import org.slf4j.LoggerFactory; public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> extends ListeningMessageSearchIndex<Id> { private final static Logger LOGGER = LoggerFactory.getLogger(ElasticSearchListeningMessageSearchIndex.class); - private final static int NO_LIMIT = -1; private final static String ID_SEPARATOR = ":"; private final ElasticSearchIndexer indexer; + private final ElasticSearchSearcher<Id> searcher; private final MessageToElasticSearchJson messageToElasticSearchJson; - public ElasticSearchListeningMessageSearchIndex(MessageMapperFactory<Id> factory, - ElasticSearchIndexer indexer, MessageToElasticSearchJson messageToElasticSearchJson) { + public ElasticSearchListeningMessageSearchIndex(MessageMapperFactory<Id> factory, ElasticSearchIndexer indexer, + ElasticSearchSearcher<Id> searcher, MessageToElasticSearchJson messageToElasticSearchJson) { super(factory); this.indexer = indexer; this.messageToElasticSearchJson = messageToElasticSearchJson; + this.searcher = searcher; } @Override public Iterator<Long> search(MailboxSession session, Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException { - throw new NotImplementedException(); + return searcher.search(mailbox, searchQuery); } @Override Added: james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java (added) +++ james/mailbox/trunk/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java Mon Jun 29 08:36:12 2015 @@ -0,0 +1,93 @@ +/**************************************************************** + * 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.mailbox.elasticsearch.search; + +import java.util.Iterator; +import java.util.Optional; +import java.util.stream.StreamSupport; + +import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; +import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants; +import org.apache.james.mailbox.elasticsearch.query.QueryConverter; +import org.apache.james.mailbox.elasticsearch.query.SortConverter; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.SearchQuery; +import org.apache.james.mailbox.store.mail.model.Mailbox; +import org.apache.james.mailbox.store.mail.model.MailboxId; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.node.Node; +import org.elasticsearch.search.SearchHit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ElasticSearchSearcher<Id extends MailboxId> { + + private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSearcher.class); + + private final Node node; + private final QueryConverter queryConverter; + + public ElasticSearchSearcher(Node node, QueryConverter queryConverter) { + this.node = node; + this.queryConverter = queryConverter; + } + + public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException { + try (Client client = node.client()) { + return transformResponseToUidIterator( + getSearchRequestBuilder(client, mailbox, searchQuery).get()); + } + } + + private SearchRequestBuilder getSearchRequestBuilder(Client client, Mailbox<Id> mailbox, SearchQuery searchQuery) { + return searchQuery.getSorts() + .stream() + .reduce( + client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX) + .setTypes(ElasticSearchIndexer.MESSAGE_TYPE) + .setScroll(new TimeValue(60000)) + .setQuery(queryConverter.from(searchQuery, mailbox.getMailboxId().serialize())) + .setSize(100), + (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)), + (partialResult1, partialResult2) -> partialResult1); + } + + private Iterator<Long> transformResponseToUidIterator(SearchResponse searchResponse) { + return StreamSupport.stream(searchResponse.getHits().spliterator(), false) + .map(this::extractUidFromHit) + .filter(Optional::isPresent) + .map(Optional::get) + .iterator(); + + } + + private Optional<Long> extractUidFromHit(SearchHit hit) { + try { + return Optional.of(((Number) hit.getSource().get(JsonMessageConstants.ID)).longValue()); + } catch (Exception exception) { + LOGGER.warn("Can not extract UID for search result " + hit.getId(), exception); + return Optional.empty(); + } + } + +} Modified: james/mailbox/trunk/elasticsearch/src/main/resources/META-INF/spring/mailbox-elasticsearch.xml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/main/resources/META-INF/spring/mailbox-elasticsearch.xml?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/src/main/resources/META-INF/spring/mailbox-elasticsearch.xml (original) +++ james/mailbox/trunk/elasticsearch/src/main/resources/META-INF/spring/mailbox-elasticsearch.xml Mon Jun 29 08:36:12 2015 @@ -31,7 +31,8 @@ <bean id="elasticsearch-listener" class="org.apache.james.mailbox.elasticsearch.events.ElasticSearchListeningMessageSearchIndex"> <constructor-arg index="0" ref="elasticsearch-node"/> <constructor-arg index="1" ref="elasticsearch-indexer"/> - <constructor-arg index="2" ref="elasticsearch-json"/> + <constructor-arg index="2" ref="elasticsearch-searcher"/> + <constructor-arg index="3" ref="elasticsearch-json"/> </bean> <bean id="elasticsearch-indexer" class="org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer"> @@ -42,6 +43,7 @@ <bean id="elasticsearch-searcher" class="org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher"> <constructor-arg index="0" ref="elasticsearch-node"/> + <constructor-arg index="1" ref="query-converter"/> </bean> <bean id="elasticsearch-node-no-index" class="org.apache.james.mailbox.cassandra.elasticsearch.NodeProvider" factory-method="createNodeForClusterName"> @@ -59,4 +61,10 @@ <constructor-arg index="0" ref="elasticsearch-node-index"/> </bean> + <bean id="query-converter" class="org.apache.james.mailbox.elasticsearch.query.QueryConverter"> + <constructor-arg index="0" ref="criterion-converter"/> + </bean> + + <bean id="criterion-converter" class="org.apache.james.mailbox.elasticsearch.query.CriterionConverter"/> + </beans> Added: james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java (added) +++ james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java Mon Jun 29 08:36:12 2015 @@ -0,0 +1,517 @@ +/**************************************************************** + * 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.mailbox.elasticsearch; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.text.SimpleDateFormat; + +import javax.mail.Flags; + +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; +import org.apache.james.mailbox.acl.UnionMailboxACLResolver; +import org.apache.james.mailbox.elasticsearch.events.ElasticSearchListeningMessageSearchIndex; +import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson; +import org.apache.james.mailbox.elasticsearch.query.CriterionConverter; +import org.apache.james.mailbox.elasticsearch.query.QueryConverter; +import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher; +import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory; +import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.SearchQuery; +import org.apache.james.mailbox.store.JVMMailboxPathLocker; +import org.apache.james.mailbox.store.MailboxSessionMapperFactory; +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.node.Node; +import org.junit.After; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.Lists; + +public class ElasticSearchIntegrationTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchIntegrationTest.class); + + private static Node node; + private static StoreMailboxManager<InMemoryId> storeMailboxManager; + private static ElasticSearchListeningMessageSearchIndex elasticSearchListeningMessageSearchIndex; + private static Mailbox mailbox; + private static SimpleDateFormat format; + private static MailboxSession session; + + @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Before + @SuppressWarnings("unchecked") + public void setUp() throws Exception { + format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); + + initializeMailboxManager(); + + session = storeMailboxManager.createSystemSession("benwa", LOGGER); + + storeMailboxManager.createMailbox(new MailboxPath("#private", "benwa", "INBOX"), session); + StoreMessageManager<InMemoryId> messageManager = (StoreMessageManager<InMemoryId>) storeMailboxManager.getMailbox(new MailboxPath("#private", "benwa", "INBOX"), session); + mailbox = messageManager.getMailboxEntity(); + + // sentDate: Wed, 3 Jun 2015 09:05:46 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/spamMail.eml"), + format.parse("2014/01/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.DELETED)); + //sentDate: Thu, 4 Jun 2015 09:23:37 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/mail1.eml"), + format.parse("2014/02/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.ANSWERED)); + //sentDate: Thu, 4 Jun 2015 09:27:37 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/mail2.eml"), + format.parse("2014/03/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.DRAFT)); + //sentDate: Tue, 2 Jun 2015 08:16:19 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/mail3.eml"), + format.parse("2014/05/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.RECENT)); + //sentDate: Fri, 15 May 2015 06:35:59 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/mail4.eml"), + format.parse("2014/04/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.FLAGGED)); + //sentDate: Wed, 03 Jun 2015 19:14:32 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/pgpSignedMail.eml"), + format.parse("2014/06/02 00:00:00.000"), + session, + true, + new Flags(Flags.Flag.SEEN)); + //sentDate: Thu, 04 Jun 2015 07:36:08 +0000 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/htmlMail.eml"), + format.parse("2014/07/02 00:00:00.000"), + session, + false, + new Flags()); + //sentDate: Thu, 4 Jun 2015 06:08:41 +0200 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/mail.eml"), + format.parse("2014/08/02 00:00:00.000"), + session, + true, + new Flags("Hello")); + //sentDate: Tue, 2 Jun 2015 12:00:55 +0200 + messageManager.appendMessage( + ClassLoader.getSystemResourceAsStream("documents/frnog.eml"), + format.parse("2014/09/02 00:00:00.000"), + session, + true, + new Flags("Hello you")); + + EmbeddedElasticSearch.awaitForElasticSearch(node); + } + + private void initializeMailboxManager() throws Exception { + node = NodeMappingFactory.applyMapping( + IndexCreationFactory.createIndex( + EmbeddedElasticSearch.provideNode(temporaryFolder) + ) + ); + MailboxSessionMapperFactory<InMemoryId> mapperFactory = new InMemoryMailboxSessionMapperFactory(); + elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex(mapperFactory, + new ElasticSearchIndexer(node), + new ElasticSearchSearcher<InMemoryId>(node, new QueryConverter(new CriterionConverter())), + new MessageToElasticSearchJson()); + storeMailboxManager = new StoreMailboxManager<>( + mapperFactory, + new MockAuthenticator(), + new JVMMailboxPathLocker(), + new UnionMailboxACLResolver(), + new SimpleGroupMembershipResolver()); + storeMailboxManager.setMessageSearchIndex(elasticSearchListeningMessageSearchIndex); + storeMailboxManager.init(); + } + + @After + public void cleanUp() { + EmbeddedElasticSearch.shutDown(node); + } + + @Test + public void allShouldReturnAllUids() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void bodyContainsShouldReturnUidOfMessageContainingTheGivenText() throws MailboxException { + /* + Only mail4.eml contains word MAILET-94 + */ + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.bodyContains("MAILET-94")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void bodyContainsShouldReturnUidOfMessageContainingTheApproximativeText() throws MailboxException { + /* + mail1.eml contains words created AND summary + mail.eml contains created and thus matches the query with a low score + */ + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.bodyContains("created summary")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 8L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DELETED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsAnsweredWhenUsedWithFlagAnswered() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.ANSWERED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsDraftWhenUsedWithFlagDraft() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.DRAFT)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsRecentWhenUsedWithFlagRecent() throws MailboxException { + // Only message 7 is not marked as RECENT + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.RECENT)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsFlaggedWhenUsedWithFlagFlagged() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.FLAGGED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void flagIsSetShouldReturnUidOfMessageMarkedAsSeenWhenUsedWithFlagSeen() throws MailboxException { + // Only message 6 is marked as read. + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet(Flags.Flag.SEEN)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L); + } + + @Ignore("This test will fail as Memory mailbox has no support for user defined flags. This test will return two message instead of one => mapping issue") + @Test + public void flagIsSetShouldReturnUidsOfMessageContainingAGivenUserFlag() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet("Hello")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Ignore("This test will fail as Memory mailbox has no support for user defined flags. This test will return two message instead of one => mapping issue") + @Test + public void userFlagsShouldBeMatchedExactly() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsSet("Hello bonjour")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsDeletedWhenUsedWithFlagDeleted() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DELETED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsAnsweredWhenUsedWithFlagAnswered() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.ANSWERED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsDraftWhenUsedWithFlagDraft() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.DRAFT)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 4L, 5L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsRecentWhenUsedWithFlagRecent() throws MailboxException { + // Only message 7 is not marked as RECENT + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.RECENT)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsFlaggedWhenUsedWithFlagFlagged() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.FLAGGED)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 6L, 7L, 8L, 9L); + } + + @Test + public void flagIsUnSetShouldReturnUidOfMessageNotMarkedAsSeendWhenUsedWithFlagSeen() throws MailboxException { + // Only message 6 is marked as read. + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet(Flags.Flag.SEEN)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 7L, 8L, 9L); + } + + @Ignore("This test will fail as Memory mailbox has no support for user defined flags. This test will return two message instead of one => mapping issue") + @Test + public void flagIsUnSetShouldReturnUidsOfMessageNotContainingAGivenUserFlag() throws MailboxException { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.flagIsUnSet("Hello")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Test + public void internalDateAfterShouldReturnMessagesAfterAGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.internalDateAfter(format.parse("2014/07/02 00:00:00.000"), SearchQuery.DateResolution.Day)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L, 8L, 9L); + } + + @Test + public void internalDateBeforeShouldReturnMessagesBeforeAGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.internalDateBefore(format.parse("2014/02/02 00:00:00.000"), SearchQuery.DateResolution.Day)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L); + } + + @Test + public void internalDateOnShouldReturnMessagesOfTheGivenDate() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.internalDateOn(format.parse("2014/03/02 00:00:00.000"), SearchQuery.DateResolution.Day)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L); + } + + @Test + public void modSeqEqualsShouldReturnUidsOfMessageHavingAGivenModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqEquals(2L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L); + } + + @Test + public void modSeqGreaterThanShouldReturnUidsOfMessageHavingAGreaterModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(7L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L, 8L, 9L); + } + + @Test + public void modSeqLessThanShouldReturnUidsOfMessageHavingAGreaterModSeq() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.modSeqLessThan(3L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L); + } + + @Test + public void sizeGreaterThanShouldReturnUidsOfMessageExceedingTheSpecifiedSize() throws Exception { + // Only message 7 is over 10 KB + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.sizeGreaterThan(10000L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void sizeLessThanShouldReturnUidsOfMessageNotExceedingTheSpecifiedSize() throws Exception { + // Only message 2 3 4 5 9 are under 5 KB + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.sizeLessThan(5000L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 5L, 9L); + } + + @Test + public void headerContainsShouldReturnUidsOfMessageHavingThisHeaderWithTheSpecifiedValue() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerContains("Precedence", "list")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 6L, 8L, 9L); + } + + @Test + public void headerExistsShouldReturnUidsOfMessageHavingThisHeader() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 8L, 9L); + } + + @Test + public void addressShouldReturnUidHavingRightExpeditorWhenFromIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.From, "murari....@gmail.com")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(8L); + } + + @Test + public void addressShouldReturnUidHavingRightRecipientWhenToIsSpecified() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.To, "r...@listes.minet.net")); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(1L); + } + + @Test + public void uidShouldreturnExistingUidsOnTheGivenRanges() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 4L), new SearchQuery.NumericRange(6L, 7L)}; + searchQuery.andCriteria(SearchQuery.uid(numericRanges)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(2L, 3L, 4L, 6L, 7L); + } + + @Test + public void youShouldBeAbleToSpecifySeveralCriterionOnASingleQuery() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerExists("Precedence")); + searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(6L)); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L, 8L, 9L); + } + + @Test + public void andShouldReturnResultsMatchingBothRequests() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria( + SearchQuery.and( + SearchQuery.headerExists("Precedence"), + SearchQuery.modSeqGreaterThan(6L))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(6L, 8L, 9L); + } + + @Test + public void notShouldReturnResultsThatDoNotMatchAQuery() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria( + SearchQuery.not(SearchQuery.headerExists("Precedence"))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(7L); + } + + @Test + public void sortShouldOrderMessages() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(1L, 2L, 3L, 5L, 4L, 6L, 7L, 8L, 9L); + } + + @Test + public void revertSortingShouldReturnElementsInAReversedOrder() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.all()); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsExactly(9L, 8L, 7L, 6L, 4L, 5L, 3L, 2L, 1L); + } + + @Test + public void headerDateAfterShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerDateAfter("sentDate", format.parse("2015/06/04 11:00:00.000"), SearchQuery.DateResolution.Second)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(3L, 2L); + } + + @Test + public void headerDateBeforeShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerDateBefore("sentDate", format.parse("2015/06/01 00:00:00.000"), SearchQuery.DateResolution.Day)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(5L); + } + + @Test + public void headerDateOnShouldWork() throws Exception { + SearchQuery searchQuery = new SearchQuery(); + searchQuery.andCriteria(SearchQuery.headerDateOn("sentDate", format.parse("2015/06/02 08:00:00.000"), SearchQuery.DateResolution.Day)); + searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Arrival, true))); + assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery)) + .containsOnly(4L, 9L); + } + +} Modified: james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java (original) +++ james/mailbox/trunk/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java Mon Jun 29 08:36:12 2015 @@ -32,10 +32,10 @@ import java.util.stream.LongStream; import javax.mail.Flags; -import org.apache.commons.lang.NotImplementedException; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer; import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson; +import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher; import org.apache.james.mailbox.model.MessageRange; import org.apache.james.mailbox.store.TestId; import org.apache.james.mailbox.store.mail.MessageMapperFactory; @@ -60,6 +60,7 @@ public class ElasticSearchListeningMessa private MessageMapperFactory<TestId> mapperFactory; private ElasticSearchIndexer indexer; private MessageToElasticSearchJson messageToElasticSearchJson; + private ElasticSearchSearcher<TestId> elasticSearchSearcher; private ElasticSearchListeningMessageSearchIndex<TestId> testee; @@ -73,15 +74,10 @@ public class ElasticSearchListeningMessa messageToElasticSearchJson = control.createMock(MessageToElasticSearchJson.class); expect(messageToElasticSearchJson.convertToJson(anyObject(Message.class))).andReturn("json content").anyTimes(); expect(messageToElasticSearchJson.getUpdatedJsonMessagePart(anyObject(Flags.class), anyLong())).andReturn("json updated content").anyTimes(); + + elasticSearchSearcher = control.createMock(ElasticSearchSearcher.class); - testee = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory, indexer, messageToElasticSearchJson); - } - - @Test(expected=NotImplementedException.class) - public void searchShouldThrow() throws Exception { - control.replay(); - testee.search(null, null, null); - control.verify(); + testee = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory, indexer, elasticSearchSearcher, messageToElasticSearchJson); } @Test Added: james/mailbox/trunk/elasticsearch/src/test/resources/documents/frnog.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/frnog.eml?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/frnog.eml (added) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/frnog.eml Mon Jun 29 08:36:12 2015 @@ -0,0 +1,92 @@ +Return-Path: <frnog-ow...@frnog.org> +Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Tue, 02 Jun 2015 12:01:42 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx2.minet.net (Postfix) with ESMTP id E92F2A25320 + for <be...@minet.net>; Tue, 2 Jun 2015 12:01:46 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.499 +X-Spam-Level: +X-Spam-Status: No, score=-1.499 required=1 tests=[BAYES_00=-1.5, + UNPARSEABLE_RELAY=0.001] autolearn=ham +Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id bRNLR9Tbk4Jg for <be...@minet.net>; + Tue, 2 Jun 2015 10:01:46 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=217.24.82.4; helo=cabale.usenet-fr.net; envelope-from=frnog-ow...@frnog.org; receiver=be...@minet.net +Received: from cabale.usenet-fr.net (cabale.usenet-fr.net [217.24.82.4]) + by mx2.minet.net (Postfix) with ESMTP id 089E7A2531A + for <be...@minet.net>; Tue, 2 Jun 2015 12:01:45 +0200 (CEST) +Received: by cabale.usenet-fr.net (Postfix, from userid 90) + id A267298A5DC6; Tue, 2 Jun 2015 12:01:44 +0200 (CEST) +X-Original-To: fr...@frnog.org +Delivered-To: fr...@frnog.org +Received: from mta.mail.waycom.net (mta.mail.waycom.net [194.177.32.18]) + by cabale.usenet-fr.net (Postfix) with ESMTP id AE2E798A58FC + for <fr...@frnog.org>; Tue, 2 Jun 2015 12:01:01 +0200 (CEST) +Received: from [127.0.0.1] (localhost [127.0.0.1]) + by mta.mail.waycom.net (Postfix) with ESMTP id D30D6567E1 + for <fr...@frnog.org>; Tue, 2 Jun 2015 12:00:56 +0200 (CEST) +Received: from [127.0.0.1] (localhost [127.0.0.1]) + wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) with Microsoft SMTP + Server (TLS) id 15.0.847.32; Tue, 2 Jun 2015 12:00:56 +0200 +Message-ID: <556d7ed7.2090...@waycom.net> +Date: Tue, 2 Jun 2015 12:00:55 +0200 +From: Guillaume Genty <gge...@waycom.net> +Organization: Waycom +MIME-Version: 1.0 +To: <fr...@frnog.org> +Content-Type: text/plain; charset="utf-8"; format=flowed +Content-Transfer-Encoding: 8bit +X-ClientProxiedBy: WCM-HV1-EXCH1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) To + wcm-hv1-exch1.wcmnoc.local (2002:c3d6:f04a::c3d6:f04a) +X-C2ProcessedOrg: 9180093e-3f32-48c9-b36b-0805cbe4c266 +Subject: [FRnOG] [BIZ] Collecte de liens C2E/CELAN en DOM +X-Loop: fr...@frnog.org +X-Sequence: 5349 +Errors-to: frnog-ow...@frnog.org +Precedence: list +Precedence: bulk +Sender: frnog-requ...@frnog.org +X-mailing-list: fr...@frnog.org +List-Id: <frnog.frnog.org> +List-Archive: <http://sympa.frnog.org/wss/arc/frnog> +List-Help: <mailto:sy...@frnog.org?subject=help> +List-Owner: <mailto:frnog-requ...@frnog.org> +List-Post: <mailto:fr...@frnog.org> +List-Subscribe: <mailto:sy...@frnog.org?subject=subscribe%20frnog> +List-Unsubscribe: <mailto:sy...@frnog.org?subject=unsubscribe%20frnog> + +Bonjour le FRnOG, + + +Je cherche un partenaire dans les DOM avec de la collecte C2E et/ou +CELAN capable de revendre des liens et de remonter le trafic (en niveau +2, L2TP ou PPP sur L2TP) en métropole, idéalement à TH2. + +Nous aurions besoin des DOM suivants: +- Guadeloupe +- Martinique +- Guyane +- La Réunion +(Toutes les plaques DOM sauf îles du nord) + +Merci d'avance ! + + +Cordialement, + +-- +Guillaume Genty | WAYCOM +Directeur Technique Adjoint +24-28 Avenue du Général de Gaulle | F-92150 Suresnes, FRANCE +T. : +33 (0)1 41 44 83 00 | F. : +33 (0)1 41 44 00 22 +gge...@waycom.net | www.waycom.net + + +--------------------------- +Liste de diffusion du FRnOG +http://www.frnog.org/ Added: james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail1.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail1.eml?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail1.eml (added) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail1.eml Mon Jun 29 08:36:12 2015 @@ -0,0 +1,69 @@ +Return-Path: <server-dev-return-56862-benwa=minet....@james.apache.org> +Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Thu, 04 Jun 2015 11:23:39 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx1.minet.net (Postfix) with ESMTP id 0113F385C15 + for <be...@minet.net>; Thu, 4 Jun 2015 11:23:43 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.51 +X-Spam-Level: +X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, + T_RP_MATCHES_RCVD=-0.01] autolearn=ham +Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id IeILbadS9lo5 for <be...@minet.net>; + Thu, 4 Jun 2015 09:23:42 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56862-benwa=minet....@james.apache.org; receiver=be...@minet.net +Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) + by mx2.minet.net (Postfix) with SMTP id CDE83A1C7FC + for <be...@minet.net>; Thu, 4 Jun 2015 11:23:40 +0200 (CEST) +Received: (qmail 37249 invoked by uid 500); 4 Jun 2015 09:23:38 -0000 +Mailing-List: contact server-dev-h...@james.apache.org; run by ezmlm +Precedence: bulk +List-Unsubscribe: <mailto:server-dev-unsubscr...@james.apache.org> +List-Help: <mailto:server-dev-h...@james.apache.org> +List-Post: <mailto:server-dev@james.apache.org> +List-Id: "James Developers List" <server-dev.james.apache.org> +Reply-To: "James Developers List" <server-dev@james.apache.org> +Delivered-To: mailing list server-dev@james.apache.org +Received: (qmail 37236 invoked by uid 99); 4 Jun 2015 09:23:38 -0000 +Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) + by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jun 2015 09:23:38 +0000 +Date: Thu, 4 Jun 2015 09:23:37 +0000 +From: "Tellier Benoit (JIRA)" <j...@apache.org> +To: server-dev@james.apache.org +Message-ID: <jira.12835341.1433409792000.9340.1433409817...@atlassian.jira> +In-Reply-To: <jira.12835341.1433409792...@atlassian.jira> +References: <jira.12835341.1433409792...@atlassian.jira> <JIRA.12835341.1433409792972@arcas> +Subject: [jira] [Created] (MAILBOX-234) Convert Message into JSON +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 7bit +X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 + +Tellier Benoit created MAILBOX-234: +-------------------------------------- + + Summary: Convert Message into JSON + Key: MAILBOX-234 + URL: https://issues.apache.org/jira/browse/MAILBOX-234 + Project: James Mailbox + Issue Type: New Feature + Reporter: Tellier Benoit + + +This would give us the ability to index e-mails in ElasticSearch. + + + +-- +This message was sent by Atlassian JIRA +(v6.3.4#6332) + +--------------------------------------------------------------------- +To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org +For additional commands, e-mail: server-dev-h...@james.apache.org + Added: james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail2.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail2.eml?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail2.eml (added) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail2.eml Mon Jun 29 08:36:12 2015 @@ -0,0 +1,82 @@ +Return-Path: <server-dev-return-56863-benwa=minet....@james.apache.org> +Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Thu, 04 Jun 2015 11:27:36 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx2.minet.net (Postfix) with ESMTP id D65F3A1CA35 + for <be...@minet.net>; Thu, 4 Jun 2015 11:27:40 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.51 +X-Spam-Level: +X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, + T_RP_MATCHES_RCVD=-0.01] autolearn=ham +Received: from mx2.minet.net ([IPv6:::ffff:192.168.102.26]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id jH3GE2vu5VKE for <be...@minet.net>; + Thu, 4 Jun 2015 09:27:40 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56863-benwa=minet....@james.apache.org; receiver=be...@minet.net +Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) + by mx2.minet.net (Postfix) with SMTP id 85A3AA1CA2C + for <be...@minet.net>; Thu, 4 Jun 2015 11:27:38 +0200 (CEST) +Received: (qmail 43145 invoked by uid 500); 4 Jun 2015 09:27:38 -0000 +Mailing-List: contact server-dev-h...@james.apache.org; run by ezmlm +Precedence: bulk +List-Unsubscribe: <mailto:server-dev-unsubscr...@james.apache.org> +List-Help: <mailto:server-dev-h...@james.apache.org> +List-Post: <mailto:server-dev@james.apache.org> +List-Id: "James Developers List" <server-dev.james.apache.org> +Reply-To: "James Developers List" <server-dev@james.apache.org> +Delivered-To: mailing list server-dev@james.apache.org +Received: (qmail 43130 invoked by uid 99); 4 Jun 2015 09:27:38 -0000 +Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) + by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jun 2015 09:27:38 +0000 +Date: Thu, 4 Jun 2015 09:27:37 +0000 +From: "Tellier Benoit (JIRA)" <j...@apache.org> +To: server-dev@james.apache.org +Message-ID: <jira.12781874.1426269127000.9353.1433410057...@atlassian.jira> +In-Reply-To: <jira.12781874.1426269127...@atlassian.jira> +References: <jira.12781874.1426269127...@atlassian.jira> <JIRA.12781874.1426269127444@arcas> +Subject: [jira] [Closed] (MAILBOX-217) We should index attachment in elastic + search +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 7bit +X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 + + + [ https://issues.apache.org/jira/browse/MAILBOX-217?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] + +Tellier Benoit closed MAILBOX-217. +---------------------------------- + Resolution: Duplicate + +We are reviewing work I did for this feature. + +This issue will be divided in smallest issues. + +The first one is MAILBOX-234 + +> We should index attachment in elastic search +> -------------------------------------------- +> +> Key: MAILBOX-217 +> URL: https://issues.apache.org/jira/browse/MAILBOX-217 +> Project: James Mailbox +> Issue Type: Improvement +> Reporter: Tellier Benoit +> +> Attachment should be indexed in message document as nested document. +> Their textual content should be available for better search results. + + + +-- +This message was sent by Atlassian JIRA +(v6.3.4#6332) + +--------------------------------------------------------------------- +To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org +For additional commands, e-mail: server-dev-h...@james.apache.org + Added: james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail3.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail3.eml?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail3.eml (added) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail3.eml Mon Jun 29 08:36:12 2015 @@ -0,0 +1,96 @@ +Return-Path: <server-dev-return-56848-benwa=minet....@james.apache.org> +Received: from mx1.minet.net (mx1.minet.net [192.168.102.25]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Tue, 02 Jun 2015 10:16:17 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx1.minet.net (Postfix) with ESMTP id 52917327827 + for <be...@minet.net>; Tue, 2 Jun 2015 10:16:22 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.51 +X-Spam-Level: +X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, + T_RP_MATCHES_RCVD=-0.01] autolearn=ham +Received: from mx1.minet.net ([IPv6:::ffff:192.168.102.25]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id rcP3IZbh_eqS for <be...@minet.net>; + Tue, 2 Jun 2015 08:16:21 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=server-dev-return-56848-benwa=minet....@james.apache.org; receiver=be...@minet.net +Authentication-Results: mx1.minet.net; dkim=none reason="no signature"; + dkim-adsp=none (insecure policy); dkim-atps=neutral +Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) + by mx1.minet.net (Postfix) with SMTP id 37EAD327826 + for <be...@minet.net>; Tue, 2 Jun 2015 10:16:20 +0200 (CEST) +Received: (qmail 1143 invoked by uid 500); 2 Jun 2015 08:16:20 -0000 +Mailing-List: contact server-dev-h...@james.apache.org; run by ezmlm +Precedence: bulk +List-Unsubscribe: <mailto:server-dev-unsubscr...@james.apache.org> +List-Help: <mailto:server-dev-h...@james.apache.org> +List-Post: <mailto:server-dev@james.apache.org> +List-Id: "James Developers List" <server-dev.james.apache.org> +Reply-To: "James Developers List" <server-dev@james.apache.org> +Delivered-To: mailing list server-dev@james.apache.org +Received: (qmail 1132 invoked by uid 99); 2 Jun 2015 08:16:20 -0000 +Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) + by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jun 2015 08:16:20 +0000 +Date: Tue, 2 Jun 2015 08:16:19 +0000 +From: "Eric Charles (JIRA)" <j...@apache.org> +To: server-dev@james.apache.org +Message-ID: <jira.12473940.1284322083000.91735.1433232979...@atlassian.jira> +In-Reply-To: <jira.12473940.1284322083...@atlassian.jira> +References: <jira.12473940.1284322083...@atlassian.jira> <JIRA.12473940.1284322083687@arcas> +Subject: [jira] [Closed] (MAILBOX-11) MailboxQuery ignore namespace +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: quoted-printable +X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 + + + [ https://issues.apache.org/jira/browse/MAILBOX-11?page=3Dcom.atlassia= +n.jira.plugin.system.issuetabpanels:all-tabpanel ] + +Eric Charles closed MAILBOX-11. +------------------------------- + Resolution: Fixed + Assignee: Eric Charles (was: Norman Maurer) + +Committed, Thx Benoit. + +> MailboxQuery ignore namespace +> ----------------------------- +> +> Key: MAILBOX-11 +> URL: https://issues.apache.org/jira/browse/MAILBOX-11 +> Project: James Mailbox +> Issue Type: Bug +> Environment: Linux, JDK 1.6 +> Reporter: Fran=C3=A7ois-Denis Gonthier +> Assignee: Eric Charles +> Fix For: 0.6 +> +> Attachments: 0001-MAILBOX-11-Add-filters-on-namespace-and-user-fo= +r-sea.patch +> +> +> MailboxQuery doesn't pay any attention to namespace of the mailbox it is = +based on. For example, Mozilla Thunderbird might to mailbox search with exp= +ressions like #private.%. That expression is passed directly to the isExpre= +ssionMatch method of the MailboxQuery class. This has obviously incorrect r= +esults. +> Arguments to the isExpressionMatch method should be parsed to separate th= +e namespace from the mailbox name or isExpressionMatch should do the parsin= +g itself. In that case the argument name should be renamed to something lik= +e 'searchExpression' instead of 'name' which doesn't convey the right meani= +ng. + + + +-- +This message was sent by Atlassian JIRA +(v6.3.4#6332) + +--------------------------------------------------------------------- +To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org +For additional commands, e-mail: server-dev-h...@james.apache.org + Added: james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail4.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail4.eml?rev=1688133&view=auto ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail4.eml (added) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/mail4.eml Mon Jun 29 08:36:12 2015 @@ -0,0 +1,81 @@ +Return-Path: <mailet-api-return-812-benwa=minet....@james.apache.org> +Received: from mx2.minet.net (mx2.minet.net [192.168.102.26]) + by imap (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA; + Fri, 15 May 2015 08:36:03 +0200 +X-Sieve: CMU Sieve 2.4 +Received: from localhost (spam.minet.net [192.168.102.97]) + by mx2.minet.net (Postfix) with ESMTP id 5AC87A19A4F + for <be...@minet.net>; Fri, 15 May 2015 08:36:03 +0200 (CEST) +X-Virus-Scanned: by amavisd-new using ClamAV at minet.net +X-Spam-Flag: NO +X-Spam-Score: -1.51 +X-Spam-Level: +X-Spam-Status: No, score=-1.51 required=1 tests=[BAYES_00=-1.5, + T_RP_MATCHES_RCVD=-0.01] autolearn=ham +Received: from mx1.minet.net ([IPv6:::ffff:192.168.102.25]) + by localhost (spam.minet.net [::ffff:192.168.102.97]) (amavisd-new, port 10024) + with ESMTP id 2xNJ-Rh-AWoj for <be...@minet.net>; + Fri, 15 May 2015 06:36:02 +0000 (UTC) +Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=140.211.11.3; helo=mail.apache.org; envelope-from=mailet-api-return-812-benwa=minet....@james.apache.org; receiver=be...@minet.net +Authentication-Results: mx1.minet.net; dkim=none reason="no signature"; + dkim-adsp=none (insecure policy); dkim-atps=neutral +Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) + by mx1.minet.net (Postfix) with SMTP id 24F75686039 + for <be...@minet.net>; Fri, 15 May 2015 08:36:01 +0200 (CEST) +Received: (qmail 81830 invoked by uid 500); 15 May 2015 06:36:00 -0000 +Mailing-List: contact mailet-api-h...@james.apache.org; run by ezmlm +Precedence: bulk +List-Help: <mailto:mailet-api-h...@james.apache.org> +List-Unsubscribe: <mailto:mailet-api-unsubscr...@james.apache.org> +List-Post: <mailto:mailet-...@james.apache.org> +List-Id: <mailet-api.james.apache.org> +Reply-To: mailet-...@james.apache.org +Delivered-To: mailing list mailet-...@james.apache.org +Received: (qmail 81730 invoked by uid 99); 15 May 2015 06:36:00 -0000 +Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) + by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 15 May 2015 06:36:00 +0000 +Date: Fri, 15 May 2015 06:35:59 +0000 +From: "Eric Charles (JIRA)" <mailet-...@james.apache.org> +To: mailet-...@james.apache.org +Message-ID: <jira.12825882.1430301328000.124152.1431671759...@atlassian.jira> +In-Reply-To: <jira.12825882.1430301328...@atlassian.jira> +References: <jira.12825882.1430301328...@atlassian.jira> <JIRA.12825882.1430301328925@arcas> +Subject: [jira] [Resolved] (MAILET-94) James Mailet should use latest + version of other James subprojects +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 7bit +X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 + + + [ https://issues.apache.org/jira/browse/MAILET-94?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] + +Eric Charles resolved MAILET-94. +-------------------------------- + Resolution: Fixed + Assignee: Eric Charles + +Patch committed, Thx Matthieu + +> James Mailet should use latest version of other James subprojects +> ----------------------------------------------------------------- +> +> Key: MAILET-94 +> URL: https://issues.apache.org/jira/browse/MAILET-94 +> Project: James Mailet +> Issue Type: Task +> Components: Build +> Reporter: Matthieu Baechler +> Assignee: Eric Charles +> Fix For: 2.5.1 +> +> Attachments: 0001-JWC-111-update-james-related-projects-to-SNAPSHOT-ve.patch +> +> +> It should depend on james-project 1.8.3-SNAPSHOT to use only up-to-date component. + + + +-- +This message was sent by Atlassian JIRA +(v6.3.4#6332) Modified: james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.eml URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.eml?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.eml (original) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.eml Mon Jun 29 08:36:12 2015 @@ -31,7 +31,7 @@ Content-Type: multipart/mixed; boundary= Content-Transfer-Encoding: 7bit MIME-Version: 1.0 From: "Content-filter at spam.minet.net" <postmas...@minet.net> -Date: Wed, 3 Jun 2015 09:05:46 +0000 (UTC) +Date: Wed, 3 Jun 2015 09:05:46 +0000 To: <r...@listes.minet.net> Message-ID: <vass-izaxqm...@spam.minet.net> Subject: [root] UNCHECKED contents in mail FROM <quenti...@riseup.net> Modified: james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.json URL: http://svn.apache.org/viewvc/james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.json?rev=1688133&r1=1688132&r2=1688133&view=diff ============================================================================== --- james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.json (original) +++ james/mailbox/trunk/elasticsearch/src/test/resources/documents/spamMail.json Mon Jun 29 08:36:12 2015 @@ -12,7 +12,7 @@ "1.0" ], "date": [ - "Wed, 3 Jun 2015 09:05:46 +0000 (UTC)" + "Wed, 3 Jun 2015 09:05:46 +0000" ], "x-beenthere": [ "r...@listes.minet.net" @@ -103,7 +103,7 @@ "subject": [ "[root] UNCHECKED contents in mail FROM <quenti...@riseup.net>" ], - "sentDate": "2015-06-07T00:00:00+02:00", + "sentDate": "2015-06-03T09:05:46+0000", "properties": [ { "namespace": "http://james.apache.org/rfc2045/Content-Type", --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org