--- /dev/null
+package org.argeo.cms.integration;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.xml.transform.Result;
+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.TransformerFactoryConfigurationError;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+public class XslTemplate {
+ private Transformer transformer;
+
+ public XslTemplate(InputStream in, String systemId) {
+ this(loadTransformer(in, systemId));
+ }
+
+ public XslTemplate(Transformer transformer) {
+ this.transformer = transformer;
+ }
+
+ private static Transformer loadTransformer(InputStream in, String systemId) {
+ try {
+ TransformerFactory tFactory = TransformerFactory.newInstance();
+ StreamSource stylesource = new StreamSource(in, systemId);
+ return tFactory.newTransformer(stylesource);
+ } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
+ throw new IllegalArgumentException("Cannot initialise stylesheet with systemId " + systemId, e);
+ }
+ }
+
+ public synchronized void apply(Node node, OutputStream out) {
+ // TODO use a pool of Transformer instead of synchronized
+ try (ByteArrayOutputStream xml = new ByteArrayOutputStream()) {
+ node.getSession().exportDocumentView(node.getPath(), xml, true, false);
+ try (ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.toByteArray())) {
+ Source source = new StreamSource(xmlIn);
+ Result results = new StreamResult(out);
+ transformer.transform(source, results);
+ }
+ } catch (IOException | RepositoryException | TransformerException e) {
+ throw new RuntimeException("Cannot process XSL template on " + node, e);
+ }
+ }
+}