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.routemanager;
17  
18  import java.util.List;
19  
20  import org.kuali.rice.kew.api.action.ActionType;
21  import org.kuali.rice.kew.framework.postprocessor.ActionTakenEvent;
22  import org.kuali.rice.kew.framework.postprocessor.AfterProcessEvent;
23  import org.kuali.rice.kew.framework.postprocessor.BeforeProcessEvent;
24  import org.kuali.rice.kew.framework.postprocessor.DeleteEvent;
25  import org.kuali.rice.kew.framework.postprocessor.DocumentLockingEvent;
26  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteLevelChange;
27  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
28  import org.kuali.rice.kew.framework.postprocessor.PostProcessor;
29  import org.kuali.rice.kew.framework.postprocessor.ProcessDocReport;
30  import org.kuali.rice.kew.api.KewApiConstants;
31  
32  
33  public class ExceptionRoutingTestPostProcessor implements PostProcessor {
34  	
35  	public static boolean THROW_ROUTE_STATUS_CHANGE_EXCEPTION;
36  	public static boolean THROW_ROUTE_STATUS_LEVEL_EXCEPTION;
37  	public static boolean THROW_ROUTE_DELETE_ROUTE_HEADER_EXCEPTION;
38      public static boolean THROW_DO_ACTION_TAKEN_EXCEPTION;
39      public static boolean THROW_BEFORE_PROCESS_EXCEPTION;
40      public static boolean THROW_AFTER_PROCESS_EXCEPTION;
41      public static boolean THROW_DOCUMENT_LOCKING_EXCEPTION;
42  	public static boolean TRANSITIONED_OUT_OF_EXCEPTION_ROUTING = false;
43  	public static boolean BLOW_UP_ON_TRANSITION_INTO_EXCEPTION = false;
44  	
45  	public ProcessDocReport doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) throws Exception {
46  	        // defend against re-entrancy by only throwing the route status change exception if the status change we are undergoing is not a transition into exception state!
47  	        // if we don't do this, this postprocessor will blow up when it is subsequently notified about the transition into exception state that it previously caused
48  	        // which will result in the document never actually transitioning into exception state
49  	        boolean transitioningIntoException = !KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getOldRouteStatus()) &&
50                                                        KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getNewRouteStatus());
51  		if (THROW_ROUTE_STATUS_CHANGE_EXCEPTION && !transitioningIntoException) {
52  			throw new RuntimeException("I am the doRouteStatusChange exploder");
53  		}
54  		if (BLOW_UP_ON_TRANSITION_INTO_EXCEPTION && transitioningIntoException) {
55  			throw new RuntimeException("Throwing an exception when transitioning into exception status.");
56  		}
57  		if (KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getOldRouteStatus())) {
58  			TRANSITIONED_OUT_OF_EXCEPTION_ROUTING = true;
59  		}
60  		return new ProcessDocReport(true, "");
61  	}
62  
63  	public ProcessDocReport doRouteLevelChange(DocumentRouteLevelChange levelChangeEvent) throws Exception {
64  		if (THROW_ROUTE_STATUS_LEVEL_EXCEPTION) {
65  			throw new RuntimeException("I am the doRouteLevelChange exploder");
66  		}
67  		return new ProcessDocReport(true, "");
68  	}
69  
70  	public ProcessDocReport doDeleteRouteHeader(DeleteEvent event) throws Exception {
71  		if (THROW_ROUTE_DELETE_ROUTE_HEADER_EXCEPTION) {
72  			throw new RuntimeException("I am the doDeleteRouteHeader exploder");
73  		}
74  		return new ProcessDocReport(true, "");
75  	}
76  
77  	public ProcessDocReport doActionTaken(ActionTakenEvent event) throws Exception {
78  		if (THROW_DO_ACTION_TAKEN_EXCEPTION) {
79  			throw new RuntimeException("I am the doActionTaken exploder");
80  		}
81  		return new ProcessDocReport(true, "");
82  	}
83  
84      public ProcessDocReport afterActionTaken(ActionType performed, ActionTakenEvent event) throws Exception {
85          if (THROW_DO_ACTION_TAKEN_EXCEPTION) {
86              throw new RuntimeException("I am the afterActionTaken exploder");
87          }
88          return new ProcessDocReport(true, "");
89      }
90  
91      public ProcessDocReport beforeProcess(BeforeProcessEvent event) throws Exception {
92          if (THROW_BEFORE_PROCESS_EXCEPTION) {
93              throw new RuntimeException("I am the beforeProcess exploder");
94          }
95          return new ProcessDocReport(true, "");
96      }
97  
98      public ProcessDocReport afterProcess(AfterProcessEvent event) throws Exception {
99          if (THROW_AFTER_PROCESS_EXCEPTION) {
100             throw new RuntimeException("I am the afterProcess exploder");
101         }
102         return new ProcessDocReport(true, "");
103     }
104 
105 	public List<String> getDocumentIdsToLock(DocumentLockingEvent lockingEvent)
106 			throws Exception {
107 		if (THROW_DOCUMENT_LOCKING_EXCEPTION) {
108 			throw new RuntimeException("I am the getDocumentIdsToLock exploder");
109 		}
110 		return null;
111 	}
112     
113     
114 
115 }