This is an automated email from the ASF dual-hosted git repository.
tballison pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git
The following commit(s) were added to refs/heads/main by this push:
new dcb7d5408f TIKA-4806 -- avoid overwriting dc terms with mapi
properties that aren't a great fit (#2988)
dcb7d5408f is described below
commit dcb7d5408f958c0a8b1128999120328be93d93ef
Author: Tim Allison <[email protected]>
AuthorDate: Wed Aug 5 11:42:38 2026 -0400
TIKA-4806 -- avoid overwriting dc terms with mapi properties that aren't a
great fit (#2988)
---
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