This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c861ab308caca59e83722182091c1345d4d63683
Author: Tran Tien Duc <[email protected]>
AuthorDate: Thu Jan 30 13:24:31 2020 +0700

    JAMES-3016 Extract 7Bit converter to a common class
    
    To be used in ConvertTo7Bit mailet and MailDeliverToHost
---
 .../org/apache/mailet/base}/Converter7Bit.java     |  16 ++-
 .../org/apache/mailet/base/Converter7BitTest.java  | 134 +++++++++------------
 .../eml/multipart-7bit-attachment-content.txt      |   0
 .../src/test/resources/eml/multipart-7bit.eml      |   0
 .../eml/multipart-8bit-attachment-content.txt      |   0
 .../src/test/resources/eml/multipart-8bit.eml      |   0
 .../src/test/resources/eml/text-only-7bit.eml      |   0
 .../src/test/resources/eml/text-only-8bit.eml      |   0
 .../apache/james/jdkim/mailets/ConvertTo7Bit.java  |  45 ++-----
 .../remote/delivery/MailDelivrerToHost.java        |   1 +
 10 files changed, 77 insertions(+), 119 deletions(-)

diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java
 b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
similarity index 85%
rename from 
server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java
rename to mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
index 2eb44f4..095608f 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/Converter7Bit.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/Converter7Bit.java
@@ -17,13 +17,14 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.transport.mailets.remote.delivery;
+package org.apache.mailet.base;
 
 import java.io.IOException;
 import java.util.List;
 
 import javax.mail.BodyPart;
 import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.MimePart;
 
@@ -38,11 +39,16 @@ public class Converter7Bit {
         this.mailetContext = mailetContext;
     }
 
