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 ma...@apache.org on 2016/07/25 15:37:03 UTC

[2/3] james-project git commit: JAMES-1807 implement InMailboxes filter

JAMES-1807 implement InMailboxes filter


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

Branch: refs/heads/master
Commit: ae5f51e6a3c5106e1774ec1a1622fd206c4ee2b0
Parents: c0fb468
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Fri Jul 22 17:07:38 2016 +0200
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Mon Jul 25 12:09:03 2016 +0200

----------------------------------------------------------------------
 .../model/MultimailboxesSearchQuery.java        |  9 ++++++--
 .../modules/mailbox/MemoryMailboxModule.java    |  3 +++
 .../integration/GetMessageListMethodTest.java   |  7 +++---
 .../jmap/methods/GetMessageListMethod.java      | 24 +++++++++++++++++++-
 4 files changed, 37 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ae5f51e6/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
index f979a79..42e667b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MultimailboxesSearchQuery.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.model;
 
 import java.util.Arrays;
+import java.util.Collection;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -41,10 +42,14 @@ public class MultimailboxesSearchQuery {
             this.searchQuery = searchQuery;
             this.mailboxIds = ImmutableSet.builder();
         }
+
+        public Builder inMailboxes(Collection<MailboxId> mailboxIds) {
+            this.mailboxIds.addAll(mailboxIds);
+            return this;
+        }
         
         public Builder inMailboxes(MailboxId... mailboxIds) {
-            this.mailboxIds.addAll(Arrays.asList(mailboxIds));
-            return this;
+            return inMailboxes(Arrays.asList(mailboxIds));
         }
         
         public MultimailboxesSearchQuery build() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae5f51e6/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index 6a13bb6..e735349 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -30,10 +30,12 @@ import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.mail.InMemoryModSeqProvider;
 import org.apache.james.mailbox.inmemory.mail.InMemoryUidProvider;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -66,6 +68,7 @@ public class MemoryMailboxModule extends AbstractModule {
         bind(MailboxSessionMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(ModSeqProvider.class).to(InMemoryModSeqProvider.class);
         bind(UidProvider.class).to(InMemoryUidProvider.class);
+        bind(MailboxId.Factory.class).to(InMemoryId.Factory.class);
 
         bind(SubscriptionManager.class).to(StoreSubscriptionManager.class);
         bind(SubscriptionMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae5f51e6/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index 685ef6e..c8b3d2e 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -362,18 +362,19 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", contains("username@domain.tld|mailbox|1"));
     }
 
-    @Ignore("Temporay break inMailboxes/notInMailboxes support")
     @Test
     public void getMessageListShouldFilterMessagesWhenInMailboxesFilterDoesntMatches() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "emptyMailbox");
+        MailboxId emptyMailboxId = jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, "emptyMailbox").getMailboxId();
+        
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox");
-
         jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "mailbox"),
                 new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
         await();
 
         given()
             .header("Authorization", accessToken.serialize())
-            .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"mailbox2\"]}}, \"#0\"]]")
+            .body(String.format("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"%s\"]}}, \"#0\"]]", emptyMailboxId.serialize()))
         .when()
             .post("/jmap")
         .then()

http://git-wip-us.apache.org/repos/asf/james-project/blob/ae5f51e6/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
index c310f02..979eb60 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
@@ -24,12 +24,15 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.apache.james.jmap.model.ClientId;
+import org.apache.james.jmap.model.Filter;
+import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.GetMessageListRequest;
 import org.apache.james.jmap.model.GetMessageListResponse;
 import org.apache.james.jmap.model.GetMessagesRequest;
@@ -44,6 +47,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxId.Factory;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
@@ -76,16 +80,18 @@ public class GetMessageListMethod implements Method {
     private final int maximumLimit;
     private final GetMessagesMethod getMessagesMethod;
     private final MailboxUtils mailboxUtils;
+    private final Factory mailboxIdFactory;
 
     @Inject
     @VisibleForTesting public GetMessageListMethod(MailboxManager mailboxManager, MessageSearchIndex messageSearchIndex,
-            @Named(MAXIMUM_LIMIT) int maximumLimit, GetMessagesMethod getMessagesMethod, MailboxUtils mailboxUtils) {
+            @Named(MAXIMUM_LIMIT) int maximumLimit, GetMessagesMethod getMessagesMethod, MailboxUtils mailboxUtils, MailboxId.Factory mailboxIdFactory) {
 
         this.mailboxManager = mailboxManager;
         this.messageSearchIndex = messageSearchIndex;
         this.maximumLimit = maximumLimit;
         this.getMessagesMethod = getMessagesMethod;
         this.mailboxUtils = mailboxUtils;
+        this.mailboxIdFactory = mailboxIdFactory;
     }
 
     @Override
@@ -161,11 +167,27 @@ public class GetMessageListMethod implements Method {
         SearchQuery searchQuery = messageListRequest.getFilter()
                 .map(filter -> new FilterToSearchQuery().convert(filter))
                 .orElse(new SearchQuery());
+        Set<MailboxId> inMailboxes = filterToFilterCondition(messageListRequest.getFilter())
+                .flatMap(condition -> Guavate.stream(condition.getInMailboxes()))
+                .flatMap(List::stream)
+                .map(mailboxIdFactory::fromString)
+                .collect(Guavate.toImmutableSet());
         return MultimailboxesSearchQuery
                 .from(searchQuery)
+                .inMailboxes(inMailboxes)
                 .build();
     }
 
+    private Stream<FilterCondition> filterToFilterCondition(Optional<Filter> maybeCondition) {
+        return Guavate.stream(maybeCondition)
+                .flatMap(c -> {
+                    if (c instanceof FilterCondition) {
+                        return Stream.of((FilterCondition)c);
+                    }
+                    return Stream.of();
+                });
+    }
+    
     private Stream<JmapResponse> processGetMessages(GetMessageListRequest messageListRequest, GetMessageListResponse messageListResponse, ClientId clientId, MailboxSession mailboxSession) {
         if (shouldChainToGetMessages(messageListRequest)) {
             GetMessagesRequest getMessagesRequest = GetMessagesRequest.builder()


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