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 2019/06/07 10:59:08 UTC

[james-project] branch master updated (26131bc -> f9fe42c)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from 26131bc  JAMES-2783 use the updated ES extension for ES reporter tests
     new 201dd2d  JAMES-2726 Fake (Listening) MessageSearchIndex should not be processing events
     new a633935  JAMES-2774 remove duplicated test (rebase issue)
     new 5bf49a7  JAMES-2777 James should close ElasticSearch scroll context
     new 9d61daf  JAMES-2774 Solve some intelliJ warnings in RabbitMQ EventBus tests
     new 97f0ed7  JAMES-2774 Some assertions where not played in RabbitMQ EventBus tests
     new 1038a90  JAMES-2526 UnauthorizedEndpoint can be performed on a single James server
     new f9fe42c  JAMES-2279 Write a WithPriority mailet and HasPriority matchers

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../james/backends/es/DeleteByQueryPerformer.java  |   4 +-
 .../{ScrollIterable.java => ScrolledSearch.java}   |  59 ++++++++----
 ...llIterableTest.java => ScrolledSearchTest.java} |  24 ++---
 .../org/apache/james/mailbox/MessageManager.java   |   3 +-
 .../ElasticSearchListeningMessageSearchIndex.java  |  27 +++---
 .../search/ElasticSearchSearcher.java              |  24 ++---
 .../james/mailbox/events/RabbitMQEventBusTest.java |  47 +++-------
 .../lucene/search/LuceneMessageSearchIndex.java    |   6 +-
 .../LuceneMailboxMessageSearchIndexTest.java       | 102 ++++++++++----------
 .../james/vault/DeletedMessageVaultHookTest.java   |  13 +--
 .../elasticsearch/ElasticSearchQuotaSearcher.java  |  17 ++--
 .../james/mailbox/store/StoreMessageManager.java   |   7 +-
 .../store/search/LazyMessageSearchIndex.java       |   3 +-
 .../mailbox/store/search/MessageSearchIndex.java   |   4 +-
 .../store/search/SimpleMessageSearchIndex.java     |   5 +-
 .../search/AbstractMessageSearchIndexTest.java     |   3 +-
 .../imap/processor/AbstractMailboxProcessor.java   |   6 +-
 .../james/imap/processor/SearchProcessor.java      |  51 +++++-----
 .../imap/processor/base/SelectedMailboxImpl.java   |   8 +-
 .../james/imap/processor/SearchProcessorTest.java  |   3 +-
 .../processor/base/MailboxEventAnalyserTest.java   |   5 +-
 .../processor/base/SelectedMailboxImplTest.java    |   7 +-
 server/app/src/main/resources/mailetcontainer.xml  |  11 ++-
 .../org/apache/james/FakeMessageSearchIndex.java   |   4 +-
 .../org/apache/james/FakeSearchMailboxModule.java  |   6 --
 .../james/transport/mailets/WithPriority.java      |  16 ++--
 .../matchers/AbstractPriorityMatcher.java          |  50 +++++-----
 .../james/transport/matchers/AtLeastPriority.java} |  14 ++-
 .../james/transport/matchers/AtMostPriority.java}  |  14 ++-
 .../james/transport/matchers/HasPriority.java}     |  14 ++-
 ...InNetworkTest.java => AtLeastPriorityTest.java} |  93 +++++++------------
 ...rInNetworkTest.java => AtMostPriorityTest.java} |  88 ++++++------------
 .../james/transport/matchers/HasPriorityTest.java  |  66 +++++++------
 .../integration/CassandraJmapExtension.java        | 103 ++++++++++++++++++++-
 .../integration/UnauthorizedEndpointsTest.java     |  10 +-
 35 files changed, 486 insertions(+), 431 deletions(-)
 rename backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/{ScrollIterable.java => ScrolledSearch.java} (73%)
 rename backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/{ScrollIterableTest.java => ScrolledSearchTest.java} (91%)
 copy mailet/standard/src/main/java/org/apache/james/transport/matchers/TooManyLines.java => server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java (62%)
 copy server/{protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/cucumber/CucumberCassandraSingleton.java => mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java} (83%)
 copy server/{protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/cucumber/CucumberCassandraSingleton.java => mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java} (83%)
 copy server/{protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/cucumber/CucumberCassandraSingleton.java => mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java} (83%)
 copy server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/{RemoteAddrInNetworkTest.java => AtLeastPriorityTest.java} (51%)
 copy server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/{RemoteAddrInNetworkTest.java => AtMostPriorityTest.java} (50%)
 copy mailet/standard/src/test/java/org/apache/james/transport/matchers/IsSingleRecipientTest.java => server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java (52%)


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


[james-project] 07/07: JAMES-2279 Write a WithPriority mailet and HasPriority matchers

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f9fe42c18456c31810d2827b7a3270762af40135
Author: ilker yıldırım <il...@gmail.com>
AuthorDate: Sun Feb 3 03:22:45 2019 +0300

    JAMES-2279 Write a WithPriority mailet and HasPriority matchers
    
    Many thanks to ilker yıldırım for this nice contribution!
---
 server/app/src/main/resources/mailetcontainer.xml  | 11 ++-
 .../james/transport/mailets/WithPriority.java      | 16 ++--
 .../AbstractPriorityMatcher.java}                  | 65 ++++++++--------
 .../james/transport/matchers/AtLeastPriority.java  | 31 ++++++++
 .../james/transport/matchers/AtMostPriority.java   | 31 ++++++++
 .../james/transport/matchers/HasPriority.java      | 31 ++++++++
 .../transport/matchers/AtLeastPriorityTest.java    | 86 ++++++++++++++++++++++
 .../transport/matchers/AtMostPriorityTest.java     | 85 +++++++++++++++++++++
 .../james/transport/matchers/HasPriorityTest.java  | 77 +++++++++++++++++++
 9 files changed, 393 insertions(+), 40 deletions(-)

diff --git a/server/app/src/main/resources/mailetcontainer.xml b/server/app/src/main/resources/mailetcontainer.xml
index ae84957..b193bfc 100644
--- a/server/app/src/main/resources/mailetcontainer.xml
+++ b/server/app/src/main/resources/mailetcontainer.xml
@@ -56,7 +56,16 @@
        <!-- Important check to avoid looping -->
        <mailet match="RelayLimit=30" class="Null"/>
 
-       <!-- Check attachment extensions for possible viruses -->
+        <mailet matcher="All" class="WithPriority">
+            <value>8</value>
+        </mailet>
+
+        <mailet matcher="HasPriority=8" class="Null"/>
+        <mailet matcher="AtLeastPriority=8" class="Null"/>
+        <mailet matcher="AtMostPriority=8" class="Null"/>
+
+
+        <!-- Check attachment extensions for possible viruses -->
        <!-- The "-z" option requests the check to be non-recursively applied -->
        <!-- to the contents of any attached '*.zip' file. -->
        <!-- 
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
index 3138f4b..3fc9776 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
@@ -50,17 +50,17 @@ public class WithPriority extends GenericMailet {
     @Override
     public void init() throws MessagingException {
         Integer priorityRaw = Optional.ofNullable(getInitParameter("priority", null))
-            .map(Integer::valueOf)
-            .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
+                .map(Integer::valueOf)
+                .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
 
         if (priorityRaw < 0 || priorityRaw > 9) {
             throw new IllegalArgumentException("Invalid priority: Priority should be from 0 to 9");
+            }
+            priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
         }
-        priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
-    }
 
-    @Override
-    public void service(Mail mail) throws MessagingException {
-        mail.setAttribute(priority);
+        @Override
+        public void service(Mail mail) throws MessagingException {
+            mail.setAttribute(priority);
+        }
     }
-}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
similarity index 51%
copy from server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
copy to server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
index 3138f4b..18170fd 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/WithPriority.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AbstractPriorityMatcher.java
@@ -16,51 +16,54 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+package org.apache.james.transport.matchers;
 
-package org.apache.james.transport.mailets;
-
-import java.util.Optional;
-
+import java.util.Collection;
 import javax.mail.MessagingException;
 