-    public MimePart convertTo7Bit(MimePart part) throws MessagingException, 
IOException {
+    public void convertTo7Bit(MimeMessage mimeMessage) throws 
MessagingException, IOException {
+        convertPart(mimeMessage);
+        mimeMessage.saveChanges();
+    }
+
+    private void convertPart(MimePart part) throws MessagingException, 
IOException {
         if (part.isMimeType("multipart/*")) {
             List<BodyPart> bodyParts = 
MultipartUtil.retrieveBodyParts((MimeMultipart) part.getContent());
             for (BodyPart bodyPart : bodyParts) {
-                convertTo7Bit((MimePart) bodyPart);
+                convertPart((MimePart) bodyPart);
             }
         } else if ("8bit".equals(part.getEncoding())) {
             // The content may already be in encoded the form (likely with mail
@@ -59,9 +65,9 @@ public class Converter7Bit {
             String contentTransferEncoding = part.isMimeType("text/*") ? 
"quoted-printable" : "base64";
             part.setContent(part.getContent(), part.getContentType());
             part.setHeader("Content-Transfer-Encoding", 
contentTransferEncoding);
-            part.addHeader("X-MIME-Autoconverted", "from 8bit to " + 
contentTransferEncoding + " by " + mailetContext.getServerInfo());
+            part.addHeader("X-MIME-Autoconverted", "from 8bit to "
+                + contentTransferEncoding + " by " + 
mailetContext.getServerInfo());
         }
-        return part;
     }
 
 }
diff --git 
a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
 b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
similarity index 56%
rename from 
server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
rename to 
mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
index bbee42b..d08b156 100644
--- 
a/server/mailet/dkim/src/test/java/org/apache/james/jdkim/mailets/ConvertTo7BitTest.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/Converter7BitTest.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jdkim.mailets;
+package org.apache.mailet.base;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -25,12 +25,11 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
 import javax.mail.BodyPart;
+import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeMultipart;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.util.MimeMessageUtil;
-import org.apache.mailet.Mail;
-import org.apache.mailet.base.test.FakeMail;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -39,7 +38,7 @@ import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
 
-class ConvertTo7BitTest {
+class Converter7BitTest {
 
     private static final String CONTENT_TRANSFER_ENCODING = 
"Content-Transfer-Encoding";
     private static final String X_MIME_AUTOCONVERTED = "X-MIME-Autoconverted";
@@ -48,13 +47,13 @@ class ConvertTo7BitTest {
     private static final String MESSAGE_BODY_QUOTED_PRINTABLE = "A 8bit 
encoded body with =E2=82=ACuro symbol.";
     private static final String BASE64 = "base64";
 
-    private ConvertTo7Bit testee;
+    private Converter7Bit testee;
 
     @BeforeEach
-    void setUp() throws Exception {
-        testee = new ConvertTo7Bit();
-        testee.init(FakeMailetConfig.builder()
-            .build());
+    void setUp() {
+        testee = new Converter7Bit(FakeMailetConfig.builder()
+            .build()
+            .getMailetContext());
     }
 
     @Nested
@@ -62,19 +61,15 @@ class ConvertTo7BitTest {
         @Nested
         class WhenTextContent {
             @Test
-            void serviceShouldKeepMessageContentUnTouch() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-quoted-printable-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-7bit.eml")))
-                    .build();
-
-                testee.service(mail);
+            void convertTo7BitShouldKeepMessageContentUnTouched() throws 
Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-7bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                    softly.assertThat(mail.getMessage().getEncoding())
+                    softly.assertThat(mimeMessage.getEncoding())
                         .isEqualTo(QUOTED_PRINTABLE);
-                    
softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    softly.assertThat(MimeMessageUtil.asString(mimeMessage))
                         .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
                 }));
             }
@@ -83,35 +78,29 @@ class ConvertTo7BitTest {
         @Nested
         class WhenMultipart {
             @Test
-            void serviceShouldKeepMessageTextContentUnTouch() throws Exception 
{
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-7bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-7bit.eml")))
-                    .build();
+            void convertTo7BitShouldKeepMessageTextContentUnTouched() throws 
Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml"));
 
-                testee.service(mail);
-                MimeMultipart multipart = (MimeMultipart) 
mail.getMessage().getContent();
+                testee.convertTo7Bit(mimeMessage);
+                MimeMultipart multipart = (MimeMultipart) 
mimeMessage.getContent();
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     
softly.assertThat(multipart.getBodyPart(0).getHeader(CONTENT_TRANSFER_ENCODING))
                         .containsOnly(QUOTED_PRINTABLE);
-                    
softly.assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                    softly.assertThat(MimeMessageUtil.asString(mimeMessage))
                         .contains(MESSAGE_BODY_QUOTED_PRINTABLE);
                 }));
             }
 
             @Test
-            void serviceShouldKeepMessageAttachmentsContentUnTouch() throws 
Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-7bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-7bit.eml")))
-                    .build();
+            void convertTo7BitShouldKeepMessageAttachmentsContentUnTouched() 
throws Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-7bit.eml"));
 
-                testee.service(mail);
-                MimeMultipart multipart = (MimeMultipart) 
mail.getMessage().getContent();
-                String messageAsString = 
MimeMessageUtil.asString(mail.getMessage());
+                testee.convertTo7Bit(mimeMessage);
+                MimeMultipart multipart = (MimeMultipart) 
mimeMessage.getContent();
+                String messageAsString = MimeMessageUtil.asString(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     
softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
@@ -128,32 +117,26 @@ class ConvertTo7BitTest {
         @Nested
         class WhenTextContent {
             @Test
-            void serviceShouldAlertHeaders() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-8bit.eml")))
-                    .build();
-                testee.service(mail);
+            void convertTo7BitShouldAlertHeaders() throws Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-                   
assertThat(mail.getMessage().getHeader(CONTENT_TRANSFER_ENCODING))
+                   assertThat(mimeMessage.getHeader(CONTENT_TRANSFER_ENCODING))
                        .containsOnly(QUOTED_PRINTABLE);
-                   
assertThat(mail.getMessage().getHeader(X_MIME_AUTOCONVERTED))
+                   assertThat(mimeMessage.getHeader(X_MIME_AUTOCONVERTED))
                        .containsOnly("from 8bit to quoted-printable by Mock 
Server");
                 }));
             }
 
             @Test
-            void serviceShouldConvertContentToQuotedPrintable() throws 
Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/text-only-8bit.eml")))
-                    .build();
-                testee.service(mail);
-
-                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+            void convertTo7BitShouldConvertContentToQuotedPrintable() throws 
Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/text-only-8bit.eml"));
+                testee.convertTo7Bit(mimeMessage);
+
+                assertThat(MimeMessageUtil.asString(mimeMessage))
                     .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
                     .doesNotContain(MESSAGE_BODY_8BIT);
             }
@@ -163,16 +146,13 @@ class ConvertTo7BitTest {
         class WhenMultipart {
 
             @Test
-            void serviceShouldAlertTextPartHeaders() throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void convertTo7BitShouldAlertTextPartHeaders() throws Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                BodyPart textPart = ((MimeMultipart) 
mail.getMessage().getContent())
+                BodyPart textPart = ((MimeMultipart) mimeMessage.getContent())
                     .getBodyPart(0);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
@@ -184,32 +164,26 @@ class ConvertTo7BitTest {
             }
 
             @Test
-            void serviceShouldConvertTextPartContentToQuotedPrintable() throws 
Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void convertTo7BitShouldConvertTextPartContentToQuotedPrintable() 
throws Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                assertThat(MimeMessageUtil.asString(mail.getMessage()))
+                assertThat(MimeMessageUtil.asString(mimeMessage))
                     .contains(MESSAGE_BODY_QUOTED_PRINTABLE)
                     .doesNotContain(MESSAGE_BODY_8BIT);
             }
 
             @Test
-            void serviceShouldKeepAttachmentPartUnTouchWhenBase64Encoding() 
throws Exception {
-                Mail mail = FakeMail.builder()
-                    .name("a-mail-with-8bit-encoding")
-                    .mimeMessage(MimeMessageUtil.mimeMessageFromString(
-                        fileContent("eml/multipart-8bit.eml")))
-                    .build();
+            void 
convertTo7BitShouldKeepAttachmentPartUnTouchedWhenBase64Encoding() throws 
Exception {
+                MimeMessage mimeMessage = 
MimeMessageUtil.mimeMessageFromString(
+                        fileContent("eml/multipart-8bit.eml"));
 
-                testee.service(mail);
+                testee.convertTo7Bit(mimeMessage);
 
-                MimeMultipart multipart = (MimeMultipart) 
mail.getMessage().getContent();
-                String messageAsString = 
MimeMessageUtil.asString(mail.getMessage());
+                MimeMultipart multipart = (MimeMultipart) 
mimeMessage.getContent();
+                String messageAsString = MimeMessageUtil.asString(mimeMessage);
 
                 SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
                     
softly.assertThat(multipart.getBodyPart(1).getHeader(CONTENT_TRANSFER_ENCODING))
diff --git 
a/server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt
 b/mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt
similarity index 100%
rename from 
server/mailet/dkim/src/test/resources/eml/multipart-7bit-attachment-content.txt
rename to 
mailet/base/src/test/resources/eml/multipart-7bit-attachment-content.txt
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml 
b/mailet/base/src/test/resources/eml/multipart-7bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-7bit.eml
rename to mailet/base/src/test/resources/eml/multipart-7bit.eml
diff --git 
a/server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt
 b/mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt
similarity index 100%
rename from 
server/mailet/dkim/src/test/resources/eml/multipart-8bit-attachment-content.txt
rename to 
mailet/base/src/test/resources/eml/multipart-8bit-attachment-content.txt
diff --git a/server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml 
b/mailet/base/src/test/resources/eml/multipart-8bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/multipart-8bit.eml
rename to mailet/base/src/test/resources/eml/multipart-8bit.eml
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml 
b/mailet/base/src/test/resources/eml/text-only-7bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/text-only-7bit.eml
rename to mailet/base/src/test/resources/eml/text-only-7bit.eml
diff --git a/server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml 
b/mailet/base/src/test/resources/eml/text-only-8bit.eml
similarity index 100%
rename from server/mailet/dkim/src/test/resources/eml/text-only-8bit.eml
rename to mailet/base/src/test/resources/eml/text-only-8bit.eml
diff --git 
a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
 
b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
index 53a4e01..bc6b266 100644
--- 
a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
+++ 
b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/ConvertTo7Bit.java
@@ -23,10 +23,10 @@ import java.io.IOException;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.MimePart;
 
 import org.apache.mailet.Mail;
+import org.apache.mailet.MailetConfig;
+import org.apache.mailet.base.Converter7Bit;
 import org.apache.mailet.base.GenericMailet;
 
 /**
@@ -35,43 +35,20 @@ import org.apache.mailet.base.GenericMailet;
  */
 public class ConvertTo7Bit extends GenericMailet {
 
+    private Converter7Bit converter7Bit;
+
+    @Override
+    public void init(MailetConfig newConfig) throws MessagingException {
+        super.init(newConfig);
+        this.converter7Bit = new Converter7Bit(getMailetContext());
+    }
+
     public void service(Mail mail) throws MessagingException {
         MimeMessage message = mail.getMessage();
         try {
-            convertTo7Bit(message);
-            message.saveChanges();
+            converter7Bit.convertTo7Bit(message);
         } catch (IOException e) {
             throw new MessagingException("IOException converting message to 
7bit: " + e.getMessage(), e);
         }
     }
-
-    /**
-     * Converts a message to 7 bit.
-     */
-    private void convertTo7Bit(MimePart part) throws MessagingException, 
IOException {
-        if (part.isMimeType("multipart/*")) {
-            MimeMultipart parts = (MimeMultipart) part.getContent();
-            int count = parts.getCount();
-            for (int i = 0; i < count; i++) {
-                convertTo7Bit((MimePart) parts.getBodyPart(i));
-            }
-        } else if ("8bit".equals(part.getEncoding())) {
-            // The content may already be in encoded the form (likely with mail
-            // created from a stream). In that case, just changing the encoding
-            // to quoted-printable will mangle the result when this is
-            // transmitted.
-            // We must first convert the content into its native format, set it
-            // back, and only THEN set the transfer encoding to force the
-            // content to be encoded appropriately.
-
-            // if the part doesn't contain text it will be base64 encoded.
-            String contentTransferEncoding = part.isMimeType("text/*") ? 
"quoted-printable" : "base64";
-            part.setContent(part.getContent(), part.getContentType());
-            part.setHeader("Content-Transfer-Encoding", 
contentTransferEncoding);
-            part.addHeader("X-MIME-Autoconverted", "from 8bit to "
-                    + contentTransferEncoding + " by "
-                    + getMailetContext().getServerInfo());
-        }
-    }
-
 }
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
index d51af6c..b414ab5 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/MailDelivrerToHost.java
@@ -31,6 +31,7 @@ import javax.mail.internet.MimeMessage;
 import org.apache.mailet.HostAddress;
 import org.apache.mailet.Mail;
 import org.apache.mailet.MailetContext;
+import org.apache.mailet.base.Converter7Bit;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 


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

Reply via email to