input params

This commit is contained in:
Michele Artini 2023-04-21 15:12:55 +02:00
parent 97d17eb379
commit 66523a612b
5 changed files with 45 additions and 43 deletions

View File

@ -203,13 +203,13 @@ public class WorkflowTemplate implements Serializable {
.collect(Collectors.toMap(NodeParam::getName, NodeParam::getEnv));
}
public Map<String, Object> calculateInitialParams(final Map<String, String> globalParams, final Environment environment) {
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(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<String, String> globalParams, final Environment 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();

View File

@ -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<String, Object> 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<Field> findFields(final Class<?> clazz, final Class<? extends Annotation> ann) {

View File

@ -69,7 +69,7 @@ public class GraphLoader {
final boolean isStart = node.isStart();
final boolean isJoin = node.isJoin();
final Map<String, Object> params = node.calculateInitialParams(globalParams, environment);
final Map<String, String> params = node.calculateInitialParams(globalParams, environment);
final Map<String, String> envParams = node.findEnvParams();
if (isStart) {

View File

@ -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<String, Object> params;
private final Map<String, String> params;
private final Map<String, String> envParams;
private GraphNode(final String name,
@ -25,7 +23,7 @@ public class GraphNode {
final boolean isStart,
final boolean isJoin,
final boolean isSuccessNode,
final Map<String, Object> params,
final Map<String, String> params,
final Map<String, String> 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<String, Object> params,
final Map<String, String> params,
final Map<String, String> envParams) {
return new GraphNode(name, type, false, false, false, params, envParams);
}
public static GraphNode newStartNode(final String name,
final String type,
final Map<String, Object> params,
final Map<String, String> params,
final Map<String, String> envParams) {
return new GraphNode(name, type, true, false, false, params, envParams);
}
public static GraphNode newJoinNode(final String name,
final String type,
final Map<String, Object> params,
final Map<String, String> params,
final Map<String, String> envParams) {
return new GraphNode(name, type, false, true, false, params, envParams);
}
@ -100,7 +98,7 @@ public class GraphNode {
return sw.toString();
}
public Map<String, Object> getParams() {
public Map<String, String> getParams() {
return this.params;
}
@ -108,22 +106,4 @@ public class GraphNode {
return this.envParams;
}
public Map<String, Object> resolveParamsWithNoEnv() {
return resolveParams(null);
}
public Map<String, Object> resolveParams(final Env env) {
final Map<String, Object> 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;
}
}

View File

@ -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<String, Object> 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));
}