package eu.dnetlib.manager.wf.nodes; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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 String beanName; private String nodeName; public abstract void execute(final Token token, NodeCallback callback); public final void initInputParams(final Env env) { 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())); } else { fieldValue(field, env.getAttribute(field.getName(), field.getType())); } }); } public final void saveOutputParams(final Env env) { findFields(getClass(), WfOutputParam.class).forEach(field -> { final String annName = field.getAnnotation(WfOutputParam.class).value(); if (StringUtils.isNotBlank(annName)) { env.setAttribute(annName, fieldValue(field)); } else { env.setAttribute(field.getName(), fieldValue(field)); } }); } private final void fieldValue(final Field field, final Object object) { try { field.set(this, object); } catch (IllegalArgumentException | IllegalAccessException e) { log.error("Error setting field " + field.getName(), e); throw new RuntimeException(e); } } private Object fieldValue(final Field field) { try { return field.get(this); } catch (IllegalArgumentException | IllegalAccessException e) { log.error("Error getting field " + field.getName(), e); throw new RuntimeException(e); } } public String getBeanName() { return this.beanName; } @Override public void setBeanName(final String beanName) { this.beanName = beanName; } public String getNodeName() { return this.nodeName; } public void setNodeName(final String nodeName) { this.nodeName = nodeName; } @Override public String toString() { return String.format("[node beanName=%s, name=%s]", this.beanName, this.nodeName); } private final Set findFields(final Class clazz, final Class ann) { final Set fields = new HashSet<>(); if (clazz != null) { fields.addAll(findFields(clazz.getSuperclass(), ann)); for (final Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(ann)) { fields.add(field); } } } return fields; } }