Project

General

Profile

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

    
3
import java.io.IOException;
4
import java.util.List;
5

    
6
import javax.xml.ws.wsaddressing.W3CEndpointReference;
7

    
8
import org.antlr.stringtemplate.StringTemplate;
9
import org.apache.commons.io.IOUtils;
10
import org.springframework.beans.factory.annotation.Required;
11
import org.springframework.core.io.Resource;
12

    
13
import com.googlecode.sarasvati.Arc;
14
import com.googlecode.sarasvati.NodeToken;
15

    
16
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
17
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
18
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
19
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
20
import eu.dnetlib.enabling.resultset.XSLTMappedResultSetFactory;
21
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
22
import eu.dnetlib.msro.rmi.MSROException;
23
import eu.dnetlib.msro.workflows.nodes.SimpleJobNode;
24

    
25
public class MdBuilderJobNode extends SimpleJobNode {
26

    
27
	private Resource mdBuilderTemplateXslt;
28

    
29
	private String inputEprParam;
30
	private String outputEprParam;
31
	private String datasourceId;
32
	private String datasourceInterface;
33

    
34
	private XSLTMappedResultSetFactory xsltMappedResultSetFactory;
35

    
36
	@javax.annotation.Resource
37
	private UniqueServiceLocator serviceLocator;
38

    
39
	@Override
40
	protected String execute(final NodeToken token) throws MSROException {
41
		final String inputEpr = token.getEnv().getAttribute(inputEprParam);
42

    
43
		if (inputEpr == null || inputEpr.isEmpty()) { throw new MSROException("InputEprParam (" + inputEprParam + ") not found in ENV"); }
44

    
45
		String xQuery = "for $x in collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType') "
46
				+ "return $x//INTERFACE[@id='{interfaceId}']/INTERFACE_EXTRA_FIELD[@name='metadata_identifier_path']/string()";
47
		xQuery = xQuery.replace("{interfaceId}", datasourceInterface);
48

    
49
		final ISLookUpService lookupService = serviceLocator.getService(ISLookUpService.class);
50

    
51
		try {
52
			final StringTemplate st = new StringTemplate(IOUtils.toString(getMdBuilderTemplateXslt().getInputStream()));
53
			st.setAttribute("xpath", lookupService.getResourceProfileByQuery(xQuery));
54
			st.setAttribute("datasourceId", datasourceId);
55

    
56
			/*
57
			 * If namespacePrefix has been already pushed to env by some custom JobNode e.g. ObtainOpenaireDataSourceParamsJobNode then push
58
			 * it to ST. Else: a) try to get it from EXTRAFIELDS of the datasource b) try to get it from DATASOURCE_ORIGINAL_ID of the
59
			 * datasource c) if any of the is present, then push to ST the datasourceId
60
			 */
61
			if (token.getEnv().hasAttribute("namespacePrefix")) {
62
				st.setAttribute("namespacePrefix", token.getEnv().getAttribute("namespacePrefix"));
63
			} else {
64
				List<String> namespacePrefix;
65
				xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//EXTRA_FIELDS/FIELD/value[../key='NamespacePrefix']/string()";
66
				namespacePrefix = lookupService.quickSearchProfile(xQuery);
67
				if (namespacePrefix.size() != 0) {
68
					st.setAttribute("namespacePrefix", namespacePrefix.get(0));
69
				} else {
70
					xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//DATASOURCE_ORIGINAL_ID/string()";
71
					namespacePrefix = lookupService.quickSearchProfile(xQuery);
72
					if (namespacePrefix.size() != 0) {
73
						st.setAttribute("namespacePrefix", namespacePrefix.get(0));
74
					} else {
75
						st.setAttribute("namespacePrefix", datasourceId);
76
					}
77
				}
78
			}
79
			final W3CEndpointReference epr = xsltMappedResultSetFactory.createMappedResultSet(new EPRUtils().getEpr(inputEpr), st.toString());
80

    
81
			token.getEnv().setAttribute(outputEprParam, epr.toString());
82

    
83
			return Arc.DEFAULT_ARC;
84
		} catch (ISLookUpDocumentNotFoundException e) {
85
			throw new MSROException("Missing metadata_identifier_path extra field for ds: " + datasourceId, e);
86
		} catch (ISLookUpException e) {
87
			throw new MSROException("Error searching metadata_identifier_path extra field for ds: " + datasourceId, e);
88
		} catch (IOException e) {
89
			throw new MSROException("Error parsing template: " + getMdBuilderTemplateXslt().getFilename(), e);
90
		}
91
	}
92

    
93
	public String getInputEprParam() {
94
		return inputEprParam;
95
	}
96

    
97
	public void setInputEprParam(final String inputEprParam) {
98
		this.inputEprParam = inputEprParam;
99
	}
100

    
101
	public String getOutputEprParam() {
102
		return outputEprParam;
103
	}
104

    
105
	public void setOutputEprParam(final String outputEprParam) {
106
		this.outputEprParam = outputEprParam;
107
	}
108

    
109
	public XSLTMappedResultSetFactory getXsltMappedResultSetFactory() {
110
		return xsltMappedResultSetFactory;
111
	}
112

    
113
	public String getDatasourceId() {
114
		return datasourceId;
115
	}
116

    
117
	public void setDatasourceId(final String datasourceId) {
118
		this.datasourceId = datasourceId;
119
	}
120

    
121
	public String getDatasourceInterface() {
122
		return datasourceInterface;
123
	}
124

    
125
	public void setDatasourceInterface(final String datasourceInterface) {
126
		this.datasourceInterface = datasourceInterface;
127
	}
128

    
129
	@Required
130
	public void setXsltMappedResultSetFactory(final XSLTMappedResultSetFactory xsltMappedResultSetFactory) {
131
		this.xsltMappedResultSetFactory = xsltMappedResultSetFactory;
132
	}
133

    
134
	public Resource getMdBuilderTemplateXslt() {
135
		return mdBuilderTemplateXslt;
136
	}
137

    
138
	@Required
139
	public void setMdBuilderTemplateXslt(final Resource mdBuilderTemplateXslt) {
140
		this.mdBuilderTemplateXslt = mdBuilderTemplateXslt;
141
	}
142

    
143
}
(5-5/6)