diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 71f0839156..0529403be2 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + Better handling of Outlook messages in HSMF when there's no recipient email address When formatting numbers with DataFormatter, handle brackets following colours diff --git a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java index 8d84b1627a..e04d299b13 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/MAPIMessage.java @@ -239,7 +239,11 @@ public class MAPIMessage extends POIDocument { if(email != null) { emails[i] = email; } else { - throw new ChunkNotFoundException("No email address holding chunks found for the " + (i+1) + "th recipient"); + if(returnNullOnMissingChunk) { + emails[i] = null; + } else { + throw new ChunkNotFoundException("No email address holding chunks found for the " + (i+1) + "th recipient"); + } } } @@ -393,6 +397,7 @@ public class MAPIMessage extends POIDocument { boolean first = true; for(String s : l) { + if(s == null) continue; if(first) { first = false; } else { diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/TestBasics.java b/src/scratchpad/testcases/org/apache/poi/hsmf/TestBasics.java index 6e958c193f..18a316491f 100644 --- a/src/scratchpad/testcases/org/apache/poi/hsmf/TestBasics.java +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/TestBasics.java @@ -33,6 +33,7 @@ public final class TestBasics extends TestCase { private MAPIMessage quick; private MAPIMessage outlook30; private MAPIMessage attachments; + private MAPIMessage noRecipientAddress; /** * Initialize this test, load up the blank.msg mapi message. @@ -44,6 +45,7 @@ public final class TestBasics extends TestCase { quick = new MAPIMessage(samples.openResourceAsStream("quick.msg")); outlook30 = new MAPIMessage(samples.openResourceAsStream("outlook_30_msg.msg")); attachments = new MAPIMessage(samples.openResourceAsStream("attachment_test_msg.msg")); + noRecipientAddress = new MAPIMessage(samples.openResourceAsStream("no_recipient_address.msg")); } /** @@ -140,4 +142,39 @@ public final class TestBasics extends TestCase { // Good } } + + /** + * More missing chunk testing, this time for + * missing recipient email address + */ + public void testMissingAddressChunk() throws Exception { + assertEquals(false, noRecipientAddress.isReturnNullOnMissingChunk()); + + try { + noRecipientAddress.getRecipientEmailAddress(); + fail(); + } catch(ChunkNotFoundException e) { + // Good + } + try { + noRecipientAddress.getRecipientEmailAddressList(); + fail(); + } catch(ChunkNotFoundException e) { + // Good + } + + noRecipientAddress.setReturnNullOnMissingChunk(true); + + noRecipientAddress.getRecipientEmailAddress(); + noRecipientAddress.getRecipientEmailAddressList(); + assertEquals("", noRecipientAddress.getRecipientEmailAddress()); + assertEquals(1, noRecipientAddress.getRecipientEmailAddressList().length); + assertEquals(null, noRecipientAddress.getRecipientEmailAddressList()[0]); + + // Check a few other bits too + assertEquals("Microsoft Outlook 2003 Team", noRecipientAddress.getDisplayFrom()); + assertEquals("New Outlook User", noRecipientAddress.getDisplayTo()); + + noRecipientAddress.setReturnNullOnMissingChunk(false); + } } diff --git a/test-data/hsmf/no_recipient_address.msg b/test-data/hsmf/no_recipient_address.msg new file mode 100644 index 0000000000..e88d503fe8 Binary files /dev/null and b/test-data/hsmf/no_recipient_address.msg differ