Author: matthieu
Date: Wed Dec 16 15:31:32 2015
New Revision: 1720373

URL: http://svn.apache.org/viewvc?rev=1720373&view=rev
Log:
JAMES-1646 handle sortOrder based on mailbox Role

Added:
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
Modified:
    
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java

Modified: 
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java?rev=1720373&r1=1720372&r2=1720373&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 Wed Dec 16 15:31:32 2015
@@ -22,15 +22,20 @@ package org.apache.james.jmap.methods;
 import static com.jayway.restassured.RestAssured.given;
 import static com.jayway.restassured.config.EncoderConfig.encoderConfig;
 import static com.jayway.restassured.config.RestAssuredConfig.newConfig;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.endsWith;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.startsWith;
 
 import java.io.ByteArrayInputStream;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 import javax.mail.Flags;
 
+import com.google.common.collect.ImmutableMap;
+import com.jayway.jsonpath.JsonPath;
 import org.apache.james.backends.cassandra.EmbeddedCassandra;
 import org.apache.james.jmap.JmapAuthentication;
 import org.apache.james.jmap.JmapServer;
@@ -167,6 +172,33 @@ public abstract class GetMailboxesMethod
         .then()
             .statusCode(200)
             
.content(startsWith("[[\"mailboxes\",{\"accountId\":null,\"state\":null,\"list\":[{\"id\":\""),
 
-                    
endsWith("\",\"name\":\"name\",\"parentId\":null,\"role\":null,\"sortOrder\":0,\"mustBeOnlyMailbox\":false,\"mayReadItems\":false,\"mayAddItems\":false,\"mayRemoveItems\":false,\"mayCreateChild\":false,\"mayRename\":false,\"mayDelete\":false,\"totalMessages\":0,\"unreadMessages\":1,\"totalThreads\":0,\"unreadThreads\":0}],\"notFound\":null},\"#0\"]]"));
+                    
endsWith("\",\"name\":\"name\",\"parentId\":null,\"role\":null,\"sortOrder\":1000,\"mustBeOnlyMailbox\":false,\"mayReadItems\":false,\"mayAddItems\":false,\"mayRemoveItems\":false,\"mayCreateChild\":false,\"mayRename\":false,\"mayDelete\":false,\"totalMessages\":0,\"unreadMessages\":1,\"totalThreads\":0,\"unreadThreads\":0}],\"notFound\":null},\"#0\"]]"));
     }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void getMailboxesShouldReturnMailboxesWithSortOrder() throws 
Exception {
+        String user = "user";
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, user, 
"inbox");
+        
jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, user, 
"trash");
+
+        String response = given()
+                .accept(ContentType.JSON)
+                .contentType(ContentType.JSON)
+                .header("Authorization", accessToken.serialize())
+                .body("[[\"getMailboxes\", {}, \"#0\"]]")
+            .when()
+                .post("/jmap")
+            .then()
+                .statusCode(200)
+                
.content(startsWith("[[\"mailboxes\",{\"accountId\":null,\"state\":null,\"list\":[{\"id\":\""))
+                .extract()
+                .asString();
+        assertThat(JsonPath.parse(response).<List<Map<String, 
Object>>>read("$.[0].[1].list[*].['name','sortOrder']"))
+                .hasSize(2)
+                .containsOnly(
+                        ImmutableMap.of("name", "trash", "sortOrder", 60),
+                        ImmutableMap.of("name", "inbox", "sortOrder", 10));
+    }
+
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java?rev=1720373&r1=1720372&r2=1720373&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMailboxesMethod.java
 Wed Dec 16 15:31:32 2015
@@ -27,6 +27,7 @@ import org.apache.james.jmap.model.GetMa
 import org.apache.james.jmap.model.GetMailboxesResponse;
 import org.apache.james.jmap.model.mailbox.Mailbox;
 import org.apache.james.jmap.model.mailbox.Role;
+import org.apache.james.jmap.model.mailbox.SortOrder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
@@ -43,12 +44,12 @@ import com.google.common.base.Preconditi
 import com.google.common.base.Throwables;
 
 public class GetMailboxesMethod<Id extends MailboxId> implements Method {
-    
+
     private static final boolean DONT_RESET_RECENT = false;
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GetMailboxesMethod.class);
     private static final Method.Request.Name METHOD_NAME = 
Method.Request.name("getMailboxes");
     private static final Method.Response.Name RESPONSE_NAME = 
Method.Response.name("mailboxes");
-    
+
     private final MailboxManager mailboxManager; 
     private final MailboxMapperFactory<Id> mailboxMapperFactory;
 
