/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.engine.impl.pvm; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.activiti.engine.delegate.ExecutionListener; import org.activiti.engine.impl.pvm.delegate.ActivityBehavior; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.impl.pvm.process.ProcessDefinitionImpl; import org.activiti.engine.impl.pvm.process.ProcessElementImpl; import org.activiti.engine.impl.pvm.process.ScopeImpl; import org.activiti.engine.impl.pvm.process.TransitionImpl; /** * @author Tom Baeyens */ @SuppressWarnings("deprecation") public class ProcessDefinitionBuilder { protected ProcessDefinitionImpl processDefinition; protected Stack<ScopeImpl> scopeStack = new Stack<ScopeImpl>(); protected ProcessElementImpl processElement = processDefinition; protected TransitionImpl transition; protected List<Object[]> unresolvedTransitions = new ArrayList<Object[]>(); public ProcessDefinitionBuilder() { this(null); } public ProcessDefinitionBuilder(String processDefinitionId) { processDefinition = new ProcessDefinitionImpl(processDefinitionId); scopeStack.push(processDefinition); } public ProcessDefinitionBuilder createActivity(String id) { ActivityImpl activity = scopeStack.peek().createActivity(id); scopeStack.push(activity); processElement = activity; transition = null; return this; } public ProcessDefinitionBuilder endActivity() { scopeStack.pop(); processElement = scopeStack.peek(); transition = null; return this; } public ProcessDefinitionBuilder initial() { processDefinition.setInitial(getActivity()); return this; } public ProcessDefinitionBuilder startTransition(String destinationActivityId) { return startTransition(destinationActivityId, null); } public ProcessDefinitionBuilder startTransition(String destinationActivityId, String transitionId) { if (destinationActivityId==null) { throw new PvmException("destinationActivityId is null"); } ActivityImpl activity = getActivity(); transition = activity.createOutgoingTransition(transitionId); unresolvedTransitions.add(new Object[]{transition, destinationActivityId}); processElement = transition; return this; } public ProcessDefinitionBuilder endTransition() { processElement = scopeStack.peek(); transition = null; return this; } public ProcessDefinitionBuilder transition(String destinationActivityId) { return transition(destinationActivityId, null); } public ProcessDefinitionBuilder transition(String destinationActivityId, String transitionId) { startTransition(destinationActivityId, transitionId); endTransition(); return this; } public ProcessDefinitionBuilder behavior(ActivityBehavior activityBehaviour) { getActivity().setActivityBehavior(activityBehaviour); return this; } public ProcessDefinitionBuilder property(String name, Object value) { processElement.setProperty(name, value); return this; } public PvmProcessDefinition buildProcessDefinition() { for (Object[] unresolvedTransition: unresolvedTransitions) { TransitionImpl transition = (TransitionImpl) unresolvedTransition[0]; String destinationActivityName = (String) unresolvedTransition[1]; ActivityImpl destination = processDefinition.findActivity(destinationActivityName); if (destination == null) { throw new RuntimeException("destination '"+destinationActivityName+"' not found. (referenced from transition in '"+transition.getSource().getId()+"')"); } transition.setDestination(destination); } return processDefinition; } protected ActivityImpl getActivity() { return (ActivityImpl) scopeStack.peek(); } public ProcessDefinitionBuilder scope() { getActivity().setScope(true); return this; } public ProcessDefinitionBuilder executionListener(ExecutionListener executionListener) { if (transition!=null) { transition.addExecutionListener(executionListener); } else { throw new PvmException("not in a transition scope"); } return this; } public ProcessDefinitionBuilder executionListener(String eventName, ExecutionListener executionListener) { if (transition==null) { scopeStack.peek().addExecutionListener(eventName, executionListener); } else { throw new PvmException("not in an activity- or process definition scope. (but in a transition scope)"); } return this; } }