From 35b73a33763ca36f5836f8337bb2f01bbae669bc Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 1 Jan 2020 12:09:11 +0100 Subject: [PATCH] Introduce JCR XSL template --- .../argeo/cms/integration/XslTemplate.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java 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 index 000000000..c9802a2f5 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java @@ -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); + } + } +} -- 2.30.2