protected boolean checkStatus()

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);
    }