Skip to content

Commit dcb7d54

Browse files
authored
TIKA-4806 -- avoid overwriting dc terms with mapi properties that aren't a great fit (#2988)
1 parent 8bce0bc commit dcb7d54

4 files changed

Lines changed: 29 additions & 2 deletions

File tree

tika-core/src/main/java/org/apache/tika/metadata/MAPI.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ public interface MAPI {
5252
// PidTagClientSubmitTime -- distinct MAPI prop from the provider-side SUBMISSION_ACCEPTED_AT_TIME.
5353
Property CLIENT_SUBMIT_TIME = Property.internalDate(PREFIX_MAPI_META + "msg-client-submit-time");
5454

55+
// CREATED/MODIFIED fallback when no CLIENT_SUBMIT_TIME.
56+
Property MESSAGE_DELIVERY_TIME = Property.internalDate(PREFIX_MAPI_META + "message-delivery-time");
57+
58+
// Storage-level timestamps, not content dates -- don't use for CREATED/MODIFIED (TIKA-4798).
59+
Property CREATION_TIME = Property.internalDate(PREFIX_MAPI_META + "creation-time");
60+
Property LAST_MODIFICATION_TIME = Property.internalDate(PREFIX_MAPI_META + "last-modification-time");
61+
5562
Property SUBMISSION_ID = Property.internalText(PREFIX_MAPI_META + "msg-submission-id");
5663

5764
Property INTERNET_MESSAGE_ID = Property.internalText(PREFIX_MAPI_META + "internet-message-id");

tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,18 @@
189189
{"class":"org.apache.tika.metadata.MAPI","field":"CLIENT_SUBMIT_TIME","key":"mapi:msg-client-submit-time"},
190190
{"class":"org.apache.tika.metadata.MAPI","field":"CONVERSATION_INDEX","key":"mapi:conversation-index"},
191191
{"class":"org.apache.tika.metadata.MAPI","field":"CONVERSATION_TOPIC","key":"mapi:conversation-topic"},
192+
{"class":"org.apache.tika.metadata.MAPI","field":"CREATION_TIME","key":"mapi:creation-time"},
192193
{"class":"org.apache.tika.metadata.MAPI","field":"FROM_REPRESENTING_EMAIL","key":"mapi:from-representing-email"},
193194
{"class":"org.apache.tika.metadata.MAPI","field":"FROM_REPRESENTING_NAME","key":"mapi:from-representing-name"},
194195
{"class":"org.apache.tika.metadata.MAPI","field":"IMPORTANCE","key":"mapi:importance"},
195196
{"class":"org.apache.tika.metadata.MAPI","field":"INTERNET_MESSAGE_ID","key":"mapi:internet-message-id"},
196197
{"class":"org.apache.tika.metadata.MAPI","field":"INTERNET_REFERENCES","key":"mapi:internet-references"},
197198
{"class":"org.apache.tika.metadata.MAPI","field":"IN_REPLY_TO_ID","key":"mapi:in-reply-to-id"},
198199
{"class":"org.apache.tika.metadata.MAPI","field":"IS_FLAGGED","key":"mapi:is-flagged"},
200+
{"class":"org.apache.tika.metadata.MAPI","field":"LAST_MODIFICATION_TIME","key":"mapi:last-modification-time"},
199201
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_CLASS","key":"mapi:message-class"},
200202
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_CLASS_RAW","key":"mapi:message-class-raw"},
203+
{"class":"org.apache.tika.metadata.MAPI","field":"MESSAGE_DELIVERY_TIME","key":"mapi:message-delivery-time"},
201204
{"class":"org.apache.tika.metadata.MAPI","field":"PRIORTY","key":"mapi:priority"},
202205
{"class":"org.apache.tika.metadata.MAPI","field":"RECIPIENTS_STRING","key":"mapi:recipients-string"},
203206
{"class":"org.apache.tika.metadata.MAPI","field":"SENT_BY_SERVER_TYPE","key":"mapi:sent-by-server-type"},

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/pst/PSTMailItemParser.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.io.IOException;
2222
import java.nio.charset.StandardCharsets;
23+
import java.util.Date;
2324
import java.util.Set;
2425

2526
import com.pff.PSTAttachment;
@@ -138,9 +139,17 @@ private void extractMetadata(PSTMessage pstMail, Metadata metadata) {
138139
metadata.set(TikaCoreProperties.SUBJECT, pstMail.getSubject());
139140
metadata.set(Metadata.MESSAGE_FROM, pstMail.getSenderName());
140141
metadata.set(TikaCoreProperties.CREATOR, pstMail.getSenderName());
141-
metadata.set(TikaCoreProperties.CREATED, pstMail.getCreationTime());
142+
//creation/last-modification are storage timestamps, not content dates (TIKA-4798)
143+
Date messageDate = pstMail.getClientSubmitTime();
144+
if (messageDate == null) {
145+
messageDate = pstMail.getMessageDeliveryTime();
146+
}
147+
metadata.set(TikaCoreProperties.CREATED, messageDate);
148+
metadata.set(TikaCoreProperties.MODIFIED, messageDate);
142149
metadata.set(MAPI.CLIENT_SUBMIT_TIME, pstMail.getClientSubmitTime());
143-
metadata.set(TikaCoreProperties.MODIFIED, pstMail.getLastModificationTime());
150+
metadata.set(MAPI.MESSAGE_DELIVERY_TIME, pstMail.getMessageDeliveryTime());
151+
metadata.set(MAPI.CREATION_TIME, pstMail.getCreationTime());
152+
metadata.set(MAPI.LAST_MODIFICATION_TIME, pstMail.getLastModificationTime());
144153
metadata.set(TikaCoreProperties.COMMENTS, pstMail.getComment());
145154
metadata.set(PST.DESCRIPTOR_NODE_ID, valueOf(pstMail.getDescriptorNodeId()));
146155
metadata.set(Message.MESSAGE_FROM_EMAIL, pstMail.getSenderEmailAddress());

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/test/java/org/apache/tika/parser/microsoft/pst/OutlookPSTParserTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ public void testExtendedMetadata() throws Exception {
7979
assertEquals("Jörn Kottmann", m1.get(MAPI.FROM_REPRESENTING_NAME));
8080
assertEquals("kottmann@gmail.com", m1.get(MAPI.FROM_REPRESENTING_EMAIL));
8181
assertEquals("NOTE", m1.get(MAPI.MESSAGE_CLASS));
82+
//TIKA-4806: CREATED/MODIFIED reflect the client submit time, not the storage-level
83+
//PidTagLastModificationTime (2014-02-26T12:37:43Z), which is ~5 hours later here.
84+
assertEquals("2014-02-26T07:50:04Z", m1.get(TikaCoreProperties.CREATED));
85+
assertEquals("2014-02-26T07:50:04Z", m1.get(TikaCoreProperties.MODIFIED));
86+
assertEquals("2014-02-26T07:50:04Z", m1.get(MAPI.CLIENT_SUBMIT_TIME));
87+
assertEquals("2014-02-26T07:51:02Z", m1.get(MAPI.CREATION_TIME));
88+
assertEquals("2014-02-26T12:37:43Z", m1.get(MAPI.LAST_MODIFICATION_TIME));
89+
assertEquals("2014-02-26T07:51:02Z", m1.get(MAPI.MESSAGE_DELIVERY_TIME));
8290
assertEquals("/Début du fichier de données Outlook/Re: Feature Generators.msg",
8391
m1.get(TikaCoreProperties.INTERNAL_PATH));
8492
//test that subject is making it into the xhtml

0 commit comments

Comments
 (0)