]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/integration/XslTemplate.java
Move qualified name to JCR bundle
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / integration / XslTemplate.java
1 package org.argeo.cms.integration;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.io.OutputStream;
8
9 import javax.jcr.Node;
10 import javax.jcr.RepositoryException;
11 import javax.xml.transform.Result;
12 import javax.xml.transform.Source;
13 import javax.xml.transform.Transformer;
14 import javax.xml.transform.TransformerConfigurationException;
15 import javax.xml.transform.TransformerException;
16 import javax.xml.transform.TransformerFactory;
17 import javax.xml.transform.TransformerFactoryConfigurationError;
18 import javax.xml.transform.stream.StreamResult;
19 import javax.xml.transform.stream.StreamSource;
20
21 public class XslTemplate {
22 private Transformer transformer;
23
24 public XslTemplate(InputStream in, String systemId) {
25 this(loadTransformer(in, systemId));
26 }
27
28 public XslTemplate(Transformer transformer) {
29 this.transformer = transformer;
30 }
31
32 private static Transformer loadTransformer(InputStream in, String systemId) {
33 try {
34 TransformerFactory tFactory = TransformerFactory.newInstance();
35 StreamSource stylesource = new StreamSource(in, systemId);
36 return tFactory.newTransformer(stylesource);
37 } catch (TransformerConfigurationException | TransformerFactoryConfigurationError e) {
38 throw new IllegalArgumentException("Cannot initialise stylesheet with systemId " + systemId, e);
39 }
40 }
41
42 public synchronized void apply(Node node, OutputStream out) {
43 // TODO use a pool of Transformer instead of synchronized
44 try (ByteArrayOutputStream xml = new ByteArrayOutputStream()) {
45 node.getSession().exportDocumentView(node.getPath(), xml, true, false);
46 try (ByteArrayInputStream xmlIn = new ByteArrayInputStream(xml.toByteArray())) {
47 Source source = new StreamSource(xmlIn);
48 Result results = new StreamResult(out);
49 transformer.transform(source, results);
50 }
51 } catch (IOException | RepositoryException | TransformerException e) {
52 throw new RuntimeException("Cannot process XSL template on " + node, e);
53 }
54 }
55 }