@@ -96,11 +97,13 @@ public class GetMailboxesMethod<Id exten
     
     private Optional<Mailbox> mailboxFromMailboxPath(MailboxPath mailboxPath, 
MailboxSession mailboxSession) {
         try {
+            Optional<Role> role = Role.from(mailboxPath.getName());
             return Optional.ofNullable(Mailbox.builder()
                     .id(getMailboxId(mailboxPath, mailboxSession))
                     .name(mailboxPath.getName())
-                    .role(Role.from(mailboxPath.getName()))
+                    .role(role)
                     .unreadMessages(unreadMessages(mailboxPath, 
mailboxSession))
+                    .sortOrder(SortOrder.getSortOrder(role))
                     .build());
         } catch (MailboxException e) {
             LOGGER.warn("Cannot find mailbox for :" + mailboxPath.getName(), 
e);

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java?rev=1720373&r1=1720372&r2=1720373&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Mailbox.java
 Wed Dec 16 15:31:32 2015
@@ -285,5 +285,13 @@ public class Mailbox {
         return Objects.hash(id, name, parentId, role, sortOrder, 
mustBeOnlyMailbox, mayReadItems, mayAddItems, 
                 mayRemoveItems, mayCreateChild, mayRename, mayDelete, 
totalMessages, unreadMessages, totalThreads, unreadThreads);
     }
-    
+
+    @Override
+    public String toString() {
+        return com.google.common.base.Objects.toStringHelper(getClass())
+                .add("id", id)
+                .add("name", name)
+                .add("sortOrder", sortOrder)
+                .toString();
+    }
 }

Added: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java?rev=1720373&view=auto
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
 (added)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/SortOrder.java
 Wed Dec 16 15:31:32 2015
@@ -0,0 +1,50 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.jmap.model.mailbox;
+
+import com.google.common.collect.ImmutableMap;
+
+import java.util.Optional;
+
+public class SortOrder {
+
+    private static final int DEFAULT_SORT_ORDER = 1000;
+    private static final ImmutableMap<Role, Integer> defaultSortOrders =
+            ImmutableMap.<Role, Integer>builder()
+                .put(Role.INBOX, 10)
+                .put(Role.ARCHIVE, 20)
+                .put(Role.DRAFTS, 30)
+                .put(Role.OUTBOX, 40)
+                .put(Role.SENT, 50)
+                .put(Role.TRASH, 60)
+                .put(Role.SPAM, 70)
+                .put(Role.TEMPLATES, 80)
+                .build();
+
+    private static Optional<Integer> getDefaultSortOrder(Role role) {
+        return Optional.ofNullable(defaultSortOrders.get(role));
+    }
+
+    public static Integer getSortOrder(Optional<Role> role) {
+        return role
+                .map(SortOrder::getDefaultSortOrder)
+                .map(Optional::get)
+                .orElse(DEFAULT_SORT_ORDER);
+    }
+}

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java?rev=1720373&r1=1720372&r2=1720373&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 Wed Dec 16 15:31:32 2015
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.inmemory
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.MockAuthenticator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.assertj.core.groups.Tuple;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -85,13 +86,85 @@ public class GetMailboxesMethodTest {
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
-        Mailbox expectedMailbox = Mailbox.builder()
-                .id("1")
-                .name(mailboxPath.getName())
-                .unreadMessages(2)
+        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
+        assertThat(getMailboxesResponse.getList())
+                .extracting(Mailbox::getId, Mailbox::getName, 
Mailbox::getUnreadMessages)
+                .containsOnly(Tuple.tuple("1", mailboxPath.getName(), 2L));
+    }
+
+    @Test
+    public void getMailboxesShouldReturnInboxWithSortOrder10() throws 
Exception {
+        MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USERNAME, LOGGER);
+        MailboxPath mailboxPath = new MailboxPath("#private", USERNAME, 
"INBOX");
+        mailboxManager.createMailbox(mailboxPath, mailboxSession);
+
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
+                .build();
+
+        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
+        assertThat(getMailboxesResponse.getList())
+                .hasSize(1)
+                .extracting(Mailbox::getSortOrder)
+                .containsOnly(10);
+    }
+
+    @Test
+    public void getMailboxesShouldReturnSortOrder1000OnUnknownFolder() throws 
Exception {
+        MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USERNAME, LOGGER);
+        MailboxPath mailboxPath = new MailboxPath("#private", USERNAME, 
"unknown");
+        mailboxManager.createMailbox(mailboxPath, mailboxSession);
+
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
+                .build();
+
+        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
+        assertThat(getMailboxesResponse.getList())
+                .extracting(Mailbox::getSortOrder)
+                .containsOnly(1000);
+    }
+
+    @Test
+    public void getMailboxesShouldReturnInboxWithSortOrder10OnDifferenceCase() 
throws Exception {
+        MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USERNAME, LOGGER);
+        MailboxPath mailboxPath = new MailboxPath("#private", USERNAME, 
"InBoX");
+        mailboxManager.createMailbox(mailboxPath, mailboxSession);
+
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
 
         GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
-        
assertThat(getMailboxesResponse.getList()).containsOnly(expectedMailbox);
+        assertThat(getMailboxesResponse.getList())
+                .extracting(Mailbox::getSortOrder)
+                .containsOnly(10);
     }
+
+    @Test
+    public void getMailboxesShouldReturnMailboxesWithSortOrder() throws 
Exception {
+        MailboxSession mailboxSession = 
mailboxManager.createSystemSession(USERNAME, LOGGER);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"INBOX"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"ARCHIVE"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"DRAFTS"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"OUTBOX"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"SENT"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"TRASH"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"SPAM"), mailboxSession);
+        mailboxManager.createMailbox(new MailboxPath("#private", USERNAME, 
"TEMPLATES"), mailboxSession);
+
+        GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
+                .build();
+
+        GetMailboxesResponse getMailboxesResponse = 
getMailboxesMethod.process(getMailboxesRequest, mailboxSession);
+        assertThat(getMailboxesResponse.getList())
+                .extracting(Mailbox::getName, Mailbox::getSortOrder)
+                .containsExactly(
+                        Tuple.tuple("INBOX", 10),
+                        Tuple.tuple("ARCHIVE", 20),
+                        Tuple.tuple("DRAFTS", 30),
+                        Tuple.tuple("OUTBOX", 40),
+                        Tuple.tuple("SENT", 50),
+                        Tuple.tuple("TRASH", 60),
+                        Tuple.tuple("SPAM", 70),
+                        Tuple.tuple("TEMPLATES", 80));
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to