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}