SWS-164
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<parent>
|
||||
<artifactId>spring-ws</artifactId>
|
||||
<groupId>org.springframework.ws</groupId>
|
||||
@@ -48,10 +50,6 @@
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-mock</artifactId>
|
||||
|
||||
@@ -38,9 +38,12 @@ import org.springframework.xml.transform.TransformerObjectSupport;
|
||||
public abstract class AbstractDom4jPayloadEndpoint extends TransformerObjectSupport implements PayloadEndpoint {
|
||||
|
||||
public final Source invoke(Source request) throws Exception {
|
||||
DocumentResult dom4jResult = new DocumentResult();
|
||||
transform(request, dom4jResult);
|
||||
Element requestElement = dom4jResult.getDocument().getRootElement();
|
||||
Element requestElement = null;
|
||||
if (request != null) {
|
||||
DocumentResult dom4jResult = new DocumentResult();
|
||||
transform(request, dom4jResult);
|
||||
requestElement = dom4jResult.getDocument().getRootElement();
|
||||
}
|
||||
Document responseDocument = DocumentHelper.createDocument();
|
||||
Element responseElement = invokeInternal(requestElement, responseDocument);
|
||||
return responseElement != null ? new DocumentSource(responseElement) : null;
|
||||
|
||||
@@ -63,10 +63,13 @@ public abstract class AbstractDomPayloadEndpoint extends TransformerObjectSuppor
|
||||
documentBuilderFactory = createDocumentBuilderFactory();
|
||||
}
|
||||
DocumentBuilder documentBuilder = createDocumentBuilder(documentBuilderFactory);
|
||||
Document requestDocument = documentBuilder.newDocument();
|
||||
DOMResult domResult = new DOMResult(requestDocument);
|
||||
transform(request, domResult);
|
||||
Element requestElement = (Element) requestDocument.getFirstChild();
|
||||
Element requestElement = null;
|
||||
if (request != null) {
|
||||
Document requestDocument = documentBuilder.newDocument();
|
||||
DOMResult domResult = new DOMResult(requestDocument);
|
||||
transform(request, domResult);
|
||||
requestElement = (Element) requestDocument.getFirstChild();
|
||||
}
|
||||
Document responseDocument = documentBuilder.newDocument();
|
||||
Element responseElement = invokeInternal(requestElement, responseDocument);
|
||||
if (responseElement != null) {
|
||||
|
||||
@@ -37,9 +37,12 @@ import org.springframework.xml.transform.TransformerObjectSupport;
|
||||
public abstract class AbstractJDomPayloadEndpoint extends TransformerObjectSupport implements PayloadEndpoint {
|
||||
|
||||
public final Source invoke(Source request) throws Exception {
|
||||
JDOMResult jdomResult = new JDOMResult();
|
||||
transform(request, jdomResult);
|
||||
Element requestElement = jdomResult.getDocument().getRootElement();
|
||||
Element requestElement = null;
|
||||
if (request != null) {
|
||||
JDOMResult jdomResult = new JDOMResult();
|
||||
transform(request, jdomResult);
|
||||
requestElement = jdomResult.getDocument().getRootElement();
|
||||
}
|
||||
Element responseElement = invokeInternal(requestElement);
|
||||
return responseElement != null ? new JDOMSource(responseElement) : null;
|
||||
}
|
||||
|
||||
@@ -37,31 +37,39 @@ import org.xml.sax.ContentHandler;
|
||||
public abstract class AbstractSaxPayloadEndpoint extends TransformerObjectSupport implements PayloadEndpoint {
|
||||
|
||||
/**
|
||||
* Invokes the provided <code>ContentHandler</code> and <code>LexicalHandler</code> on the given request. After
|
||||
* parsing has been done, the provided response is returned.
|
||||
* Invokes the provided <code>ContentHandler</code> on the given request. After parsing has been done, the provided
|
||||
* response is returned.
|
||||
*
|
||||
* @see #createContentHandler()
|
||||
* @see #getResponse(org.xml.sax.ContentHandler)
|
||||
*/
|
||||
public final Source invoke(Source request) throws Exception {
|
||||
ContentHandler contentHandler = createContentHandler();
|
||||
SAXResult result = new SAXResult(contentHandler);
|
||||
transform(request, result);
|
||||
ContentHandler contentHandler = null;
|
||||
if (request != null) {
|
||||
contentHandler = createContentHandler();
|
||||
SAXResult result = new SAXResult(contentHandler);
|
||||
transform(request, result);
|
||||
}
|
||||
return getResponse(contentHandler);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the SAX <code>ContentHandler</code> used to parse the incoming request payload. A new instance should be
|
||||
* created for each call, because of thread-safety. The content handler can be used to hold request-specific state.
|
||||
* <p/>
|
||||
* If an incoming message does not contain a payload, this method will not be invoked.
|
||||
*
|
||||
* @return a SAX content handler to be used for parsing
|
||||
*/
|
||||
protected abstract ContentHandler createContentHandler() throws Exception;
|
||||
|
||||
/**
|
||||
* Returns the response to be given, if any. This method is called after the request payload has been parse using
|
||||
* the SAX <code>ContentHandler</code>. The passed <code>ContentHandler</code> is created by
|
||||
* <code>createContentHandler</code>: it can be used to hold request-specific state.
|
||||
* Returns the response to be given, if any. This method is called after the request payload has been parsed using
|
||||
* the SAX <code>ContentHandler</code>. The passed <code>ContentHandler</code> is created by {@link
|
||||
* #createContentHandler()}: it can be used to hold request-specific state.
|
||||
* <p/>
|
||||
* If an incoming message does not contain a payload, this method will be invoked with <code>null</code> as content
|
||||
* handler.
|
||||
*
|
||||
* @param contentHandler the content handler used to parse the request
|
||||
*/
|
||||
|
||||
@@ -112,10 +112,12 @@ public abstract class AbstractXomPayloadEndpoint extends TransformerObjectSuppor
|
||||
|
||||
private Source invokeUsingReflection(Source request) throws Exception {
|
||||
try {
|
||||
Result xomResult = createXomResult();
|
||||
transform(request, xomResult);
|
||||
Element requestElement = getRequestElement(xomResult);
|
||||
|
||||
Element requestElement = null;
|
||||
if (request != null) {
|
||||
Result xomResult = createXomResult();
|
||||
transform(request, xomResult);
|
||||
requestElement = getRequestElement(xomResult);
|
||||
}
|
||||
Element responseElement = invokeInternal(requestElement);
|
||||
return responseElement != null ? createXomSource(responseElement) : null;
|
||||
}
|
||||
@@ -134,20 +136,21 @@ public abstract class AbstractXomPayloadEndpoint extends TransformerObjectSuppor
|
||||
}
|
||||
|
||||
private Source invokeUsingTransformation(Source request) throws Exception {
|
||||
logger.debug("Using transformations");
|
||||
Element requestElement = null;
|
||||
if (request instanceof DOMSource) {
|
||||
requestElement = handleDomSource(request);
|
||||
}
|
||||
else if (request instanceof SAXSource) {
|
||||
requestElement = handleSaxSource(request);
|
||||
}
|
||||
else if (request instanceof StreamSource) {
|
||||
requestElement = handleStreamSource(request);
|
||||
}
|
||||
else {
|
||||
throw new IllegalArgumentException(
|
||||
"Source [" + request.getClass().getName() + "] is neither SAXSource, DOMSource, nor StreamSource");
|
||||
if (request != null) {
|
||||
if (request instanceof DOMSource) {
|
||||
requestElement = handleDomSource(request);
|
||||
}
|
||||
else if (request instanceof SAXSource) {
|
||||
requestElement = handleSaxSource(request);
|
||||
}
|
||||
else if (request instanceof StreamSource) {
|
||||
requestElement = handleStreamSource(request);
|
||||
}
|
||||
else {
|
||||
throw new IllegalArgumentException("Source [" + request.getClass().getName() +
|
||||
"] is neither SAXSource, DOMSource, nor StreamSource");
|
||||
}
|
||||
}
|
||||
Element responseElement = invokeInternal(requestElement);
|
||||
if (responseElement != null) {
|
||||
|
||||
@@ -20,18 +20,18 @@ import javax.xml.transform.Source;
|
||||
|
||||
/**
|
||||
* Defines the basic contract for Web Services interested in just the message payload.
|
||||
*
|
||||
* <p>The main entrypoint is {@link #invoke(Source)}, which gets invoked with the contents of the requesting message.
|
||||
* <p/>
|
||||
* The main entrypoint is {@link #invoke(Source)}, which gets invoked with the contents of the requesting message.
|
||||
*
|
||||
* @author Arjen Poutsma
|
||||
*/
|
||||
public interface PayloadEndpoint {
|
||||
|
||||
/**
|
||||
* Invokes an operation.
|
||||
* Invokes the endpoint with the given request payload, and possibly returns a response.
|
||||
*
|
||||
* @param request the request message
|
||||
* @return the response message, may be <code>null</code>
|
||||
* @param request the payload of the request message, may be <code>null</code>
|
||||
* @return the payload of the response message, may be <code>null</code> to indicate no response
|
||||
* @throws Exception if an exception occurs
|
||||
*/
|
||||
Source invoke(Source request) throws Exception;
|
||||
|
||||
@@ -41,6 +41,12 @@ public abstract class AbstractPayloadEndpointTestCase extends AbstractEndpointTe
|
||||
assertNull("Response source returned", resultSource);
|
||||
}
|
||||
|
||||
public void testNoRequest() throws Exception {
|
||||
endpoint = createNoRequestEndpoint();
|
||||
Source resultSource = endpoint.invoke(null);
|
||||
assertNull("Response source returned", resultSource);
|
||||
}
|
||||
|
||||
protected final void testSource(Source requestSource) throws Exception {
|
||||
Source responseSource = endpoint.invoke(requestSource);
|
||||
assertNotNull("No response source returned", responseSource);
|
||||
@@ -52,4 +58,6 @@ public abstract class AbstractPayloadEndpointTestCase extends AbstractEndpointTe
|
||||
protected abstract PayloadEndpoint createNoResponseEndpoint() throws Exception;
|
||||
|
||||
protected abstract PayloadEndpoint createResponseEndpoint() throws Exception;
|
||||
|
||||
protected abstract PayloadEndpoint createNoRequestEndpoint() throws Exception;
|
||||
}
|
||||
|
||||
@@ -43,5 +43,15 @@ public class Dom4jPayloadEndpointTest extends AbstractPayloadEndpointTestCase {
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractDom4jPayloadEndpoint() {
|
||||
|
||||
protected Element invokeInternal(Element requestElement, Document responseDocument) throws Exception {
|
||||
assertNull("RequestElement passed", requestElement);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -43,5 +43,13 @@ public class DomPayloadEndpointTest extends AbstractPayloadEndpointTestCase {
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractDomPayloadEndpoint() {
|
||||
|
||||
protected Element invokeInternal(Element requestElement, Document responseDocument) throws Exception {
|
||||
assertNull("RequestElement passed", requestElement);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,4 +41,14 @@ public class JDomPayloadEndpointTest extends AbstractPayloadEndpointTestCase {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractJDomPayloadEndpoint() {
|
||||
|
||||
protected Element invokeInternal(Element requestElement) throws Exception {
|
||||
assertNull("RequestElement passed", requestElement);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,16 @@ public class NonReflectiveXomPayloadEndpointTest extends AbstractPayloadEndpoint
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractXomPayloadEndpoint(false) {
|
||||
|
||||
protected Element invokeInternal(Element requestElement) throws Exception {
|
||||
assertNull("RequestElement passed", requestElement);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void testStaxSourceEventReader() throws Exception {
|
||||
// overriden, because XOM doesn not support it
|
||||
}
|
||||
|
||||
@@ -41,5 +41,13 @@ public class ReflectiveXomPayloadEndpointTest extends AbstractPayloadEndpointTes
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractXomPayloadEndpoint(true) {
|
||||
|
||||
protected Element invokeInternal(Element requestElement) throws Exception {
|
||||
assertNull("RequestElement passed", requestElement);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,20 @@ public class SaxPayloadEndpointTest extends AbstractPayloadEndpointTestCase {
|
||||
};
|
||||
}
|
||||
|
||||
protected PayloadEndpoint createNoRequestEndpoint() throws Exception {
|
||||
return new AbstractSaxPayloadEndpoint() {
|
||||
|
||||
protected ContentHandler createContentHandler() throws Exception {
|
||||
fail("Not expected");
|
||||
return null;
|
||||
}
|
||||
|
||||
protected Source getResponse(ContentHandler contentHandler) throws Exception {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static class TestContentHandler extends DefaultHandler {
|
||||
|
||||
public void endElement(String uri, String localName, String qName) throws SAXException {
|
||||
|
||||
Reference in New Issue
Block a user