diff --git a/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java b/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java index 83d5038b..c328e99a 100644 --- a/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java +++ b/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java @@ -22,10 +22,13 @@ import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.util.Assert; + /** * Convenient base class for objects that use a Transformer. Subclasses can call {@link * #createTransformer()} or {@link #transform(Source, Result)}. This should be done per thread (i.e. per incoming @@ -40,10 +43,48 @@ public abstract class TransformerObjectSupport { /** Logger available to subclasses. */ protected final Log logger = LogFactory.getLog(getClass()); - private static TransformerFactory transformerFactory = TransformerFactory.newInstance(); + private TransformerFactory transformerFactory; + + private Class transformerFactoryClass; + + /** + * Specify the {@code TransformerFactory} class to use. + */ + public void setTransformerFactoryClass(Class transformerFactoryClass) { + Assert.isAssignable(TransformerFactory.class, transformerFactoryClass); + this.transformerFactoryClass = transformerFactoryClass; + } + + /** + * Instantiate a new TransformerFactory. + *

The default implementation simply calls {@link TransformerFactory#newInstance()}. + * If a {@link #setTransformerFactoryClass "transformerFactoryClass"} has been specified explicitly, + * the default constructor of the specified class will be called instead. + *

Can be overridden in subclasses. + * @param transformerFactoryClass the specified factory class (if any) + * @return the new TransactionFactory instance + * @see #setTransformerFactoryClass + * @see #getTransformerFactory() + */ + protected TransformerFactory newTransformerFactory(Class transformerFactoryClass) { + if (transformerFactoryClass != null) { + try { + return (TransformerFactory) transformerFactoryClass.newInstance(); + } + catch (Exception ex) { + throw new TransformerFactoryConfigurationError(ex, "Could not instantiate TransformerFactory"); + } + } + else { + return TransformerFactory.newInstance(); + } + } /** Returns the TransformerFactory. */ protected TransformerFactory getTransformerFactory() { + if (transformerFactory == null) { + transformerFactory = newTransformerFactory(transformerFactoryClass); + } return transformerFactory; } @@ -55,7 +96,7 @@ public abstract class TransformerObjectSupport { * if thrown by JAXP methods */ protected final Transformer createTransformer() throws TransformerConfigurationException { - return transformerFactory.newTransformer(); + return getTransformerFactory().newTransformer(); } /**