Repository: james-project
Updated Branches:
  refs/heads/master c1d028086 -> 409344c12


JAMES-1680 Support ids parameter in getMailboxes query


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

Branch: refs/heads/master
Commit: 409344c12fe326fca6830cd68e609fe16d25f1e1
Parents: c1d0280
Author: Antoine Duprat <antdup...@gmail.com>
Authored: Tue Feb 2 14:41:49 2016 +0100
Committer: Antoine Duprat <antdup...@gmail.com>
Committed: Thu Feb 4 14:12:18 2016 +0100

----------------------------------------------------------------------
 .../apache/james/utils/ExtendedServerProbe.java |   4 +
 .../apache/james/utils/GuiceServerProbe.java    |  22 +++-
 .../jmap/methods/GetMailboxesMethodTest.java    | 102 ++++++++++++++++++-
 .../james/jmap/methods/GetMailboxesMethod.java  |  17 +++-
 .../james/jmap/model/GetMailboxesRequest.java   |  27 ++---
 .../jmap/model/GetMailboxesRequestTest.java     |  22 +++-
 6 files changed, 170 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
----------------------------------------------------------------------
diff --git 
a/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
 
b/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
index b4ce40d..fc27b61 100644
--- 
a/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
+++ 
b/server/container/cassandra-guice/src/main/java/org/apache/james/utils/ExtendedServerProbe.java
@@ -25,12 +25,16 @@ import java.util.Date;
 import javax.mail.Flags;
 
 import org.apache.james.cli.probe.ServerProbe;
