dnet-applications/libs/dnet-wf-service/src/main/java/eu/dnetlib/manager/wf/nodes/ProcessNode.java

109 lines
3.0 KiB
Java

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.setAccessible(true);
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 {
field.setAccessible(true);
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<Field> findFields(final Class<?> clazz, final Class<? extends Annotation> ann) {
final Set<Field> 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;
}
}