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