package com.mossle.bpm.listener; import java.util.List; import javax.annotation.Resource; import com.mossle.bpm.persistence.domain.BpmConfListener; import com.mossle.bpm.persistence.manager.BpmConfListenerManager; import org.activiti.engine.delegate.event.ActivitiActivityEvent; import org.activiti.engine.delegate.event.ActivitiEvent; import org.activiti.engine.delegate.event.ActivitiEventListener; import org.activiti.engine.impl.context.Context; import org.activiti.engine.impl.el.ExpressionManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FunctionEventListener implements ActivitiEventListener { private static Logger logger = LoggerFactory .getLogger(FunctionEventListener.class); private BpmConfListenerManager bpmConfListenerManager; @Override public void onEvent(ActivitiEvent event) { switch (event.getType()) { case ACTIVITY_STARTED: this.onActivityStart((ActivitiActivityEvent) event); break; case ACTIVITY_COMPLETED: this.onActivityEnd((ActivitiActivityEvent) event); break; default: logger.debug("Event received: {}", event.getType()); } } public void onActivityStart(ActivitiActivityEvent event) { logger.debug("activity start {}", event); this.invokeExpression(event.getProcessDefinitionId(), event.getActivityId(), 0); } public void onActivityEnd(ActivitiActivityEvent event) { logger.debug("activity end {}", event); this.invokeExpression(event.getProcessDefinitionId(), event.getActivityId(), 1); } public void invokeExpression(String processDefinitionId, String activityId, int type) { String hql = "from BpmConfListener where bpmConfNode.bpmConfBase.processDefinitionId=? and bpmConfNode.code=? and type=?"; List<BpmConfListener> bpmConfListeners = bpmConfListenerManager.find( hql, processDefinitionId, activityId, type); for (BpmConfListener bpmConfListener : bpmConfListeners) { String expressionText = bpmConfListener.getValue(); try { ExpressionManager expressionManager = Context .getProcessEngineConfiguration().getExpressionManager(); Object result = expressionManager.createExpression( expressionText).getValue( Context.getExecutionContext().getExecution()); logger.info("result : {}", result); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } } } @Override public boolean isFailOnException() { return false; } @Resource public void setBpmConfListenerManager( BpmConfListenerManager bpmConfListenerManager) { this.bpmConfListenerManager = bpmConfListenerManager; } }