+import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
 
 public interface ExtendedServerProbe extends ServerProbe {
 
     void appendMessage(String username, MailboxPath mailboxPath, InputStream 
message, Date internalDate, boolean isRecent, Flags flags) 
             throws BadCredentialsException, MailboxException;
+
+    Mailbox<CassandraId> getMailbox(String namespace, String user, String 
name);
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/container/cassandra-guice/src/main/java/org/apache/james/utils/GuiceServerProbe.java
----------------------------------------------------------------------
diff --git 
a/server/container/cassandra-guice/src/main/java/org/apache/james/utils/GuiceServerProbe.java
 
b/server/container/cassandra-guice/src/main/java/org/apache/james/utils/GuiceServerProbe.java
index 82ed1a8..151410f 100644
--- 
a/server/container/cassandra-guice/src/main/java/org/apache/james/utils/GuiceServerProbe.java
+++ 
b/server/container/cassandra-guice/src/main/java/org/apache/james/utils/GuiceServerProbe.java
@@ -36,12 +36,16 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
+import org.apache.james.mailbox.store.mail.MailboxMapper;
+import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.rrt.lib.Mappings;
 import org.apache.james.user.api.UsersRepository;
 import org.slf4j.Logger;
@@ -56,12 +60,14 @@ public class GuiceServerProbe implements 
ExtendedServerProbe {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GuiceServerProbe.class);
 
     private final MailboxManager mailboxManager;
+    private final MailboxMapperFactory<CassandraId> mailboxMapperFactory;
     private final DomainList domainList;
     private final UsersRepository usersRepository;
 
     @Inject
-    private GuiceServerProbe(MailboxManager mailboxManager, DomainList 
domainList, UsersRepository usersRepository) {
+    private GuiceServerProbe(MailboxManager mailboxManager, 
MailboxMapperFactory<CassandraId> mailboxMapperFactory, DomainList domainList, 
UsersRepository usersRepository) {
         this.mailboxManager = mailboxManager;
+        this.mailboxMapperFactory = mailboxMapperFactory;
         this.domainList = domainList;
         this.usersRepository = usersRepository;
     }
@@ -164,6 +170,20 @@ public class GuiceServerProbe implements 
ExtendedServerProbe {
         }
     }
 
+    @Override
+    public Mailbox<CassandraId> getMailbox(String namespace, String user, 
String name) {
+        MailboxSession mailboxSession = null;
+        try {
+            mailboxSession = mailboxManager.createSystemSession(user, LOGGER);
+            MailboxMapper<CassandraId> mailboxMapper = 
mailboxMapperFactory.getMailboxMapper(mailboxSession);
+            return mailboxMapper.findMailboxByPath(new MailboxPath(namespace, 
user, name));
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        } finally {
+            closeSession(mailboxSession);
+        }
+    }
+
     private void closeSession(MailboxSession session) {
         if (session != null) {
             mailboxManager.endProcessingRequest(session);

http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 
b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
index 3ed4ec2..7b23ab2 100644
--- 
a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
@@ -39,9 +39,11 @@ import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.JmapAuthentication;
 import org.apache.james.jmap.JmapServer;
 import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.mailbox.cassandra.CassandraId;
 import org.apache.james.mailbox.elasticsearch.EmbeddedElasticSearch;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -106,9 +108,76 @@ public abstract class GetMailboxesMethodTest {
             .content(equalTo("[[\"error\",{\"type\":\"Not yet 
implemented\"},\"#0\"]]"));
     }
 
-    
     @Test
-    public void 
getMailboxesShouldErrorNotSupportedWhenRequestContainsNonNullIds() throws 
Exception {
+    public void getMailboxesShouldReturnEmptyWhenIdsDoesntMatch() throws 
Exception {
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "name");
+
+        given()
+            .accept(ContentType.JSON)
+            .contentType(ContentType.JSON)
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMailboxes\", {\"ids\": [\"notAMailboxId\"]}, 
\"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body("[0][0]", equalTo("mailboxes"))
+            .body("[0][1].list", hasSize(0));
+    }
+
+    @Test
+    public void getMailboxesShouldReturnMailboxesWhenIdsMatch() throws 
Exception {
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "INBOX");
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "myMailbox");
+
+        Mailbox<CassandraId> mailbox = 
jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, 
"INBOX");
+        Mailbox<CassandraId> mailbox2 = 
jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, 
"myMailbox");
+
+        String mailboxId = mailbox.getMailboxId().serialize();
+        String mailboxId2 = mailbox2.getMailboxId().serialize();
+
+        given()
+            .accept(ContentType.JSON)
+            .contentType(ContentType.JSON)
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMailboxes\", {\"ids\": [\"" + mailboxId + "\", \"" + 
mailboxId2 + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body("[0][0]", equalTo("mailboxes"))
+            .body("[0][1].list", hasSize(2))
+            .body("[0][1].list[0].id", equalTo(mailboxId))
+            .body("[0][1].list[1].id", equalTo(mailboxId2));
+    }
+
+    @Test
+    public void getMailboxesShouldReturnOnlyMatchingMailboxesWhenIdsGiven() 
throws Exception {
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "INBOX");
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "myMailbox");
+
+        Mailbox<CassandraId> mailbox = 
jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, 
"INBOX");
+
+        String mailboxId = mailbox.getMailboxId().serialize();
+
+        given()
+            .accept(ContentType.JSON)
+            .contentType(ContentType.JSON)
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMailboxes\", {\"ids\": [\"" + mailboxId + "\"]}, 
\"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body("[0][0]", equalTo("mailboxes"))
+            .body("[0][1].list", hasSize(1))
+            .body("[0][1].list[0].id", equalTo(mailboxId));
+    }
+
+    @Test
+    public void getMailboxesShouldReturnEmptyWhenIdsIsEmpty() throws Exception 
{
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "INBOX");
+
         given()
             .accept(ContentType.JSON)
             .contentType(ContentType.JSON)
