Project

General

Profile

1 26600 sandro.lab
package eu.dnetlib.msro.workflows.nodes.index;
2
3
import java.io.IOException;
4
import java.io.StringReader;
5
import java.io.StringWriter;
6
7 32639 michele.ar
import javax.annotation.Resource;
8 26600 sandro.lab
import javax.xml.transform.Transformer;
9
import javax.xml.transform.TransformerConfigurationException;
10
import javax.xml.transform.TransformerException;
11
import javax.xml.transform.TransformerFactory;
12
import javax.xml.transform.dom.DOMResult;
13
import javax.xml.transform.dom.DOMSource;
14
import javax.xml.transform.stream.StreamResult;
15
import javax.xml.transform.stream.StreamSource;
16
import javax.xml.ws.wsaddressing.W3CEndpointReference;
17
18
import org.apache.commons.codec.binary.Base64;
19
import org.apache.commons.logging.Log;
20
import org.apache.commons.logging.LogFactory;
21
import org.springframework.beans.factory.annotation.Required;
22
23
import com.googlecode.sarasvati.NodeToken;
24
25 32877 michele.ar
import eu.dnetlib.data.provision.index.rmi.IndexService;
26 26600 sandro.lab
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpDocumentNotFoundException;
27
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException;
28
import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService;
29 32639 michele.ar
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
30 26600 sandro.lab
import eu.dnetlib.enabling.resultset.XSLTMappedResultSetFactory;
31
import eu.dnetlib.enabling.resultset.client.utils.EPRUtils;
32
import eu.dnetlib.enabling.resultset.rmi.ResultSetException;
33
import eu.dnetlib.enabling.tools.blackboard.BlackboardJob;
34
import eu.dnetlib.msro.workflows.nodes.BlackboardJobNode;
35
import eu.dnetlib.msro.workflows.nodes.ProgressJobNode;
36
import eu.dnetlib.msro.workflows.resultset.ProcessCountingResultSetFactory;
37
import eu.dnetlib.msro.workflows.util.ProgressProvider;
38
import eu.dnetlib.msro.workflows.util.ResultsetProgressProvider;
39
40
public class UpdateIndexJobNode extends BlackboardJobNode implements ProgressJobNode {
41
42
	private static final Log log = LogFactory.getLog(UpdateIndexJobNode.class);
43
44
	private String eprParam;
45
	private String indexId;
46
	private String format;
47
	private String layout;
48
	private String feedingType;
49 29694 sandro.lab
	private String defaultIndexId;
50 26600 sandro.lab
51
	/**
52
	 * xslt mapped resultset factory.
53
	 */
54
	private XSLTMappedResultSetFactory xsltRSFactory;
55
56
	private ProcessCountingResultSetFactory processCountingResultSetFactory;
57
	private ResultsetProgressProvider progressProvider;
58
59
	/**
60
	 * Stylesheet which transforms a layout to another stylesheet which converts a input record to a index record.
61
	 */
62
	private org.springframework.core.io.Resource layoutToRecordStylesheet;
63
64
	/**
65 32639 michele.ar
	 * service locator.
66 26600 sandro.lab
	 */
67 32639 michele.ar
	@Resource
68
	private UniqueServiceLocator serviceLocator;
69 26600 sandro.lab
70
	@Override
71 32877 michele.ar
	protected String obtainServiceId(final NodeToken token) {
72
		return getServiceLocator().getServiceId(IndexService.class);
73 26600 sandro.lab
	}
74
75
	@Override
76
	protected void prepareJob(final BlackboardJob job, final NodeToken token) throws ResultSetException, ISLookUpException, IOException, TransformerException {
77
		log.info("preparing blackboard job update index: " + getIndexId());
78
79
		final W3CEndpointReference epr = new EPRUtils().getEpr(token.getEnv().getAttribute(getEprParam()));
80
81
		final W3CEndpointReference mappedEpr = prepareForIndexing(epr, getFormat(), getLayout());
82
83
		progressProvider = processCountingResultSetFactory.createProgressProvider(token.getProcess(), mappedEpr);
84
85
		job.setAction("FEED");
86
		job.getParameters().put("resultset_epr", encode(progressProvider.getEpr().toString()));
87
		job.getParameters().put("id", getIndexId());
88
		job.getParameters().put("feeding_type", getFeedingType());
89 29694 sandro.lab
		job.getParameters().put("backend_Id", defaultIndexId);
90 26600 sandro.lab
	}
91
92
	// helpers
93
94
	/**
95
	 * Transforms each mdstore record into a index record.
96 32639 michele.ar
	 *
97 26600 sandro.lab
	 * @param mdStoreRsetEpr
98
	 *            mdstore resulsetset
99
	 * @param layout
100
	 *            layout
101
	 * @param format
102
	 *            format
103
	 * @return resultset with transformed records
104
	 * @throws ISLookUpException
105
	 *             could happen
106
	 * @throws IOException
107
	 *             could happen
108
	 * @throws TransformerException
109
	 *             could happen
110
	 */
111
	protected W3CEndpointReference prepareForIndexing(final W3CEndpointReference mdStoreRsetEpr, final String format, final String layout)
112
			throws ISLookUpException, IOException, TransformerException {
113
114
		final TransformerFactory factory = TransformerFactory.newInstance();
115
		final Transformer layoutTransformer = factory.newTransformer(new StreamSource(getLayoutToRecordStylesheet().getInputStream()));
116
117
		final DOMResult layoutToXsltXslt = new DOMResult();
118
		layoutTransformer.setParameter("format", format);
119
		layoutTransformer.transform(new StreamSource(new StringReader(getLayoutSource(format, layout))), layoutToXsltXslt);
120
121
		dumpXslt(factory, layoutToXsltXslt);
122
123
		return getXsltRSFactory().createMappedResultSet(mdStoreRsetEpr, new DOMSource(layoutToXsltXslt.getNode()),
124
				"dynamic layout xslt for " + format + ", " + layout);
125
	}
126
127
	private String getLayoutSource(final String format, final String layout) throws ISLookUpDocumentNotFoundException, ISLookUpException {
128 32639 michele.ar
		return serviceLocator.getService(ISLookUpService.class).getResourceProfileByQuery(
129 29694 sandro.lab
				"collection('')//RESOURCE_PROFILE[.//RESOURCE_TYPE/@value = 'MDFormatDSResourceType' and .//NAME='" + format + "']//LAYOUT[@name='" + layout
130 32639 michele.ar
						+ "']");
131 26600 sandro.lab
	}
132
133
	private void dumpXslt(final TransformerFactory factory, final DOMResult layoutToXsltXslt) throws TransformerConfigurationException, TransformerException {
134
		if (log.isDebugEnabled()) {
135
			final StringWriter buffer = new StringWriter();
136
			factory.newTransformer().transform(new DOMSource(layoutToXsltXslt.getNode()), new StreamResult(buffer));
137
			log.debug(buffer.toString());
138
		}
139
	}
140
141
	private String encode(final String epr) {
142
		return new String(Base64.encodeBase64(epr.getBytes()));
143
	}
144
145
	// setters and getters
146
147
	public String getIndexId() {
148
		return indexId;
149
	}
150
151
	public void setIndexId(final String indexId) {
152
		this.indexId = indexId;
153
	}
154
155
	public String getEprParam() {
156
		return eprParam;
157
	}
158
159
	public void setEprParam(final String eprParam) {
160
		this.eprParam = eprParam;
161
	}
162
163
	public String getFeedingType() {
164
		return feedingType;
165
	}
166
167
	public void setFeedingType(final String feedingType) {
168
		this.feedingType = feedingType;
169
	}
170
171
	public ProcessCountingResultSetFactory getProcessCountingResultSetFactory() {
172
		return processCountingResultSetFactory;
173
	}
174
175
	@Required
176
	public void setProcessCountingResultSetFactory(final ProcessCountingResultSetFactory processCountingResultSetFactory) {
177
		this.processCountingResultSetFactory = processCountingResultSetFactory;
178
	}
179
180
	@Override
181
	public ProgressProvider getProgressProvider() {
182
		return progressProvider;
183
	}
184
185
	public org.springframework.core.io.Resource getLayoutToRecordStylesheet() {
186
		return layoutToRecordStylesheet;
187
	}
188
189
	@Required
190
	public void setLayoutToRecordStylesheet(final org.springframework.core.io.Resource layoutToRecordStylesheet) {
191
		this.layoutToRecordStylesheet = layoutToRecordStylesheet;
192
	}
193
194
	public String getFormat() {
195
		return format;
196
	}
197
198
	public void setFormat(final String format) {
199
		this.format = format;
200
	}
201
202
	public String getLayout() {
203
		return layout;
204
	}
205
206
	public void setLayout(final String layout) {
207
		this.layout = layout;
208
	}
209
210
	public XSLTMappedResultSetFactory getXsltRSFactory() {
211
		return xsltRSFactory;
212
	}
213
214
	@Required
215
	public void setXsltRSFactory(final XSLTMappedResultSetFactory xsltRSFactory) {
216
		this.xsltRSFactory = xsltRSFactory;
217
	}
218
219 29694 sandro.lab
	/**
220
	 * @return the defaultIndexId
221
	 */
222
	public String getDefaultIndexId() {
223
		return defaultIndexId;
224
	}
225
226
	/**
227
	 * @param defaultIndexId
228
	 *            the defaultIndexId to set
229
	 */
230
	@Required
231
	public void setDefaultIndexId(final String defaultIndexId) {
232
		this.defaultIndexId = defaultIndexId;
233
	}
234
235 26600 sandro.lab
}