Author: matthieu
Date: Fri Dec 11 12:35:21 2015
New Revision: 1719394

URL: http://svn.apache.org/viewvc?rev=1719394&view=rev
Log:
JAMES-1644 (feature disabled) retrieve Message properties in GetMessagesMethod

Modified:
    
james/project/trunk/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Mailbox.java
    
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Property.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
    
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMessagesRequestTest.java

Modified: 
james/project/trunk/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
 (original)
+++ 
james/project/trunk/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
 Fri Dec 11 12:35:21 2015
@@ -37,7 +37,7 @@ public class InMemoryMailboxMapper imple
     
     private static final int INITIAL_SIZE = 128;
     private final Map<InMemoryId, Mailbox<InMemoryId>> mailboxesById;
-    private final static AtomicLong IDS = new AtomicLong();
+    private final AtomicLong mailboxIdGenerator = new AtomicLong();
 
     public InMemoryMailboxMapper() {
         mailboxesById = new ConcurrentHashMap<InMemoryId, 
Mailbox<InMemoryId>>(INITIAL_SIZE);
@@ -99,7 +99,7 @@ public class InMemoryMailboxMapper imple
     public void save(Mailbox<InMemoryId> mailbox) throws MailboxException {
         InMemoryId id = mailbox.getMailboxId();
         if (id == null) {
-            id = InMemoryId.of(IDS.incrementAndGet());
+            id = InMemoryId.of(mailboxIdGenerator.incrementAndGet());
             ((SimpleMailbox<InMemoryId>) mailbox).setMailboxId(id);
         }
         mailboxesById.put(id, mailbox);

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
 Fri Dec 11 12:35:21 2015
@@ -31,7 +31,9 @@ import javax.inject.Inject;
 import org.apache.james.jmap.model.GetMessagesRequest;
 import org.apache.james.jmap.model.GetMessagesResponse;
 import org.apache.james.jmap.model.Message;
+import org.apache.james.jmap.model.Message.Builder;
 import org.apache.james.jmap.model.MessageId;
+import org.apache.james.jmap.model.Property;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
@@ -43,8 +45,11 @@ import org.apache.james.mailbox.store.ma
 import org.javatuples.Pair;
 
 import com.github.fge.lambdas.Throwing;
+import com.github.fge.lambdas.functions.ThrowingBiFunction;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 
 public class GetMessagesMethod<Id extends MailboxId> implements Method {
 
@@ -79,11 +84,13 @@ public class GetMessagesMethod<Id extend
         GetMessagesRequest getMessagesRequest = (GetMessagesRequest) request;
         
         Function<MessageId, 
Stream<Pair<org.apache.james.mailbox.store.mail.model.Message<Id>, 
MailboxPath>>> loadMessages = loadMessage(mailboxSession);
-        Function<Pair<org.apache.james.mailbox.store.mail.model.Message<Id>, 
MailboxPath>, Message> toJmapMessage = toJmapMessage(mailboxSession);
+        Function<Pair<org.apache.james.mailbox.store.mail.model.Message<Id>, 
MailboxPath>, Message> convertToJmapMessage = toJmapMessage(mailboxSession);
+        Function<Message, Message> filterFields = new 
JmapMessageFactory(getMessagesRequest);
         
         List<Message> result = getMessagesRequest.getIds().stream()
             .flatMap(loadMessages)
-            .map(toJmapMessage)
+            .map(convertToJmapMessage)
+//            .map(filterFields)
             .collect(Collectors.toList());
 
         return new GetMessagesResponse(result);
@@ -101,7 +108,6 @@ public class GetMessagesMethod<Id extend
                                     
Pair<org.apache.james.mailbox.store.mail.model.Message<Id>, 
                                          MailboxPath>>> 
                 loadMessage(MailboxSession mailboxSession) {
-        
         return Throwing
                 .function((MessageId messageId) -> {
                      MailboxPath mailboxPath = 
messageId.getMailboxPath(mailboxSession);
@@ -123,4 +129,33 @@ public class GetMessagesMethod<Id extend
         return targetStream.map(x -> Pair.with(x, mailboxPath));
     }
 
+    private static class JmapMessageFactory implements Function<Message, 
Message> {
+        
+        public ImmutableMap<Property, ThrowingBiFunction<Message, 
Message.Builder, Message.Builder>> fieldCopiers = 
+                ImmutableMap.of(
+                        Property.id, (message, builder) -> 
builder.id(message.getId()),
+                        Property.subject, (message, builder) -> 
builder.subject(message.getSubject())
+                        );
+        
+        private final ImmutableList<Property> selectedProperties;
+        
+        public JmapMessageFactory(GetMessagesRequest messagesRequest) {
+            this.selectedProperties = 
messagesRequest.getProperties().orElse(Property.all());
+        }
+
+        @Override
+        public Message apply(Message input) {
+            Message.Builder builder = Message.builder();
+            
+            selectCopiers().forEach(f -> f.apply(input, builder));
+            
+            return builder.build();
+        }
+
+        private Stream<ThrowingBiFunction<Message, Builder, Builder>> 
selectCopiers() {
+            return Stream.concat(selectedProperties.stream(), 
Stream.of(Property.id))
+                .filter(fieldCopiers::containsKey)
+                .map(fieldCopiers::get);
+        }   
+    }
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Mailbox.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Mailbox.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Mailbox.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Mailbox.java
 Fri Dec 11 12:35:21 2015
@@ -285,4 +285,5 @@ public class Mailbox {
         return Objects.hash(id, name, parentId, role, sortOrder, 
mustBeOnlyMailbox, mayReadItems, mayAddItems, 
                 mayRemoveItems, mayCreateChild, mayRename, mayDelete, 
totalMessages, unreadMessages, totalThreads, unreadThreads);
     }
+    
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Property.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Property.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Property.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Property.java
 Fri Dec 11 12:35:21 2015
@@ -18,6 +18,47 @@
  ****************************************************************/
 package org.apache.james.jmap.model;
 
-public class Property {
+import com.google.common.collect.ImmutableList;
 
+public enum Property {
+    id("id"),
+    blobId("blobId"),
+    threadId("threadId"),
+    mailboxIds("mailboxIds"),
+    inReplyToMessageId("inReplyToMessageId"),
+    isUnread("isUnread"),
+    isFlagged("isFlagged"),
+    isAnswered("isAnswered"),
+    isDraft("isDraft"),
+    hasAttachment("hasAttachment"),
+    headers("headers"),
+    from("from"),
+    to("to"),
+    cc("cc"),
+    bcc("bcc"),
+    replyTo("replyTo"),
+    subject("subject"),
+    date("date"),
+    size("size"),
+    preview("preview"),
+    textBody("textBody"),
+    htmlBody("htmlBody"),
+    attachments("attachments"),
+    attachedMessages("attachedMessages"),
+    body("body"),
+    headers_property("headers.property");
+    
+    private String property;
+
+    private Property(String property) {
+        this.property = property;
+    }
+    
+    public String getProperty() {
+        return property;
+    }
+    
+    public static ImmutableList<Property> all() {
+        return ImmutableList.copyOf(values());
+    }
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
 Fri Dec 11 12:35:21 2015
@@ -29,7 +29,9 @@ import java.util.Locale;
 
 import org.apache.james.jmap.model.GetMessagesRequest;
 import org.apache.james.jmap.model.GetMessagesResponse;
+import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageId;
+import org.apache.james.jmap.model.Property;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
@@ -40,6 +42,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;
@@ -120,11 +123,13 @@ public class GetMessagesMethodTest {
     @Test
     public void processShouldFetchMessages() throws MailboxException {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
-        ByteArrayInputStream messageContent = new ByteArrayInputStream("my 
message".getBytes(Charsets.UTF_8));
         Date now = new Date();
-        long message1Uid = inbox.appendMessage(messageContent, now, session, 
false, null);
-        long message2Uid = inbox.appendMessage(messageContent, now, session, 
false, null);
-        long message3Uid = inbox.appendMessage(messageContent, now, session, 
false, null);
+        ByteArrayInputStream message1Content = new 
ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message1Uid = inbox.appendMessage(message1Content, now, session, 
false, null);
+        ByteArrayInputStream message2Content = new 
ByteArrayInputStream("Subject: message 2 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message2Uid = inbox.appendMessage(message2Content, now, session, 
false, null);
+        ByteArrayInputStream message3Content = new 
ByteArrayInputStream("Great-Header: message 3 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message3Uid = inbox.appendMessage(message3Content, now, session, 
false, null);
         
         GetMessagesRequest request = GetMessagesRequest.builder()
                 .ids(new MessageId(ROBERT, inboxPath, message1Uid),
@@ -135,7 +140,71 @@ public class GetMessagesMethodTest {
         GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
         GetMessagesResponse result = testee.process(request, session);
         
-        assertThat(result.list()).extracting(message -> 
message.getId().getUid()).containsOnly(message1Uid, message2Uid, message3Uid);
+        assertThat(result.list())
+            .extracting(message -> message.getId().getUid(), 
Message::getSubject)
+            .containsOnly(
+                    Tuple.tuple(message1Uid, "message 1 subject"), 
+                    Tuple.tuple(message2Uid, "message 2 subject"),
+                    Tuple.tuple(message3Uid, "(No subject)"));
+    }
+
+    @Test
+    public void processShouldReturnOnlyMessageIdsOnEmptyPropertyList() throws 
MailboxException {
+        MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
+        Date now = new Date();
+        ByteArrayInputStream message1Content = new 
ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message1Uid = inbox.appendMessage(message1Content, now, session, 
false, null);
+        
+        GetMessagesRequest request = GetMessagesRequest.builder()
+                .ids(new MessageId(ROBERT, inboxPath, message1Uid))
+                .properties(new Property[0])
+                .build();
+
+        GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
+        GetMessagesResponse result = testee.process(request, session);
+        
+        assertThat(result.list())
+            .extracting(message -> message.getId().getUid(), 
Message::getSubject)
+            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
+    }
+
+    @Test
+    public void processShouldReturnIdWhenNotInPropertyList() throws 
MailboxException {
+        MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
+        Date now = new Date();
+        ByteArrayInputStream message1Content = new 
ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message1Uid = inbox.appendMessage(message1Content, now, session, 
false, null);
+        
+        GetMessagesRequest request = GetMessagesRequest.builder()
+                .ids(new MessageId(ROBERT, inboxPath, message1Uid))
+                .properties(Property.subject)
+                .build();
+
+        GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
+        GetMessagesResponse result = testee.process(request, session);
+        
+        assertThat(result.list())
+            .extracting(message -> message.getId().getUid(), 
Message::getSubject)
+            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
     }
     
+    @Test
+    public void processShouldReturnAllFieldsWhenUndefinedPropertyList() throws 
MailboxException {
+        MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
+        Date now = new Date();
+        ByteArrayInputStream message1Content = new 
ByteArrayInputStream("Subject: message 1 subject\r\n\r\nmy 
message".getBytes(Charsets.UTF_8));
+        long message1Uid = inbox.appendMessage(message1Content, now, session, 
false, null);
+        
+        GetMessagesRequest request = GetMessagesRequest.builder()
+                .ids(new MessageId(ROBERT, inboxPath, message1Uid))
+                .build();
+
+        GetMessagesMethod<InMemoryId> testee = new 
GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
+        GetMessagesResponse result = testee.process(request, session);
+        
+        assertThat(result.list())
+            .extracting(message -> message.getId().getUid(), 
Message::getSubject)
+            .containsOnly(Tuple.tuple(message1Uid, "message 1 subject")); 
+    }
+
 }

Modified: 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMessagesRequestTest.java
URL: 
http://svn.apache.org/viewvc/james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMessagesRequestTest.java?rev=1719394&r1=1719393&r2=1719394&view=diff
==============================================================================
--- 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMessagesRequestTest.java
 (original)
+++ 
james/project/trunk/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/GetMessagesRequestTest.java
 Fri Dec 11 12:35:21 2015
@@ -29,7 +29,7 @@ public class GetMessagesRequestTest {
 
     @Test
     public void shouldAllowOptionalAccountId() {
-        GetMessagesRequest result = 
GetMessagesRequest.builder().ids(MessageId.of("user-inbox-1")).properties(new 
Property()).build();
+        GetMessagesRequest result = 
GetMessagesRequest.builder().ids(MessageId.of("user-inbox-1")).properties(Property.id).build();
         assertThat(result).isNotNull();
         assertThat(result.getAccountId()).isEmpty();
     }
@@ -41,7 +41,7 @@ public class GetMessagesRequestTest {
 
     @Test
     public void shouldAllowEmptyMessagesList() {
-        GetMessagesRequest result = 
GetMessagesRequest.builder().accountId("accountId").ids().properties(new 
Property()).build();
+        GetMessagesRequest result = 
GetMessagesRequest.builder().accountId("accountId").ids().properties(Property.id).build();
         assertThat(result).isNotNull();
         assertThat(result.getIds()).isEmpty();
     }



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

Reply via email to