Outlook email meta-data extractor improved to handle email addressee fields of various odd Exchange types

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3645 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2006-08-31 14:41:23 +00:00
parent 29a4e803d9
commit 75ead51be8

View File

@@ -29,7 +29,6 @@ import java.util.Map;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.ContentIOException; import org.alfresco.service.cmr.repository.ContentIOException;
import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.apache.poi.poifs.eventfilesystem.POIFSReader; import org.apache.poi.poifs.eventfilesystem.POIFSReader;
import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent; import org.apache.poi.poifs.eventfilesystem.POIFSReaderEvent;
@@ -130,7 +129,8 @@ public class MailMetadataExtracter extends AbstractMetadataExtracter
private static final String ENCODING_UNICODE = "001F"; private static final String ENCODING_UNICODE = "001F";
private static final String SUBSTG_MESSAGEBODY = "1000"; private static final String SUBSTG_MESSAGEBODY = "1000";
private static final String SUBSTG_RECIPIENTEMAIL = "39FE"; private static final String SUBSTG_RECIPIENTEMAIL = "39FE"; // 7bit email address
private static final String SUBSTG_RECIPIENTSEARCH = "300B"; // address 'search' variant
private static final String SUBSTG_RECEIVEDEMAIL = "0076"; private static final String SUBSTG_RECEIVEDEMAIL = "0076";
private static final String SUBSTG_SENDEREMAIL = "0C1F"; private static final String SUBSTG_SENDEREMAIL = "0C1F";
private static final String SUBSTG_DATE = "0047"; private static final String SUBSTG_DATE = "0047";
@@ -159,6 +159,27 @@ public class MailMetadataExtracter extends AbstractMetadataExtracter
{ {
receipientEmails.get().add(convertExchangeAddress(extractText())); receipientEmails.get().add(convertExchangeAddress(extractText()));
} }
else if (type.equals(SUBSTG_RECIPIENTSEARCH))
{
String email = extractText(ENCODING_TEXT);
int smptIndex = email.indexOf("SMTP:");
if (smptIndex != -1)
{
/* also may be used for SUBSTG_RECIPIENTTRANSPORT = "5FF7";
with search for SMPT followed by a null char */
// this is a secondary mechanism for encoding a receipient email address
// the 7 bit email address may not have been set by Outlook - so this is needed instead
// handle null character at end of string
int endIndex = email.length();
if (email.codePointAt(email.length() - 1) == 0)
{
endIndex--;
}
email = email.substring(smptIndex + 5, endIndex);
receipientEmails.get().add(email);
}
}
else if (type.equals(SUBSTG_RECEIVEDEMAIL)) else if (type.equals(SUBSTG_RECEIVEDEMAIL))
{ {
destination.put(ContentModel.PROP_ADDRESSEE, convertExchangeAddress(extractText())); destination.put(ContentModel.PROP_ADDRESSEE, convertExchangeAddress(extractText()));
@@ -169,8 +190,8 @@ public class MailMetadataExtracter extends AbstractMetadataExtracter
} }
else if (type.equals(SUBSTG_DATE)) else if (type.equals(SUBSTG_DATE))
{ {
// the date is not really plain text - but it's easier to parse as such // the date is not "really" plain text - but it's appropriate to parse as such
String date = extractText(); String date = extractText(ENCODING_TEXT);
int valueIndex = date.indexOf("l="); int valueIndex = date.indexOf("l=");
if (valueIndex != -1) if (valueIndex != -1)
{ {
@@ -203,15 +224,28 @@ public class MailMetadataExtracter extends AbstractMetadataExtracter
*/ */
private String extractText() private String extractText()
throws IOException throws IOException
{
return extractText(this.encoding);
}
/**
* Extract the text from the stream based on the encoding
*
* @return String
*
* @throws IOException
*/
private String extractText(String encoding)
throws IOException
{ {
byte[] data = new byte[stream.available()]; byte[] data = new byte[stream.available()];
stream.read(data); stream.read(data);
if (this.encoding.equals(ENCODING_TEXT) || this.encoding.equals(ENCODING_BINARY)) if (encoding.equals(ENCODING_TEXT) || encoding.equals(ENCODING_BINARY))
{ {
return new String(data); return new String(data);
} }
else if (this.encoding.equals(ENCODING_UNICODE)) else if (encoding.equals(ENCODING_UNICODE))
{ {
// convert double-byte encoding to single byte for String conversion // convert double-byte encoding to single byte for String conversion
byte[] b = new byte[data.length >> 1]; byte[] b = new byte[data.length >> 1];