dnet-applications/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowTemplate.java

354 lines
7.7 KiB
Java

package eu.dnetlib.manager.wf.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
@JsonInclude(Include.NON_NULL)
public class WorkflowTemplate implements Serializable {
private static final long serialVersionUID = 5919290887480115842L;
private List<WfParam> parameters = new ArrayList<>();
private List<Node> graph = new ArrayList<>();
public List<Node> getGraph() {
return graph;
}
public void setGraph(final List<Node> graph) {
this.graph = graph;
}
public List<WfParam> getParameters() {
return parameters;
}
public void setParameters(final List<WfParam> parameters) {
this.parameters = parameters;
}
public static enum WfParamType {
STRING,
NUMBER,
DATE,
BOOLEAN
}
@JsonInclude(Include.NON_NULL)
public static class WfParam implements Serializable {
private static final long serialVersionUID = 5885589803738655166L;
private String name;
private String description;
private WfParamType type = WfParamType.STRING;
private String defaultValue;
private boolean required = true;
public WfParam() {}
public WfParam(final String name) {
this.name = name;
this.description = name;
}
public WfParam(final String name, final WfParamType type) {
this.name = name;
this.description = name;
this.type = type;
}
public WfParam(final String name, final String description, final WfParamType type, final String defaultValue, final boolean required) {
this.name = name;
this.description = description;
this.type = type;
this.defaultValue = defaultValue;
this.required = required;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(final String description) {
this.description = description;
}
public WfParamType getType() {
return type;
}
public void setType(final WfParamType type) {
this.type = type;
}
public String getDefaultValue() {
return defaultValue;
}
public void setDefaultValue(final String defaultValue) {
this.defaultValue = defaultValue;
}
public boolean isRequired() {
return required;
}
public void setRequired(final boolean required) {
this.required = required;
}
}
@JsonInclude(Include.NON_NULL)
public static class Node implements Serializable {
private static final long serialVersionUID = -3695762832959801906L;
private static final String regExRef = "\\$\\{(\\w*)\\}";
private String name;
private String type;
private boolean isStart = false;
private boolean isJoin = false;
private List<Arc> arcs = new ArrayList<>();
private List<NodeParam> input = new ArrayList<>();
public Node() {}
public Node(final String name, final boolean isStart) {
this.name = name;
this.isStart = isStart;
}
public Node(final String name) {
this.name = name;
}
public Node(final String name, final String type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(final String type) {
this.type = type;
}
public boolean isStart() {
return isStart;
}
public void setStart(final boolean isStart) {
this.isStart = isStart;
}
public boolean isJoin() {
return isJoin;
}
public void setJoin(final boolean isJoin) {
this.isJoin = isJoin;
}
public List<Arc> getArcs() {
return arcs;
}
public void setArcs(final List<Arc> arcs) {
this.arcs = arcs;
}
public List<NodeParam> getInput() {
return input;
}
public void setInput(final List<NodeParam> input) {
this.input = input;
}
public Map<String, String> findEnvParams() {
return input.stream()
.filter(p -> StringUtils.isNotBlank(p.getEnv()))
.collect(Collectors.toMap(NodeParam::getName, NodeParam::getEnv));
}
public Map<String, String> calculateInitialParams(final Map<String, String> globalParams, final Environment environment) {
return input.stream()
.filter(p -> StringUtils.isBlank(p.getEnv()))
.collect(Collectors.toMap(NodeParam::getName, p -> calculateSimpleValue(p, globalParams, environment)));
}
private String calculateSimpleValue(final NodeParam p, final Map<String, String> globalParams, final Environment environment) {
String value = p.getValue();
final String ref = p.getRef();
final String prop = p.getProperty();
if (StringUtils.isNotBlank(ref) && StringUtils.isNotBlank(globalParams.get(ref))) {
return globalParams.get(ref);
} else if (StringUtils.isNotBlank(value)) {
final Matcher matcher = Pattern.compile(regExRef, Pattern.MULTILINE).matcher(value);
while (matcher.find()) {
final String rName = matcher.group(1);
final String rValue = globalParams.get(rName);
if (StringUtils.isBlank(rValue)) { return null; }
value = value.replaceAll(Pattern.quote(matcher.group(0)), rValue);
}
return value;
} else if (StringUtils.isNotBlank(prop)) {
return environment.getProperty(prop);
} else {
return null;
}
}
}
@JsonInclude(Include.NON_NULL)
public static class Arc implements Serializable {
private static final long serialVersionUID = 7866138976929522262L;
private String to;
private String condition;
public Arc() {}
public Arc(final String to) {
this.to = to;
}
public Arc(final String to, final String condition) {
this.to = to;
this.condition = condition;
}
public String getTo() {
return to;
}
public void setTo(final String to) {
this.to = to;
}
public String getCondition() {
return condition;
}
public void setCondition(final String condition) {
this.condition = condition;
}
}
@JsonInclude(Include.NON_NULL)
public static class NodeParam implements Serializable {
private static final long serialVersionUID = 7815785723401725707L;
private String name;
private String value;
private String ref;
private String property;
private String env;
public static NodeParam newRefParam(final String name, final String ref) {
final NodeParam np = new NodeParam();
np.setName(name);
np.setRef(ref);
return np;
}
public static NodeParam newSimpleParam(final String name, final String value) {
final NodeParam np = new NodeParam();
np.setName(name);
np.setValue(value);
return np;
}
public static NodeParam newPropertyParam(final String name, final String property) {
final NodeParam np = new NodeParam();
np.setName(name);
np.setProperty(property);
return np;
}
public static NodeParam newEnvParam(final String name, final String envProp) {
final NodeParam np = new NodeParam();
np.setName(name);
np.setEnv(envProp);
return np;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(final String value) {
this.value = value;
}
public String getRef() {
return ref;
}
public void setRef(final String ref) {
this.ref = ref;
}
public String getProperty() {
return property;
}
public void setProperty(final String property) {
this.property = property;
}
public String getEnv() {
return env;
}
public void setEnv(final String env) {
this.env = env;
}
}
}