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