/*
* (C) Copyright 2006-2016 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributors:
* Nuxeo - initial API and implementation
*/
package org.nuxeo.ecm.platform.mail.listener.action;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.ATTACHMENTS_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.CC_RECIPIENTS_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.HTML_TEXT_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MAIL_MESSAGE_TYPE;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.MESSAGE_ID_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.PARENT_PATH_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.RECIPIENTS_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDER_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SENDING_DATE_PROPERTY_NAME;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.SUBJECT_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_KEY;
import static org.nuxeo.ecm.platform.mail.utils.MailCoreConstants.TEXT_PROPERTY_NAME;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.ecm.core.api.Blob;
import org.nuxeo.ecm.core.api.Blobs;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.NuxeoException;
import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner;
import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
import org.nuxeo.ecm.core.api.blobholder.SimpleBlobHolder;
import org.nuxeo.ecm.core.api.impl.blob.FileBlob;
import org.nuxeo.ecm.core.api.pathsegment.PathSegmentService;
import org.nuxeo.ecm.core.convert.api.ConversionService;
import org.nuxeo.ecm.platform.mail.action.ExecutionContext;
import org.nuxeo.runtime.api.Framework;
/**
* Creates a MailMessage document for every new email found in the INBOX. The properties values are retrieved from the
* pipe execution context.
*
* @author Catalin Baican
*/
public class CreateDocumentsAction extends AbstractMailAction {
private static final Log log = LogFactory.getLog(CreateDocumentsAction.class);
@Override
@SuppressWarnings("unchecked")
public boolean execute(ExecutionContext context) {
CoreSession session = getCoreSession(context);
if (session == null) {
log.error("Could not open CoreSession");
return false;
}
PathSegmentService pss = Framework.getService(PathSegmentService.class);
ExecutionContext initialContext = context.getInitialContext();
String subject = (String) context.get(SUBJECT_KEY);
String sender = (String) context.get(SENDER_KEY);
Date sendingDate = (Date) context.get(SENDING_DATE_KEY);
ArrayList<String> recipients = (ArrayList<String>) context.get(RECIPIENTS_KEY);
ArrayList<String> ccRecipients = (ArrayList<String>) context.get(CC_RECIPIENTS_KEY);
List<FileBlob> attachments = (List<FileBlob>) context.get(ATTACHMENTS_KEY);
String text = (String) context.get(TEXT_KEY);
String messageId = (String) context.get(MESSAGE_ID_KEY);
String parentPath = (String) initialContext.get(PARENT_PATH_KEY);
DocumentModel documentModel = session.createDocumentModel(MAIL_MESSAGE_TYPE);
documentModel.setPropertyValue("dc:title", subject + System.currentTimeMillis());
documentModel.setPathInfo(parentPath, pss.generatePathSegment(documentModel));
documentModel.setPropertyValue("dc:title", subject);
documentModel.setPropertyValue(MESSAGE_ID_PROPERTY_NAME, messageId);
documentModel.setPropertyValue(SENDER_PROPERTY_NAME, sender);
documentModel.setPropertyValue(SENDING_DATE_PROPERTY_NAME, sendingDate);
documentModel.setPropertyValue(RECIPIENTS_PROPERTY_NAME, recipients);
documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients);
if (attachments != null && !attachments.isEmpty()) {
ArrayList<Map<String, Serializable>> files = new ArrayList<>();
for (FileBlob currentFileBlob : attachments) {
if (currentFileBlob != null) {
Map<String, Serializable> file = new HashMap<>();
file.put("file", currentFileBlob);
files.add(file);
}
}
documentModel.setPropertyValue("files:files", files);
}
documentModel.setPropertyValue(CC_RECIPIENTS_PROPERTY_NAME, ccRecipients);
documentModel.setPropertyValue(HTML_TEXT_PROPERTY_NAME, text);
if (text != null && !text.isEmpty()) {
Blob sb = Blobs.createBlob(text);
BlobHolder simpleBlobHolder = new SimpleBlobHolder(sb);
ConversionService conversionService = Framework.getService(ConversionService.class);
Map<String, Serializable> parameters = new HashMap<>();
parameters.put("tagFilter", "body");
BlobHolder simpleTextBH = conversionService.convert("html2text", simpleBlobHolder, parameters);
String simpleText;
try {
simpleText = simpleTextBH.getBlob().getString();
} catch (IOException e) {
throw new NuxeoException(e);
}
documentModel.setPropertyValue(TEXT_PROPERTY_NAME, simpleText);
}
UnrestrictedCreateDocument unrestrictedCreateDocument = new UnrestrictedCreateDocument(documentModel, session);
unrestrictedCreateDocument.runUnrestricted();
return true;
}
// Helper inner class to do the unrestricted creation of the documents
protected class UnrestrictedCreateDocument extends UnrestrictedSessionRunner {
private DocumentModel document;
protected UnrestrictedCreateDocument(DocumentModel document, CoreSession session) {
super(session);
this.document = document;
}
@Override
public void run() {
document = session.createDocument(document);
document = session.saveDocument(document);
session.save();
}
}
}