001/* 002 * (C) Copyright 2006-2009 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * Nuxeo - initial API and implementation 018 * 019 * $Id$ 020 */ 021 022package org.nuxeo.ecm.platform.mail.listener.action; 023 024import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.ATTACHMENTS_KEY; 025import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_KEY; 026import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_PROPERTY_NAME; 027import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.HTML_TEXT_PROPERTY_NAME; 028import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MAIL_MESSAGE_TYPE; 029import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_KEY; 030import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_PROPERTY_NAME; 031import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.PARENT_PATH_KEY; 032import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_KEY; 033import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_PROPERTY_NAME; 034import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_KEY; 035import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_PROPERTY_NAME; 036import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_KEY; 037import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_PROPERTY_NAME; 038import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SUBJECT_KEY; 039import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_KEY; 040import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_PROPERTY_NAME; 041 042import java.io.IOException; 043import java.io.Serializable; 044import java.util.ArrayList; 045import java.util.Date; 046import java.util.HashMap; 047import java.util.List; 048import java.util.Map; 049 050import org.apache.commons.logging.Log; 051import org.apache.commons.logging.LogFactory; 052import org.nuxeo.ecm.core.api.Blob; 053import org.nuxeo.ecm.core.api.Blobs; 054import org.nuxeo.ecm.core.api.CoreSession; 055import org.nuxeo.ecm.core.api.DocumentModel; 056import org.nuxeo.ecm.core.api.NuxeoException; 057import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner; 058import org.nuxeo.ecm.core.api.blobholder.BlobHolder; 059import org.nuxeo.ecm.core.api.blobholder.SimpleBlobHolder; 060import org.nuxeo.ecm.core.api.impl.blob.FileBlob; 061import org.nuxeo.ecm.core.api.pathsegment.PathSegmentService; 062import org.nuxeo.ecm.core.convert.api.ConversionService; 063import org.nuxeo.ecm.platform.mail.action.ExecutionContext; 064import org.nuxeo.runtime.api.Framework; 065 066/** 067 * Creates a MailMessage document for every new email found in the INBOX. The properties values are retrieved from the 068 * pipe execution context. 069 * 070 * @author Catalin Baican 071 */ 072public class CreateDocumentsAction extends AbstractMailAction { 073 074 private static final Log log = LogFactory.getLog(CreateDocumentsAction.class); 075 076 @Override 077 @SuppressWarnings("unchecked") 078 public boolean execute(ExecutionContext context) { 079 CoreSession session = getCoreSession(context); 080 if (session == null) { 081 log.error("Could not open CoreSession"); 082 return false; 083 } 084 PathSegmentService pss = Framework.getService(PathSegmentService.class); 085 086 ExecutionContext initialContext = context.getInitialContext(); 087 088 String subject = (String) context.get(SUBJECT_KEY); 089 String sender = (String) context.get(SENDER_KEY); 090 Date sendingDate = (Date) context.get(SENDING_DATE_KEY); 091 ArrayList<String> recipients = (ArrayList<String>) context.get(RECIPIENTS_KEY); 092 ArrayList<String> ccRecipients = (ArrayList<String>) context.get(CC_RECIPIENTS_KEY); 093 List<FileBlob> attachments = (List<FileBlob>) context.get(ATTACHMENTS_KEY); 094 String text = (String) context.get(TEXT_KEY); 095 String messageId = (String) context.get(MESSAGE_ID_KEY); 096 097 String parentPath = (String) initialContext.get(PARENT_PATH_KEY); 098 099 DocumentModel documentModel = session.createDocumentModel(MAIL_MESSAGE_TYPE); 100 documentModel.setPropertyValue("dc:title", subject + System.currentTimeMillis()); 101 documentModel.setPathInfo(parentPath, pss.generatePathSegment(documentModel)); 102 documentModel.setPropertyValue("dc:title", subject); 103 documentModel.setPropertyValue(MESSAGE_ID_PROPERTY_NAME, messageId); 104 documentModel.setPropertyValue(SENDER_PROPERTY_NAME, sender); 105 documentModel.setPropertyValue(SENDING_DATE_PROPERTY_NAME, sendingDate); 106 documentModel.setPropertyValue(RECIPIENTS_PROPERTY_NAME, recipients); 107 documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients); 108 if (attachments != null && !attachments.isEmpty()) { 109 ArrayList<Map<String, Serializable>> files = new ArrayList<Map<String, Serializable>>(); 110 for (FileBlob currentFileBlob : attachments) { 111 if (currentFileBlob != null) { 112 Map<String, Serializable> file = new HashMap<String, Serializable>(); 113 file.put("file", currentFileBlob); 114 file.put("filename", currentFileBlob.getFilename()); 115 files.add(file); 116 } 117 } 118 documentModel.setPropertyValue("files:files", files); 119 } 120 documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients); 121 122 documentModel.setPropertyValue(HTML_TEXT_PROPERTY_NAME, text); 123 if (text != null && !text.isEmpty()) { 124 Blob sb = Blobs.createBlob(text); 125 BlobHolder simpleBlobHolder = new SimpleBlobHolder(sb); 126 ConversionService conversionService = Framework.getService(ConversionService.class); 127 Map<String, Serializable> parameters = new HashMap<String, Serializable>(); 128 parameters.put("tagFilter", "body"); 129 BlobHolder simpleTextBH = conversionService.convert("html2text", simpleBlobHolder, parameters); 130 String simpleText; 131 try { 132 simpleText = simpleTextBH.getBlob().getString(); 133 } catch (IOException e) { 134 throw new NuxeoException(e); 135 } 136 documentModel.setPropertyValue(TEXT_PROPERTY_NAME, simpleText); 137 } 138 139 UnrestrictedCreateDocument unrestrictedCreateDocument = new UnrestrictedCreateDocument(documentModel, session); 140 unrestrictedCreateDocument.runUnrestricted(); 141 142 return true; 143 } 144 145 // Helper inner class to do the unrestricted creation of the documents 146 protected class UnrestrictedCreateDocument extends UnrestrictedSessionRunner { 147 148 private DocumentModel document; 149 150 protected UnrestrictedCreateDocument(DocumentModel document, CoreSession session) { 151 super(session); 152 this.document = document; 153 } 154 155 @Override 156 public void run() { 157 document = session.createDocument(document); 158 document = session.saveDocument(document); 159 session.save(); 160 } 161 } 162 163}