JAMES-2346 Allow direct convertion from MDN to Mime4J entities

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

Branch: refs/heads/master
Commit: 0f11476b3f727789c3d542f16f2a8d11b53488c0
Parents: 890cede
Author: benwa <btell...@linagora.com>
Authored: Thu Mar 8 13:36:47 2018 +0700
Committer: benwa <btell...@linagora.com>
Committed: Tue Mar 13 15:11:54 2018 +0700

----------------------------------------------------------------------
 mdn/pom.xml                                     |  4 ++
 mdn/src/main/java/org/apache/james/mdn/MDN.java | 40 +++++++++++++++++++-
 .../test/java/org/apache/james/mdn/MDNTest.java | 34 +++++++++++++++++
 3 files changed, 76 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0f11476b/mdn/pom.xml
----------------------------------------------------------------------
diff --git a/mdn/pom.xml b/mdn/pom.xml
index 37a85c2..87511c1 100644
--- a/mdn/pom.xml
+++ b/mdn/pom.xml
@@ -35,6 +35,10 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.james</groupId>
+            <artifactId>apache-mime4j-dom</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.james</groupId>
             <artifactId>james-server-util-java8</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/0f11476b/mdn/src/main/java/org/apache/james/mdn/MDN.java
----------------------------------------------------------------------
diff --git a/mdn/src/main/java/org/apache/james/mdn/MDN.java 
b/mdn/src/main/java/org/apache/james/mdn/MDN.java
index e0d8965..9b7b22c 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDN.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDN.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mdn;
 
+import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.Properties;
@@ -30,9 +31,22 @@ import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
+import org.apache.james.mime4j.Charsets;
+import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.dom.Multipart;
+import org.apache.james.mime4j.message.BasicBodyFactory;
+import org.apache.james.mime4j.message.BodyPartBuilder;
+import org.apache.james.mime4j.message.MultipartBuilder;
+import org.apache.james.mime4j.stream.NameValuePair;
+
 import com.google.common.base.Preconditions;
 
 public class MDN {
+    private static final NameValuePair UTF_8_CHARSET = new 
NameValuePair("charset", Charsets.UTF_8.name());
+
+    public static final String DISPOSITION_CONTENT_TYPE = 
"message/disposition-notification";
+    public static final String REPORT_SUB_TYPE = "report";
+
     public static class Builder {
         private String humanReadableText;
         private MDNReport report;
@@ -80,7 +94,7 @@ public class MDN {
 
     public MimeMultipart asMultipart() throws MessagingException {
         MimeMultipart multipart = new MimeMultipart();
-        multipart.setSubType("report");
+        multipart.setSubType(REPORT_SUB_TYPE);
         multipart.addBodyPart(computeHumanReadablePart());
         multipart.addBodyPart(computeReportPart());
         // The optional third part, the original message is omitted.
@@ -107,10 +121,32 @@ public class MDN {
 
     public BodyPart computeReportPart() throws MessagingException {
         MimeBodyPart mdnPart = new MimeBodyPart();
-        mdnPart.setContent(report.formattedValue(), 
"message/disposition-notification");
+        mdnPart.setContent(report.formattedValue(), DISPOSITION_CONTENT_TYPE);
         return mdnPart;
     }
 
+    public Message.Builder asMime4JMessageBuilder() throws IOException {
+        Message.Builder messageBuilder = Message.Builder.of();
+        messageBuilder.setBody(asMime4JMultipart());
+        return messageBuilder;
+    }
+
+    private Multipart asMime4JMultipart() throws IOException {
+        MultipartBuilder builder = MultipartBuilder.create(REPORT_SUB_TYPE);
+        builder.addBodyPart(BodyPartBuilder.create()
+            .use(new BasicBodyFactory())
+            .setBody(humanReadableText, Charsets.UTF_8)
+            .setContentType("text/plain", UTF_8_CHARSET)
+            .build());
+        builder.addBodyPart(BodyPartBuilder.create()
+            .use(new BasicBodyFactory())
+            .setBody(report.formattedValue(), Charsets.UTF_8)
+            .setContentType(DISPOSITION_CONTENT_TYPE, UTF_8_CHARSET)
+            .build());
+
+        return builder.build();
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof MDN) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/0f11476b/mdn/src/test/java/org/apache/james/mdn/MDNTest.java
----------------------------------------------------------------------
diff --git a/mdn/src/test/java/org/apache/james/mdn/MDNTest.java 
b/mdn/src/test/java/org/apache/james/mdn/MDNTest.java
index dede484..69236fe 100644
--- a/mdn/src/test/java/org/apache/james/mdn/MDNTest.java
+++ b/mdn/src/test/java/org/apache/james/mdn/MDNTest.java
@@ -30,6 +30,8 @@ import org.apache.james.mdn.action.mode.DispositionActionMode;
 import org.apache.james.mdn.fields.Disposition;
 import org.apache.james.mdn.sending.mode.DispositionSendingMode;
 import org.apache.james.mdn.type.DispositionType;
+import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageWriter;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -164,4 +166,36 @@ public class MDNTest {
                     " - We should always write detailed unit tests\n" +
                     " - We should think of all edge cases\n");
     }
+
+    @Test
+    public void mdnShouldBeConvertibleToMime4JMessage() throws Exception {
+        Message message = MDN.builder()
+            .humanReadableText("Explanation:\n" +
+                " - We should always write detailed unit tests\n" +
+                " - We should think of all edge cases\n")
+            .report(MINIMAL_REPORT)
+            .build()
+            .asMime4JMessageBuilder()
+            .build();
+
+        assertThat(asString(message))
+            .contains("MIME-Version: 1.0\r\n" +
+                "Content-Type: multipart/report;")
+            .contains("Content-Type: text/plain; charset=UTF-8\r\n" +
+                "\r\n" +
+                "Explanation:\n" +
+                " - We should always write detailed unit tests\n" +
+                " - We should think of all edge cases")
+        .contains("Content-Type: message/disposition-notification; 
charset=UTF-8\r\n" +
+            "\r\n" +
+            "Final-Recipient: rfc822; fi...@domain.com\r\n" +
+            "Disposition: automatic-action/MDN-sent-automatically;deleted");
+    }
+
+    private String asString(Message message) throws Exception {
+        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+        DefaultMessageWriter writer = new DefaultMessageWriter();
+        writer.writeMessage(message, buffer);
+        return new String(buffer.toByteArray(), StandardCharsets.UTF_8);
+    }
 }


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