View Javadoc
1   /**
2    * Copyright 2005-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.engine.transition;
17  
18  import org.kuali.rice.kew.engine.RouteContext;
19  import org.kuali.rice.kew.engine.node.ProcessDefinitionBo;
20  import org.kuali.rice.kew.engine.node.ProcessResult;
21  import org.kuali.rice.kew.engine.node.RouteNode;
22  import org.kuali.rice.kew.engine.node.RouteNodeInstance;
23  import org.kuali.rice.kew.engine.node.SubProcessNode;
24  import org.kuali.rice.kew.engine.node.SubProcessResult;
25  import org.kuali.rice.kew.api.exception.WorkflowException;
26  
27  import java.util.ArrayList;
28  import java.util.List;
29  
30  
31  /**
32   * Handles transitions into and out of {@link SubProcessNode} nodes.
33   * 
34   * @see SubProcessNode
35   *
36   * @author Kuali Rice Team (rice.collab@kuali.org)
37   */
38  public class SubProcessTransitionEngine extends TransitionEngine {
39      
40      public RouteNodeInstance transitionTo(RouteNodeInstance nextNodeInstance, RouteContext context) throws Exception {
41          String processName = nextNodeInstance.getRouteNode().getRouteNodeName();
42          ProcessDefinitionBo process = context.getDocument().getDocumentType().getNamedProcess(processName);
43          if (process == null) {
44              throw new WorkflowException("Could not locate named sub process: " + processName);
45          }
46          RouteNodeInstance subProcessNodeInstance = nextNodeInstance;
47          subProcessNodeInstance.setInitial(false);
48          subProcessNodeInstance.setActive(false);
49          nextNodeInstance = getRouteHelper().getNodeFactory().createRouteNodeInstance(subProcessNodeInstance.getDocumentId(), process.getInitialRouteNode());
50          nextNodeInstance.setBranch(subProcessNodeInstance.getBranch());
51          nextNodeInstance.setProcess(subProcessNodeInstance);
52  	    return nextNodeInstance;
53  	}
54  
55  	public ProcessResult isComplete(RouteContext context) throws Exception {
56          throw new UnsupportedOperationException("isComplete() should not be invoked on a SubProcess!");
57      }
58  
59      public Transition transitionFrom(RouteContext context, ProcessResult processResult) throws Exception {
60  		RouteNodeInstance processInstance = context.getNodeInstance().getProcess();
61          processInstance.setComplete(true);
62  		SubProcessNode node = (SubProcessNode)getNode(processInstance.getRouteNode(), SubProcessNode.class);
63  		SubProcessResult result = node.process(context);
64  		List<RouteNodeInstance> nextNodeInstances = new ArrayList<RouteNodeInstance>();
65  		if (result.isComplete()) {
66  			List<RouteNode> nextNodes = processInstance.getRouteNode().getNextNodes();
67              for (RouteNode nextNode : nextNodes)
68              {
69                  RouteNodeInstance nextNodeInstance = getRouteHelper().getNodeFactory().createRouteNodeInstance(processInstance.getDocumentId(), nextNode);
70                  nextNodeInstance.setBranch(processInstance.getBranch());
71                  nextNodeInstance.setProcess(processInstance.getProcess());
72                  nextNodeInstances.add(nextNodeInstance);
73              }
74  		}
75  		return new Transition(nextNodeInstances);
76  	}
77  
78  }