+import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailPrioritySupport;
-import org.apache.mailet.Attribute;
-import org.apache.mailet.AttributeValue;
+import org.apache.mailet.AttributeUtils;
 import org.apache.mailet.Mail;
-import org.apache.mailet.base.GenericMailet;
+import org.apache.mailet.base.GenericMatcher;
+import org.apache.mailet.base.MailetUtil;
 
-/**
- * This mailet sets the priority of the incoming mail.
- *
- * Example configuration:
- *
- * <mailet match="All" class="WithPriority">
- *     <priority>7</priority>
- * </mailet>
- */
-public class WithPriority extends GenericMailet {
+import com.google.common.collect.ImmutableList;
 
-    private Attribute priority;
 
-    @Override
-    public String getMailetInfo() {
-        return "With Priority Mailet";
+public abstract class AbstractPriorityMatcher extends GenericMatcher {
+    private final String priorityMatcherName;
+    private Integer priority;
+
+    public AbstractPriorityMatcher(String priorityMatcherName) {
+        this.priorityMatcherName = priorityMatcherName;
     }
 
     @Override
     public void init() throws MessagingException {
-        Integer priorityRaw = Optional.ofNullable(getInitParameter("priority", null))
-            .map(Integer::valueOf)
-            .orElseThrow(() -> new IllegalArgumentException("'priority' init parameter is compulsory"));
-
-        if (priorityRaw < 0 || priorityRaw > 9) {
-            throw new IllegalArgumentException("Invalid priority: Priority should be from 0 to 9");
-        }
-        priority = new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priorityRaw));
+        Integer priority = MailetUtil.getInitParameterAsStrictlyPositiveInteger(getCondition());
+        this.setPriority(priority);
     }
 
     @Override
-    public void service(Mail mail) throws MessagingException {
-        mail.setAttribute(priority);
+    public Collection<MailAddress> match(Mail mail) throws MessagingException {
+        return AttributeUtils.getValueAndCastFromMail(mail, MailPrioritySupport.MAIL_PRIORITY, Integer.class)
+                .filter(this::priorityMatch)
+                .map(any -> mail.getRecipients())
+                .orElse(ImmutableList.of());
+    }
+
+    public abstract boolean priorityMatch(Integer mailPriorityValue);
+
+    public Integer getPriority() {
+        return priority;
+    }
+
+    public void setPriority(Integer priority) {
+        this.priority = priority;
+    }
+
+    public String getPriorityMatcherName() {
+        return priorityMatcherName;
     }
 }
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.java
new file mode 100644
index 0000000..0dc93be
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtLeastPriority.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.transport.matchers;
+
+public class AtLeastPriority extends AbstractPriorityMatcher {
+    public AtLeastPriority() {
+        super("AtLeastPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() <= mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.java
new file mode 100644
index 0000000..0faf109
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/AtMostPriority.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.transport.matchers;
+
+public class AtMostPriority extends AbstractPriorityMatcher {
+    public AtMostPriority() {
+        super("AtMostPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() >= mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.java
new file mode 100644
index 0000000..ec3197f
--- /dev/null
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/HasPriority.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.transport.matchers;
+
+public class HasPriority extends AbstractPriorityMatcher {
+    public HasPriority() {
+        super("HasPriority");
+    }
+
+    @Override
+    public boolean priorityMatch(Integer mailPriorityValue) {
+        return this.getPriority() == mailPriorityValue;
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java
new file mode 100644
index 0000000..0b3d916
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtLeastPriorityTest.java
@@ -0,0 +1,86 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+public class AtLeastPriorityTest {
+    protected AtLeastPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new AtLeastPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(3);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldMatchWhenMailHasHigherPriority() throws MessagingException {
+        FakeMail fakeMail = createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java
new file mode 100644
index 0000000..cb9de9b
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/AtMostPriorityTest.java
@@ -0,0 +1,85 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Before;
+import org.junit.Test;
+
+public class AtMostPriorityTest{
+    protected AtMostPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new AtMostPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldMatchWhenMailHasLowerPriority() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(3);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+}
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java
new file mode 100644
index 0000000..d521db3
--- /dev/null
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/HasPriorityTest.java
@@ -0,0 +1,77 @@
+/****************************************************************
+ * 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.transport.matchers;
+
+import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailPrioritySupport;
+import org.apache.mailet.Attribute;
+import org.apache.mailet.AttributeValue;
+import org.apache.mailet.base.test.FakeMail;
+import org.apache.mailet.base.test.FakeMatcherConfig;
+
+import java.util.Collection;
+import javax.mail.MessagingException;
+import org.junit.Before;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class HasPriorityTest {
+    protected HasPriority matcher;
+    protected MailAddress testRecipient;
+    private final String condition = "5";
+
+    private FakeMail createFakeMail(Integer priority) throws MessagingException {
+        FakeMail fakeMail = FakeMail.builder().name("test-message")
+                .recipient(testRecipient)
+                .attribute(new Attribute(MailPrioritySupport.MAIL_PRIORITY, AttributeValue.of(priority)))
+                .build();
+        return fakeMail;
+    }
+
+    @Before
+    public void setup() throws MessagingException {
+        this.matcher = new HasPriority();
+        FakeMatcherConfig matcherConfig = FakeMatcherConfig.builder()
+                .matcherName(matcher.getPriorityMatcherName())
+                .condition(condition)
+                .build();
+
+        matcher.init(matcherConfig);
+        testRecipient = new MailAddress("test@james.apache.org");
+    }
+
+    @Test
+    public void shouldMatchWhenPriorityMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(5);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).containsOnly(testRecipient);
+    }
+
+    @Test
+    public void shouldNotMatchWhenPriorityDoesNotMatch() throws MessagingException {
+        FakeMail fakeMail = this.createFakeMail(7);
+
+        Collection<MailAddress> actual = matcher.match(fakeMail);
+
+        assertThat(actual).isEmpty();
+    }
+
+}


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


[james-project] 01/07: JAMES-2726 Fake (Listening) MessageSearchIndex should not be processing events

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 201dd2da88080be8bdc24cc5e67ffddb576a4707
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jun 6 17:47:14 2019 +0700

    JAMES-2726 Fake (Listening) MessageSearchIndex should not be processing events
    
    Obviously, this will fail, generating uselessLogs output, and filling EventDeadLetters.
---
 .../src/main/java/org/apache/james/FakeSearchMailboxModule.java     | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeSearchMailboxModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeSearchMailboxModule.java
index ec25c30..4862c6c 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeSearchMailboxModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeSearchMailboxModule.java
@@ -19,12 +19,10 @@
 
 package org.apache.james;
 
-import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
 
 public class FakeSearchMailboxModule extends AbstractModule {
 
@@ -32,9 +30,5 @@ public class FakeSearchMailboxModule extends AbstractModule {
     protected void configure() {
         bind(FakeMessageSearchIndex.class).in(Scopes.SINGLETON);
         bind(ListeningMessageSearchIndex.class).to(FakeMessageSearchIndex.class);
-
-        Multibinder.newSetBinder(binder(), MailboxListener.GroupMailboxListener.class)
-                .addBinding()
-                .to(FakeMessageSearchIndex.class);
     }
 }


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


[james-project] 05/07: JAMES-2774 Some assertions where not played in RabbitMQ EventBus tests

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 97f0ed75ad7776d99fd3a5783f3f7f7e8e37bed8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jun 6 11:04:19 2019 +0700

    JAMES-2774 Some assertions where not played in RabbitMQ EventBus tests
---
 .../org/apache/james/mailbox/events/RabbitMQEventBusTest.java     | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index b7b2da9..49f0f15 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -498,7 +498,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                 eventBus.stop();
 
                 assertThat(rabbitManagementAPI.listExchanges())
-                    .anySatisfy(exchange -> exchange.getName().equals(MAILBOX_EVENT_EXCHANGE_NAME));
+                    .anySatisfy(exchange -> assertThat(exchange.getName()).isEqualTo(MAILBOX_EVENT_EXCHANGE_NAME));
             }
 
             @Test
@@ -508,7 +508,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                 eventBus.stop();
 
                 assertThat(rabbitManagementAPI.listQueues())
-                    .anySatisfy(queue -> queue.getName().contains(GroupA.class.getName()));
+                    .anySatisfy(queue -> assertThat(queue.getName()).contains(GroupA.class.getName()));
             }
 
             @Test
@@ -590,7 +590,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                 eventBus3.stop();
 
                 assertThat(rabbitManagementAPI.listExchanges())
-                    .anySatisfy(exchange -> exchange.getName().equals(MAILBOX_EVENT_EXCHANGE_NAME));
+                    .anySatisfy(exchange -> assertThat(exchange.getName()).isEqualTo(MAILBOX_EVENT_EXCHANGE_NAME));
             }
 
             @Test
@@ -602,7 +602,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                 eventBus3.stop();
 
                 assertThat(rabbitManagementAPI.listQueues())
-                    .anySatisfy(queue -> queue.getName().contains(GroupA.class.getName()));
+                    .anySatisfy(queue -> assertThat(queue.getName()).contains(GroupA.class.getName()));
             }
 
             @Test


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


[james-project] 03/07: JAMES-2777 James should close ElasticSearch scroll context

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5bf49a7c57210a929203a4da28b2211cb4f36faf
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 22 13:12:19 2019 +0700

    JAMES-2777 James should close ElasticSearch scroll context
---
 .../james/backends/es/DeleteByQueryPerformer.java  |   4 +-
 .../{ScrollIterable.java => ScrolledSearch.java}   |  59 ++++++++----
 ...llIterableTest.java => ScrolledSearchTest.java} |  24 ++---
 .../org/apache/james/mailbox/MessageManager.java   |   3 +-
 .../ElasticSearchListeningMessageSearchIndex.java  |  27 +++---
 .../search/ElasticSearchSearcher.java              |  24 ++---
 .../lucene/search/LuceneMessageSearchIndex.java    |   6 +-
 .../LuceneMailboxMessageSearchIndexTest.java       | 102 ++++++++++-----------
 .../james/vault/DeletedMessageVaultHookTest.java   |  13 +--
 .../elasticsearch/ElasticSearchQuotaSearcher.java  |  17 ++--
 .../james/mailbox/store/StoreMessageManager.java   |   7 +-
 .../store/search/LazyMessageSearchIndex.java       |   3 +-
 .../mailbox/store/search/MessageSearchIndex.java   |   4 +-
 .../store/search/SimpleMessageSearchIndex.java     |   5 +-
 .../search/AbstractMessageSearchIndexTest.java     |   3 +-
 .../imap/processor/AbstractMailboxProcessor.java   |   6 +-
 .../james/imap/processor/SearchProcessor.java      |  51 ++++++-----
 .../imap/processor/base/SelectedMailboxImpl.java   |   8 +-
 .../james/imap/processor/SearchProcessorTest.java  |   3 +-
 .../processor/base/MailboxEventAnalyserTest.java   |   5 +-
 .../processor/base/SelectedMailboxImplTest.java    |   7 +-
 .../org/apache/james/FakeMessageSearchIndex.java   |   4 +-
 22 files changed, 198 insertions(+), 187 deletions(-)

diff --git a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/DeleteByQueryPerformer.java b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/DeleteByQueryPerformer.java
index c84c9fc..26376c6 100644
--- a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/DeleteByQueryPerformer.java
+++ b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/DeleteByQueryPerformer.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.backends.es;
 
-import org.apache.james.backends.es.search.ScrollIterable;
+import org.apache.james.backends.es.search.ScrolledSearch;
 import org.elasticsearch.action.bulk.BulkRequest;
 import org.elasticsearch.action.bulk.BulkResponse;
 import org.elasticsearch.action.delete.DeleteRequest;
@@ -51,7 +51,7 @@ public class DeleteByQueryPerformer {
     }
 
     public Mono<Void> perform(QueryBuilder queryBuilder) {
-        return Flux.fromStream(new ScrollIterable(client, prepareSearch(queryBuilder)).stream())
+        return Flux.fromStream(new ScrolledSearch(client, prepareSearch(queryBuilder)).searchResponses())
             .flatMap(searchResponse -> deleteRetrievedIds(client, searchResponse))
             .thenEmpty(Mono.empty());
     }
diff --git a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrollIterable.java b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrolledSearch.java
similarity index 73%
rename from backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrollIterable.java
rename to backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrolledSearch.java
index 1a8d693..bf015f6 100644
--- a/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrollIterable.java
+++ b/backends-common/elasticsearch/src/main/java/org/apache/james/backends/es/search/ScrolledSearch.java
@@ -19,39 +19,27 @@
 
 package org.apache.james.backends.es.search;
 
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Stream;
 
 import org.apache.james.backends.es.ListenerToFuture;
 import org.apache.james.util.streams.Iterators;
+import org.elasticsearch.action.search.ClearScrollRequest;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.action.search.SearchScrollRequest;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.search.SearchHit;
 
-public class ScrollIterable implements Iterable<SearchResponse> {
-    private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
-
-    private final RestHighLevelClient client;
-    private final SearchRequest searchRequest;
-
-    public ScrollIterable(RestHighLevelClient client, SearchRequest searchRequest) {
-        this.client = client;
-        this.searchRequest = searchRequest;
-    }
+import com.github.fge.lambdas.Throwing;
 
-    @Override
-    public Iterator<SearchResponse> iterator() {
-        return new ScrollIterator(client, searchRequest);
-    }
-
-    public Stream<SearchResponse> stream() {
-        return Iterators.toStream(iterator());
-    }
-
-    public static class ScrollIterator implements Iterator<SearchResponse> {
+public class ScrolledSearch {
+    private static class ScrollIterator implements Iterator<SearchResponse>, Closeable {
         private final RestHighLevelClient client;
         private CompletableFuture<SearchResponse> searchResponseFuture;
 
@@ -64,6 +52,13 @@ public class ScrollIterable implements Iterable<SearchResponse> {
         }
 
         @Override
+        public void close() throws IOException {
+            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
+            clearScrollRequest.addScrollId(searchResponseFuture.join().getScrollId());
+            client.clearScroll(clearScrollRequest);
+        }
+
+        @Override
         public boolean hasNext() {
             SearchResponse join = searchResponseFuture.join();
             return !allSearchResponsesConsumed(join);
@@ -82,9 +77,33 @@ public class ScrollIterable implements Iterable<SearchResponse> {
             return result;
         }
 
+        public Stream<SearchResponse> stream() {
+            return Iterators.toStream(this)
+                .onClose(Throwing.runnable(this::close));
+        }
+
         private boolean allSearchResponsesConsumed(SearchResponse searchResponse) {
             return searchResponse.getHits().getHits().length == 0;
         }
     }
 
+    private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
+
+    private final RestHighLevelClient client;
+    private final SearchRequest searchRequest;
+
+    public ScrolledSearch(RestHighLevelClient client, SearchRequest searchRequest) {
+        this.client = client;
+        this.searchRequest = searchRequest;
+    }
+
+    public Stream<SearchHit> searchHits() {
+        return searchResponses()
+            .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits().getHits()));
+    }
+
+    public Stream<SearchResponse> searchResponses() {
+        return new ScrollIterator(client, searchRequest)
+            .stream();
+    }
 }
diff --git a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrolledSearchTest.java
similarity index 91%
rename from backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
rename to backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrolledSearchTest.java
index c52847c..f622a63 100644
--- a/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrollIterableTest.java
+++ b/backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/search/ScrolledSearchTest.java
@@ -23,9 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
 
 import org.apache.james.backends.es.ClientProvider;
 import org.apache.james.backends.es.DockerElasticSearchRule;
@@ -47,8 +44,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
-public class ScrollIterableTest {
-
+public class ScrolledSearchTest {
     private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
     private static final int SIZE = 2;
     private static final String MESSAGE = "message";
@@ -80,7 +76,7 @@ public class ScrollIterableTest {
                     .query(QueryBuilders.matchAllQuery())
                     .size(SIZE));
 
-            assertThat(new ScrollIterable(client, searchRequest))
+            assertThat(new ScrolledSearch(client, searchRequest).searchHits())
                 .isEmpty();
         }
     }
@@ -103,7 +99,8 @@ public class ScrollIterableTest {
                     .query(QueryBuilders.matchAllQuery())
                     .size(SIZE));
 
-            assertThat(convertToIdList(new ScrollIterable(client, searchRequest)))
+            assertThat(new ScrolledSearch(client, searchRequest).searchHits())
+                .extracting(SearchHit::getId)
                 .containsOnly(id);
         }
     }
@@ -132,7 +129,8 @@ public class ScrollIterableTest {
                     .query(QueryBuilders.matchAllQuery())
                     .size(SIZE));
 
-            assertThat(convertToIdList(new ScrollIterable(client, searchRequest)))
+            assertThat(new ScrolledSearch(client, searchRequest).searchHits())
+                .extracting(SearchHit::getId)
                 .containsOnly(id1, id2);
         }
     }
@@ -167,18 +165,12 @@ public class ScrollIterableTest {
                     .query(QueryBuilders.matchAllQuery())
                     .size(SIZE));
 
-            assertThat(convertToIdList(new ScrollIterable(client, searchRequest)))
+            assertThat(new ScrolledSearch(client, searchRequest).searchHits())
+                .extracting(SearchHit::getId)
                 .containsOnly(id1, id2, id3);
         }
     }
 
-    private List<String> convertToIdList(ScrollIterable scrollIterable) {
-        return scrollIterable.stream()
-            .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits().getHits()))
-            .map(SearchHit::getId)
-            .collect(Collectors.toList());
-    }
-
     private void hasIdsInIndex(RestHighLevelClient client, String... ids) throws IOException {
         SearchRequest searchRequest = new SearchRequest(INDEX_NAME.getValue())
             .scroll(TIMEOUT)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index f2d13e0..29d17b0 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -29,6 +29,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
@@ -103,7 +104,7 @@ public interface MessageManager {
      * @throws MailboxException
      *             when search fails for other reasons
      */
-    Iterator<MessageUid> search(SearchQuery searchQuery, MailboxSession mailboxSession) throws MailboxException;
+    Stream<MessageUid> search(SearchQuery searchQuery, MailboxSession mailboxSession) throws MailboxException;
 
     /**
      * Expunges messages in the given range from this mailbox by first retrieving the messages to be deleted
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 1dd808c..23e2845 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
@@ -23,9 +23,9 @@ import static org.elasticsearch.index.query.QueryBuilders.termQuery;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -50,6 +50,7 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
+import org.apache.james.util.OptionalUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,13 +99,13 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
     }
     
     @Override
-    public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) {
+    public Stream<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         Optional<Integer> noLimit = Optional.empty();
+
         return searcher
-                .search(ImmutableList.of(mailbox.getMailboxId()), searchQuery, noLimit)
-                .map(SearchResult::getMessageUid)
-                .iterator();
+            .search(ImmutableList.of(mailbox.getMailboxId()), searchQuery, noLimit)
+            .map(SearchResult::getMessageUid);
     }
     
     @Override
@@ -115,13 +116,15 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
             return ImmutableList.of();
         }
 
-        return searcher.search(mailboxIds, searchQuery, Optional.empty())
-            .peek(this::logIfNoMessageId)
-            .map(SearchResult::getMessageId)
-            .map(Optional::get)
-            .distinct()
-            .limit(limit)
-            .collect(Guavate.toImmutableList());
+        try (Stream<SearchResult> searchResults = searcher.search(mailboxIds, searchQuery, Optional.empty())) {
+            return searchResults
+                .peek(this::logIfNoMessageId)
+                .map(SearchResult::getMessageId)
+                .flatMap(OptionalUtils::toStream)
+                .distinct()
+                .limit(limit)
+                .collect(Guavate.toImmutableList());
+        }
     }
 
     @Override
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 3863302..9406b68 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
@@ -19,7 +19,6 @@
 
 package org.apache.james.mailbox.elasticsearch.search;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -27,7 +26,7 @@ import java.util.stream.Stream;
 import org.apache.james.backends.es.AliasName;
 import org.apache.james.backends.es.NodeMappingFactory;
 import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.search.ScrollIterable;
+import org.apache.james.backends.es.search.ScrolledSearch;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.elasticsearch.json.JsonMessageConstants;
 import org.apache.james.mailbox.elasticsearch.query.QueryConverter;
@@ -37,7 +36,6 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.elasticsearch.action.search.SearchRequest;
-import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.common.document.DocumentField;
 import org.elasticsearch.common.unit.TimeValue;
@@ -49,9 +47,7 @@ import org.slf4j.LoggerFactory;
 import com.google.common.collect.ImmutableList;
 
 public class ElasticSearchSearcher {
-
     public static final int DEFAULT_SEARCH_SIZE = 100;
-
     private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchSearcher.class);
     private static final TimeValue TIMEOUT = TimeValue.timeValueMinutes(1);
     private static final ImmutableList<String> STORED_FIELDS = ImmutableList.of(JsonMessageConstants.MAILBOX_ID,
@@ -78,8 +74,9 @@ public class ElasticSearchSearcher {
     public Stream<MessageSearchIndex.SearchResult> search(Collection<MailboxId> mailboxIds, SearchQuery query,
                                                           Optional<Integer> limit) {
         SearchRequest searchRequest = prepareSearch(mailboxIds, query, limit);
-        Stream<MessageSearchIndex.SearchResult> pairStream = new ScrollIterable(client, searchRequest).stream()
-            .flatMap(this::transformResponseToUidStream);
+        Stream<MessageSearchIndex.SearchResult> pairStream = new ScrolledSearch(client, searchRequest)
+            .searchHits()
+            .flatMap(this::extractContentFromHit);
 
         return limit.map(pairStream::limit)
             .orElse(pairStream);
@@ -107,27 +104,20 @@ public class ElasticSearchSearcher {
             .orElse(size);
     }
 
-    private Stream<MessageSearchIndex.SearchResult> transformResponseToUidStream(SearchResponse searchResponse) {
-        return Arrays.stream(searchResponse.getHits().getHits())
-            .map(this::extractContentFromHit)
-            .filter(Optional::isPresent)
-            .map(Optional::get);
-    }
-
-    private Optional<MessageSearchIndex.SearchResult> extractContentFromHit(SearchHit hit) {
+    private Stream<MessageSearchIndex.SearchResult> extractContentFromHit(SearchHit hit) {
         DocumentField mailboxId = hit.field(JsonMessageConstants.MAILBOX_ID);
         DocumentField uid = hit.field(JsonMessageConstants.UID);
         Optional<DocumentField> id = retrieveMessageIdField(hit);
         if (mailboxId != null && uid != null) {
             Number uidAsNumber = uid.getValue();
-            return Optional.of(
+            return Stream.of(
                 new MessageSearchIndex.SearchResult(
                     id.map(field -> messageIdFactory.fromString(field.getValue())),
                     mailboxIdFactory.fromString(mailboxId.getValue()),
                     MessageUid.of(uidAsNumber.longValue())));
         } else {
             LOGGER.warn("Can not extract UID, MessageID and/or MailboxId for search result {}", hit.getId());
-            return Optional.empty();
+            return Stream.empty();
         }
     }
 
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 93d0893..8300b5c 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
@@ -36,6 +36,7 @@ import java.util.Locale;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TimeZone;
+import java.util.stream.Stream;
 
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
@@ -463,13 +464,12 @@ public class LuceneMessageSearchIndex extends ListeningMessageSearchIndex {
     
     
     @Override
-    public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+    public Stream<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
 
         return searchMultimap(ImmutableList.of(mailbox.getMailboxId()), searchQuery)
             .stream()
-            .map(SearchResult::getMessageUid)
-            .iterator();
+            .map(SearchResult::getMessageUid);
     }
 
     @Override
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index cf57832..d407a8e 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -24,10 +24,10 @@ import java.nio.charset.Charset;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -160,7 +160,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -168,7 +168,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldNotMatchAbsentPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(CUSTARD + CUSTARD));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
     
@@ -176,7 +176,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldBeCaseInsensitive() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(RHUBARD));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -184,7 +184,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchNotMatchPhraseOnlyInFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(FROM_ADDRESS));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -192,7 +192,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldNotMatchPhraseOnlyInSubject() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains(SUBJECT_PART));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -200,7 +200,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -208,7 +208,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldNotAbsentMatchPhraseInBody() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(CUSTARD + CUSTARD));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).isEmpty();
     }
 
@@ -216,7 +216,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchMatchShouldBeCaseInsensitive() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(RHUBARD.toLowerCase(Locale.US)));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -224,7 +224,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToFullAddress() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,FROM_ADDRESS));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -232,7 +232,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToDisplayName() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,"Harry"));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
     
@@ -240,7 +240,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchToEmail() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.To,"Harry@example.org"));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
     
@@ -248,7 +248,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void addressSearchShouldMatchFrom() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.address(AddressType.From,"ser-from@domain.or"));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
 
@@ -256,7 +256,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseOnlyInToHeader() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(FROM_ADDRESS));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
     
@@ -264,7 +264,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchPhraseOnlyInSubjectHeader() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains(SUBJECT_PART));
-        Iterator<MessageUid> result = index.search(session, mailbox3, query);
+        Stream<MessageUid> result = index.search(session, mailbox3, query);
         assertThat(result).containsExactly(uid5);
     }
     
@@ -272,7 +272,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void searchAllShouldMatchAllMailboxEmails() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<MessageUid> result = index.search(session, mailbox2, query);
+        Stream<MessageUid> result = index.search(session, mailbox2, query);
         assertThat(result).containsExactly(uid2);
     }
 
@@ -325,7 +325,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void flagSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsSet(Flag.DELETED));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4);
     }
     
@@ -333,7 +333,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void bodySearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.bodyContains("body"));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -341,7 +341,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void textSearchShouldMatchSeveralEmails() throws Exception {    
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.mailContains("body"));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -349,7 +349,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void headerSearchShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerContains("Subject", "test"));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid4);
     }
     
@@ -357,7 +357,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void headerExistsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.headerExists("Subject"));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid4);
     }
     
@@ -365,7 +365,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void flagUnsetShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.flagIsUnSet(Flag.DRAFT));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -376,7 +376,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateBefore(cal.getTime(), DateResolution.Day));
         
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3);
     }
     
@@ -387,7 +387,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateAfter(cal.getTime(), DateResolution.Day));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4);
     }
     
@@ -399,7 +399,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.internalDateOn(cal.getTime(), DateResolution.Day));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1);
     }
     
@@ -409,7 +409,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new SearchQuery.UidRange(uid1)}));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1);
     }
     
@@ -419,7 +419,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         Calendar cal = Calendar.getInstance();
         cal.setTime(new Date());
         query.andCriteria(SearchQuery.uid(new SearchQuery.UidRange[] {new SearchQuery.UidRange(uid1), new SearchQuery.UidRange(uid3,uid4)}));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -427,7 +427,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeEqualsShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeEquals(200));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1);
     }
     
@@ -435,7 +435,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeLessThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeLessThan(200));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4);
     }
     
@@ -443,7 +443,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void sizeGreaterThanShouldMatch() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.sizeGreaterThan(6));
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -451,7 +451,7 @@ public class LuceneMailboxMessageSearchIndexTest {
     public void uidShouldBeSorted() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -460,7 +460,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.Uid, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4, uid3, uid1);
     }
     
@@ -469,7 +469,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.SentDate, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
@@ -478,7 +478,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.SentDate, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid4, uid3);
     }
 
@@ -487,7 +487,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.BaseSubject, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
@@ -496,7 +496,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.BaseSubject, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
@@ -505,7 +505,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxFrom, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
@@ -514,7 +514,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxFrom, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid4, uid3);
     }
     
@@ -523,7 +523,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxCc, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -532,7 +532,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxCc, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
@@ -541,7 +541,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxTo, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
@@ -550,7 +550,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.MailboxTo, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
@@ -559,7 +559,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.DisplayTo, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
@@ -568,7 +568,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.DisplayTo, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
@@ -577,7 +577,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.DisplayFrom, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
@@ -586,7 +586,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.DisplayFrom, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid4, uid3);
     }
     
@@ -595,7 +595,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.Arrival, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid1, uid4);
     }
     
@@ -604,7 +604,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.Arrival, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid4, uid1, uid3);
     }
     
@@ -613,7 +613,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.Size, Order.NATURAL)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4, uid1);
     }
     
@@ -622,7 +622,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery(SearchQuery.all());
         query.setSorts(ImmutableList.of(new Sort(SortClause.Size, Order.REVERSE)));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid1, uid3, uid4);
     }
     
@@ -631,7 +631,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.not(SearchQuery.uid(new SearchQuery.UidRange[] { new SearchQuery.UidRange(uid1)})));
 
-        Iterator<MessageUid> result = index.search(session, mailbox, query);
+        Stream<MessageUid> result = index.search(session, mailbox, query);
         assertThat(result).containsExactly(uid3, uid4);
     }
 }
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
index 324f20c..7b22354 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
@@ -52,6 +52,7 @@ import org.apache.james.vault.search.Query;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 class DeletedMessageVaultHookTest {
@@ -165,7 +166,7 @@ class DeletedMessageVaultHookTest {
         long messageSize = messageSize(bobMessageManager, composedMessageId);
 
         DeletedMessage deletedMessage = buildDeletedMessage(ImmutableList.of(aliceMailbox), messageId, ALICE, messageSize);
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(ALICE, Query.ALL).blockFirst())
             .isEqualTo(deletedMessage);
@@ -186,7 +187,7 @@ class DeletedMessageVaultHookTest {
         MessageManager bobMessageManager = mailboxManager.getMailbox(aliceMailbox, bobSession);
         appendMessage(aliceMessageManager);
 
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(BOB, Query.ALL).collectList().block())
             .isEmpty();
@@ -212,7 +213,7 @@ class DeletedMessageVaultHookTest {
 
         long messageSize = messageSize(bobMessageManager, composedMessageId);
         DeletedMessage deletedMessage = buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB, messageSize);
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(BOB, Query.ALL).blockFirst())
             .isEqualTo(deletedMessage);
@@ -236,7 +237,7 @@ class DeletedMessageVaultHookTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(bobMailbox), bobSession);
 
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(ALICE, Query.ALL).collectList().block())
             .isEmpty();
@@ -262,7 +263,7 @@ class DeletedMessageVaultHookTest {
 
         long messageSize = messageSize(bobMessageManager, composedMessageId);
         DeletedMessage deletedMessage = buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB, messageSize);
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(BOB, Query.ALL).blockFirst())
             .isEqualTo(deletedMessage);
@@ -286,7 +287,7 @@ class DeletedMessageVaultHookTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox, bobMailbox), bobSession);
 
-        bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery, bobSession)), bobSession);
+        bobMessageManager.delete(bobMessageManager.search(searchQuery, bobSession).collect(Guavate.toImmutableList()), bobSession);
 
         assertThat(messageVault.search(ALICE, Query.ALL).collectList().block())
             .isEmpty();
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
index fd3cff7..7c02032 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcher.java
@@ -29,7 +29,7 @@ import java.util.stream.Stream;
 import org.apache.james.backends.es.AliasName;
 import org.apache.james.backends.es.NodeMappingFactory;
 import org.apache.james.backends.es.ReadAliasName;
-import org.apache.james.backends.es.search.ScrollIterable;
+import org.apache.james.backends.es.search.ScrolledSearch;
 import org.apache.james.core.User;
 import org.apache.james.quota.search.QuotaQuery;
 import org.apache.james.quota.search.QuotaSearcher;
@@ -59,10 +59,12 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
     @Override
     public List<User> search(QuotaQuery query) {
         try {
-            return searchHits(query)
-                .map(SearchHit::getId)
-                .map(User::fromUsername)
-                .collect(Guavate.toImmutableList());
+            try (Stream<SearchHit> searchHits = searchHits(query)) {
+                return searchHits
+                    .map(SearchHit::getId)
+                    .map(User::fromUsername)
+                    .collect(Guavate.toImmutableList());
+            }
         } catch (IOException e) {
             throw new RuntimeException("Unexpected exception while executing " + query, e);
         }
@@ -92,13 +94,12 @@ public class ElasticSearchQuotaSearcher implements QuotaSearcher {
     }
 
     private Stream<SearchHit> executeScrolledSearch(QuotaQuery query) {
-        return new ScrollIterable(client,
+        return new ScrolledSearch(client,
             new SearchRequest(readAlias.getValue())
                 .types(NodeMappingFactory.DEFAULT_MAPPING_NAME)
                 .source(searchSourceBuilder(query))
                 .scroll(TIMEOUT))
-            .stream()
-            .flatMap(searchResponse -> Arrays.stream(searchResponse.getHits().getHits()))
+            .searchHits()
             .skip(query.getOffset().getValue());
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 40318dc..5d63d3b 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -745,7 +746,7 @@ public class StoreMessageManager implements MessageManager {
     }
 
     @Override
-    public Iterator<MessageUid> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException {
+    public Stream<MessageUid> search(SearchQuery query, MailboxSession mailboxSession) throws MailboxException {
         if (query.equals(new SearchQuery(SearchQuery.all()))) {
             return listAllMessageUids(mailboxSession);
         }
@@ -900,11 +901,11 @@ public class StoreMessageManager implements MessageManager {
             .getApplicableFlag(mailbox);
     }
 
-    private Iterator<MessageUid> listAllMessageUids(MailboxSession session) throws MailboxException {
+    private Stream<MessageUid> listAllMessageUids(MailboxSession session) throws MailboxException {
         final MessageMapper messageMapper = mapperFactory.getMessageMapper(session);
 
         return messageMapper.execute(
-            () -> messageMapper.listAllMessageUids(mailbox));
+            () -> Iterators.toStream(messageMapper.listAllMessageUids(mailbox)));
     }
 
     @Override
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 c3faf9a..61a2f9b 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
@@ -23,6 +23,7 @@ import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Stream;
 
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
@@ -104,7 +105,7 @@ public class LazyMessageSearchIndex extends ListeningMessageSearchIndex {
      * 
      */
     @Override
-    public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+    public Stream<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         MailboxId id = mailbox.getMailboxId();
         
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
index 9343ee0..eb1dcee 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearchIndex.java
@@ -21,9 +21,9 @@ package org.apache.james.mailbox.store.search;
 
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Stream;
 
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -45,7 +45,7 @@ public interface MessageSearchIndex {
     /**
      * Return all uids of the previous indexed {@link Mailbox}'s which match the {@link SearchQuery}
      */
-    Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException;
+    Stream<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException;
 
     /**
      * Return all uids of all {@link Mailbox}'s the current user has access to which match the {@link SearchQuery}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index 2198506..26b602d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -106,13 +106,12 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
     }
     
     @Override
-    public Iterator<MessageUid> search(MailboxSession session, final Mailbox mailbox, SearchQuery query) throws MailboxException {
+    public Stream<MessageUid> search(MailboxSession session, final Mailbox mailbox, SearchQuery query) throws MailboxException {
         Preconditions.checkArgument(session != null, "'session' is mandatory");
         return searchResults(session, ImmutableList.of(mailbox).stream(), query)
             .stream()
             .filter(searchResult -> searchResult.getMailboxId().equals(mailbox.getMailboxId()))
-            .map(SearchResult::getMessageUid)
-            .iterator();
+            .map(SearchResult::getMessageUid);
     }
 
     private List<SearchResult> searchResults(MailboxSession session, Mailbox mailbox, SearchQuery query) throws MailboxException {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 6df7e78..0f189f4 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -62,7 +62,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterators;
 import com.jayway.awaitility.Awaitility;
 import com.jayway.awaitility.Duration;
 
@@ -1488,7 +1487,7 @@ public abstract class AbstractMessageSearchIndexTest {
             .await()
             .atMost(30, TimeUnit.SECONDS)
             .until(
-                () -> Iterators.size(messageSearchIndex.search(session, newBox.getMailboxEntity(), searchQuery)) == 9);
+                () -> messageSearchIndex.search(session, newBox.getMailboxEntity(), searchQuery).count() == 9);
     }
 
     @Test
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index fa43bb7..971bc44 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
@@ -584,9 +585,8 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
             }
             searchQuery.andCriteria(SearchQuery.uid(nRanges));
             searchQuery.andCriteria(SearchQuery.modSeqGreaterThan(changedSince));
-            Iterator<MessageUid> uids = mailbox.search(searchQuery, session);
-            while (uids.hasNext()) {
-                vanishedUids.remove(uids.next());
+            try (Stream<MessageUid> uids = mailbox.search(searchQuery, session)) {
+                uids.forEach(vanishedUids::remove);
             }
             UidRange[] vanishedIdRanges = uidRanges(MessageRange.toRanges(vanishedUids));
             responder.respond(new VanishedResponse(vanishedIdRanges, true));
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index f074eec..c01bd31 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -23,10 +23,9 @@ import java.io.Closeable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
-import java.util.TreeSet;
+import java.util.stream.Stream;
 
 import javax.mail.Flags.Flag;
 
@@ -68,6 +67,7 @@ import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> implements CapabilityImplementingProcessor {
@@ -94,27 +94,10 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
 
             final SearchQuery query = toQuery(searchKey, session);
             MailboxSession msession = ImapSessionUtils.getMailboxSession(session);
-            final Iterator<MessageUid> it = mailbox.search(query, msession);
-            
-            final Collection<Long> results = new TreeSet<>();
-            final Collection<MessageUid> uids = new TreeSet<>();
-            
-            while (it.hasNext()) {
-                final MessageUid uid = it.next();
-                final Long number;
-                if (useUids) {
-                    uids.add(uid);
-                    results.add(uid.asLong());
-                } else {
-                    final int msn = session.getSelected().msn(uid);
-                    number = (long) msn;
-                    if (number == SelectedMailbox.NO_SUCH_MESSAGE == false) {
-                        results.add(number);
-                    }
-                }
-                
-            }
-            
+
+            final Collection<MessageUid> uids = performUidSearch(mailbox, query, msession);
+            final Collection<Long> results = asResults(session, useUids, uids);
+
             // Check if the search did contain the MODSEQ searchkey. If so we need to include the highest mod in the response.
             //
             // See RFC4551: 3.4. MODSEQ Search Criterion in SEARCH
@@ -220,7 +203,27 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
             session.setAttribute(SEARCH_MODSEQ, null);
         }
     }
-    
+
+    private Collection<Long> asResults(ImapSession session, boolean useUids, Collection<MessageUid> uids) {
+        if (useUids) {
+            return uids.stream()
+                .map(MessageUid::asLong)
+                .collect(Guavate.toImmutableList());
+        } else {
+            return uids.stream()
+                .map(uid -> session.getSelected().msn(uid))
+                .map(Integer::longValue)
+                .filter(msn -> msn != SelectedMailbox.NO_SUCH_MESSAGE)
+                .collect(Guavate.toImmutableList());
+        }
+    }
+
+    private Collection<MessageUid> performUidSearch(MessageManager mailbox, SearchQuery query, MailboxSession msession) throws MailboxException {
+        try (Stream<MessageUid> stream = mailbox.search(query, msession)) {
+            return stream.collect(Guavate.toImmutableList());
+        }
+    }
+
     private long[] toArray(Collection<Long> results) {
         return results.stream().mapToLong(x -> x).toArray();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
index c1ec72d..63a4c77 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -49,7 +50,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.UpdatedFlags;
 
-import com.google.common.collect.ImmutableList;
+import com.github.steveash.guavate.Guavate;
 
 /**
  * Default implementation of {@link SelectedMailbox}
@@ -92,8 +93,9 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
         registration = eventBus.register(this, new MailboxIdRegistrationKey(mailboxId));
 
         applicableFlags = messageManager.getApplicableFlags(mailboxSession);
-        uidMsnConverter.addAll(ImmutableList.copyOf(
-            messageManager.search(new SearchQuery(SearchQuery.all()), mailboxSession)));
+        try (Stream<MessageUid> stream = messageManager.search(new SearchQuery(SearchQuery.all()), mailboxSession)) {
+            uidMsnConverter.addAll(stream.collect(Guavate.toImmutableList()));
+        }
     }
 
     @Override
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
index b3d4911..3e5c0a2 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Optional;
 import java.util.TimeZone;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -469,7 +470,7 @@ public class SearchProcessorTest {
     private void check(SearchKey key, final SearchQuery query) throws Exception {
         when(session.getAttribute(SearchProcessor.SEARCH_MODSEQ)).thenReturn(null);
         when(session.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
-        when(mailbox.search(query, mailboxSession)).thenReturn(new ArrayList<MessageUid>().iterator());
+        when(mailbox.search(query, mailboxSession)).thenReturn(Stream.empty());
         when(selectedMailbox.getApplicableFlags()).thenReturn(new Flags());
         when(selectedMailbox.hasNewApplicableFlags()).thenReturn(false);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index a22744a..7bbeaef 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.util.Date;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
@@ -56,8 +57,6 @@ import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.common.collect.ImmutableList;
-
 public class MailboxEventAnalyserTest {
     private static final MessageUid UID = MessageUid.of(900);
     private static final UpdatedFlags ADD_RECENT_UPDATED_FLAGS = UpdatedFlags.builder()
@@ -152,7 +151,7 @@ public class MailboxEventAnalyserTest {
         when(messageManager.getApplicableFlags(any())).thenReturn(new Flags());
         when(messageManager.getId()).thenReturn(MAILBOX_ID);
         when(messageManager.search(any(), any()))
-            .thenReturn(ImmutableList.of(MESSAGE_UID).iterator());
+            .thenReturn(Stream.of(MESSAGE_UID));
         when(messageManager.getMessages(any(), any(), any()))
             .thenReturn(new SingleMessageResultIterator(messageResult));
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index 64fbb7d..7d7df56 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Stream;
 
 import javax.mail.Flags;
 
@@ -61,8 +62,6 @@ import org.mockito.stubbing.Answer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableList;
-
 
 public class SelectedMailboxImplTest {
 
@@ -146,10 +145,10 @@ public class SelectedMailboxImplTest {
             .isEqualTo(1);
     }
 
-    private Answer<Iterator<MessageUid>> delayedSearchAnswer() {
+    private Answer<Stream<MessageUid>> delayedSearchAnswer() {
         return invocation -> {
             Thread.sleep(1000);
-            return ImmutableList.of(MessageUid.of(1), MessageUid.of(3)).iterator();
+            return Stream.of(MessageUid.of(1), MessageUid.of(3));
         };
     }
 
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeMessageSearchIndex.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeMessageSearchIndex.java
index fdd7cea..1ab3a1d 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeMessageSearchIndex.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/FakeMessageSearchIndex.java
@@ -21,8 +21,8 @@ package org.apache.james;
 
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.Iterator;
 import java.util.List;
+import java.util.stream.Stream;
 
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.mailbox.MailboxManager;
@@ -73,7 +73,7 @@ public class FakeMessageSearchIndex extends ListeningMessageSearchIndex {
     }
 
     @Override
-    public Iterator<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
+    public Stream<MessageUid> search(MailboxSession session, Mailbox mailbox, SearchQuery searchQuery) throws MailboxException {
         throw new NotImplementedException();
     }
 


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


[james-project] 04/07: JAMES-2774 Solve some intelliJ warnings in RabbitMQ EventBus tests

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 9d61daf2c7f8bef209c727a0fdc8a43d31706722
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jun 6 11:00:08 2019 +0700

    JAMES-2774 Solve some intelliJ warnings in RabbitMQ EventBus tests
---
 .../james/mailbox/events/RabbitMQEventBusTest.java | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index 525b16d..b7b2da9 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -317,7 +317,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                 }
 
                 @Test
-                void dispatchShouldWorkAfterNetworkIssuesForOldRegistration() throws Exception {
+                void dispatchShouldWorkAfterNetworkIssuesForOldRegistration() {
                     rabbitMQEventBusWithNetWorkIssue.start();
                     MailboxListener listener = newListener();
                     rabbitMQEventBusWithNetWorkIssue.register(listener, GROUP_A);
@@ -346,7 +346,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterRestartForOldRegistration() throws Exception {
+            void dispatchShouldWorkAfterRestartForOldRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
                 eventBus.register(listener, GROUP_A);
@@ -358,7 +358,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterRestartForNewRegistration() throws Exception {
+            void dispatchShouldWorkAfterRestartForNewRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
 
@@ -373,7 +373,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void redeliverShouldWorkAfterRestartForOldRegistration() throws Exception {
+            void redeliverShouldWorkAfterRestartForOldRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
                 eventBus.register(listener, GROUP_A);
@@ -385,7 +385,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void redeliverShouldWorkAfterRestartForNewRegistration() throws Exception {
+            void redeliverShouldWorkAfterRestartForNewRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
 
@@ -398,7 +398,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterRestartForOldKeyRegistration() throws Exception {
+            void dispatchShouldWorkAfterRestartForOldKeyRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
                 eventBus.register(listener, KEY_1);
@@ -410,7 +410,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterRestartForNewKeyRegistration() throws Exception {
+            void dispatchShouldWorkAfterRestartForNewKeyRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
 
@@ -423,7 +423,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterNetworkIssuesForNewRegistration() throws Exception {
+            void dispatchShouldWorkAfterNetworkIssuesForNewRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
 
@@ -440,7 +440,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void redeliverShouldWorkAfterNetworkIssuesForNewRegistration() throws Exception {
+            void redeliverShouldWorkAfterNetworkIssuesForNewRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
 
@@ -457,7 +457,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterNetworkIssuesForOldKeyRegistration() throws Exception {
+            void dispatchShouldWorkAfterNetworkIssuesForOldKeyRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
                 when(listener.getExecutionMode()).thenReturn(MailboxListener.ExecutionMode.ASYNCHRONOUS);
@@ -475,7 +475,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterNetworkIssuesForNewKeyRegistration() throws Exception {
+            void dispatchShouldWorkAfterNetworkIssuesForNewKeyRegistration() {
                 eventBus.start();
                 MailboxListener listener = newListener();
                 when(listener.getExecutionMode()).thenReturn(MailboxListener.ExecutionMode.ASYNCHRONOUS);


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


[james-project] 06/07: JAMES-2526 UnauthorizedEndpoint can be performed on a single James server

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 1038a909adb3129c9059100d4f54e8d91d8a29e6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Jun 6 15:25:04 2019 +0700

    JAMES-2526 UnauthorizedEndpoint can be performed on a single James server
    
    As all the endpoints are rejected with a 401 unauthorized we can clearly
    play all 89 the tests on the same James instance, saving 88 restarts
---
 .../integration/CassandraJmapExtension.java        | 103 ++++++++++++++++++++-
 .../integration/UnauthorizedEndpointsTest.java     |  10 +-
 2 files changed, 103 insertions(+), 10 deletions(-)

diff --git a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/CassandraJmapExtension.java b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/CassandraJmapExtension.java
index 5d7c8b2..90a8dec 100644
--- a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/CassandraJmapExtension.java
+++ b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/CassandraJmapExtension.java
@@ -21,6 +21,9 @@ package org.apache.james.webadmin.integration;
 import static org.apache.james.CassandraJamesServerMain.ALL_BUT_JMX_CASSANDRA_MODULE;
 
 import java.io.IOException;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 
 import org.apache.james.CleanupTasksPerformer;
 import org.apache.james.DockerCassandraRule;
@@ -31,6 +34,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.server.core.configuration.Configuration;
+import org.apache.james.util.FunctionalUtils;
 import org.apache.james.util.Runnables;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.junit.jupiter.api.extension.AfterAllCallback;
@@ -43,19 +47,100 @@ import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 import org.junit.rules.TemporaryFolder;
 
+import com.github.fge.lambdas.Throwing;
+
 public class CassandraJmapExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
+    public interface JamesLifeCyclePolicy {
+        JamesLifeCyclePolicy FOR_EACH_TEST = serverSupplier -> JamesLifecycleHandler.builder()
+            .beforeAll(Optional::empty)
+            .beforeEach(() -> Optional.of(serverSupplier.get()))
+            .afterEach(GuiceJamesServer::stop)
+            .afterAll(guiceJamesServer -> { });
+        JamesLifeCyclePolicy COMMON_TO_ALL_TESTS = serverSupplier -> JamesLifecycleHandler.builder()
+            .beforeAll(() -> Optional.of(serverSupplier.get()))
+            .beforeEach(Optional::empty)
+            .afterEach(guiceJamesServer -> { })
+            .afterAll(GuiceJamesServer::stop);
+
+        JamesLifecycleHandler createHandler(Supplier<GuiceJamesServer> serverSupplier);
+    }
+
+    public static class JamesLifecycleHandler {
+        public interface Builder {
+            @FunctionalInterface
+            interface RequiresBeforeAll {
+                RequiresBeforeEach beforeAll(Supplier<Optional<GuiceJamesServer>> beforeAll);
+
+            }
+
+            @FunctionalInterface
+            interface RequiresBeforeEach {
+                RequiresAfterEach beforeEach(Supplier<Optional<GuiceJamesServer>> beforeEach);
+            }
+
+            @FunctionalInterface
+            interface RequiresAfterEach {
+                RequiresAfterAll afterEach(Consumer<GuiceJamesServer> afterAll);
+            }
+
+            @FunctionalInterface
+            interface RequiresAfterAll {
+                JamesLifecycleHandler afterAll(Consumer<GuiceJamesServer> afterAll);
+            }
+        }
+
+        public static Builder.RequiresBeforeAll builder() {
+            return beforeAll -> beforeEach -> afterEach -> afterAll -> new JamesLifecycleHandler(beforeAll, beforeEach, afterEach, afterAll);
+        }
+
+        private final Supplier<Optional<GuiceJamesServer>> beforeAll;
+        private final Supplier<Optional<GuiceJamesServer>> beforeEach;
+        private final Consumer<GuiceJamesServer> afterEach;
+        private final Consumer<GuiceJamesServer>  afterAll;
+
+        JamesLifecycleHandler(Supplier<Optional<GuiceJamesServer>> beforeAll, Supplier<Optional<GuiceJamesServer>> beforeEach, Consumer<GuiceJamesServer> afterEach, Consumer<GuiceJamesServer> afterAll) {
+            this.beforeAll = beforeAll;
+            this.beforeEach = beforeEach;
+            this.afterEach = afterEach;
+            this.afterAll = afterAll;
+        }
+
+        Optional<GuiceJamesServer> beforeAll() {
+            return beforeAll.get()
+                .map(FunctionalUtils.toFunction(Throwing.consumer(GuiceJamesServer::start)));
+        }
+
+        Optional<GuiceJamesServer> beforeEach() {
+            return beforeEach.get()
+                .map(FunctionalUtils.toFunction(Throwing.consumer(GuiceJamesServer::start)));
+        }
+
+        void afterEach(GuiceJamesServer guiceJamesServer) {
+            afterEach.accept(guiceJamesServer);
+        }
+
+        void afterAll(GuiceJamesServer guiceJamesServer) {
+            afterAll.accept(guiceJamesServer);
+        }
+    }
 
     private static final int LIMIT_TO_20_MESSAGES = 20;
 
     private final TemporaryFolder temporaryFolder;
     private final DockerCassandraRule cassandra;
     private final DockerElasticSearchRule elasticSearchRule;
+    private final JamesLifecycleHandler jamesLifecycleHandler;
     private GuiceJamesServer james;
 
     public CassandraJmapExtension() {
+        this(JamesLifeCyclePolicy.FOR_EACH_TEST);
+    }
+
+    public CassandraJmapExtension(JamesLifeCyclePolicy jamesLifeCyclePolicy) {
         this.temporaryFolder = new TemporaryFolder();
         this.cassandra = new DockerCassandraRule();
         this.elasticSearchRule = new DockerElasticSearchRule();
+        this.jamesLifecycleHandler = jamesLifeCyclePolicy.createHandler(jamesSupplier());
     }
 
     private GuiceJamesServer james() throws IOException {
@@ -75,27 +160,31 @@ public class CassandraJmapExtension implements BeforeAllCallback, AfterAllCallba
                 .overrideWith((binder -> binder.bind(CleanupTasksPerformer.class).asEagerSingleton()));
     }
 
+    private Supplier<GuiceJamesServer> jamesSupplier() {
+        return Throwing.supplier(this::james);
+    }
+
     @Override
     public void beforeAll(ExtensionContext context) throws Exception {
         temporaryFolder.create();
-
         Runnables.runParallel(cassandra::start, elasticSearchRule::start);
+        james = jamesLifecycleHandler.beforeAll().orElse(james);
     }
 
     @Override
     public void afterAll(ExtensionContext context) {
+        jamesLifecycleHandler.afterAll(james);
         Runnables.runParallel(cassandra::stop, elasticSearchRule.getDockerEs()::cleanUpData);
     }
 
     @Override
-    public void beforeEach(ExtensionContext context) throws Exception {
-        james = james();
-        james.start();
+    public void beforeEach(ExtensionContext context) {
+        james = jamesLifecycleHandler.beforeEach().orElse(james);
     }
 
     @Override
     public void afterEach(ExtensionContext context) {
-        james.stop();
+        jamesLifecycleHandler.afterEach(james);
     }
 
     @Override
@@ -103,6 +192,10 @@ public class CassandraJmapExtension implements BeforeAllCallback, AfterAllCallba
         return parameterContext.getParameter().getType() == GuiceJamesServer.class;
     }
 
+    public GuiceJamesServer getJames() {
+        return james;
+    }
+
     @Override
     public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
         return james;
diff --git a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/UnauthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/UnauthorizedEndpointsTest.java
index 7d22960..c320895 100644
--- a/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/UnauthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/UnauthorizedEndpointsTest.java
@@ -21,7 +21,6 @@ package org.apache.james.webadmin.integration;
 
 import static io.restassured.RestAssured.when;
 
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.routes.AliasRoutes;
@@ -45,18 +44,19 @@ import org.apache.james.webadmin.routes.UserRoutes;
 import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRoutes;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
 import io.restassured.RestAssured;
 
-@ExtendWith(CassandraJmapExtension.class)
 class UnauthorizedEndpointsTest {
+    @RegisterExtension
+    static CassandraJmapExtension cassandraJmapExtension = new CassandraJmapExtension(CassandraJmapExtension.JamesLifeCyclePolicy.COMMON_TO_ALL_TESTS);
 
     @BeforeEach
-    void setup(GuiceJamesServer james) {
-        WebAdminGuiceProbe webAdminGuiceProbe = james.getProbe(WebAdminGuiceProbe.class);
+    void setup() {
+        WebAdminGuiceProbe webAdminGuiceProbe = cassandraJmapExtension.getJames().getProbe(WebAdminGuiceProbe.class);
 
         RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminGuiceProbe.getWebAdminPort())
             .build();


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


[james-project] 02/07: JAMES-2774 remove duplicated test (rebase issue)

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit a633935ccf7c789794b1a8a259a270cd2f2e51a1
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Jun 6 11:15:09 2019 +0700

    JAMES-2774 remove duplicated test (rebase issue)
---
 .../james/mailbox/events/RabbitMQEventBusTest.java      | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index 220f8c5..525b16d 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -346,23 +346,6 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
             }
 
             @Test
-            void dispatchShouldWorkAfterNetworkIssuesForOldRegistration() throws Exception {
-                eventBus.start();
-                MailboxListener listener = newListener();
-                eventBus.register(listener, GROUP_A);
-
-                rabbitMQExtension.getRabbitMQ().pause();
-
-                assertThatThrownBy(() -> eventBus.dispatch(EVENT, NO_KEYS).block())
-                    .isInstanceOf(RabbitFluxException.class);
-
-                rabbitMQExtension.getRabbitMQ().unpause();
-
-                eventBus.dispatch(EVENT, NO_KEYS).block();
-                assertThatListenerReceiveOneEvent(listener);
-            }
-
-            @Test
             void dispatchShouldWorkAfterRestartForOldRegistration() throws Exception {
                 eventBus.start();
                 MailboxListener listener = newListener();


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