Project

General

Profile

1 26600 sandro.lab
package eu.dnetlib.msro.workflows.nodes.transform;
2
3 28688 michele.ar
import java.io.IOException;
4 31972 andrea.man
import java.util.List;
5 28688 michele.ar
6 26600 sandro.lab
import javax.xml.ws.wsaddressing.W3CEndpointReference;
7
8 28688 michele.ar
import org.antlr.stringtemplate.StringTemplate;
9 26600 sandro.lab
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 28688 michele.ar
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
17
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
18 26600 sandro.lab
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
19 32639 michele.ar
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
20 26600 sandro.lab
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 32639 michele.ar
	@javax.annotation.Resource
37
	private UniqueServiceLocator serviceLocator;
38 26600 sandro.lab
39
	@Override
40 28688 michele.ar
	protected String execute(final NodeToken token) throws MSROException {
41 26600 sandro.lab
		final String inputEpr = token.getEnv().getAttribute(inputEprParam);
42 32639 michele.ar
43
		if (inputEpr == null || inputEpr.isEmpty()) { throw new MSROException("InputEprParam (" + inputEprParam + ") not found in ENV"); }
44
45 26600 sandro.lab
		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 32639 michele.ar
49
		final ISLookUpService lookupService = serviceLocator.getService(ISLookUpService.class);
50
51 28688 michele.ar
		try {
52
			final StringTemplate st = new StringTemplate(IOUtils.toString(getMdBuilderTemplateXslt().getInputStream()));
53 32639 michele.ar
			st.setAttribute("xpath", lookupService.getResourceProfileByQuery(xQuery));
54 28688 michele.ar
			st.setAttribute("datasourceId", datasourceId);
55 32639 michele.ar
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 28688 michele.ar
			if (token.getEnv().hasAttribute("namespacePrefix")) {
62
				st.setAttribute("namespacePrefix", token.getEnv().getAttribute("namespacePrefix"));
63
			} else {
64 31972 andrea.man
				List<String> namespacePrefix;
65 32024 michele.ar
				xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//EXTRA_FIELDS/FIELD/value[../key='NamespacePrefix']/string()";
66 32639 michele.ar
				namespacePrefix = lookupService.quickSearchProfile(xQuery);
67
				if (namespacePrefix.size() != 0) {
68 31972 andrea.man
					st.setAttribute("namespacePrefix", namespacePrefix.get(0));
69
				} else {
70
					xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//DATASOURCE_ORIGINAL_ID/string()";
71 32639 michele.ar
					namespacePrefix = lookupService.quickSearchProfile(xQuery);
72 31972 andrea.man
					if (namespacePrefix.size() != 0) {
73
						st.setAttribute("namespacePrefix", namespacePrefix.get(0));
74
					} else {
75
						st.setAttribute("namespacePrefix", datasourceId);
76
					}
77
				}
78 28688 michele.ar
			}
79 32639 michele.ar
			final W3CEndpointReference epr = xsltMappedResultSetFactory.createMappedResultSet(new EPRUtils().getEpr(inputEpr), st.toString());
80
81 28688 michele.ar
			token.getEnv().setAttribute(outputEprParam, epr.toString());
82 32639 michele.ar
83 28688 michele.ar
			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 26600 sandro.lab
	}
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 32409 andrea.man
	@Required
139 26600 sandro.lab
	public void setMdBuilderTemplateXslt(final Resource mdBuilderTemplateXslt) {
140
		this.mdBuilderTemplateXslt = mdBuilderTemplateXslt;
141
	}
142
143
}