From 14f237d3a7e25e6bba4a9d076cd5a7a3e028842c Mon Sep 17 00:00:00 2001 From: nddipiazza Date: Tue, 4 Aug 2026 11:54:18 -0500 Subject: [PATCH] TIKA-4798: Don't overwrite dcterms:modified with PR_LAST_MODIFICATION_TIME for MSG files - Removed the code in OutlookExtractor.handleGeneralDates() that unconditionally overwrote TikaCoreProperties.MODIFIED with the raw MAPI PR_LAST_MODIFICATION_TIME property. That property records when a .msg file's underlying storage was last written to disk (e.g. when re-saved or exported by Outlook), not when the message content was actually edited, and can be months after the message was sent/received. - dcterms:modified now falls back to the message date (delivery/submit time), matching Tika 2.9.0 behavior. - The raw PR_LAST_MODIFICATION_TIME value remains available, unchanged, under mapi:last-modification-time. - Added a regression test asserting both values on test-outlook.msg, whose PR_LAST_MODIFICATION_TIME diverges from its message date by six months. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../tika/parser/microsoft/OutlookExtractor.java | 12 +++++------- .../tika/parser/microsoft/OutlookParserTest.java | 7 +++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java index 4b2c6ae17e..641be6b896 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/OutlookExtractor.java @@ -575,13 +575,11 @@ private void handleGeneralDates(MAPIMessage msg, Map headers, } } } - //try to overwrite the modified property if the actual LAST_MODIFICATION_TIME property exists. - List timeProp = msg.getMainChunks().getProperties().get(MAPIProperty.LAST_MODIFICATION_TIME); - if (timeProp != null && ! timeProp.isEmpty()) { - Calendar cal = ((PropertyValue.TimePropertyValue)timeProp.get(0)).getValue(); - metadata.set(TikaCoreProperties.MODIFIED, cal); - } - + //Note: PR_LAST_MODIFICATION_TIME is intentionally not used to overwrite dcterms:modified here. + //For a .msg file, that MAPI property reflects when the message's underlying storage was + //last written (e.g. when the item was saved/exported to disk), not when its content was + //actually edited, and can be long after the message was sent/received. It remains available, + //unmodified, as mapi:last-modification-time (see handleMessageInfo/LITERAL_TIME_PROPERTIES). } private void handleBodyChunks(Chunk htmlChunk, Chunk rtfChunk, Chunk textChunk, diff --git a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java index 9d06f7bf94..041d4d20f2 100644 --- a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java +++ b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/OutlookParserTest.java @@ -81,6 +81,13 @@ public void testOutlookParsing() throws Exception { // Stored as Thu, 5 Apr 2007 09:26:06 -0700 assertEquals("2007-04-05T16:26:06Z", metadata.get(TikaCoreProperties.CREATED)); + //TIKA-4798: dcterms:modified should reflect the message date, not + //PR_LAST_MODIFICATION_TIME, which for a .msg file records when the file's + //underlying storage was last written (e.g. resaved/exported to disk), and + //can be much later than when the message was actually sent/received. + assertEquals("2007-04-05T16:26:06Z", metadata.get(TikaCoreProperties.MODIFIED)); + assertEquals("2007-10-05T05:37:49Z", metadata.get("mapi:last-modification-time")); + String content = handler.toString(); assertNotContained("Microsoft Outlook Express 6", content); assertNotContained("L'\u00C9quipe Microsoft Outlook Express", content);