[seam-issues] [JBoss JIRA] (JBSEAM-3285) Seam Email session integration into jBPM

Mason Harding (JIRA) jira-events at lists.jboss.org
Mon Dec 3 12:17:21 EST 2012


    [ https://issues.jboss.org/browse/JBSEAM-3285?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12738979#comment-12738979 ] 

Mason Harding commented on JBSEAM-3285:
---------------------------------------

I just wanted to thank you for this code, and say that it works perfectly on Seam 2.2.1.
                
> Seam Email session integration into jBPM
> ----------------------------------------
>
>                 Key: JBSEAM-3285
>                 URL: https://issues.jboss.org/browse/JBSEAM-3285
>             Project: Seam 2
>          Issue Type: Feature Request
>          Components: BPM
>    Affects Versions: 2.0.2.GA
>         Environment: N/A
>            Reporter: Boretti Mathieu
>              Labels: EMAIL, JBPM
>
> The goal is to use the MailSession from seam (provided by DataSource or not), when using jBPM task-node. 
> The idea is to provide a class that extend org.jbpm.mail.Mail and use the MailSession from Seam, instance of the MailSession from jBPM.
> It is then possible to reference this class in the jbpm config file (<string name='jbpm.mail.class.name' value='XXXX' />
> I wrote a small "example class", by copy-paste from jBPM (see below):
> This implementation use the jBPM variable config jbpm.mail.ignoreError to throw, or not, an error in case of error in sending of email.
> The MailSession is retrieved with 
> org.jboss.seam.mail.MailSession.instance();
> package org.domain.HardWareStore.actions;
> import java.io.Serializable;
> import java.util.ArrayList;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.Date;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
> import java.util.Properties;
> import java.util.StringTokenizer;
> import javax.mail.Message;
> import javax.mail.Session;
> import javax.mail.Transport;
> import javax.mail.internet.InternetAddress;
> import javax.mail.internet.MimeMessage;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.jboss.seam.contexts.Context;
> import org.jboss.seam.contexts.Lifecycle;
> import org.jboss.seam.mail.MailSession;
> import org.jbpm.JbpmConfiguration;
> import org.jbpm.JbpmException;
> import org.jbpm.graph.exe.ExecutionContext;
> import org.jbpm.jpdl.el.ELException;
> import org.jbpm.jpdl.el.VariableResolver;
> import org.jbpm.jpdl.el.impl.JbpmExpressionEvaluator;
> import org.jbpm.mail.AddressResolver;
> import org.jbpm.mail.Mail;
> import org.jbpm.util.XmlUtil;
> public class MailHandler extends Mail {
> 	private static final long serialVersionUID = 1L;
> 	String template = null;
> 	String actors = null;
> 	String to = null;
> 	String bcc = null;
> 	String bccActors = null;
> 	String subject = null;
> 	String text = null;
> 	ExecutionContext executionContext = null;
> 	public MailHandler() {
> 	}
> 	public MailHandler(String template, String actors, String to,
> 			String subject, String text) {
> 		this.template = template;
> 		this.actors = actors;
> 		this.to = to;
> 		this.subject = subject;
> 		this.text = text;
> 	}
> 	public MailHandler(String template, String actors, String to,
> 			String bccActors, String bcc, String subject, String text) {
> 		this.template = template;
> 		this.actors = actors;
> 		this.to = to;
> 		this.bccActors = bccActors;
> 		this.bcc = bcc;
> 		this.subject = subject;
> 		this.text = text;
> 	}
> 	public void execute(ExecutionContext executionContext) {
> 		this.executionContext = executionContext;
> 		send();
> 	}
> 	public List getRecipients() {
> 		List recipients = new ArrayList();
> 		if (actors != null) {
> 			String evaluatedActors = evaluate(actors);
> 			List tokenizedActors = tokenize(evaluatedActors);
> 			if (tokenizedActors != null) {
> 				recipients.addAll(resolveAddresses(tokenizedActors));
> 			}
> 		}
> 		if (to != null) {
> 			String resolvedTo = evaluate(to);
> 			recipients.addAll(tokenize(resolvedTo));
> 		}
> 		return recipients;
> 	}
> 	public List getBccRecipients() {
> 		List recipients = new ArrayList();
> 		if (bccActors != null) {
> 			String evaluatedActors = evaluate(bccActors);
> 			List tokenizedActors = tokenize(evaluatedActors);
> 			if (tokenizedActors != null) {
> 				recipients.addAll(resolveAddresses(tokenizedActors));
> 			}
> 		}
> 		if (bcc != null) {
> 			String resolvedTo = evaluate(to);
> 			recipients.addAll(tokenize(resolvedTo));
> 		}
> 		if (JbpmConfiguration.Configs.hasObject("jbpm.mail.bcc.address")) {
> 			recipients.addAll(tokenize(JbpmConfiguration.Configs
> 					.getString("jbpm.mail.bcc.address")));
> 		}
> 		return recipients;
> 	}
> 	public String getSubject() {
> 		if (subject == null)
> 			return null;
> 		return evaluate(subject);
> 	}
> 	public String getText() {
> 		if (text == null)
> 			return null;
> 		return evaluate(text);
> 	}
> 	public String getFromAddress() {
> 		if (JbpmConfiguration.Configs.hasObject("jbpm.mail.from.address")) {
> 			return JbpmConfiguration.Configs
> 					.getString("jbpm.mail.from.address");
> 		}
> 		return "jbpm at noreply";
> 	}
> 	public void send() {
> 		if (template != null) {
> 			Properties properties = getMailTemplateProperties(template);
> 			if (actors == null) {
> 				actors = properties.getProperty("actors");
> 			}
> 			if (to == null) {
> 				to = properties.getProperty("to");
> 			}
> 			if (subject == null) {
> 				subject = properties.getProperty("subject");
> 			}
> 			if (text == null) {
> 				text = properties.getProperty("text");
> 			}
> 			if (bcc == null) {
> 				bcc = properties.getProperty("bcc");
> 			}
> 			if (bccActors == null) {
> 				bccActors = properties.getProperty("bccActors");
> 			}
> 		}
> 		send(getFromAddress(), getRecipients(), getBccRecipients(),
> 				getSubject(), getText());
> 	}
> 	public static void send(String fromAddress, List recipients,
> 			String subject, String text) {
> 		send(fromAddress, recipients, null, subject, text);
> 	}
> 	public static void send(String fromAddress, List recipients,
> 			List bccRecipients, String subject, String text) {
> 		if ((recipients == null) || (recipients.isEmpty())) {
> 			log.info("skipping mail because there are no recipients");
> 			return;
> 		}
> 		log.info("sending email to '" + recipients + "' about '" + subject
> 				+ "'");
> 		log.info("BeginCall");
> 		Context context = Lifecycle.beginMethod();
> 		try {
> 			log.info("GetSession");
> 			Session session = MailSession.instance();
> 			log.info("Create msg for "+session);
> 			MimeMessage message = new MimeMessage(session);
> 			if (fromAddress != null) {
> 				message.setFrom(new InternetAddress(fromAddress));
> 			}
> 			Iterator iter = recipients.iterator();
> 			while (iter.hasNext()) {
> 				InternetAddress recipient = new InternetAddress((String) iter
> 						.next());
> 				message.addRecipient(Message.RecipientType.TO, recipient);
> 			}
> 			if (bccRecipients != null) {
> 				iter = bccRecipients.iterator();
> 				while (iter.hasNext()) {
> 					InternetAddress recipient = new InternetAddress(
> 							(String) iter.next());
> 					message.addRecipient(Message.RecipientType.BCC, recipient);
> 				}
> 			}
> 			if (subject != null) {
> 				message.setSubject(subject);
> 			}
> 			if (text != null) {
> 				message.setText(text);
> 			}
> 			message.setSentDate(new Date());
> 			Transport.send(message);
> 		} catch (Exception e) {
> 			log.error("couldn't send email",e);
> 			boolean ignore=false;
> 			if (JbpmConfiguration.Configs.hasObject("jbpm.mail.ignoreError")) {
> 				ignore=JbpmConfiguration.Configs.getBoolean("jbpm.mail.ignoreError");
> 			}
> 			if (!ignore) throw new JbpmException("couldn't send email", e);
> 		} finally {
> 			Lifecycle.endMethod(context);
> 		}
> 	}
> 	protected List tokenize(String text) {
> 		if (text == null) {
> 			return null;
> 		}
> 		List list = new ArrayList();
> 		StringTokenizer tokenizer = new StringTokenizer(text, ";:");
> 		while (tokenizer.hasMoreTokens()) {
> 			list.add(tokenizer.nextToken());
> 		}
> 		return list;
> 	}
> 	protected Collection resolveAddresses(List actorIds) {
> 		List emailAddresses = new ArrayList();
> 		Iterator iter = actorIds.iterator();
> 		while (iter.hasNext()) {
> 			String actorId = (String) iter.next();
> 			AddressResolver addressResolver = (AddressResolver) JbpmConfiguration.Configs
> 					.getObject("jbpm.mail.address.resolver");
> 			Object resolvedAddresses = addressResolver.resolveAddress(actorId);
> 			if (resolvedAddresses != null) {
> 				if (resolvedAddresses instanceof String) {
> 					emailAddresses.add((String) resolvedAddresses);
> 				} else if (resolvedAddresses instanceof Collection) {
> 					emailAddresses.addAll((Collection) resolvedAddresses);
> 				} else if (resolvedAddresses instanceof String[]) {
> 					emailAddresses.addAll(Arrays
> 							.asList((String[]) resolvedAddresses));
> 				} else {
> 					throw new JbpmException(
> 							"Address resolver '"
> 									+ addressResolver
> 									+ "' returned '"
> 									+ resolvedAddresses.getClass().getName()
> 									+ "' instead of a String, Collection or String-array: "
> 									+ resolvedAddresses);
> 				}
> 			}
> 		}
> 		return emailAddresses;
> 	}
> 	static Map templates = null;
> 	static Map templateVariables = null;
> 	synchronized Properties getMailTemplateProperties(String templateName) {
> 		if (templates == null) {
> 			templates = new HashMap();
> 			String mailTemplatesResource = JbpmConfiguration.Configs
> 					.getString("resource.mail.templates");
> 			org.w3c.dom.Element mailTemplatesElement = XmlUtil
> 					.parseXmlResource(mailTemplatesResource)
> 					.getDocumentElement();
> 			List mailTemplateElements = XmlUtil.elements(mailTemplatesElement,
> 					"mail-template");
> 			Iterator iter = mailTemplateElements.iterator();
> 			while (iter.hasNext()) {
> 				org.w3c.dom.Element mailTemplateElement = (org.w3c.dom.Element) iter
> 						.next();
> 				Properties templateProperties = new Properties();
> 				addTemplateProperty(mailTemplateElement, "actors",
> 						templateProperties);
> 				addTemplateProperty(mailTemplateElement, "to",
> 						templateProperties);
> 				addTemplateProperty(mailTemplateElement, "subject",
> 						templateProperties);
> 				addTemplateProperty(mailTemplateElement, "text",
> 						templateProperties);
> 				addTemplateProperty(mailTemplateElement, "bcc",
> 						templateProperties);
> 				addTemplateProperty(mailTemplateElement, "bccActors",
> 						templateProperties);
> 				templates.put(mailTemplateElement.getAttribute("name"),
> 						templateProperties);
> 			}
> 			templateVariables = new HashMap();
> 			List variableElements = XmlUtil.elements(mailTemplatesElement,
> 					"variable");
> 			iter = variableElements.iterator();
> 			while (iter.hasNext()) {
> 				org.w3c.dom.Element variableElement = (org.w3c.dom.Element) iter
> 						.next();
> 				templateVariables.put(variableElement.getAttribute("name"),
> 						variableElement.getAttribute("value"));
> 			}
> 		}
> 		return (Properties) templates.get(templateName);
> 	}
> 	void addTemplateProperty(org.w3c.dom.Element mailTemplateElement,
> 			String property, Properties templateProperties) {
> 		org.w3c.dom.Element element = XmlUtil.element(mailTemplateElement,
> 				property);
> 		if (element != null) {
> 			templateProperties.put(property, XmlUtil.getContentText(element));
> 		}
> 	}
> 	String evaluate(String expression) {
> 		if (expression == null) {
> 			return null;
> 		}
> 		VariableResolver variableResolver = JbpmExpressionEvaluator
> 				.getUsedVariableResolver();
> 		if (variableResolver != null) {
> 			variableResolver = new MailVariableResolver(templateVariables,
> 					variableResolver);
> 		}
> 		return (String) JbpmExpressionEvaluator.evaluate(expression,
> 				executionContext, variableResolver, null);
> 	}
> 	class MailVariableResolver implements VariableResolver, Serializable {
> 		private static final long serialVersionUID = 1L;
> 		Map templateVariables = null;
> 		VariableResolver variableResolver = null;
> 		public MailVariableResolver(Map templateVariables,
> 				VariableResolver variableResolver) {
> 			this.templateVariables = templateVariables;
> 			this.variableResolver = variableResolver;
> 		}
> 		public Object resolveVariable(String pName) throws ELException {
> 			if ((templateVariables != null)
> 					&& (templateVariables.containsKey(pName))) {
> 				return templateVariables.get(pName);
> 			}
> 			return variableResolver.resolveVariable(pName);
> 		}
> 	}
> 	private static Log log = LogFactory.getLog(Mail.class);
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the seam-issues mailing list