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}