WangHan
2024-09-12 d5855a4926926698b740bc6c7ba489de47adb68b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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<PEWorkflowDAG.Edge> 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;
    }
}