This commit is contained in:
Arjen Poutsma
2007-08-13 21:49:24 +00:00
parent 97b09844aa
commit 997b9356f3
14 changed files with 131 additions and 45 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -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
*/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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