001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kew.routemanager;
017
018 import java.util.List;
019
020 import org.kuali.rice.kew.api.action.ActionType;
021 import org.kuali.rice.kew.framework.postprocessor.ActionTakenEvent;
022 import org.kuali.rice.kew.framework.postprocessor.AfterProcessEvent;
023 import org.kuali.rice.kew.framework.postprocessor.BeforeProcessEvent;
024 import org.kuali.rice.kew.framework.postprocessor.DeleteEvent;
025 import org.kuali.rice.kew.framework.postprocessor.DocumentLockingEvent;
026 import org.kuali.rice.kew.framework.postprocessor.DocumentRouteLevelChange;
027 import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
028 import org.kuali.rice.kew.framework.postprocessor.PostProcessor;
029 import org.kuali.rice.kew.framework.postprocessor.ProcessDocReport;
030 import org.kuali.rice.kew.api.KewApiConstants;
031
032
033 public class ExceptionRoutingTestPostProcessor implements PostProcessor {
034
035 public static boolean THROW_ROUTE_STATUS_CHANGE_EXCEPTION;
036 public static boolean THROW_ROUTE_STATUS_LEVEL_EXCEPTION;
037 public static boolean THROW_ROUTE_DELETE_ROUTE_HEADER_EXCEPTION;
038 public static boolean THROW_DO_ACTION_TAKEN_EXCEPTION;
039 public static boolean THROW_BEFORE_PROCESS_EXCEPTION;
040 public static boolean THROW_AFTER_PROCESS_EXCEPTION;
041 public static boolean THROW_DOCUMENT_LOCKING_EXCEPTION;
042 public static boolean TRANSITIONED_OUT_OF_EXCEPTION_ROUTING = false;
043 public static boolean BLOW_UP_ON_TRANSITION_INTO_EXCEPTION = false;
044
045 public ProcessDocReport doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) throws Exception {
046 // 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!
047 // 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
048 // which will result in the document never actually transitioning into exception state
049 boolean transitioningIntoException = !KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getOldRouteStatus()) &&
050 KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getNewRouteStatus());
051 if (THROW_ROUTE_STATUS_CHANGE_EXCEPTION && !transitioningIntoException) {
052 throw new RuntimeException("I am the doRouteStatusChange exploder");
053 }
054 if (BLOW_UP_ON_TRANSITION_INTO_EXCEPTION && transitioningIntoException) {
055 throw new RuntimeException("Throwing an exception when transitioning into exception status.");
056 }
057 if (KewApiConstants.ROUTE_HEADER_EXCEPTION_CD.equals(statusChangeEvent.getOldRouteStatus())) {
058 TRANSITIONED_OUT_OF_EXCEPTION_ROUTING = true;
059 }
060 return new ProcessDocReport(true, "");
061 }
062
063 public ProcessDocReport doRouteLevelChange(DocumentRouteLevelChange levelChangeEvent) throws Exception {
064 if (THROW_ROUTE_STATUS_LEVEL_EXCEPTION) {
065 throw new RuntimeException("I am the doRouteLevelChange exploder");
066 }
067 return new ProcessDocReport(true, "");
068 }
069
070 public ProcessDocReport doDeleteRouteHeader(DeleteEvent event) throws Exception {
071 if (THROW_ROUTE_DELETE_ROUTE_HEADER_EXCEPTION) {
072 throw new RuntimeException("I am the doDeleteRouteHeader exploder");
073 }
074 return new ProcessDocReport(true, "");
075 }
076
077 public ProcessDocReport doActionTaken(ActionTakenEvent event) throws Exception {
078 if (THROW_DO_ACTION_TAKEN_EXCEPTION) {
079 throw new RuntimeException("I am the doActionTaken exploder");
080 }
081 return new ProcessDocReport(true, "");
082 }
083
084 public ProcessDocReport afterActionTaken(ActionType performed, ActionTakenEvent event) throws Exception {
085 if (THROW_DO_ACTION_TAKEN_EXCEPTION) {
086 throw new RuntimeException("I am the afterActionTaken exploder");
087 }
088 return new ProcessDocReport(true, "");
089 }
090
091 public ProcessDocReport beforeProcess(BeforeProcessEvent event) throws Exception {
092 if (THROW_BEFORE_PROCESS_EXCEPTION) {
093 throw new RuntimeException("I am the beforeProcess exploder");
094 }
095 return new ProcessDocReport(true, "");
096 }
097
098 public ProcessDocReport afterProcess(AfterProcessEvent event) throws Exception {
099 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 }