View Javadoc

1   /*
2    * Copyright 2005-2010 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.xml.transform;
18  
19  import javax.xml.transform.Result;
20  import javax.xml.transform.Source;
21  import javax.xml.transform.Transformer;
22  import javax.xml.transform.TransformerConfigurationException;
23  import javax.xml.transform.TransformerException;
24  import javax.xml.transform.TransformerFactory;
25  
26  import org.apache.commons.logging.Log;
27  import org.apache.commons.logging.LogFactory;
28  
29  /**
30   * Convenient base class for objects that use a <code>Transformer</code>. Subclasses can call {@link
31   * #createTransformer()} or {@link #transform(Source, Result)}. This should be done per thread (i.e. per incoming
32   * request), because <code>Transformer</code> instances are not thread-safe.
33   *
34   * @author Arjen Poutsma
35   * @see Transformer
36   * @since 1.0.0
37   */
38  public abstract class TransformerObjectSupport {
39  
40      /**
41       * Logger available to subclasses.
42       */
43      protected final Log logger = LogFactory.getLog(getClass());
44  
45      private TransformerHelper transformerHelper = new TransformerHelper();
46  
47      /**
48       * Specify the {@code TransformerFactory} class to use.
49       */
50      public void setTransformerFactoryClass(Class<? extends TransformerFactory> transformerFactoryClass) {
51          transformerHelper.setTransformerFactoryClass(transformerFactoryClass);
52      }
53  
54      /**
55       * Instantiate a new TransformerFactory. <p>The default implementation simply calls {@link
56       * TransformerFactory#newInstance()}. If a {@link #setTransformerFactoryClass "transformerFactoryClass"} has been
57       * specified explicitly, the default constructor of the specified class will be called instead. <p>Can be overridden
58       * in subclasses.
59       *
60       * @param transformerFactoryClass the specified factory class (if any)
61       * @return the new TransactionFactory instance
62       * @see #setTransformerFactoryClass
63       * @see #getTransformerFactory()
64       */
65      protected TransformerFactory newTransformerFactory(Class<? extends TransformerFactory> transformerFactoryClass) {
66          return transformerHelper.newTransformerFactory(transformerFactoryClass);
67      }
68  
69      /**
70       * Returns the <code>TransformerFactory</code>.
71       */
72      protected TransformerFactory getTransformerFactory() {
73          return transformerHelper.getTransformerFactory();
74      }
75  
76      /**
77       * Creates a new <code>Transformer</code>. Must be called per request, as transformers are not thread-safe.
78       *
79       * @return the created transformer
80       * @throws TransformerConfigurationException
81       *          if thrown by JAXP methods
82       */
83      protected final Transformer createTransformer() throws TransformerConfigurationException {
84          return transformerHelper.createTransformer();
85      }
86  
87      /**
88       * Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every
89       * call, as transformers are not thread-safe.
90       *
91       * @param source the source to transform from
92       * @param result the result to transform to
93       * @throws TransformerException if thrown by JAXP methods
94       */
95      protected final void transform(Source source, Result result) throws TransformerException {
96          transformerHelper.transform(source, result);
97      }
98  
99  }