package cz.nkp.differ.compare.metadata.external;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
*
* @author xrosecky
*/
public class XSLTTransformer implements ResultTransformer {
private String stylesheet;
private ResourceLoader resourceLoader = new DefaultResourceLoader();
public String getStylesheet() {
return stylesheet;
}
public void setStylesheet(String stylesheet) {
this.stylesheet = stylesheet;
}
@Override
public List<Entry> transform(byte[] stdout, byte[] stderr) throws IOException {
Resource resource = resourceLoader.getResource(stylesheet);
if (stylesheet == null) {
throw new NullPointerException("stylesheet");
}
List<Entry> entries = new ArrayList<Entry>();
try {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(resource.getInputStream());
Transformer transformer = factory.newTransformer(xslt);
Source src = new StreamSource(new ByteArrayInputStream(stdout));
ByteArrayOutputStream os = new ByteArrayOutputStream();
transformer.transform(src, new StreamResult(os));
System.err.println(new String(os.toByteArray()));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(new ByteArrayInputStream(os.toByteArray()));
NodeList nodeList = doc.getElementsByTagName("property");
for (int index = 0; index < nodeList.getLength(); index++) {
Node node = nodeList.item(index);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String key = node.getAttributes().getNamedItem("name").getNodeValue();
String source = null;
if (node.getAttributes().getNamedItem("source") != null) {
source = node.getAttributes().getNamedItem("source").getNodeValue();
}
String value = node.getTextContent();
Entry entry = new Entry();
entry.setKey(key);
entry.setValue(value);
entry.setSource(source);
entries.add(entry);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return entries;
}
}