You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2016/04/06 11:21:45 UTC

[01/18] james-project git commit: MAILBOX-266 JamesCapabilitiesTests should be located in an up to date project

Repository: james-project
Updated Branches:
  refs/heads/master 8005257c4 -> d1d5712f9


MAILBOX-266 JamesCapabilitiesTests should be located in an up to date project


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/41ca5753
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/41ca5753
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/41ca5753

Branch: refs/heads/master
Commit: 41ca5753c037cad1649f660841ac2460e7f53b05
Parents: 8005257
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Mar 24 18:08:48 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:06:26 2016 +0700

----------------------------------------------------------------------
 .../james/JamesCapabilitiesServerTest.java      |  99 ------------------
 server/container/guice/cassandra-guice/pom.xml  |   5 +
 .../james/JamesCapabilitiesServerTest.java      | 100 +++++++++++++++++++
 3 files changed, 105 insertions(+), 99 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/41ca5753/server/container/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
deleted file mode 100644
index 6652b97..0000000
--- a/server/container/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-package org.apache.james;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.jmap.methods.GetMessageListMethod;
-import org.apache.james.mailbox.MailboxManager;
-import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
-import org.apache.james.modules.TestElasticSearchModule;
-import org.apache.james.modules.TestFilesystemModule;
-import org.apache.james.modules.TestJMAPServerModule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.RuleChain;
-import org.junit.rules.TemporaryFolder;
-
-import com.google.common.collect.ImmutableList;
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import com.google.inject.util.Modules;
-
-public class JamesCapabilitiesServerTest {
-
-    private CassandraJamesServer server;
-    private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
-
-    @Rule
-    public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
-
-    private Module createModule(MailboxManager mailboxManager) {
-        return Modules.override(CassandraJamesServerMain.defaultModule)
-                .with(new TestElasticSearchModule(embeddedElasticSearch),
-                        new TestFilesystemModule(temporaryFolder),
-                        new TestJMAPServerModule(GetMessageListMethod.DEFAULT_MAXIMUM_LIMIT),
-                        new AbstractModule() {
-                    
-                    @Override
-                    protected void configure() {
-                        bind(MailboxManager.class).toInstance(mailboxManager);
-                    }
-                    
-                    @Provides
-                    @Singleton
-                    com.datastax.driver.core.Session provideSession(CassandraModule cassandraModule) {
-                        CassandraCluster cassandra = CassandraCluster.create(cassandraModule);
-                        return cassandra.getConf();
-                    }
-
-                });
-    }
-
-    @Test(expected=IllegalArgumentException.class)
-    public void startShouldFailWhenNoMoveCapability() throws Exception {
-        MailboxManager mailboxManager = mock(MailboxManager.class);
-        when(mailboxManager.getSupportedCapabilities())
-            .thenReturn(ImmutableList.of(MailboxManager.Capabilities.Basic));
-        server = new CassandraJamesServer(createModule(mailboxManager));
-        
-        server.start();
-        
-        // In case of non-failure
-        server.stop();
-    }
-
-    @Test
-    public void startShouldSucceedWhenMoveCapability() throws Exception {
-        MailboxManager mailboxManager = mock(MailboxManager.class);
-        when(mailboxManager.getSupportedCapabilities())
-            .thenReturn(ImmutableList.of(MailboxManager.Capabilities.Move));
-        server = new CassandraJamesServer(createModule(mailboxManager));
-        
-        server.start();
-        
-        server.stop();
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/41ca5753/server/container/guice/cassandra-guice/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/pom.xml b/server/container/guice/cassandra-guice/pom.xml
index b66fa2e..254d6ef 100644
--- a/server/container/guice/cassandra-guice/pom.xml
+++ b/server/container/guice/cassandra-guice/pom.xml
@@ -259,6 +259,11 @@
                     <version>${cassandra-unit.version}</version>
                     <scope>test</scope>
                 </dependency>
+                <dependency>
+                    <groupId>org.mockito</groupId>
+                    <artifactId>mockito-core</artifactId>
+                    <scope>test</scope>
+                </dependency>
             </dependencies>
         </profile>
         <profile>

http://git-wip-us.apache.org/repos/asf/james-project/blob/41ca5753/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
new file mode 100644
index 0000000..b691ec5
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -0,0 +1,100 @@
+/****************************************************************
+ * 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;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.jmap.methods.GetMessageListMethod;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.cassandra.CassandraId;
+import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
+import org.apache.james.modules.TestElasticSearchModule;
+import org.apache.james.modules.TestFilesystemModule;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+import com.datastax.driver.core.Session;
+import com.google.common.collect.ImmutableList;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+
+public class JamesCapabilitiesServerTest {
+
+    private GuiceJamesServer<CassandraId> server;
+    private TemporaryFolder temporaryFolder = new TemporaryFolder();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+
+    @Rule
+    public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+
+    @Test(expected=IllegalArgumentException.class)
+    public void startShouldFailWhenNoMoveCapability() throws Exception {
+        MailboxManager mailboxManager = mock(MailboxManager.class);
+        when(mailboxManager.getSupportedCapabilities())
+            .thenReturn(ImmutableList.of(MailboxManager.Capabilities.Basic));
+        server = createCassandraJamesServer(mailboxManager);
+
+        server.start();
+
+        // In case of non-failure
+        server.stop();
+    }
+
+    @Test
+    public void startShouldSucceedWhenMoveCapability() throws Exception {
+        MailboxManager mailboxManager = mock(MailboxManager.class);
+        when(mailboxManager.getSupportedCapabilities())
+            .thenReturn(ImmutableList.of(MailboxManager.Capabilities.Move));
+        server = createCassandraJamesServer(mailboxManager);
+
+        server.start();
+
+        server.stop();
+    }
+
+    private GuiceJamesServer<CassandraId> createCassandraJamesServer(final MailboxManager mailboxManager) {
+        return new GuiceJamesServer<>(CassandraJamesServerMain.cassandraId)
+            .combineWith(CassandraJamesServerMain.cassandraServerModule)
+            .overrideWith(new TestElasticSearchModule(embeddedElasticSearch),
+                new TestFilesystemModule(temporaryFolder),
+                new TestJMAPServerModule(GetMessageListMethod.DEFAULT_MAXIMUM_LIMIT),
+                new AbstractModule() {
+
+                    @Override
+                    protected void configure() {
+                        bind(MailboxManager.class).toInstance(mailboxManager);
+                    }
+
+                    @SuppressWarnings("unused")
+                    @Provides
+                    @Singleton
+                    Session provideSession(CassandraModule cassandraModule) {
+                        CassandraCluster cassandra = CassandraCluster.create(cassandraModule);
+                        return cassandra.getConf();
+                    }
+                });
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[03/18] james-project git commit: MAILBOX-266 Update to ElasticSearch 2.2.1

Posted by bt...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
index 317fc71..493f8ff 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
@@ -68,7 +68,7 @@ public class SmtpTestModule extends AbstractModule {
                 new CassandraRRTModule());
         cassandraClusterSingleton = CassandraCluster.create(cassandraModuleComposite);
 
-        embeddedElasticSearch = new EmbeddedElasticSearch();
+        embeddedElasticSearch = new EmbeddedElasticSearch(folder);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
index 3ca0fe3..dcb6b08 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
@@ -40,7 +40,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraJamesServerTest extends AbstractJamesServerTest<CassandraId> {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
 
     @Rule
     public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index b691ec5..761d1fd 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -45,7 +45,7 @@ public class JamesCapabilitiesServerTest {
 
     private GuiceJamesServer<CassandraId> server;
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
 
     @Rule
     public RuleChain chain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
index 2c7bf47..f414f16 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
@@ -35,7 +35,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraGetMailboxesMethodTest extends GetMailboxesMethodTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
index 1d81cc8..44496bd 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
@@ -35,7 +35,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraGetMessageListMethodTest extends GetMessageListMethodTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
index 7cc7a55..716b95b 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
@@ -35,7 +35,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraGetMessagesMethodTest extends GetMessagesMethodTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
index 4408a31..d9c653f 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
@@ -36,7 +36,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraJmapAuthenticationTest extends JMAPAuthenticationTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
index a57a21a..d5757b8 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
@@ -32,7 +32,7 @@ import org.junit.rules.TemporaryFolder;
 public class CassandraSetMailboxesMethodTest extends SetMailboxesMethodTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
index 04a5cb1..e71ed96 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
@@ -35,7 +35,7 @@ import com.google.inject.TypeLiteral;
 public class CassandraSetMessagesMethodTest extends SetMessagesMethodTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
-    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch();
+    private EmbeddedElasticSearch embeddedElasticSearch = new EmbeddedElasticSearch(temporaryFolder);
     private EmbeddedCassandra cassandra = EmbeddedCassandra.createStartServer();
 
     @Rule


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[02/18] james-project git commit: MAILBOX-266 Update guava dependency to 18.0 to satisfy ElasticSearch 2.2.1 dependency

Posted by bt...@apache.org.
MAILBOX-266 Update guava dependency to 18.0 to satisfy ElasticSearch 2.2.1 dependency


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/67882065
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/67882065
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/67882065

Branch: refs/heads/master
Commit: 67882065b0aa8a1f515973ec99d6e151a41e3359
Parents: 41ca575
Author: Benoit Tellier <bt...@apache.org>
Authored: Thu Feb 18 10:55:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:41 2016 +0700

----------------------------------------------------------------------
 backends-common/pom.xml                                        | 2 +-
 .../org/apache/james/mailbox/elasticsearch/json/EMailer.java   | 6 +++---
 mailbox/pom.xml                                                | 2 +-
 .../mailbox/store/mail/model/impl/SimpleMailboxMessage.java    | 4 ++--
 protocols/pom.xml                                              | 2 +-
 .../main/java/org/apache/james/http/jetty/Configuration.java   | 3 ++-
 .../src/main/java/org/apache/james/rrt/lib/MappingImpl.java    | 3 ++-
 .../src/main/java/org/apache/james/rrt/lib/MappingsImpl.java   | 3 ++-
 server/pom.xml                                                 | 2 +-
 .../main/java/org/apache/james/jmap/methods/JmapResponse.java  | 3 ++-
 .../src/main/java/org/apache/james/jmap/methods/Method.java    | 2 +-
 .../java/org/apache/james/jmap/methods/ValidationResult.java   | 3 ++-
 .../main/java/org/apache/james/jmap/model/CreationMessage.java | 3 ++-
 .../src/main/java/org/apache/james/jmap/model/Emailer.java     | 3 ++-
 .../main/java/org/apache/james/jmap/model/mailbox/Mailbox.java | 3 ++-
 .../org/apache/james/jmap/model/mailbox/MailboxRequest.java    | 3 ++-
 .../main/java/org/apache/james/jmap/model/mailbox/Role.java    | 3 ++-
 .../java/org/apache/james/jmap/model/mailbox/SortOrder.java    | 3 ++-
 .../main/java/org/apache/james/jmap/model/message/EMailer.java | 3 ++-
 19 files changed, 34 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/backends-common/pom.xml
----------------------------------------------------------------------
diff --git a/backends-common/pom.xml b/backends-common/pom.xml
index e09819c..fc83424 100644
--- a/backends-common/pom.xml
+++ b/backends-common/pom.xml
@@ -51,7 +51,7 @@
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
-                <version>16.0</version>
+                <version>18.0</version>
             </dependency>
             <dependency>
                 <groupId>javax.inject</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
index 9545a0e..0ed87ac 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/EMailer.java
@@ -19,11 +19,11 @@
 
 package org.apache.james.mailbox.elasticsearch.json;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.elasticsearch.common.base.MoreObjects;
-
 import java.util.Objects;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
+
 public class EMailer {
 
     private final String name;

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/mailbox/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/pom.xml b/mailbox/pom.xml
index 6596bc1..e7f50df 100644
--- a/mailbox/pom.xml
+++ b/mailbox/pom.xml
@@ -116,7 +116,7 @@
         <junit.version>4.11</junit.version>
         <mockito-core.version>1.9.0</mockito-core.version>
         <jasypt.version>1.9.0</jasypt.version>
-        <guava.version>16.0</guava.version>
+        <guava.version>18.0</guava.version>
         <assertj.version>1.7.1</assertj.version>
         <jackson-databinding.version>2.6.3</jackson-databinding.version>
         <cassandra-driver-core.version>2.1.8</cassandra-driver-core.version>

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
index 0ae7aee..24ddb27 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.store.mail.model.DelegatingMailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
-import com.google.common.base.Objects;
+import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Ints;
 
 public class SimpleMailboxMessage<Id extends MailboxId> extends DelegatingMailboxMessage<Id> {
@@ -166,7 +166,7 @@ public class SimpleMailboxMessage<Id extends MailboxId> extends DelegatingMailbo
     }
 
     public String toString() {
-        return Objects.toStringHelper(this)
+        return MoreObjects.toStringHelper(this)
             .add("uid", this.uid)
             .add("mailboxId", this.mailboxId)
             .add("answered", this.answered)

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/protocols/pom.xml
----------------------------------------------------------------------
diff --git a/protocols/pom.xml b/protocols/pom.xml
index e682f1f..470cb72 100644
--- a/protocols/pom.xml
+++ b/protocols/pom.xml
@@ -154,7 +154,7 @@
             <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
-                <version>16.0</version>
+                <version>18.0</version>
             </dependency>
             <dependency>
                 <groupId>io.netty</groupId>

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
----------------------------------------------------------------------
diff --git a/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java b/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
index 445c507..362a1a2 100644
--- a/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
+++ b/server/container/jetty/src/main/java/org/apache/james/http/jetty/Configuration.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import javax.servlet.Filter;
 import javax.servlet.Servlet;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableListMultimap;
 import com.google.common.collect.ImmutableMap;
@@ -171,7 +172,7 @@ public class Configuration {
     
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(getClass())
+        return MoreObjects.toStringHelper(getClass())
                 .add("mappings", mappings)
                 .add("filters", filters)
                 .add("port", port)

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
index 40c1550..113b83b 100644
--- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
+++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingImpl.java
@@ -24,6 +24,7 @@ import java.io.Serializable;
 
 import org.apache.james.rrt.api.RecipientRewriteTable;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
@@ -113,7 +114,7 @@ public class MappingImpl implements Mapping, Serializable {
     
     @Override
     public String toString() {
-        return Objects.toStringHelper(getClass()).add("mapping", mapping).toString();
+        return MoreObjects.toStringHelper(getClass()).add("mapping", mapping).toString();
     }
     
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
index 0be86e0..8b421e5 100644
--- a/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
+++ b/server/data/data-library/src/main/java/org/apache/james/rrt/lib/MappingsImpl.java
@@ -30,6 +30,7 @@ import org.apache.james.rrt.lib.Mapping.Type;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -234,6 +235,6 @@ public class MappingsImpl implements Mappings, Serializable {
 
     @Override
     public String toString() {
-        return Objects.toStringHelper(getClass()).add("mappings", mappings).toString();
+        return MoreObjects.toStringHelper(getClass()).add("mappings", mappings).toString();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/pom.xml
----------------------------------------------------------------------
diff --git a/server/pom.xml b/server/pom.xml
index 4b4863f..884c734 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -167,7 +167,7 @@
         <geronimo-annotation-spec.version>1.0.1</geronimo-annotation-spec.version>
         <spring-osgi-extender.version>1.2.1</spring-osgi-extender.version>
         <org.osgi.core.version>5.0.0</org.osgi.core.version>
-        <guava.version>16.0</guava.version>
+        <guava.version>18.0</guava.version>
         <cucumber.version>1.2.3</cucumber.version>
 
         <!-- karaf dependencies -->

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
index dbfdee9..bab4dbc 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/JmapResponse.java
@@ -26,6 +26,7 @@ import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.Property;
 
 import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
 
@@ -153,7 +154,7 @@ public class JmapResponse {
     
     @Override
     public String toString() {
-        return Objects.toStringHelper(getClass())
+        return MoreObjects.toStringHelper(getClass())
                 .add("method", method)
                 .add("response", response)
                 .add("clientId", clientId)

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
index 5b83319..46cb307 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/Method.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.jmap.methods;
 
-import static com.google.common.base.Objects.toStringHelper;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 import java.util.Objects;
 import java.util.stream.Stream;

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValidationResult.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValidationResult.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValidationResult.java
index 9540ce6..0683522 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValidationResult.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ValidationResult.java
@@ -22,6 +22,7 @@ package org.apache.james.jmap.methods;
 import java.util.Objects;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 
 public class ValidationResult {
 
@@ -85,7 +86,7 @@ public class ValidationResult {
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(getClass())
+        return MoreObjects.toStringHelper(getClass())
                 .add("property", property)
                 .add("errorMessage", errorMessage)
                 .toString();

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 4fac7e8..de2453d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -36,6 +36,7 @@ import org.apache.james.jmap.methods.ValidationResult;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
@@ -420,7 +421,7 @@ public class CreationMessage {
 
         @Override
         public String toString() {
-            return com.google.common.base.Objects.toStringHelper(this)
+            return MoreObjects.toStringHelper(this)
                     .add("name", name)
                     .add("email", email.orElse("<unset>"))
                     .toString();

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
index 72b04e6..906a841 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Emailer.java
@@ -24,6 +24,7 @@ import java.util.Objects;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
@@ -90,7 +91,7 @@ public class Emailer {
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return MoreObjects.toStringHelper(this)
             .add("name", name)
             .add("email", email)
             .toString();

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
index 6c3330d..52436c4 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
@@ -28,6 +28,7 @@ import com.fasterxml.jackson.annotation.JsonFilter;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
@@ -289,7 +290,7 @@ public class Mailbox {
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(getClass())
+        return MoreObjects.toStringHelper(getClass())
                 .add("id", id)
                 .add("name", name)
                 .add("sortOrder", sortOrder)

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxRequest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxRequest.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxRequest.java
index c625f7a..bb8cff3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxRequest.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/MailboxRequest.java
@@ -27,6 +27,7 @@ import org.apache.commons.lang.NotImplementedException;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
@@ -145,7 +146,7 @@ public class MailboxRequest {
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(getClass())
+        return MoreObjects.toStringHelper(getClass())
                 .add("id", id)
                 .add("name", name)
                 .add("parentId", parentId)

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
index 4c01a48..a29c168 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonValue;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
 
@@ -94,6 +95,6 @@ public class Role {
 
     @Override
     public String toString() {
-        return Objects.toStringHelper(this).add("name", name).toString();
+        return MoreObjects.toStringHelper(this).add("name", name).toString();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
index fe5fb0b..6284381 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.model.mailbox;
 import java.util.Optional;
 
 import com.fasterxml.jackson.annotation.JsonValue;
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
@@ -74,7 +75,7 @@ public class SortOrder implements Comparable<SortOrder> {
     
     @Override
     public String toString() {
-        return Objects.toStringHelper(getClass()).add("order", sortOrder).toString();
+        return MoreObjects.toStringHelper(getClass()).add("order", sortOrder).toString();
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/67882065/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/EMailer.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/EMailer.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/EMailer.java
index 927119f..0126c73 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/EMailer.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/message/EMailer.java
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.model.message;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.base.MoreObjects;
 
 import java.util.Objects;
 
@@ -60,7 +61,7 @@ public class EMailer {
 
     @Override
     public String toString() {
-        return com.google.common.base.Objects.toStringHelper(this)
+        return MoreObjects.toStringHelper(this)
             .add("name", name)
             .add("address", address)
             .toString();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[08/18] james-project git commit: MAILBOX-266 ZonedDateTime does not support truncate using Month and Year units

Posted by bt...@apache.org.
MAILBOX-266 ZonedDateTime does not support truncate using Month and Year units


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b446bffd
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b446bffd
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b446bffd

Branch: refs/heads/master
Commit: b446bffdc630da8eedc75fc010c0891758c4f94c
Parents: 0ea8bc6
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 14:07:55 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../query/DateResolutionFormater.java             | 11 +++++++++--
 .../query/DateResolutionFormaterTest.java         | 18 ++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b446bffd/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormater.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormater.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormater.java
index 30574f3..70746b5 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormater.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormater.java
@@ -34,11 +34,18 @@ public class DateResolutionFormater {
     public static DateTimeFormatter DATE_TIME_FOMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
 
     public static ZonedDateTime computeUpperDate(ZonedDateTime date, SearchQuery.DateResolution resolution) {
-        return date.truncatedTo(convertDateResolutionField(resolution)).plus(1,convertDateResolutionField(resolution));
+        return computeLowerDate(date, resolution).plus(1, convertDateResolutionField(resolution));
     }
 
     public static ZonedDateTime computeLowerDate(ZonedDateTime date, SearchQuery.DateResolution resolution) {
-        return date.truncatedTo(convertDateResolutionField(resolution));
+        switch (resolution) {
+            case Year:
+                return date.truncatedTo(ChronoUnit.DAYS).withDayOfYear(1);
+            case Month:
+                return date.truncatedTo(ChronoUnit.DAYS).withDayOfMonth(1);
+            default:
+                return date.truncatedTo(convertDateResolutionField(resolution));
+        }
     }
 
     private static TemporalUnit convertDateResolutionField(SearchQuery.DateResolution resolution) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/b446bffd/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
index fed35c1..07cbe4f 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
@@ -52,6 +52,24 @@ public class DateResolutionFormaterTest {
     }
 
     @Test
+    public void calculateUpperDateShouldReturnDateUpToTheNextMonthUsingMonthUnit() throws ParseException {
+        assertThat(
+            ISO_OFFSET_DATE_TIME.format(
+                DateResolutionFormater.computeUpperDate(ZonedDateTime.parse(dateString, ISO_OFFSET_DATE_TIME), SearchQuery.DateResolution.Month)
+            )
+        ).isEqualTo("2014-02-01T00:00:00Z");
+    }
+
+    @Test
+    public void calculateUpperDateShouldReturnDateUpToTheNextYearUsingYearUnit() throws ParseException {
+        assertThat(
+            ISO_OFFSET_DATE_TIME.format(
+                DateResolutionFormater.computeUpperDate(ZonedDateTime.parse(dateString, ISO_OFFSET_DATE_TIME), SearchQuery.DateResolution.Year)
+            )
+        ).isEqualTo("2015-01-01T00:00:00Z");
+    }
+
+    @Test
     public void calculateUpperDateShouldReturnDateUpToTheNextDayUsingDayUnit() throws ParseException {
         assertThat(
             ISO_OFFSET_DATE_TIME.format(


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[16/18] james-project git commit: MAILBOX-266 Deletes should be bulked

Posted by bt...@apache.org.
MAILBOX-266 Deletes should be bulked


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/aea76c8d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/aea76c8d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/aea76c8d

Branch: refs/heads/master
Commit: aea76c8d32c167590912c4d8b5e93c499467aa7d
Parents: 1bfa390
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Mar 25 14:27:03 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/ElasticSearchIndexer.java     | 12 +--
 ...lasticSearchListeningMessageSearchIndex.java | 32 ++++---
 .../elasticsearch/ElasticSearchIndexerTest.java | 32 ++++++-
 ...hListeningMailboxMessageSearchIndexTest.java | 99 +++++++++++++-------
 .../lucene/search/LuceneMessageSearchIndex.java | 19 +++-
 .../store/search/LazyMessageSearchIndex.java    |  9 +-
 .../search/ListeningMessageSearchIndex.java     | 36 +++----
 .../james/mailbox/indexer/ReIndexerImpl.java    |  2 +-
 .../mailbox/indexer/ReIndexerImplTest.java      |  2 +-
 9 files changed, 164 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index f4bbec4..1292b28 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -24,7 +24,6 @@ import javax.inject.Inject;
 
 import org.elasticsearch.action.bulk.BulkRequestBuilder;
 import org.elasticsearch.action.bulk.BulkResponse;
-import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.Strings;
@@ -85,15 +84,16 @@ public class ElasticSearchIndexer {
         }
     }
     
-    public DeleteResponse deleteMessage(String id) {
+    public BulkResponse deleteMessages(List<String> ids) {
         try (Client client = clientProvider.get()) {
-            return client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id)
-                .get();
+            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+            ids.forEach(id -> bulkRequestBuilder.add(client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id)));
+            return bulkRequestBuilder.get();
         }
     }
     
-    public void deleteAllMatchingQuery(QueryBuilder queryBuilder) {
-        deleteByQueryPerformer.perform(queryBuilder);
+    public Void deleteAllMatchingQuery(QueryBuilder queryBuilder) {
+        return deleteByQueryPerformer.perform(queryBuilder);
     }
 
     private void checkArgument(String content) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 68d9fd6..4e1ddec 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -32,8 +32,6 @@ import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 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;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
@@ -84,17 +82,25 @@ public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> exte
     }
 
     @Override
-    public void delete(MailboxSession session, Mailbox<Id> mailbox, MessageRange range) throws MailboxException {
-        if (range.getType() == Type.ALL) {
-            indexer.deleteAllMatchingQuery(termQuery(JsonMessageConstants.MAILBOX_ID, mailbox.getMailboxId().serialize()));
-        } else {
-            range.forEach(messageId -> {
-                try {
-                    indexer.deleteMessage(indexIdFor(mailbox, messageId));
-                } catch (Exception e) {
-                    LOGGER.error("Error when deleting index for message " + messageId, e);
-                }
-            });
+    public void delete(MailboxSession session, Mailbox<Id> mailbox, List<Long> expungedUids) throws MailboxException {
+        try {
+            indexer.deleteMessages(expungedUids.stream()
+                .map(uid ->  indexIdFor(mailbox, uid))
+                .collect(Collectors.toList()));
+        } catch (Exception e) {
+            LOGGER.error("Error when deleting messages {} in mailbox {} from index", mailbox.getMailboxId().serialize(), expungedUids, e);
+        }
+    }
+
+    @Override
+    public void deleteAll(MailboxSession session, Mailbox<Id> mailbox) throws MailboxException {
+        try {
+            indexer.deleteAllMatchingQuery(
+                termQuery(
+                    JsonMessageConstants.MAILBOX_ID,
+                    mailbox.getMailboxId().serialize()));
+        } catch (Exception e) {
+            LOGGER.error("Error when deleting all messages in mailbox {}", mailbox.getMailboxId().serialize(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index 43fc26b..f5e30c8 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -194,7 +194,7 @@ public class ElasticSearchIndexerTest {
         testee.indexMessage(messageId, content);
         embeddedElasticSearch.awaitForElasticSearch();
 
-        testee.deleteMessage(messageId);
+        testee.deleteMessages(Lists.newArrayList(messageId));
         embeddedElasticSearch.awaitForElasticSearch();
         
         try (Client client = node.client()) {
@@ -206,4 +206,34 @@ public class ElasticSearchIndexerTest {
         }
     }
 
+    @Test
+    public void deleteShouldWorkWhenMultipleMessages() throws Exception {
+        String messageId = "1:1";
+        String content = "{\"message\": \"trying out Elasticsearch\", \"mailboxId\":\"1\"}";
+
+        testee.indexMessage(messageId, content);
+
+        String messageId2 = "1:2";
+        String content2 = "{\"message\": \"trying out Elasticsearch 2\", \"mailboxId\":\"1\"}";
+
+        testee.indexMessage(messageId2, content2);
+
+        String messageId3 = "2:3";
+        String content3 = "{\"message\": \"trying out Elasticsearch 3\", \"mailboxId\":\"2\"}";
+
+        testee.indexMessage(messageId3, content3);
+        embeddedElasticSearch.awaitForElasticSearch();
+
+        testee.deleteMessages(Lists.newArrayList(messageId, messageId3));
+        embeddedElasticSearch.awaitForElasticSearch();
+
+        try (Client client = node.client()) {
+            SearchResponse searchResponse = client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setQuery(QueryBuilders.matchAllQuery())
+                .get();
+            assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(1);
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
index f15b1ad..79691d1 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
@@ -27,7 +27,6 @@ import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 
 import java.io.IOException;
-import java.util.stream.LongStream;
 import java.util.List;
 
 import javax.mail.Flags;
@@ -36,7 +35,6 @@ 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.model.UpdatedFlags;
 import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
@@ -45,8 +43,8 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.easymock.IMocksControl;
 import org.elasticsearch.ElasticsearchException;
 import org.elasticsearch.action.bulk.BulkResponse;
-import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
+import org.elasticsearch.index.query.QueryBuilder;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -57,26 +55,23 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
     public static final long MODSEQ = 18L;
     private IMocksControl control;
-    
-    private MessageMapperFactory<TestId> mapperFactory;
+
     private ElasticSearchIndexer indexer;
-    private MessageToElasticSearchJson messageToElasticSearchJson;
-    private ElasticSearchSearcher<TestId> elasticSearchSearcher;
-    
     private ElasticSearchListeningMessageSearchIndex<TestId> testee;
     
     @Before
     @SuppressWarnings("unchecked")
     public void setup() throws JsonProcessingException {
         control = createControl();
-        
-        mapperFactory = control.createMock(MessageMapperFactory.class);
+
+        MessageMapperFactory<TestId> mapperFactory = control.createMock(MessageMapperFactory.class);
+        MessageToElasticSearchJson messageToElasticSearchJson = control.createMock(MessageToElasticSearchJson.class);
+        ElasticSearchSearcher<TestId> elasticSearchSearcher = control.createMock(ElasticSearchSearcher.class);
+
         indexer = control.createMock(ElasticSearchIndexer.class);
-        messageToElasticSearchJson = control.createMock(MessageToElasticSearchJson.class);
+
         expect(messageToElasticSearchJson.convertToJson(anyObject(MailboxMessage.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, elasticSearchSearcher, messageToElasticSearchJson);
     }
@@ -133,16 +128,15 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         MailboxSession session = control.createMock(MailboxSession.class);
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
         long messageId = 1;
-        MessageRange messageRange = MessageRange.one(messageId);
         TestId mailboxId = TestId.of(12);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
         
-        DeleteResponse expectedDeleteResponse = control.createMock(DeleteResponse.class);
-        expect(indexer.deleteMessage(mailboxId.serialize() + ":" + messageId))
-            .andReturn(expectedDeleteResponse);
+        BulkResponse expectedBulkResponse = control.createMock(BulkResponse.class);
+        expect(indexer.deleteMessages(anyObject(List.class)))
+            .andReturn(expectedBulkResponse);
         
         control.replay();
-        testee.delete(session, mailbox, messageRange);
+        testee.delete(session, mailbox, Lists.newArrayList(messageId));
         control.verify();
     }
     
@@ -151,21 +145,20 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
     public void deleteShouldWorkWhenMultipleMessageIds() throws Exception {
         MailboxSession session = control.createMock(MailboxSession.class);
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
-        long firstMessageId = 1;
-        long lastMessageId = 10;
-        MessageRange messageRange = MessageRange.range(firstMessageId, lastMessageId);
+        long messageId1 = 1;
+        long messageId2 = 2;
+        long messageId3 = 3;
+        long messageId4 = 4;
+        long messageId5 = 5;
         TestId mailboxId = TestId.of(12);
-        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(10);
-        
-        LongStream.rangeClosed(firstMessageId, lastMessageId)
-            .forEach(messageId -> {
-                DeleteResponse expectedDeleteResponse = control.createMock(DeleteResponse.class);
-                expect(indexer.deleteMessage(mailboxId.serialize() + ":" + messageId))
-                    .andReturn(expectedDeleteResponse);
-            });
+        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(5);
+
+        BulkResponse expectedBulkResponse = control.createMock(BulkResponse.class);
+        expect(indexer.deleteMessages(anyObject(List.class)))
+            .andReturn(expectedBulkResponse);
         
         control.replay();
-        testee.delete(session, mailbox, messageRange);
+        testee.delete(session, mailbox, Lists.newArrayList(messageId1, messageId2, messageId3, messageId4, messageId5));
         control.verify();
     }
     
@@ -175,15 +168,14 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         MailboxSession session = control.createMock(MailboxSession.class);
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
         long messageId = 1;
-        MessageRange messageRange = MessageRange.one(messageId);
         TestId mailboxId = TestId.of(12);
-        expect(mailbox.getMailboxId()).andReturn(mailboxId);
+        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(2);
         
-        expect(indexer.deleteMessage(mailboxId.serialize() + ":" + messageId))
+        expect(indexer.deleteMessages(anyObject(List.class)))
             .andThrow(new ElasticsearchException(""));
         
         control.replay();
-        testee.delete(session, mailbox, messageRange);
+        testee.delete(session, mailbox, Lists.newArrayList(messageId));
         control.verify();
     }
 
@@ -232,4 +224,43 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         testee.update(session, mailbox, Lists.newArrayList(updatedFlags));
         control.verify();
     }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void deleteAllShouldWork() throws Exception {
+        MailboxSession session = control.createMock(MailboxSession.class);
+
+        Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
+
+        TestId mailboxId = TestId.of(12);
+
+        expectLastCall();
+        expect(mailbox.getMailboxId()).andReturn(mailboxId);
+
+        expect(indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class)))
+            .andReturn(null);
+
+        control.replay();
+        testee.deleteAll(session, mailbox);
+        control.verify();
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    public void deleteAllShouldNotPropagateExceptionWhenExceptionOccurs() throws Exception {
+        MailboxSession session = control.createMock(MailboxSession.class);
+
+        Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
+        TestId mailboxId = TestId.of(12);
+
+        expectLastCall();
+        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(2);
+
+        expect(indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class)))
+            .andThrow(new ElasticsearchException(""));
+
+        control.replay();
+        testee.deleteAll(session, mailbox);
+        control.verify();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index 2382399..05c7f6b 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -1301,10 +1301,21 @@ public class LuceneMessageSearchIndex<Id extends MailboxId> extends ListeningMes
             return NumericRangeQuery.newLongRange(UID_FIELD, 0L, Long.MAX_VALUE, true, true);
         }
     }
-    /**
-     * @see org.apache.james.mailbox.store.search.ListeningMessageSearchIndex#delete(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.model.MessageRange)
-     */
-    public void delete(MailboxSession session, Mailbox<Id> mailbox, MessageRange range) throws MailboxException {
+
+    @Override
+    public void delete(MailboxSession session, Mailbox<Id> mailbox, List<Long> expungedUids) throws MailboxException {
+        Collection<MessageRange> messageRanges = MessageRange.toRanges(expungedUids);
+        for (MessageRange messageRange : messageRanges) {
+            delete(mailbox, messageRange);
+        }
+    }
+
+    @Override
+    public void deleteAll(MailboxSession session, Mailbox<Id> mailbox) throws MailboxException {
+        delete(mailbox, MessageRange.all());
+    }
+
+    public void delete(Mailbox<Id> mailbox, MessageRange range) throws MailboxException {
         BooleanQuery query = new BooleanQuery();
         query.add(new TermQuery(new Term(MAILBOX_ID_FIELD, mailbox.getMailboxId().serialize())), BooleanClause.Occur.MUST);
         query.add(createQuery(range), BooleanClause.Occur.MUST);

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index 3f80259..f9e1bd8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -64,8 +64,13 @@ public class LazyMessageSearchIndex<Id extends MailboxId> extends ListeningMessa
     }
 
     @Override
-    public void delete(MailboxSession session, Mailbox<Id> mailbox, MessageRange range) throws MailboxException {
-        index.delete(session, mailbox, range);
+    public void delete(MailboxSession session, Mailbox<Id> mailbox, List<Long> expungedUids) throws MailboxException {
+        index.delete(session, mailbox, expungedUids);
+    }
+
+    @Override
+    public void deleteAll(MailboxSession session, Mailbox<Id> mailbox) throws MailboxException {
+        index.deleteAll(session, mailbox);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index b894319..52541bf 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -92,15 +92,10 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                     }
                 } else if (event instanceof EventFactory.ExpungedImpl) {
                     EventFactory.ExpungedImpl expunged = (EventFactory.ExpungedImpl) event;
-                    final Mailbox<Id> mailbox = expunged.getMailbox();
-                    List<Long> uids = expunged.getUids();
-                    List<MessageRange> ranges = MessageRange.toRanges(uids);
-                    for (MessageRange range : ranges) {
-                        try {
-                            delete(session, mailbox, range);
-                        } catch (MailboxException e) {
-                            session.getLog().debug("Unable to deleted range " + range.toString() + " from index for mailbox " + mailbox, e);
-                        }
+                    try {
+                        delete(session, expunged.getMailbox(), expunged.getUids());
+                    } catch (MailboxException e) {
+                        session.getLog().debug("Unable to deleted messages " + expunged.getUids() + " from index for mailbox " + expunged.getMailbox(), e);
                     }
                 } else if (event instanceof EventFactory.FlagsUpdatedImpl) {
                     EventFactory.FlagsUpdatedImpl flagsUpdated = (EventFactory.FlagsUpdatedImpl) event;
@@ -113,8 +108,7 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                     }
                 }
             } else if (event instanceof EventFactory.MailboxDeletionImpl) {
-                // delete all indexed messages for the mailbox
-                delete(session, ((EventFactory.MailboxDeletionImpl) event).getMailbox(), MessageRange.all());
+                deleteAll(session, ((EventFactory.MailboxDeletionImpl) event).getMailbox());
             }
         } catch (MailboxException e) {
             session.getLog().debug("Unable to update index", e);
@@ -133,15 +127,23 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
     public abstract void add(MailboxSession session, Mailbox<Id> mailbox, MailboxMessage<Id> message) throws MailboxException;
 
     /**
-     * Delete the {@link MessageRange} for the given {@link Mailbox} from the index
+     * Delete the concerned UIDs for the given {@link Mailbox} from the index
      *
-     * @param session
-     * @param mailbox
-     * @param range
+     * @param session The mailbox session performing the expunge
+     * @param mailbox mailbox on which the expunge was performed
+     * @param expungedUids UIDS to be deleted
      * @throws MailboxException
      */
-    public abstract void delete(MailboxSession session, Mailbox<Id> mailbox, MessageRange range) throws MailboxException;
-    
+    public abstract void delete(MailboxSession session, Mailbox<Id> mailbox, List<Long> expungedUids) throws MailboxException;
+
+    /**
+     * Delete the messages contained in the given {@link Mailbox} from the index
+     *
+     * @param session The mailbox session performing the expunge
+     * @param mailbox mailbox on which the expunge was performed
+     * @throws MailboxException
+     */
+    public abstract void deleteAll(MailboxSession session, Mailbox<Id> mailbox) throws MailboxException;
     
     /**
      * Update the messages concerned by the updated flags list for the given {@link Mailbox}

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java b/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
index 3fddf76..7efd7d5 100644
--- a/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
+++ b/mailbox/tool/src/main/java/org/apache/james/mailbox/indexer/ReIndexerImpl.java
@@ -97,7 +97,7 @@ public class ReIndexerImpl<Id extends MailboxId> implements ReIndexer {
         MailboxRegistration mailboxRegistration = new MailboxRegistration(path);
         LOGGER.info("Intend to reindex {}",path);
         Mailbox<Id> mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxByPath(path);
-        messageSearchIndex.delete(mailboxSession, mailbox, MessageRange.all());
+        messageSearchIndex.deleteAll(mailboxSession, mailbox);
         mailboxManager.addListener(path, mailboxRegistration, mailboxSession);
         try {
             handleMailboxIndexingIterations(mailboxSession,

http://git-wip-us.apache.org/repos/asf/james-project/blob/aea76c8d/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/ReIndexerImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/ReIndexerImplTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/ReIndexerImplTest.java
index 70cb3f5..6e09361 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/ReIndexerImplTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/indexer/ReIndexerImplTest.java
@@ -117,7 +117,7 @@ public class ReIndexerImplTest {
         verify(mailboxManager).addListener(eq(INBOX), any(MailboxListener.class), any(MailboxSession.class));
         verify(mailboxManager).removeListener(eq(INBOX), any(MailboxListener.class), any(MailboxSession.class));
         verify(messageSearchIndex).add(any(MailboxSession.class), eq(mailbox), eq(message));
-        verify(messageSearchIndex).delete(any(MailboxSession.class), eq(mailbox), eq(MessageRange.all()));
+        verify(messageSearchIndex).deleteAll(any(MailboxSession.class), eq(mailbox));
         verifyNoMoreInteractions(mailboxMapper, mailboxSessionMapperFactory, messageSearchIndex, messageMapper, mailboxMapper);
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[14/18] james-project git commit: MAILBOX-266 ElasticSearch response sources should be limited to UIDs

Posted by bt...@apache.org.
MAILBOX-266 ElasticSearch response sources should be limited to UIDs


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f9717d22
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f9717d22
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f9717d22

Branch: refs/heads/master
Commit: f9717d22082e4e70f016fe4acb27ba78003dca33
Parents: 2730305
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 15:19:47 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../james/mailbox/elasticsearch/search/ElasticSearchSearcher.java   | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f9717d22/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index ab4698e..b5e1792 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -79,6 +79,7 @@ public class ElasticSearchSearcher<Id extends MailboxId> {
                 client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
                     .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
                     .setScroll(TIMEOUT)
+                    .setFetchSource(JsonMessageConstants.ID, "")
                     .setQuery(queryConverter.from(searchQuery, mailbox.getMailboxId().serialize()))
                     .setSize(size),
                 (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)),


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[04/18] james-project git commit: MAILBOX-266 Update to ElasticSearch 2.2.1

Posted by bt...@apache.org.
MAILBOX-266 Update to ElasticSearch 2.2.1


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a032429d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a032429d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a032429d

Branch: refs/heads/master
Commit: a032429df170619c259528a2d91b7751d7d1b0f2
Parents: 6788206
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Mar 24 18:07:18 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:44 2016 +0700

----------------------------------------------------------------------
 README.txt                                      |   2 +-
 mailbox/elasticsearch/pom.xml                   |  10 +-
 .../elasticsearch/ClientProviderImpl.java       |  16 +-
 .../elasticsearch/ElasticSearchIndexer.java     |  16 +-
 .../elasticsearch/IndexCreationFactory.java     |  36 +--
 .../elasticsearch/query/CriterionConverter.java | 204 +++++++-------
 .../query/FilteredQueryCollector.java           |  37 ---
 .../query/FilteredQueryRepresentation.java      | 150 ----------
 .../elasticsearch/query/QueryConverter.java     |  41 +--
 .../elasticsearch/ElasticSearchIndexerTest.java |  14 +-
 .../ElasticSearchIntegrationTest.java           |   8 +-
 .../elasticsearch/EmbeddedElasticSearch.java    |  38 ++-
 .../query/FilteredQueryCollectorTest.java       | 243 ----------------
 .../elasticsearch/query/QueryConverterTest.java | 281 -------------------
 mpt/impl/imap-mailbox/elasticsearch/pom.xml     |  11 -
 .../host/ElasticSearchHostSystem.java           |  50 ++--
 .../host/PublicTemporaryFolder.java             |  35 +++
 .../apache/james/mpt/smtp/SmtpTestModule.java   |   2 +-
 .../apache/james/CassandraJamesServerTest.java  |   2 +-
 .../james/JamesCapabilitiesServerTest.java      |   2 +-
 .../CassandraGetMailboxesMethodTest.java        |   2 +-
 .../CassandraGetMessageListMethodTest.java      |   2 +-
 .../CassandraGetMessagesMethodTest.java         |   2 +-
 .../CassandraJmapAuthenticationTest.java        |   2 +-
 .../CassandraSetMailboxesMethodTest.java        |   2 +-
 .../CassandraSetMessagesMethodTest.java         |   2 +-
 26 files changed, 270 insertions(+), 940 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/README.txt
----------------------------------------------------------------------
diff --git a/README.txt b/README.txt
index a29b6ad..43c7c58 100644
--- a/README.txt
+++ b/README.txt
@@ -115,7 +115,7 @@ $ docker run -d --name=cassandra cassandra:2.2.3
 
 You need a running **ElasticSearch** in docker. To achieve this run :
 ```bash
-$ docker run -d --name=elasticsearch elasticsearch:1.5.2
+$ docker run -d --name=elasticsearch elasticsearch:2.2.1
 ```
 
 We need to provide the key we will use for TLS. For obvious reasons, this is not provided in this git.

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/pom.xml b/mailbox/elasticsearch/pom.xml
index 99adadc..39a6c28 100644
--- a/mailbox/elasticsearch/pom.xml
+++ b/mailbox/elasticsearch/pom.xml
@@ -224,12 +224,6 @@
                     <scope>test</scope>
                 </dependency>
                 <dependency>
-                    <groupId>org.apache.lucene</groupId>
-                    <artifactId>lucene-core</artifactId>
-                    <version>4.10.4</version>
-                    <scope>test</scope>
-                </dependency>
-                <dependency>
                     <groupId>org.assertj</groupId>
                     <artifactId>assertj-core</artifactId>
                     <version>${assertj-3.version}</version>
@@ -244,12 +238,12 @@
                 <dependency>
                     <groupId>org.elasticsearch</groupId>
                     <artifactId>elasticsearch</artifactId>
-                    <version>1.5.2</version>
+                    <version>2.2.1</version>
                 </dependency>
                 <dependency>
                     <groupId>org.elasticsearch</groupId>
                     <artifactId>elasticsearch</artifactId>
-                    <version>1.5.2</version>
+                    <version>2.2.1</version>
                     <scope>test</scope>
                     <type>test-jar</type>
                 </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ClientProviderImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ClientProviderImpl.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ClientProviderImpl.java
index 5c159ec..3e088af 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ClientProviderImpl.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ClientProviderImpl.java
@@ -18,10 +18,15 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
 import org.elasticsearch.client.Client;
 import org.elasticsearch.client.transport.TransportClient;
 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 
+import com.google.common.base.Throwables;
+
 public class ClientProviderImpl implements ClientProvider {
 
     private final String host;
@@ -31,10 +36,13 @@ public class ClientProviderImpl implements ClientProvider {
         this.host = host;
         this.port = port;
     }
-    
-    @SuppressWarnings("resource")
+
     public Client get() {
-        return new TransportClient()
-            .addTransportAddress(new InetSocketTransportAddress(host, port));
+        try {
+            return TransportClient.builder().build()
+                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
+        } catch (UnknownHostException e) {
+            throw Throwables.propagate(e);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 6317fdc..630abb6 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -18,17 +18,16 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch;
 
+import javax.inject.Inject;
+
+import org.apache.commons.lang.NotImplementedException;
 import org.elasticsearch.action.delete.DeleteResponse;
-import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
 import org.elasticsearch.action.index.IndexResponse;
 import org.elasticsearch.action.update.UpdateResponse;
 import org.elasticsearch.client.Client;
-import org.elasticsearch.index.query.QueryBuilders;
 
 import com.google.common.base.Preconditions;
 
-import javax.inject.Inject;
-
 public class ElasticSearchIndexer {
 
     public static final String MAILBOX_INDEX = "mailbox";
@@ -66,13 +65,8 @@ public class ElasticSearchIndexer {
         }
     }
     
-    public DeleteByQueryResponse deleteAllWithIdStarting(String idStart) {
-        try (Client client = clientProvider.get()) {
-            return client.prepareDeleteByQuery(MAILBOX_INDEX)
-                .setTypes(MESSAGE_TYPE)
-                .setQuery(QueryBuilders.prefixQuery("_id", idStart))
-                .get();
-        }
+    public void deleteAllWithIdStarting(String idStart) {
+        throw new NotImplementedException();
     }
 
     private void checkArgument(String content) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
index 176bbf1..fdbfeac 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
@@ -19,25 +19,24 @@
 
 package org.apache.james.mailbox.elasticsearch;
 
-import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
-
 import java.io.IOException;
+import java.util.Optional;
 
 import org.elasticsearch.client.Client;
-import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.indices.IndexAlreadyExistsException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Optional;
-
 public class IndexCreationFactory {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreationFactory.class);
+    private static final int DEFAULT_NB_SHARDS = 1;
+    private static final int DEFAULT_NB_REPLICA = 0;
 
     public static ClientProvider createIndex(ClientProvider clientProvider, int nbShards, int nbReplica) {
         try {
-            return createIndex(clientProvider, normalSettings(nbShards, nbReplica));
+            return createIndex(clientProvider, generateSetting(nbShards, nbReplica));
         } catch (IOException e) {
             LOGGER.error("Error while creating index : ", e);
             return clientProvider;
@@ -46,14 +45,14 @@ public class IndexCreationFactory {
 
     public static ClientProvider createIndex(ClientProvider clientProvider) {
         try {
-            return createIndex(clientProvider, settingForInMemory());
+            return createIndex(clientProvider, generateSetting(DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA));
         } catch (IOException e) {
             LOGGER.error("Error while creating index : ", e);
             return clientProvider;
         }
     }
 
-    private static ClientProvider createIndex(ClientProvider clientProvider, XContentBuilder settings) {
+    private static ClientProvider createIndex(ClientProvider clientProvider, Settings settings) {
         try {
             try (Client client = clientProvider.get()) {
                 client.admin()
@@ -69,22 +68,11 @@ public class IndexCreationFactory {
         return clientProvider;
     }
 
-    public static XContentBuilder settingForInMemory() throws IOException {
-        return generateSetting(1, 0, Optional.of(jsonBuilder().startObject().field("type", "memory").endObject()));
-    }
-
-    public static XContentBuilder normalSettings(int nbShards, int nbReplica) throws IOException{
-        return generateSetting(nbShards, nbReplica, Optional.empty());
-    }
-
-    private static XContentBuilder generateSetting(int nbShards, int nbReplica, Optional<XContentBuilder> store) throws IOException {
-        XContentBuilder contentBuilder = jsonBuilder().startObject()
-            .field("number_of_shards", nbShards)
-            .field("number_of_replicas", nbReplica);
-        if (store.isPresent()) {
-            contentBuilder.field("store", store.get());
-        }
-        return contentBuilder.endObject();
+    private static Settings generateSetting(int nbShards, int nbReplica) throws IOException {
+        return Settings.builder()
+            .put("number_of_shards", nbShards)
+            .put("number_of_replicas", nbReplica)
+            .build();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
index 2cd399f..935c683 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
@@ -19,32 +19,38 @@
 
 package org.apache.james.mailbox.elasticsearch.query;
 
-import org.apache.james.mailbox.elasticsearch.json.HeaderCollection;
-import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
-import org.apache.james.mailbox.model.SearchQuery;
-import org.apache.james.mailbox.model.SearchQuery.Criterion;
-import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
-
-import javax.mail.Flags;
+import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
+import static org.elasticsearch.index.query.QueryBuilders.existsQuery;
+import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
+import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
+import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
+import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
+import static org.elasticsearch.index.query.QueryBuilders.termQuery;
+import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
 
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
 
-import static org.elasticsearch.index.query.FilterBuilders.existsFilter;
-import static org.elasticsearch.index.query.FilterBuilders.rangeFilter;
-import static org.elasticsearch.index.query.FilterBuilders.termFilter;
-import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
-import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
+import javax.mail.Flags;
+
+import org.apache.james.mailbox.elasticsearch.json.HeaderCollection;
+import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
+import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.SearchQuery.Criterion;
+import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
 
 public class CriterionConverter {
 
-    private final Map<Class<?>, Function<SearchQuery.Criterion, FilteredQueryRepresentation>> criterionConverterMap;
-    private final Map<Class<?>, BiFunction<String, SearchQuery.HeaderOperator, FilteredQueryRepresentation>> headerOperatorConverterMap;
+    private final Map<Class<?>, Function<SearchQuery.Criterion, QueryBuilder>> criterionConverterMap;
+    private final Map<Class<?>, BiFunction<String, SearchQuery.HeaderOperator, QueryBuilder>> headerOperatorConverterMap;
 
     public CriterionConverter() {
         criterionConverterMap = new HashMap<>();
@@ -58,40 +64,36 @@ public class CriterionConverter {
         registerCriterionConverter(SearchQuery.FlagCriterion.class, this::convertFlag);
         registerCriterionConverter(SearchQuery.UidCriterion.class, this::convertUid);
         registerCriterionConverter(SearchQuery.ConjunctionCriterion.class, this::convertConjunction);
-        registerCriterionConverter(SearchQuery.InternalDateCriterion.class, this::convertInternalDate);
         registerCriterionConverter(SearchQuery.HeaderCriterion.class, this::convertHeader);
         registerCriterionConverter(SearchQuery.TextCriterion.class, this::convertTextCriterion);
         
-        registerCriterionConverter(
-            SearchQuery.AllCriterion.class, 
-            criterion -> FilteredQueryRepresentation.fromQuery(matchAllQuery()));
+        registerCriterionConverter(SearchQuery.AllCriterion.class,
+            criterion -> matchAllQuery());
         
-        registerCriterionConverter(
-            SearchQuery.ModSeqCriterion.class,
+        registerCriterionConverter(SearchQuery.ModSeqCriterion.class,
             criterion -> createNumericFilter(JsonMessageConstants.MODSEQ, criterion.getOperator()));
         
-        registerCriterionConverter(
-            SearchQuery.SizeCriterion.class,
+        registerCriterionConverter(SearchQuery.SizeCriterion.class,
             criterion -> createNumericFilter(JsonMessageConstants.SIZE, criterion.getOperator()));
         
-        registerCriterionConverter(
-            SearchQuery.CustomFlagCriterion.class,
-            criterion -> FilteredQueryRepresentation.fromFilter(
-                    termFilter(JsonMessageConstants.USER_FLAGS, criterion.getFlag())));
+        registerCriterionConverter(SearchQuery.CustomFlagCriterion.class,
+            criterion -> termsQuery(JsonMessageConstants.USER_FLAGS, criterion.getFlag()));
+
+        registerCriterionConverter(SearchQuery.InternalDateCriterion.class,
+            criterion -> dateRangeFilter(JsonMessageConstants.DATE, criterion.getOperator()));
     }
     
     @SuppressWarnings("unchecked")
-    private <T extends Criterion> void registerCriterionConverter(Class<T> type, Function<T, FilteredQueryRepresentation> f) {
-        criterionConverterMap.put(type, (Function<Criterion, FilteredQueryRepresentation>) f);
+    private <T extends Criterion> void registerCriterionConverter(Class<T> type, Function<T, QueryBuilder> f) {
+        criterionConverterMap.put(type, (Function<Criterion, QueryBuilder>) f);
     }
     
     private void registerHeaderOperatorConverters() {
 
         registerHeaderOperatorConverter(
             SearchQuery.ExistsOperator.class,
-            (headerName, operator) -> FilteredQueryRepresentation.fromFilter(
-                existsFilter(JsonMessageConstants.HEADERS + "." + headerName))
-        );
+            (headerName, operator) ->
+                existsQuery(JsonMessageConstants.HEADERS + "." + headerName));
         
         registerHeaderOperatorConverter(
             SearchQuery.AddressOperator.class,
@@ -103,126 +105,135 @@ public class CriterionConverter {
         
         registerHeaderOperatorConverter(
             SearchQuery.ContainsOperator.class,
-            (headerName, operator) -> FilteredQueryRepresentation.fromQuery(
-                matchQuery(JsonMessageConstants.HEADERS + "." + headerName,
-                    operator.getValue())));
+            (headerName, operator) -> matchQuery(JsonMessageConstants.HEADERS + "." + headerName,
+                    operator.getValue()));
     }
 
     @SuppressWarnings("unchecked")
-    private <T extends HeaderOperator> void registerHeaderOperatorConverter(Class<T> type, BiFunction<String, T, FilteredQueryRepresentation> f) {
-        headerOperatorConverterMap.put(type, (BiFunction<String, HeaderOperator, FilteredQueryRepresentation>) f);
+    private <T extends HeaderOperator> void registerHeaderOperatorConverter(Class<T> type, BiFunction<String, T, QueryBuilder> f) {
+        headerOperatorConverterMap.put(type, (BiFunction<String, HeaderOperator, QueryBuilder>) f);
     }
 
-    public FilteredQueryRepresentation convertCriterion(SearchQuery.Criterion criterion) {
+    public QueryBuilder convertCriterion(SearchQuery.Criterion criterion) {
         return criterionConverterMap.get(criterion.getClass()).apply(criterion);
     }
 
 
-    private FilteredQueryRepresentation convertTextCriterion(SearchQuery.TextCriterion textCriterion) {
+    private QueryBuilder convertTextCriterion(SearchQuery.TextCriterion textCriterion) {
         switch (textCriterion.getType()) {
         case BODY:
-            return FilteredQueryRepresentation.fromQuery(
-                matchQuery(JsonMessageConstants.TEXT_BODY, textCriterion.getOperator().getValue()));
+            return matchQuery(JsonMessageConstants.TEXT_BODY, textCriterion.getOperator().getValue());
         case FULL:
-            return FilteredQueryRepresentation.fromQuery(
-                boolQuery()
+            return boolQuery()
                     .should(matchQuery(JsonMessageConstants.TEXT_BODY, textCriterion.getOperator().getValue()))
                     .should(matchQuery(JsonMessageConstants.ATTACHMENTS + "." + JsonMessageConstants.Attachment.TEXT_CONTENT,
-                        textCriterion.getOperator().getValue())));
+                        textCriterion.getOperator().getValue()));
         }
         throw new RuntimeException("Unknown SCOPE for text criterion");
     }
 
-    private FilteredQueryRepresentation convertInternalDate(SearchQuery.InternalDateCriterion dateCriterion) {
-        SearchQuery.DateOperator dateOperator = dateCriterion.getOperator();
-        return dateRangeFilter(JsonMessageConstants.DATE, dateOperator);
+    private QueryBuilder dateRangeFilter(String field, SearchQuery.DateOperator dateOperator) {
+        return boolQuery().filter(
+            convertDateOperator(field,
+                dateOperator.getType(),
+                DateResolutionFormater.DATE_TIME_FOMATTER.format(
+                    DateResolutionFormater.computeLowerDate(
+                        DateResolutionFormater.convertDateToZonedDateTime(dateOperator.getDate()),
+                        dateOperator.getDateResultion())),
+                DateResolutionFormater.DATE_TIME_FOMATTER.format(
+                    DateResolutionFormater.computeUpperDate(
+                        DateResolutionFormater.convertDateToZonedDateTime(dateOperator.getDate()),
+                        dateOperator.getDateResultion()))));
     }
 
-    private FilteredQueryRepresentation dateRangeFilter(String field, SearchQuery.DateOperator dateOperator) {
-        SearchQuery.DateResolution dateResolution = dateOperator.getDateResultion();
-        String lowDateString = DateResolutionFormater.DATE_TIME_FOMATTER.format(DateResolutionFormater.computeLowerDate(DateResolutionFormater.convertDateToZonedDateTime(dateOperator.getDate()), dateResolution));
-        String upDateString = DateResolutionFormater.DATE_TIME_FOMATTER.format(
-            DateResolutionFormater.computeUpperDate(
-                DateResolutionFormater.convertDateToZonedDateTime(dateOperator.getDate()),
-                dateResolution));
-        return convertDateOperatorToFiteredQuery(field, dateOperator, lowDateString, upDateString);
+    private BoolQueryBuilder convertConjunction(SearchQuery.ConjunctionCriterion criterion) {
+        return convertToBoolQuery(criterion.getCriteria().stream().map(this::convertCriterion),
+            convertConjunctionType(criterion.getType()));
+    }
+
+    private BiFunction<BoolQueryBuilder, QueryBuilder, BoolQueryBuilder> convertConjunctionType(SearchQuery.Conjunction type) {
+        switch (type) {
+            case AND:
+                return BoolQueryBuilder::must;
+            case OR:
+                return BoolQueryBuilder::should;
+            case NOR:
+                return BoolQueryBuilder::mustNot;
+            default:
+                throw new RuntimeException("Unexpected conjunction criteria " + type);
+        }
     }
 
-    private FilteredQueryRepresentation convertConjunction(SearchQuery.ConjunctionCriterion criterion) {
-        return criterion.getCriteria().stream()
-            .map(this::convertCriterion)
-            .collect(FilteredQueryCollector.collector(criterion.getType()));
+    private BoolQueryBuilder convertToBoolQuery(Stream<QueryBuilder> stream, BiFunction<BoolQueryBuilder, QueryBuilder, BoolQueryBuilder> addCriterionToBoolQuery) {
+        return stream.collect(Collector.of(QueryBuilders::boolQuery,
+                addCriterionToBoolQuery::apply,
+                addCriterionToBoolQuery::apply));
     }
 
-    private FilteredQueryRepresentation convertFlag(SearchQuery.FlagCriterion flagCriterion) {
+    private QueryBuilder convertFlag(SearchQuery.FlagCriterion flagCriterion) {
         SearchQuery.BooleanOperator operator = flagCriterion.getOperator();
         Flags.Flag flag = flagCriterion.getFlag();
         if (flag.equals(Flags.Flag.DELETED) ) {
-            return FilteredQueryRepresentation.fromFilter(termFilter(JsonMessageConstants.IS_DELETED, operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_DELETED, operator.isSet()));
         }
         if (flag.equals(Flags.Flag.ANSWERED) ) {
-            return FilteredQueryRepresentation.fromFilter(
-                termFilter(JsonMessageConstants.IS_ANSWERED, operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_ANSWERED, operator.isSet()));
         }
         if (flag.equals(Flags.Flag.DRAFT) ) {
-            return FilteredQueryRepresentation.fromFilter(
-                termFilter(JsonMessageConstants.IS_DRAFT, operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_DRAFT, operator.isSet()));
         }
         if (flag.equals(Flags.Flag.SEEN) ) {
-            return FilteredQueryRepresentation.fromFilter(
-                termFilter(JsonMessageConstants.IS_UNREAD, !operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_UNREAD, !operator.isSet()));
         }
         if (flag.equals(Flags.Flag.RECENT) ) {
-            return FilteredQueryRepresentation.fromFilter(
-                termFilter(JsonMessageConstants.IS_RECENT, operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_RECENT, operator.isSet()));
         }
         if (flag.equals(Flags.Flag.FLAGGED) ) {
-            return FilteredQueryRepresentation.fromFilter(
-                termFilter(JsonMessageConstants.IS_FLAGGED, operator.isSet()));
+            return boolQuery().filter(termQuery(JsonMessageConstants.IS_FLAGGED, operator.isSet()));
         }
         throw new RuntimeException("Unknown flag used in Flag search criterion");
     }
 
-    private FilteredQueryRepresentation createNumericFilter(String fieldName, SearchQuery.NumericOperator operator) {
+    private QueryBuilder createNumericFilter(String fieldName, SearchQuery.NumericOperator operator) {
         switch (operator.getType()) {
         case EQUALS:
-            return FilteredQueryRepresentation.fromFilter(
-                rangeFilter(fieldName).gte(operator.getValue()).lte(operator.getValue()));
+            return boolQuery().filter(rangeQuery(fieldName).gte(operator.getValue()).lte(operator.getValue()));
         case GREATER_THAN:
-            return FilteredQueryRepresentation.fromFilter(rangeFilter(fieldName).gte(operator.getValue()));
+            return boolQuery().filter(rangeQuery(fieldName).gte(operator.getValue()));
         case LESS_THAN:
-            return FilteredQueryRepresentation.fromFilter(rangeFilter(fieldName).lte(operator.getValue()));
+            return boolQuery().filter(rangeQuery(fieldName).lte(operator.getValue()));
         default:
             throw new RuntimeException("A non existing numeric operator was triggered");
         }
     }
 
-    private FilteredQueryRepresentation convertUid(SearchQuery.UidCriterion uidCriterion) {
+    private BoolQueryBuilder convertUid(SearchQuery.UidCriterion uidCriterion) {
         if (uidCriterion.getOperator().getRange().length == 0) {
-            return FilteredQueryRepresentation.empty();
+            return boolQuery();
         }
-        return Arrays.stream(uidCriterion.getOperator().getRange())
-            .map(this::uidRangeFilter)
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
+        return boolQuery().filter(
+            convertToBoolQuery(
+                Arrays.stream(uidCriterion.getOperator().getRange())
+                    .map(this::uidRangeFilter), BoolQueryBuilder::should));
     }
 
-    private FilteredQueryRepresentation uidRangeFilter(SearchQuery.NumericRange numericRange) {
-        return FilteredQueryRepresentation.fromFilter(
-            rangeFilter(JsonMessageConstants.ID)
+    private QueryBuilder uidRangeFilter(SearchQuery.NumericRange numericRange) {
+        return rangeQuery(JsonMessageConstants.ID)
                 .lte(numericRange.getHighValue())
-                .gte(numericRange.getLowValue()));
+                .gte(numericRange.getLowValue());
     }
 
-    private FilteredQueryRepresentation convertHeader(SearchQuery.HeaderCriterion headerCriterion) {
+    private QueryBuilder convertHeader(SearchQuery.HeaderCriterion headerCriterion) {
         return headerOperatorConverterMap.get(headerCriterion.getOperator().getClass())
             .apply(
                 headerCriterion.getHeaderName().toLowerCase(),
                 headerCriterion.getOperator());
     }
 
-    private FilteredQueryRepresentation manageAddressFields(String headerName, String value) {
-        return FilteredQueryRepresentation.fromQuery(
-            nestedQuery(getFieldNameFromHeaderName(headerName), boolQuery().should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.NAME, value)).should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS, value))));
+    private QueryBuilder manageAddressFields(String headerName, String value) {
+        return nestedQuery(getFieldNameFromHeaderName(headerName), boolQuery()
+            .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.NAME, value))
+            .should(matchQuery(getFieldNameFromHeaderName(headerName) + "." + JsonMessageConstants.EMailer.ADDRESS, value)));
     }
 
     private String getFieldNameFromHeaderName(String headerName) {
@@ -239,17 +250,14 @@ public class CriterionConverter {
         throw new RuntimeException("Header not recognized as Addess Header : " + headerName);
     }
 
-    private FilteredQueryRepresentation convertDateOperatorToFiteredQuery(String field, SearchQuery.DateOperator dateOperator, String lowDateString, String upDateString) {
-        switch (dateOperator.getType()) {
+    private QueryBuilder convertDateOperator(String field, SearchQuery.DateComparator dateComparator, String lowDateString, String upDateString) {
+        switch (dateComparator) {
         case BEFORE:
-            return FilteredQueryRepresentation.fromFilter(
-                rangeFilter(field).lte(upDateString));
+            return rangeQuery(field).lte(upDateString);
         case AFTER:
-            return FilteredQueryRepresentation.fromFilter(
-                rangeFilter(field).gte(lowDateString));
+            return rangeQuery(field).gte(lowDateString);
         case ON:
-            return FilteredQueryRepresentation.fromFilter(
-                rangeFilter(field).lte(upDateString).gte(lowDateString));
+            return rangeQuery(field).lte(upDateString).gte(lowDateString);
         }
         throw new RuntimeException("Unknown date operator");
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollector.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollector.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollector.java
deleted file mode 100644
index eefe1d0..0000000
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollector.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.elasticsearch.query;
-
-import java.util.stream.Collector;
-import java.util.stream.Collectors;
-
-import org.apache.james.mailbox.model.SearchQuery;
-
-public class FilteredQueryCollector {
-
-    public static Collector<FilteredQueryRepresentation, ?, FilteredQueryRepresentation> 
-        collector(SearchQuery.Conjunction type) {
-        
-        return Collectors.reducing(
-                FilteredQueryRepresentation.empty(),
-                (x, y) -> x.combine(type, y));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryRepresentation.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryRepresentation.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryRepresentation.java
deleted file mode 100644
index 4eded8f..0000000
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryRepresentation.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.elasticsearch.query;
-
-import java.util.Optional;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-
-import org.apache.james.mailbox.model.SearchQuery;
-import org.elasticsearch.index.query.BoolFilterBuilder;
-import org.elasticsearch.index.query.BoolQueryBuilder;
-import org.elasticsearch.index.query.FilterBuilder;
-import org.elasticsearch.index.query.FilterBuilders;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.elasticsearch.index.query.QueryBuilders;
-
-public  class FilteredQueryRepresentation {
-
-    public static FilteredQueryRepresentation fromQuery(QueryBuilder query) {
-        return new FilteredQueryRepresentation(Optional.of(query), Optional.empty());
-    }
-
-    public static FilteredQueryRepresentation fromFilter(FilterBuilder filter) {
-        return new FilteredQueryRepresentation(Optional.empty(), Optional.of(filter));
-    }
-
-    public static FilteredQueryRepresentation empty() {
-        return new FilteredQueryRepresentation(Optional.empty(), Optional.empty());
-    }
-
-    private final Optional<FilterBuilder> filter;
-    private final Optional<QueryBuilder> query;
-
-    private FilteredQueryRepresentation(Optional<QueryBuilder> query, Optional<FilterBuilder> filter) {
-        this.query = query;
-        this.filter = filter;
-    }
-
-    public Optional<FilterBuilder> getFilter() {
-        return filter;
-    }
-
-    public Optional<QueryBuilder> getQuery() {
-        return query;
-    }
-
-    public FilteredQueryRepresentation combine(SearchQuery.Conjunction type, FilteredQueryRepresentation collected) {
-        switch (type) {
-        case OR:
-            return applyOr(collected);
-        case AND:
-            return applyAnd(collected);
-        case NOR:
-            return new FilteredQueryRepresentation(
-                applyNorOnQuery(collected),
-                applyNorOnFilter(collected));
-        }
-        return this;
-    }
-    
-    private FilteredQueryRepresentation applyAnd(FilteredQueryRepresentation collected) {
-        return new FilteredQueryRepresentation(
-                applyOnQuery(
-                    (x, y) -> x.must(y),
-                    collected.getQuery(),
-                    (x) -> QueryBuilders.boolQuery().must(x)),
-                applyOnFilter(
-                    (x, y) -> x.must(y),
-                    collected.getFilter(),
-                    (x) -> FilterBuilders.boolFilter().must(x)));
-    }
-
-    private FilteredQueryRepresentation applyOr(FilteredQueryRepresentation collected) {
-        return new FilteredQueryRepresentation(
-            applyOnQuery(
-                (x, y) -> x.should(y),
-                collected.getQuery(),
-                (x) -> QueryBuilders.boolQuery().should(x)),
-            applyOnFilter(
-                (x, y) -> x.should(y),
-                collected.getFilter(),
-                (x) -> FilterBuilders.boolFilter().should(x)));
-    }
-
-    private Optional<QueryBuilder> applyOnQuery(BiFunction<BoolQueryBuilder, QueryBuilder, QueryBuilder> function, Optional<QueryBuilder> input, Function<QueryBuilder, BoolQueryBuilder> s) {
-        return genericApply(ensureBoolQuery(function, s), query, input);
-    }
-
-    private BiFunction<QueryBuilder, QueryBuilder, QueryBuilder> 
-        ensureBoolQuery(BiFunction<BoolQueryBuilder, QueryBuilder, QueryBuilder> f, Function<QueryBuilder, BoolQueryBuilder> s) {
-        return (x, y) -> f.apply(s.apply(x), y);
-    }
-    
-    private Optional<FilterBuilder> applyOnFilter(BiFunction<BoolFilterBuilder, FilterBuilder, FilterBuilder> function, Optional<FilterBuilder> input, Function<FilterBuilder, BoolFilterBuilder> s) {
-        return genericApply(ensureBoolFilter(function, s), filter, input);
-    }
-
-    private BiFunction<FilterBuilder, FilterBuilder, FilterBuilder> 
-        ensureBoolFilter(BiFunction<BoolFilterBuilder, FilterBuilder, FilterBuilder> f, Function<FilterBuilder, BoolFilterBuilder> s) {
-        return (x, y) -> f.apply(s.apply(x), y);
-    }
-    
-    private <T> Optional<T> genericApply(BiFunction<T, T, T> function, Optional<T> lhs, Optional<T> rhs) {
-        if (rhs.isPresent()) {
-            if (lhs.isPresent()) {
-                return Optional.of(function.apply(rhs.get(), lhs.get()));
-            } else {
-                return rhs;
-            }
-        } else {
-            return lhs;
-        }
-    }
-
-    private Optional<FilterBuilder> applyNorOnFilter(FilteredQueryRepresentation collected) {
-        // The cast is necessary for determining types ( in other cases : Optional<BoolFilterBuilder> is incompatible with Optional<FilterBuilder>
-        return collected.getFilter().map(
-            (collectedFilter) -> filter.map(
-                (innerFilter) -> Optional.of((FilterBuilder) FilterBuilders.boolFilter().must(innerFilter).mustNot(collectedFilter)))
-                    .orElse(Optional.of(FilterBuilders.boolFilter().mustNot(collectedFilter)))
-        ).orElse(filter);
-    }
-
-    private Optional<QueryBuilder> applyNorOnQuery(FilteredQueryRepresentation collected) {
-        // The cast is necessary for determining types ( in other cases : Optional<BoolQueryBuilder> is incompatible with Optional<QueryBuilder>
-        return collected.getQuery().map(
-            (collectedQuery) -> query.map(
-                (innerQuery) -> Optional.of((QueryBuilder)QueryBuilders.boolQuery().must(innerQuery).mustNot(collected.getQuery().get())))
-                    .orElse(Optional.of(QueryBuilders.boolQuery().mustNot(collectedQuery)))
-        ).orElse(query);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
index 4ea0b5e..b0a5346 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/QueryConverter.java
@@ -19,21 +19,19 @@
 
 package org.apache.james.mailbox.elasticsearch.query;
 
-import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
-import org.apache.james.mailbox.model.SearchQuery;
-import org.elasticsearch.common.lang3.tuple.Pair;
-import org.elasticsearch.index.query.QueryBuilder;
+import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
+import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
-import javax.inject.Inject;
 import java.util.List;
-import java.util.function.Function;
 import java.util.stream.Stream;
 
-import static org.elasticsearch.index.query.FilterBuilders.termFilter;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-import static org.elasticsearch.index.query.QueryBuilders.filteredQuery;
+import javax.inject.Inject;
+
+import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
+import org.apache.james.mailbox.model.SearchQuery;
+import org.elasticsearch.index.query.QueryBuilder;
 
-public class QueryConverter implements Function<Pair<SearchQuery, String>, QueryBuilder> {
+public class QueryConverter {
 
 
     private final CriterionConverter criterionConverter;
@@ -43,20 +41,14 @@ public class QueryConverter implements Function<Pair<SearchQuery, String>, Query
         this.criterionConverter = criterionConverter;
     }
 
-    @Override
-    public QueryBuilder apply(Pair<SearchQuery, String> pair) {
-        return from(pair.getLeft(), pair.getRight());
-    }
-
     public QueryBuilder from(SearchQuery searchQuery, String mailboxUUID) {
         return Stream.of(generateQueryBuilder(searchQuery))
             .map((rep) -> addMailboxFilters(rep, mailboxUUID))
-            .map(this::getFinalQuery)
             .findAny()
             .get();
     }
 
-    private FilteredQueryRepresentation generateQueryBuilder(SearchQuery searchQuery) {
+    private QueryBuilder generateQueryBuilder(SearchQuery searchQuery) {
         List<SearchQuery.Criterion> criteria = searchQuery.getCriterias();
         if (criteria.isEmpty()) {
             return criterionConverter.convertCriterion(SearchQuery.all());
@@ -67,18 +59,9 @@ public class QueryConverter implements Function<Pair<SearchQuery, String>, Query
         }
     }
 
-    private FilteredQueryRepresentation addMailboxFilters(FilteredQueryRepresentation elasticsearchQueryRepresentation, String mailboxUUID) {
-        return Stream.of(elasticsearchQueryRepresentation,
-            FilteredQueryRepresentation.fromFilter(termFilter(JsonMessageConstants.MAILBOX_ID, mailboxUUID)))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-    }
-
-    private QueryBuilder getFinalQuery(FilteredQueryRepresentation filteredQueryRepresentation) {
-        QueryBuilder query = filteredQueryRepresentation.getQuery().orElse(matchAllQuery());
-        if (!filteredQueryRepresentation.getFilter().isPresent()) {
-            return query;
-        }
-        return filteredQuery(query, filteredQueryRepresentation.getFilter().get());
+    private QueryBuilder addMailboxFilters(QueryBuilder queryBuilder, String mailboxUUID) {
+        return boolQuery().must(queryBuilder)
+            .filter(termQuery(JsonMessageConstants.MAILBOX_ID, mailboxUUID));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index b06305a..850494f 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -29,13 +29,19 @@ import org.elasticsearch.client.Client;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.node.Node;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
 
 public class ElasticSearchIndexerTest {
 
+    private TemporaryFolder temporaryFolder = new TemporaryFolder();
+    private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
+
     @Rule
-    public EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch();
+    public RuleChain ruleChain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
 
     private Node node;
     private ElasticSearchIndexer testee;
@@ -106,7 +112,8 @@ public class ElasticSearchIndexerTest {
 
         testee.updateMessage("1", null);
     }
-    
+
+    @Ignore
     @Test
     public void deleteAllWithIdStarting() throws Exception {
         String messageId = "1:2";
@@ -126,7 +133,8 @@ public class ElasticSearchIndexerTest {
             assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(0);
         }
     }
-    
+
+    @Ignore
     @Test
     public void deleteAllWithIdStartingWhenMultipleMessages() throws Exception {
         String messageId = "1:2";

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index e00713e..e27f5af 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -51,6 +51,8 @@ import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,8 +62,12 @@ public class ElasticSearchIntegrationTest {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchIntegrationTest.class);
 
+    private TemporaryFolder temporaryFolder = new TemporaryFolder();
+    private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
+
     @Rule
-    public EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch();
+    public RuleChain ruleChain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+
 
     private StoreMailboxManager<InMemoryId> storeMailboxManager;
     private ElasticSearchListeningMessageSearchIndex<InMemoryId> elasticSearchListeningMessageSearchIndex;

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/EmbeddedElasticSearch.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/EmbeddedElasticSearch.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/EmbeddedElasticSearch.java
index 7729304..4f199ef 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/EmbeddedElasticSearch.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/EmbeddedElasticSearch.java
@@ -23,31 +23,55 @@ import static com.jayway.awaitility.Awaitility.await;
 import static org.elasticsearch.node.NodeBuilder.nodeBuilder;
 
 import java.io.IOException;
+import java.nio.file.Path;
+import java.util.function.Supplier;
 
 import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
+import org.elasticsearch.action.admin.indices.flush.FlushAction;
 import org.elasticsearch.action.admin.indices.flush.FlushRequestBuilder;
 import org.elasticsearch.client.Client;
-import org.elasticsearch.common.settings.ImmutableSettings;
+import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.node.Node;
 import org.junit.rules.ExternalResource;
+import org.junit.rules.TemporaryFolder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Throwables;
 import com.jayway.awaitility.Duration;
 
 public class EmbeddedElasticSearch extends ExternalResource {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(EmbeddedElasticSearch.class);
 
+    private final Supplier<Path> folder;
     private Node node;
-    
+
+    private static Path createTempDir(TemporaryFolder temporaryFolder) {
+        try {
+            return temporaryFolder.newFolder().toPath();
+        } catch (IOException e) {
+            throw Throwables.propagate(e);
+        }
+    }
+
+    public EmbeddedElasticSearch(TemporaryFolder temporaryFolder) {
+        this(() -> EmbeddedElasticSearch.createTempDir(temporaryFolder));
+    }
+
+    public EmbeddedElasticSearch(Path folder) {
+        this(() -> folder);
+    }
+
+    private EmbeddedElasticSearch(Supplier<Path> folder) {
+        this.folder = folder;
+    }
+
     @Override
     public void before() throws IOException {
         node = nodeBuilder().local(true)
-            .settings(ImmutableSettings.builder()
-                .put("index.store.type", "memory")
-                .put("index.store.fs.memory.enabled", "true")
-                .put("script.disable_dynamic",true)
+            .settings(Settings.builder()
+                .put("path.home", folder.get().toAbsolutePath())
                 .build())
             .node();
         node.start();
@@ -82,7 +106,7 @@ public class EmbeddedElasticSearch extends ExternalResource {
 
     private boolean flush() {
         try (Client client = node.client()) {
-            new FlushRequestBuilder(client.admin().indices()).setForce(true).get();
+            new FlushRequestBuilder(client, FlushAction.INSTANCE).setForce(true).get();
             return true;
         } catch (Exception e) {
             return false;

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollectorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollectorTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollectorTest.java
deleted file mode 100644
index 9042442..0000000
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/FilteredQueryCollectorTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.elasticsearch.query;
-
-import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
-import static org.elasticsearch.index.query.FilterBuilders.termFilter;
-import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
-
-import com.google.common.collect.Lists;
-import org.apache.james.mailbox.model.SearchQuery;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.stream.Stream;
-
-public class FilteredQueryCollectorTest {
-
-    @Test
-    public void emptyStreamShouldBeCollectedAsEmptyFilteredQueryRepresentation() throws Exception {
-        List<FilteredQueryRepresentation> emptyFilteredQueryRepresentationList = Lists.newArrayList();
-        FilteredQueryRepresentation collectionResult = emptyFilteredQueryRepresentationList
-            .stream()
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isEmpty();
-    }
-
-    @Test
-    public void queryAloneShouldBeWellCollected() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"match_all\":{}}");
-    }
-
-    @Test
-    public void filterAloneShouldBeWellCollected() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"term\":{\"field\":\"value\"}}");
-    }
-
-    @Test
-    public void aggregationBetweenQueryAndFilterShouldWork() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"match_all\":{}}");
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"term\":{\"field\":\"value\"}}");
-    }
-
-    @Test
-    public void queryAggregationShouldWork() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must\":[{\"match_all\":{}},{\"match_all\":{}}]}}");
-    }
-
-    @Test
-    public void filterAggregationShouldWork() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.AND));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must\":[{\"term\":{\"field\":\"value\"}},{\"term\":{\"field\":\"value\"}}]}}");
-    }
-
-    @Test
-    public void emptyStreamShouldBeCollectedAsEmptyFilteredQueryRepresentationOnNor() throws Exception {
-        List<FilteredQueryRepresentation> emptyFilteredQueryRepresentationList = Lists.newArrayList();
-        FilteredQueryRepresentation collectionResult = emptyFilteredQueryRepresentationList
-            .stream()
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isEmpty();
-    }
-
-    @Test
-    public void queryAloneShouldBeWellCollectedOnNor() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must_not\":{\"match_all\":{}}}}");
-    }
-
-    @Test
-    public void filterAloneShouldBeWellCollectedOnNor() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must_not\":{\"term\":{\"field\":\"value\"}}}}");
-    }
-
-    @Test
-    public void aggregationBetweenQueryAndFilterShouldWorkOnNor() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must_not\":{\"match_all\":{}}}}");
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must_not\":{\"term\":{\"field\":\"value\"}}}}");
-    }
-
-    @Test
-    public void queryAggregationShouldWorkOnNor() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"must\":{\"bool\":{\"must_not\":{\"match_all\":{}}}},\"must_not\":{\"match_all\":{}}}}");
-    }
-
-    @Test
-    public void filterAggregationShouldWorkOnNor() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.NOR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo(
-                "{\"bool\":{\"must\":{\"bool\":{\"must_not\":{\"term\":{\"field\":\"value\"}}}},\"must_not\":{\"term\":{\"field\":\"value\"}}}}");
-    }
-
-    @Test
-    public void emptyStreamShouldBeCollectedAsEmptyFilteredQueryRepresentationOnOr() throws Exception {
-        List<FilteredQueryRepresentation> emptyFilteredQueryRepresentationList = Lists.newArrayList();
-        FilteredQueryRepresentation collectionResult = emptyFilteredQueryRepresentationList
-            .stream()
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isEmpty();
-    }
-
-    @Test
-    public void queryAloneShouldBeWellCollectedOnOr() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"match_all\":{}}");
-    }
-
-    @Test
-    public void filterAloneShouldBeWellCollectedOnOr() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"term\":{\"field\":\"value\"}}");
-    }
-
-    @Test
-    public void aggregationBetweenQueryAndFilterShouldWorkOnOr() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"match_all\":{}}");
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"term\":{\"field\":\"value\"}}");
-    }
-
-    @Test
-    public void queryAggregationShouldWorkOnOr() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()),
-            FilteredQueryRepresentation.fromQuery(matchAllQuery()))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isEmpty();
-        assertThat(collectionResult.getQuery()).isPresent();
-        assertThatJson(collectionResult.getQuery().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"should\":[{\"match_all\":{}},{\"match_all\":{}}]}}");
-    }
-
-    @Test
-    public void filterAggregationShouldWorkOnOr() throws Exception {
-        FilteredQueryRepresentation collectionResult = Stream.of(
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")),
-            FilteredQueryRepresentation.fromFilter(termFilter("field", "value")))
-            .collect(FilteredQueryCollector.collector(SearchQuery.Conjunction.OR));
-        assertThat(collectionResult.getFilter()).isPresent();
-        assertThat(collectionResult.getQuery()).isEmpty();
-        assertThatJson(collectionResult.getFilter().get().toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .isEqualTo("{\"bool\":{\"should\":[{\"term\":{\"field\":\"value\"}},{\"term\":{\"field\":\"value\"}}]}}");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/QueryConverterTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/QueryConverterTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/QueryConverterTest.java
deleted file mode 100644
index e3eb9ae..0000000
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/QueryConverterTest.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mailbox.elasticsearch.query;
-
-import org.apache.james.mailbox.model.SearchQuery;
-import org.elasticsearch.index.query.QueryBuilder;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.text.SimpleDateFormat;
-
-import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER;
-import static net.javacrumbs.jsonunit.core.Option.IGNORING_VALUES;
-import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson;
-
-import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
-
-public class QueryConverterTest {
-
-    public static final String MAILBOX_UUID = "12345";
-
-    private QueryConverter queryConverter;
-
-    @Before
-    public void setUp() {
-        queryConverter = new QueryConverter(new CriterionConverter());
-    }
-
-    @Test
-    public void allCriterionShouldBeWellConverted()throws Exception{
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.all());
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "    \"filtered\": {" +
-                "        \"query\": {" +
-                "                    \"match_all\": {}" +
-                "        }," +
-                "        \"filter\": {" +
-                "                    \"term\": {" +
-                "                        \"mailboxId\": \"12345\"" +
-                "                    }" +
-                "        }" +
-                "    }" +
-                "}");
-    }
-
-    @Test
-    public void textCriterionShouldBeWellConverted() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.bodyContains("awesome Linagora team"));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "    \"filtered\": {" +
-                "        \"query\": {" +
-                "                    \"match\": {" +
-                "                        \"textBody\": {" +
-                "                            \"query\": \"awesome Linagora team\"," +
-                "                            \"type\": \"boolean\"" +
-                "                        }" +
-                "            }" +
-                "        }," +
-                "        \"filter\": {" +
-                "                    \"term\": {" +
-                "                        \"mailboxId\": \"12345\"" +
-                "                    }" +
-                "        }" +
-                "    }" +
-                "}");
-    }
-
-    @Test
-    public void filtersAloneShouldBeCombinedWithAMatchAll() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(42L));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "  \"filtered\" : {" +
-                "    \"query\" : {" +
-                "      \"match_all\" : { }" +
-                "    }," +
-                "    \"filter\" : {" +
-                "      \"bool\" : {" +
-                "        \"must\" : [ {" +
-                "          \"range\" : {" +
-                "            \"modSeq\" : {" +
-                "              \"from\" : 42," +
-                "              \"to\" : null," +
-                "              \"include_lower\" : true," +
-                "              \"include_upper\" : true" +
-                "            }" +
-                "          }" +
-                "        }, {" +
-                "          \"term\" : {" +
-                "            \"mailboxId\" : \"12345\"" +
-                "          }" +
-                "        } ]" +
-                "      }" +
-                "    }" +
-                "  }" +
-                "}");
-    }
-
-    @Test
-    public void queriesAloneShouldBeCombinedWithABoolQuery() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.bodyContains("awesome Linagora team"));
-        searchQuery.andCriteria(SearchQuery.bodyContains("Gold fish"));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "    \"filtered\": {" +
-                "        \"query\": {" +
-                "                    \"bool\": {" +
-                "                        \"must\": [" +
-                "                            {" +
-                "                                \"match\": {" +
-                "                                    \"textBody\": {" +
-                "                                        \"query\": \"awesome Linagora team\"," +
-                "                                        \"type\": \"boolean\"" +
-                "                                    }" +
-                "                                }" +
-                "                            }," +
-                "                            {" +
-                "                                \"match\": {" +
-                "                                    \"textBody\": {" +
-                "                                        \"query\": \"Gold fish\"," +
-                "                                        \"type\": \"boolean\"" +
-                "                                    }" +
-                "                                }" +
-                "                            }" +
-                "                        ]" +
-                "            }" +
-                "        }," +
-                "        \"filter\": {" +
-                "                    \"term\": {" +
-                "                        \"mailboxId\": \"12345\"" +
-                "                    }" +
-                "        }" +
-                "    }" +
-                "}");
-    }
-
-    @Test
-    public void criterionInjectionShouldBeJsonProofed() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(42L));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID + "\"},{\"exist\":\"id\"},{\"match\":\"well done").toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "  \"filtered\" : {" +
-                "    \"query\" : {" +
-                "      \"match_all\" : { }" +
-                "    }," +
-                "    \"filter\" : {" +
-                "      \"bool\" : {" +
-                "        \"must\" : [ {" +
-                "          \"range\" : {" +
-                "            \"modSeq\" : {" +
-                "              \"from\" : 42," +
-                "              \"to\" : null," +
-                "              \"include_lower\" : true," +
-                "              \"include_upper\" : true" +
-                "            }" +
-                "          }" +
-                "        }, {" +
-                "          \"term\" : {" +
-                "            \"mailboxId\" : \"12345\\\"},{\\\"exist\\\":\\\"id\\\"},{\\\"match\\\":\\\"well done\"" +
-                "          }" +
-                "        } ]" +
-                "      }" +
-                "    }" +
-                "  }" +
-                "}");
-    }
-
-    @Test
-    public void addressHeadersShouldBeWellConverted() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Bcc, "Benoit Tellier<bt...@free.fr>"));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "  \"filtered\" : {" +
-                "    \"query\" : {" +
-                "      \"nested\" : {" +
-                "        \"query\" : {" +
-                "          \"bool\" : {" +
-                "            \"should\" : [ {" +
-                "              \"match\" : {" +
-                "                \"bcc.name\" : {" +
-                "                  \"query\" : \"Benoit Tellier<bt...@free.fr>\"," +
-                "                  \"type\" : \"boolean\"" +
-                "                }" +
-                "              }" +
-                "            }, {" +
-                "              \"match\" : {" +
-                "                \"bcc.address\" : {" +
-                "                  \"query\" : \"Benoit Tellier<bt...@free.fr>\"," +
-                "                  \"type\" : \"boolean\"" +
-                "                }" +
-                "              }" +
-                "            } ]" +
-                "          }" +
-                "        }," +
-                "        \"path\" : \"bcc\"" +
-                "      }" +
-                "    }," +
-                "    \"filter\" : {" +
-                "      \"term\" : {" +
-                "        \"mailboxId\" : \"12345\"" +
-                "      }" +
-                "    }" +
-                "  }" +
-                "}");
-    }
-
-    @Test
-    public void dateHeadersShouldBeWellConverted() throws Exception {
-        SearchQuery searchQuery = new SearchQuery();
-        searchQuery.andCriteria(SearchQuery.headerDateBefore(
-            "Date",
-            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2015-02-25 21:54:38"),
-            SearchQuery.DateResolution.Hour));
-        assertThatJson(queryConverter.from(searchQuery, MAILBOX_UUID).toXContent(jsonBuilder(), QueryBuilder.EMPTY_PARAMS).string())
-            .when(IGNORING_VALUES)
-            .when(IGNORING_ARRAY_ORDER)
-            .isEqualTo("{" +
-                "    \"filtered\": {" +
-                "        \"query\": {" +
-                "            \"match_all\": {}" +
-                "        }," +
-                "        \"filter\": {" +
-                "            \"bool\": {" +
-                "                \"must\": [" +
-                "                    {" +
-                "                        \"range\": {" +
-                "                            \"sentDate\": {" +
-                "                                \"from\": null," +
-                "                                \"to\": \"2015-02-25T22:00:00+01:00\"," +
-                "                                \"include_lower\": true," +
-                "                                \"include_upper\": true" +
-                "                            }" +
-                "                        }" +
-                "                    }," +
-                "                    {" +
-                "                        \"term\": {" +
-                "                            \"mailboxId\": \"12345\"" +
-                "                        }" +
-                "                    }" +
-                "                ]" +
-                "            }" +
-                "        }" +
-                "    }" +
-                "}");
-        // We just test structure as time Zone used by Date is different, depending on computer configuration
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mpt/impl/imap-mailbox/elasticsearch/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/pom.xml b/mpt/impl/imap-mailbox/elasticsearch/pom.xml
index 764be21..1100e49 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/pom.xml
+++ b/mpt/impl/imap-mailbox/elasticsearch/pom.xml
@@ -155,17 +155,6 @@
                     <groupId>org.apache.james</groupId>
                     <artifactId>apache-james-mpt-imapmailbox-core</artifactId>
                 </dependency>
-                <dependency>
-                    <groupId>org.apache.lucene</groupId>
-                    <artifactId>lucene-core</artifactId>
-                    <version>4.10.4</version>
-                    <scope>test</scope>
-                </dependency>
-                <dependency>
-                    <groupId>org.codehaus.groovy</groupId>
-                    <artifactId>groovy-all</artifactId>
-                    <version>2.3.2</version>
-                </dependency>
             </dependencies>
             <build>
                 <plugins>

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 0295bda..d804786 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -19,6 +19,10 @@
 
 package org.apache.james.mpt.imapmailbox.elasticsearch.host;
 
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.apache.commons.io.FileUtils;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -54,40 +58,40 @@ import org.apache.james.mpt.host.JamesImapHostSystem;
 import org.apache.james.mpt.imapmailbox.MailboxCreationDelegate;
 
 import com.google.common.base.Throwables;
-import com.google.inject.Inject;
 
 public class ElasticSearchHostSystem extends JamesImapHostSystem {
 
     private static final ImapFeatures SUPPORTED_FEATURES = ImapFeatures.of(Feature.NAMESPACE_SUPPORT);
-    
+
     private EmbeddedElasticSearch embeddedElasticSearch;
+    private Path tempDirectory;
     private StoreMailboxManager<InMemoryId> mailboxManager;
     private MockAuthenticator userManager;
 
-    @Inject
-    public ElasticSearchHostSystem() throws Throwable {
-        this.embeddedElasticSearch = new EmbeddedElasticSearch();
-        embeddedElasticSearch.before();
-        initFields();
-    }
-
-    public EmbeddedElasticSearch getEmbeddedElasticSearch() {
-        return embeddedElasticSearch;
-    }
-
     public boolean addUser(String user, String password) throws Exception {
         userManager.addUser(user, password);
         return true;
     }
 
     @Override
-    protected void resetData() throws Exception {
-        embeddedElasticSearch.after();
-        this.embeddedElasticSearch = new EmbeddedElasticSearch();
+    public void beforeTest() throws Exception {
+        this.tempDirectory = Files.createTempDirectory("elasticsearch");
+        this.embeddedElasticSearch = new EmbeddedElasticSearch(tempDirectory);
         embeddedElasticSearch.before();
         initFields();
     }
 
+    @Override
+    public void afterTest() throws Exception {
+        embeddedElasticSearch.after();
+        FileUtils.deleteDirectory(tempDirectory.toFile());
+    }
+
+    @Override
+    protected void resetData() throws Exception {
+
+    }
+
     private void initFields() {
         ClientProvider clientProvider = NodeMappingFactory.applyMapping(
             IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()))
@@ -114,11 +118,11 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
             throw Throwables.propagate(e);
         }
 
-        final ImapProcessor defaultImapProcessorFactory = 
-                DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, 
-                        new StoreSubscriptionManager(factory), 
-                        new NoQuotaManager(), 
-                        new DefaultQuotaRootResolver(factory));
+        final ImapProcessor defaultImapProcessorFactory =
+            DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager,
+                new StoreSubscriptionManager(factory),
+                new NoQuotaManager(),
+                new DefaultQuotaRootResolver(factory));
         configure(new DefaultImapDecoderFactory().buildImapDecoder(),
             new DefaultImapEncoderFactory().buildImapEncoder(),
             defaultImapProcessorFactory);
@@ -135,5 +139,5 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
     public boolean supports(Feature... features) {
         return SUPPORTED_FEATURES.supports(features);
     }
-    
-}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/a032429d/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/PublicTemporaryFolder.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/PublicTemporaryFolder.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/PublicTemporaryFolder.java
new file mode 100644
index 0000000..362d7eb
--- /dev/null
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/PublicTemporaryFolder.java
@@ -0,0 +1,35 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mpt.imapmailbox.elasticsearch.host;
+
+import org.junit.rules.TemporaryFolder;
+
+public class PublicTemporaryFolder extends TemporaryFolder {
+
+    @Override
+    public void before() throws Throwable {
+        super.before();
+    }
+
+    @Override
+    public void after() {
+        super.after();
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[05/18] james-project git commit: MAILBOX-266 ElasticSearch client should be instanciated once

Posted by bt...@apache.org.
MAILBOX-266 ElasticSearch client should be instanciated once

Note : this commit includes a complete rework of how James MPT SMPT tests works.
 - Rely on the guice project (which highlight the initialization problem and that it brakes SMPT)
 - Better manage resources

This was needed because ElasticSearch was never truly configured before. Which you can do with a client provider (you end up never instanciating the client)
but not if you rely on a real client.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6628e4f4
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6628e4f4
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6628e4f4

Branch: refs/heads/master
Commit: 6628e4f40fdbbf4a93bf995c1fb1779e4884e9fa
Parents: 7f02ab7
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Apr 1 14:57:52 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/DeleteByQueryPerformer.java   |  30 +++--
 .../elasticsearch/ElasticSearchIndexer.java     |  34 +++---
 .../elasticsearch/IndexCreationFactory.java     |  16 ++-
 .../elasticsearch/NodeMappingFactory.java       |  24 ++--
 .../search/ElasticSearchSearcher.java           |  19 ++-
 .../elasticsearch/ElasticSearchIndexerTest.java |   4 +-
 .../ElasticSearchIntegrationTest.java           |   9 +-
 .../search/ScrollIterableTest.java              |   4 +-
 .../apache/james/mpt/api/SmtpHostSystem.java    |  24 ----
 .../host/ElasticSearchHostSystem.java           |  10 +-
 .../apache/james/mpt/smtp/SmtpTestModule.java   |  82 +------------
 .../smtp/host/CassandraJamesSmtpHostSystem.java | 115 +++++++++++++++++++
 .../mpt/smtp/host/JamesSmtpHostSystem.java      |  80 -------------
 .../apache/james/mpt/smtp/ForwardSmtpTest.java  |  18 +--
 .../apache/james/mpt/smtp/SmtpHostSystem.java   |  31 +++++
 .../mailbox/ElasticSearchMailboxModule.java     |  17 +--
 .../modules/CassandraJmapServerModule.java      |  67 +++++++++++
 .../james/modules/TestElasticSearchModule.java  |   6 +-
 .../apache/james/utils/GuiceServerProbe.java    |  16 ++-
 .../CassandraGetMailboxesMethodTest.java        |   2 +-
 .../CassandraGetMessageListMethodTest.java      |   2 +-
 .../CassandraGetMessagesMethodTest.java         |   2 +-
 .../CassandraJmapAuthenticationTest.java        |   2 +-
 .../CassandraSetMailboxesMethodTest.java        |   2 +-
 .../CassandraSetMessagesMethodTest.java         |   2 +-
 .../jmap/servers/CassandraJmapServerModule.java |  64 -----------
 26 files changed, 317 insertions(+), 365 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
index f2a54fa..772432c 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
@@ -40,18 +40,18 @@ public class DeleteByQueryPerformer {
     public static final int DEFAULT_BATCH_SIZE = 100;
     public static final TimeValue TIMEOUT = new TimeValue(60000);
 
-    private final ClientProvider clientProvider;
+    private final Client client;
     private final ExecutorService executor;
     private final int batchSize;
 
     @Inject
-    public DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor) {
-        this(clientProvider, executor, DEFAULT_BATCH_SIZE);
+    public DeleteByQueryPerformer(Client client, @Named("AsyncExecutor") ExecutorService executor) {
+        this(client, executor, DEFAULT_BATCH_SIZE);
     }
 
     @VisibleForTesting
-    DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor, int batchSize) {
-        this.clientProvider = clientProvider;
+    DeleteByQueryPerformer(Client client, @Named("AsyncExecutor") ExecutorService executor, int batchSize) {
+        this.client = client;
         this.executor = executor;
         this.batchSize = batchSize;
     }
@@ -62,17 +62,15 @@ public class DeleteByQueryPerformer {
     }
 
     protected void doDeleteByQuery(QueryBuilder queryBuilder) {
-        try (Client client = clientProvider.get()) {
-            new ScrollIterable(client,
-                client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
-                    .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
-                    .setScroll(TIMEOUT)
-                    .setNoFields()
-                    .setQuery(queryBuilder)
-                    .setSize(batchSize))
-                .stream()
-                .forEach(searchResponse -> deleteRetrievedIds(client, searchResponse));
-        }
+        new ScrollIterable(client,
+            client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setScroll(TIMEOUT)
+                .setNoFields()
+                .setQuery(queryBuilder)
+                .setSize(batchSize))
+            .stream()
+            .forEach(searchResponse -> deleteRetrievedIds(client, searchResponse));
     }
 
     private ListenableActionFuture<BulkResponse> deleteRetrievedIds(Client client, SearchResponse searchResponse) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 1292b28..5f99fd6 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -56,40 +56,34 @@ public class ElasticSearchIndexer {
     public static final String MAILBOX_INDEX = "mailbox";
     public static final String MESSAGE_TYPE = "message";
     
-    private final ClientProvider clientProvider;
+    private final Client client;
     private final DeleteByQueryPerformer deleteByQueryPerformer;
 
     @Inject
-    public ElasticSearchIndexer(ClientProvider clientProvider, DeleteByQueryPerformer deleteByQueryPerformer) {
-        this.clientProvider = clientProvider;
+    public ElasticSearchIndexer(Client client, DeleteByQueryPerformer deleteByQueryPerformer) {
+        this.client = client;
         this.deleteByQueryPerformer = deleteByQueryPerformer;
     }
     
     public IndexResponse indexMessage(String id, String content) {
         checkArgument(content);
-        try (Client client = clientProvider.get()) {
-            return client.prepareIndex(MAILBOX_INDEX, MESSAGE_TYPE, id)
-                .setSource(content)
-                .get();
-        }
+        return client.prepareIndex(MAILBOX_INDEX, MESSAGE_TYPE, id)
+            .setSource(content)
+            .get();
     }
 
     public BulkResponse updateMessages(List<UpdatedRepresentation> updatedDocumentParts) {
         Preconditions.checkNotNull(updatedDocumentParts);
-        try (Client client = clientProvider.get()) {
-            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
-            updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId())
-                .setDoc(updatedDocumentPart.getUpdatedDocumentPart())));
-            return bulkRequestBuilder.get();
-        }
+        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+        updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId())
+            .setDoc(updatedDocumentPart.getUpdatedDocumentPart())));
+        return bulkRequestBuilder.get();
     }
-    
+
     public BulkResponse deleteMessages(List<String> ids) {
-        try (Client client = clientProvider.get()) {
-            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
-            ids.forEach(id -> bulkRequestBuilder.add(client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id)));
-            return bulkRequestBuilder.get();
-        }
+        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+        ids.forEach(id -> bulkRequestBuilder.add(client.prepareDelete(MAILBOX_INDEX, MESSAGE_TYPE, id)));
+        return bulkRequestBuilder.get();
     }
     
     public Void deleteAllMatchingQuery(QueryBuilder queryBuilder) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
index 6cf0933..c4a8060 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
@@ -36,33 +36,31 @@ public class IndexCreationFactory {
     private static final int DEFAULT_NB_REPLICA = 0;
     public static final String CASE_INSENSITIVE = "case_insensitive";
 
-    public static ClientProvider createIndex(ClientProvider clientProvider, int nbShards, int nbReplica) {
+    public static Client createIndex(Client client, int nbShards, int nbReplica) {
         try {
-            return createIndex(clientProvider, generateSetting(nbShards, nbReplica));
+            return createIndex(client, generateSetting(nbShards, nbReplica));
         } catch (IOException e) {
             LOGGER.error("Error while creating index : ", e);
-            return clientProvider;
+            return client;
         }
     }
 
-    public static ClientProvider createIndex(ClientProvider clientProvider) {
-        return createIndex(clientProvider, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
+    public static Client createIndex(Client client) {
+        return createIndex(client, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
     }
 
-    private static ClientProvider createIndex(ClientProvider clientProvider, XContentBuilder settings) {
+    private static Client createIndex(Client client, XContentBuilder settings) {
         try {
-            try (Client client = clientProvider.get()) {
                 client.admin()
                     .indices()
                     .prepareCreate(ElasticSearchIndexer.MAILBOX_INDEX)
                     .setSettings(settings)
                     .execute()
                     .actionGet();
-            }
         } catch (IndexAlreadyExistsException exception) {
             LOGGER.info("Index [" + ElasticSearchIndexer.MAILBOX_INDEX + "] already exist");
         }
-        return clientProvider;
+        return client;
     }
 
     private static XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
index 85b5b05..f74da92 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
@@ -45,21 +45,19 @@ public class NodeMappingFactory {
     public static final String RAW = "raw";
     public static final String ANALYZER = "analyzer";
 
-    public static ClientProvider applyMapping(ClientProvider clientProvider) {
-        return applyMapping(clientProvider, getMappingContent());
+    public static Client applyMapping(Client client) {
+        return applyMapping(client, getMappingContent());
     }
 
-    public static ClientProvider applyMapping(ClientProvider clientProvider, XContentBuilder mappingsSources) {
-        try (Client client = clientProvider.get()) {
-            client.admin()
-                .indices()
-                .preparePutMapping(ElasticSearchIndexer.MAILBOX_INDEX)
-                .setType(ElasticSearchIndexer.MESSAGE_TYPE)
-                .setSource(mappingsSources)
-                .execute()
-                .actionGet();
-        }
-        return clientProvider;
+    public static Client applyMapping(Client client, XContentBuilder mappingsSources) {
+        client.admin()
+            .indices()
+            .preparePutMapping(ElasticSearchIndexer.MAILBOX_INDEX)
+            .setType(ElasticSearchIndexer.MESSAGE_TYPE)
+            .setSource(mappingsSources)
+            .execute()
+            .actionGet();
+        return client;
     }
 
     private static XContentBuilder getMappingContent() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index b5e1792..39e74c2 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -26,7 +26,6 @@ import java.util.stream.StreamSupport;
 
 import javax.inject.Inject;
 
-import org.apache.james.mailbox.elasticsearch.ClientProvider;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.query.QueryConverter;
@@ -49,27 +48,25 @@ public class ElasticSearchSearcher<Id extends MailboxId> {
     private static final TimeValue TIMEOUT = new TimeValue(60000);
     public static final int DEFAULT_SIZE = 100;
 
-    private final ClientProvider clientProvider;
+    private final Client client;
     private final QueryConverter queryConverter;
     private final int size;
 
     @Inject
-    public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter) {
-        this(clientProvider, queryConverter, DEFAULT_SIZE);
+    public ElasticSearchSearcher(Client client, QueryConverter queryConverter) {
+        this(client, queryConverter, DEFAULT_SIZE);
     }
 
-    public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter, int size) {
-        this.clientProvider = clientProvider;
+    public ElasticSearchSearcher(Client client, QueryConverter queryConverter, int size) {
+        this.client = client;
         this.queryConverter = queryConverter;
         this.size = size;
     }
 
     public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException {
-        try (Client client = clientProvider.get()) {
-            return new ScrollIterable(client, getSearchRequestBuilder(client, mailbox, searchQuery)).stream()
-                .flatMap(this::transformResponseToUidStream)
-                .iterator();
-        }
+        return new ScrollIterable(client, getSearchRequestBuilder(client, mailbox, searchQuery)).stream()
+            .flatMap(this::transformResponseToUidStream)
+            .iterator();
     }
 
     private SearchRequestBuilder getSearchRequestBuilder(Client client, Mailbox<Id> mailbox, SearchQuery searchQuery) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index f5e30c8..2acca41 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -56,14 +56,14 @@ public class ElasticSearchIndexerTest {
     public void setup() throws IOException {
         node = embeddedElasticSearch.getNode();
         TestingClientProvider clientProvider = new TestingClientProvider(node);
-        DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) {
+        DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider.get(), Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) {
             @Override
             public Void perform(QueryBuilder queryBuilder) {
                 doDeleteByQuery(queryBuilder);
                 return null;
             }
         };
-        testee = new ElasticSearchIndexer(clientProvider, deleteByQueryPerformer);
+        testee = new ElasticSearchIndexer(clientProvider.get(), deleteByQueryPerformer);
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index e2ddc84..90f9844 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.store.MockAuthenticator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.elasticsearch.client.Client;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -165,13 +166,13 @@ public class ElasticSearchIntegrationTest {
     }
 
     private void initializeMailboxManager() throws Exception {
-        ClientProvider clientProvider = NodeMappingFactory.applyMapping(
-            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()))
+        Client client = NodeMappingFactory.applyMapping(
+            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get())
         );
         MailboxSessionMapperFactory<InMemoryId> mapperFactory = new InMemoryMailboxSessionMapperFactory();
         elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory,
-            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), BATCH_SIZE)),
-            new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter()), SEARCH_SIZE),
+            new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor(), BATCH_SIZE)),
+            new ElasticSearchSearcher<>(client, new QueryConverter(new CriterionConverter()), SEARCH_SIZE),
             new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris")));
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
index 2d574f0..75313a1 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
@@ -62,9 +62,9 @@ public class ScrollIterableTest {
     @Before
     public void setUp() throws Exception {
         clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode());
-        IndexCreationFactory.createIndex(clientProvider);
+        IndexCreationFactory.createIndex(clientProvider.get());
         embeddedElasticSearch.awaitForElasticSearch();
-        NodeMappingFactory.applyMapping(clientProvider, getMappingsSources());
+        NodeMappingFactory.applyMapping(clientProvider.get(), getMappingsSources());
     }
 
     private XContentBuilder getMappingsSources() throws IOException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java
deleted file mode 100644
index 575115d..0000000
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/SmtpHostSystem.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mpt.api;
-
-public interface SmtpHostSystem extends HostSystem {
-
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index d90329b..f15a71b 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -32,7 +32,6 @@ import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
-import org.apache.james.mailbox.elasticsearch.ClientProvider;
 import org.apache.james.mailbox.elasticsearch.DeleteByQueryPerformer;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
@@ -58,6 +57,7 @@ import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
 import org.apache.james.mpt.host.JamesImapHostSystem;
 import org.apache.james.mpt.imapmailbox.MailboxCreationDelegate;
+import org.elasticsearch.client.Client;
 
 import com.google.common.base.Throwables;
 
@@ -95,8 +95,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
     }
 
     private void initFields() {
-        ClientProvider clientProvider = NodeMappingFactory.applyMapping(
-            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()))
+        Client client = NodeMappingFactory.applyMapping(
+            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get())
         );
 
         userManager = new MockAuthenticator();
@@ -104,8 +104,8 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
 
         ElasticSearchListeningMessageSearchIndex<InMemoryId> searchIndex = new ElasticSearchListeningMessageSearchIndex<>(
             factory,
-            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor())),
-            new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter())),
+            new ElasticSearchIndexer(client, new DeleteByQueryPerformer(client, Executors.newSingleThreadExecutor())),
+            new ElasticSearchSearcher<>(client, new QueryConverter(new CriterionConverter())),
             new MessageToElasticSearchJson(new DefaultTextExtractor()));
 
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
index 493f8ff..7e1d3fd 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/SmtpTestModule.java
@@ -18,93 +18,15 @@
  ****************************************************************/
 package org.apache.james.mpt.smtp;
 
-import java.io.IOException;
+import org.apache.james.mpt.smtp.host.CassandraJamesSmtpHostSystem;
 
-import org.apache.james.CassandraJamesServerMain;
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.init.CassandraModuleComposite;
-import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
-import org.apache.james.jmap.JMAPConfiguration;
-import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
-import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
-import org.apache.james.mailbox.elasticsearch.ClientProvider;
-import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
-import org.apache.james.modules.CommonServicesModule;
-import org.apache.james.modules.MailetProcessingModule;
-import org.apache.james.modules.ProtocolsModule;
-import org.apache.james.modules.TestFilesystemModule;
-import org.apache.james.mpt.api.SmtpHostSystem;
-import org.apache.james.mpt.smtp.dns.InMemoryDNSService;
-import org.apache.james.mpt.smtp.host.JamesSmtpHostSystem;
-import org.apache.james.rrt.cassandra.CassandraRRTModule;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
-import org.apache.james.utils.ConfigurationsPerformer;
-import org.junit.rules.TemporaryFolder;
-
-import com.datastax.driver.core.Session;
 import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-import com.google.inject.Singleton;
-import com.google.inject.util.Modules;
 
 public class SmtpTestModule extends AbstractModule {
 
-    private final TemporaryFolder folder = new TemporaryFolder();
-    private final CassandraCluster cassandraClusterSingleton;
-    private final EmbeddedElasticSearch embeddedElasticSearch;
-
-    public SmtpTestModule() throws IOException {
-        folder.create();
-        CassandraModuleComposite cassandraModuleComposite = new CassandraModuleComposite(
-                new CassandraMailboxModule(),
-                new CassandraMessageModule(),
-                new CassandraDomainListModule(),
-                new CassandraUsersRepositoryModule(),
-                new CassandraRRTModule());
-        cassandraClusterSingleton = CassandraCluster.create(cassandraModuleComposite);
-
-        embeddedElasticSearch = new EmbeddedElasticSearch(folder);
-    }
-
     @Override
     protected void configure() {
-        Module cassandra = (binder) -> binder.bind(Session.class).toInstance(cassandraClusterSingleton.getConf());
-        Module dns = (binder) -> {
-            binder.bind(InMemoryDNSService.class).in(Scopes.SINGLETON);
-            binder.bind(DNSService.class).to(InMemoryDNSService.class);
-        };
-        Module elasticSearch = (binder) -> binder.bind(ClientProvider.class).toInstance(() -> embeddedElasticSearch.getNode().client());
-        Module jmap = (binder) -> {
-            binder.bind(JMAPConfiguration.class).toInstance(
-                    JMAPConfiguration.builder()
-                    .keystore("keystore")
-                    .secret("james72laBalle")
-                    .randomPort()
-                    .build());
-        };
-        
-        install(Modules
-                .override(
-                        CassandraJamesServerMain.cassandraServerModule,
-                        new CommonServicesModule<>(CassandraJamesServerMain.cassandraId),
-                        new ProtocolsModule<>(CassandraJamesServerMain.cassandraId),
-                        new MailetProcessingModule())
-            .with(new TestFilesystemModule(folder),
-                cassandra,
-                dns,
-                elasticSearch,
-                jmap));
+        bind(SmtpHostSystem.class).to(CassandraJamesSmtpHostSystem.class);
     }
 
-
-    @Provides
-    @Singleton
-    public SmtpHostSystem provideHostSystem(ConfigurationsPerformer configurationsPerformer, DomainList domainList, UsersRepository usersRepository) throws Exception {
-        return new JamesSmtpHostSystem(configurationsPerformer, domainList, usersRepository);
-    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
new file mode 100644
index 0000000..7cd0040
--- /dev/null
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/CassandraJamesSmtpHostSystem.java
@@ -0,0 +1,115 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mpt.smtp.host;
+
+import java.util.Iterator;
+
+import org.apache.james.CassandraJamesServerMain;
+import org.apache.james.GuiceJamesServer;
+import org.apache.james.backends.cassandra.EmbeddedCassandra;
+import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.mailbox.cassandra.CassandraId;
+import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
+import org.apache.james.modules.CassandraJmapServerModule;
+import org.apache.james.mpt.smtp.SmtpHostSystem;
+import org.apache.james.mpt.monitor.SystemLoggingMonitor;
+import org.apache.james.mpt.session.ExternalSessionFactory;
+import org.apache.james.mpt.smtp.dns.InMemoryDNSService;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.inject.TypeLiteral;
+
+public class CassandraJamesSmtpHostSystem extends ExternalSessionFactory implements SmtpHostSystem {
+
+    private TemporaryFolder folder;
+    private EmbeddedCassandra embeddedCassandra;
+    private EmbeddedElasticSearch embeddedElasticSearch;
+
+    private GuiceJamesServer<CassandraId> jamesServer;
+    private InMemoryDNSService inMemoryDNSService;
+
+
+    public CassandraJamesSmtpHostSystem() {
+        super("localhost", 1025, new SystemLoggingMonitor(), "220 mydomain.tld smtp");
+    }
+
+    @Override
+    public boolean addUser(String userAtDomain, String password) throws Exception {
+        Preconditions.checkArgument(userAtDomain.contains("@"), "The 'user' should contain the 'domain'");
+        Iterator<String> split = Splitter.on("@").split(userAtDomain).iterator();
+        split.next();
+        String domain = split.next();
+
+        createDomainIfNeeded(domain);
+        jamesServer.serverProbe().addUser(userAtDomain, password);
+        return true;
+    }
+
+    private void createDomainIfNeeded(String domain) throws Exception {
+        if (!jamesServer.serverProbe().containsDomain(domain)) {
+            jamesServer.serverProbe().addDomain(domain);
+        }
+    }
+
+    @Override
+    public void addAddressMapping(String user, String domain, String address) throws Exception {
+        jamesServer.serverProbe().addAddressMapping(user, domain, address);
+    }
+
+    @Override
+    public void beforeTests() throws Exception {
+    }
+
+    @Override
+    public void afterTests() throws Exception {
+    }
+
+    @Override
+    public void beforeTest() throws Exception {
+        inMemoryDNSService = new InMemoryDNSService();
+        folder = new TemporaryFolder();
+        folder.create();
+        embeddedElasticSearch = new EmbeddedElasticSearch(folder.getRoot().toPath());
+        embeddedElasticSearch.before();
+        embeddedCassandra = EmbeddedCassandra.createStartServer();
+        jamesServer = createJamesServer();
+        jamesServer.start();
+    }
+
+    @Override
+    public void afterTest() throws Exception {
+        jamesServer.stop();
+        embeddedElasticSearch.after();
+        folder.delete();
+    }
+
+    public InMemoryDNSService getInMemoryDnsService() {
+        return inMemoryDNSService;
+    }
+
+    protected GuiceJamesServer<CassandraId> createJamesServer() {
+        return new GuiceJamesServer<>(new TypeLiteral<CassandraId>(){})
+            .combineWith(CassandraJamesServerMain.cassandraServerModule)
+            .overrideWith(new CassandraJmapServerModule(folder::getRoot, embeddedElasticSearch, embeddedCassandra),
+                (binder) -> binder.bind(DNSService.class).toInstance(inMemoryDNSService));
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java
deleted file mode 100644
index caf46f7..0000000
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/host/JamesSmtpHostSystem.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.mpt.smtp.host;
-
-import java.util.Iterator;
-
-import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.mpt.api.SmtpHostSystem;
-import org.apache.james.mpt.monitor.SystemLoggingMonitor;
-import org.apache.james.mpt.session.ExternalSessionFactory;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.utils.ConfigurationsPerformer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-
-public class JamesSmtpHostSystem extends ExternalSessionFactory implements SmtpHostSystem {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(JamesSmtpHostSystem.class);
-
-    private final DomainList domainList;
-    private final UsersRepository usersRepository;
-    private final ConfigurationsPerformer configurationsPerformer;
-
-    public JamesSmtpHostSystem(ConfigurationsPerformer configurationsPerformer, DomainList domainList, UsersRepository usersRepository) {
-        super("localhost", 1025, new SystemLoggingMonitor(), "220 mydomain.tld smtp");
-        this.configurationsPerformer = configurationsPerformer;
-        this.domainList = domainList;
-        this.usersRepository = usersRepository;
-    }
-
-    @Override
-    public boolean addUser(String userAtDomain, String password) throws Exception {
-        Preconditions.checkArgument(userAtDomain.contains("@"), "The 'user' should contain the 'domain'");
-        Iterator<String> split = Splitter.on("@").split(userAtDomain).iterator();
-        split.next();
-        String domain = split.next();
-
-        domainList.addDomain(domain);
-        usersRepository.addUser(userAtDomain, password);
-        return true;
-    }
-
-    @Override
-    public void beforeTests() throws Exception {
-    }
-
-    @Override
-    public void afterTests() throws Exception {
-    }
-
-    @Override
-    public void beforeTest() throws Exception {
-        LOGGER.info("Initializing modules");
-        configurationsPerformer.initModules();
-    }
-
-    @Override
-    public void afterTest() throws Exception {
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
index ac7d2bd..fbfc138 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
@@ -28,11 +28,9 @@ import java.util.Locale;
 
 import javax.inject.Inject;
 
-import org.apache.james.mpt.api.SmtpHostSystem;
 import org.apache.james.mpt.script.AbstractSimpleScriptedTestProtocol;
-import org.apache.james.mpt.smtp.dns.InMemoryDNSService;
-import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
@@ -61,12 +59,6 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol {
     @Inject
     private static SmtpHostSystem hostSystem;
 
-    @Inject
-    private static RecipientRewriteTable recipientRewriteTable;
-
-    @Inject
-    private static InMemoryDNSService dnsService;
-
     public ForwardSmtpTest() throws Exception {
         super(hostSystem, USER_AT_DOMAIN, PASSWORD, "/org/apache/james/smtp/scripts/");
     }
@@ -75,14 +67,16 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol {
     public void setUp() throws Exception {
         super.setUp();
         InetAddress containerIp = InetAddresses.forString(fakeSmtp.getContainerInfo().getNetworkSettings().getIpAddress());
-        dnsService.registerRecord("yopmail.com", new InetAddress[]{containerIp}, ImmutableList.of("yopmail.com"), ImmutableList.of());
-        recipientRewriteTable.addAddressMapping(USER, DOMAIN, "ray@yopmail.com");
+        hostSystem.getInMemoryDnsService()
+            .registerRecord("yopmail.com", new InetAddress[]{containerIp}, ImmutableList.of("yopmail.com"), ImmutableList.of());
+        hostSystem.addAddressMapping(USER, DOMAIN, "ray@yopmail.com");
 
-        RestAssured.port = Integer.valueOf("80");
+        RestAssured.port = 80;
         RestAssured.baseURI = "http://" + containerIp.getHostAddress();
         RestAssured.config = newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8));
     }
 
+    @Ignore("Due to chaotic initialisation of Guice project, DomainList is not initialized when RemoteDelivery is initialized. Hence a NullPointer exception is thrown on default domain location")
     @Test
     public void forwardingAnEmailShouldWork() throws Exception {
         scriptTest("helo", Locale.US);

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java
new file mode 100644
index 0000000..65805ce
--- /dev/null
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/SmtpHostSystem.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.mpt.smtp;
+
+import org.apache.james.mpt.api.HostSystem;
+import org.apache.james.mpt.smtp.dns.InMemoryDNSService;
+
+public interface SmtpHostSystem extends HostSystem {
+
+    void addAddressMapping(String user, String domain, String address) throws Exception;
+
+    InMemoryDNSService getInMemoryDnsService();
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
index 7fc7638..d3c5368 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/ElasticSearchMailboxModule.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.elasticsearch.events.ElasticSearchListeningMessa
 import org.apache.james.mailbox.store.extractor.TextExtractor;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.tika.extractor.TikaTextExtractor;
+import org.elasticsearch.client.Client;
 import org.elasticsearch.client.transport.NoNodeAvailableException;
 
 import com.google.inject.AbstractModule;
@@ -56,18 +57,18 @@ public class ElasticSearchMailboxModule extends AbstractModule {
 
     @Provides
     @Singleton
-    protected ClientProvider provideClientProvider(FileSystem fileSystem, AsyncRetryExecutor executor) throws ConfigurationException, FileNotFoundException, ExecutionException, InterruptedException {
+    protected Client provideClientProvider(FileSystem fileSystem, AsyncRetryExecutor executor) throws ConfigurationException, FileNotFoundException, ExecutionException, InterruptedException {
         PropertiesConfiguration propertiesReader = new PropertiesConfiguration(fileSystem.getFile(FileSystem.FILE_PROTOCOL_AND_CONF + "elasticsearch.properties"));
 
         ClientProvider clientProvider = new ClientProviderImpl(propertiesReader.getString("elasticsearch.masterHost"),
                 propertiesReader.getInt("elasticsearch.port"));
-        getRetryer(executor, propertiesReader)
-                .getWithRetry(ctx -> IndexCreationFactory.createIndex(clientProvider,
-                        propertiesReader.getInt("elasticsearch.nb.shards"),
-                        propertiesReader.getInt("elasticsearch.nb.replica")))
-                .get();
-        NodeMappingFactory.applyMapping(clientProvider);
-        return clientProvider;
+        Client client = getRetryer(executor, propertiesReader)
+                .getWithRetry(ctx -> clientProvider.get()).get();
+        IndexCreationFactory.createIndex(client,
+            propertiesReader.getInt("elasticsearch.nb.shards"),
+            propertiesReader.getInt("elasticsearch.nb.replica"));
+        NodeMappingFactory.applyMapping(client);
+        return client;
     }
 
     private static AsyncRetryExecutor getRetryer(AsyncRetryExecutor executor, PropertiesConfiguration configuration) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java
new file mode 100644
index 0000000..69de08a
--- /dev/null
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/CassandraJmapServerModule.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules;
+
+import java.io.File;
+import java.util.function.Supplier;
+
+import javax.inject.Singleton;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.EmbeddedCassandra;
+import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
+import org.junit.rules.TemporaryFolder;
+
+import com.datastax.driver.core.Session;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+
+public class CassandraJmapServerModule extends AbstractModule {
+
+    private static final int LIMIT_TO_3_MESSAGES = 3;
+    private final Supplier<File> fileSupplier;
+    private final EmbeddedElasticSearch embeddedElasticSearch;
+    private final EmbeddedCassandra cassandra;
+
+    public CassandraJmapServerModule(Supplier<File> fileSupplier, EmbeddedElasticSearch embeddedElasticSearch, EmbeddedCassandra cassandra) {
+        this.fileSupplier = fileSupplier;
+        this.embeddedElasticSearch = embeddedElasticSearch;
+        this.cassandra = cassandra;
+    }
+
+    public CassandraJmapServerModule(TemporaryFolder temporaryFolder, EmbeddedElasticSearch embeddedElasticSearch, EmbeddedCassandra cassandra) {
+        this(temporaryFolder::getRoot, embeddedElasticSearch, cassandra);
+    }
+
+
+    @Override
+    protected void configure() {
+        install(new TestElasticSearchModule(embeddedElasticSearch));
+        install(new TestFilesystemModule(fileSupplier));
+        install(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES));
+        bind(EmbeddedCassandra.class).toInstance(cassandra);
+    }
+    
+    @Provides
+    @Singleton
+    Session provideSession(CassandraCluster initializedCassandra) {
+        return initializedCassandra.getConf();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
index 6da278f..2254476 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/TestElasticSearchModule.java
@@ -21,11 +21,11 @@ package org.apache.james.modules;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
-import org.apache.james.mailbox.elasticsearch.ClientProvider;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.apache.james.mailbox.elasticsearch.IndexCreationFactory;
 import org.apache.james.mailbox.elasticsearch.NodeMappingFactory;
 import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider;
+import org.elasticsearch.client.Client;
 
 import javax.inject.Singleton;
 
@@ -44,9 +44,9 @@ public class TestElasticSearchModule extends AbstractModule{
 
     @Provides
     @Singleton
-    protected ClientProvider provideClientProvider() {
+    protected Client provideClientProvider() {
         return NodeMappingFactory.applyMapping(
-            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()))
+            IndexCreationFactory.createIndex(new TestingClientProvider(embeddedElasticSearch.getNode()).get())
         );
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
index a2d687e..11a6369 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/utils/GuiceServerProbe.java
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
+import org.apache.james.rrt.api.RecipientRewriteTable;
 import org.apache.james.rrt.lib.Mappings;
 import org.apache.james.sieverepository.api.SieveRepository;
 import org.apache.james.user.api.UsersRepository;
@@ -64,15 +65,18 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro
     private final DomainList domainList;
     private final UsersRepository usersRepository;
     private final SieveRepository sieveRepository;
+    private final RecipientRewriteTable recipientRewriteTable;
 
     @Inject
     private GuiceServerProbe(MailboxManager mailboxManager, MailboxMapperFactory<Id> mailboxMapperFactory,
-                             DomainList domainList, UsersRepository usersRepository, SieveRepository sieveRepository) {
+                             DomainList domainList, UsersRepository usersRepository, SieveRepository sieveRepository,
+                             RecipientRewriteTable recipientRewriteTable) {
         this.mailboxManager = mailboxManager;
         this.mailboxMapperFactory = mailboxMapperFactory;
         this.domainList = domainList;
         this.usersRepository = usersRepository;
         this.sieveRepository = sieveRepository;
+        this.recipientRewriteTable = recipientRewriteTable;
     }
 
     @Override
@@ -121,17 +125,17 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro
 
     @Override
     public Map<String, Mappings> listMappings() throws Exception {
-        throw new NotImplementedException();
+        return recipientRewriteTable.getAllMappings();
     }
 
     @Override
     public void addAddressMapping(String user, String domain, String toAddress) throws Exception {
-        throw new NotImplementedException();
+        recipientRewriteTable.addAddressMapping(user, domain, toAddress);
     }
 
     @Override
     public void removeAddressMapping(String user, String domain, String fromAddress) throws Exception {
-        throw new NotImplementedException();
+        recipientRewriteTable.removeAddressMapping(user, domain, fromAddress);
     }
 
     @Override
@@ -141,12 +145,12 @@ public class GuiceServerProbe<Id extends MailboxId> implements ExtendedServerPro
 
     @Override
     public void addRegexMapping(String user, String domain, String regex) throws Exception {
-        throw new NotImplementedException();
+        recipientRewriteTable.addRegexMapping(user, domain, regex);
     }
 
     @Override
     public void removeRegexMapping(String user, String domain, String regex) throws Exception {
-        throw new NotImplementedException();
+        recipientRewriteTable.removeRegexMapping(user, domain, regex);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
index f414f16..84ddbec 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMailboxesMethodTest.java
@@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.methods.integration.GetMailboxesMethodTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.junit.Rule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
index 44496bd..ca5dffc 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessageListMethodTest.java
@@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.methods.integration.GetMessageListMethodTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.junit.Rule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
index 716b95b..b5f7e0f 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraGetMessagesMethodTest.java
@@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.methods.integration.GetMessagesMethodTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.junit.Rule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
index d9c653f..3f7eeb8 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraJmapAuthenticationTest.java
@@ -23,7 +23,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.FixedDateZonedDateTimeProvider;
 import org.apache.james.jmap.JMAPAuthenticationTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.jmap.utils.ZonedDateTimeProvider;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
index d5757b8..aeff7a4 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMailboxesMethodTest.java
@@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.methods.integration.SetMailboxesMethodTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.junit.Rule;
 import org.junit.rules.RuleChain;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
index e71ed96..90c52b7 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSetMessagesMethodTest.java
@@ -23,7 +23,7 @@ import org.apache.james.CassandraJamesServerMain;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.methods.integration.SetMessagesMethodTest;
-import org.apache.james.jmap.servers.CassandraJmapServerModule;
+import org.apache.james.modules.CassandraJmapServerModule;
 import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.junit.Rule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/6628e4f4/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java
deleted file mode 100644
index e9c9c3c..0000000
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/servers/CassandraJmapServerModule.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.jmap.servers;
-
-import javax.inject.Singleton;
-
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.EmbeddedCassandra;
-import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
-import org.apache.james.modules.TestElasticSearchModule;
-import org.apache.james.modules.TestFilesystemModule;
-import org.apache.james.modules.TestJMAPServerModule;
-import org.junit.rules.TemporaryFolder;
-
-import com.datastax.driver.core.Session;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-
-public class CassandraJmapServerModule extends AbstractModule {
-
-    private static final int LIMIT_TO_3_MESSAGES = 3;
-    private final TemporaryFolder temporaryFolder;
-    private final EmbeddedElasticSearch embeddedElasticSearch;
-    private final EmbeddedCassandra cassandra;
-
-    public CassandraJmapServerModule(TemporaryFolder temporaryFolder, 
-            EmbeddedElasticSearch embeddedElasticSearch, 
-            EmbeddedCassandra cassandra) {
-                this.temporaryFolder = temporaryFolder;
-                this.embeddedElasticSearch = embeddedElasticSearch;
-                this.cassandra = cassandra;
-    }
-
-    @Override
-    protected void configure() {
-        install(new TestElasticSearchModule(embeddedElasticSearch));
-        install(new TestFilesystemModule(temporaryFolder));
-        install(new TestJMAPServerModule(LIMIT_TO_3_MESSAGES));
-        bind(EmbeddedCassandra.class).toInstance(cassandra);
-    }
-    
-    @Provides
-    @Singleton
-    Session provideSession(CassandraCluster initializedCassandra) {
-        return initializedCassandra.getConf();
-    }
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[17/18] james-project git commit: MAILBOX-266 DeleteByQuery type should be void

Posted by bt...@apache.org.
MAILBOX-266 DeleteByQuery type should be void


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/d1d5712f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/d1d5712f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/d1d5712f

Branch: refs/heads/master
Commit: d1d5712f932869c17a6d6f42c47a8edc9169eca2
Parents: 1d43ec8
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Apr 6 15:06:53 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:46 2016 +0700

----------------------------------------------------------------------
 .../james/mailbox/elasticsearch/DeleteByQueryPerformer.java | 3 +--
 .../james/mailbox/elasticsearch/ElasticSearchIndexer.java   | 4 ++--
 .../mailbox/elasticsearch/ElasticSearchIndexerTest.java     | 3 +--
 ...ElasticSearchListeningMailboxMessageSearchIndexTest.java | 9 +++++----
 4 files changed, 9 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d1d5712f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
index 772432c..be81654 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
@@ -56,9 +56,8 @@ public class DeleteByQueryPerformer {
         this.batchSize = batchSize;
     }
 
-    public Void perform(QueryBuilder queryBuilder) {
+    public void perform(QueryBuilder queryBuilder) {
         executor.execute(() -> doDeleteByQuery(queryBuilder));
-        return null;
     }
 
     protected void doDeleteByQuery(QueryBuilder queryBuilder) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1d5712f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 5f99fd6..85c46bc 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -86,8 +86,8 @@ public class ElasticSearchIndexer {
         return bulkRequestBuilder.get();
     }
     
-    public Void deleteAllMatchingQuery(QueryBuilder queryBuilder) {
-        return deleteByQueryPerformer.perform(queryBuilder);
+    public void deleteAllMatchingQuery(QueryBuilder queryBuilder) {
+        deleteByQueryPerformer.perform(queryBuilder);
     }
 
     private void checkArgument(String content) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1d5712f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index 2acca41..f5f2118 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -58,9 +58,8 @@ public class ElasticSearchIndexerTest {
         TestingClientProvider clientProvider = new TestingClientProvider(node);
         DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider.get(), Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) {
             @Override
-            public Void perform(QueryBuilder queryBuilder) {
+            public void perform(QueryBuilder queryBuilder) {
                 doDeleteByQuery(queryBuilder);
-                return null;
             }
         };
         testee = new ElasticSearchIndexer(clientProvider.get(), deleteByQueryPerformer);

http://git-wip-us.apache.org/repos/asf/james-project/blob/d1d5712f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
index 79691d1..64bb04c 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.easymock.EasyMock;
 import org.easymock.IMocksControl;
 import org.elasticsearch.ElasticsearchException;
 import org.elasticsearch.action.bulk.BulkResponse;
@@ -237,8 +238,8 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         expectLastCall();
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
 
-        expect(indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class)))
-            .andReturn(null);
+        indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class));
+        EasyMock.expectLastCall();
 
         control.replay();
         testee.deleteAll(session, mailbox);
@@ -256,8 +257,8 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         expectLastCall();
         expect(mailbox.getMailboxId()).andReturn(mailboxId).times(2);
 
-        expect(indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class)))
-            .andThrow(new ElasticsearchException(""));
+        indexer.deleteAllMatchingQuery(anyObject(QueryBuilder.class));
+        EasyMock.expectLastCall().andThrow(new ElasticsearchException(""));
 
         control.replay();
         testee.deleteAll(session, mailbox);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[07/18] james-project git commit: MAILBOX-266 Introduce a scroll Iterable

Posted by bt...@apache.org.
MAILBOX-266 Introduce a scroll Iterable


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ebeafcf0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ebeafcf0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ebeafcf0

Branch: refs/heads/master
Commit: ebeafcf0e58691961c1ce4a7bb7394bfaab164a7
Parents: a032429
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 10:16:48 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/NodeMappingFactory.java       |   6 +-
 .../search/ElasticSearchSearcher.java           |  17 +-
 .../elasticsearch/search/ScrollIterable.java    |  81 +++++++++
 .../search/ScrollIterableTest.java              | 173 +++++++++++++++++++
 4 files changed, 267 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ebeafcf0/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
index 5a2e90f..758f3c2 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
@@ -43,12 +43,16 @@ public class NodeMappingFactory {
     public static final String NESTED = "nested";
 
     public static ClientProvider applyMapping(ClientProvider clientProvider) {
+        return applyMapping(clientProvider, getMappingContent());
+    }
+
+    public static ClientProvider applyMapping(ClientProvider clientProvider, XContentBuilder mappingsSources) {
         try (Client client = clientProvider.get()) {
             client.admin()
                 .indices()
                 .preparePutMapping(ElasticSearchIndexer.MAILBOX_INDEX)
                 .setType(ElasticSearchIndexer.MESSAGE_TYPE)
-                .setSource(getMappingContent())
+                .setSource(mappingsSources)
                 .execute()
                 .actionGet();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ebeafcf0/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index b0f1734..96d90b5 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -21,8 +21,11 @@ package org.apache.james.mailbox.elasticsearch.search;
 
 import java.util.Iterator;
 import java.util.Optional;
+import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
+import javax.inject.Inject;
+
 import org.apache.james.mailbox.elasticsearch.ClientProvider;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
@@ -40,8 +43,6 @@ import org.elasticsearch.search.SearchHit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.inject.Inject;
-
 public class ElasticSearchSearcher<Id extends MailboxId> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSearcher.class);
@@ -57,9 +58,9 @@ public class ElasticSearchSearcher<Id extends MailboxId> {
 
     public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException {
         try (Client client = clientProvider.get()) {
-            return transformResponseToUidIterator(getSearchRequestBuilder(client, mailbox, searchQuery)
-                .get()
-            );
+            return new ScrollIterable(client, getSearchRequestBuilder(client, mailbox, searchQuery)).stream()
+                .flatMap(this::transformResponseToUidStream)
+                .iterator();
         }
     }
 
@@ -76,13 +77,11 @@ public class ElasticSearchSearcher<Id extends MailboxId> {
                 (partialResult1, partialResult2) -> partialResult1);
     }
 
-    private Iterator<Long> transformResponseToUidIterator(SearchResponse searchResponse) {
+    private Stream<Long> transformResponseToUidStream(SearchResponse searchResponse) {
         return StreamSupport.stream(searchResponse.getHits().spliterator(), false)
             .map(this::extractUidFromHit)
             .filter(Optional::isPresent)
-            .map(Optional::get)
-            .iterator();
-
+            .map(Optional::get);
     }
 
     private Optional<Long> extractUidFromHit(SearchHit hit) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ebeafcf0/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterable.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterable.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterable.java
new file mode 100644
index 0000000..76acce1
--- /dev/null
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterable.java
@@ -0,0 +1,81 @@
+/****************************************************************
+ * 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.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import org.elasticsearch.action.ListenableActionFuture;
+import org.elasticsearch.action.search.SearchRequestBuilder;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.unit.TimeValue;
+
+public class ScrollIterable implements Iterable<SearchResponse> {
+
+    private static final TimeValue TIMEOUT = new TimeValue(60000);
+    private final Client client;
+    private final SearchRequestBuilder searchRequestBuilder;
+
+    public ScrollIterable(Client client, SearchRequestBuilder searchRequestBuilder) {
+        this.client = client;
+        this.searchRequestBuilder = searchRequestBuilder;
+    }
+
+    @Override
+    public Iterator<SearchResponse> iterator() {
+        return new ScrollIterator(client, searchRequestBuilder);
+    }
+
+    public Stream<SearchResponse> stream() {
+        return StreamSupport.stream(spliterator(), false);
+    }
+
+    public static class ScrollIterator implements Iterator<SearchResponse> {
+
+        private final Client client;
+        private ListenableActionFuture<SearchResponse> searchResponseFuture;
+
+        public ScrollIterator(Client client, SearchRequestBuilder searchRequestBuilder) {
+            this.client = client;
+            this.searchResponseFuture = searchRequestBuilder.execute();
+        }
+
+        @Override
+        public boolean hasNext() {
+            return !allSearchResponsesConsumed(searchResponseFuture.actionGet());
+        }
+
+        @Override
+        public SearchResponse next() {
+            SearchResponse result = searchResponseFuture.actionGet();
+            searchResponseFuture =  client.prepareSearchScroll(result.getScrollId())
+                .setScroll(TIMEOUT)
+                .execute();
+            return result;
+        }
+
+        private boolean allSearchResponsesConsumed(SearchResponse searchResponse) {
+            return searchResponse.getHits().getHits().length == 0;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/ebeafcf0/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
new file mode 100644
index 0000000..2d574f0
--- /dev/null
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/search/ScrollIterableTest.java
@@ -0,0 +1,173 @@
+/****************************************************************
+ * 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 static org.assertj.core.api.Assertions.assertThat;
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
+import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.james.mailbox.elasticsearch.ClientProvider;
+import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
+import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
+import org.apache.james.mailbox.elasticsearch.IndexCreationFactory;
+import org.apache.james.mailbox.elasticsearch.NodeMappingFactory;
+import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider;
+import org.elasticsearch.action.search.SearchRequestBuilder;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.search.SearchHit;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+
+public class ScrollIterableTest {
+
+    public static final TimeValue TIMEOUT = new TimeValue(6000);
+    public static final int SIZE = 2;
+    public static final String MESSAGE = "message";
+
+    private TemporaryFolder temporaryFolder = new TemporaryFolder();
+    private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
+
+    @Rule
+    public RuleChain ruleChain = RuleChain.outerRule(temporaryFolder).around(embeddedElasticSearch);
+
+    private ClientProvider clientProvider;
+
+    @Before
+    public void setUp() throws Exception {
+        clientProvider = new TestingClientProvider(embeddedElasticSearch.getNode());
+        IndexCreationFactory.createIndex(clientProvider);
+        embeddedElasticSearch.awaitForElasticSearch();
+        NodeMappingFactory.applyMapping(clientProvider, getMappingsSources());
+    }
+
+    private XContentBuilder getMappingsSources() throws IOException {
+        return jsonBuilder()
+            .startObject()
+                .startObject(ElasticSearchIndexer.MESSAGE_TYPE)
+                    .startObject(NodeMappingFactory.PROPERTIES)
+                        .startObject(MESSAGE)
+                            .field(NodeMappingFactory.TYPE, NodeMappingFactory.STRING)
+                        .endObject()
+                    .endObject()
+                .endObject()
+            .endObject();
+    }
+
+    @Test
+    public void scrollIterableShouldWorkWhenEmpty() {
+        try (Client client = clientProvider.get()) {
+            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setScroll(TIMEOUT)
+                .setQuery(matchAllQuery())
+                .setSize(SIZE);
+            assertThat(new ScrollIterable(client, searchRequestBuilder)).isEmpty();
+        }
+    }
+
+    @Test
+    public void scrollIterableShouldWorkWhenOneElement() {
+        try (Client client = clientProvider.get()) {
+            String id = "1";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            embeddedElasticSearch.awaitForElasticSearch();
+
+            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setScroll(TIMEOUT)
+                .setQuery(matchAllQuery())
+                .setSize(SIZE);
+            assertThat(convertToIdList(new ScrollIterable(client, searchRequestBuilder))).containsOnly(id);
+        }
+    }
+
+    @Test
+    public void scrollIterableShouldWorkWhenSizeElement() {
+        try (Client client = clientProvider.get()) {
+            String id1 = "1";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id1)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            String id2 = "2";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id2)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            embeddedElasticSearch.awaitForElasticSearch();
+
+            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setScroll(TIMEOUT)
+                .setQuery(matchAllQuery())
+                .setSize(SIZE);
+            assertThat(convertToIdList(new ScrollIterable(client, searchRequestBuilder))).containsOnly(id1, id2);
+        }
+    }
+
+    @Test
+    public void scrollIterableShouldWorkWhenMoreThanSizeElement() {
+        try (Client client = clientProvider.get()) {
+            String id1 = "1";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id1)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            String id2 = "2";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id2)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            String id3 = "3";
+            client.prepareIndex(ElasticSearchIndexer.MAILBOX_INDEX, ElasticSearchIndexer.MESSAGE_TYPE, id3)
+                .setSource(MESSAGE, "Sample message")
+                .execute();
+
+            embeddedElasticSearch.awaitForElasticSearch();
+
+            SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setScroll(TIMEOUT)
+                .setQuery(matchAllQuery())
+                .setSize(SIZE);
+            assertThat(convertToIdList(new ScrollIterable(client, searchRequestBuilder))).containsOnly(id1, id2, id3);
+        }
+    }
+
+    private List<String> convertToIdList(ScrollIterable scrollIterable) {
+        return scrollIterable.stream()
+            .flatMap(searchResponse -> Arrays.asList(searchResponse.getHits().getHits()).stream())
+            .map(SearchHit::getId)
+            .collect(Collectors.toList());
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[06/18] james-project git commit: MAILBOX-266 Activate tests on custom flags, now supported in memory

Posted by bt...@apache.org.
MAILBOX-266 Activate tests on custom flags, now supported in memory


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2730305c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2730305c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2730305c

Branch: refs/heads/master
Commit: 2730305cd90ad0bbdb43a163efd47aafdd2f2cfd
Parents: b446bff
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 14:39:55 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/query/CriterionConverter.java        | 13 +++++++++----
 .../elasticsearch/ElasticSearchIntegrationTest.java    | 10 ++++------
 2 files changed, 13 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2730305c/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
index 935c683..a523c3d 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
@@ -26,7 +26,6 @@ import static org.elasticsearch.index.query.QueryBuilders.matchQuery;
 import static org.elasticsearch.index.query.QueryBuilders.nestedQuery;
 import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
 import static org.elasticsearch.index.query.QueryBuilders.termQuery;
-import static org.elasticsearch.index.query.QueryBuilders.termsQuery;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -66,6 +65,7 @@ public class CriterionConverter {
         registerCriterionConverter(SearchQuery.ConjunctionCriterion.class, this::convertConjunction);
         registerCriterionConverter(SearchQuery.HeaderCriterion.class, this::convertHeader);
         registerCriterionConverter(SearchQuery.TextCriterion.class, this::convertTextCriterion);
+        registerCriterionConverter(SearchQuery.CustomFlagCriterion.class, this::convertCustomFlagCriterion);
         
         registerCriterionConverter(SearchQuery.AllCriterion.class,
             criterion -> matchAllQuery());
@@ -75,9 +75,6 @@ public class CriterionConverter {
         
         registerCriterionConverter(SearchQuery.SizeCriterion.class,
             criterion -> createNumericFilter(JsonMessageConstants.SIZE, criterion.getOperator()));
-        
-        registerCriterionConverter(SearchQuery.CustomFlagCriterion.class,
-            criterion -> termsQuery(JsonMessageConstants.USER_FLAGS, criterion.getFlag()));
 
         registerCriterionConverter(SearchQuery.InternalDateCriterion.class,
             criterion -> dateRangeFilter(JsonMessageConstants.DATE, criterion.getOperator()));
@@ -118,6 +115,14 @@ public class CriterionConverter {
         return criterionConverterMap.get(criterion.getClass()).apply(criterion);
     }
 
+    private QueryBuilder convertCustomFlagCriterion(SearchQuery.CustomFlagCriterion criterion) {
+        QueryBuilder termQueryBuilder = termQuery(JsonMessageConstants.USER_FLAGS, criterion.getFlag());
+        if (criterion.getOperator().isSet()) {
+            return termQueryBuilder;
+        } else {
+            return boolQuery().mustNot(termQueryBuilder);
+        }
+    }
 
     private QueryBuilder convertTextCriterion(SearchQuery.TextCriterion textCriterion) {
         switch (textCriterion.getType()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/2730305c/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 95b3f7f..832e4a6 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -32,6 +32,7 @@ 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.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.elasticsearch.query.CriterionConverter;
 import org.apache.james.mailbox.elasticsearch.query.QueryConverter;
@@ -173,7 +174,7 @@ public class ElasticSearchIntegrationTest {
             new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), BATCH_SIZE)),
             new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter()), SEARCH_SIZE),
             new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris")));
-        storeMailboxManager = new StoreMailboxManager<>(
+        storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new MockAuthenticator(),
             new JVMMailboxPathLocker(),
@@ -271,7 +272,6 @@ public class ElasticSearchIntegrationTest {
             .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();
@@ -280,13 +280,12 @@ public class ElasticSearchIntegrationTest {
             .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);
+            .isEmpty();
     }
 
     @Test
@@ -339,13 +338,12 @@ public class ElasticSearchIntegrationTest {
             .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);
+            .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L,  9L);
     }
 
     @Test


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[12/18] james-project git commit: MAILBOX-266 Improve code coverage

Posted by bt...@apache.org.
MAILBOX-266 Improve code coverage


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0ea8bc69
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0ea8bc69
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0ea8bc69

Branch: refs/heads/master
Commit: 0ea8bc6996fc81d9464c4adc334856d46c0ec1a4
Parents: aea76c8
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 16:41:11 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/IndexCreationFactory.java     |  8 +---
 .../ElasticSearchIntegrationTest.java           | 44 ++++++++++++++++++++
 .../query/DateResolutionFormaterTest.java       |  9 ++++
 .../src/test/resources/documents/frnog.eml      |  2 +
 .../src/test/resources/documents/mail4.eml      |  2 +
 5 files changed, 58 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0ea8bc69/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
index fdbfeac..71a6c11 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.elasticsearch;
 
 import java.io.IOException;
-import java.util.Optional;
 
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.settings.Settings;
@@ -44,12 +43,7 @@ public class IndexCreationFactory {
     }
 
     public static ClientProvider createIndex(ClientProvider clientProvider) {
-        try {
-            return createIndex(clientProvider, generateSetting(DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA));
-        } catch (IOException e) {
-            LOGGER.error("Error while creating index : ", e);
-            return clientProvider;
-        }
+        return createIndex(clientProvider, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
     }
 
     private static ClientProvider createIndex(ClientProvider clientProvider, Settings settings) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/0ea8bc69/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 9b90b72..95b3f7f 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -184,6 +184,13 @@ public class ElasticSearchIntegrationTest {
     }
 
     @Test
+    public void emptySearchQueryShouldReturnAllUids() throws MailboxException {
+        SearchQuery searchQuery = new SearchQuery();
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L);
+    }
+
+    @Test
     public void allShouldReturnAllUids() throws MailboxException {
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.all());
@@ -443,6 +450,22 @@ public class ElasticSearchIntegrationTest {
     }
 
     @Test
+    public void addressShouldReturnUidHavingRightRecipientWhenCcIsSpecified() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Cc, "any@any.com"));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(5L);
+    }
+
+    @Test
+    public void addressShouldReturnUidHavingRightRecipientWhenBccIsSpecified() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        searchQuery.andCriteria(SearchQuery.address(SearchQuery.AddressType.Bcc, "no@no.com"));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(9L);
+    }
+
+    @Test
     public void uidShouldreturnExistingUidsOnTheGivenRanges() throws Exception {
         SearchQuery searchQuery = new SearchQuery();
         SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 4L), new SearchQuery.NumericRange(6L, 7L)};
@@ -452,6 +475,15 @@ public class ElasticSearchIntegrationTest {
     }
 
     @Test
+    public void uidShouldreturnEveryThing() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L);
+    }
+
+    @Test
     public void youShouldBeAbleToSpecifySeveralCriterionOnASingleQuery() throws Exception {
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.headerExists("Precedence"));
@@ -472,6 +504,18 @@ public class ElasticSearchIntegrationTest {
     }
 
     @Test
+    public void orShouldReturnResultsMatchinganyRequests() throws Exception {
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 4L)};
+        SearchQuery searchQuery = new SearchQuery();
+        searchQuery.andCriteria(
+            SearchQuery.or(
+                SearchQuery.uid(numericRanges),
+                SearchQuery.modSeqGreaterThan(6L)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(2L, 3L, 4L, 6L, 7L, 8L, 9L);
+    }
+
+    @Test
     public void notShouldReturnResultsThatDoNotMatchAQuery() throws Exception {
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(

http://git-wip-us.apache.org/repos/asf/james-project/blob/0ea8bc69/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
index c82a050..fed35c1 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/query/DateResolutionFormaterTest.java
@@ -43,6 +43,15 @@ public class DateResolutionFormaterTest {
     }
 
     @Test
+    public void calculateUpperDateShouldReturnDateUpToTheNextHourUsingHourUnit() throws ParseException {
+        assertThat(
+            ISO_OFFSET_DATE_TIME.format(
+                DateResolutionFormater.computeUpperDate(ZonedDateTime.parse(dateString, ISO_OFFSET_DATE_TIME), SearchQuery.DateResolution.Hour)
+            )
+        ).isEqualTo("2014-01-02T16:00:00Z");
+    }
+
+    @Test
     public void calculateUpperDateShouldReturnDateUpToTheNextDayUsingDayUnit() throws ParseException {
         assertThat(
             ISO_OFFSET_DATE_TIME.format(

http://git-wip-us.apache.org/repos/asf/james-project/blob/0ea8bc69/mailbox/elasticsearch/src/test/resources/documents/frnog.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/frnog.eml b/mailbox/elasticsearch/src/test/resources/documents/frnog.eml
index a12c1ce..505fbde 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/frnog.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/frnog.eml
@@ -39,6 +39,8 @@ From: Guillaume Genty <gg...@waycom.net>
 Organization: Waycom
 MIME-Version: 1.0
 To: <fr...@frnog.org>
+Cc: no@no.com
+Bcc: no@no.com
 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

http://git-wip-us.apache.org/repos/asf/james-project/blob/0ea8bc69/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/mail4.eml b/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
index b01da38..584b24c 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
@@ -37,6 +37,8 @@ Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28)
 Date: Fri, 15 May 2015 06:35:59 +0000 (UTC)
 From: "Eric Charles (JIRA)" <ma...@james.apache.org>
 To: mailet-api@james.apache.org
+Cc: any@any.com
+Bcc: any@any.com
 Message-ID: <JI...@Atlassian.JIRA>
 In-Reply-To: <JI...@Atlassian.JIRA>
 References: <JI...@Atlassian.JIRA> <JI...@arcas>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[15/18] james-project git commit: MAILBOX-266 DeleteByQueryPerformer should be tested synchronously in tests

Posted by bt...@apache.org.
MAILBOX-266 DeleteByQueryPerformer should be tested synchronously in tests

Otherwise, await() can be called before the BulkRequest being sent. In this case, await succeeds, and further conditions fails, as the state has not been modified as required.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f43a4e32
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f43a4e32
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f43a4e32

Branch: refs/heads/master
Commit: f43a4e32fba8dd021729d8fc4dd987b7006e07c8
Parents: b99d0c7
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 10:32:08 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/DeleteByQueryPerformer.java        | 15 +++++++--------
 .../elasticsearch/ElasticSearchIndexerTest.java      | 12 +++++++++---
 2 files changed, 16 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f43a4e32/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
index 895f016..f2a54fa 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
@@ -56,23 +56,22 @@ public class DeleteByQueryPerformer {
         this.batchSize = batchSize;
     }
 
-    public void perform(QueryBuilder queryBuilder) {
+    public Void perform(QueryBuilder queryBuilder) {
         executor.execute(() -> doDeleteByQuery(queryBuilder));
+        return null;
     }
 
-    private Void doDeleteByQuery(QueryBuilder queryBuilder) {
+    protected void doDeleteByQuery(QueryBuilder queryBuilder) {
         try (Client client = clientProvider.get()) {
-            ScrollIterable scrollIterable = new ScrollIterable(client,
+            new ScrollIterable(client,
                 client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
                     .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
                     .setScroll(TIMEOUT)
                     .setNoFields()
                     .setQuery(queryBuilder)
-                    .setSize(batchSize));
-            for (SearchResponse searchResponse : scrollIterable) {
-                deleteRetrievedIds(client, searchResponse);
-            }
-            return null;
+                    .setSize(batchSize))
+                .stream()
+                .forEach(searchResponse -> deleteRetrievedIds(client, searchResponse));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/f43a4e32/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index 7501c57..e05eced 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.Client;
+import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.node.Node;
 import org.junit.Before;
@@ -41,7 +42,7 @@ import com.google.common.collect.Lists;
 
 public class ElasticSearchIndexerTest {
 
-    public static final int MINIMUM_BATCH_SIZE = 1;
+    private static final int MINIMUM_BATCH_SIZE = 1;
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
     private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
 
@@ -50,13 +51,18 @@ public class ElasticSearchIndexerTest {
 
     private Node node;
     private ElasticSearchIndexer testee;
-    private DeleteByQueryPerformer deleteByQueryPerformer;
 
     @Before
     public void setup() throws IOException {
         node = embeddedElasticSearch.getNode();
         TestingClientProvider clientProvider = new TestingClientProvider(node);
-        deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE);
+        DeleteByQueryPerformer deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE) {
+            @Override
+            public Void perform(QueryBuilder queryBuilder) {
+                doDeleteByQuery(queryBuilder);
+                return null;
+            }
+        };
         testee = new ElasticSearchIndexer(clientProvider, deleteByQueryPerformer);
     }
     


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[18/18] james-project git commit: MAILBOX-266 Find a temporary solution for Guice chaotic initialization

Posted by bt...@apache.org.
MAILBOX-266 Find a temporary solution for Guice chaotic initialization


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1d43ec8e
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1d43ec8e
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1d43ec8e

Branch: refs/heads/master
Commit: 1d43ec8eb064a67d9f2b3638cdffdebcf7b6136c
Parents: 6628e4f
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Apr 5 10:23:32 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:46 2016 +0700

----------------------------------------------------------------------
 .../main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java | 2 --
 .../org/apache/james/domainlist/lib/AbstractDomainList.java  | 8 ++++++--
 2 files changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1d43ec8e/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
index fbfc138..27859a2 100644
--- a/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
+++ b/mpt/impl/smtp/core/src/main/java/org/apache/james/mpt/smtp/ForwardSmtpTest.java
@@ -30,7 +30,6 @@ import javax.inject.Inject;
 
 import org.apache.james.mpt.script.AbstractSimpleScriptedTestProtocol;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
@@ -76,7 +75,6 @@ public class ForwardSmtpTest extends AbstractSimpleScriptedTestProtocol {
         RestAssured.config = newConfig().encoderConfig(encoderConfig().defaultContentCharset(Charsets.UTF_8));
     }
 
-    @Ignore("Due to chaotic initialisation of Guice project, DomainList is not initialized when RemoteDelivery is initialized. Hence a NullPointer exception is thrown on default domain location")
     @Test
     public void forwardingAnEmailShouldWork() throws Exception {
         scriptTest("helo", Locale.US);

http://git-wip-us.apache.org/repos/asf/james-project/blob/1d43ec8e/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
index 9852a11..c191cce 100644
--- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
+++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
@@ -69,8 +69,12 @@ public abstract class AbstractDomainList implements DomainList, LogEnabled, Conf
     }
 
     @Override
-    public String getDefaultDomain() {
-        return defaultDomain;
+    public String getDefaultDomain() throws DomainListException {
+        if (defaultDomain!= null) {
+            return defaultDomain;
+        } else {
+            throw new DomainListException("Null default domain. Domain list might not be configured yet.");
+        }
     }
 
     @Override


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[09/18] james-project git commit: MAILBOX-266 Implement a delete by query using Scroll + Bulk queries and use it

Posted by bt...@apache.org.
MAILBOX-266 Implement a delete by query using Scroll + Bulk queries and use it


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/6ba31a66
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/6ba31a66
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/6ba31a66

Branch: refs/heads/master
Commit: 6ba31a6680d7023ed3052b5783fc9fc54dc36165
Parents: ebeafcf
Author: Benoit Tellier <bt...@linagora.com>
Authored: Wed Mar 23 16:24:31 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/DeleteByQueryPerformer.java   | 81 ++++++++++++++++++++
 .../elasticsearch/ElasticSearchIndexer.java     | 10 ++-
 ...lasticSearchListeningMessageSearchIndex.java |  6 +-
 .../elasticsearch/ElasticSearchIndexerTest.java | 35 +++++----
 .../ElasticSearchIntegrationTest.java           |  3 +-
 .../host/ElasticSearchHostSystem.java           |  4 +-
 .../james/JamesCapabilitiesServerTest.java      |  1 -
 .../james/modules/CommonServicesModule.java     |  6 +-
 .../server/AsyncTasksExecutorModule.java        | 45 +++++++++++
 9 files changed, 164 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
new file mode 100644
index 0000000..9d266ce
--- /dev/null
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
@@ -0,0 +1,81 @@
+/****************************************************************
+ * 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 java.util.concurrent.ExecutorService;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.james.mailbox.elasticsearch.search.ScrollIterable;
+import org.elasticsearch.action.ListenableActionFuture;
+import org.elasticsearch.action.bulk.BulkRequestBuilder;
+import org.elasticsearch.action.bulk.BulkResponse;
+import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.client.Client;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.search.SearchHit;
+
+public class DeleteByQueryPerformer {
+    public static final int BATCH_SIZE = 100;
+    public static final TimeValue TIMEOUT = new TimeValue(60000);
+
+    private final ClientProvider clientProvider;
+    private final ExecutorService executor;
+
+    @Inject
+    public DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor) {
+        this.clientProvider = clientProvider;
+        this.executor = executor;
+    }
+
+    public void perform(QueryBuilder queryBuilder) {
+        executor.execute(() -> doDeleteByQuery(queryBuilder));
+    }
+
+    private Void doDeleteByQuery(QueryBuilder queryBuilder) {
+        try (Client client = clientProvider.get()) {
+            ScrollIterable scrollIterable = new ScrollIterable(client,
+                client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
+                    .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
+                    .setScroll(TIMEOUT)
+                    .setNoFields()
+                    .setQuery(queryBuilder)
+                    .setSize(BATCH_SIZE));
+            for (SearchResponse searchResponse : scrollIterable) {
+                deleteRetrievedIds(client, searchResponse);
+            }
+            return null;
+        }
+    }
+
+    private ListenableActionFuture<BulkResponse> deleteRetrievedIds(Client client, SearchResponse searchResponse) {
+        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+        for (SearchHit hit : searchResponse.getHits()) {
+            bulkRequestBuilder.add(client.prepareDelete()
+                .setIndex(ElasticSearchIndexer.MAILBOX_INDEX)
+                .setType(ElasticSearchIndexer.MESSAGE_TYPE)
+                .setId(hit.getId()));
+        }
+        return bulkRequestBuilder.execute();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 630abb6..1b6017d 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -20,11 +20,11 @@ package org.apache.james.mailbox.elasticsearch;
 
 import javax.inject.Inject;
 
-import org.apache.commons.lang.NotImplementedException;
 import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
 import org.elasticsearch.action.update.UpdateResponse;
 import org.elasticsearch.client.Client;
+import org.elasticsearch.index.query.QueryBuilder;
 
 import com.google.common.base.Preconditions;
 
@@ -34,10 +34,12 @@ public class ElasticSearchIndexer {
     public static final String MESSAGE_TYPE = "message";
     
     private final ClientProvider clientProvider;
+    private final DeleteByQueryPerformer deleteByQueryPerformer;
 
     @Inject
-    public ElasticSearchIndexer(ClientProvider clientProvider) {
+    public ElasticSearchIndexer(ClientProvider clientProvider, DeleteByQueryPerformer deleteByQueryPerformer) {
         this.clientProvider = clientProvider;
+        this.deleteByQueryPerformer = deleteByQueryPerformer;
     }
     
     public IndexResponse indexMessage(String id, String content) {
@@ -65,8 +67,8 @@ public class ElasticSearchIndexer {
         }
     }
     
-    public void deleteAllWithIdStarting(String idStart) {
-        throw new NotImplementedException();
+    public void deleteAllMatchingQuery(QueryBuilder queryBuilder) {
+        deleteByQueryPerformer.perform(queryBuilder);
     }
 
     private void checkArgument(String content) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index 30146c0..b7f34fe 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch.events;
 
+import static org.elasticsearch.index.query.QueryBuilders.termQuery;
+
 import java.util.Iterator;
 
 import javax.inject.Inject;
@@ -25,6 +27,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
+import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.json.MessageToElasticSearchJson;
 import org.apache.james.mailbox.elasticsearch.search.ElasticSearchSearcher;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -39,7 +42,6 @@ import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> extends ListeningMessageSearchIndex<Id> {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(ElasticSearchListeningMessageSearchIndex.class);
@@ -80,7 +82,7 @@ public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> exte
     @Override
     public void delete(MailboxSession session, Mailbox<Id> mailbox, MessageRange range) throws MailboxException {
         if (range.getType() == Type.ALL) {
-            indexer.deleteAllWithIdStarting(mailbox.getMailboxId() + ID_SEPARATOR);
+            indexer.deleteAllMatchingQuery(termQuery(JsonMessageConstants.MAILBOX_ID, mailbox.getMailboxId().serialize()));
         } else {
             range.forEach(messageId -> {
                 try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index 850494f..1e4ce1a 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -20,21 +20,25 @@
 package org.apache.james.mailbox.elasticsearch;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
 import java.io.IOException;
+import java.util.concurrent.Executors;
 
+import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.utils.TestingClientProvider;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.node.Node;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TemporaryFolder;
 
+import com.google.common.collect.Lists;
+
 public class ElasticSearchIndexerTest {
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
@@ -45,11 +49,14 @@ public class ElasticSearchIndexerTest {
 
     private Node node;
     private ElasticSearchIndexer testee;
+    private DeleteByQueryPerformer deleteByQueryPerformer;
 
     @Before
     public void setup() throws IOException {
         node = embeddedElasticSearch.getNode();
-        testee = new ElasticSearchIndexer(new TestingClientProvider(node));
+        TestingClientProvider clientProvider = new TestingClientProvider(node);
+        deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor());
+        testee = new ElasticSearchIndexer(clientProvider, deleteByQueryPerformer);
     }
     
     @Test
@@ -113,16 +120,15 @@ public class ElasticSearchIndexerTest {
         testee.updateMessage("1", null);
     }
 
-    @Ignore
     @Test
-    public void deleteAllWithIdStarting() throws Exception {
+    public void deleteByQueryShouldWorkOnSingleMessage() throws Exception {
         String messageId = "1:2";
-        String content = "{\"message\": \"trying out Elasticsearch\"}";
+        String content = "{\"message\": \"trying out Elasticsearch\", \"mailboxId\":\"1\"}";
 
         testee.indexMessage(messageId, content);
         embeddedElasticSearch.awaitForElasticSearch();
         
-        testee.deleteAllWithIdStarting("1:");
+        testee.deleteAllMatchingQuery(termQuery(JsonMessageConstants.MAILBOX_ID, "1"));
         embeddedElasticSearch.awaitForElasticSearch();
         
         try (Client client = node.client()) {
@@ -134,28 +140,25 @@ public class ElasticSearchIndexerTest {
         }
     }
 
-    @Ignore
     @Test
-    public void deleteAllWithIdStartingWhenMultipleMessages() throws Exception {
-        String messageId = "1:2";
-        String content = "{\"message\": \"trying out Elasticsearch\"}";
+    public void deleteByQueryShouldWorkWhenMultipleMessages() throws Exception {
+        String messageId = "1:1";
+        String content = "{\"message\": \"trying out Elasticsearch\", \"mailboxId\":\"1\"}";
         
         testee.indexMessage(messageId, content);
-        embeddedElasticSearch.awaitForElasticSearch();
         
         String messageId2 = "1:2";
-        String content2 = "{\"message\": \"trying out Elasticsearch 2\"}";
+        String content2 = "{\"message\": \"trying out Elasticsearch 2\", \"mailboxId\":\"1\"}";
         
         testee.indexMessage(messageId2, content2);
-        embeddedElasticSearch.awaitForElasticSearch();
         
         String messageId3 = "2:3";
-        String content3 = "{\"message\": \"trying out Elasticsearch 3\"}";
+        String content3 = "{\"message\": \"trying out Elasticsearch 3\", \"mailboxId\":\"2\"}";
         
         testee.indexMessage(messageId3, content3);
         embeddedElasticSearch.awaitForElasticSearch();
-        
-        testee.deleteAllWithIdStarting("1:");
+
+        testee.deleteAllMatchingQuery(termQuery(JsonMessageConstants.MAILBOX_ID, "1"));
         embeddedElasticSearch.awaitForElasticSearch();
         
         try (Client client = node.client()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index e27f5af..2f5962e 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.time.ZoneId;
 import java.util.Date;
+import java.util.concurrent.Executors;
 
 import javax.mail.Flags;
 
@@ -167,7 +168,7 @@ public class ElasticSearchIntegrationTest {
         );
         MailboxSessionMapperFactory<InMemoryId> mapperFactory = new InMemoryMailboxSessionMapperFactory();
         elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory,
-            new ElasticSearchIndexer(clientProvider),
+            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor())),
             new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter())),
             new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris")));
         storeMailboxManager = new StoreMailboxManager<>(

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index d804786..d90329b 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.elasticsearch.host;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.concurrent.Executors;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -32,6 +33,7 @@ import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.elasticsearch.ClientProvider;
+import org.apache.james.mailbox.elasticsearch.DeleteByQueryPerformer;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.apache.james.mailbox.elasticsearch.IndexCreationFactory;
@@ -102,7 +104,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
 
         ElasticSearchListeningMessageSearchIndex<InMemoryId> searchIndex = new ElasticSearchListeningMessageSearchIndex<>(
             factory,
-            new ElasticSearchIndexer(clientProvider),
+            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor())),
             new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter())),
             new MessageToElasticSearchJson(new DefaultTextExtractor()));
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index 761d1fd..b39f3af 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -88,7 +88,6 @@ public class JamesCapabilitiesServerTest {
                         bind(MailboxManager.class).toInstance(mailboxManager);
                     }
 
-                    @SuppressWarnings("unused")
                     @Provides
                     @Singleton
                     Session provideSession(CassandraModule cassandraModule) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
index 175a92b..029362c 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
@@ -30,6 +30,7 @@ import org.apache.james.core.filesystem.FileSystemImpl;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.filesystem.api.JamesDirectoriesProvider;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
+import org.apache.james.modules.server.AsyncTasksExecutorModule;
 import org.apache.james.modules.server.ConfigurationProviderModule;
 import org.apache.james.modules.server.DNSServiceModule;
 import org.apache.james.utils.ConfigurationProvider;
@@ -56,18 +57,19 @@ public class CommonServicesModule<Id extends MailboxId> extends AbstractModule {
         install(new ConfigurationProviderModule());
         install(new PreDestroyModule());
         install(new DNSServiceModule());
+        install(new AsyncTasksExecutorModule());
         
         bind(FileSystem.class).to(FileSystemImpl.class);
         bind(ConfigurationProvider.class).to(FileConfigurationProvider.class);
         TypeLiteral<GuiceServerProbe<Id>> serverProbe = guiceGenericType.newGenericType(GuiceServerProbe.class);
         bind(serverProbe).in(Singleton.class);
     }
-    
+
     @Provides @Singleton @Named(CONFIGURATION_PATH)
     public String configurationPath() {
         return FileSystem.FILE_PROTOCOL_AND_CONF;
     }
-    
+
     @Provides @Singleton
     public JamesDirectoriesProvider directories() throws MissingArgumentException {
         String rootDirectory = Optional

http://git-wip-us.apache.org/repos/asf/james-project/blob/6ba31a66/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/AsyncTasksExecutorModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/AsyncTasksExecutorModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/AsyncTasksExecutorModule.java
new file mode 100644
index 0000000..5b49d8b
--- /dev/null
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/server/AsyncTasksExecutorModule.java
@@ -0,0 +1,45 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.modules.server;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.inject.Named;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+
+public class AsyncTasksExecutorModule extends AbstractModule {
+
+    public static final int THREAD_POOL_SIZE = 8;
+
+    @Override
+    protected void configure() {
+
+    }
+
+    @Provides
+    @Singleton
+    @Named("AsyncExecutor")
+    public ExecutorService provideAsyncExecutorService() {
+        return Executors.newFixedThreadPool(THREAD_POOL_SIZE);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[11/18] james-project git commit: MAILBOX-266 Updates should be bulked

Posted by bt...@apache.org.
MAILBOX-266 Updates should be bulked


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1bfa390f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1bfa390f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1bfa390f

Branch: refs/heads/master
Commit: 1bfa390f500eddd0e5d3cd3a448b1b637a45ce10
Parents: f43a4e3
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Mar 24 17:25:38 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/ElasticSearchIndexer.java     | 37 ++++++++--
 ...lasticSearchListeningMessageSearchIndex.java | 37 ++++++----
 .../elasticsearch/ElasticSearchIndexerTest.java | 25 ++++---
 ...hListeningMailboxMessageSearchIndexTest.java | 72 +++++---------------
 .../lucene/search/LuceneMessageSearchIndex.java | 14 +++-
 .../store/search/LazyMessageSearchIndex.java    | 10 ++-
 .../search/ListeningMessageSearchIndex.java     | 44 ++++--------
 7 files changed, 119 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
index 1b6017d..f4bbec4 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexer.java
@@ -18,18 +18,42 @@
  ****************************************************************/
 package org.apache.james.mailbox.elasticsearch;
 
+import java.util.List;
+
 import javax.inject.Inject;
 
+import org.elasticsearch.action.bulk.BulkRequestBuilder;
+import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
-import org.elasticsearch.action.update.UpdateResponse;
 import org.elasticsearch.client.Client;
+import org.elasticsearch.common.Strings;
 import org.elasticsearch.index.query.QueryBuilder;
 
 import com.google.common.base.Preconditions;
 
 public class ElasticSearchIndexer {
 
+    public static class UpdatedRepresentation {
+        private final String id;
+        private final String updatedDocumentPart;
+
+        public UpdatedRepresentation(String id, String updatedDocumentPart) {
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(id), "Updated id must be specified " + id);
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(updatedDocumentPart), "Updated document must be specified");
+            this.id = id;
+            this.updatedDocumentPart = updatedDocumentPart;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public String getUpdatedDocumentPart() {
+            return updatedDocumentPart;
+        }
+    }
+
     public static final String MAILBOX_INDEX = "mailbox";
     public static final String MESSAGE_TYPE = "message";
     
@@ -51,12 +75,13 @@ public class ElasticSearchIndexer {
         }
     }
 
-    public UpdateResponse updateMessage(String id, String docUpdated) {
-        checkArgument(docUpdated);
+    public BulkResponse updateMessages(List<UpdatedRepresentation> updatedDocumentParts) {
+        Preconditions.checkNotNull(updatedDocumentParts);
         try (Client client = clientProvider.get()) {
-            return client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, id)
-                .setDoc(docUpdated)
-                .get();
+            BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
+            updatedDocumentParts.forEach(updatedDocumentPart -> bulkRequestBuilder.add(client.prepareUpdate(MAILBOX_INDEX, MESSAGE_TYPE, updatedDocumentPart.getId())
+                .setDoc(updatedDocumentPart.getUpdatedDocumentPart())));
+            return bulkRequestBuilder.get();
         }
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index b7f34fe..68d9fd6 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -21,9 +21,10 @@ package org.apache.james.mailbox.elasticsearch.events;
 import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 
 import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.elasticsearch.ElasticSearchIndexer;
@@ -34,6 +35,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageRange.Type;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
@@ -42,6 +44,8 @@ import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+
 public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> extends ListeningMessageSearchIndex<Id> {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(ElasticSearchListeningMessageSearchIndex.class);
@@ -95,19 +99,28 @@ public class ElasticSearchListeningMessageSearchIndex<Id extends MailboxId> exte
     }
 
     @Override
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modseq) throws MailboxException {
-        range.forEach(messageId -> {
-            try {
-                indexer.updateMessage(
-                    indexIdFor(mailbox, messageId),
-                    messageToElasticSearchJson.getUpdatedJsonMessagePart(flags, modseq));
-            } catch (Exception e) {
-                LOGGER.error("Error when updating index for message " + messageId, e);
-            }
-        });
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        try {
+            indexer.updateMessages(updatedFlagsList.stream()
+                .map(updatedFlags -> createUpdatedDocumentPartFromUpdatedFlags(mailbox, updatedFlags))
+                .collect(Collectors.toList()));
+        } catch (Exception e) {
+            LOGGER.error("Error when updating index on mailbox {}", mailbox.getMailboxId().serialize(), e);
+        }
+    }
 
+    private ElasticSearchIndexer.UpdatedRepresentation createUpdatedDocumentPartFromUpdatedFlags(Mailbox<Id> mailbox, UpdatedFlags updatedFlags) {
+        try {
+            return new ElasticSearchIndexer.UpdatedRepresentation(
+                indexIdFor(mailbox, updatedFlags.getUid()),
+                    messageToElasticSearchJson.getUpdatedJsonMessagePart(
+                        updatedFlags.getNewFlags(),
+                        updatedFlags.getModSeq()));
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException("Error while creating updatedDocumentParts", e);
+        }
     }
-    
+
     private String indexIdFor(Mailbox<Id> mailbox, long messageId) {
         return String.join(ID_SEPARATOR, mailbox.getMailboxId().serialize(), String.valueOf(messageId));
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index e05eced..43fc26b 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -89,14 +89,14 @@ public class ElasticSearchIndexerTest {
     }
     
     @Test
-    public void updateMessage() throws Exception {
+    public void updateMessages() throws Exception {
         String messageId = "1";
         String content = "{\"message\": \"trying out Elasticsearch\",\"field\":\"Should be unchanged\"}";
 
         testee.indexMessage(messageId, content);
         embeddedElasticSearch.awaitForElasticSearch();
 
-        testee.updateMessage(messageId, "{\"message\": \"mastering out Elasticsearch\"}");
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation(messageId, "{\"message\": \"mastering out Elasticsearch\"}")));
         embeddedElasticSearch.awaitForElasticSearch();
 
         try (Client client = node.client()) {
@@ -115,16 +115,25 @@ public class ElasticSearchIndexerTest {
             assertThat(searchResponse.getHits().getTotalHits()).isEqualTo(1);
         }
     }
-    
+
     @Test(expected=IllegalArgumentException.class)
     public void updateMessageShouldThrowWhenJsonIsNull() throws InterruptedException {
-        String messageId = "1:2";
-        String content = "{\"message\": \"trying out Elasticsearch\"}";
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("1", null)));
+    }
 
-        testee.indexMessage(messageId, content);
-        embeddedElasticSearch.awaitForElasticSearch();
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenIdIsNull() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation(null, "{\"message\": \"mastering out Elasticsearch\"}")));
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenJsonIsEmpty() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("1", "")));
+    }
 
-        testee.updateMessage("1", null);
+    @Test(expected=IllegalArgumentException.class)
+    public void updateMessageShouldThrowWhenIdIsEmpty() throws InterruptedException {
+        testee.updateMessages(Lists.newArrayList(new ElasticSearchIndexer.UpdatedRepresentation("", "{\"message\": \"mastering out Elasticsearch\"}")));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
index 76922b0..f15b1ad 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMailboxMessageSearchIndexTest.java
@@ -27,8 +27,8 @@ import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 
 import java.io.IOException;
-import java.util.stream.IntStream;
 import java.util.stream.LongStream;
+import java.util.List;
 
 import javax.mail.Flags;
 
@@ -37,20 +37,21 @@ 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.model.UpdatedFlags;
 import org.apache.james.mailbox.store.TestId;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.easymock.IMocksControl;
 import org.elasticsearch.ElasticsearchException;
+import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.index.IndexResponse;
-import org.elasticsearch.action.update.UpdateResponse;
 import org.junit.Before;
 import org.junit.Test;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.common.base.Throwables;
+import com.google.common.collect.Lists;
 
 public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
@@ -89,7 +90,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         long messageId = 1;
         TestId mailboxId = TestId.of(12);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
-        MailboxMessage<TestId> message = mockedMessage(messageId, mailboxId);
+        MailboxMessage<TestId> message = mockedMessage(messageId);
         
         IndexResponse expectedIndexResponse = control.createMock(IndexResponse.class);
         expect(indexer.indexMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
@@ -101,7 +102,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
     }
 
     @SuppressWarnings("unchecked")
-    private MailboxMessage<TestId> mockedMessage(long messageId, TestId mailboxId) throws IOException {
+    private MailboxMessage<TestId> mockedMessage(long messageId) throws IOException {
         MailboxMessage<TestId> message = control.createMock(MailboxMessage.class);
         expect(message.getUid()).andReturn(messageId).anyTimes();
         return message;
@@ -115,7 +116,7 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         
         long messageId = 1;
         TestId mailboxId = TestId.of(12);
-        MailboxMessage<TestId> message = mockedMessage(messageId, mailboxId);
+        MailboxMessage<TestId> message = mockedMessage(messageId);
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
         
         expect(indexer.indexMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
@@ -192,59 +193,21 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
         MailboxSession session = control.createMock(MailboxSession.class);
 
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
-        Flags flags = new Flags();
 
+        Flags flags = new Flags();
         long messageId = 1;
+        UpdatedFlags updatedFlags = new UpdatedFlags(messageId, MODSEQ, flags, flags);
         TestId mailboxId = TestId.of(12);
-        MessageRange messageRange = MessageRange.one(messageId);
 
         expectLastCall();
         expect(mailbox.getMailboxId()).andReturn(mailboxId);
         
-        UpdateResponse expectedUpdateResponse = control.createMock(UpdateResponse.class);
-        expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
-            .andReturn(expectedUpdateResponse);
+        BulkResponse expectedBulkResponse = control.createMock(BulkResponse.class);
+        expect(indexer.updateMessages(anyObject(List.class)))
+            .andReturn(expectedBulkResponse);
         
         control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
-        control.verify();
-    }
-
-    @Test
-    @SuppressWarnings("unchecked")
-    public void updateShouldWorkWhenMultipleMessageIds() throws Exception {
-        MailboxSession session = control.createMock(MailboxSession.class);
-
-        Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
-        Flags flags = new Flags();
-
-        long firstMessageId = 1;
-        long lastMessageId = 10;
-        MessageRange messageRange = MessageRange.range(firstMessageId, lastMessageId);
-        
-        TestId mailboxId = TestId.of(12);
-
-        IntStream.range(1, 11).forEach(
-            (uid) -> {
-                try {
-
-                    expectLastCall();
-
-                    expect(mailbox.getMailboxId()).andReturn(mailboxId);
-
-                    UpdateResponse expectedUpdateResponse = control.createMock(UpdateResponse.class);
-                    expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + uid), anyString()))
-
-                        .andReturn(expectedUpdateResponse);
-                } catch (Exception e) {
-                    Throwables.propagate(e);
-                }
-            }
-        );
-        
-        
-        control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
+        testee.update(session, mailbox, Lists.newArrayList(updatedFlags));
         control.verify();
     }
 
@@ -255,19 +218,18 @@ public class ElasticSearchListeningMailboxMessageSearchIndexTest {
 
         Mailbox<TestId> mailbox = control.createMock(Mailbox.class);
         Flags flags = new Flags();
-
         long messageId = 1;
+        UpdatedFlags updatedFlags = new UpdatedFlags(messageId, MODSEQ, flags, flags);
         TestId mailboxId = TestId.of(12);
-        MessageRange messageRange = MessageRange.one(messageId);
 
         expectLastCall();
-        expect(mailbox.getMailboxId()).andReturn(mailboxId);
+        expect(mailbox.getMailboxId()).andReturn(mailboxId).times(2);
 
-        expect(indexer.updateMessage(eq(mailboxId.serialize() + ":" + messageId), anyString()))
+        expect(indexer.updateMessages(anyObject(List.class)))
             .andThrow(new ElasticsearchException(""));
         
         control.replay();
-        testee.update(session, mailbox, messageRange, flags, MODSEQ);
+        testee.update(session, mailbox, Lists.newArrayList(updatedFlags));
         control.verify();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
index e44fa4b..2382399 100644
--- a/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
+++ b/mailbox/lucene/src/main/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndex.java
@@ -56,6 +56,7 @@ import org.apache.james.mailbox.model.SearchQuery.HeaderOperator;
 import org.apache.james.mailbox.model.SearchQuery.NumericOperator;
 import org.apache.james.mailbox.model.SearchQuery.NumericRange;
 import org.apache.james.mailbox.model.SearchQuery.UidCriterion;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -1204,15 +1205,22 @@ public class LuceneMessageSearchIndex<Id extends MailboxId> extends ListeningMes
     }
 
     /**
-     * @see org.apache.james.mailbox.store.search.ListeningMessageSearchIndex#update(org.apache.james.mailbox.MailboxSession, org.apache.james.mailbox.store.mail.model.Mailbox, org.apache.james.mailbox.model.MessageRange, javax.mail.Flags)
+     * @see ListeningMessageSearchIndex#update
      */
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags f, long modSeq) throws MailboxException {
+    @Override
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        for (UpdatedFlags updatedFlags : updatedFlagsList) {
+            update(mailbox, updatedFlags.getUid(), updatedFlags.getNewFlags());
+        }
+    }
+
+    private void update(Mailbox<Id> mailbox, long uid, Flags f) throws MailboxException {
         IndexSearcher searcher = null;
         try {
             searcher = new IndexSearcher(IndexReader.open(writer, true));
             BooleanQuery query = new BooleanQuery();
             query.add(new TermQuery(new Term(MAILBOX_ID_FIELD, mailbox.getMailboxId().serialize())), BooleanClause.Occur.MUST);
-            query.add(createQuery(range), BooleanClause.Occur.MUST);
+            query.add(createQuery(MessageRange.one(uid)), BooleanClause.Occur.MUST);
             query.add( new PrefixQuery(new Term(FLAGS_FIELD, "")), BooleanClause.Occur.MUST);
 
             TopDocs docs = searcher.search(query, 100000);

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
index e149713..3f80259 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/LazyMessageSearchIndex.java
@@ -19,14 +19,14 @@
 package org.apache.james.mailbox.store.search;
 
 import java.util.Iterator;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
-import javax.mail.Flags;
-
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -102,10 +102,8 @@ public class LazyMessageSearchIndex<Id extends MailboxId> extends ListeningMessa
         return index.search(session, mailbox, searchQuery);
     }
 
-
     @Override
-    public void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modSeq) throws MailboxException {
-        index.update(session, mailbox, range, flags, modSeq);
+    public void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException {
+        index.update(session, mailbox, updatedFlagsList);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/1bfa390f/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
index 2bb2936..b894319 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/ListeningMessageSearchIndex.java
@@ -21,8 +21,6 @@ package org.apache.james.mailbox.store.search;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.mail.Flags;
-
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -79,12 +77,10 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                 if (event instanceof EventFactory.AddedImpl) {
                     EventFactory.AddedImpl added = (EventFactory.AddedImpl) event;
                     final Mailbox<Id> mailbox = added.getMailbox();
-                    Iterator<Long> uids = added.getUids().iterator();
 
-                    while (uids.hasNext()) {
-                        long next = uids.next();
+                    for (Long next : (Iterable<Long>) added.getUids()) {
                         Iterator<MailboxMessage<Id>> messages = factory.getMessageMapper(session).findInMailbox(mailbox, MessageRange.one(next), FetchType.Full, -1);
-                        while(messages.hasNext()) {
+                        while (messages.hasNext()) {
                             MailboxMessage<Id> message = messages.next();
                             try {
                                 add(session, mailbox, message);
@@ -110,14 +106,10 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
                     EventFactory.FlagsUpdatedImpl flagsUpdated = (EventFactory.FlagsUpdatedImpl) event;
                     final Mailbox<Id> mailbox = flagsUpdated.getMailbox();
 
-                    Iterator<UpdatedFlags> flags = flagsUpdated.getUpdatedFlags().iterator();
-                    while(flags.hasNext()) {
-                        UpdatedFlags uFlags = flags.next();
-                        try {
-                            update(session, mailbox, MessageRange.one(uFlags.getUid()), uFlags.getNewFlags(), uFlags.getModSeq());
-                        } catch (MailboxException e) {
-                            session.getLog().debug("Unable to update flags for message " + uFlags.getUid() + " in index for mailbox " + mailbox, e);
-                        }
+                    try {
+                        update(session, mailbox, flagsUpdated.getUpdatedFlags());
+                    } catch (MailboxException e) {
+                        session.getLog().debug("Unable to update flags in index for mailbox " + mailbox, e);
                     }
                 }
             } else if (event instanceof EventFactory.MailboxDeletionImpl) {
@@ -131,18 +123,11 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
     }
 
     /**
-     * Never closed
-     */
-    public boolean isClosed() {
-        return false;
-    }
-
-    /**
      * Add the {@link MailboxMessage} for the given {@link Mailbox} to the index
      *
-     * @param session
-     * @param mailbox
-     * @param message
+     * @param session The mailbox session performing the message addition
+     * @param mailbox mailbox on which the message addition was performed
+     * @param message The added message
      * @throws MailboxException
      */
     public abstract void add(MailboxSession session, Mailbox<Id> mailbox, MailboxMessage<Id> message) throws MailboxException;
@@ -159,13 +144,12 @@ public abstract class ListeningMessageSearchIndex<Id extends MailboxId> implemen
     
     
     /**
-     * Update the {@link MessageRange} for the given {@link Mailbox} with the new {@link Flags} in the index
+     * Update the messages concerned by the updated flags list for the given {@link Mailbox}
      *
-     * @param session
-     * @param mailbox
-     * @param range
-     * @param flags
+     * @param session session that performed the update
+     * @param mailbox mailbox containing the updated messages
+     * @param updatedFlagsList list of flags that were updated
      * @throws MailboxException
      */
-    public abstract void update(MailboxSession session, Mailbox<Id> mailbox, MessageRange range, Flags flags, long modseq) throws MailboxException;
+    public abstract void update(MailboxSession session, Mailbox<Id> mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException;
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[13/18] james-project git commit: MAILBOX-266 Sorts should work

Posted by bt...@apache.org.
MAILBOX-266 Sorts should work


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7f02ab71
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7f02ab71
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7f02ab71

Branch: refs/heads/master
Commit: 7f02ab719453f704fbf39f67a6784b76dc2a2ae9
Parents: f9717d2
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 16:27:07 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../elasticsearch/IndexCreationFactory.java     |  28 +++-
 .../elasticsearch/NodeMappingFactory.java       |  25 ++++
 .../elasticsearch/query/SortConverter.java      |  36 ++++--
 .../ElasticSearchIntegrationTest.java           | 127 ++++++++++++++++++-
 .../src/test/resources/documents/mail1.eml      |   4 +-
 .../src/test/resources/documents/mail2.eml      |   5 +-
 .../src/test/resources/documents/mail3.eml      |   5 +-
 .../src/test/resources/documents/mail4.eml      |   2 +-
 8 files changed, 202 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
index 71a6c11..6cf0933 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/IndexCreationFactory.java
@@ -19,10 +19,12 @@
 
 package org.apache.james.mailbox.elasticsearch;
 
+import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
+
 import java.io.IOException;
 
 import org.elasticsearch.client.Client;
-import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.indices.IndexAlreadyExistsException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,6 +34,7 @@ public class IndexCreationFactory {
     private static final Logger LOGGER = LoggerFactory.getLogger(IndexCreationFactory.class);
     private static final int DEFAULT_NB_SHARDS = 1;
     private static final int DEFAULT_NB_REPLICA = 0;
+    public static final String CASE_INSENSITIVE = "case_insensitive";
 
     public static ClientProvider createIndex(ClientProvider clientProvider, int nbShards, int nbReplica) {
         try {
@@ -46,7 +49,7 @@ public class IndexCreationFactory {
         return createIndex(clientProvider, DEFAULT_NB_SHARDS, DEFAULT_NB_REPLICA);
     }
 
-    private static ClientProvider createIndex(ClientProvider clientProvider, Settings settings) {
+    private static ClientProvider createIndex(ClientProvider clientProvider, XContentBuilder settings) {
         try {
             try (Client client = clientProvider.get()) {
                 client.admin()
@@ -62,11 +65,22 @@ public class IndexCreationFactory {
         return clientProvider;
     }
 
-    private static Settings generateSetting(int nbShards, int nbReplica) throws IOException {
-        return Settings.builder()
-            .put("number_of_shards", nbShards)
-            .put("number_of_replicas", nbReplica)
-            .build();
+    private static XContentBuilder generateSetting(int nbShards, int nbReplica) throws IOException {
+        return jsonBuilder()
+            .startObject()
+                .field("number_of_shards", nbShards)
+                .field("number_of_replicas", nbReplica)
+                .startObject("analysis")
+                    .startObject("analyzer")
+                        .startObject(CASE_INSENSITIVE)
+                            .field("tokenizer", "keyword")
+                            .startArray("filter")
+                                .value("lowercase")
+                            .endArray()
+                        .endObject()
+                    .endObject()
+                .endObject()
+            .endObject();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
index 758f3c2..85b5b05 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/NodeMappingFactory.java
@@ -41,6 +41,9 @@ public class NodeMappingFactory {
     public static final String DATE = "date";
     public static final String FORMAT = "format";
     public static final String NESTED = "nested";
+    public static final String FIELDS = "fields";
+    public static final String RAW = "raw";
+    public static final String ANALYZER = "analyzer";
 
     public static ClientProvider applyMapping(ClientProvider clientProvider) {
         return applyMapping(clientProvider, getMappingContent());
@@ -118,6 +121,12 @@ public class NodeMappingFactory {
                                 .startObject(PROPERTIES)
                                     .startObject(JsonMessageConstants.EMailer.NAME)
                                         .field(TYPE, STRING)
+                                        .startObject(FIELDS)
+                                            .startObject(RAW)
+                                                .field(TYPE, STRING)
+                                                .field(ANALYZER, IndexCreationFactory.CASE_INSENSITIVE)
+                                            .endObject()
+                                        .endObject()
                                     .endObject()
                                     .startObject(JsonMessageConstants.EMailer.ADDRESS)
                                         .field(TYPE, STRING)
@@ -126,11 +135,27 @@ public class NodeMappingFactory {
                                 .endObject()
                             .endObject()
 
+                            .startObject(JsonMessageConstants.SUBJECT)
+                                .field(TYPE, STRING)
+                                .startObject(FIELDS)
+                                    .startObject(RAW)
+                                        .field(TYPE, STRING)
+                                        .field(ANALYZER, IndexCreationFactory.CASE_INSENSITIVE)
+                                    .endObject()
+                                .endObject()
+                            .endObject()
+
                             .startObject(JsonMessageConstants.TO)
                                 .field(TYPE, NESTED)
                                 .startObject(PROPERTIES)
                                     .startObject(JsonMessageConstants.EMailer.NAME)
                                         .field(TYPE, STRING)
+                                        .startObject(FIELDS)
+                                            .startObject(RAW)
+                                                .field(TYPE, STRING)
+                                                .field(ANALYZER, IndexCreationFactory.CASE_INSENSITIVE)
+                                            .endObject()
+                                        .endObject()
                                     .endObject()
                                     .startObject(JsonMessageConstants.EMailer.ADDRESS)
                                         .field(TYPE, STRING)

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
index 7ac74ea..5644239 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/SortConverter.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.elasticsearch.query;
 
+import org.apache.james.mailbox.elasticsearch.NodeMappingFactory;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.elasticsearch.search.sort.FieldSortBuilder;
@@ -27,33 +28,42 @@ import org.elasticsearch.search.sort.SortOrder;
 
 public class SortConverter {
 
+    private static final String MIN = "min";
+    private static final String PATH_SEPARATOR = ".";
+
     public static FieldSortBuilder convertSort(SearchQuery.Sort sort) {
-        return SortBuilders.fieldSort(getFieldFromClause(sort.getSortClause()))
-            .order(getOrder(sort));
+        return getSortClause(sort.getSortClause())
+            .order(getOrder(sort))
+            .sortMode(MIN);
     }
 
-    private static String getFieldFromClause(SearchQuery.Sort.SortClause clause) {
+    private static FieldSortBuilder getSortClause(SearchQuery.Sort.SortClause clause) {
         switch (clause) {
             case Arrival :
-                return JsonMessageConstants.DATE;
+                return SortBuilders.fieldSort(JsonMessageConstants.DATE);
             case MailboxCc :
-                return JsonMessageConstants.CC;
+                return SortBuilders.fieldSort(JsonMessageConstants.CC + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
+                    .setNestedPath(JsonMessageConstants.CC);
             case MailboxFrom :
-                return JsonMessageConstants.FROM + "." + JsonMessageConstants.EMailer.ADDRESS;
+                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
+                    .setNestedPath(JsonMessageConstants.FROM);
             case MailboxTo :
-                return JsonMessageConstants.TO + "." + JsonMessageConstants.EMailer.ADDRESS;
+                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.ADDRESS)
+                    .setNestedPath(JsonMessageConstants.TO);
             case BaseSubject :
-                return JsonMessageConstants.SUBJECT;
+                return SortBuilders.fieldSort(JsonMessageConstants.SUBJECT);
             case Size :
-                return JsonMessageConstants.SIZE;
+                return SortBuilders.fieldSort(JsonMessageConstants.SIZE);
             case SentDate :
-                return JsonMessageConstants.DATE;
+                return SortBuilders.fieldSort(JsonMessageConstants.SENT_DATE);
             case Uid :
-                return JsonMessageConstants.ID;
+                return SortBuilders.fieldSort(JsonMessageConstants.ID);
             case DisplayFrom:
-                return JsonMessageConstants.FROM + "." + JsonMessageConstants.EMailer.NAME;
+                return SortBuilders.fieldSort(JsonMessageConstants.FROM + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME + PATH_SEPARATOR + NodeMappingFactory.RAW)
+                    .setNestedPath(JsonMessageConstants.FROM);
             case DisplayTo:
-                return JsonMessageConstants.TO + "." + JsonMessageConstants.EMailer.NAME;
+                return SortBuilders.fieldSort(JsonMessageConstants.TO + PATH_SEPARATOR + JsonMessageConstants.EMailer.NAME + PATH_SEPARATOR + NodeMappingFactory.RAW)
+                    .setNestedPath(JsonMessageConstants.TO);
             default:
                 throw new RuntimeException("Sort is not implemented");
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 832e4a6..e2ddc84 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -50,7 +50,6 @@ 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.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.RuleChain;
@@ -63,8 +62,8 @@ import com.google.common.collect.Lists;
 public class ElasticSearchIntegrationTest {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchIntegrationTest.class);
-    public static final int BATCH_SIZE = 1;
-    public static final int SEARCH_SIZE = 1;
+    private static final int BATCH_SIZE = 1;
+    private static final int SEARCH_SIZE = 1;
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
     private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
@@ -578,4 +577,126 @@ public class ElasticSearchIntegrationTest {
             .containsOnly(1L, 6L);
     }
 
+    @Test
+    public void sortOnCcShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxCc)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(3L, 5L, 4L, 2L);
+        // 2 : No cc
+        // 3 : Cc : abc@abc.org
+        // 4 : zzz@bcd.org
+        // 5 : any@any.com
+    }
+
+    @Test
+    public void sortOnFromShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxFrom)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(3L, 2L, 4L, 5L);
+        // 2 : jira2@apache.org
+        // 3 : jira1@apache.org
+        // 4 : jira@apache.org
+        // 5 : mailet-api@james.apache.org
+    }
+
+    @Test
+    public void sortOnToShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.MailboxTo)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(5L, 2L, 3L, 4L);
+        // 2 : server-dev@james.apache.org
+        // 3 : server-dev@james.apache.org
+        // 4 : server-dev@james.apache.org
+        // 5 : mailet-api@james.apache.org
+    }
+
+    @Test
+    public void sortOnSubjectShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.BaseSubject)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(4L, 3L, 2L, 5L);
+        // 2 : [jira] [Created] (MAILBOX-234) Convert Message into JSON
+        // 3 : [jira] [Closed] (MAILBOX-217) We should index attachment in elastic search
+        // 4 : [jira] [Closed] (MAILBOX-11) MailboxQuery ignore namespace
+        // 5 : [jira] [Resolved] (MAILET-94) James Mailet should use latest version of other James subprojects
+    }
+
+    @Test
+    public void sortOnSizeShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Size)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(2L, 3L, 5L, 4L);
+        // 2 : 3210 o
+        // 3 : 3647 o
+        // 4 : 4360 o
+        // 5 : 3653 o
+    }
+
+    @Test
+    public void sortOnDisplayFromShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayFrom)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(4L, 3L, 5L, 2L);
+        // 2 : Tellier Benoit (JIRA)
+        // 3 : efij
+        // 4 : abcd
+        // 5 : Eric Charles (JIRA)
+    }
+
+    @Test
+    public void sortOnDisplayToShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.DisplayTo)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(3L, 2L, 4L, 5L);
+        // 2 : abc
+        // 3 : aaa
+        // 4 : server
+        // 5 : zzz
+    }
+
+    @Test
+    public void sortOnSentDateShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.SentDate)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(5L, 4L, 2L, 3L);
+        // 2 : 4 Jun 2015 09:23:37
+        // 3 : 4 Jun 2015 09:27:37
+        // 4 : 2 Jun 2015 08:16:19
+        // 5 : 15 May 2015 06:35:59
+    }
+
+    @Test
+    public void sortOnIdShouldWork() throws Exception {
+        SearchQuery searchQuery = new SearchQuery();
+        SearchQuery.NumericRange[] numericRanges = {new SearchQuery.NumericRange(2L, 5L)};
+        searchQuery.andCriteria(SearchQuery.uid(numericRanges));
+        searchQuery.setSorts(Lists.newArrayList(new SearchQuery.Sort(SearchQuery.Sort.SortClause.Uid)));
+        assertThat(elasticSearchListeningMessageSearchIndex.search(session, mailbox, searchQuery))
+            .containsExactly(2L, 3L, 4L, 5L);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/test/resources/documents/mail1.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/mail1.eml b/mailbox/elasticsearch/src/test/resources/documents/mail1.eml
index 3d596f7..3850a62 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/mail1.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/mail1.eml
@@ -33,8 +33,8 @@ 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 (UTC)
-From: "Tellier Benoit (JIRA)" <ji...@apache.org>
-To: server-dev@james.apache.org
+From: "Tellier Benoit (JIRA)" <ji...@apache.org>
+To: "abc" <se...@james.apache.org>
 Message-ID: <JI...@Atlassian.JIRA>
 In-Reply-To: <JI...@Atlassian.JIRA>
 References: <JI...@Atlassian.JIRA> <JI...@arcas>

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/test/resources/documents/mail2.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/mail2.eml b/mailbox/elasticsearch/src/test/resources/documents/mail2.eml
index 5f361de..9c2c413 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/mail2.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/mail2.eml
@@ -33,8 +33,9 @@ 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 (UTC)
-From: "Tellier Benoit (JIRA)" <ji...@apache.org>
-To: server-dev@james.apache.org
+From: "efij" <ji...@apache.org>
+To: "aaa" <se...@james.apache.org>
+Cc: abc@abc.org
 Message-ID: <JI...@Atlassian.JIRA>
 In-Reply-To: <JI...@Atlassian.JIRA>
 References: <JI...@Atlassian.JIRA> <JI...@arcas>

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/test/resources/documents/mail3.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/mail3.eml b/mailbox/elasticsearch/src/test/resources/documents/mail3.eml
index 1e7f788..e9cc325 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/mail3.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/mail3.eml
@@ -35,8 +35,9 @@ 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 (UTC)
-From: "Eric Charles (JIRA)" <ji...@apache.org>
-To: server-dev@james.apache.org
+From: "abcd" <ji...@apache.org>
+Cc: zzz@bcd.org
+To: "server" <se...@james.apache.org>
 Message-ID: <JI...@Atlassian.JIRA>
 In-Reply-To: <JI...@Atlassian.JIRA>
 References: <JI...@Atlassian.JIRA> <JI...@arcas>

http://git-wip-us.apache.org/repos/asf/james-project/blob/7f02ab71/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/resources/documents/mail4.eml b/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
index 584b24c..37ecba1 100644
--- a/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
+++ b/mailbox/elasticsearch/src/test/resources/documents/mail4.eml
@@ -36,7 +36,7 @@ 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 (UTC)
 From: "Eric Charles (JIRA)" <ma...@james.apache.org>
-To: mailet-api@james.apache.org
+To: "zzz" <ma...@james.apache.org>
 Cc: any@any.com
 Bcc: any@any.com
 Message-ID: <JI...@Atlassian.JIRA>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[10/18] james-project git commit: MAILBOX-266 Set the size of SearchResponses to 1 in ElasticSearch tests

Posted by bt...@apache.org.
MAILBOX-266 Set the size of SearchResponses to 1 in ElasticSearch tests

This allows to ensure Scrolls are well performed


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/b99d0c7f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/b99d0c7f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/b99d0c7f

Branch: refs/heads/master
Commit: b99d0c7f0164e431a4cbaa3e8e8fc19030ba3a6a
Parents: 6ba31a6
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Mar 28 10:26:36 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Apr 6 16:18:45 2016 +0700

----------------------------------------------------------------------
 .../mailbox/elasticsearch/DeleteByQueryPerformer.java  | 13 +++++++++++--
 .../elasticsearch/search/ElasticSearchSearcher.java    | 12 ++++++++++--
 .../elasticsearch/ElasticSearchIndexerTest.java        |  3 ++-
 .../elasticsearch/ElasticSearchIntegrationTest.java    |  6 ++++--
 4 files changed, 27 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/b99d0c7f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
index 9d266ce..895f016 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/DeleteByQueryPerformer.java
@@ -34,17 +34,26 @@ import org.elasticsearch.common.unit.TimeValue;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.search.SearchHit;
 
+import com.google.common.annotations.VisibleForTesting;
+
 public class DeleteByQueryPerformer {
-    public static final int BATCH_SIZE = 100;
+    public static final int DEFAULT_BATCH_SIZE = 100;
     public static final TimeValue TIMEOUT = new TimeValue(60000);
 
     private final ClientProvider clientProvider;
     private final ExecutorService executor;
+    private final int batchSize;
 
     @Inject
     public DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor) {
+        this(clientProvider, executor, DEFAULT_BATCH_SIZE);
+    }
+
+    @VisibleForTesting
+    DeleteByQueryPerformer(ClientProvider clientProvider, @Named("AsyncExecutor") ExecutorService executor, int batchSize) {
         this.clientProvider = clientProvider;
         this.executor = executor;
+        this.batchSize = batchSize;
     }
 
     public void perform(QueryBuilder queryBuilder) {
@@ -59,7 +68,7 @@ public class DeleteByQueryPerformer {
                     .setScroll(TIMEOUT)
                     .setNoFields()
                     .setQuery(queryBuilder)
-                    .setSize(BATCH_SIZE));
+                    .setSize(batchSize));
             for (SearchResponse searchResponse : scrollIterable) {
                 deleteRetrievedIds(client, searchResponse);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b99d0c7f/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
index 96d90b5..ab4698e 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/search/ElasticSearchSearcher.java
@@ -46,14 +46,22 @@ import org.slf4j.LoggerFactory;
 public class ElasticSearchSearcher<Id extends MailboxId> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSearcher.class);
+    private static final TimeValue TIMEOUT = new TimeValue(60000);
+    public static final int DEFAULT_SIZE = 100;
 
     private final ClientProvider clientProvider;
     private final QueryConverter queryConverter;
+    private final int size;
 
     @Inject
     public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter) {
+        this(clientProvider, queryConverter, DEFAULT_SIZE);
+    }
+
+    public ElasticSearchSearcher(ClientProvider clientProvider, QueryConverter queryConverter, int size) {
         this.clientProvider = clientProvider;
         this.queryConverter = queryConverter;
+        this.size = size;
     }
 
     public Iterator<Long> search(Mailbox<Id> mailbox, SearchQuery searchQuery) throws MailboxException {
@@ -70,9 +78,9 @@ public class ElasticSearchSearcher<Id extends MailboxId> {
             .reduce(
                 client.prepareSearch(ElasticSearchIndexer.MAILBOX_INDEX)
                     .setTypes(ElasticSearchIndexer.MESSAGE_TYPE)
-                    .setScroll(new TimeValue(60000))
+                    .setScroll(TIMEOUT)
                     .setQuery(queryConverter.from(searchQuery, mailbox.getMailboxId().serialize()))
-                    .setSize(100),
+                    .setSize(size),
                 (searchBuilder, sort) -> searchBuilder.addSort(SortConverter.convertSort(sort)),
                 (partialResult1, partialResult2) -> partialResult1);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/b99d0c7f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
index 1e4ce1a..7501c57 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIndexerTest.java
@@ -41,6 +41,7 @@ import com.google.common.collect.Lists;
 
 public class ElasticSearchIndexerTest {
 
+    public static final int MINIMUM_BATCH_SIZE = 1;
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
     private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
 
@@ -55,7 +56,7 @@ public class ElasticSearchIndexerTest {
     public void setup() throws IOException {
         node = embeddedElasticSearch.getNode();
         TestingClientProvider clientProvider = new TestingClientProvider(node);
-        deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor());
+        deleteByQueryPerformer = new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), MINIMUM_BATCH_SIZE);
         testee = new ElasticSearchIndexer(clientProvider, deleteByQueryPerformer);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/b99d0c7f/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 2f5962e..9b90b72 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -62,6 +62,8 @@ import com.google.common.collect.Lists;
 public class ElasticSearchIntegrationTest {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchIntegrationTest.class);
+    public static final int BATCH_SIZE = 1;
+    public static final int SEARCH_SIZE = 1;
 
     private TemporaryFolder temporaryFolder = new TemporaryFolder();
     private EmbeddedElasticSearch embeddedElasticSearch= new EmbeddedElasticSearch(temporaryFolder);
@@ -168,8 +170,8 @@ public class ElasticSearchIntegrationTest {
         );
         MailboxSessionMapperFactory<InMemoryId> mapperFactory = new InMemoryMailboxSessionMapperFactory();
         elasticSearchListeningMessageSearchIndex = new ElasticSearchListeningMessageSearchIndex<>(mapperFactory,
-            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor())),
-            new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter())),
+            new ElasticSearchIndexer(clientProvider, new DeleteByQueryPerformer(clientProvider, Executors.newSingleThreadExecutor(), BATCH_SIZE)),
+            new ElasticSearchSearcher<>(clientProvider, new QueryConverter(new CriterionConverter()), SEARCH_SIZE),
             new MessageToElasticSearchJson(new DefaultTextExtractor(), ZoneId.of("Europe/Paris")));
         storeMailboxManager = new StoreMailboxManager<>(
             mapperFactory,


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org