package eu.europeana.cloud.service.dps.storm.xslt;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.nio.charset.Charset;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.europeana.cloud.service.dps.PluginParameterKeys;
import eu.europeana.cloud.service.dps.storm.AbstractDpsBolt;
import eu.europeana.cloud.service.dps.storm.StormTaskTuple;
import eu.europeana.cloud.service.dps.util.LRUCache;
public class XsltBolt extends AbstractDpsBolt {
public static final Logger LOGGER = LoggerFactory.getLogger(XsltBolt.class);
private static LRUCache<String, Transformer> cache = new LRUCache<String, Transformer>(
50);
@Override
public void execute(StormTaskTuple t) {
InputStream stream = null;
try {
String fileUrl = t.getFileUrl();
byte[] fileContent = t.getFileData();
String xsltUrl = t.getParameter(PluginParameterKeys.XSLT_URL);
LOGGER.info("processing file: {} with xslt schema:{}", fileUrl, xsltUrl);
Transformer transformer;
if (cache.containsKey(xsltUrl)) {
transformer = cache.get(xsltUrl);
} else {
Source xslDoc = new StreamSource(new URL(xsltUrl).openStream());
TransformerFactory tFactory = TransformerFactory.newInstance();
transformer = tFactory.newTransformer(xslDoc);
cache.put(xsltUrl, transformer);
}
stream = new ByteArrayInputStream(fileContent);
Source xmlDoc = new StreamSource(stream);
StringWriter writer = new StringWriter();
transformer.transform(xmlDoc, new StreamResult(writer));
LOGGER.info("XsltBolt: transformation success for: {}", fileUrl);
t.setFileData(writer.toString().getBytes(Charset.forName("UTF-8")));
outputCollector.emit(inputTuple, t.toStormTuple());
} catch (TransformerConfigurationException e) {
LOGGER.error("XsltBolt error:" + e.getMessage());
emitDropNotification(t.getTaskId(), "", e.getMessage(), t
.getParameters().toString());
} catch (TransformerException e) {
LOGGER.error("XsltBolt error:" + e.getMessage());
emitDropNotification(t.getTaskId(), "", e.getMessage(), t
.getParameters().toString());
} catch (Exception e) {
LOGGER.error("XsltBolt error:" + e.getMessage());
emitDropNotification(t.getTaskId(), "", e.getMessage(), t
.getParameters().toString());
} finally {
if (stream != null)
try {
stream.close();
} catch (IOException e) {
LOGGER.error("error: during closing the stream" + e.getMessage());
}
}
}
@Override
public void prepare() {
}
}