Project

General

Profile

1
package eu.dnetlib.msro.workflows.nodes;
2

    
3
import java.util.Map;
4
import javax.annotation.Resource;
5

    
6
import com.google.common.collect.Maps;
7
import com.googlecode.sarasvati.Arc;
8
import com.googlecode.sarasvati.NodeToken;
9
import eu.dnetlib.common.logging.DnetLogger;
10
import eu.dnetlib.common.logging.LogMessage;
11
import eu.dnetlib.enabling.is.registry.rmi.ISRegistryService;
12
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
13
import eu.dnetlib.miscutils.datetime.DateUtils;
14
import eu.dnetlib.msro.workflows.util.WorkflowsConstants;
15
import org.antlr.stringtemplate.StringTemplate;
16
import org.apache.commons.io.IOUtils;
17
import org.apache.commons.lang.StringEscapeUtils;
18
import org.apache.commons.lang.StringUtils;
19
import org.apache.commons.logging.Log;
20
import org.apache.commons.logging.LogFactory;
21
import org.springframework.beans.factory.annotation.Required;
22

    
23
/**
24
 * The success node sets the "isCompletedSuccessfully" env var.
25
 * 
26
 */
27
public class SuccessFailureNode extends SimpleJobNode {
28

    
29
	private static final Log log = LogFactory.getLog(SuccessFailureNode.class);
30
	/**
31
	 * is completed successfully.
32
	 */
33
	private boolean success;
34
	@Resource
35
	private UniqueServiceLocator serviceLocator;
36
	@Resource(name = "msroWorkflowLogger")
37
	private DnetLogger dnetLogger;
38

    
39
	@Override
40
	protected String execute(final NodeToken token) {
41
		final String profileId = token.getFullEnv().getAttribute(WorkflowsConstants.SYSTEM_WF_PROFILE_ID).trim();
42

    
43
		final long now = DateUtils.now();
44
		final String date = DateUtils.calculate_ISO8601(now);
45

    
46
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_DATE, now);
47
		token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_END_HUMAN_DATE, date);
48

    
49
		final Map<String, String> params = mergeEnvAttributes(token);
50
		final LogMessage logMessage = dnetLogger.newLogMessage().addDetails(params);
51

    
52
		try {
53
			final String template = IOUtils.toString(getClass().getResourceAsStream("/eu/dnetlib/msro/workflows/templates/workflow_status.xml.st"));
54
			final StringTemplate st = new StringTemplate(template);
55
			st.setAttribute("procId", StringEscapeUtils.escapeXml(params.get(WorkflowsConstants.SYSTEM_WF_PROCESS_ID)));
56
			st.setAttribute("date", StringEscapeUtils.escapeXml(date));
57
			st.setAttribute("params", filterOutputParams(params));
58
			if (!isSuccess()) {
59
				st.setAttribute("error", escape(params.get(WorkflowsConstants.SYSTEM_ERROR)));
60
			}
61

    
62
			serviceLocator.getService(ISRegistryService.class).updateProfileNode(profileId, "//STATUS", st.toString());
63

    
64
			token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, isSuccess());
65

    
66
			logMessage.addDetail(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, Boolean.toString(isSuccess()));
67
		} catch (Exception e) {
68
			log.error("Error updating workflow profile: " + profileId, e);
69
			token.getProcess().getEnv().setAttribute(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, false);
70
			logMessage.addDetail(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY, Boolean.toString(false));
71
		}
72

    
73
		logMessage.flush();
74

    
75
		return Arc.DEFAULT_ARC;
76
	}
77

    
78
	private Map<String, String> filterOutputParams(final Map<String, String> map) {
79
		final Map<String, String> res = Maps.newHashMap();
80

    
81
		if (map != null) {
82
			for (String k : map.keySet()) {
83
				if (!StringUtils.isBlank(k) && (k.startsWith(WorkflowsConstants.DATAPROVIDER_PREFIX) || k.startsWith(WorkflowsConstants.MAIN_LOG_PREFIX))) {
84
					final String key = escape(k);
85
					final String v = map.get(k);
86
					res.put(key, v != null ? escapeAttribute(escape(v)) : "null");
87
				}
88
			}
89
		}
90

    
91
		return res;
92
	}
93

    
94
	private String escapeAttribute(String s) {
95
		return s.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&apos;").replaceAll("\\{", "{{").replaceAll("\\}", "}}");
96
	}
97

    
98
	private Map<String, String> mergeEnvAttributes(final NodeToken token) {
99
		final Map<String, String> map = Maps.newHashMap();
100

    
101
		for (String s : token.getEnv().getAttributeNames()) {
102
			map.put(s, token.getEnv().getAttribute(s));
103
		}
104
		for (String s : token.getFullEnv().getAttributeNames()) {
105
			map.put(s, token.getFullEnv().getAttribute(s));
106
		}
107
		return map;
108
	}
109

    
110
	protected String escape(final String value){
111
		return StringUtils.isNotBlank(value) ? StringEscapeUtils.escapeXml(value).replaceAll("\\{", "-").replaceAll("}","-") : "";
112
	}
113

    
114
	public boolean isSuccess() {
115
		return success;
116
	}
117

    
118
	@Required
119
	public void setSuccess(final boolean success) {
120
		this.success = success;
121
	}
122

    
123
}
(9-9/9)