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.resultset.XSLTMappedResultSetFactory;
20
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
21
import eu.dnetlib.enabling.tools.ServiceLocator;
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(name = "lookupLocator")
37
	private ServiceLocator<ISLookUpService> lookupLocator;
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
		try {
49
			final StringTemplate st = new StringTemplate(IOUtils.toString(getMdBuilderTemplateXslt().getInputStream()));
50
			st.setAttribute("xpath", lookupLocator.getService().getResourceProfileByQuery(xQuery));
51
			st.setAttribute("datasourceId", datasourceId);
52
			
53
			/* If namespacePrefix has been already pushed to env by some custom JobNode e.g. ObtainOpenaireDataSourceParamsJobNode
54
			   then push it to ST. Else:
55
			   a) try to get it from EXTRAFIELDS of the datasource
56
			   b) try to get it from DATASOURCE_ORIGINAL_ID of the datasource
57
			   c) if any of the is present, then push to ST the datasourceId */
58
			if (token.getEnv().hasAttribute("namespacePrefix")) {
59
				st.setAttribute("namespacePrefix", token.getEnv().getAttribute("namespacePrefix"));
60
			} else {
61
				List<String> namespacePrefix;
62
				xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//EXTRA_FIELDS/FIELD/value[../key='NamespacePrefix']/string()";
63
				namespacePrefix = lookupLocator.getService().quickSearchProfile(xQuery);
64
				if (namespacePrefix.size() != 0){
65
					st.setAttribute("namespacePrefix", namespacePrefix.get(0));
66
				} else {
67
					xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='" + datasourceId + "']//DATASOURCE_ORIGINAL_ID/string()";
68
					namespacePrefix = lookupLocator.getService().quickSearchProfile(xQuery);
69
					if (namespacePrefix.size() != 0) {
70
						st.setAttribute("namespacePrefix", namespacePrefix.get(0));
71
					} else {
72
						st.setAttribute("namespacePrefix", datasourceId);
73
					}
74
				}
75
			}
76
			final W3CEndpointReference epr = xsltMappedResultSetFactory.createMappedResultSet((new EPRUtils()).getEpr(inputEpr), st.toString());
77
	
78
			token.getEnv().setAttribute(outputEprParam, epr.toString());
79
	
80
			return Arc.DEFAULT_ARC;
81
		} catch (ISLookUpDocumentNotFoundException e) {
82
			throw new MSROException("Missing metadata_identifier_path extra field for ds: " + datasourceId, e);
83
		} catch (ISLookUpException e) {
84
			throw new MSROException("Error searching metadata_identifier_path extra field for ds: " + datasourceId, e);
85
		} catch (IOException e) {
86
			throw new MSROException("Error parsing template: " + getMdBuilderTemplateXslt().getFilename(), e);
87
		}
88
	}
89

    
90
	public String getInputEprParam() {
91
		return inputEprParam;
92
	}
93

    
94
	public void setInputEprParam(final String inputEprParam) {
95
		this.inputEprParam = inputEprParam;
96
	}
97

    
98
	public String getOutputEprParam() {
99
		return outputEprParam;
100
	}
101

    
102
	public void setOutputEprParam(final String outputEprParam) {
103
		this.outputEprParam = outputEprParam;
104
	}
105

    
106
	public XSLTMappedResultSetFactory getXsltMappedResultSetFactory() {
107
		return xsltMappedResultSetFactory;
108
	}
109

    
110
	public String getDatasourceId() {
111
		return datasourceId;
112
	}
113

    
114
	public void setDatasourceId(final String datasourceId) {
115
		this.datasourceId = datasourceId;
116
	}
117

    
118
	public String getDatasourceInterface() {
119
		return datasourceInterface;
120
	}
121

    
122
	public void setDatasourceInterface(final String datasourceInterface) {
123
		this.datasourceInterface = datasourceInterface;
124
	}
125

    
126
	@Required
127
	public void setXsltMappedResultSetFactory(final XSLTMappedResultSetFactory xsltMappedResultSetFactory) {
128
		this.xsltMappedResultSetFactory = xsltMappedResultSetFactory;
129
	}
130

    
131
	public Resource getMdBuilderTemplateXslt() {
132
		return mdBuilderTemplateXslt;
133
	}
134

    
135
	@Required
136
	public void setMdBuilderTemplateXslt(final Resource mdBuilderTemplateXslt) {
137
		this.mdBuilderTemplateXslt = mdBuilderTemplateXslt;
138
	}
139

    
140
}
(5-5/6)