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-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to