@@ -118,7 +187,34 @@ public abstract class GetMailboxesMethodTest {
             .post("/jmap")
         .then()
             .statusCode(200)
-            .content(equalTo("[[\"error\",{\"type\":\"Not yet 
implemented\"},\"#0\"]]"));
+            .body("[0][0]", equalTo("mailboxes"))
+            .body("[0][1].list", hasSize(0));
+    }
+
+    @Test
+    public void getMailboxesShouldReturnAllMailboxesWhenIdsIsNull() throws 
Exception {
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "INBOX");
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, 
username, "myMailbox");
+
+        Mailbox<CassandraId> mailbox = 
jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, 
"INBOX");
+        Mailbox<CassandraId> mailbox2 = 
jmapServer.serverProbe().getMailbox(MailboxConstants.USER_NAMESPACE, username, 
"myMailbox");
+
+        String mailboxId = mailbox.getMailboxId().serialize();
+        String mailboxId2 = mailbox2.getMailboxId().serialize();
+
+        given()
+            .accept(ContentType.JSON)
+            .contentType(ContentType.JSON)
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMailboxes\", {\"ids\": null}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body("[0][0]", equalTo("mailboxes"))
+            .body("[0][1].list", hasSize(2))
+            .body("[0][1].list[0].id", equalTo(mailboxId))
+            .body("[0][1].list[1].id", equalTo(mailboxId2));
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
index 7051006..2285ff6 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
@@ -22,12 +22,11 @@ package org.apache.james.jmap.methods;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMailboxesRequest;
 import org.apache.james.jmap.model.GetMailboxesResponse;
