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}