Repository: james-mime4j
Updated Branches:
  refs/heads/master fdb3756b5 -> 5c5830375


MIME4J-262 bugfix of MessageBuilder regarding getDate

Before MessageBuilder produces message that had a getDate that was returning a
non null date instead of null when the message had no "Date" header.

In order to not break old code that do not check for null value, old way to
create a builder has been kept and depreciated. Those old way return a builder
that act exactly the same than before.

New way of building a MessageBuilder has been added and do create a builder that
are not buggy anymore.


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

Branch: refs/heads/master
Commit: c14019ca08174d36f16ad45d6798ebb4f4f771cf
Parents: fdb3756
Author: Luc DUZAN <[email protected]>
Authored: Tue May 23 15:41:16 2017 +0200
Committer: benwa <[email protected]>
Committed: Thu May 25 10:11:49 2017 +0700

----------------------------------------------------------------------
 RELEASE_NOTES.txt                               |  19 +++
 .../james/mime4j/message/MessageBuilder.java    |  57 ++++++-
 .../mime4j/message/MessageBuilderTest.java      | 154 ++++++++++++++++---
 3 files changed, 203 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/c14019ca/RELEASE_NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index fda03af..165e541 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -1,3 +1,22 @@
+Release 0.9.0
+-------------------
+
+Fix MIME4J-262 without breaking compatibility with old code by deprecating:
+ * MessageBuilder#MessageBuilder()
+ * MessageBuilder#create()
+ * MessageBuilder#createCopy(Message)
+ * MessageBuilder#read(InputStream)
+
+and adding:
+ * MessageBuilder#of()
+ * MessageBuilder#of(Message)
+ * MessageBuilder#of(InputStream)
+
+MessageBuilder constructed by of methods produce message for which the getDate 
method return null if and only if the
+message do not have a "Date" header. Whereas MessageBuilder constructed by 
deprecated method produce message for which
+the getDate method never return null: if the message has no "Date" header the 
returned value is "new Date()" result when
+the message has been instantiated
+
 Release 0.7.2
 -------------------
 

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/c14019ca/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
----------------------------------------------------------------------
diff --git 
a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java 
b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
index a9bc6a7..138331a 100644
--- a/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
+++ b/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
@@ -75,15 +75,68 @@ public class MessageBuilder extends AbstractEntityBuilder {
     private BodyFactory bodyFactory;
     private boolean flatMode;
     private boolean rawContent;
+    private final boolean ensureDateNotNull;
 
+    /**
+     * Deprecated: please use {@link #of() of} instead
+     * Building a builder using this method will result in a buggy builder 
which
+     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
+     * the return value when the message do not have a Date header
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Deprecated
+    public MessageBuilder() {
+        this(true);
+    }
+
+    private MessageBuilder(boolean ensureDateNotNull) {
+        this.ensureDateNotNull = ensureDateNotNull;
+    }
+
+    public static MessageBuilder of() {
+        return new MessageBuilder(false);
+    }
+
+    /**
+     * Deprecated: please use {@link #of() of} instead
+     * Building a builder using this method will result in a buggy builder 
which
+     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
+     * the return value when the message do not have a Date header
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Deprecated
     public static MessageBuilder create() {
-        return new MessageBuilder();
+        return new MessageBuilder(true);
+    }
+
+    public static MessageBuilder of(Message other) {
+        return new MessageBuilder(false).copy(other);
     }
 
+    /**
+     * Deprecated: please use {@link #of(Message) of} instead
+     * Building a builder using this method will result in a buggy builder 
which
+     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
+     * the return value when the message do not have a Date header
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Deprecated
     public static MessageBuilder createCopy(Message other) {
         return new MessageBuilder().copy(other);
     }
 
+    public static MessageBuilder of(final InputStream is) throws IOException {
+        return new MessageBuilder(false).parse(is);
+    }
+
+    /**
+     * Deprecated: please use {@link #of(InputStream) of} instead
+     * Building a builder using this method will result in a buggy builder 
which
+     * will create message that do not respect the 
<code>Message.getDate()</code> contract regarding
+     * the return value when the message do not have a Date header
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Deprecated
     public static MessageBuilder read(final InputStream is) throws IOException 
{
         return new MessageBuilder().parse(is);
     }
@@ -931,7 +984,7 @@ public class MessageBuilder extends AbstractEntityBuilder {
         for (Field field : getFields()) {
             header.addField(field);
         }
-        if (!containsField(FieldName.DATE)) {
+        if (ensureDateNotNull && !containsField(FieldName.DATE)) {
             header.setField(Fields.date(new Date()));
         }
 

http://git-wip-us.apache.org/repos/asf/james-mime4j/blob/c14019ca/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java 
b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
index 4fd49a8..1820a5f 100644
--- a/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
+++ b/dom/src/test/java/org/apache/james/mime4j/message/MessageBuilderTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mime4j.message;
 
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -46,7 +47,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetCustomBody() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         BodyFactory bodyFactory = Mockito.spy(new BasicBodyFactory());
         builder.use(bodyFactory);
@@ -90,7 +91,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetMessageId() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         String id = "<msg17@localhost>";
         builder.setMessageId(id);
@@ -99,7 +100,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testCreateMessageId() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         builder.generateMessageId("hostname");
 
         String id = builder.getMessageId();
@@ -110,7 +111,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetSubject() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getSubject());
 
         String subject = "testing 1 2";
@@ -123,7 +124,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetSubject() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         builder.setSubject("Semmelbr\366sel");
         Assert.assertEquals("Semmelbr\366sel", builder.getSubject());
@@ -136,7 +137,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetDate() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getDate());
 
         builder.setField(DefaultFieldParser.parse("Date: Thu, 1 Jan 1970 
05:30:00 +0530"));
@@ -146,7 +147,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetDate() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         builder.setDate(new Date(86400000), TimeZone.getTimeZone("GMT"));
         Assert.assertEquals(new Date(86400000), builder.getDate());
@@ -159,7 +160,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetSender() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getSender());
 
         builder.setField(DefaultFieldParser.parse("Sender: 
[email protected]"));
@@ -169,7 +170,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetSender() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         builder.setSender("[email protected]");
         Assert.assertEquals("[email protected]", 
builder.getField("Sender").getBody());
@@ -180,7 +181,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetFrom() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getFrom());
 
         builder.setField(DefaultFieldParser.parse("From: 
[email protected]"));
@@ -190,7 +191,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetFrom() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -213,7 +214,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getTo());
 
         builder.setField(DefaultFieldParser.parse("To: [email protected]"));
@@ -224,7 +225,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -251,7 +252,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetCc() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getCc());
 
         builder.setField(DefaultFieldParser.parse("Cc: [email protected]"));
@@ -262,7 +263,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetCc() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -289,7 +290,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetBcc() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getBcc());
 
         builder.setField(DefaultFieldParser.parse("Bcc: 
[email protected]"));
@@ -300,7 +301,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetBcc() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -327,7 +328,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testGetReplyTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
         Assert.assertNull(builder.getReplyTo());
 
         builder.setField(DefaultFieldParser.parse("Reply-To: 
[email protected]"));
@@ -338,7 +339,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testSetReplyTo() throws Exception {
-        MessageBuilder builder = MessageBuilder.create();
+        MessageBuilder builder = MessageBuilder.of();
 
         Mailbox mailbox1 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
         Mailbox mailbox2 = 
DefaultAddressParser.DEFAULT.parseMailbox("[email protected]");
@@ -365,7 +366,7 @@ public class MessageBuilderTest {
 
     @Test
     public void testBuildWithDefaults() throws Exception {
-        Message message = MessageBuilder.create()
+        Message message = MessageBuilder.of()
                 .generateMessageId("hostname")
                 .setSubject("testing ...")
                 .setFrom("batman@localhost", "superman@localhost")
@@ -375,7 +376,7 @@ public class MessageBuilderTest {
 
         Assert.assertEquals("text/plain", message.getMimeType());
         Assert.assertNotNull(message.getMessageId());
-        Assert.assertNotNull(message.getDate());
+        Assert.assertNull(message.getDate());
         Assert.assertEquals("1.0", 
message.getHeader().getField(FieldName.MIME_VERSION).getBody());
         Assert.assertEquals("testing ...", message.getSubject());
         Assert.assertEquals(new MailboxList(
@@ -387,13 +388,116 @@ public class MessageBuilderTest {
         Assert.assertEquals("UTF-8", message.getCharset());
     }
 
+    /**
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Test
+    public void testThatDeprecatedCreateNeverReturnNullDate() throws Exception 
{
+        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.create();
+
+        Message message = builder.generateMessageId("hostname")
+            .setSubject("testing ...")
+            .setFrom("batman@localhost", "superman@localhost")
+            .setTo("\"Big momma\" <big_momma@localhost>")
+            .setBody("Yo, big momma!", Charsets.UTF_8)
+            .build();
+
+        Assert.assertNotNull(message.getDate());
+    }
+
+    /**
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Test
+    public void testThatDeprecatedConstructorNeverReturnNullDate() throws 
Exception {
+        @SuppressWarnings("deprecation") MessageBuilder builder = new 
MessageBuilder();
+
+        Message message = builder.generateMessageId("hostname")
+            .setSubject("testing ...")
+            .setFrom("batman@localhost", "superman@localhost")
+            .setTo("\"Big momma\" <big_momma@localhost>")
+            .setBody("Yo, big momma!", Charsets.UTF_8)
+            .build();
+
+        Assert.assertNotNull(message.getDate());
+    }
+
+    /**
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Test
+    public void testThatDeprecatedCreateCopyNeverReturnNullDate() throws 
Exception {
+        Message messageWithoutDate = 
MessageBuilder.of().generateMessageId("hostname")
+            .setSubject("testing ...")
+            .setFrom("batman@localhost", "superman@localhost")
+            .setTo("\"Big momma\" <big_momma@localhost>")
+            .setBody("Yo, big momma!", Charsets.UTF_8)
+            .build();
+
+        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.createCopy(messageWithoutDate);
+
+        Message testee = builder.build();
+
+        Assert.assertNotNull(testee.getDate());
+    }
+
+
+    @Test
+    public void testThatOfMesageReturnNullDateWhenNoDateHeader() throws 
Exception {
+        Message messageWithoutDate = 
MessageBuilder.of().generateMessageId("hostname")
+            .setSubject("testing ...")
+            .setFrom("batman@localhost", "superman@localhost")
+            .setTo("\"Big momma\" <big_momma@localhost>")
+            .setBody("Yo, big momma!", Charsets.UTF_8)
+            .build();
+
+        MessageBuilder builder = MessageBuilder.of(messageWithoutDate);
+
+        Message testee = builder.build();
+
+        Assert.assertNull(testee.getDate());
+    }
+
+    /**
+     * See <a 
href="https://issues.apache.org/jira/browse/MIME4J-262";>MIME4J-262</a>
+     */
+    @Test
+    public void testThatDeprecatedReadNeverReturnNullDate() throws Exception {
+        String messageSource = "To: me ME <[email protected]>\n" +
+            "From: you YOU <[email protected]>\n" +
+            "Subject: message\n" +
+            "MIME-Version: 1.0\n" +
+            "\n" +
+            "This is a message";
+
+        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.read(new ByteArrayInputStream(messageSource.getBytes()));
+        Message testee = builder.build();
+
+        Assert.assertNotNull(testee.getDate());
+    }
+
+    @Test
+    public void testThatOfInputStreamReturnNullDateWhenNoDateHeader() throws 
Exception {
+        String messageSource = "To: me ME <[email protected]>\n" +
+            "From: you YOU <[email protected]>\n" +
+            "Subject: message\n" +
+            "MIME-Version: 1.0\n" +
+            "\n" +
+            "This is a message";
+
+        @SuppressWarnings("deprecation") MessageBuilder builder = 
MessageBuilder.of(new ByteArrayInputStream(messageSource.getBytes()));
+        Message testee = builder.build();
+
+        Assert.assertNull(testee.getDate());
+    }
+
     @Test
     public void testBuildWithNoDefaults() throws Exception {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
         Date date = dateFormat.parse("2014-08-01 12:00");
 
-        Message message = MessageBuilder.create()
+        Message message = MessageBuilder.of()
                 .setMessageId("blah@hostname")
                 .setDate(date)
                 .addField(Fields.version("1.0.1"))
@@ -418,8 +522,8 @@ public class MessageBuilderTest {
     }
 
     @Test
-    public void testCopy() throws Exception {
-        Message original = MessageBuilder.create()
+    public void testOfWithAMessage() throws Exception {
+        Message original = MessageBuilder.of()
                 .generateMessageId("hostname")
                 .setSubject("testing ...")
                 .setFrom("batman@localhost", "superman@localhost")
@@ -427,7 +531,7 @@ public class MessageBuilderTest {
                 .setBody("Yo, big momma!", Charsets.UTF_8)
                 .build();
 
-        MessageBuilder builder = MessageBuilder.createCopy(original);
+        MessageBuilder builder = MessageBuilder.of(original);
         Assert.assertEquals(original.getHeader().getFields(), 
builder.getFields());
         Assert.assertNotSame(original.getBody(), builder.getBody());
         Assert.assertSame(original.getBody().getClass(), 
builder.getBody().getClass());


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

Reply via email to