From 8942828a8f0b830044cc8d781abc78eadf8efc8b Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Fri, 3 Jul 2015 10:32:53 +0000 Subject: [PATCH] Bug 57678: Apply patch to better handle years in mail-messages between 1980 and 1999. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1688993 13f79535-47bb-0310-9956-ffa450edef68 --- .../datatypes/MessageSubmissionChunk.java | 6 +- .../org/apache/poi/hsmf/AllHSMFTests.java | 5 +- .../TestMessageSubmissionChunkY2KRead.java | 67 ++++++++++++++++++ test-data/hsmf/message_1979.msg | Bin 0 -> 29696 bytes test-data/hsmf/message_1980.msg | Bin 0 -> 29696 bytes test-data/hsmf/message_1981.msg | Bin 0 -> 29696 bytes 6 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 src/scratchpad/testcases/org/apache/poi/hsmf/TestMessageSubmissionChunkY2KRead.java create mode 100644 test-data/hsmf/message_1979.msg create mode 100644 test-data/hsmf/message_1980.msg create mode 100644 test-data/hsmf/message_1981.msg diff --git a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java index c8867a6c7..985e58fce 100644 --- a/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java +++ b/src/scratchpad/src/org/apache/poi/hsmf/datatypes/MessageSubmissionChunk.java @@ -77,7 +77,11 @@ public class MessageSubmissionChunk extends Chunk { Matcher m = datePatern.matcher(dateS); if(m.matches()) { date = Calendar.getInstance(); - date.set(Calendar.YEAR, Integer.parseInt(m.group(1)) + 2000); + + // work around issues with dates like 1989, which appear as "89" here + int year = Integer.parseInt(m.group(1)); + date.set(Calendar.YEAR, year + (year > 80 ? 1900 : 2000)); + date.set(Calendar.MONTH, Integer.parseInt(m.group(2)) - 1); // Java is 0 based date.set(Calendar.DATE, Integer.parseInt(m.group(3))); date.set(Calendar.HOUR_OF_DAY, Integer.parseInt(m.group(4))); diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/AllHSMFTests.java b/src/scratchpad/testcases/org/apache/poi/hsmf/AllHSMFTests.java index 710d991d9..fe8cb1124 100644 --- a/src/scratchpad/testcases/org/apache/poi/hsmf/AllHSMFTests.java +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/AllHSMFTests.java @@ -27,19 +27,18 @@ import org.apache.poi.hsmf.parsers.*; public final class AllHSMFTests { public static Test suite() { TestSuite suite = new TestSuite(AllHSMFTests.class.getName()); + suite.addTestSuite(TestBasics.class); suite.addTestSuite(TestBlankFileRead.class); suite.addTestSuite(TestSimpleFileRead.class); suite.addTestSuite(TestOutlook30FileRead.class); suite.addTestSuite(TestFileWithAttachmentsRead.class); - suite.addTestSuite(TestChunkData.class); suite.addTestSuite(TestTypes.class); suite.addTestSuite(TestSorters.class); - suite.addTestSuite(TestOutlookTextExtractor.class); - suite.addTestSuite(TestPOIFSChunkParser.class); + suite.addTestSuite(TestMessageSubmissionChunkY2KRead.class); return suite; } diff --git a/src/scratchpad/testcases/org/apache/poi/hsmf/TestMessageSubmissionChunkY2KRead.java b/src/scratchpad/testcases/org/apache/poi/hsmf/TestMessageSubmissionChunkY2KRead.java new file mode 100644 index 000000000..c10ba0b65 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hsmf/TestMessageSubmissionChunkY2KRead.java @@ -0,0 +1,67 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ + +package org.apache.poi.hsmf; + +import java.io.IOException; + +import org.apache.poi.hsmf.MAPIMessage; +import org.apache.poi.hsmf.exceptions.ChunkNotFoundException; +import org.apache.poi.POIDataSamples; + +import java.util.Calendar; + +import junit.framework.TestCase; + +public final class TestMessageSubmissionChunkY2KRead extends TestCase { + + private MAPIMessage mapiMessage1979; + private MAPIMessage mapiMessage1980; + private MAPIMessage mapiMessage1981; + + /** + * Initialise this test, load up the three test messages. + * @throws Exception + */ + public TestMessageSubmissionChunkY2KRead() throws IOException { + POIDataSamples samples = POIDataSamples.getHSMFInstance(); + this.mapiMessage1979 = new MAPIMessage(samples.openResourceAsStream("message_1979.msg")); + this.mapiMessage1980 = new MAPIMessage(samples.openResourceAsStream("message_1980.msg")); + this.mapiMessage1981 = new MAPIMessage(samples.openResourceAsStream("message_1981.msg")); + } + + // 1979 is one year before our pivot year (so this is an expected "failure") + public void testReadMessageDate1979() throws ChunkNotFoundException { + final Calendar date = mapiMessage1979.getMessageDate(); + final int year = date.get(Calendar.YEAR); + TestCase.assertEquals(2079, year); + } + + // 1980 is our pivot year (so this is an expected "failure") + public void testReadMessageDate1980() throws ChunkNotFoundException { + final Calendar date = mapiMessage1980.getMessageDate(); + final int year = date.get(Calendar.YEAR); + TestCase.assertEquals(2080, year); + } + + // 1981 is one year after our pivot year (so this starts working) + public void testReadMessageDate1981() throws ChunkNotFoundException { + final Calendar date = mapiMessage1981.getMessageDate(); + final int year = date.get(Calendar.YEAR); + TestCase.assertEquals(1981, year); + } +} diff --git a/test-data/hsmf/message_1979.msg b/test-data/hsmf/message_1979.msg new file mode 100644 index 0000000000000000000000000000000000000000..10083c8e4966ebc4f2515bca2604f5280811b577 GIT binary patch literal 29696 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 literal 0 HcmV?d00001 diff --git a/test-data/hsmf/message_1980.msg b/test-data/hsmf/message_1980.msg new file mode 100644 index 0000000000000000000000000000000000000000..bb295404d048b6c027d406747fc397ae0b829eca GIT binary patch literal 29696 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 Pxq_+w$`WD1@A>}#z(7ju literal 0 HcmV?d00001 diff --git a/test-data/hsmf/message_1981.msg b/test-data/hsmf/message_1981.msg new file mode 100644 index 0000000000000000000000000000000000000000..6833d543472e52382bfcec138e02e2700b6c7694 GIT binary patch literal 29696 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