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 <raphael.ouaz...@linagora.com> Authored: Fri Jul 22 17:07:38 2016 +0200 Committer: Matthieu Baechler <matthieu.baech...@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("usern...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org