Project

General

Profile

1 26600 sandro.lab
package eu.dnetlib.msro.workflows.nodes;
2
3
import java.util.Map;
4
5
import javax.annotation.Resource;
6
7
import org.antlr.stringtemplate.StringTemplate;
8
import org.apache.commons.io.IOUtils;
9
import org.apache.commons.lang.StringEscapeUtils;
10 30778 claudio.at
import org.apache.commons.lang.StringUtils;
11 26600 sandro.lab
import org.apache.commons.logging.Log;
12
import org.apache.commons.logging.LogFactory;
13
import org.springframework.beans.factory.annotation.Required;
14
15
import com.google.common.collect.Maps;
16
import com.googlecode.sarasvati.Arc;
17
import com.googlecode.sarasvati.NodeToken;
18
19
import eu.dnetlib.common.logging.DnetLogger;
20
import eu.dnetlib.common.logging.LogMessage;
21
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
22
import eu.dnetlib.enabling.tools.ServiceLocator;
23
import eu.dnetlib.miscutils.datetime.DateUtils;
24
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
25
26
/**
27
 * The success node sets the "isCompletedSuccessfully" env var.
28
 *
29
 */
30
public class SuccessFailureNode extends SimpleJobNode {
31
32
	/**
33
	 * is completed successfully.
34
	 */
35
	private boolean success;
36
37
	@Resource(name = "registryLocator")
38
	private ServiceLocator<ISRegistryService> registryLocator;
39
40
	@Resource(name = "msroWorkflowLogger")
41
	private DnetLogger dnetLogger;
42
43
	private static final Log log = LogFactory.getLog(SuccessFailureNode.class);
44
45
	@Override
46
	protected String execute(final NodeToken token) {
47
		final String profileId = token.getFullEnv().getAttribute(WorkflowsConstants.SYSTEM_WF_PROFILE_ID).trim();
48 30778 claudio.at
49 27548 michele.ar
		final long now = DateUtils.now();
50
		final String date = DateUtils.calculate_ISO8601(now);
51 26600 sandro.lab
52 27548 michele.ar
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_DATE, now);
53
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_HUMAN_DATE, date);
54 26600 sandro.lab
55
		final Map<String, String> params = mergeEnvAttributes(token);
56
		final LogMessage logMessage = dnetLogger.newLogMessage().addDetails(params);
57
58
		try {
59
			final String template = IOUtils.toString(getClass().getResourceAsStream("/eu/dnetlib/msro/workflows/templates/workflow_status.xml.st"));
60
			final StringTemplate st = new StringTemplate(template);
61
			st.setAttribute("procId", StringEscapeUtils.escapeXml(params.get(WorkflowsConstants.SYSTEM_WF_PROCESS_ID)));
62
			st.setAttribute("date", StringEscapeUtils.escapeXml(date));
63 30177 michele.ar
			st.setAttribute("params", filterOutputParams(params));
64 26600 sandro.lab
			if (!isSuccess()) {
65
				st.setAttribute("error", StringEscapeUtils.escapeXml(params.get(WorkflowsConstants.SYSTEM_ERROR)));
66
			}
67
68
			registryLocator.getService().updateProfileNode(profileId, "//STATUS", st.toString());
69
70
			token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, isSuccess());
71
72
			logMessage.addDetail(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, Boolean.toString(isSuccess()));
73
		} catch (Exception e) {
74
			log.error("Error updating workflow profile: " + profileId, e);
75
			token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, false);
76
			logMessage.addDetail(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, Boolean.toString(false));
77
		}
78
79
		logMessage.flush();
80
81
		return Arc.DEFAULT_ARC;
82
	}
83
84 30177 michele.ar
	private Map<String, String> filterOutputParams(final Map<String, String> map) {
85 26600 sandro.lab
		final Map<String, String> res = Maps.newHashMap();
86
87 30778 claudio.at
		if (map != null) {
88
			for (String k : map.keySet()) {
89
				if (!StringUtils.isBlank(k) && (k.startsWith(WorkflowsConstants.DATAPROVIDER_PREFIX) || k.startsWith(WorkflowsConstants.MAIN_LOG_PREFIX))) {
90
					final String key = StringEscapeUtils.escapeXml(k);
91
					final String v = map.get(k);
92
					res.put(key, v != null ? StringEscapeUtils.escapeXml(v) : "null");
93
				}
94 26600 sandro.lab
			}
95
		}
96
97
		return res;
98
	}
99
100
	private Map<String, String> mergeEnvAttributes(final NodeToken token) {
101
		final Map<String, String> map = Maps.newHashMap();
102
103
		for (String s : token.getEnv().getAttributeNames()) {
104
			map.put(s, token.getEnv().getAttribute(s));
105
		}
106
		for (String s : token.getFullEnv().getAttributeNames()) {
107
			map.put(s, token.getFullEnv().getAttribute(s));
108
		}
109
		return map;
110
	}
111
112
	public boolean isSuccess() {
113
		return success;
114
	}
115
116
	@Required
117
	public void setSuccess(final boolean success) {
118
		this.success = success;
119
	}
120
121
}