001package org.nuxeo.ecm.platform.groups.audit.service.acl.job.publish; 002 003import java.io.Serializable; 004import java.util.List; 005 006import org.apache.commons.logging.Log; 007import org.apache.commons.logging.LogFactory; 008import org.nuxeo.ecm.automation.AutomationService; 009import org.nuxeo.ecm.automation.InvalidChainException; 010import org.nuxeo.ecm.automation.OperationChain; 011import org.nuxeo.ecm.automation.OperationContext; 012import org.nuxeo.ecm.automation.OperationException; 013import org.nuxeo.ecm.automation.OperationParameters; 014import org.nuxeo.ecm.automation.core.mail.Mailer; 015import org.nuxeo.ecm.automation.core.operations.notification.SendMail; 016import org.nuxeo.ecm.automation.core.util.StringList; 017import org.nuxeo.ecm.core.api.Blob; 018import org.nuxeo.ecm.core.api.CoreSession; 019import org.nuxeo.ecm.core.api.DocumentModel; 020import org.nuxeo.ecm.core.api.NuxeoException; 021import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner; 022import org.nuxeo.ecm.core.api.impl.blob.FileBlob; 023import org.nuxeo.ecm.platform.groups.audit.service.acl.utils.MessageAccessor; 024import org.nuxeo.runtime.api.Framework; 025 026public class PublishByMail implements IResultPublisher { 027 028 private static final long serialVersionUID = 1L; 029 030 private static final Log log = LogFactory.getLog(PublishByMail.class); 031 032 public static final String PROPERTY_ACLAUDIT_SENDMAIL_CHAIN = "ACL.Audit.SendMail"; 033 034 public static final String PROPERTY_MAILFROM = "mail.from"; 035 036 public static final String PROPERTY_MAIL_SUBJECT = "message.acl.audit.mail.title"; 037 038 public static final String PROPERTY_MAIL_BODY = "message.acl.audit.mail.body"; 039 040 public static String OUTPUT_FILE_NAME = "permissions.xls"; 041 042 public static String FROM = "noreply@nuxeo.com"; 043 044 protected String repositoryName; 045 046 protected String to; 047 048 protected String defaultFrom; 049 050 public PublishByMail(String to, String defaultFrom, String repositoryName) { 051 this.repositoryName = repositoryName; 052 this.to = to; 053 this.defaultFrom = defaultFrom; 054 } 055 056 @Override 057 public void publish(final Blob file) { 058 file.setFilename(OUTPUT_FILE_NAME); 059 new UnrestrictedSessionRunner(repositoryName) { 060 @Override 061 public void run() { 062 DocumentModel docToSend = createDocument(session, file, "", ""); 063 doCallOperationSendMail(session, docToSend, to, defaultFrom); 064 log.debug("audit sent"); 065 } 066 }.runUnrestricted(); 067 } 068 069 protected void doCallOperationSendMail(CoreSession session, DocumentModel docToSend, String to, String defaultFrom) 070 { 071 String title = MessageAccessor.get(session, PROPERTY_MAIL_SUBJECT); 072 String body = MessageAccessor.get(session, PROPERTY_MAIL_BODY); 073 String from = Framework.getProperty(PROPERTY_MAILFROM, defaultFrom); 074 AutomationService automation = Framework.getLocalService(AutomationService.class); 075 076 OperationContext ctx = new OperationContext(session); 077 ctx.setInput(docToSend); 078 079 try { 080 OperationChain chain = new OperationChain(PROPERTY_ACLAUDIT_SENDMAIL_CHAIN); 081 OperationParameters params = chain.add(SendMail.ID); 082 if (params == null) { 083 log.error("failed to retrieve operation " + SendMail.ID + " in chain " + chain); 084 return; 085 } 086 087 // configure email 088 params.set("from", from); 089 params.set("to", to); 090 params.set("subject", title); 091 params.set("message", body); 092 String[] str = { "file:content" }; 093 params.set("files", new StringList(str)); 094 // TODO: see SendMail test case where we can directly pass a blob 095 096 // do send mail 097 log.debug("Automation run " + PROPERTY_ACLAUDIT_SENDMAIL_CHAIN + " for " + to); 098 automation.run(ctx, chain); 099 log.debug("Automation done " + PROPERTY_ACLAUDIT_SENDMAIL_CHAIN + " for " + to); 100 } catch (OperationException e) { 101 throw new NuxeoException(e); 102 } 103 } 104 105 protected OperationParameters findParameters(OperationChain chain, String id) { 106 List<OperationParameters> params = chain.getOperations(); 107 for (OperationParameters p : params) 108 if (p.id().equals(id)) 109 return p; 110 return null; 111 } 112 113 protected DocumentModel createDocument(CoreSession session, Blob blob, String title, String filename) 114 { 115 DocumentModel document = session.createDocumentModel("File"); 116 document.setPropertyValue("file:content", (Serializable) blob); 117 document.setPropertyValue("file:filename", filename); 118 document.setPropertyValue("dublincore:title", title); 119 return document; 120 } 121 122 protected void logMailerConfiguration() { 123 Mailer m = SendMail.COMPOSER.getMailer(); 124 log.info("mail.smtp.auth:" + m.getConfiguration().get("mail.smtp.auth")); 125 log.info("mail.smtp.starttls.enable:" + m.getConfiguration().get("mail.smtp.starttls.enable")); 126 log.info("mail.smtp.host:" + m.getConfiguration().get("mail.smtp.host")); 127 log.info("mail.smtp.user:" + m.getConfiguration().get("mail.smtp.user")); 128 log.info("mail.smtp.password:" + m.getConfiguration().get("mail.smtp.password")); 129 } 130}