@@ -51,6 +50,9 @@ import org.slf4j.LoggerFactory;
 import com.google.common.annotations.VisibleForTesting;
 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 GetMailboxesMethod<Id extends MailboxId> implements Method {
 
@@ -83,7 +85,7 @@ public class GetMailboxesMethod<Id extends MailboxId> 
implements Method {
         GetMailboxesRequest mailboxesRequest = (GetMailboxesRequest) request;
         return Stream.of(
                 JmapResponse.builder().clientId(clientId)
-                .response(getMailboxesResponse(mailboxSession))
+                .response(getMailboxesResponse(mailboxesRequest, 
mailboxSession))
                 
.properties(mailboxesRequest.getProperties().map(this::ensureContainsId))
                 .responseName(RESPONSE_NAME)
                 .build());
@@ -93,7 +95,7 @@ public class GetMailboxesMethod<Id extends MailboxId> 
implements Method {
         return Sets.union(input, 
ImmutableSet.of(MailboxProperty.ID)).immutableCopy();
     }
 
-    private GetMailboxesResponse getMailboxesResponse(MailboxSession 
mailboxSession) {
+    private GetMailboxesResponse getMailboxesResponse(GetMailboxesRequest 
mailboxesRequest, MailboxSession mailboxSession) {
         GetMailboxesResponse.Builder builder = GetMailboxesResponse.builder();
         try {
             retrieveUserMailboxes(mailboxSession)
@@ -102,6 +104,7 @@ public class GetMailboxesMethod<Id extends MailboxId> 
implements Method {
                 .map(mailboxPath -> mailboxFromMailboxPath(mailboxPath, 
mailboxSession))
                 .filter(Optional::isPresent)
                 .map(Optional::get)
+                .filter(filterMailboxesById(mailboxesRequest.getIds()))
                 .sorted((m1, m2) -> Integer.compare(m1.getSortOrder(), 
m2.getSortOrder()))
                 .forEach(mailbox -> builder.add(mailbox));
             return builder.build();
@@ -109,7 +112,11 @@ public class GetMailboxesMethod<Id extends MailboxId> 
implements Method {
             throw Throwables.propagate(e);
         }
     }
-    
+
+    private Predicate<? super Mailbox> 
filterMailboxesById(Optional<ImmutableList<String>> ids) {
+        return (mailbox -> ids.map(list -> 
list.contains(mailbox.getId())).orElse(true));
+    }
+
     private List<MailboxMetaData> retrieveUserMailboxes(MailboxSession 
session) throws MailboxException {
         return mailboxManager.search(
                 MailboxQuery.builder(session).privateUserMailboxes().build(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
index 9d3f24a..722d86b 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/GetMailboxesRequest.java
@@ -18,16 +18,17 @@
  ****************************************************************/
 package org.apache.james.jmap.model;
 
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import java.util.List;
+import java.util.Optional;
+
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.jmap.methods.JmapRequest;
 import org.apache.james.util.streams.Collectors;
 
-import java.util.List;
-import java.util.Optional;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 @JsonDeserialize(builder = GetMailboxesRequest.Builder.class)
 public class GetMailboxesRequest implements JmapRequest {
@@ -41,10 +42,10 @@ public class GetMailboxesRequest implements JmapRequest {
 
         private String accountId;
         private Optional<ImmutableSet<MailboxProperty>> properties;
-        private final ImmutableList.Builder<String> ids;
+        private Optional<ImmutableList<String>> ids;
 
         private Builder() {
-            ids = ImmutableList.builder();
+            ids = Optional.empty();
             properties = Optional.empty();
         }
 
@@ -57,7 +58,7 @@ public class GetMailboxesRequest implements JmapRequest {
 
         public Builder ids(List<String> ids) {
             if (ids != null) {
-                throw new NotImplementedException();
+                this.ids = Optional.of(ImmutableList.copyOf(ids));
             }
             return this;
         }
@@ -73,15 +74,15 @@ public class GetMailboxesRequest implements JmapRequest {
         }
         
         public GetMailboxesRequest build() {
-            return new GetMailboxesRequest(Optional.ofNullable(accountId), 
ids.build(), properties);
+            return new GetMailboxesRequest(Optional.ofNullable(accountId), 
ids, properties);
         }
     }
 
     private final Optional<String> accountId;
-    private final List<String> ids;
+    private final Optional<ImmutableList<String>> ids;
     private final Optional<ImmutableSet<MailboxProperty>> properties;
 
-    private GetMailboxesRequest(Optional<String> accountId, List<String> ids, 
Optional<ImmutableSet<MailboxProperty>> properties) {
+    private GetMailboxesRequest(Optional<String> accountId, 
Optional<ImmutableList<String>> ids, Optional<ImmutableSet<MailboxProperty>> 
properties) {
         this.accountId = accountId;
         this.ids = ids;
         this.properties = properties;
@@ -91,7 +92,7 @@ public class GetMailboxesRequest implements JmapRequest {
         return accountId;
     }
 
-    public List<String> getIds() {
+    public Optional<ImmutableList<String>> getIds() {
         return ids;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/409344c1/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMailboxesRequestTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMailboxesRequestTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMailboxesRequestTest.java
index 6a5dc8a..ca78fd8 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMailboxesRequestTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMailboxesRequestTest.java
@@ -33,12 +33,30 @@ public class GetMailboxesRequestTest {
         GetMailboxesRequest.builder().accountId("1");
     }
 
-    @Test(expected=NotImplementedException.class)
-    public void builderShouldThrowWhenIds() {
+    @Test
+    public void builderShouldNotThrowWhenIds() {
         GetMailboxesRequest.builder().ids(ImmutableList.of());
     }
 
     @Test
+    public void idsShouldBeEmptyListWhenEmptyList() {
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
+            .ids(ImmutableList.of())
+            .build();
+        assertThat(getMailboxesRequest.getIds()).isPresent();
+        assertThat(getMailboxesRequest.getIds().get()).hasSize(0);
+    }
+
+    @Test
+    public void idsShouldBePresentWhenListIsNotEmpty() {
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
+            .ids(ImmutableList.of("123"))
+            .build();
+        assertThat(getMailboxesRequest.getIds()).isPresent();
+        assertThat(getMailboxesRequest.getIds().get()).containsExactly("123");
+    }
+
+    @Test
     public void propertiesShouldBeEmptyWhenNotGiven() {
         GetMailboxesRequest getMailboxesRequest = 
GetMailboxesRequest.builder().build();
         assertThat(getMailboxesRequest.getProperties()).isEmpty();


---------------------------------------------------------------------
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