1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.importexport.contenthandler;
35
36 import java.io.OutputStream;
37 import java.io.UnsupportedEncodingException;
38 import java.nio.charset.StandardCharsets;
39
40 import javax.xml.transform.OutputKeys;
41 import javax.xml.transform.Transformer;
42 import javax.xml.transform.TransformerConfigurationException;
43 import javax.xml.transform.TransformerFactory;
44 import javax.xml.transform.sax.SAXTransformerFactory;
45 import javax.xml.transform.sax.TransformerHandler;
46 import javax.xml.transform.stream.StreamResult;
47
48 import org.apache.jackrabbit.commons.xml.ToXmlContentHandler;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51 import org.xml.sax.ContentHandler;
52
53
54
55
56
57
58
59
60
61
62 public class XmlContentHandlerFactory {
63 private static final Logger LOG = LoggerFactory.getLogger(XmlContentHandlerFactory.class);
64
65 public static ContentHandler newXmlContentHandler(OutputStream out, boolean prettyPrint) {
66 try {
67 TransformerFactory transformerFactory = TransformerFactory.newInstance();
68 if (transformerFactory.getFeature(SAXTransformerFactory.FEATURE)) {
69 TransformerHandler handler = ((SAXTransformerFactory) transformerFactory).newTransformerHandler();
70 Transformer transformer = handler.getTransformer();
71 transformer.setOutputProperty(OutputKeys.METHOD, "xml");
72 transformer.setOutputProperty(OutputKeys.ENCODING, StandardCharsets.UTF_8.name());
73 transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
74 if (prettyPrint) {
75 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
76 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
77 } else {
78 transformer.setOutputProperty(OutputKeys.INDENT, "no");
79 }
80 handler.setResult(new StreamResult(out));
81 return handler;
82 } else {
83 LOG.warn("Failed to initialize XML serializer: " + SAXTransformerFactory.FEATURE + " not supported. " +
84 "Falling back to " + ToXmlContentHandler.class.getSimpleName());
85
86 return new ToXmlContentHandler(out, StandardCharsets.UTF_8.name());
87 }
88 } catch (TransformerConfigurationException | UnsupportedEncodingException e) {
89 throw new IllegalStateException("Failed to initialize XML serializer", e);
90 }
91 }
92
93 }