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) {
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 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
75 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
76 handler.setResult(new StreamResult(out));
77 return handler;
78 } else {
79 LOG.warn("Failed to initialize XML serializer: " + SAXTransformerFactory.FEATURE + " not supported. " +
80 "Falling back to " + ToXmlContentHandler.class.getSimpleName());
81
82 return new ToXmlContentHandler(out, StandardCharsets.UTF_8.name());
83 }
84 } catch (TransformerConfigurationException | UnsupportedEncodingException e) {
85 throw new IllegalStateException("Failed to initialize XML serializer", e);
86 }
87 }
88
89 }