From 66523a612bdaf0ce212b7c293988f0cab5c77c8d Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Fri, 21 Apr 2023 15:12:55 +0200 Subject: [PATCH] input params --- .../manager/wf/model/WorkflowTemplate.java | 6 ++-- .../dnetlib/manager/wf/nodes/ProcessNode.java | 34 ++++++++++++++----- .../wf/workflows/graph/GraphLoader.java | 2 +- .../manager/wf/workflows/graph/GraphNode.java | 32 ++++------------- .../wf/workflows/procs/ProcessEngine.java | 14 +++++--- 5 files changed, 45 insertions(+), 43 deletions(-) diff --git a/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowTemplate.java b/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowTemplate.java index 772cbea0..6be814cd 100644 --- a/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowTemplate.java +++ b/libs/dnet-is-common/src/main/java/eu/dnetlib/manager/wf/model/WorkflowTemplate.java @@ -203,13 +203,13 @@ public class WorkflowTemplate implements Serializable { .collect(Collectors.toMap(NodeParam::getName, NodeParam::getEnv)); } - public Map calculateInitialParams(final Map globalParams, final Environment environment) { + public Map calculateInitialParams(final Map globalParams, final Environment environment) { return input.stream() .filter(p -> StringUtils.isBlank(p.getEnv())) - .collect(Collectors.toMap(p -> p.getName(), p -> calculateSimpleValue(p, globalParams, environment))); + .collect(Collectors.toMap(NodeParam::getName, p -> calculateSimpleValue(p, globalParams, environment))); } - private Object calculateSimpleValue(final NodeParam p, final Map globalParams, final Environment environment) { + private String calculateSimpleValue(final NodeParam p, final Map globalParams, final Environment environment) { String value = p.getValue(); final String ref = p.getRef(); final String prop = p.getProperty(); diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/nodes/ProcessNode.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/nodes/ProcessNode.java index c38ce9d0..eb11f233 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/nodes/ProcessNode.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/nodes/ProcessNode.java @@ -3,9 +3,11 @@ package eu.dnetlib.manager.wf.nodes; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.BeanNameAware; @@ -13,13 +15,12 @@ import org.springframework.beans.factory.BeanNameAware; import eu.dnetlib.manager.wf.annotations.WfInputParam; import eu.dnetlib.manager.wf.annotations.WfOutputParam; import eu.dnetlib.manager.wf.workflows.procs.Env; -import eu.dnetlib.manager.wf.workflows.procs.ProcessEngine; import eu.dnetlib.manager.wf.workflows.procs.Token; import eu.dnetlib.manager.wf.workflows.util.NodeCallback; public abstract class ProcessNode implements BeanNameAware { - private static final Log log = LogFactory.getLog(ProcessEngine.class); + private static final Log log = LogFactory.getLog(ProcessNode.class); private String beanName; @@ -27,13 +28,13 @@ public abstract class ProcessNode implements BeanNameAware { public abstract void execute(final Token token, NodeCallback callback); - public final void initInputParams(final Env env) { + public final void initInputParams(final Map params) { findFields(getClass(), WfInputParam.class).forEach(field -> { final String annName = field.getAnnotation(WfInputParam.class).value(); if (StringUtils.isNotBlank(annName)) { - fieldValue(field, env.getAttribute(annName, field.getType())); + fieldValue(field, params.get(annName)); } else { - fieldValue(field, env.getAttribute(field.getName(), field.getType())); + fieldValue(field, params.get(field.getName())); } }); } @@ -49,10 +50,27 @@ public abstract class ProcessNode implements BeanNameAware { }); } - private final void fieldValue(final Field field, final Object object) { + private final void fieldValue(final Field field, final Object value) { try { field.setAccessible(true); - field.set(this, object); + final Class fieldClass = field.getType(); + if (value.getClass().isAssignableFrom(fieldClass)) { + field.set(this, value); + } else if (String.class.isAssignableFrom(fieldClass)) { + field.set(this, value.toString()); + } else if (long.class.isAssignableFrom(fieldClass) || Long.class.isAssignableFrom(fieldClass)) { + field.set(this, NumberUtils.toLong(value.toString())); + } else if (int.class.isAssignableFrom(fieldClass) || Integer.class.isAssignableFrom(fieldClass)) { + field.set(this, NumberUtils.toInt(value.toString())); + } else if (double.class.isAssignableFrom(fieldClass) || Double.class.isAssignableFrom(fieldClass)) { + field.set(this, NumberUtils.toDouble(value.toString())); + } else if (float.class.isAssignableFrom(fieldClass) || Float.class.isAssignableFrom(fieldClass)) { + field.set(this, NumberUtils.toFloat(value.toString())); + } else { + log.error("Not Mapped Type, Field class: " + fieldClass + ", Value: " + value + " (" + value.getClass() + ")"); + throw new RuntimeException("Not Mapped Type: " + fieldClass); + } + } catch (IllegalArgumentException | IllegalAccessException e) { log.error("Error setting field " + field.getName(), e); throw new RuntimeException(e); @@ -88,7 +106,7 @@ public abstract class ProcessNode implements BeanNameAware { @Override public String toString() { - return String.format("[node beanName=%s, name=%s]", this.beanName, this.nodeName); + return String.format("[node beanName=%s, name=%s, object: %s]", this.beanName, this.nodeName, super.toString()); } private final Set findFields(final Class clazz, final Class ann) { diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphLoader.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphLoader.java index d0bd623b..ffdb28d5 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphLoader.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphLoader.java @@ -69,7 +69,7 @@ public class GraphLoader { final boolean isStart = node.isStart(); final boolean isJoin = node.isJoin(); - final Map params = node.calculateInitialParams(globalParams, environment); + final Map params = node.calculateInitialParams(globalParams, environment); final Map envParams = node.findEnvParams(); if (isStart) { diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphNode.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphNode.java index 9f3429e2..c60b9168 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphNode.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/graph/GraphNode.java @@ -6,8 +6,6 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; -import eu.dnetlib.manager.wf.workflows.procs.Env; - public class GraphNode { public static final String SUCCESS_NODE = "success"; @@ -17,7 +15,7 @@ public class GraphNode { private final boolean isStart; private final boolean isJoin; private final boolean isSucessNode; - private final Map params; + private final Map params; private final Map envParams; private GraphNode(final String name, @@ -25,7 +23,7 @@ public class GraphNode { final boolean isStart, final boolean isJoin, final boolean isSuccessNode, - final Map params, + final Map params, final Map envParams) { this.name = name; this.type = type; @@ -38,21 +36,21 @@ public class GraphNode { public static GraphNode newNode(final String name, final String type, - final Map params, + final Map params, final Map envParams) { return new GraphNode(name, type, false, false, false, params, envParams); } public static GraphNode newStartNode(final String name, final String type, - final Map params, + final Map params, final Map envParams) { return new GraphNode(name, type, true, false, false, params, envParams); } public static GraphNode newJoinNode(final String name, final String type, - final Map params, + final Map params, final Map envParams) { return new GraphNode(name, type, false, true, false, params, envParams); } @@ -100,7 +98,7 @@ public class GraphNode { return sw.toString(); } - public Map getParams() { + public Map getParams() { return this.params; } @@ -108,22 +106,4 @@ public class GraphNode { return this.envParams; } - public Map resolveParamsWithNoEnv() { - return resolveParams(null); - } - - public Map resolveParams(final Env env) { - final Map map = new HashMap<>(); - - if (this.params != null) { - this.params.forEach((k, v) -> map.put(k, v)); - } - - if (this.envParams != null && env != null) { - this.envParams.forEach((k, v) -> map.put(k, env.getAttribute(v))); - } - - return map; - } - } diff --git a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/ProcessEngine.java b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/ProcessEngine.java index f621b045..915c59c1 100644 --- a/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/ProcessEngine.java +++ b/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/workflows/procs/ProcessEngine.java @@ -120,12 +120,16 @@ public class ProcessEngine { private void executeNode(final WorkflowProcess process, final GraphNode graphNode, final Token token) throws WorkflowManagerException { process.setLastActivityDate(LocalDateTime.now()); + final Map params = new HashMap<>(); + if (graphNode.getParams() != null) { + graphNode.getParams().forEach((k, v) -> params.put(k, v)); + } + if (graphNode.getEnvParams() != null) { + graphNode.getEnvParams().forEach((k, v) -> params.put(k, token.getEnv().getAttribute(v))); + } + final ProcessNode pNode = newProcessNode(graphNode, process); - - // TODO Is it correct? - token.getEnv().addAttributes(graphNode.resolveParams(token.getEnv())); - - pNode.initInputParams(token.getEnv()); + pNode.initInputParams(params); pNode.execute(token, newNodeCallback(process, pNode, graphNode)); }