package org.activiti.workflow.simple.util;
import java.util.ArrayList;
import java.util.List;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.Activity;
import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.Signal;
import org.activiti.bpmn.model.SignalEventDefinition;
import org.activiti.bpmn.model.ThrowEvent;
import org.activiti.workflow.simple.converter.ConversionConstants;
import org.activiti.workflow.simple.converter.WorkflowDefinitionConversion;
public class BpmnModelUtil {
private static final String SIGNAL_PREFIX = "signal_";
private static final String SIGNAL_THROWEVENT_PREFIX = "signal_throw_";
private static final String SIGNAL_BOUNDARY_EVENT = "signal_boundary_";
public static List<FlowElement> findSucessorFlowElementsFor(
Process process, FlowElement sourceFlowElement) {
List<FlowElement> successors = new ArrayList<FlowElement>();
for (SequenceFlow sequenceFlow : process.findFlowElementsOfType(SequenceFlow.class)) {
if (sequenceFlow.getSourceRef().equals(sourceFlowElement.getId())) {
successors.add(process.getFlowElement(sequenceFlow.getTargetRef()));
}
}
return successors;
}
public static SequenceFlow createSequenceFlow(WorkflowDefinitionConversion conversion, FlowNode source, FlowNode target) {
return createSequenceFlow(conversion, source, target,(ActivitiListener[]) null);
}
public static SequenceFlow createSequenceFlow(WorkflowDefinitionConversion conversion, FlowNode source,
FlowNode target, ActivitiListener... executionListeners) {
SequenceFlow sequenceFlow = new SequenceFlow();
sequenceFlow.setId(conversion.getUniqueNumberedId(ConversionConstants.DEFAULT_SEQUENCEFLOW_PREFIX));
sequenceFlow.setSourceRef(source.getId());
sequenceFlow.setTargetRef(target.getId());
if (executionListeners != null && executionListeners.length > 0) {
List<ActivitiListener> listeners = new ArrayList<ActivitiListener>();
for (ActivitiListener listener : executionListeners) {
listeners.add(listener);
}
sequenceFlow.setExecutionListeners(listeners);
}
return sequenceFlow;
}
public static Signal createSignal(WorkflowDefinitionConversion conversion, String signalName, boolean processInstanceScope) {
Signal approvalFinishedSignal = new Signal();
approvalFinishedSignal.setId(conversion.getUniqueNumberedId(SIGNAL_PREFIX));
approvalFinishedSignal.setName(signalName);
if (processInstanceScope) {
approvalFinishedSignal.setScope("processInstance");
}
return approvalFinishedSignal;
}
public static ThrowEvent createSignalThrowEvent(
WorkflowDefinitionConversion conversion,
Signal approvalFinishedSignal) {
SignalEventDefinition signalEventDefinition = new SignalEventDefinition();
signalEventDefinition.setSignalRef(approvalFinishedSignal.getId());
List<EventDefinition> signalEventDefinitions = new ArrayList<EventDefinition>();
signalEventDefinitions.add(signalEventDefinition);
ThrowEvent signalThrowEvent = new ThrowEvent();
signalThrowEvent.setId(conversion.getUniqueNumberedId(SIGNAL_THROWEVENT_PREFIX));
signalThrowEvent.setEventDefinitions(signalEventDefinitions);
return signalThrowEvent;
}
public static BoundaryEvent createSignalBoundaryEvent(
WorkflowDefinitionConversion conversion, Signal signal,
Activity activity, boolean cancelActivity) {
BoundaryEvent signalBoundaryEvent = new BoundaryEvent();
signalBoundaryEvent.setId(conversion.getUniqueNumberedId(SIGNAL_BOUNDARY_EVENT));
signalBoundaryEvent.setCancelActivity(cancelActivity);
signalBoundaryEvent.setAttachedToRef(activity);
SignalEventDefinition boundarySignalEventDefinition = new SignalEventDefinition();
boundarySignalEventDefinition.setSignalRef(signal.getId());
signalBoundaryEvent.addEventDefinition(boundarySignalEventDefinition);
return signalBoundaryEvent;
}
}