1616import java .io .StringWriter ;
1717
1818public class TrAXPrettyPrinterStrategy extends AbstractXMLPrettyPrinterStrategy {
19+
20+ private static TransformerFactory TRANSFORMER_FACTORY = null ;
21+
1922 private int indent = 4 ;
2023 private boolean omitXmlDeclaration ;
2124
@@ -32,9 +35,8 @@ public String prettyPrint(String xml) throws Exception {
3235 }
3336
3437 protected Transformer newTransformer (final Document document ) throws TransformerConfigurationException {
35- final TransformerFactory transformerFactory = newTransformerFactory ();
3638
37- final Transformer transformer = transformerFactory .newTransformer ();
39+ final Transformer transformer = getTransformerFactory () .newTransformer ();
3840 transformer .setOutputProperty (OutputKeys .METHOD , "xml" );
3941 transformer .setOutputProperty (OutputKeys .ENCODING , "UTF-8" );
4042 transformer .setOutputProperty (OutputKeys .INDENT , "yes" );
@@ -43,6 +45,8 @@ protected Transformer newTransformer(final Document document) throws Transformer
4345 transformer .setOutputProperty ("{http://xml.apache.org/xslt}indent-amount" , String .valueOf (getIndent ()));
4446 }
4547 catch (IllegalArgumentException ignored ) {
48+ // maybe the exception should not be ignored?
49+ throw new RuntimeException (ignored );
4650 }
4751
4852 final DocumentType doctype = document .getDoctype ();
@@ -54,16 +58,18 @@ protected Transformer newTransformer(final Document document) throws Transformer
5458 return transformer ;
5559 }
5660
57- protected TransformerFactory newTransformerFactory () {
58- final TransformerFactory transformerFactory = TransformerFactory .newInstance ();
59- try {
60- transformerFactory .setAttribute ("indent-number" , getIndent ());
61- }
62- catch (IllegalArgumentException ignored ) {
63- }
64-
65- return transformerFactory ;
66- }
61+ // protected TransformerFactory newTransformerFactory() {
62+ // final TransformerFactory transformerFactory = TransformerFactory.newInstance();
63+ // TransformerFactory.newInstance(
64+ // "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null);
65+ // try {
66+ // transformerFactory.setAttribute("indent-number", getIndent());
67+ // }
68+ // catch (IllegalArgumentException ignored) {
69+ // }
70+ //
71+ // return transformerFactory;
72+ // }
6773
6874 public int getIndent () {
6975 return indent ;
@@ -80,4 +86,36 @@ public boolean isOmitXmlDeclaration() {
8086 public void setOmitXmlDeclaration (boolean omitXmlDeclaration ) {
8187 this .omitXmlDeclaration = omitXmlDeclaration ;
8288 }
89+
90+ private static TransformerFactory getTransformerFactory () {
91+ if (TRANSFORMER_FACTORY == null ) {
92+ TRANSFORMER_FACTORY = createTransformerFactory ();
93+ }
94+ return TRANSFORMER_FACTORY ;
95+ }
96+
97+ private static TransformerFactory createTransformerFactory () {
98+ TransformerFactory result = null ;
99+ // Save the transformerFactoryClass and set it to the default jre version
100+ String transformerFactoryClass = System .getProperty ( "javax.xml.transform.TransformerFactory" );
101+ if (transformerFactoryClass != null ) {
102+ System .clearProperty ( "javax.xml.transform.TransformerFactory" );
103+ assert System .getProperty ( "javax.xml.transform.TransformerFactory" ) == null ;
104+ }
105+ try {
106+ result = TransformerFactory .newInstance ();
107+ }
108+ finally {
109+ if (transformerFactoryClass != null ) {
110+ System .setProperty (
111+ "javax.xml.transform.TransformerFactory" ,
112+ transformerFactoryClass
113+ );
114+ assert transformerFactoryClass .equals (
115+ System .getProperty ( "javax.xml.transform.TransformerFactory" ));
116+ }
117+ }
118+ return result ;
119+ }
120+
83121}
0 commit comments