2222
2323public abstract class AbstractXMLPrettyPrinterStrategy implements XMLPrettyPrinterStrategy {
2424
25+ private static DocumentBuilderFactory documentBuilderFactory = null ;
26+
2527 protected Document newDocument (String xml , String encoding ) throws SAXException , IOException , ParserConfigurationException {
26- final DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
27- dbf .setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd" , false );
28- final Document document = dbf
28+ final Document document = getDocumentBuilderFactory ()
2929 .newDocumentBuilder ()
3030 .parse (new InputSource (new ByteArrayInputStream (xml .getBytes (encoding ))));
3131 document .normalize ();
@@ -43,4 +43,39 @@ protected void removeWhitespace(final Document document) throws XPathExpressionE
4343 node .getParentNode ().removeChild (node );
4444 }
4545 }
46+
47+ private static DocumentBuilderFactory getDocumentBuilderFactory () {
48+ if (documentBuilderFactory == null ) {
49+ documentBuilderFactory = createDocumentBuilderFactory ();
50+ }
51+ return documentBuilderFactory ;
52+ }
53+
54+ private static DocumentBuilderFactory createDocumentBuilderFactory () {
55+ DocumentBuilderFactory result = null ;
56+ // Save the documentBuilderFactoryClass and set it to the default jre version
57+ String documentBuilderFactoryClass = System .getProperty ( "javax.xml.parsers.DocumentBuilderFactory" );
58+ System .setProperty (
59+ "javax.xml.parsers.DocumentBuilderFactory" ,
60+ "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl" );
61+ try {
62+ result = DocumentBuilderFactory .newInstance ();
63+ result .setFeature ("http://apache.org/xml/features/nonvalidating/load-external-dtd" , false );
64+ }
65+ catch (ParserConfigurationException e ) {
66+ throw new RuntimeException (e );
67+ }
68+ finally {
69+ // Restore the documentBuilderFactory class
70+ if (documentBuilderFactoryClass != null ) {
71+ System .setProperty (
72+ "javax.xml.parsers.DocumentBuilderFactory" ,
73+ documentBuilderFactoryClass );
74+ }
75+ else {
76+ System .clearProperty ( "javax.xml.parsers.DocumentBuilderFactory" );
77+ }
78+ }
79+ return result ;
80+ }
4681}
0 commit comments