package com.mossle.bpm.listener;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.parse.BpmnParseHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProxyUserTaskBpmnParseHandler implements BpmnParseHandler {
private static Logger logger = LoggerFactory
.getLogger(ProxyUserTaskBpmnParseHandler.class);
private String taskListenerId;
private boolean useDefaultUserTaskParser;
public void parse(BpmnParse bpmnParse, BaseElement baseElement) {
if (!(baseElement instanceof UserTask)) {
return;
}
if (useDefaultUserTaskParser) {
new UserTaskParseHandler().parse(bpmnParse, baseElement);
}
UserTask userTask = (UserTask) baseElement;
logger.debug("bpmnParse : {}, userTask : {}", bpmnParse, userTask);
TaskDefinition taskDefinition = (TaskDefinition) bpmnParse
.getCurrentActivity().getProperty(
UserTaskParseHandler.PROPERTY_TASK_DEFINITION);
this.configEvent(taskDefinition, bpmnParse,
TaskListener.EVENTNAME_CREATE);
this.configEvent(taskDefinition, bpmnParse,
TaskListener.EVENTNAME_ASSIGNMENT);
this.configEvent(taskDefinition, bpmnParse,
TaskListener.EVENTNAME_COMPLETE);
this.configEvent(taskDefinition, bpmnParse,
TaskListener.EVENTNAME_DELETE);
}
public void configEvent(TaskDefinition taskDefinition, BpmnParse bpmnParse,
String eventName) {
ActivitiListener activitiListener = new ActivitiListener();
activitiListener.setEvent(eventName);
activitiListener
.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
activitiListener.setImplementation("#{" + taskListenerId + "}");
taskDefinition
.addTaskListener(eventName, bpmnParse.getListenerFactory()
.createDelegateExpressionTaskListener(activitiListener));
}
public Collection<Class<? extends BaseElement>> getHandledTypes() {
List types = Collections.singletonList(UserTask.class);
return types;
}
public void setTaskListenerId(String taskListenerId) {
this.taskListenerId = taskListenerId;
}
public void setUseDefaultUserTaskParser(boolean useDefaultUserTaskParser) {
this.useDefaultUserTaskParser = useDefaultUserTaskParser;
}
}