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,35 @@ 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+ {
67+ throw new RuntimeException (e );
68+ }
69+ finally {
70+ // Restore the documentBuilderFactory class
71+ System .setProperty (
72+ "javax.xml.parsers.DocumentBuilderFactory" ,
73+ documentBuilderFactoryClass );
74+ }
75+ return result ;
76+ }
4677}
0 commit comments