james-server-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From btell...@apache.org
Subject svn commit: r1688133 - in /james/mailbox/trunk/elasticsearch: ./ src/main/java/org/apache/james/mailbox/elasticsearch/events/ src/main/java/org/apache/james/mailbox/elasticsearch/search/ src/main/resources/META-INF/spring/ src/test/java/org/apache/jame...
Date Mon, 29 Jun 2015 08:36:13 GMT
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.ksr@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, "root@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-owner@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 <benwa@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 <benwa@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-owner@frnog.org; receiver=benwa@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 <benwa@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: frnog@frnog.org
+Delivered-To: frnog@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 <frnog@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 <frnog@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.2090108@waycom.net>
+Date: Tue, 2 Jun 2015 12:00:55 +0200
+From: Guillaume Genty <ggenty@waycom.net>
+Organization: Waycom
+MIME-Version: 1.0
+To: <frnog@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: frnog@frnog.org
+X-Sequence: 5349
+Errors-to: frnog-owner@frnog.org
+Precedence: list
+Precedence: bulk
+Sender: frnog-request@frnog.org
+X-mailing-list: frnog@frnog.org
+List-Id: <frnog.frnog.org>
+List-Archive: <http://sympa.frnog.org/wss/arc/frnog>
+List-Help: <mailto:sympa@frnog.org?subject=help>
+List-Owner: <mailto:frnog-request@frnog.org>
+List-Post: <mailto:frnog@frnog.org>
+List-Subscribe: <mailto:sympa@frnog.org?subject=subscribe%20frnog>
+List-Unsubscribe: <mailto:sympa@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
+ggenty@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.net@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 <benwa@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 <benwa@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.net@james.apache.org; receiver=benwa@minet.net
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+	by mx2.minet.net (Postfix) with SMTP id CDE83A1C7FC
+	for <benwa@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-help@james.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org>
+List-Help: <mailto:server-dev-help@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)" <jira@apache.org>
+To: server-dev@james.apache.org
+Message-ID: <JIRA.12835341.1433409792000.9340.1433409817961@Atlassian.JIRA>
+In-Reply-To: <JIRA.12835341.1433409792000@Atlassian.JIRA>
+References: <JIRA.12835341.1433409792000@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-unsubscribe@james.apache.org
+For additional commands, e-mail: server-dev-help@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.net@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 <benwa@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 <benwa@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.net@james.apache.org; receiver=benwa@minet.net
+Received: from mail.apache.org (hermes.apache.org [140.211.11.3])
+	by mx2.minet.net (Postfix) with SMTP id 85A3AA1CA2C
+	for <benwa@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-help@james.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org>
+List-Help: <mailto:server-dev-help@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)" <jira@apache.org>
+To: server-dev@james.apache.org
+Message-ID: <JIRA.12781874.1426269127000.9353.1433410057953@Atlassian.JIRA>
+In-Reply-To: <JIRA.12781874.1426269127000@Atlassian.JIRA>
+References: <JIRA.12781874.1426269127000@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-unsubscribe@james.apache.org
+For additional commands, e-mail: server-dev-help@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.net@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 <benwa@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 <benwa@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.net@james.apache.org; receiver=benwa@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 <benwa@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-help@james.apache.org; run by ezmlm
+Precedence: bulk
+List-Unsubscribe: <mailto:server-dev-unsubscribe@james.apache.org>
+List-Help: <mailto:server-dev-help@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)" <jira@apache.org>
+To: server-dev@james.apache.org
+Message-ID: <JIRA.12473940.1284322083000.91735.1433232979714@Atlassian.JIRA>
+In-Reply-To: <JIRA.12473940.1284322083000@Atlassian.JIRA>
+References: <JIRA.12473940.1284322083000@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-unsubscribe@james.apache.org
+For additional commands, e-mail: server-dev-help@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.net@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 <benwa@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 <benwa@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.net@james.apache.org; receiver=benwa@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 <benwa@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-help@james.apache.org; run by ezmlm
+Precedence: bulk
+List-Help: <mailto:mailet-api-help@james.apache.org>
+List-Unsubscribe: <mailto:mailet-api-unsubscribe@james.apache.org>
+List-Post: <mailto:mailet-api@james.apache.org>
+List-Id: <mailet-api.james.apache.org>
+Reply-To: mailet-api@james.apache.org
+Delivered-To: mailing list mailet-api@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-api@james.apache.org>
+To: mailet-api@james.apache.org
+Message-ID: <JIRA.12825882.1430301328000.124152.1431671759942@Atlassian.JIRA>
+In-Reply-To: <JIRA.12825882.1430301328000@Atlassian.JIRA>
+References: <JIRA.12825882.1430301328000@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" <postmaster@minet.net>
-Date: Wed,  3 Jun 2015 09:05:46 +0000 (UTC)
+Date: Wed, 3 Jun 2015 09:05:46 +0000
 To: <root@listes.minet.net>
 Message-ID: <VASs-IZaXqmZao@spam.minet.net>
 Subject: [root] UNCHECKED contents in mail FROM <quentin.h@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": [
 	  "root@listes.minet.net"
@@ -103,7 +103,7 @@
   "subject": [
 	"[root] UNCHECKED contents in mail FROM <quentin.h@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Mime
View raw message