Introduce JCR XSL template
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 1 Jan 2020 11:09:11 +0000 (12:09 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 1 Jan 2020 11:09:11 +0000 (12:09 +0100)
org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java [new file with mode: 0644]

diff --git a/org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java b/org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java
new file mode 100644 (file)
index 0000000..c9802a2
--- /dev/null
@@ -0,0 +1,55 @@
+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);
+               }
+       }
+}