001/* 002 * (C) Copyright 2006-2016 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 */ 019package org.nuxeo.ecm.platform.mail.listener.action; 020 021import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.ATTACHMENTS_KEY; 022import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_KEY; 023import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_PROPERTY_NAME; 024import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.HTML_TEXT_PROPERTY_NAME; 025import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MAIL_MESSAGE_TYPE; 026import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_KEY; 027import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_PROPERTY_NAME; 028import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.PARENT_PATH_KEY; 029import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_KEY; 030import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_PROPERTY_NAME; 031import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_KEY; 032import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_PROPERTY_NAME; 033import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_KEY; 034import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_PROPERTY_NAME; 035import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SUBJECT_KEY; 036import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_KEY; 037import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_PROPERTY_NAME; 038 039import java.io.IOException; 040import java.io.Serializable; 041import java.util.ArrayList; 042import java.util.Date; 043import java.util.HashMap; 044import java.util.List; 045import java.util.Map; 046 047import org.apache.commons.logging.Log; 048import org.apache.commons.logging.LogFactory; 049import org.nuxeo.ecm.core.api.Blob; 050import org.nuxeo.ecm.core.api.Blobs; 051import org.nuxeo.ecm.core.api.CoreSession; 052import org.nuxeo.ecm.core.api.DocumentModel; 053import org.nuxeo.ecm.core.api.NuxeoException; 054import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner; 055import org.nuxeo.ecm.core.api.blobholder.BlobHolder; 056import org.nuxeo.ecm.core.api.blobholder.SimpleBlobHolder; 057import org.nuxeo.ecm.core.api.impl.blob.FileBlob; 058import org.nuxeo.ecm.core.api.pathsegment.PathSegmentService; 059import org.nuxeo.ecm.core.convert.api.ConversionService; 060import org.nuxeo.ecm.platform.mail.action.ExecutionContext; 061import org.nuxeo.runtime.api.Framework; 062 063/** 064 * Creates a MailMessage document for every new email found in the INBOX. The properties values are retrieved from the 065 * pipe execution context. 066 * 067 * @author Catalin Baican 068 */ 069public class CreateDocumentsAction extends AbstractMailAction { 070 071 private static final Log log = LogFactory.getLog(CreateDocumentsAction.class); 072 073 @Override 074 @SuppressWarnings("unchecked") 075 public boolean execute(ExecutionContext context) { 076 CoreSession session = getCoreSession(context); 077 if (session == null) { 078 log.error("Could not open CoreSession"); 079 return false; 080 } 081 PathSegmentService pss = Framework.getService(PathSegmentService.class); 082 083 ExecutionContext initialContext = context.getInitialContext(); 084 085 String subject = (String) context.get(SUBJECT_KEY); 086 String sender = (String) context.get(SENDER_KEY); 087 Date sendingDate = (Date) context.get(SENDING_DATE_KEY); 088 ArrayList<String> recipients = (ArrayList<String>) context.get(RECIPIENTS_KEY); 089 ArrayList<String> ccRecipients = (ArrayList<String>) context.get(CC_RECIPIENTS_KEY); 090 List<FileBlob> attachments = (List<FileBlob>) context.get(ATTACHMENTS_KEY); 091 String text = (String) context.get(TEXT_KEY); 092 String messageId = (String) context.get(MESSAGE_ID_KEY); 093 094 String parentPath = (String) initialContext.get(PARENT_PATH_KEY); 095 096 DocumentModel documentModel = session.createDocumentModel(MAIL_MESSAGE_TYPE); 097 documentModel.setPropertyValue("dc:title", subject + System.currentTimeMillis()); 098 documentModel.setPathInfo(parentPath, pss.generatePathSegment(documentModel)); 099 documentModel.setPropertyValue("dc:title", subject); 100 documentModel.setPropertyValue(MESSAGE_ID_PROPERTY_NAME, messageId); 101 documentModel.setPropertyValue(SENDER_PROPERTY_NAME, sender); 102 documentModel.setPropertyValue(SENDING_DATE_PROPERTY_NAME, sendingDate); 103 documentModel.setPropertyValue(RECIPIENTS_PROPERTY_NAME, recipients); 104 documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients); 105 if (attachments != null && !attachments.isEmpty()) { 106 ArrayList<Map<String, Serializable>> files = new ArrayList<>(); 107 for (FileBlob currentFileBlob : attachments) { 108 if (currentFileBlob != null) { 109 Map<String, Serializable> file = new HashMap<>(); 110 file.put("file", currentFileBlob); 111 files.add(file); 112 } 113 } 114 documentModel.setPropertyValue("files:files", files); 115 } 116 documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients); 117 118 documentModel.setPropertyValue(HTML_TEXT_PROPERTY_NAME, text); 119 if (text != null && !text.isEmpty()) { 120 Blob sb = Blobs.createBlob(text); 121 BlobHolder simpleBlobHolder = new SimpleBlobHolder(sb); 122 ConversionService conversionService = Framework.getService(ConversionService.class); 123 Map<String, Serializable> parameters = new HashMap<>(); 124 parameters.put("tagFilter", "body"); 125 BlobHolder simpleTextBH = conversionService.convert("html2text", simpleBlobHolder, parameters); 126 String simpleText; 127 try { 128 simpleText = simpleTextBH.getBlob().getString(); 129 } catch (IOException e) { 130 throw new NuxeoException(e); 131 } 132 documentModel.setPropertyValue(TEXT_PROPERTY_NAME, simpleText); 133 } 134 135 UnrestrictedCreateDocument unrestrictedCreateDocument = new UnrestrictedCreateDocument(documentModel, session); 136 unrestrictedCreateDocument.runUnrestricted(); 137 138 return true; 139 } 140 141 // Helper inner class to do the unrestricted creation of the documents 142 protected class UnrestrictedCreateDocument extends UnrestrictedSessionRunner { 143 144 private DocumentModel document; 145 146 protected UnrestrictedCreateDocument(DocumentModel document, CoreSession session) { 147 super(session); 148 this.document = document; 149 } 150 151 @Override 152 public void run() { 153 document = session.createDocument(document); 154 document = session.saveDocument(document); 155 session.save(); 156 } 157 } 158 159}