diff --git a/config/alfresco/content-services-context.xml b/config/alfresco/content-services-context.xml index 64aa5817a6..c3fb0224bb 100644 --- a/config/alfresco/content-services-context.xml +++ b/config/alfresco/content-services-context.xml @@ -200,6 +200,7 @@ + diff --git a/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java new file mode 100755 index 0000000000..f6a91e4dc8 --- /dev/null +++ b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2005-2009 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.repo.content.metadata; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.mail.Header; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeUtility; +import javax.mail.internet.MimeMessage.RecipientType; + +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.service.cmr.repository.ContentReader; + +public class RFC822MetadataExtracter extends AbstractMappingMetadataExtracter +{ + + private static final String KEY_MESSAGE_FROM = "messageFrom"; + private static final String KEY_MESSAGE_TO = "messageTo"; + private static final String KEY_MESSAGE_CC = "messageCc"; + private static final String KEY_MESSAGE_SUBJECT = "messageSubject"; + + public static String[] SUPPORTED_MIMETYPES = new String[] { MimetypeMap.MIMETYPE_RFC822 }; + + public RFC822MetadataExtracter() + { + super(new HashSet(Arrays.asList(SUPPORTED_MIMETYPES))); + } + + @Override + protected Map extractRaw(ContentReader reader) throws Throwable + { + Map rawProperties = newRawMap(); + + InputStream is = null; + try + { + is = reader.getContentInputStream(); + MimeMessage mimeMessage = new MimeMessage(null, is); + + if (mimeMessage != null) + { + //Extract values that doesn't match to headers and need to be encoded. + putRawValue(KEY_MESSAGE_FROM, InternetAddress.toString(mimeMessage.getFrom()), rawProperties); + putRawValue(KEY_MESSAGE_TO, InternetAddress.toString(mimeMessage.getRecipients(RecipientType.TO)), rawProperties); + putRawValue(KEY_MESSAGE_CC, InternetAddress.toString(mimeMessage.getRecipients(RecipientType.CC)), rawProperties); + + String[] subj = mimeMessage.getHeader("Subject"); + if (subj != null && subj.length > 0) + { + String decodedSubject = subj[0]; + try + { + decodedSubject = MimeUtility.decodeText(decodedSubject); + } + catch (UnsupportedEncodingException e) + { + logger.warn(e.toString()); + } + putRawValue(KEY_MESSAGE_SUBJECT, decodedSubject, rawProperties); + } + + //Extract values from headers + Set keys = getMapping().keySet(); + Enumeration
headers = mimeMessage.getAllHeaders(); + while (headers.hasMoreElements()) + { + Header header = (Header) headers.nextElement(); + if (keys.contains(header.getName())) + { + header.getValue(); + putRawValue(header.getName(), header.getValue(), rawProperties); + } + } + + } + } + finally + { + if (is != null) + { + try + { + is.close(); + } + catch (IOException e) + { + } + } + } + // Done + return rawProperties; + } + +} diff --git a/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.properties b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.properties new file mode 100755 index 0000000000..d85dec9640 --- /dev/null +++ b/source/java/org/alfresco/repo/content/metadata/RFC822MetadataExtracter.properties @@ -0,0 +1,19 @@ +# +# RFC822MetadataExtracter - default mapping +# + +# Namespaces +namespace.prefix.imap=http://www.alfresco.org/model/imap/1.0 +namespace.prefix.cm=http://www.alfresco.org/model/content/1.0 + +# Mappings + +#Default values that doesn't match to Header +messageFrom=imap:messageFrom +messageTo=imap:messageTo +messageCc=imap:messageCc +messageSubject=imap:messageSubject, cm:title, cm:description + +#Add here any values you want to extract. Use Header name for key. +Thread-Index=imap:threadIndex +Message-ID=imap:messageId \ No newline at end of file diff --git a/source/java/org/alfresco/repo/imap/IncomingImapMessage.java b/source/java/org/alfresco/repo/imap/IncomingImapMessage.java index 2207f16626..9bcf7572f6 100755 --- a/source/java/org/alfresco/repo/imap/IncomingImapMessage.java +++ b/source/java/org/alfresco/repo/imap/IncomingImapMessage.java @@ -85,38 +85,9 @@ public class IncomingImapMessage extends AbstractMimeMessage // Add Imap Content Aspect with properties NodeService nodeService = serviceRegistry.getNodeService(); nodeService.addAspect(this.messageFileInfo.getNodeRef(), ImapModel.ASPECT_IMAP_CONTENT, null); + imapService.setFlags(messageFileInfo, flags, true); // Write content writeContent(); - imapService.setFlags(messageFileInfo, flags, true); - - final NodeRef nodeRef = messageFileInfo.getNodeRef(); - Map newProperties = new HashMap(); - newProperties.put(ImapModel.PROP_MESSAGE_FROM, InternetAddress.toString(this.getFrom())); - newProperties.put(ImapModel.PROP_MESSAGE_TO, InternetAddress.toString(this.getRecipients(RecipientType.TO))); - newProperties.put(ImapModel.PROP_MESSAGE_CC, InternetAddress.toString(this.getRecipients(RecipientType.CC))); - newProperties.put(ImapModel.PROP_MESSAGE_ID, this.getMessageID()); - String[] threadIndexes = this.getHeader("Thread-Index"); - String threadIndex = (threadIndexes == null || threadIndexes.length == 0) ? null : threadIndexes[0]; - newProperties.put(ImapModel.PROP_THREAD_INDEX, threadIndex); - - String[] subj = this.getHeader("Subject"); - if (subj != null && subj.length > 0) - { - String decodedSubject = subj[0]; - try - { - decodedSubject = MimeUtility.decodeText(decodedSubject); - } - catch (UnsupportedEncodingException e) - { - logger.warn(e.toString()); - } - newProperties.put(ImapModel.PROP_MESSAGE_SUBJECT, decodedSubject); - newProperties.put(ContentModel.PROP_TITLE, decodedSubject); - newProperties.put(ContentModel.PROP_DESCRIPTION, decodedSubject); - } - - serviceRegistry.getNodeService().addProperties(nodeRef, newProperties); } /**