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/03/10 13:47:37 UTC

[2/3] james-project git commit: JAMES-1701 Allow to read a HTML email

JAMES-1701 Allow to read a HTML email


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

Branch: refs/heads/master
Commit: 9a026e30f0641752b2b0af4d5fe88792fd5a1948
Parents: a7be8b1
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Mar 9 11:56:49 2016 +0100
Committer: Matthieu Baechler <ma...@linagora.com>
Committed: Thu Mar 10 13:46:10 2016 +0100

----------------------------------------------------------------------
 .../jmap/methods/GetMessagesMethodTest.java     | 31 ++++++++++++++++++
 .../org/apache/james/jmap/model/Message.java    | 30 ++++++++++++++++-
 .../jmap/methods/GetMessagesMethodTest.java     | 34 +++++++++++++++++---
 3 files changed, 90 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9a026e30/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
index af85d2e..234c6b9 100644
--- a/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
@@ -192,6 +192,37 @@ public abstract class GetMessagesMethodTest {
             .body(ARGUMENTS + ".list[0].headers", equalTo(ImmutableMap.of("subject", "my test subject")))
             .body(ARGUMENTS + ".list[0].date", equalTo("2014-10-30T14:12:00Z"));
     }
+
+    @Test
+    public void getMessagesShouldReturnMessageWhenHtmlMessage() throws Exception {
+        jmapServer.serverProbe().createMailbox(MailboxConstants.USER_NAMESPACE, username, "inbox");
+
+        ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z");
+        jmapServer.serverProbe().appendMessage(username, new MailboxPath(MailboxConstants.USER_NAMESPACE, username, "inbox"),
+                new ByteArrayInputStream("Content-Type: text/html\r\nSubject: my test subject\r\n\r\nThis is a <b>HTML</b> mail".getBytes()), Date.from(dateTime.toInstant()), false, new Flags());
+        
+        embeddedElasticSearch.awaitForElasticSearch();
+        
+        given()
+            .accept(ContentType.JSON)
+            .contentType(ContentType.JSON)
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + username + "|inbox|1\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(ARGUMENTS + ".list[0].id", equalTo(username + "|inbox|1"))
+            .body(ARGUMENTS + ".list[0].threadId", equalTo(username + "|inbox|1"))
+            .body(ARGUMENTS + ".list[0].subject", equalTo("my test subject"))
+            .body(ARGUMENTS + ".list[0].htmlBody", equalTo("This is a <b>HTML</b> mail"))
+            .body(ARGUMENTS + ".list[0].isUnread", equalTo(true))
+            .body(ARGUMENTS + ".list[0].preview", equalTo("This is a <b>HTML</b> mail"))
+            .body(ARGUMENTS + ".list[0].headers", equalTo(ImmutableMap.of("content-type", "text/html", "subject", "my test subject")))
+            .body(ARGUMENTS + ".list[0].date", equalTo("2014-10-30T14:12:00Z"));
+    }
     
     @Test
     public void getMessagesShouldReturnFilteredPropertiesMessagesWhenAsked() throws Exception {

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a026e30/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
index a7e3609..cbe60cb 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
@@ -45,6 +45,8 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimap;
+import com.google.common.net.MediaType;
+
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 @JsonDeserialize(builder = Message.Builder.class)
@@ -86,7 +88,8 @@ public class Message {
                 .size(im.getSize())
                 .date(getInternalDate(mailboxMessage, im))
                 .preview(getPreview(im))
-                .textBody(im.getBodyText().map(Strings::emptyToNull).orElse(null))
+                .textBody(getTextBody(im))
+                .htmlBody(getHtmlBody(im))
                 .build();
     }
 
@@ -155,6 +158,31 @@ public class Message {
         return ZonedDateTime.ofInstant(mailboxMessage.getInternalDate().toInstant(), UTC_ZONE_ID);
     }
 
+    private static String getTextBody(IndexableMessage im) {
+        if (isText(im) && !isHtml(im)) {
+            return im.getBodyText().map(Strings::emptyToNull).orElse(null);
+        }
+        return null;
+    }
+
+    private static String getHtmlBody(IndexableMessage im) {
+        if (isText(im) && isHtml(im)) {
+            return im.getBodyText().map(Strings::emptyToNull).orElse(null);
+        }
+        return null;
+    }
+
+    private static boolean isText(IndexableMessage im) {
+        return im.getMediaType() == null
+            || im.getMediaType().equals(MediaType.ANY_TEXT_TYPE.type());
+    }
+
+    private static boolean isHtml(IndexableMessage im) {
+        return isText(im)
+            && im.getSubType() != null
+            && im.getSubType().equals(MediaType.HTML_UTF_8.subtype());
+    }
+
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
         private MessageId id;

http://git-wip-us.apache.org/repos/asf/james-project/blob/9a026e30/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
index 9447dd2..adcfb36 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
@@ -173,11 +173,37 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(message -> message.getId().getUid(), Message::getSubject)
+            .extracting(message -> message.getId().getUid(), Message::getSubject, Message::getTextBody)
             .containsOnly(
-                    Tuple.tuple(message1Uid, "message 1 subject"), 
-                    Tuple.tuple(message2Uid, "message 2 subject"),
-                    Tuple.tuple(message3Uid, "(No subject)"));
+                    Tuple.tuple(message1Uid, "message 1 subject", Optional.of("my message")), 
+                    Tuple.tuple(message2Uid, "message 2 subject", Optional.of("my message")),
+                    Tuple.tuple(message3Uid, "(No subject)", Optional.of("my message")));
+    }
+    
+    @Test
+    public void processShouldFetchHtmlMessage() throws MailboxException {
+        MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
+        Date now = new Date();
+        ByteArrayInputStream messageContent = new ByteArrayInputStream(("Content-Type: text/html\r\n"
+                + "Subject: message 1 subject\r\n"
+                + "\r\n"
+                + "my <b>HTML</b> message").getBytes(Charsets.UTF_8));
+        long messageUid = inbox.appendMessage(messageContent, now, session, false, null);
+        
+        GetMessagesRequest request = GetMessagesRequest.builder()
+                .ids(ImmutableList.of(new MessageId(ROBERT, inboxPath, messageUid)))
+                .build();
+
+        GetMessagesMethod<InMemoryId> testee = new GetMessagesMethod<>(mailboxSessionMapperFactory, mailboxSessionMapperFactory);
+        List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList());
+        
+        assertThat(result).hasSize(1)
+            .extracting(JmapResponse::getResponse)
+            .hasOnlyElementsOfType(GetMessagesResponse.class)
+            .extracting(GetMessagesResponse.class::cast)
+            .flatExtracting(GetMessagesResponse::list)
+            .extracting(message -> message.getId().getUid(), Message::getTextBody, Message::getHtmlBody)
+            .containsOnly(Tuple.tuple(messageUid, Optional.empty(), Optional.of("my <b>HTML</b> message")));
     }
 
     @Test


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