in saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/impl/ProcessCtrlStateMachineEngine.java [614:667]
protected boolean checkStatus(StateMachineInstance stateMachineInstance, ExecutionStatus[] acceptStatus,
ExecutionStatus[] denyStatus, ExecutionStatus status, ExecutionStatus compenStatus,
String operation) {
if (status != null && compenStatus != null) {
throw new EngineExecutionException("status and compensationStatus are not supported at the same time",
FrameworkErrorCode.InvalidParameter);
}
if (status == null && compenStatus == null) {
throw new EngineExecutionException("status and compensationStatus must input at least one",
FrameworkErrorCode.InvalidParameter);
}
if (ExecutionStatus.SU.equals(compenStatus)) {
String message = buildExceptionMessage(stateMachineInstance, null, null, null, ExecutionStatus.SU,
operation);
throw new EngineExecutionException(message, FrameworkErrorCode.OperationDenied);
}
if (stateMachineInstance.isRunning() && !EngineUtils.isTimeout(stateMachineInstance.getGmtUpdated(), stateMachineConfig.getTransOperationTimeout())) {
throw new EngineExecutionException(
"StateMachineInstance [id:" + stateMachineInstance.getId() + "] is running, operation[" + operation
+ "] denied", FrameworkErrorCode.OperationDenied);
}
if ((denyStatus == null || denyStatus.length == 0) && (acceptStatus == null || acceptStatus.length == 0)) {
throw new EngineExecutionException("StateMachineInstance[id:" + stateMachineInstance.getId()
+ "], acceptable status and deny status must input at least one", FrameworkErrorCode.InvalidParameter);
}
ExecutionStatus currentStatus = (status != null) ? status : compenStatus;
if (!(denyStatus == null || denyStatus.length == 0)) {
for (ExecutionStatus tempDenyStatus : denyStatus) {
if (tempDenyStatus.compareTo(currentStatus) == 0) {
String message = buildExceptionMessage(stateMachineInstance, acceptStatus, denyStatus, status,
compenStatus, operation);
throw new EngineExecutionException(message, FrameworkErrorCode.OperationDenied);
}
}
}
if (acceptStatus == null || acceptStatus.length == 0) {
return true;
} else {
for (ExecutionStatus tempStatus : acceptStatus) {
if (tempStatus.compareTo(currentStatus) == 0) {
return true;
}
}
}
String message = buildExceptionMessage(stateMachineInstance, acceptStatus, denyStatus, status, compenStatus,
operation);
throw new EngineExecutionException(message, FrameworkErrorCode.OperationDenied);
}