Added transform() method to TransformerObjectSupport.

This commit is contained in:
Arjen Poutsma
2007-06-12 15:19:06 +00:00
parent 6ebb764aba
commit ca739dc428
12 changed files with 40 additions and 55 deletions

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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.
*
* <p/>
* <p>Offers the message payload as a DOM <code>Element</code>, and allows subclasses to create a response by returning
* an <code>Element</code>.
*
* <p/>
* <p>An <code>AbstractDomPayloadEndpoint</code> only accept <i>one</i> 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 <code>true</code>.
*/
/** Set whether or not the XML parser should be XML namespace aware. Default is <code>true</code>. */
public void setNamespaceAware(boolean namespaceAware) {
this.namespaceAware = namespaceAware;
}
/**
* Set if the XML parser should validate the document. Default is <code>false</code>.
*/
/** Set if the XML parser should validate the document. Default is <code>false</code>. */
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.
*
* <p/>
* <p>Offers the request payload as a DOM <code>Element</code>, and allows subclasses to return a response
* <code>Element</code>.
*
* <p/>
* <p>The given DOM <code>Document</code> is to be used for constructing <code>Node</code>s, by using the various
* <code>create</code> methods.
*

View File

@@ -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.
*
* <p/>
* <p>Offers the message payload as a JDOM {@link Element}, and allows subclasses to create a response by returning an
* <code>Element</code>.
*
* <p/>
* <pAn <code>AbstractJDomPayloadEndpoint</code> can accept only <i>one</i> 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;

View File

@@ -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);
}

View File

@@ -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 <code>XMLEventFactory</code> to read XML from.
*/
/** Returns an <code>XMLEventFactory</code> 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);

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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());
}
}
}

View File

@@ -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());
}
}
}

View File

@@ -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 <code>Transformer</code>. Must be called per request, as transformer is not thread-safe.
* Creates a new <code>Transformer</code>. 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);
}
}

View File

@@ -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();
}