1414import javax .xml .transform .dom .DOMSource ;
1515import javax .xml .transform .stream .StreamResult ;
1616import java .io .StringWriter ;
17+ import java .util .logging .Logger ;
1718
1819public class TrAXPrettyPrinterStrategy extends AbstractXMLPrettyPrinterStrategy {
20+
21+ private static final Logger LOGGER = Logger .getLogger ( TrAXPrettyPrinterStrategy .class .getName () );
22+
23+ private static TransformerFactory TRANSFORMER_FACTORY = null ;
24+
1925 private int indent = 4 ;
2026 private boolean omitXmlDeclaration ;
2127
@@ -32,9 +38,8 @@ public String prettyPrint(String xml) throws Exception {
3238 }
3339
3440 protected Transformer newTransformer (final Document document ) throws TransformerConfigurationException {
35- final TransformerFactory transformerFactory = newTransformerFactory ();
3641
37- final Transformer transformer = transformerFactory .newTransformer ();
42+ final Transformer transformer = getTransformerFactory () .newTransformer ();
3843 transformer .setOutputProperty (OutputKeys .METHOD , "xml" );
3944 transformer .setOutputProperty (OutputKeys .ENCODING , "UTF-8" );
4045 transformer .setOutputProperty (OutputKeys .INDENT , "yes" );
@@ -43,6 +48,8 @@ protected Transformer newTransformer(final Document document) throws Transformer
4348 transformer .setOutputProperty ("{http://xml.apache.org/xslt}indent-amount" , String .valueOf (getIndent ()));
4449 }
4550 catch (IllegalArgumentException ignored ) {
51+ // maybe the exception should not be ignored?
52+ throw new RuntimeException (ignored );
4653 }
4754
4855 final DocumentType doctype = document .getDoctype ();
@@ -54,16 +61,18 @@ protected Transformer newTransformer(final Document document) throws Transformer
5461 return transformer ;
5562 }
5663
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- }
64+ // protected TransformerFactory newTransformerFactory() {
65+ // final TransformerFactory transformerFactory = TransformerFactory.newInstance();
66+ // TransformerFactory.newInstance(
67+ // "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null);
68+ // try {
69+ // transformerFactory.setAttribute("indent-number", getIndent());
70+ // }
71+ // catch (IllegalArgumentException ignored) {
72+ // }
73+ //
74+ // return transformerFactory;
75+ // }
6776
6877 public int getIndent () {
6978 return indent ;
@@ -80,4 +89,51 @@ public boolean isOmitXmlDeclaration() {
8089 public void setOmitXmlDeclaration (boolean omitXmlDeclaration ) {
8190 this .omitXmlDeclaration = omitXmlDeclaration ;
8291 }
92+
93+ private static TransformerFactory getTransformerFactory () {
94+ if (TRANSFORMER_FACTORY == null ) {
95+ TRANSFORMER_FACTORY = createTransformerFactory ();
96+ }
97+ return TRANSFORMER_FACTORY ;
98+ }
99+
100+ private static TransformerFactory createTransformerFactory () {
101+ TransformerFactory result = null ;
102+ // Save the transformerFactoryClass and set it to the default jre version
103+ String transformerFactoryClass = System .getProperty ( "javax.xml.transform.TransformerFactory" );
104+ LOGGER .info ( "TransformerFactory class is set to : " + transformerFactoryClass );
105+ if (transformerFactoryClass != null ) {
106+ System .clearProperty ( "javax.xml.transform.TransformerFactory" );
107+ assert System .getProperty ( "javax.xml.transform.TransformerFactory" ) == null ;
108+ }
109+ try {
110+ LOGGER .info (
111+ "Creating a transformer factory of class " +
112+ System .getProperty ( "javax.xml.transform.TransformerFactory" ));
113+ // The class name needs to be specified to assure the behavior on Oracle related systems where
114+ // the default class is 'oracle.xml.jaxp.JXSAXTransformerFactory'
115+ result = TransformerFactory .newInstance (
116+ "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl" ,
117+ null );
118+
119+ LOGGER .info ( "The class of the created transformer factory is : " + result .getClass ().getName ());
120+ }
121+ finally {
122+ if (transformerFactoryClass != null ) {
123+ System .setProperty (
124+ "javax.xml.transform.TransformerFactory" ,
125+ transformerFactoryClass
126+ );
127+ assert transformerFactoryClass .equals (
128+ System .getProperty ( "javax.xml.transform.TransformerFactory" ));
129+ }
130+
131+ LOGGER .info (
132+ "The default TransformerFactory class is now : " +
133+ System .getProperty ( "avax.xml.transform.TransformerFactory" ));
134+
135+ }
136+ return result ;
137+ }
138+
83139}
0 commit comments