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]
