Project

General

Profile

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

    
3
import javax.annotation.Resource;
4
import javax.xml.ws.wsaddressing.W3CEndpointReference;
5

    
6
import com.googlecode.sarasvati.Arc;
7
import com.googlecode.sarasvati.NodeToken;
8
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
9
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
10
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
11
import eu.dnetlib.enabling.resultset.XSLTMappedResultSetFactory;
12
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
13
import eu.dnetlib.msro.rmi.MSROException;
14
import eu.dnetlib.msro.workflows.nodes.SimpleJobNode;
15
import org.antlr.stringtemplate.StringTemplate;
16
import org.apache.commons.logging.Log;
17
import org.apache.commons.logging.LogFactory;
18
import org.springframework.beans.factory.annotation.Required;
19

    
20
public class OpenaireMdBuilderJobNode extends SimpleJobNode {
21

    
22
	private static final Log log = LogFactory.getLog(OpenaireMdBuilderJobNode.class);
23

    
24
	private StringTemplate mdBuilderTemplateXslt;
25

    
26
	private String inputEprParam;
27
	private String outputEprParam;
28
	private String datasourceId;
29
	private String datasourceInterface;
30

    
31
	private boolean inferred = false;
32
	private boolean deletedbyinference = false;
33
	private String inferenceprovenance = "";
34
	private String trust = "";
35
	private String provenanceactionclassname = "";
36
	private String provenanceactionclassid = "";
37

    
38
	private String overridingMetadataIdentifierXPath = "";
39

    
40
	private XSLTMappedResultSetFactory xsltMappedResultSetFactory;
41

    
42
	@Resource
43
	private UniqueServiceLocator serviceLocator;
44

    
45
	@Override
46
	protected String execute(final NodeToken token) throws MSROException {
47
		final String inputEpr = token.getEnv().getAttribute(inputEprParam);
48

    
49
		if ((inputEpr == null) || inputEpr.isEmpty()) throw new MSROException("InputEprParam (" + inputEprParam + ") not found in ENV");
50

    
51
		try {
52
			final StringTemplate st = new StringTemplate(getMdBuilderTemplateXslt().getTemplate());
53

    
54
			st.setAttribute("xpath", getMetadataIdentifierXPath());
55
			st.setAttribute("datasourceId", datasourceId);
56
			if (token.getEnv().hasAttribute("namespacePrefix")) {
57
				st.setAttribute("namespacePrefix", token.getEnv().getAttribute("namespacePrefix"));
58
			} else {
59
				st.setAttribute("namespacePrefix", datasourceId);
60
			}
61

    
62
			st.setAttribute("inferred", String.valueOf(getInferred()));
63
			st.setAttribute("deletedbyinference", String.valueOf(getDeletedbyinference()));
64
			st.setAttribute("inferenceprovenance", getInferenceprovenance());
65
			st.setAttribute("trust", getTrust());
66
			st.setAttribute("provenanceactionclassname", getProvenanceactionclassname());
67
			st.setAttribute("provenanceactionclassid", getProvenanceactionclassid());
68
			st.setAttribute("baseurl", getBaseUrl());
69
			st.setAttribute("metadatanamespace", getMetadataNamespace());
70

    
71
			final W3CEndpointReference epr = xsltMappedResultSetFactory.createMappedResultSet(new EPRUtils().getEpr(inputEpr), st.toString());
72

    
73
			token.getEnv().setAttribute(outputEprParam, epr.toString());
74

    
75
			return Arc.DEFAULT_ARC;
76
		} catch (ISLookUpException e) {
77
			throw new MSROException("Error while initializing mdBuilder template for datasource " + datasourceId, e);
78
		}
79
	}
80

    
81
	private String getMetadataIdentifierXPath() throws ISLookUpException {
82
		String xQuery =
83
				String.format("for $x in collection('/db/DRIVER/RepositoryServiceResources/RepositoryServiceResourceType') "
84
						+ "return $x//INTERFACE[@id='%s']/INTERFACE_EXTRA_FIELD[@name='metadata_identifier_path']/string()", getDatasourceInterface());
85

    
86
		return hasOverridingMetadataIdentifierXPath() ? getOverridingMetadataIdentifierXPath() : serviceLocator.getService(ISLookUpService.class)
87
				.getResourceProfileByQuery(xQuery);
88
	}
89

    
90
	private String getBaseUrl() throws ISLookUpException {
91
		String xQuery = "/*[.//RESOURCE_IDENTIFIER/@value='{datasourceId}']//INTERFACE[@id='{interfaceId}']//BASE_URL/string()";
92
		xQuery = xQuery.replace("{interfaceId}", datasourceInterface).replace("{datasourceId}", datasourceId);
93
		return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(xQuery);
94
	}
95

    
96
	private String getMetadataNamespace() {
97
		try {
98
			String xQuery =
99
					"let $x := /*[.//RESOURCE_IDENTIFIER/@value='{datasourceId}']//INTERFACE[@id='{interfaceId}']/ACCESS_PROTOCOL/@format/string() "
100
							+ "return /*[.//RESOURCE_TYPE/@value='MetadataFormatDSResourceType']//METADATAFORMAT[@Prefix=$x]/@NameSpace/string()";
101
			xQuery = xQuery.replace("{interfaceId}", datasourceInterface).replace("{datasourceId}", datasourceId);
102
			return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(xQuery);
103
		} catch (ISLookUpException e) {
104
			log.error("The interface is not OAI or the format is not found in the MetadataFormatDSResourceType, thus metadata format in the <about> section "
105
					+ "cannot managed here and it will be leaved empty (for the time being)");
106
			return "";
107
		}
108
	}
109

    
110
	private boolean hasOverridingMetadataIdentifierXPath() {
111
		return !getOverridingMetadataIdentifierXPath().isEmpty();
112
	}
113

    
114
	public String getInputEprParam() {
115
		return inputEprParam;
116
	}
117

    
118
	public void setInputEprParam(final String inputEprParam) {
119
		this.inputEprParam = inputEprParam;
120
	}
121

    
122
	public String getOutputEprParam() {
123
		return outputEprParam;
124
	}
125

    
126
	public void setOutputEprParam(final String outputEprParam) {
127
		this.outputEprParam = outputEprParam;
128
	}
129

    
130
	public XSLTMappedResultSetFactory getXsltMappedResultSetFactory() {
131
		return xsltMappedResultSetFactory;
132
	}
133

    
134
	public String getDatasourceId() {
135
		return datasourceId;
136
	}
137

    
138
	public void setDatasourceId(final String datasourceId) {
139
		this.datasourceId = datasourceId;
140
	}
141

    
142
	public String getDatasourceInterface() {
143
		return datasourceInterface;
144
	}
145

    
146
	public void setDatasourceInterface(final String datasourceInterface) {
147
		this.datasourceInterface = datasourceInterface;
148
	}
149

    
150
	@Required
151
	public void setXsltMappedResultSetFactory(final XSLTMappedResultSetFactory xsltMappedResultSetFactory) {
152
		this.xsltMappedResultSetFactory = xsltMappedResultSetFactory;
153
	}
154

    
155
	public StringTemplate getMdBuilderTemplateXslt() {
156
		return mdBuilderTemplateXslt;
157
	}
158

    
159
	public void setMdBuilderTemplateXslt(final StringTemplate mdBuilderTemplateXslt) {
160
		this.mdBuilderTemplateXslt = mdBuilderTemplateXslt;
161
	}
162

    
163
	public boolean getInferred() {
164
		return inferred;
165
	}
166

    
167
	public void setInferred(final boolean inferred) {
168
		this.inferred = inferred;
169
	}
170

    
171
	public boolean getDeletedbyinference() {
172
		return deletedbyinference;
173
	}
174

    
175
	public void setDeletedbyinference(final boolean deletedbyinference) {
176
		this.deletedbyinference = deletedbyinference;
177
	}
178

    
179
	public String getInferenceprovenance() {
180
		return inferenceprovenance;
181
	}
182

    
183
	public void setInferenceprovenance(final String inferenceprovenance) {
184
		this.inferenceprovenance = inferenceprovenance;
185
	}
186

    
187
	public String getTrust() {
188
		return trust;
189
	}
190

    
191
	public void setTrust(final String trust) {
192
		this.trust = trust;
193
	}
194

    
195
	public String getProvenanceactionclassname() {
196
		return provenanceactionclassname;
197
	}
198

    
199
	public void setProvenanceactionclassname(final String provenanceactionclassname) {
200
		this.provenanceactionclassname = provenanceactionclassname;
201
	}
202

    
203
	public String getProvenanceactionclassid() {
204
		return provenanceactionclassid;
205
	}
206

    
207
	public void setProvenanceactionclassid(final String provenanceactionclassid) {
208
		this.provenanceactionclassid = provenanceactionclassid;
209
	}
210

    
211
	public String getOverridingMetadataIdentifierXPath() {
212
		return overridingMetadataIdentifierXPath;
213
	}
214

    
215
	public void setOverridingMetadataIdentifierXPath(final String overridingMetadataIdentifierXPath) {
216
		this.overridingMetadataIdentifierXPath = overridingMetadataIdentifierXPath;
217
	}
218

    
219
}
(11-11/24)