Project

General

Profile

1
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
import org.apache.commons.lang.StringUtils;
11
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.locators.UniqueServiceLocator;
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
38
	private UniqueServiceLocator serviceLocator;
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

    
49
		final long now = DateUtils.now();
50
		final String date = DateUtils.calculate_ISO8601(now);
51

    
52
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_DATE, now);
53
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_HUMAN_DATE, date);
54

    
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
			st.setAttribute("params", filterOutputParams(params));
64
			if (!isSuccess()) {
65
				st.setAttribute("error", StringEscapeUtils.escapeXml(params.get(WorkflowsConstants.SYSTEM_ERROR)));
66
			}
67

    
68
			serviceLocator.getService(ISRegistryService.class).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
	private Map<String, String> filterOutputParams(final Map<String, String> map) {
85
		final Map<String, String> res = Maps.newHashMap();
86

    
87
		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
			}
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
}
(9-9/9)