From ca739dc42871b24e6389aec535ffffdf0fcc8485 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 12 Jun 2007 15:19:06 +0000 Subject: [PATCH] Added transform() method to TransformerObjectSupport. --- ...hParamAnnotationMethodEndpointAdapter.java | 7 ++----- .../AbstractDom4jPayloadEndpoint.java | 4 +--- .../endpoint/AbstractDomPayloadEndpoint.java | 20 +++++++------------ .../endpoint/AbstractJDomPayloadEndpoint.java | 8 +++----- .../endpoint/AbstractSaxPayloadEndpoint.java | 4 +--- .../AbstractStaxEventPayloadEndpoint.java | 11 +++------- .../AbstractStaxStreamPayloadEndpoint.java | 7 ++----- .../endpoint/AbstractXomPayloadEndpoint.java | 4 +--- .../adapter/PayloadEndpointAdapter.java | 4 +--- .../adapter/PayloadMethodEndpointAdapter.java | 4 +--- .../transform/TransformerObjectSupport.java | 18 ++++++++++++++++- .../xml/xpath/AbstractXPathTemplate.java | 4 +--- 12 files changed, 40 insertions(+), 55 deletions(-) diff --git a/core-tiger/src/main/java/org/springframework/ws/server/endpoint/adapter/XPathParamAnnotationMethodEndpointAdapter.java b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/adapter/XPathParamAnnotationMethodEndpointAdapter.java index 0e22291b..df6998bf 100644 --- a/core-tiger/src/main/java/org/springframework/ws/server/endpoint/adapter/XPathParamAnnotationMethodEndpointAdapter.java +++ b/core-tiger/src/main/java/org/springframework/ws/server/endpoint/adapter/XPathParamAnnotationMethodEndpointAdapter.java @@ -21,7 +21,6 @@ import java.lang.reflect.Method; import java.util.Properties; import javax.xml.namespace.QName; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMResult; import javax.xml.xpath.XPath; @@ -112,8 +111,7 @@ public class XPathParamAnnotationMethodEndpointAdapter extends AbstractMethodEnd if (result != null && result instanceof Source) { Source responseSource = (Source) result; WebServiceMessage response = messageContext.getResponse(); - Transformer transformer = createTransformer(); - transformer.transform(responseSource, response.getPayloadResult()); + transform(responseSource, response.getPayloadResult()); } } @@ -166,9 +164,8 @@ public class XPathParamAnnotationMethodEndpointAdapter extends AbstractMethodEnd * @return the root element */ private Element getRootElement(Source source) throws TransformerException { - Transformer transformer = createTransformer(); DOMResult domResult = new DOMResult(); - transformer.transform(source, domResult); + transform(source, domResult); Document document = (Document) domResult.getNode(); return document.getDocumentElement(); } diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDom4jPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDom4jPayloadEndpoint.java index 9f8cdbc3..ce6a743f 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDom4jPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDom4jPayloadEndpoint.java @@ -17,7 +17,6 @@ package org.springframework.ws.server.endpoint; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import org.dom4j.Document; import org.dom4j.DocumentHelper; @@ -39,9 +38,8 @@ import org.springframework.xml.transform.TransformerObjectSupport; public abstract class AbstractDom4jPayloadEndpoint extends TransformerObjectSupport implements PayloadEndpoint { public final Source invoke(Source request) throws Exception { - Transformer transformer = createTransformer(); DocumentResult dom4jResult = new DocumentResult(); - transformer.transform(request, dom4jResult); + transform(request, dom4jResult); Element requestElement = dom4jResult.getDocument().getRootElement(); Document responseDocument = DocumentHelper.createDocument(); Element responseElement = invokeInternal(requestElement, responseDocument); diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDomPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDomPayloadEndpoint.java index b9a0e7fc..3b4d996b 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDomPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractDomPayloadEndpoint.java @@ -20,7 +20,6 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; @@ -30,10 +29,10 @@ import org.w3c.dom.Element; /** * Abstract base class for endpoints that handle the message payload as DOM elements. - * + *

*

Offers the message payload as a DOM Element, and allows subclasses to create a response by returning * an Element. - * + *

*

An AbstractDomPayloadEndpoint only accept one payload element. Multiple payload elements are * not in accordance with WS-I. * @@ -49,29 +48,24 @@ public abstract class AbstractDomPayloadEndpoint extends TransformerObjectSuppor private boolean namespaceAware = true; - /** - * Set whether or not the XML parser should be XML namespace aware. Default is true. - */ + /** Set whether or not the XML parser should be XML namespace aware. Default is true. */ public void setNamespaceAware(boolean namespaceAware) { this.namespaceAware = namespaceAware; } - /** - * Set if the XML parser should validate the document. Default is false. - */ + /** Set if the XML parser should validate the document. Default is false. */ public void setValidating(boolean validating) { this.validating = validating; } public final Source invoke(Source request) throws Exception { - Transformer transformer = createTransformer(); if (documentBuilderFactory == null) { documentBuilderFactory = createDocumentBuilderFactory(); } DocumentBuilder documentBuilder = createDocumentBuilder(documentBuilderFactory); Document requestDocument = documentBuilder.newDocument(); DOMResult domResult = new DOMResult(requestDocument); - transformer.transform(request, domResult); + transform(request, domResult); Element requestElement = (Element) requestDocument.getFirstChild(); Document responseDocument = documentBuilder.newDocument(); Element responseElement = invokeInternal(requestElement, responseDocument); @@ -113,10 +107,10 @@ public abstract class AbstractDomPayloadEndpoint extends TransformerObjectSuppor /** * Template method that subclasses must implement to process the request. - * + *

*

Offers the request payload as a DOM Element, and allows subclasses to return a response * Element. - * + *

*

The given DOM Document is to be used for constructing Nodes, by using the various * create methods. * diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractJDomPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractJDomPayloadEndpoint.java index 64575b95..5c63582f 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractJDomPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractJDomPayloadEndpoint.java @@ -17,7 +17,6 @@ package org.springframework.ws.server.endpoint; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import org.jdom.Element; import org.jdom.transform.JDOMResult; @@ -26,10 +25,10 @@ import org.springframework.xml.transform.TransformerObjectSupport; /** * Abstract base class for endpoints that handle the message payload as JDOM elements. - * + *

*

Offers the message payload as a JDOM {@link Element}, and allows subclasses to create a response by returning an * Element. - * + *

* AbstractJDomPayloadEndpoint can accept only one payload element. Multiple payload elements * are not in accordance with WS-I. * @@ -38,9 +37,8 @@ import org.springframework.xml.transform.TransformerObjectSupport; public abstract class AbstractJDomPayloadEndpoint extends TransformerObjectSupport implements PayloadEndpoint { public final Source invoke(Source request) throws Exception { - Transformer transformer = createTransformer(); JDOMResult jdomResult = new JDOMResult(); - transformer.transform(request, jdomResult); + transform(request, jdomResult); Element requestElement = jdomResult.getDocument().getRootElement(); Element responseElement = invokeInternal(requestElement); return responseElement != null ? new JDOMSource(responseElement) : null; diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractSaxPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractSaxPayloadEndpoint.java index d775ad6d..500bff1c 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractSaxPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractSaxPayloadEndpoint.java @@ -17,7 +17,6 @@ package org.springframework.ws.server.endpoint; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.sax.SAXResult; import org.springframework.xml.transform.TransformerObjectSupport; @@ -45,10 +44,9 @@ public abstract class AbstractSaxPayloadEndpoint extends TransformerObjectSuppor * @see #getResponse(org.xml.sax.ContentHandler) */ public final Source invoke(Source request) throws Exception { - Transformer transformer = createTransformer(); ContentHandler contentHandler = createContentHandler(); SAXResult result = new SAXResult(contentHandler); - transformer.transform(request, result); + transform(request, result); return getResponse(contentHandler); } diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxEventPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxEventPayloadEndpoint.java index 45e09a67..0f0cb615 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxEventPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxEventPayloadEndpoint.java @@ -27,7 +27,6 @@ import javax.xml.stream.events.XMLEvent; import javax.xml.stream.util.XMLEventConsumer; import javax.xml.transform.Result; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; @@ -69,9 +68,7 @@ public abstract class AbstractStaxEventPayloadEndpoint extends AbstractStaxPaylo return XMLEventFactory.newInstance(); } - /** - * Returns an XMLEventFactory to read XML from. - */ + /** Returns an XMLEventFactory to read XML from. */ private XMLEventFactory getEventFactory() { if (eventFactory == null) { eventFactory = createXmlEventFactory(); @@ -103,9 +100,8 @@ public abstract class AbstractStaxEventPayloadEndpoint extends AbstractStaxPaylo } if (eventReader == null) { // as a final resort, transform the source to a stream, and read from that - Transformer transformer = createTransformer(); ByteArrayOutputStream os = new ByteArrayOutputStream(); - transformer.transform(source, new StreamResult(os)); + transform(source, new StreamResult(os)); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); eventReader = getInputFactory().createXMLEventReader(is); } @@ -181,9 +177,8 @@ public abstract class AbstractStaxEventPayloadEndpoint extends AbstractStaxPaylo eventWriter.flush(); // if we used an output stream cache, we have to transform it to the response again try { - Transformer transformer = createTransformer(); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); - transformer.transform(new StreamSource(is), messageContext.getResponse().getPayloadResult()); + transform(new StreamSource(is), messageContext.getResponse().getPayloadResult()); } catch (TransformerException ex) { throw new XMLStreamException(ex); diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxStreamPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxStreamPayloadEndpoint.java index d29dee4b..bd03a9ff 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxStreamPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractStaxStreamPayloadEndpoint.java @@ -24,7 +24,6 @@ import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; import javax.xml.transform.Result; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; @@ -79,9 +78,8 @@ public abstract class AbstractStaxStreamPayloadEndpoint extends AbstractStaxPayl } if (streamReader == null) { // as a final resort, transform the source to a stream, and read from that - Transformer transformer = createTransformer(); ByteArrayOutputStream os = new ByteArrayOutputStream(); - transformer.transform(source, new StreamResult(os)); + transform(source, new StreamResult(os)); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); streamReader = getInputFactory().createXMLStreamReader(is); } @@ -146,9 +144,8 @@ public abstract class AbstractStaxStreamPayloadEndpoint extends AbstractStaxPayl streamWriter.flush(); // if we used an output stream cache, we have to transform it to the response again try { - Transformer transformer = createTransformer(); ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray()); - transformer.transform(new StreamSource(is), messageContext.getResponse().getPayloadResult()); + transform(new StreamSource(is), messageContext.getResponse().getPayloadResult()); os = null; } catch (TransformerException ex) { diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractXomPayloadEndpoint.java b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractXomPayloadEndpoint.java index a087ed66..549efaf4 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/AbstractXomPayloadEndpoint.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/AbstractXomPayloadEndpoint.java @@ -24,7 +24,6 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamSource; @@ -113,9 +112,8 @@ public abstract class AbstractXomPayloadEndpoint extends TransformerObjectSuppor private Source invokeUsingReflection(Source request) throws Exception { try { - Transformer transformer = createTransformer(); Result xomResult = createXomResult(); - transformer.transform(request, xomResult); + transform(request, xomResult); Element requestElement = getRequestElement(xomResult); Element responseElement = invokeInternal(requestElement); diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadEndpointAdapter.java b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadEndpointAdapter.java index ebf65c22..40096b14 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadEndpointAdapter.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadEndpointAdapter.java @@ -17,7 +17,6 @@ package org.springframework.ws.server.endpoint.adapter; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.context.MessageContext; @@ -48,8 +47,7 @@ public class PayloadEndpointAdapter extends TransformerObjectSupport implements Source responseSource = payloadEndpoint.invoke(requestSource); if (responseSource != null) { WebServiceMessage response = messageContext.getResponse(); - Transformer transformer = createTransformer(); - transformer.transform(responseSource, response.getPayloadResult()); + transform(responseSource, response.getPayloadResult()); } } } diff --git a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadMethodEndpointAdapter.java b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadMethodEndpointAdapter.java index d802625b..8d3ed695 100644 --- a/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadMethodEndpointAdapter.java +++ b/core/src/main/java/org/springframework/ws/server/endpoint/adapter/PayloadMethodEndpointAdapter.java @@ -18,7 +18,6 @@ package org.springframework.ws.server.endpoint.adapter; import java.lang.reflect.Method; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.context.MessageContext; @@ -58,8 +57,7 @@ public class PayloadMethodEndpointAdapter extends AbstractMethodEndpointAdapter if (result != null) { Source responseSource = (Source) result; WebServiceMessage response = messageContext.getResponse(); - Transformer transformer = createTransformer(); - transformer.transform(responseSource, response.getPayloadResult()); + transform(responseSource, response.getPayloadResult()); } } } 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 2e92afef..6021e490 100644 --- a/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java +++ b/xml/src/main/java/org/springframework/xml/transform/TransformerObjectSupport.java @@ -16,8 +16,11 @@ package org.springframework.xml.transform; +import javax.xml.transform.Result; +import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import org.apache.commons.logging.Log; @@ -49,7 +52,7 @@ public abstract class TransformerObjectSupport { } /** - * Creates a new Transformer. Must be called per request, as transformer is not thread-safe. + * Creates a new Transformer. Must be called per request, as transformers are not thread-safe. * * @return the created transformer * @throws TransformerConfigurationException @@ -59,4 +62,17 @@ public abstract class TransformerObjectSupport { return transformerFactory.newTransformer(); } + /** + * Transforms the given {@link Source} to the given {@link Result}. Creates a new {@link Transformer} for every + * call, as transformers are not thread-safe. + * + * @param source the source to transform from + * @param result the result to transform to + * @throws TransformerException if thrown by JAXP methods + */ + protected final void transform(Source source, Result result) throws TransformerException { + Transformer transformer = createTransformer(); + transformer.transform(source, result); + } + } diff --git a/xml/src/main/java/org/springframework/xml/xpath/AbstractXPathTemplate.java b/xml/src/main/java/org/springframework/xml/xpath/AbstractXPathTemplate.java index b6d9ab9f..09f81d86 100644 --- a/xml/src/main/java/org/springframework/xml/xpath/AbstractXPathTemplate.java +++ b/xml/src/main/java/org/springframework/xml/xpath/AbstractXPathTemplate.java @@ -18,7 +18,6 @@ package org.springframework.xml.xpath; import java.util.Properties; import javax.xml.transform.Source; -import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMResult; @@ -74,9 +73,8 @@ public abstract class AbstractXPathTemplate extends TransformerObjectSupport imp * @return the root element */ protected Element getRootElement(Source source) throws TransformerException { - Transformer transformer = createTransformer(); DOMResult domResult = new DOMResult(); - transformer.transform(source, domResult); + transform(source, domResult); Document document = (Document) domResult.getNode(); return document.getDocumentElement(); }