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/01/18 23:06:32 UTC

svn commit: r1725359 - in /james/project/trunk/server/protocols: jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java

Author: matthieu
Date: Mon Jan 18 22:06:31 2016
New Revision: 1725359

URL: http://svn.apache.org/viewvc?rev=1725359&view=rev
Log:
JAMES-1657 getMessageList takes some mailboxIds, not mailboxes names

Modified:
    james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
    james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java

Modified: james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java?rev=1725359&r1=1725358&r2=1725359&view=diff
==============================================================================
--- james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java (original)
+++ james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessageListMethodTest.java Mon Jan 18 22:06:31 2016
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.methods;
 
 import static com.jayway.restassured.RestAssured.given;
+import static com.jayway.restassured.RestAssured.with;
 import static com.jayway.restassured.config.EncoderConfig.encoderConfig;
 import static com.jayway.restassured.config.RestAssuredConfig.newConfig;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -156,16 +157,24 @@ public abstract class GetMessageListMeth
     @Test
     public void getMessageListShouldFilterMessagesWhenInMailboxesFilterMatches() throws Exception {
         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());
         embeddedElasticSearch.awaitForElasticSearch();
 
+        String mailboxId = 
+                with()
+                .accept(ContentType.JSON)
+                .contentType(ContentType.JSON)
+                .header("Authorization", accessToken.serialize())
+                .body("[[\"getMailboxes\", {}, \"#0\"]]")
+                .post("/jmap")
+                .path("[0][1].list[0].id");
+        
         String response = given()
             .accept(ContentType.JSON)
             .contentType(ContentType.JSON)
             .header("Authorization", accessToken.serialize())
-            .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"mailbox\"]}}, \"#0\"]]")
+            .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId + "\"]}}, \"#0\"]]")
         .when()
             .post("/jmap")
         .then()
@@ -187,11 +196,20 @@ public abstract class GetMessageListMeth
         jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "mailbox2");
         embeddedElasticSearch.awaitForElasticSearch();
 
+        List<String> mailboxIds = 
+                with()
+                .accept(ContentType.JSON)
+                .contentType(ContentType.JSON)
+                .header("Authorization", accessToken.serialize())
+                .body("[[\"getMailboxes\", {}, \"#0\"]]")
+                .post("/jmap")
+                .path("[0][1].list.id");
+        
         String response = given()
             .accept(ContentType.JSON)
             .contentType(ContentType.JSON)
             .header("Authorization", accessToken.serialize())
-            .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"mailbox\",\"mailbox2\"]}}, \"#0\"]]")
+            .body(String.format("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"%s\", \"%s\"]}}, \"#0\"]]", mailboxIds.get(0), mailboxIds.get(1)))
         .when()
             .post("/jmap")
         .then()

Modified: james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java
URL: http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java?rev=1725359&r1=1725358&r2=1725359&view=diff
==============================================================================
--- james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java (original)
+++ james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessageListMethod.java Mon Jan 18 22:06:31 2016
@@ -22,7 +22,7 @@ package org.apache.james.jmap.methods;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Optional;
-import java.util.stream.Collectors;
+import java.util.Set;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -42,11 +42,13 @@ import org.apache.james.mailbox.model.Ma
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.StoreMailboxPath;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.util.streams.Collectors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,6 +57,8 @@ import com.google.common.annotations.Vis
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 public class GetMessageListMethod<Id extends MailboxId> implements Method {
 
@@ -103,14 +107,14 @@ public class GetMessageListMethod<Id ext
         GetMessageListResponse.Builder builder = GetMessageListResponse.builder();
         try {
 
-            mailboxManager.list(mailboxSession)
-                    .stream()
-                    .filter(mailboxPath -> isMailboxRequested(jmapRequest, mailboxPath))
-                    .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest))
-                    .skip(jmapRequest.getPosition())
-                    .limit(limit(jmapRequest.getLimit()))
-                    .map(MessageId::serialize)
-                    .forEach(builder::messageId);
+            List<MailboxPath> mailboxPaths = mailboxManager.list(mailboxSession);
+            listRequestedMailboxes(jmapRequest, mailboxPaths, mailboxSession)
+                .stream()
+                .flatMap(mailboxPath -> listMessages(mailboxPath, mailboxSession, jmapRequest))
+                .skip(jmapRequest.getPosition())
+                .limit(limit(jmapRequest.getLimit()))
+                .map(MessageId::serialize)
+                .forEach(builder::messageId);
 
             return builder.build();
         } catch (MailboxException e) {
@@ -132,22 +136,26 @@ public class GetMessageListMethod<Id ext
         return SortToComparatorConvertor.comparatorFor(jmapRequest.getSort());
     }
 
-    private boolean isMailboxRequested(GetMessageListRequest jmapRequest, MailboxPath mailboxPath) {
-        if (jmapRequest.getFilter().isPresent()) {
-            return jmapRequest.getFilter()
-                .filter(FilterCondition.class::isInstance)
-                .map(FilterCondition.class::cast)
-                .map(FilterCondition::getInMailboxes)
-                .filter(list -> isMailboxInList(mailboxPath, list))
-                .isPresent();
-        }
-        return true;
-    }
-
-    private boolean isMailboxInList(MailboxPath mailboxPath, List<String> inMailboxes) {
-        return inMailboxes.contains(mailboxPath.getName());
+    private ImmutableSet<MailboxPath> listRequestedMailboxes(GetMessageListRequest jmapRequest, List<MailboxPath> mailboxPaths, MailboxSession session) {
+        ImmutableSet<MailboxPath> mailboxPathSet = ImmutableSet.copyOf(mailboxPaths);
+        return jmapRequest.getFilter()
+            .filter(FilterCondition.class::isInstance)
+            .map(FilterCondition.class::cast)
+            .map(FilterCondition::getInMailboxes)
+            .map(Throwing.function(mailboxIds -> mailboxIdsToMailboxPaths(mailboxIds, session)))
+            .map(requestedMailboxPaths -> Sets.intersection(requestedMailboxPaths, mailboxPathSet).immutableCopy())
+            .orElse(mailboxPathSet);
+    }
+
+    private Set<MailboxPath> mailboxIdsToMailboxPaths(List<String> mailboxIds, MailboxSession session) throws MailboxException {
+        Set<String> mailboxIdSet = Sets.newHashSet(mailboxIds);
+        return mailboxSessionMapperFactory.createMailboxMapper(session).list()
+                .stream()
+                .filter(mailbox -> mailboxIdSet.contains(mailbox.getMailboxId().serialize()))
+                .map(mailbox -> new StoreMailboxPath<>(mailbox))
+                .collect(Collectors.toImmutableSet());
     }
-
+    
     private Optional<MessageManager> getMessageManager(MailboxPath mailboxPath, MailboxSession mailboxSession) {
         try {
             return Optional.of(mailboxManager.getMailbox(mailboxPath, mailboxSession));
@@ -166,7 +174,7 @@ public class GetMessageListMethod<Id ext
             return ImmutableList.copyOf(messageManager.get().search(searchQuery, mailboxSession))
                     .stream()
                     .map(Throwing.function(messageId -> getMessage(mailboxPath, mailboxSession, messageMapper, messageId)))
-                    .collect(Collectors.toList());
+                    .collect(Collectors.toImmutableList());
         } catch (MailboxException e) {
             LOGGER.warn("Error when searching messages for query :" + searchQuery, e);
             return ImmutableList.of();



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