This is an automated email from the ASF dual-hosted git repository.

tballison pushed a commit to branch TIKA-4806-pst-mapi-storage-dates
in repository https://gitbox.apache.org/repos/asf/tika.git

commit 86c7a5e1062f1716a41a39a7966ef986f7d0433d
Author: tallison <[email protected]>
AuthorDate: Tue Aug 4 17:15:59 2026 -0400

    TIKA-4806 -- avoid overwriting dc terms with mapi properties that aren't a 
great fit
---
 tika-core/src/main/java/org/apache/tika/metadata/MAPI.java  |  7 +++++++
 .../org/apache/tika/metadata/metadata-key-fields.json       |  3 +++
 .../apache/tika/parser/microsoft/pst/PSTMailItemParser.java | 13 +++++++++++--
 .../tika/parser/microsoft/pst/OutlookPSTParserTest.java     |  8 ++++++++
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/tika-core/src/main/java/org/apache/tika/metadata/MAPI.java 
b/tika-core/src/main/java/org/apache/tika/metadata/MAPI.java
index b748d46045..74657ce85b 100644
--- a/tika-core/src/main/java/org/apache/tika/metadata/MAPI.java
+++ b/tika-core/src/main/java/org/apache/tika/metadata/MAPI.java
@@ -52,6 +52,13 @@ public interface MAPI {
     // PidTagClientSubmitTime -- distinct MAPI prop from the provider-side 
SUBMISSION_ACCEPTED_AT_TIME.
     Property CLIENT_SUBMIT_TIME = Property.internalDate(PREFIX_MAPI_META + 
"msg-client-submit-time");
 
+    // CREATED/MODIFIED fallback when no CLIENT_SUBMIT_TIME.
+    Property MESSAGE_DELIVERY_TIME = Property.internalDate(PREFIX_MAPI_META + 
"message-delivery-time");
+
+    // Storage-level timestamps, not content dates -- don't use for 
CREATED/MODIFIED (TIKA-4798).
+    Property CREATION_TIME = Property.internalDate(PREFIX_MAPI_META + 
"creation-time");
+    Property LAST_MODIFICATION_TIME = Property.internalDate(PREFIX_MAPI_META + 
"last-modification-time");
+
     Property SUBMISSION_ID = Property.internalText(PREFIX_MAPI_META + 
"msg-submission-id");
 
     Property INTERNET_MESSAGE_ID = Property.internalText(PREFIX_MAPI_META + 
"internet-message-id");
diff --git 
a/tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json
 
b/tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json
index e4ca11e01e..a21e2755c7 100644
--- 
a/tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json
+++ 
b/tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json
@@ -189,6 +189,7 @@
   
{"class":"org.apache.tika.metadata.MAPI","field":"CLIENT_SUBMIT_TIME","key":"mapi:msg-client-submit-time"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"CONVERSATION_INDEX","key":"mapi:conversation-index"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"CONVERSATION_TOPIC","key":"mapi:conversation-topic"},
+  
{"class":"org.apache.tika.metadata.MAPI","field":"CREATION_TIME","key":"mapi:creation-time"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"FROM_REPRESENTING_EMAIL","key":"mapi:from-representing-email"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"FROM_REPRESENTING_NAME","key":"mapi:from-representing-name"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"IMPORTANCE","key":"mapi:importance"},
@@ -196,8 +197,10 @@
   
{"class":"org.apache.tika.metadata.MAPI","field":"INTERNET_REFERENCES","key":"mapi:internet-references"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"IN_REPLY_TO_ID","key":"mapi:in-reply-to-id"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"IS_FLAGGED","key":"mapi:is-flagged"},
+  
{"class":"org.apache.tika.metadata.MAPI","field":"LAST_MODIFICATION_TIME","key":"mapi:last-modification-time"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_CLASS","key":"mapi:message-class"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_CLASS_RAW","key":"mapi:message-class-raw"},
+  
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_DELIVERY_TIME","key":"mapi:message-delivery-time"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"PRIORTY","key":"mapi:priority"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"RECIPIENTS_STRING","key":"mapi:recipients-string"},
   
{"class":"org.apache.tika.metadata.MAPI","field":"SENT_BY_SERVER_TYPE","key":"mapi:sent-by-server-type"},
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
index e2f66d9399..55ef1eea9b 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java
@@ -20,6 +20,7 @@ import static java.lang.String.valueOf;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.Date;
 import java.util.Set;
 
 import com.pff.PSTAttachment;
@@ -138,9 +139,17 @@ public class PSTMailItemParser implements Parser {
         metadata.set(TikaCoreProperties.SUBJECT, pstMail.getSubject());
         metadata.set(Metadata.MESSAGE_FROM, pstMail.getSenderName());
         metadata.set(TikaCoreProperties.CREATOR, pstMail.getSenderName());
-        metadata.set(TikaCoreProperties.CREATED, pstMail.getCreationTime());
+        //creation/last-modification are storage timestamps, not content dates 
(TIKA-4798)
+        Date messageDate = pstMail.getClientSubmitTime();
+        if (messageDate == null) {
+            messageDate = pstMail.getMessageDeliveryTime();
+        }
+        metadata.set(TikaCoreProperties.CREATED, messageDate);
+        metadata.set(TikaCoreProperties.MODIFIED, messageDate);
         metadata.set(MAPI.CLIENT_SUBMIT_TIME, pstMail.getClientSubmitTime());
-        metadata.set(TikaCoreProperties.MODIFIED, 
pstMail.getLastModificationTime());
+        metadata.set(MAPI.MESSAGE_DELIVERY_TIME, 
pstMail.getMessageDeliveryTime());
+        metadata.set(MAPI.CREATION_TIME, pstMail.getCreationTime());
+        metadata.set(MAPI.LAST_MODIFICATION_TIME, 
pstMail.getLastModificationTime());
         metadata.set(TikaCoreProperties.COMMENTS, pstMail.getComment());
         metadata.set(PST.DESCRIPTOR_NODE_ID, 
valueOf(pstMail.getDescriptorNodeId()));
         metadata.set(Message.MESSAGE_FROM_EMAIL, 
pstMail.getSenderEmailAddress());
diff --git 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParserTest.java
 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParserTest.java
index 6c94ab19dd..619a7d62bf 100644
--- 
a/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParserTest.java
+++ 
b/tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParserTest.java
@@ -79,6 +79,14 @@ public class OutlookPSTParserTest extends TikaTest {
         assertEquals("Jörn Kottmann", m1.get(MAPI.FROM_REPRESENTING_NAME));
         assertEquals("[email protected]", 
m1.get(MAPI.FROM_REPRESENTING_EMAIL));
         assertEquals("NOTE", m1.get(MAPI.MESSAGE_CLASS));
+        //TIKA-4806: CREATED/MODIFIED reflect the client submit time, not the 
storage-level
+        //PidTagLastModificationTime (2014-02-26T12:37:43Z), which is ~5 hours 
later here.
+        assertEquals("2014-02-26T07:50:04Z", 
m1.get(TikaCoreProperties.CREATED));
+        assertEquals("2014-02-26T07:50:04Z", 
m1.get(TikaCoreProperties.MODIFIED));
+        assertEquals("2014-02-26T07:50:04Z", m1.get(MAPI.CLIENT_SUBMIT_TIME));
+        assertEquals("2014-02-26T07:51:02Z", m1.get(MAPI.CREATION_TIME));
+        assertEquals("2014-02-26T12:37:43Z", 
m1.get(MAPI.LAST_MODIFICATION_TIME));
+        assertEquals("2014-02-26T07:51:02Z", 
m1.get(MAPI.MESSAGE_DELIVERY_TIME));
         assertEquals("/Début du fichier de données Outlook/Re: Feature 
Generators.msg",
                 m1.get(TikaCoreProperties.INTERNAL_PATH));
         //test that subject is making it into the xhtml

Reply via email to