String configuration = eventSubscription.getConfiguration();
if(configuration == null) {
throw new ActivitiException("Compensating execution not set for compensate event subscription with id "+eventSubscription.getId());
}
ExecutionEntity compensatingExecution = commandContext.getExecutionEntityManager()
.findExecutionById(configuration);
ActivityImpl compensationHandler = eventSubscription.getActivity();
if((compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION) == null
||!(Boolean)compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION))
&& compensationHandler.isScope()) {
// descend into scope:
List<CompensateEventSubscriptionEntity> eventsForThisScope = compensatingExecution.getCompensateEventSubscriptions();
ScopeUtil.throwCompensationEvent(eventsForThisScope, compensatingExecution, false);
} else {
try {
if(commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createActivityEvent(ActivitiEventType.ACTIVITY_COMPENSATE,
compensationHandler.getId(),
(String) compensationHandler.getProperty("name"),
compensatingExecution.getId(),
compensatingExecution.getProcessInstanceId(),
compensatingExecution.getProcessDefinitionId(),
(String) compensatingExecution.getActivity().getProperties().get("type"),
compensatingExecution.getActivity().getActivityBehavior().getClass().getCanonicalName()));
}
compensatingExecution.setActivity(compensationHandler);
// executing the atomic operation makes sure activity start events are fired
compensatingExecution.performOperation(AtomicOperation.ACTIVITY_START);
}catch (Exception e) {
throw new ActivitiException("Error while handling compensation event "+eventSubscription, e);
}