package tech.powerjob.common.model; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.google.common.collect.Lists; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import tech.powerjob.common.enums.WorkflowNodeType; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.Serializable; import java.util.List; /** * Points & edges for DAG, making it easier to describe or transfer. * * @author tjq * @since 2020/5/26 */ @Data @NoArgsConstructor public class PEWorkflowDAG implements Serializable { /** * Nodes of DAG diagram. */ private List nodes; /** * Edges of DAG diagram. */ private List edges; /** * Point. */ @Data @Accessors(chain = true) @NoArgsConstructor public static class Node implements Serializable { /** * node id * * @since 20210128 */ private Long nodeId; /* Instance running param, which is not required by DAG. */ /** * note type * * @see WorkflowNodeType * @since 20210316 */ private Integer nodeType; /** * job id or workflow id (if this Node type is a nested workflow) * * @see WorkflowNodeType#NESTED_WORKFLOW */ private Long jobId; /** * node name */ private String nodeName; @JsonSerialize(using = ToStringSerializer.class) private Long instanceId; /** * for decision node, it is JavaScript code */ private String nodeParams; private Integer status; /** * for decision node, it only be can "true" or "false" */ private String result; /** * instanceId will be null if disable . */ private Boolean enable; /** * mark node which disable by control node. */ private Boolean disableByControlNode; private Boolean skipWhenFailed; private String startTime; private String finishedTime; public Node(Long nodeId) { this.nodeId = nodeId; this.nodeType = WorkflowNodeType.JOB.getCode(); } public Node(Long nodeId, Integer nodeType) { this.nodeId = nodeId; this.nodeType = nodeType; } } /** * Edge formed by two node ids. */ @Data @NoArgsConstructor public static class Edge implements Serializable { private Long from; private Long to; /** * property,support for complex flow control * for decision node , it can be "true" or "false" */ private String property; private Boolean enable; public Edge(long from, long to) { this.from = from; this.to = to; } public Edge(long from, long to, String property) { this.from = from; this.to = to; this.property = property; } } public PEWorkflowDAG(@Nonnull List nodes, @Nullable List edges) { this.nodes = nodes; this.edges = edges == null ? Lists.newLinkedList() : edges; } }