dnet-applications/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphNode.java

150 lines
3.7 KiB
Java

package eu.dnetlib.manager.wf.workflows.graph;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import eu.dnetlib.manager.wf.workflows.procs.Env;
public class GraphNode {
public static final String SUCCESS_NODE = "success";
private final String name;
private final String type;
private final boolean isStart;
private final boolean isJoin;
private final boolean isSucessNode;
private final Map<String, GraphNodeParameter> nodeParams;
private GraphNode(final String name,
final String type,
final boolean isStart,
final boolean isJoin,
final boolean isSuccessNode,
final Map<String, GraphNodeParameter> nodeParams) {
this.name = name;
this.type = type;
this.isStart = isStart;
this.isJoin = isJoin;
this.isSucessNode = isSuccessNode;
this.nodeParams = nodeParams;
}
public static GraphNode newNode(final String name,
final String type,
final Map<String, GraphNodeParameter> nodeParams) {
return new GraphNode(name, type, false, false, false, nodeParams);
}
public static GraphNode newStartNode(final String name,
final String type,
final Map<String, GraphNodeParameter> nodeParams) {
return new GraphNode(name, type, true, false, false, nodeParams);
}
public static GraphNode newJoinNode(final String name,
final String type,
final Map<String, GraphNodeParameter> nodeParams) {
return new GraphNode(name, type, false, true, false, nodeParams);
}
public static GraphNode newSuccessNode() {
return new GraphNode(SUCCESS_NODE, null, false, true, true, null);
}
public String getName() {
return this.name;
}
public String getType() {
return this.type;
}
public boolean isStart() {
return this.isStart;
}
public boolean isJoin() {
return this.isJoin;
}
public boolean isSucessNode() {
return this.isSucessNode;
}
@Override
public String toString() {
final StringWriter sw = new StringWriter();
sw.append("[ name: ");
sw.append(this.name);
if (StringUtils.isNotBlank(this.type)) {
sw.append(", type: ");
sw.append(this.type);
}
if (isStart()) {
sw.append(" - isStart");
}
if (isJoin()) {
sw.append(" - isJoin");
}
sw.append(" ]");
return sw.toString();
}
public Map<String, GraphNodeParameter> getNodeParams() {
return this.nodeParams;
}
public Map<String, Object> resolveParamsWithNoEnv() {
return resolveParams(null);
}
@SuppressWarnings("unchecked")
public Map<String, Object> resolveParams(final Env env) {
final Map<String, Object> params = new HashMap<>();
if (this.nodeParams != null) {
for (final Map.Entry<String, GraphNodeParameter> e : this.nodeParams.entrySet()) {
final String pName = e.getKey();
final GraphNodeParameter param = e.getValue();
if (param.isEnvParam()) {
params.put(pName, resolveFromEnv(param, env));
} else if (param.isMap()) {
final Map<String, Object> map = new HashMap<>();
for (final Map.Entry<String, GraphNodeParameter> e1 : ((Map<String, GraphNodeParameter>) param.getValue()).entrySet()) {
map.put(e1.getKey(), e1.getValue().isEnvParam() ? resolveFromEnv(e1.getValue(), env) : e1.getValue().getValue());
}
params.put(pName, map);
} else if (param.isList()) {
params.put(pName, ((List<GraphNodeParameter>) param.getValue())
.stream()
.map(p -> p.isEnvParam() ? resolveFromEnv(p, env) : p.getValue())
.collect(Collectors.toList()));
} else {
params.put(pName, param.getValue());
}
}
}
return params;
}
private Object resolveFromEnv(final GraphNodeParameter param, final Env env) {
return env != null ? env.getAttribute(param.getEnvVariable()) : "[this value will be resolved using the runtime ENV]";
}
}