Project

General

Profile

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

    
3
import java.io.IOException;
4
import java.io.StringReader;
5
import java.io.StringWriter;
6
import javax.annotation.Resource;
7
import javax.xml.transform.Transformer;
8
import javax.xml.transform.TransformerConfigurationException;
9
import javax.xml.transform.TransformerException;
10
import javax.xml.transform.TransformerFactory;
11
import javax.xml.transform.dom.DOMResult;
12
import javax.xml.transform.dom.DOMSource;
13
import javax.xml.transform.stream.StreamResult;
14
import javax.xml.transform.stream.StreamSource;
15
import javax.xml.ws.wsaddressing.W3CEndpointReference;
16

    
17
import eu.dnetlib.data.provision.index.rmi.IndexService;
18
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
19
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
20
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
21
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
22
import eu.dnetlib.enabling.resultset.XSLTMappedResultSetFactory;
23
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
24
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
25
import eu.dnetlib.enabling.tools.blackboard.BlackboardJob;
26
import eu.dnetlib.msro.workflows.graph.Env;
27
import eu.dnetlib.msro.workflows.graph.Process;
28
import eu.dnetlib.msro.workflows.graph.ProcessAware;
29
import eu.dnetlib.msro.workflows.nodes.BlackboardJobNode;
30
import eu.dnetlib.msro.workflows.nodes.ProgressJobNode;
31
import eu.dnetlib.msro.workflows.resultset.ProcessCountingResultSetFactory;
32
import eu.dnetlib.msro.workflows.util.ProgressProvider;
33
import eu.dnetlib.msro.workflows.util.ResultsetProgressProvider;
34
import org.apache.commons.codec.binary.Base64;
35
import org.apache.commons.logging.Log;
36
import org.apache.commons.logging.LogFactory;
37
import org.springframework.beans.factory.annotation.Required;
38

    
39
public class UpdateIndexJobNode extends BlackboardJobNode implements ProgressJobNode, ProcessAware {
40

    
41
	private static final Log log = LogFactory.getLog(UpdateIndexJobNode.class);
42

    
43
	private String eprParam;
44
	private String indexId;
45
	private String format;
46
	private String layout;
47
	private String feedingType;
48
	private String defaultIndexId;
49

    
50
	/**
51
	 * xslt mapped resultset factory.
52
	 */
53
	private XSLTMappedResultSetFactory xsltRSFactory;
54

    
55
	private ProcessCountingResultSetFactory processCountingResultSetFactory;
56
	private ResultsetProgressProvider progressProvider;
57

    
58
	/**
59
	 * Stylesheet which transforms a layout to another stylesheet which converts a input record to a index record.
60
	 */
61
	private org.springframework.core.io.Resource layoutToRecordStylesheet;
62

    
63
	/**
64
	 * service locator.
65
	 */
66
	@Resource
67
	private UniqueServiceLocator serviceLocator;
68

    
69
	private Process process;
70

    
71
	@Override
72
	protected String obtainServiceId(final Env env) {
73
		return getServiceLocator().getServiceId(IndexService.class);
74
	}
75

    
76
	@Override
77
	protected void prepareJob(final BlackboardJob job, final Env env) throws ResultSetException, ISLookUpException, IOException, TransformerException {
78
		log.info("preparing blackboard job update index: " + getIndexId());
79

    
80
		final W3CEndpointReference epr = new EPRUtils().getEpr(env.getAttribute(getEprParam(), String.class));
81

    
82
		final W3CEndpointReference mappedEpr = prepareForIndexing(epr, getFormat(), getLayout());
83

    
84
		progressProvider = processCountingResultSetFactory.createProgressProvider(process, mappedEpr);
85

    
86
		job.setAction("FEED");
87
		job.getParameters().put("resultset_epr", encode(progressProvider.getEpr().toString()));
88
		job.getParameters().put("id", getIndexId());
89
		job.getParameters().put("feeding_type", getFeedingType());
90
		job.getParameters().put("backend_Id", defaultIndexId);
91
	}
92

    
93
	// helpers
94

    
95
	/**
96
	 * Transforms each mdstore record into a index record.
97
	 *
98
	 * @param mdStoreRsetEpr mdstore resulsetset
99
	 * @param layout         layout
100
	 * @param format         format
101
	 * @return resultset with transformed records
102
	 * @throws ISLookUpException    could happen
103
	 * @throws IOException          could happen
104
	 * @throws TransformerException could happen
105
	 */
106
	protected W3CEndpointReference prepareForIndexing(final W3CEndpointReference mdStoreRsetEpr, final String format, final String layout)
107
			throws ISLookUpException, IOException, TransformerException {
108

    
109
		final TransformerFactory factory = TransformerFactory.newInstance();
110
		final Transformer layoutTransformer = factory.newTransformer(new StreamSource(getLayoutToRecordStylesheet().getInputStream()));
111

    
112
		final DOMResult layoutToXsltXslt = new DOMResult();
113
		layoutTransformer.setParameter("format", format);
114
		layoutTransformer.transform(new StreamSource(new StringReader(getLayoutSource(format, layout))), layoutToXsltXslt);
115

    
116
		dumpXslt(factory, layoutToXsltXslt);
117

    
118
		return getXsltRSFactory().createMappedResultSet(mdStoreRsetEpr, new DOMSource(layoutToXsltXslt.getNode()),
119
				"dynamic layout xslt for " + format + ", " + layout);
120
	}
121

    
122
	private String getLayoutSource(final String format, final String layout) throws ISLookUpDocumentNotFoundException, ISLookUpException {
123
		return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(
124
				"collection('')//RESOURCE_PROFILE[.//RESOURCE_TYPE/@value = 'MDFormatDSResourceType' and .//NAME='" + format + "']//LAYOUT[@name='" + layout
125
						+ "']");
126
	}
127

    
128
	private void dumpXslt(final TransformerFactory factory, final DOMResult layoutToXsltXslt) throws TransformerConfigurationException, TransformerException {
129
		if (log.isDebugEnabled()) {
130
			final StringWriter buffer = new StringWriter();
131
			factory.newTransformer().transform(new DOMSource(layoutToXsltXslt.getNode()), new StreamResult(buffer));
132
			log.debug(buffer.toString());
133
		}
134
	}
135

    
136
	private String encode(final String epr) {
137
		return new String(Base64.encodeBase64(epr.getBytes()));
138
	}
139

    
140
	// setters and getters
141

    
142
	public String getIndexId() {
143
		return indexId;
144
	}
145

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

    
150
	public String getEprParam() {
151
		return eprParam;
152
	}
153

    
154
	public void setEprParam(final String eprParam) {
155
		this.eprParam = eprParam;
156
	}
157

    
158
	public String getFeedingType() {
159
		return feedingType;
160
	}
161

    
162
	public void setFeedingType(final String feedingType) {
163
		this.feedingType = feedingType;
164
	}
165

    
166
	public ProcessCountingResultSetFactory getProcessCountingResultSetFactory() {
167
		return processCountingResultSetFactory;
168
	}
169

    
170
	@Required
171
	public void setProcessCountingResultSetFactory(final ProcessCountingResultSetFactory processCountingResultSetFactory) {
172
		this.processCountingResultSetFactory = processCountingResultSetFactory;
173
	}
174

    
175
	@Override
176
	public ProgressProvider getProgressProvider() {
177
		return progressProvider;
178
	}
179

    
180
	public org.springframework.core.io.Resource getLayoutToRecordStylesheet() {
181
		return layoutToRecordStylesheet;
182
	}
183

    
184
	@Required
185
	public void setLayoutToRecordStylesheet(final org.springframework.core.io.Resource layoutToRecordStylesheet) {
186
		this.layoutToRecordStylesheet = layoutToRecordStylesheet;
187
	}
188

    
189
	public String getFormat() {
190
		return format;
191
	}
192

    
193
	public void setFormat(final String format) {
194
		this.format = format;
195
	}
196

    
197
	public String getLayout() {
198
		return layout;
199
	}
200

    
201
	public void setLayout(final String layout) {
202
		this.layout = layout;
203
	}
204

    
205
	public XSLTMappedResultSetFactory getXsltRSFactory() {
206
		return xsltRSFactory;
207
	}
208

    
209
	@Required
210
	public void setXsltRSFactory(final XSLTMappedResultSetFactory xsltRSFactory) {
211
		this.xsltRSFactory = xsltRSFactory;
212
	}
213

    
214
	/**
215
	 * @return the defaultIndexId
216
	 */
217
	public String getDefaultIndexId() {
218
		return defaultIndexId;
219
	}
220

    
221
	/**
222
	 * @param defaultIndexId the defaultIndexId to set
223
	 */
224
	@Required
225
	public void setDefaultIndexId(final String defaultIndexId) {
226
		this.defaultIndexId = defaultIndexId;
227
	}
228

    
229
	@Override
230
	public void setProcess(final Process process) {
231
		this.process = process;
232
	}
233
}
(4-4/4)