package net.conselldemallorca.helium.jbpm3.spring; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.graph.node.DecisionHandler; import org.jbpm.taskmgmt.def.AssignmentHandler; import org.jbpm.taskmgmt.exe.Assignable; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Allows to use Spring-managed beans with injected dependencies within a jBPM process. * In the jBPM configuration, you just need to specify the name of the bean as declared in the application context: * * <action class="be.jorambarrez.jbpm3_spring_integration.SpringDelegation" config-type="bean"> * <beanName>mySpringBean</beanName> * </action> * * @author Joram Barrez */ @SuppressWarnings("serial") public class SpringDelegation implements ApplicationContextAware, DecisionHandler, ActionHandler, AssignmentHandler { /** The name of the bean as declared in the Spring config. */ private String beanName; /** The injected application context, statically kept such that new instances easily can access it. */ private static ApplicationContext APPLICATION_CTX; /** Local cache of the delegated bean */ private Object bean; /** Delegation method for a DecisionHandler */ public String decide(ExecutionContext executionContext) throws Exception { DecisionHandler dh = getBean(); return dh.decide(executionContext); } /** Delegation for an ActionHandler */ public void execute(ExecutionContext executionContext) throws Exception { ActionHandler ah = getBean(); ah.execute(executionContext); } /** Delegation for an AssignmentHandler */ public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception { AssignmentHandler ah = getBean(); ah.assign(assignable, executionContext); } /* GETTERS and SETTERS */ @SuppressWarnings("unchecked") private <T> T getBean() { if (bean == null) { bean = (T) APPLICATION_CTX.getBean(beanName); } return (T) bean; } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringDelegation.APPLICATION_CTX = applicationContext; } public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; } }