package tech.powerjob.server.core.validator; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import tech.powerjob.common.enums.WorkflowNodeType; import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.common.model.PEWorkflowDAG; import tech.powerjob.server.core.workflow.algorithm.WorkflowDAG; import tech.powerjob.server.persistence.remote.model.WorkflowNodeInfoDO; import java.util.Collection; /** * @author Echo009 * @since 2021/12/14 */ @Component @Slf4j public class DecisionNodeValidator implements NodeValidator { @Override public void complexValidate(WorkflowNodeInfoDO node, WorkflowDAG dag) { // 出度固定为 2 WorkflowDAG.Node nodeWrapper = dag.getNode(node.getId()); Collection edges = nodeWrapper.getSuccessorEdgeMap().values(); if (edges.size() != 2) { throw new PowerJobException("DecisionNode‘s out-degree must be 2,node name : " + node.getNodeName()); } // 边的属性必须为 ture 或者 false boolean containFalse = false; boolean containTrue = false; for (PEWorkflowDAG.Edge edge : edges) { if (!isValidBooleanStr(edge.getProperty())) { throw new PowerJobException("Illegal property of DecisionNode‘s out-degree edge,node name : " + node.getNodeName()); } boolean b = Boolean.parseBoolean(edge.getProperty()); if (b) { containTrue = true; } else { containFalse = true; } } if (!containFalse || !containTrue) { throw new PowerJobException("Illegal property of DecisionNode‘s out-degree edge,node name : " + node.getNodeName()); } } @Override public void simpleValidate(WorkflowNodeInfoDO node) { // 简单校验 String nodeParams = node.getNodeParams(); if (StringUtils.isBlank(nodeParams)) { throw new PowerJobException("DecisionNode‘s param must be not null,node name : " + node.getNodeName()); } } public static boolean isValidBooleanStr(String str) { return StringUtils.equalsIgnoreCase(str.trim(), "true") || StringUtils.equalsIgnoreCase(str.trim(), "false"); } @Override public WorkflowNodeType matchingType() { return WorkflowNodeType.DECISION; } }