From 883fe3728cd8460206c0d2a9a6a40652972813e8 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Sat, 4 Nov 2006 23:54:36 +0000 Subject: [PATCH] Working on client-side support. --- .../springframework/ws/WebServiceMessage.java | 4 +- .../ws/WebServiceMessageFactory.java | 50 ++++++ .../ws/context/AbstractMessageContext.java | 123 --------------- .../ws/context/DefaultMessageContext.java | 149 ++++++++++++++++++ .../ws/context/MessageContext.java | 23 --- .../ws/context/MessageContextFactory.java | 45 ------ .../AbstractValidatingInterceptor.java | 10 +- .../context/AbstractPoxMessageContext.java | 49 ------ .../ws/pox/dom/DomPoxMessage.java | 9 +- .../ws/pox/dom/DomPoxMessageContext.java | 67 -------- ...Factory.java => DomPoxMessageFactory.java} | 38 +++-- .../ws/soap/SoapMessageDispatcher.java | 26 +-- .../springframework/ws/soap/SoapVersion.java | 40 ++--- .../ws/soap/axiom/AxiomSoapMessage.java | 37 ++++- .../soap/axiom/AxiomSoapMessageContext.java | 90 ----------- ...tory.java => AxiomSoapMessageFactory.java} | 116 +++++++------- .../context/AbstractSoapMessageContext.java | 49 ------ .../ws/soap/context/SoapMessageContext.java | 46 ------ .../ws/soap/context/package.html | 5 - .../endpoint/SimpleSoapExceptionResolver.java | 12 +- .../SoapFaultMappingExceptionResolver.java | 13 +- .../mapping/SoapActionEndpointMapping.java | 7 +- .../ws/soap/saaj/SaajSoapMessage.java | 41 +++-- .../ws/soap/saaj/SaajSoapMessageContext.java | 127 --------------- .../saaj/SaajSoapMessageContextFactory.java | 135 ---------------- .../ws/soap/saaj/SaajSoapMessageFactory.java | 141 +++++++++++++++++ .../soap/saaj/saaj12/Saaj12SoapMessage.java | 10 +- .../saaj/saaj12/Saaj12SoapMessageContext.java | 59 ------- .../soap/saaj/saaj13/Saaj13SoapMessage.java | 9 +- .../saaj/saaj13/Saaj13SoapMessageContext.java | 59 ------- .../ws/soap/saaj/support/SaajUtils.java | 12 -- .../ws/transport/SimpleTransportContext.java | 46 ++++++ .../ws/transport/TransportContext.java | 16 +- .../ws/transport/TransportContextHolder.java | 46 ++++++ .../ws/transport/TransportInputStream.java | 97 ++++++++++++ .../ws/transport/TransportOutputStream.java | 67 ++++++++ .../ws/transport/TransportRequest.java | 53 ------- .../http/HttpServletTransportInputStream.java | 65 ++++++++ ... => HttpServletTransportOutputStream.java} | 27 ++-- .../transport/http/HttpTransportContext.java | 56 ------- .../transport/http/HttpTransportRequest.java | 97 ------------ .../http/MessageDispatcherServlet.java | 32 ++-- .../http/MessageEndpointHandlerAdapter.java | 46 ++++-- .../http/MessageDispatcherServlet.properties | 2 +- ...tractWebServiceMessageFactoryTestCase.java | 35 ++++ .../ws/MessageDispatcherTest.java | 32 +++- .../ws/{mock => }/MockWebServiceMessage.java | 3 +- .../ws/MockWebServiceMessageFactory.java | 38 +++++ .../ws/context/DefaultMessageContextTest.java | 73 +++++++++ .../AbstractMessageEndpointTestCase.java | 13 +- .../MarshallingPayloadEndpointTest.java | 42 +++-- .../endpoint/MessageEndpointAdapterTest.java | 7 +- .../endpoint/PayloadEndpointAdapterTest.java | 11 +- .../StaxStreamPayloadEndpointTest.java | 13 +- .../PayloadLoggingInterceptorTest.java | 10 +- .../PayloadTransformingInterceptorTest.java | 14 +- .../PayloadValidatingInterceptorTest.java | 93 ++++++----- .../endpoint/mapping/EndpointMappingTest.java | 47 ++++-- .../PayloadRootQNameEndpointMappingTest.java | 11 +- .../ws/mock/MockMessageContext.java | 59 ------- .../ws/mock/MockTransportContext.java | 55 ------- .../ws/mock/MockTransportRequest.java | 83 ---------- .../ws/mock/MockTransportResponse.java | 62 -------- .../dom/DomPoxMessageContextFactoryTest.java | 39 ----- .../ws/pox/dom/DomPoxMessageContextTest.java | 74 --------- .../ws/pox/dom/DomPoxMessageFactoryTest.java | 29 ++++ .../AbstractSoapMessageFactoryTestCase.java | 29 ++++ .../ws/soap/SoapMessageDispatcherTest.java | 54 ++++--- ...ava => AxiomSoap11MessageFactoryTest.java} | 19 +-- .../AxiomSoap12MessageContextFactoryTest.java | 15 -- .../axiom/AxiomSoap12MessageFactoryTest.java | 37 +++++ ...ctSoap11MessageContextFactoryTestCase.java | 54 ------- .../AbstractSoap11MessageContextTestCase.java | 42 ----- ...ctSoap12MessageContextFactoryTestCase.java | 38 ----- .../AbstractSoap12MessageContextTestCase.java | 42 ----- ...ractSoapMessageContextFactoryTestCase.java | 32 ---- .../AbstractSoapMessageContextTestCase.java | 46 ------ .../SimpleSoapExceptionResolverTest.java | 26 +-- ...SoapFaultMappingExceptionResolverTest.java | 46 +++--- .../SoapEnvelopeLoggingInterceptorTest.java | 17 +- .../DelegatingSoapEndpointMappingTest.java | 6 +- .../SoapActionEndpointMappingTest.java | 40 +++-- .../saaj/SaajSoap11MessageFactoryTest.java | 32 ++++ .../SaajSoap12MessageContextFactoryTest.java | 16 -- .../saaj/SaajSoap12MessageFactoryTest.java | 32 ++++ .../Saaj12Soap11MessageContextTest.java | 33 ---- .../Saaj13Soap11MessageContextTest.java | 33 ---- .../Saaj13Soap12MessageContextTest.java | 33 ---- .../AbstractSoap11MessageFactoryTestCase.java | 67 ++++++++ .../soap11/AbstractSoap11MessageTestCase.java | 28 ++++ .../AbstractSoap12MessageFactoryTestCase.java | 67 ++++++++ .../soap12/AbstractSoap12MessageTestCase.java | 24 +++ .../transport/StubTransportInputStream.java | 51 ++++++ .../transport/StubTransportOutputStream.java | 48 ++++++ .../HttpServletTransportInputStreamTest.java | 59 +++++++ .../HttpServletTransportOutputStreamTest.java | 52 ++++++ .../http/HttpTransportRequestTest.java | 59 ------- .../MessageEndpointHandlerAdapterTest.java | 126 +++++++-------- .../{context => soap11}/soap11-attachment.bin | Bin .../ws/soap/{context => soap11}/soap11.xml | 0 .../{context => soap12}/soap12-attachment.bin | Bin .../ws/soap/{context => soap12}/soap12.xml | 0 samples/echo/client/saaj/build.xml | 1 + .../main/webapp/WEB-INF/spring-ws-servlet.xml | 1 + samples/echo/src/main/webapp/WEB-INF/web.xml | 14 +- .../echo/src/test/resources/log4j.properties | 13 +- sandbox/pom.xml | 48 ++++++ .../client/MarshallingWebServiceTemplate.java | 31 ---- .../ws/client/WebServiceAccessor.java | 68 ++++++++ .../ws/client/WebServiceMessageCallback.java | 27 ++++ .../ws/client/WebServiceMessageExtractor.java | 33 ++++ .../ws/client/WebServiceOperations.java | 45 ++++++ .../ws/client/WebServiceTemplate.java | 128 +++++++++++++++ .../ws/transport/WebServiceMessageSender.java | 18 +++ .../AbstractHttpWebServiceMessageSender.java | 14 +- ...HttpUrlConnectionTransportInputStream.java | 73 +++++++++ ...ttpUrlConnectionTransportOutputStream.java | 45 ++++++ .../SimpleHttpWebServiceMessageSender.java | 31 ++++ .../transport/jms/JmsTransportException.java | 21 ++- .../jms/JmsTransportInputStream.java | 70 ++++++++ .../jms/JmsTransportMessageListener.java | 108 +++++++++++++ .../jms/JmsTransportOutputStream.java | 85 ++++++++++ .../ws/client/WebServiceTemplateTest.java | 67 ++++++++ ...ctHttpWebServiceMessageSenderTestCase.java | 58 +++++++ .../xwss/XwsSecurityInterceptorTest.java | 30 +--- 125 files changed, 2966 insertions(+), 2460 deletions(-) create mode 100644 core/src/main/java/org/springframework/ws/WebServiceMessageFactory.java delete mode 100644 core/src/main/java/org/springframework/ws/context/AbstractMessageContext.java create mode 100644 core/src/main/java/org/springframework/ws/context/DefaultMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/context/MessageContextFactory.java delete mode 100644 core/src/main/java/org/springframework/ws/pox/context/AbstractPoxMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContext.java rename core/src/main/java/org/springframework/ws/pox/dom/{DomPoxMessageContextFactory.java => DomPoxMessageFactory.java} (66%) delete mode 100644 core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContext.java rename core/src/main/java/org/springframework/ws/soap/axiom/{AxiomSoapMessageContextFactory.java => AxiomSoapMessageFactory.java} (64%) delete mode 100644 core/src/main/java/org/springframework/ws/soap/context/AbstractSoapMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/soap/context/SoapMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/soap/context/package.html delete mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContextFactory.java create mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java delete mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessageContext.java delete mode 100644 core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessageContext.java create mode 100644 core/src/main/java/org/springframework/ws/transport/SimpleTransportContext.java create mode 100644 core/src/main/java/org/springframework/ws/transport/TransportContextHolder.java create mode 100644 core/src/main/java/org/springframework/ws/transport/TransportInputStream.java create mode 100644 core/src/main/java/org/springframework/ws/transport/TransportOutputStream.java delete mode 100644 core/src/main/java/org/springframework/ws/transport/TransportRequest.java create mode 100644 core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportInputStream.java rename core/src/main/java/org/springframework/ws/transport/http/{HttpTransportResponse.java => HttpServletTransportOutputStream.java} (61%) delete mode 100644 core/src/main/java/org/springframework/ws/transport/http/HttpTransportContext.java delete mode 100644 core/src/main/java/org/springframework/ws/transport/http/HttpTransportRequest.java create mode 100644 core/src/test/java/org/springframework/ws/AbstractWebServiceMessageFactoryTestCase.java rename core/src/test/java/org/springframework/ws/{mock => }/MockWebServiceMessage.java (98%) create mode 100644 core/src/test/java/org/springframework/ws/MockWebServiceMessageFactory.java create mode 100644 core/src/test/java/org/springframework/ws/context/DefaultMessageContextTest.java delete mode 100644 core/src/test/java/org/springframework/ws/mock/MockMessageContext.java delete mode 100644 core/src/test/java/org/springframework/ws/mock/MockTransportContext.java delete mode 100644 core/src/test/java/org/springframework/ws/mock/MockTransportRequest.java delete mode 100644 core/src/test/java/org/springframework/ws/mock/MockTransportResponse.java delete mode 100644 core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactoryTest.java delete mode 100644 core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextTest.java create mode 100644 core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageFactoryTest.java create mode 100644 core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageFactoryTestCase.java rename core/src/test/java/org/springframework/ws/soap/axiom/{AxiomSoap11MessageContextFactoryTest.java => AxiomSoap11MessageFactoryTest.java} (54%) delete mode 100644 core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageContextFactoryTest.java create mode 100644 core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextFactoryTestCase.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextTestCase.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextFactoryTestCase.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextTestCase.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextFactoryTestCase.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextTestCase.java create mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageContextFactoryTest.java create mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageFactoryTest.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11MessageContextTest.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11MessageContextTest.java delete mode 100644 core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12MessageContextTest.java create mode 100644 core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java create mode 100644 core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java create mode 100644 core/src/test/java/org/springframework/ws/transport/StubTransportInputStream.java create mode 100644 core/src/test/java/org/springframework/ws/transport/StubTransportOutputStream.java create mode 100644 core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportInputStreamTest.java create mode 100644 core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportOutputStreamTest.java delete mode 100644 core/src/test/java/org/springframework/ws/transport/http/HttpTransportRequestTest.java rename core/src/test/resources/org/springframework/ws/soap/{context => soap11}/soap11-attachment.bin (100%) rename core/src/test/resources/org/springframework/ws/soap/{context => soap11}/soap11.xml (100%) rename core/src/test/resources/org/springframework/ws/soap/{context => soap12}/soap12-attachment.bin (100%) rename core/src/test/resources/org/springframework/ws/soap/{context => soap12}/soap12.xml (100%) delete mode 100644 sandbox/src/main/java/org/springframework/ws/client/MarshallingWebServiceTemplate.java create mode 100644 sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java create mode 100644 sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageCallback.java create mode 100644 sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageExtractor.java create mode 100644 sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java create mode 100644 sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java rename core/src/main/java/org/springframework/ws/transport/TransportResponse.java => sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java (63%) create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportInputStream.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportOutputStream.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/http/SimpleHttpWebServiceMessageSender.java rename core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageContextFactoryTest.java => sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportException.java (55%) create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java create mode 100644 sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java create mode 100644 sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java create mode 100644 sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java diff --git a/core/src/main/java/org/springframework/ws/WebServiceMessage.java b/core/src/main/java/org/springframework/ws/WebServiceMessage.java index ddde8ffe..0acab316 100644 --- a/core/src/main/java/org/springframework/ws/WebServiceMessage.java +++ b/core/src/main/java/org/springframework/ws/WebServiceMessage.java @@ -47,7 +47,9 @@ public interface WebServiceMessage { Result getPayloadResult(); /** - * Writes the entire message to the given output stream. + * Writes the entire message to the given output stream. If the given stream is an instance of {@link + * org.springframework.ws.transport.TransportOutputStream TransportOutputStream}, the corresponding headers will be + * writen as well. * * @param outputStream the stream to write to * @throws IOException if an I/O exception occurs diff --git a/core/src/main/java/org/springframework/ws/WebServiceMessageFactory.java b/core/src/main/java/org/springframework/ws/WebServiceMessageFactory.java new file mode 100644 index 00000000..c66610e4 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/WebServiceMessageFactory.java @@ -0,0 +1,50 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws; + +import java.io.IOException; +import java.io.InputStream; + +/** + * The WebServiceMessageFactory serves as factory for {@link org.springframework.ws.WebServiceMessage + * WebServiceMessages}. Allows creation of empty messages, or messages based on InputStreams. + * + * @author Arjen Poutsma + * @see org.springframework.ws.WebServiceMessage + */ +public interface WebServiceMessageFactory { + + /** + * Creates a new, empty {@link WebServiceMessage}. + * + * @return the empty message + */ + WebServiceMessage createWebServiceMessage(); + + /** + * Reads {@link WebServiceMessage} from the given input stream. + *

+ * If the given stream is an instance of {@link org.springframework.ws.transport.TransportOutputStream + * TransportOutputStream}, the headers will be read from the request. + * + * @param inputStream the inputstream to read the message from + * @return the created message + * @throws java.io.IOException if an I/O exception occurs + */ + WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException; + +} diff --git a/core/src/main/java/org/springframework/ws/context/AbstractMessageContext.java b/core/src/main/java/org/springframework/ws/context/AbstractMessageContext.java deleted file mode 100644 index 22be2c99..00000000 --- a/core/src/main/java/org/springframework/ws/context/AbstractMessageContext.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.context; - -import java.util.HashMap; -import java.util.Map; - -import org.springframework.util.Assert; -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.transport.TransportRequest; - -/** - * Abstract implementation of the MessageContext interface. Contains functionality to set and remove - * properties. - * - * @author Arjen Poutsma - */ -public abstract class AbstractMessageContext implements MessageContext { - - private WebServiceMessage request; - - private WebServiceMessage response; - - private final TransportRequest transportRequest; - - /** - * Keys are Strings, values are Objects. Lazily initalized by - * getProperties(). - */ - private Map properties; - - /** - * Construct a new instance of the AbstractMessageContext with the given request message and - * transportRequest. - */ - protected AbstractMessageContext(WebServiceMessage request, TransportRequest transportRequest) { - Assert.notNull(request, "No request given"); - Assert.notNull(transportRequest, "No transport request given"); - this.request = request; - this.transportRequest = transportRequest; - } - - public final WebServiceMessage getRequest() { - return request; - } - - /** - * Protected method that sets the request message directly. - */ - protected final void setRequest(WebServiceMessage request) { - Assert.notNull(request); - this.request = request; - } - - public final WebServiceMessage getResponse() { - if (response == null) { - response = createResponseMessage(); - } - return response; - } - - public final boolean hasResponse() { - return response != null; - } - - public final TransportRequest getTransportRequest() { - return transportRequest; - } - - /** - * Protected method that sets the response message directly. - */ - protected final void setResponse(WebServiceMessage response) { - Assert.notNull(response); - this.response = response; - } - - private Map getProperties() { - if (properties == null) { - properties = new HashMap(); - } - return properties; - } - - public boolean containsProperty(String name) { - return getProperties().containsKey(name); - } - - public Object getProperty(String name) { - return getProperties().get(name); - } - - public String[] getPropertyNames() { - return (String[]) getProperties().keySet().toArray(new String[getProperties().size()]); - } - - public void removeProperty(String name) { - getProperties().remove(name); - } - - public void setProperty(String name, Object value) { - getProperties().put(name, value); - } - - /** - * Abstract template method that creates a new WebServiceMessage. - */ - protected abstract WebServiceMessage createResponseMessage(); -} diff --git a/core/src/main/java/org/springframework/ws/context/DefaultMessageContext.java b/core/src/main/java/org/springframework/ws/context/DefaultMessageContext.java new file mode 100644 index 00000000..df2ea32a --- /dev/null +++ b/core/src/main/java/org/springframework/ws/context/DefaultMessageContext.java @@ -0,0 +1,149 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.context; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.util.Assert; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; + +/** + * Simple implementation of MessageContext. + * + * @author Arjen Poutsma + */ +public class DefaultMessageContext implements MessageContext { + + private final WebServiceMessageFactory messageFactory; + + /** + * Keys are Strings, values are Objects. Lazily initalized by + * getProperties(). + */ + private Map properties; + + private WebServiceMessage request; + + private WebServiceMessage response; + + /** + * Construct a new, empty instance of the DefaultMessageContext with the given message factory. + */ + public DefaultMessageContext(WebServiceMessageFactory messageFactory) { + this(messageFactory.createWebServiceMessage(), messageFactory); + } + + /** + * Construct a new instance of the DefaultMessageContext with the given request message and message + * factory. + */ + public DefaultMessageContext(WebServiceMessage request, WebServiceMessageFactory messageFactory) { + Assert.notNull(request, "No request given"); + Assert.notNull(messageFactory, "messageFactory must not be null"); + this.request = request; + this.messageFactory = messageFactory; + } + + private Map getProperties() { + if (properties == null) { + properties = new HashMap(); + } + return properties; + } + + /** + * Returns the request message. + * + * @return the request message + */ + public WebServiceMessage getRequest() { + return request; + } + + /** + * Returns the response message. Creates a new response if no response is present. + * + * @return the response message + * @see #hasResponse() + */ + public WebServiceMessage getResponse() { + if (response == null) { + response = messageFactory.createWebServiceMessage(); + } + return response; + } + + /** + * Check if this message context contains a property with the given name. + * + * @param name the name of the property to look fo + * @return true if the MessageContext contains the property; false otherwise + */ + public boolean containsProperty(String name) { + return getProperties().containsKey(name); + } + + /** + * Gets the value of a specific property from the MessageContext. + * + * @param name name of the property whose value is to be retrieved + * @return value of the property + */ + public Object getProperty(String name) { + return getProperties().get(name); + } + + /** + * Return the names of all properties in this MessageContext. + * + * @return the names of all properties in this context, or an empty array if none defined + */ + public String[] getPropertyNames() { + return (String[]) getProperties().keySet().toArray(new String[getProperties().size()]); + } + + /** + * Indicates whether this context has a resonse. + * + * @return true if this context has a response; false otherwise + */ + public boolean hasResponse() { + return response != null; + } + + /** + * Removes a property from the MessageContext. + * + * @param name name of the property to be removed + */ + public void removeProperty(String name) { + getProperties().remove(name); + } + + /** + * Sets the name and value of a property associated with the MessageContext. If the + * MessageContext contains a value of the same property, the old value is replaced. + * + * @param name name of the property associated with the value + * @param value value of the property + */ + public void setProperty(String name, Object value) { + getProperties().put(name, value); + } +} diff --git a/core/src/main/java/org/springframework/ws/context/MessageContext.java b/core/src/main/java/org/springframework/ws/context/MessageContext.java index b5071f8b..86bc51aa 100644 --- a/core/src/main/java/org/springframework/ws/context/MessageContext.java +++ b/core/src/main/java/org/springframework/ws/context/MessageContext.java @@ -16,21 +16,13 @@ package org.springframework.ws.context; -import java.io.IOException; - import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; /** * Context holder for message requests. Contains both the message request as well as the response. Response message are * usually lazily created. - *

- * MessageContext implementations are constructed using a MessageContextFactory, taking a - * TransportContext as a parameter. * * @author Arjen Poutsma - * @see MessageContextFactory#createContext(org.springframework.ws.transport.TransportContext) */ public interface MessageContext { @@ -56,21 +48,6 @@ public interface MessageContext { */ boolean hasResponse(); - /** - * Returns the transport request used to create this context. Call be used for URL-based message routing. - * - * @return the transport request - */ - TransportRequest getTransportRequest(); - - /** - * Sends the response to the given transport response. - * - * @param transportResponse the transport used for sending - * @throws IOException if an I/O exception occurs - */ - void sendResponse(TransportResponse transportResponse) throws IOException; - /** * Sets the name and value of a property associated with the MessageContext. If the * MessageContext contains a value of the same property, the old value is replaced. diff --git a/core/src/main/java/org/springframework/ws/context/MessageContextFactory.java b/core/src/main/java/org/springframework/ws/context/MessageContextFactory.java deleted file mode 100644 index 2b17f279..00000000 --- a/core/src/main/java/org/springframework/ws/context/MessageContextFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.context; - -import java.io.IOException; - -import org.springframework.ws.transport.TransportContext; - -/** - * The MessageContextFactory serves as factory for MessageContexts. Allows creation of - * contexts based on TransportRequest. - * - * @author Arjen Poutsma - */ -public interface MessageContextFactory { - - /** - * Creates a MessageContext based on the given transport context. Implementations use the context - * request's input stream to create a request message, and possibly copy the request headers to the message. - *

- * Implementations are free to store the transport context for later reference. For instance, streaming - * implementations of MessageContextFactory might use the transport response to directly write a - * response message. - * - * @param transportContext the transport context which contains the request - * @return the created message context - * @throws IOException if an I/O exception occurs - */ - MessageContext createContext(TransportContext transportContext) throws IOException; - -} diff --git a/core/src/main/java/org/springframework/ws/endpoint/interceptor/AbstractValidatingInterceptor.java b/core/src/main/java/org/springframework/ws/endpoint/interceptor/AbstractValidatingInterceptor.java index 78c7a59b..a9acc4a3 100644 --- a/core/src/main/java/org/springframework/ws/endpoint/interceptor/AbstractValidatingInterceptor.java +++ b/core/src/main/java/org/springframework/ws/endpoint/interceptor/AbstractValidatingInterceptor.java @@ -37,7 +37,7 @@ import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapFault; import org.springframework.ws.soap.SoapFaultDetail; import org.springframework.ws.soap.SoapFaultDetailElement; -import org.springframework.ws.soap.context.SoapMessageContext; +import org.springframework.ws.soap.SoapMessage; import org.springframework.xml.namespace.QNameUtils; import org.springframework.xml.validation.XmlValidator; import org.springframework.xml.validation.XmlValidatorFactory; @@ -239,8 +239,8 @@ public abstract class AbstractValidatingInterceptor extends TransformerObjectSup for (int i = 0; i < errors.length; i++) { logger.warn("XML validation error on request: " + errors[i].getMessage()); } - if (messageContext instanceof SoapMessageContext) { - createRequestValidationFault((SoapMessageContext) messageContext, errors); + if (messageContext.getResponse() instanceof SoapMessage) { + createRequestValidationFault((SoapMessage) messageContext.getResponse(), errors); } return false; } @@ -296,9 +296,9 @@ public abstract class AbstractValidatingInterceptor extends TransformerObjectSup /** * Creates a response soap message containing a SoapFault that descibes the validation errors. */ - protected void createRequestValidationFault(SoapMessageContext context, SAXParseException[] errors) + protected void createRequestValidationFault(SoapMessage response, SAXParseException[] errors) throws TransformerException { - SoapBody body = context.getSoapResponse().getSoapBody(); + SoapBody body = response.getSoapBody(); SoapFault fault = body.addClientOrSenderFault(getFaultStringOrReason(), getFaultStringOrReasonLocale()); if (getAddValidationErrorDetail()) { SoapFaultDetail detail = fault.addFaultDetail(); diff --git a/core/src/main/java/org/springframework/ws/pox/context/AbstractPoxMessageContext.java b/core/src/main/java/org/springframework/ws/pox/context/AbstractPoxMessageContext.java deleted file mode 100644 index e75910fc..00000000 --- a/core/src/main/java/org/springframework/ws/pox/context/AbstractPoxMessageContext.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.pox.context; - -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.context.AbstractMessageContext; -import org.springframework.ws.pox.PoxMessage; -import org.springframework.ws.transport.TransportRequest; - -/** - * Abstract implementation of the PoxMessageContext interface. Implements base MessageContext - * methods by delegating to PoxMessageContext functionality. - * - * @author Arjen Poutsma - */ -public abstract class AbstractPoxMessageContext extends AbstractMessageContext implements PoxMessageContext { - - protected AbstractPoxMessageContext(PoxMessage request, TransportRequest transportRequest) { - super(request, transportRequest); - } - - public final PoxMessage getPoxResponse() { - return (PoxMessage) getResponse(); - } - - public final PoxMessage getPoxRequest() { - return (PoxMessage) getRequest(); - } - - protected final WebServiceMessage createResponseMessage() { - return createResponsePoxMessage(); - } - - protected abstract PoxMessage createResponsePoxMessage(); -} diff --git a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessage.java b/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessage.java index c40f273b..289c8c7f 100644 --- a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessage.java +++ b/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessage.java @@ -27,6 +27,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.springframework.ws.pox.PoxMessage; +import org.springframework.ws.transport.TransportOutputStream; import org.w3c.dom.Document; /** @@ -37,6 +38,8 @@ import org.w3c.dom.Document; */ public class DomPoxMessage implements PoxMessage { + private static final String CONTENT_TYPE = "text/xml"; + private final Document document; private Transformer transformer; @@ -68,10 +71,14 @@ public class DomPoxMessage implements PoxMessage { public void writeTo(OutputStream outputStream) throws IOException { try { + if (outputStream instanceof TransportOutputStream) { + TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; + transportOutputStream.addHeader("Content-Type", CONTENT_TYPE); + } transformer.transform(getPayloadSource(), new StreamResult(outputStream)); } catch (TransformerException ex) { - throw new DomPoxMessageException("Could not create transformer", ex); + throw new DomPoxMessageException("Could write document: " + ex.getMessage(), ex); } } } diff --git a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContext.java b/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContext.java deleted file mode 100644 index 5a5bbd23..00000000 --- a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContext.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.pox.dom; - -import java.io.IOException; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.transform.Transformer; - -import org.springframework.util.Assert; -import org.springframework.ws.pox.PoxMessage; -import org.springframework.ws.pox.context.AbstractPoxMessageContext; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; -import org.w3c.dom.Document; - -/** - * Implementation of the MessageContext that contains a DomPoxMessage. - * - * @author Arjen Poutsma - * @see DomPoxMessage - */ -public class DomPoxMessageContext extends AbstractPoxMessageContext { - - private DocumentBuilder documentBuilder; - - private Transformer transformer; - - /** - * Creates a new DomPoxMessageContext with the given parameters. - */ - public DomPoxMessageContext(Document request, - TransportRequest transportRequest, - DocumentBuilder documentBuilder, - Transformer transformer) { - super(new DomPoxMessage(request, transformer), transportRequest); - Assert.notNull(documentBuilder, "documentBuilder must not be null"); - Assert.notNull(transformer, "transformer must not be null"); - this.documentBuilder = documentBuilder; - this.transformer = transformer; - } - - protected PoxMessage createResponsePoxMessage() { - Document document = documentBuilder.newDocument(); - return new DomPoxMessage(document, transformer); - } - - public void sendResponse(TransportResponse transportResponse) throws IOException { - if (hasResponse()) { - transportResponse.addHeader("Content-Type", "text/xml"); - getResponse().writeTo(transportResponse.getOutputStream()); - } - } -} diff --git a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactory.java b/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageFactory.java similarity index 66% rename from core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactory.java rename to core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageFactory.java index 0a2cf0a0..b12d5aee 100644 --- a/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactory.java +++ b/core/src/main/java/org/springframework/ws/pox/dom/DomPoxMessageFactory.java @@ -17,6 +17,7 @@ package org.springframework.ws.pox.dom; import java.io.IOException; +import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -24,20 +25,19 @@ import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import org.springframework.beans.factory.InitializingBean; -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportRequest; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; import org.w3c.dom.Document; import org.xml.sax.SAXException; /** - * Implementation of the MessageContextFactory interface that creates a DOM + * Implementation of the {@link org.springframework.ws.WebServiceMessageFactory WebServiceMessageFactory} interinterface + * that creates a DOM PoxMessage. * * @author Arjen Poutsma - * @see DomPoxMessageContext + * @see org.springframework.ws.pox.dom.DomPoxMessage */ -public class DomPoxMessageContextFactory implements MessageContextFactory, InitializingBean { +public class DomPoxMessageFactory implements WebServiceMessageFactory, InitializingBean { private DocumentBuilderFactory documentBuilderFactory; @@ -68,15 +68,25 @@ public class DomPoxMessageContextFactory implements MessageContextFactory, Initi transformerFactory = TransformerFactory.newInstance(); } - public MessageContext createContext(TransportContext transportContext) throws IOException { - TransportRequest transportRequest = transportContext.getTransportRequest(); + public WebServiceMessage createWebServiceMessage() { try { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document request = documentBuilder.parse(transportRequest.getInputStream()); - return new DomPoxMessageContext(request, - transportRequest, - documentBuilder, - transformerFactory.newTransformer()); + Document request = documentBuilder.newDocument(); + return new DomPoxMessage(request, transformerFactory.newTransformer()); + } + catch (ParserConfigurationException ex) { + throw new DomPoxMessageException("Could not create message context", ex); + } + catch (TransformerConfigurationException ex) { + throw new DomPoxMessageException("Could not create transormer", ex); + } + } + + public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { + try { + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + Document request = documentBuilder.parse(inputStream); + return new DomPoxMessage(request, transformerFactory.newTransformer()); } catch (ParserConfigurationException ex) { throw new DomPoxMessageException("Could not create message context", ex); diff --git a/core/src/main/java/org/springframework/ws/soap/SoapMessageDispatcher.java b/core/src/main/java/org/springframework/ws/soap/SoapMessageDispatcher.java index 459cc7e0..7d8df9ae 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapMessageDispatcher.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapMessageDispatcher.java @@ -29,7 +29,6 @@ import org.springframework.ws.EndpointInterceptor; import org.springframework.ws.EndpointInvocationChain; import org.springframework.ws.MessageDispatcher; import org.springframework.ws.context.MessageContext; -import org.springframework.ws.soap.context.SoapMessageContext; import org.springframework.ws.soap.endpoint.SimpleSoapExceptionResolver; import org.springframework.ws.soap.soap12.Soap12Header; @@ -95,19 +94,19 @@ public class SoapMessageDispatcher extends MessageDispatcher { * @see SoapHeader#examineMustUnderstandHeaderElements(String) */ protected boolean handleRequest(EndpointInvocationChain mappedEndpoint, MessageContext messageContext) { - if (messageContext instanceof SoapMessageContext) { - SoapMessageContext soapContext = (SoapMessageContext) messageContext; - if (soapContext.getSoapRequest().getSoapHeader() == null) { + if (messageContext.getRequest() instanceof SoapMessage) { + SoapMessage soapRequest = (SoapMessage) messageContext.getRequest(); + if (soapRequest.getSoapHeader() == null) { // no headers to process return true; } - String[] roles = getRoles(mappedEndpoint, soapContext.getSoapRequest().getVersion()); + String[] roles = getRoles(mappedEndpoint, soapRequest.getVersion()); if (logger.isDebugEnabled()) { logger.debug("Handling MustUnderstand headers for actors/roles [" + StringUtils.arrayToCommaDelimitedString(roles)); } for (int i = 0; i < roles.length; i++) { - if (!handleRequestForRole(mappedEndpoint, soapContext, roles[i])) { + if (!handleRequestForRole(mappedEndpoint, messageContext, roles[i])) { return false; } } @@ -142,9 +141,9 @@ public class SoapMessageDispatcher extends MessageDispatcher { * @see SoapEndpointInterceptor#understands(SoapHeaderElement) */ private boolean handleRequestForRole(EndpointInvocationChain mappedEndpoint, - SoapMessageContext messageContext, + MessageContext messageContext, String actorOrRole) { - SoapHeader requestHeader = messageContext.getSoapRequest().getSoapHeader(); + SoapHeader requestHeader = ((SoapMessage) messageContext.getRequest()).getSoapHeader(); List notUnderstoodHeaderNames = new ArrayList(); for (Iterator iterator = requestHeader.examineMustUnderstandHeaderElements(actorOrRole); iterator.hasNext();) { SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next(); @@ -174,10 +173,11 @@ public class SoapMessageDispatcher extends MessageDispatcher { logger.warn("Could not handle mustUnderstand headers: " + StringUtils.collectionToCommaDelimitedString(notUnderstoodHeaderNames) + ". Returning fault"); } - SoapBody responseBody = messageContext.getSoapResponse().getSoapBody(); + SoapMessage soapResponse = (SoapMessage) messageContext.getResponse(); + SoapBody responseBody = soapResponse.getSoapBody(); SoapFault fault = responseBody.addMustUnderstandFault(mustUnderstandFault, mustUnderstandFaultLocale); fault.setFaultActorOrRole(actorOrRole); - SoapHeader header = messageContext.getSoapResponse().getSoapHeader(); + SoapHeader header = soapResponse.getSoapHeader(); if (header instanceof Soap12Header) { Soap12Header soap12Header = (Soap12Header) header; for (Iterator iterator = notUnderstoodHeaderNames.iterator(); iterator.hasNext();) { @@ -206,9 +206,9 @@ public class SoapMessageDispatcher extends MessageDispatcher { if (mappedEndpoint != null && messageContext.hasResponse() && !ObjectUtils.isEmpty(mappedEndpoint.getInterceptors())) { boolean hasFault = false; - if (messageContext instanceof SoapMessageContext) { - SoapMessageContext soapMessageContext = (SoapMessageContext) messageContext; - hasFault = soapMessageContext.getSoapResponse().getSoapBody().hasFault(); + if (messageContext.getResponse() instanceof SoapMessage) { + SoapMessage soapResponse = (SoapMessage) messageContext.getResponse(); + hasFault = soapResponse.getSoapBody().hasFault(); } boolean resume = true; for (int i = interceptorIndex; resume && i >= 0; i--) { diff --git a/core/src/main/java/org/springframework/ws/soap/SoapVersion.java b/core/src/main/java/org/springframework/ws/soap/SoapVersion.java index 66312994..0efbcc39 100644 --- a/core/src/main/java/org/springframework/ws/soap/SoapVersion.java +++ b/core/src/main/java/org/springframework/ws/soap/SoapVersion.java @@ -41,25 +41,25 @@ public interface SoapVersion { private static final String CONTENT_TYPE = "text/xml"; - private final QName ENVELOPE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Envelope"); + private QName ENVELOPE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Envelope"); - private final QName HEADER_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Header"); + private QName HEADER_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Header"); - private final QName BODY_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Body"); + private QName BODY_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Body"); - private final QName FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Fault"); + private QName FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Fault"); - private final QName MUST_UNDERSTAND_ATTRIBUTE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "mustUnderstand"); + private QName MUST_UNDERSTAND_ATTRIBUTE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "mustUnderstand"); - private final QName ACTOR_NAME = new QName(ENVELOPE_NAMESPACE_URI, "actor"); + private QName ACTOR_NAME = new QName(ENVELOPE_NAMESPACE_URI, "actor"); - private final QName CLIENT_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Client"); + private QName CLIENT_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Client"); - private final QName SERVER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Server"); + private QName SERVER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Server"); - private final QName MUST_UNDERSTAND_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "MustUnderstand"); + private QName MUST_UNDERSTAND_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "MustUnderstand"); - private final QName VERSION_MISMATCH_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "VersionMismatch"); + private QName VERSION_MISMATCH_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "VersionMismatch"); public QName getBodyName() { return BODY_NAME; @@ -143,25 +143,25 @@ public interface SoapVersion { private static final String CONTENT_TYPE = "application/soap+xml"; - private final QName ENVELOPE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Envelope"); + private QName ENVELOPE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Envelope"); - private final QName HEADER_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Header"); + private QName HEADER_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Header"); - private final QName BODY_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Body"); + private QName BODY_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Body"); - private final QName FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Fault"); + private QName FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Fault"); - private final QName MUST_UNDERSTAND_ATTRIBUTE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "mustUnderstand"); + private QName MUST_UNDERSTAND_ATTRIBUTE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "mustUnderstand"); - private final QName ROLE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "role"); + private QName ROLE_NAME = new QName(ENVELOPE_NAMESPACE_URI, "role"); - private final QName SENDER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Sender"); + private QName SENDER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Sender"); - private final QName RECEIVER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Receiver"); + private QName RECEIVER_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "Receiver"); - private final QName MUST_UNDERSTAND_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "MustUnderstand"); + private QName MUST_UNDERSTAND_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "MustUnderstand"); - private final QName VERSION_MISMATCH_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "VersionMismatch"); + private QName VERSION_MISMATCH_FAULT_NAME = new QName(ENVELOPE_NAMESPACE_URI, "VersionMismatch"); public QName getBodyName() { return BODY_NAME; diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java index 9bcbf71e..86952092 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessage.java @@ -20,24 +20,24 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.Arrays; import java.util.Iterator; -import javax.mail.MessagingException; -import javax.xml.stream.XMLStreamException; import javax.activation.DataHandler; +import javax.xml.stream.XMLStreamException; import org.apache.axiom.attachments.Attachments; -import org.apache.axiom.attachments.Part; import org.apache.axiom.om.OMException; +import org.apache.axiom.om.OMOutputFormat; import org.apache.axiom.soap.SOAPEnvelope; import org.apache.axiom.soap.SOAPFactory; import org.apache.axiom.soap.SOAPMessage; import org.apache.axiom.soap.SOAPProcessingException; import org.springframework.core.io.InputStreamSource; +import org.springframework.util.Assert; import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.Attachment; import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.util.Assert; +import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.TransportOutputStream; /** * AXIOM-specific implementation of the SoapMessage interface. Accessed via the @@ -48,7 +48,6 @@ import org.springframework.util.Assert; * * @author Arjen Poutsma * @see SOAPMessage - * @see AxiomSoapMessageContext */ public class AxiomSoapMessage extends AbstractSoapMessage { @@ -79,6 +78,19 @@ public class AxiomSoapMessage extends AbstractSoapMessage { * Create a new AxiomSoapMessage based on the given AXIOM SOAPMessage. * * @param soapMessage the AXIOM SOAPMessage + * @param payloadCaching whether the contents of the SOAP body should be cached or not + */ + public AxiomSoapMessage(SOAPMessage soapMessage, boolean payloadCaching) { + axiomMessage = soapMessage; + axiomFactory = (SOAPFactory) soapMessage.getSOAPEnvelope().getOMFactory(); + attachments = null; + this.payloadCaching = payloadCaching; + } + + /** + * Create a new AxiomSoapMessage based on the given AXIOM SOAPMessage and attachments. + * + * @param soapMessage the AXIOM SOAPMessage * @param attachments the attachments * @param payloadCaching whether the contents of the SOAP body should be cached or not */ @@ -138,7 +150,18 @@ public class AxiomSoapMessage extends AbstractSoapMessage { public void writeTo(OutputStream outputStream) throws IOException { try { - axiomMessage.serialize(outputStream); + String charsetEncoding = axiomMessage.getCharsetEncoding(); + + OMOutputFormat format = new OMOutputFormat(); + format.setCharSetEncoding(charsetEncoding); + format.setSOAP11(getVersion() == SoapVersion.SOAP_11); + if (outputStream instanceof TransportOutputStream) { + TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; + String contentType = format.getContentType(); + contentType += "; charset=\"" + charsetEncoding + "\""; + transportOutputStream.addHeader("Content-Type", contentType); + } + axiomMessage.serializeAndConsume(outputStream, format); } catch (XMLStreamException ex) { throw new AxiomSoapMessageException("Could not write message to OutputStream: " + ex.getMessage(), ex); diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContext.java deleted file mode 100644 index 7e43aace..00000000 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContext.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.axiom; - -import java.io.IOException; -import javax.xml.stream.XMLStreamException; - -import org.apache.axiom.om.OMOutputFormat; -import org.apache.axiom.soap.SOAPFactory; -import org.apache.axiom.soap.SOAPMessage; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.context.AbstractSoapMessageContext; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; - -/** - * AXIOM-specific implementation of the SoapMessageContext interface. Created by the - * AxiomSoapMessageContextFactory. - * - * @author Arjen Poutsma - * @see AxiomSoapMessageContextFactory - */ -public class AxiomSoapMessageContext extends AbstractSoapMessageContext { - - /** - * Creates a new instance based on the given Axiom request message, and a SOAP factory. - * - * @param messageRequest the request message - */ - public AxiomSoapMessageContext(AxiomSoapMessage messageRequest, TransportRequest transportRequest) { - super(messageRequest, transportRequest); - } - - protected SoapMessage createResponseSoapMessage() { - SOAPFactory soapFactory = (SOAPFactory) getAxiomRequest().getSOAPEnvelope().getOMFactory(); - return new AxiomSoapMessage(soapFactory); - } - - /** - * Returns the request as an Axiom SOAP message. - */ - public SOAPMessage getAxiomRequest() { - return ((AxiomSoapMessage) getSoapRequest()).getAxiomMessage(); - } - - /** - * Returns the response as an Axiom SOAP message. - */ - public SOAPMessage getAxiomResponse() { - return ((AxiomSoapMessage) getSoapResponse()).getAxiomMessage(); - } - - public void sendResponse(TransportResponse transportResponse) throws IOException { - try { - if (hasResponse()) { - AxiomSoapMessage response = (AxiomSoapMessage) getSoapResponse(); - SOAPMessage axiomResponse = response.getAxiomMessage(); - String charsetEncoding = axiomResponse.getCharsetEncoding(); - - OMOutputFormat format = new OMOutputFormat(); - format.setCharSetEncoding(charsetEncoding); - format.setSOAP11(response.getVersion() == SoapVersion.SOAP_11); - String contentType = format.getContentType(); - contentType += "; charset=\"" + charsetEncoding + "\""; - - transportResponse.addHeader("Content-Type", contentType); - axiomResponse.serializeAndConsume(transportResponse.getOutputStream(), format); - } - } - catch (XMLStreamException ex) { - throw new AxiomSoapMessageException("Could not write message to OutputStream: " + ex.getMessage(), ex); - } - } - -} diff --git a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContextFactory.java b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java similarity index 64% rename from core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContextFactory.java rename to core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java index f4944c8a..17b3eea9 100644 --- a/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageContextFactory.java +++ b/core/src/main/java/org/springframework/ws/soap/axiom/AxiomSoapMessageFactory.java @@ -38,49 +38,49 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.SoapMessageCreationException; -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportRequest; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.transport.TransportInputStream; /** - * Axiom-specific implementation of the MessageContextFactory interface. Creates a - * AxiomSoapMessageContext. + * Axiom-specific implementation of the {@link org.springframework.ws.WebServiceMessageFactory WebServiceMessageFactory} + * interface. Creates {@link org.springframework.ws.soap.axiom.AxiomSoapMessage AxiomSoapMessages}. *

* To increase reading performance on the the SOAP request created by this message context factory, you can set the * payloadCaching property to false (default is true). This this will read the - * contents of the body directly from the TransportRequest. However, when this setting is enabled, - * the payload can only be read once. This means that any endpoint mappings or interceptors which are based on - * the message payload (such as the PayloadRootQNameEndpointMapping, the - * PayloadValidatingInterceptor, or the PayloadLoggingInterceptor) cannot be used. Instead, - * use an endpoint mapping that does not consume the payload (i.e. the SoapActionEndpointMapping). + * contents of the body directly from the stream. However, when this setting is enabled, the payload can only be + * read once. This means that any endpoint mappings or interceptors which are based on the message payload + * (such as the PayloadRootQNameEndpointMapping, the PayloadValidatingInterceptor, or the + * PayloadLoggingInterceptor) cannot be used. Instead, use an endpoint mapping that does not consume the + * payload (i.e. the SoapActionEndpointMapping). *

* Mostly derived from org.apache.axis2.transport.http.HTTPTransportUtils and * org.apache.axis2.transport.TransportUtils, which we cannot use since they are not part of the Axiom * distribution. * * @author Arjen Poutsma - * @see AxiomSoapMessageContext + * @see AxiomSoapMessage * @see #setPayloadCaching(boolean) */ -public class AxiomSoapMessageContextFactory implements MessageContextFactory, InitializingBean { - - private static final Log logger = LogFactory.getLog(AxiomSoapMessageContextFactory.class); +public class AxiomSoapMessageFactory implements WebServiceMessageFactory, InitializingBean { private static final String CHAR_SET_ENCODING = "charset"; - private static final String DEFAULT_CHAR_SET_ENCODING = "UTF-8"; - private static final String CONTENT_TYPE_HEADER = "Content-Type"; + private static final String DEFAULT_CHAR_SET_ENCODING = "UTF-8"; + private static final String MULTI_PART_RELATED_CONTENT_TYPE = "multipart/related"; + private static final Log logger = LogFactory.getLog(AxiomSoapMessageFactory.class); + + private XMLInputFactory inputFactory; + private boolean payloadCaching = true; - private SOAP11Factory soap11Factory; + private SOAP11Factory soap11Factory = new SOAP11Factory(); - private SOAP12Factory soap12Factory; + private SOAP12Factory soap12Factory = new SOAP12Factory(); /** * Indicates whether the SOAP Body payload should be cached or not. Default is true. Setting this to @@ -91,54 +91,67 @@ public class AxiomSoapMessageContextFactory implements MessageContextFactory, In this.payloadCaching = payloadCaching; } - private XMLInputFactory inputFactory; - public void afterPropertiesSet() throws Exception { inputFactory = XMLInputFactory.newInstance(); - soap11Factory = new SOAP11Factory(); - soap12Factory = new SOAP12Factory(); if (logger.isInfoEnabled()) { logger.info(payloadCaching ? "Enabled payload caching" : "Disabled payload caching"); } } - public MessageContext createContext(TransportContext transportContext) throws IOException { - TransportRequest transportRequest = transportContext.getTransportRequest(); - Iterator iterator = transportRequest.getHeaders(CONTENT_TYPE_HEADER); - Assert.isTrue(iterator.hasNext(), "No " + CONTENT_TYPE_HEADER + " header present of TransportRequest"); - String contentType = (String) iterator.next(); + public WebServiceMessage createWebServiceMessage() { + return new AxiomSoapMessage(soap11Factory); + } + + public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { + String contentType = null; + if (inputStream instanceof TransportInputStream) { + TransportInputStream transportInputStream = (TransportInputStream) inputStream; + Iterator iterator = transportInputStream.getHeaders(CONTENT_TYPE_HEADER); + Assert.isTrue(iterator.hasNext(), "No " + CONTENT_TYPE_HEADER + " header present of TransportRequest"); + contentType = (String) iterator.next(); + } Assert.hasLength(contentType, "No " + CONTENT_TYPE_HEADER + " header present of TransportRequest"); - InputStream inputStream = transportRequest.getInputStream(); try { - AxiomSoapMessage requestMessage; - if (contentType.indexOf(MULTI_PART_RELATED_CONTENT_TYPE) == -1) { - XMLStreamReader reader = - inputFactory.createXMLStreamReader(inputStream, getCharSetEncoding(contentType)); - SOAPFactory soapFactory = getSoapFactory(contentType); - StAXSOAPModelBuilder builder = - new StAXSOAPModelBuilder(reader, soapFactory, soapFactory.getSoapVersionURI()); - requestMessage = createAxiomSoapMessage(builder, null); + if (isMultiPartRelated(contentType)) { + return createMultiPartAxiomSoapMessage(inputStream, contentType); } else { - requestMessage = createMultiPartAxiomSoapMessage(inputStream, contentType); + return createAxiomSoapMessage(inputStream, contentType); } - return new AxiomSoapMessageContext(requestMessage, transportRequest); - } catch (XMLStreamException ex) { - throw new SoapMessageCreationException("Could not create message: " + ex.getMessage(), ex); + throw new AxiomSoapMessageCreationException("Could not parse request: " + ex.getMessage(), ex); } catch (OMException ex) { - throw new SoapMessageCreationException("Could not create message: " + ex.getMessage(), ex); + throw new AxiomSoapMessageCreationException("Could not create message: " + ex.getMessage(), ex); } } + private boolean isMultiPartRelated(String contentType) { + return contentType.indexOf(MULTI_PART_RELATED_CONTENT_TYPE) != -1; + } + + /** + * Creates an AxiomSoapMessage without attachments. + */ + private WebServiceMessage createAxiomSoapMessage(InputStream inputStream, String contentType) + throws XMLStreamException { + XMLStreamReader reader = inputFactory.createXMLStreamReader(inputStream, getCharSetEncoding(contentType)); + SOAPFactory soapFactory = getSoapFactory(contentType); + StAXSOAPModelBuilder builder = new StAXSOAPModelBuilder(reader, soapFactory, soapFactory.getSoapVersionURI()); + SOAPMessage soapMessage = builder.getSoapMessage(); + return new AxiomSoapMessage(soapMessage, payloadCaching); + } + + /** + * Creates an AxiomSoapMessage with attachments. + */ private AxiomSoapMessage createMultiPartAxiomSoapMessage(InputStream inputStream, String contentType) throws XMLStreamException { Attachments attachments = new Attachments(inputStream, contentType); if (!(attachments.getAttachmentSpecType().equals(MTOMConstants.SWA_TYPE) || attachments.getAttachmentSpecType().equals(MTOMConstants.MTOM_TYPE))) { - throw new SoapMessageCreationException( + throw new AxiomSoapMessageCreationException( "Unknown attachment type: [" + attachments.getAttachmentSpecType() + "]"); } XMLStreamReader reader = inputFactory.createXMLStreamReader(attachments.getSOAPPartInputStream(), @@ -154,18 +167,6 @@ public class AxiomSoapMessageContextFactory implements MessageContextFactory, In return new AxiomSoapMessage(builder.getSoapMessage(), attachments, payloadCaching); } - /** - * Creates a new AxiomSoapMessage based on the given parameters. - * - * @param modelBuilder the builder used to optain the Axiom SOAPMessage - * @param attachments the attachments, can be null - * @return the created message - */ - private AxiomSoapMessage createAxiomSoapMessage(StAXSOAPModelBuilder modelBuilder, Attachments attachments) { - SOAPMessage soapMessage = modelBuilder.getSoapMessage(); - return new AxiomSoapMessage(soapMessage, attachments, payloadCaching); - } - private SOAPFactory getSoapFactory(String contentType) { if (contentType.indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) != -1) { return soap11Factory; @@ -174,7 +175,7 @@ public class AxiomSoapMessageContextFactory implements MessageContextFactory, In return soap12Factory; } else { - throw new SoapMessageCreationException("Unknown content type '" + contentType + "'"); + throw new AxiomSoapMessageCreationException("Unknown content type '" + contentType + "'"); } } @@ -209,4 +210,5 @@ public class AxiomSoapMessageContextFactory implements MessageContextFactory, In return value.trim(); } } + } diff --git a/core/src/main/java/org/springframework/ws/soap/context/AbstractSoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/context/AbstractSoapMessageContext.java deleted file mode 100644 index 7a32656d..00000000 --- a/core/src/main/java/org/springframework/ws/soap/context/AbstractSoapMessageContext.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.context.AbstractMessageContext; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.transport.TransportRequest; - -/** - * Abstract implementation of the SoapMessageContext interface. Implements base MessageContext - * methods by delegating to SoapMessageContext functionality. - * - * @author Arjen Poutsma - */ -public abstract class AbstractSoapMessageContext extends AbstractMessageContext implements SoapMessageContext { - - protected AbstractSoapMessageContext(SoapMessage request, TransportRequest transportRequest) { - super(request, transportRequest); - } - - public final SoapMessage getSoapResponse() { - return (SoapMessage) getResponse(); - } - - public final SoapMessage getSoapRequest() { - return (SoapMessage) getRequest(); - } - - protected final WebServiceMessage createResponseMessage() { - return createResponseSoapMessage(); - } - - protected abstract SoapMessage createResponseSoapMessage(); -} diff --git a/core/src/main/java/org/springframework/ws/soap/context/SoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/context/SoapMessageContext.java deleted file mode 100644 index a5161271..00000000 --- a/core/src/main/java/org/springframework/ws/soap/context/SoapMessageContext.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.soap.SoapMessage; - -/** - * SOAP-specific extension of the MessageContext interface. Contains methods to obtain - * SoapMessages instead of WebServiceMessages. - * - * @author Arjen Poutsma - */ -public interface SoapMessageContext extends MessageContext { - - /** - * Returns the request SOAP message. - * - * @return the request message - */ - SoapMessage getSoapRequest(); - - /** - * Returns the response message, if created. Returns null if no response message was created so far. - * - * @return the response message, or null if none was created - * @see #hasResponse() - */ - SoapMessage getSoapResponse(); - - -} diff --git a/core/src/main/java/org/springframework/ws/soap/context/package.html b/core/src/main/java/org/springframework/ws/soap/context/package.html deleted file mode 100644 index 7f5e8b44..00000000 --- a/core/src/main/java/org/springframework/ws/soap/context/package.html +++ /dev/null @@ -1,5 +0,0 @@ - - -Contains the SoapMessageContext interface. - - diff --git a/core/src/main/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolver.java b/core/src/main/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolver.java index bfa2ea64..453f5aec 100644 --- a/core/src/main/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolver.java +++ b/core/src/main/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolver.java @@ -2,11 +2,12 @@ package org.springframework.ws.soap.endpoint; import java.util.Locale; +import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.AbstractEndpointExceptionResolver; import org.springframework.ws.soap.SoapBody; -import org.springframework.ws.soap.context.SoapMessageContext; +import org.springframework.ws.soap.SoapMessage; /** * Simple, SOAP-specific implementation of the EndpointExceptionResolver that stores the exception's @@ -26,12 +27,11 @@ public class SimpleSoapExceptionResolver extends AbstractEndpointExceptionResolv } protected boolean resolveExceptionInternal(MessageContext messageContext, Object endpoint, Exception ex) { - if (!(messageContext instanceof SoapMessageContext)) { - throw new IllegalArgumentException("SimpleSoapExceptionResolver requires a SoapMessageContext"); - } + Assert.isTrue(messageContext.getResponse() instanceof SoapMessage, + "SimpleSoapExceptionResolver requires a SoapMessage"); + SoapMessage response = (SoapMessage) messageContext.getResponse(); String faultString = StringUtils.hasLength(ex.getMessage()) ? ex.getMessage() : ex.toString(); - SoapMessageContext soapContext = (SoapMessageContext) messageContext; - SoapBody body = soapContext.getSoapResponse().getSoapBody(); + SoapBody body = response.getSoapBody(); body.addServerOrReceiverFault(faultString, locale); return true; } diff --git a/core/src/main/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolver.java b/core/src/main/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolver.java index 8219215d..5234e1fe 100644 --- a/core/src/main/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolver.java +++ b/core/src/main/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolver.java @@ -19,11 +19,11 @@ package org.springframework.ws.soap.endpoint; import java.util.Enumeration; import java.util.Properties; +import org.springframework.util.Assert; import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.AbstractEndpointExceptionResolver; import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.context.SoapMessageContext; import org.springframework.ws.soap.soap11.Soap11Body; /** @@ -63,16 +63,15 @@ public class SoapFaultMappingExceptionResolver extends AbstractEndpointException } protected boolean resolveExceptionInternal(MessageContext messageContext, Object endpoint, Exception ex) { - if (!(messageContext instanceof SoapMessageContext)) { - throw new IllegalArgumentException("SoapFaultMappingExceptionResolver requires a SoapMessageContext"); - } + Assert.isTrue(messageContext.getResponse() instanceof SoapMessage, + "SimpleSoapExceptionResolver requires a SoapMessage"); + SoapFaultDefinition definition = getFaultDefinition(ex); if (definition == null) { return false; } - SoapMessageContext soapContext = (SoapMessageContext) messageContext; - SoapMessage response = soapContext.getSoapResponse(); - SoapBody soapBody = response.getSoapBody(); + SoapMessage soapResponse = (SoapMessage) messageContext.getResponse(); + SoapBody soapBody = soapResponse.getSoapBody(); if (SoapFaultDefinition.SERVER.equals(definition.getFaultCode()) || SoapFaultDefinition.RECEIVER.equals(definition.getFaultCode())) { diff --git a/core/src/main/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMapping.java b/core/src/main/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMapping.java index cd354fa7..a3594fa7 100644 --- a/core/src/main/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMapping.java +++ b/core/src/main/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMapping.java @@ -26,6 +26,8 @@ import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.mapping.AbstractMapBasedEndpointMapping; import org.springframework.ws.soap.SoapEndpointInvocationChain; import org.springframework.ws.soap.SoapEndpointMapping; +import org.springframework.ws.transport.TransportContext; +import org.springframework.ws.transport.TransportContextHolder; /** * Implementation of the EndpointMapping interface to map from SOAPAction headers to endpoint @@ -85,7 +87,10 @@ public class SoapActionEndpointMapping extends AbstractMapBasedEndpointMapping i } protected String getLookupKeyForMessage(MessageContext messageContext) throws Exception { - Iterator iterator = messageContext.getTransportRequest().getHeaders(SOAP_ACTION_HEADER); + TransportContext transportContext = TransportContextHolder.getTransportContext(); + Assert.notNull(transportContext, + "No TransportContext associated with current thread, cannot read SOAPAction header"); + Iterator iterator = transportContext.getTransportInputStream().getHeaders(SOAP_ACTION_HEADER); String soapAction = ""; if (iterator.hasNext()) { soapAction = (String) iterator.next(); diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java index ab3c0433..1eb56e24 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessage.java @@ -26,6 +26,7 @@ import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.xml.soap.AttachmentPart; +import javax.xml.soap.MimeHeader; import javax.xml.soap.MimeHeaders; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; @@ -34,12 +35,12 @@ import javax.xml.soap.SOAPMessage; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; import org.springframework.ws.soap.AbstractSoapMessage; import org.springframework.ws.soap.Attachment; import org.springframework.ws.soap.AttachmentException; import org.springframework.ws.soap.SoapEnvelope; -import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.saaj.support.SaajUtils; +import org.springframework.ws.transport.TransportOutputStream; /** * SAAJ-specific implementation of the SoapMessage interface. Accessed via the @@ -47,11 +48,10 @@ import org.springframework.ws.soap.saaj.support.SaajUtils; * * @author Arjen Poutsma * @see javax.xml.soap.SOAPMessage - * @see SaajSoapMessageContext */ public abstract class SaajSoapMessage extends AbstractSoapMessage { - private final SOAPMessage saajMessage; + private SOAPMessage saajMessage; private SoapEnvelope envelope; @@ -61,6 +61,7 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { * @param soapMessage the SAAJ SOAPMessage */ protected SaajSoapMessage(SOAPMessage soapMessage) { + Assert.notNull(soapMessage, "soapMessage must not be null"); saajMessage = soapMessage; } @@ -71,6 +72,14 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { return saajMessage; } + /** + * Sets the SAAJ SOAPMessage that this SaajSoapMessage is based on. + */ + public final void setSaajMessage(SOAPMessage soapMessage) { + Assert.notNull(soapMessage, "soapMessage must not be null"); + saajMessage = soapMessage; + } + public final SoapEnvelope getEnvelope() { if (envelope == null) { try { @@ -91,6 +100,21 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { if (saajMessage.saveRequired()) { saajMessage.saveChanges(); } + if (outputStream instanceof TransportOutputStream) { + TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream; + // some SAAJ implementations (Axis 1) do not have a Content-Type header by default + MimeHeaders headers = saajMessage.getMimeHeaders(); + if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { + headers.addHeader("Content-Type", getVersion().getContentType()); + if (saajMessage.saveRequired()) { + saajMessage.saveChanges(); + } + } + for (Iterator iterator = headers.getAllHeaders(); iterator.hasNext();) { + MimeHeader mimeHeader = (MimeHeader) iterator.next(); + transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue()); + } + } saajMessage.writeTo(outputStream); } catch (SOAPException ex) { @@ -163,15 +187,6 @@ public abstract class SaajSoapMessage extends AbstractSoapMessage { }; } - public SoapVersion getVersion() { - if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { - return SoapVersion.SOAP_11; - } - else { - return super.getVersion(); - } - } - /** * SAAJ-specific implementation of org.springframework.ws.soap.Attachment */ diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContext.java deleted file mode 100644 index f91e8e6b..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContext.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj; - -import java.io.IOException; -import java.util.Iterator; -import javax.xml.soap.MessageFactory; -import javax.xml.soap.MimeHeader; -import javax.xml.soap.MimeHeaders; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPMessage; - -import org.springframework.util.Assert; -import org.springframework.util.ObjectUtils; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.SoapMessageCreationException; -import org.springframework.ws.soap.context.AbstractSoapMessageContext; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; - -/** - * SAAJ-specific implementation of the SoapMessageContext interface. Created by the - * SaajSoapMessageContextFactory. - * - * @author Arjen Poutsma - * @see SaajSoapMessageContextFactory - */ -public abstract class SaajSoapMessageContext extends AbstractSoapMessageContext { - - private final MessageFactory messageFactory; - - /** - * Creates a new instance based on the given SAAJ request message, and a message factory. - * - * @param request the request message - * @param transportRequest the transport request - * @param messageFactory the message factory used for creating a response - */ - protected SaajSoapMessageContext(SaajSoapMessage request, - TransportRequest transportRequest, - MessageFactory messageFactory) { - super(request, transportRequest); - Assert.notNull(messageFactory); - this.messageFactory = messageFactory; - } - - public final void sendResponse(TransportResponse transportResponse) throws IOException { - if (hasResponse()) { - SOAPMessage response = getSaajResponse(); - try { - if (response.saveRequired()) { - response.saveChanges(); - } - // some SAAJ implementations (Axis 1) do not have a Content-Type header by default - MimeHeaders headers = response.getMimeHeaders(); - if (ObjectUtils.isEmpty(headers.getHeader("Content-Type"))) { - headers.addHeader("Content-Type", getSoapResponse().getVersion().getContentType()); - if (response.saveRequired()) { - response.saveChanges(); - } - } - for (Iterator iterator = headers.getAllHeaders(); iterator.hasNext();) { - MimeHeader mimeHeader = (MimeHeader) iterator.next(); - transportResponse.addHeader(mimeHeader.getName(), mimeHeader.getValue()); - } - response.writeTo(transportResponse.getOutputStream()); - } - catch (SOAPException ex) { - throw new SaajSoapMessageException("Could not write message to TransportResponse: " + ex.getMessage(), - ex); - } - } - } - - protected SoapMessage createResponseSoapMessage() { - try { - SOAPMessage saajMessage = messageFactory.createMessage(); - return createSaajSoapMessage(saajMessage); - } - catch (SOAPException ex) { - throw new SoapMessageCreationException("Could not create message: " + ex.toString(), ex); - } - } - - /** - * Creates a new SaajSoapMessage using the given SAAJ message. - */ - protected abstract SaajSoapMessage createSaajSoapMessage(SOAPMessage saajMessage); - - /** - * Returns the request as a SAAJ SOAP message. - */ - public final SOAPMessage getSaajRequest() { - return ((SaajSoapMessage) getSoapRequest()).getSaajMessage(); - } - - /** - * Returns the response as a SAAJ SOAP message. - */ - public final SOAPMessage getSaajResponse() { - return ((SaajSoapMessage) getSoapResponse()).getSaajMessage(); - } - - /** - * Sets the request to the given SAAJ SOAP message. - */ - public abstract void setSaajRequest(SOAPMessage request); - - /** - * Sets the response to the given SAAJ SOAP message. - */ - public abstract void setSaajResponse(SOAPMessage response); -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContextFactory.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContextFactory.java deleted file mode 100644 index f57f2f3f..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageContextFactory.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2005 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj; - -import java.io.IOException; -import java.util.Iterator; -import java.util.StringTokenizer; -import javax.xml.soap.MessageFactory; -import javax.xml.soap.MimeHeaders; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; -import javax.xml.soap.SOAPMessage; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.util.StringUtils; -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.SoapMessageCreationException; -import org.springframework.ws.soap.saaj.saaj12.Saaj12SoapMessageContext; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; -import org.springframework.ws.soap.saaj.support.SaajUtils; -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportRequest; - -/** - * SAAJ-specific implementation of the MessageContextFactory interface. Creates a - * SaajSoapMessageContext. This factory will use SAAJ 1.3 when found, or fall back to SAAJ 1.2. - * - * @author Arjen Poutsma - * @see SaajSoapMessageContext - */ -public class SaajSoapMessageContextFactory implements MessageContextFactory, InitializingBean { - - private static final Log logger = LogFactory.getLog(SaajSoapMessageContextFactory.class); - - private MessageFactory messageFactory; - - private String messageFactoryProtocol; - - public void setMessageFactory(MessageFactory messageFactory) { - this.messageFactory = messageFactory; - } - - /** - * Sets the protocol for the MessageFactory. Only used for SAAJ 1.3+, defaults to - * SOAPConstants.DEFAULT_SOAP_PROTOCOL (i.e. SOAP 1.1). - * - * @see MessageFactory#newInstance(String) - * @see SOAPConstants#DEFAULT_SOAP_PROTOCOL - * @see SOAPConstants#SOAP_1_1_PROTOCOL - * @see SOAPConstants#SOAP_1_2_PROTOCOL - * @see SOAPConstants#DYNAMIC_SOAP_PROTOCOL - */ - public void setSoapProtocol(String messageFactoryProtocol) { - this.messageFactoryProtocol = messageFactoryProtocol; - } - - public void afterPropertiesSet() throws Exception { - if (messageFactory == null) { - try { - if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) { - if (!StringUtils.hasLength(messageFactoryProtocol)) { - messageFactoryProtocol = SOAPConstants.DEFAULT_SOAP_PROTOCOL; - } - if (logger.isInfoEnabled()) { - logger.info("Creating SAAJ 1.3 MessageFactory with " + messageFactoryProtocol); - } - messageFactory = MessageFactory.newInstance(messageFactoryProtocol); - } - else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { - if (logger.isInfoEnabled()) { - logger.info("Creating SAAJ 1.2 MessageFactory"); - } - messageFactory = MessageFactory.newInstance(); - } - else { - throw new IllegalStateException("SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + - "found on the classpath"); - } - } - catch (SOAPException ex) { - throw new SoapMessageCreationException("Could not create MessageFactory: " + ex.getMessage(), ex); - } - } - } - - public MessageContext createContext(TransportContext transportContext) throws IOException { - TransportRequest transportRequest = transportContext.getTransportRequest(); - MimeHeaders mimeHeaders = new MimeHeaders(); - for (Iterator headerNames = transportRequest.getHeaderNames(); headerNames.hasNext();) { - String headerName = (String) headerNames.next(); - for (Iterator headerValues = transportRequest.getHeaders(headerName); headerValues.hasNext();) { - String headerValue = (String) headerValues.next(); - StringTokenizer tokenizer = new StringTokenizer(headerValue, ","); - while (tokenizer.hasMoreTokens()) { - mimeHeaders.addHeader(headerName, tokenizer.nextToken().trim()); - } - } - } - try { - SOAPMessage requestMessage = messageFactory.createMessage(mimeHeaders, transportRequest.getInputStream()); - if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) { - return new Saaj13SoapMessageContext(requestMessage, transportRequest, messageFactory); - } - else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { - return new Saaj12SoapMessageContext(requestMessage, transportRequest, messageFactory); - } - else { - throw new IllegalStateException( - "SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + "found on the classpath"); - } - } - catch (SOAPException ex) { - throw new SoapMessageCreationException("Could not create message from TransportRequest: " + ex.getMessage(), - ex); - } - } - -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java new file mode 100644 index 00000000..ad49a6f5 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/soap/saaj/SaajSoapMessageFactory.java @@ -0,0 +1,141 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.saaj; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import java.util.StringTokenizer; +import javax.xml.soap.MessageFactory; +import javax.xml.soap.MimeHeaders; +import javax.xml.soap.SOAPConstants; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPMessage; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.StringUtils; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.soap.SoapMessageCreationException; +import org.springframework.ws.soap.saaj.saaj12.Saaj12SoapMessage; +import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage; +import org.springframework.ws.soap.saaj.support.SaajUtils; +import org.springframework.ws.transport.TransportInputStream; + +/** + * SAAJ-specific implementation of the {@link org.springframework.ws.WebServiceMessageFactory WebServiceMessageFactory}. + * This factory will use SAAJ 1.3 when found, or fall back to SAAJ 1.2. + * + * @author Arjen Poutsma + * @see org.springframework.ws.soap.saaj.SaajSoapMessage + */ +public class SaajSoapMessageFactory implements WebServiceMessageFactory, InitializingBean { + + private static final Log logger = LogFactory.getLog(SaajSoapMessageFactory.class); + + private MessageFactory messageFactory; + + private String messageFactoryProtocol; + + public void afterPropertiesSet() throws Exception { + try { + if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) { + if (!StringUtils.hasLength(messageFactoryProtocol)) { + messageFactoryProtocol = SOAPConstants.DEFAULT_SOAP_PROTOCOL; + } + if (logger.isInfoEnabled()) { + logger.info("Creating SAAJ 1.3 MessageFactory with " + messageFactoryProtocol); + } + messageFactory = MessageFactory.newInstance(messageFactoryProtocol); + } + else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { + if (logger.isInfoEnabled()) { + logger.info("Creating SAAJ 1.2 MessageFactory"); + } + messageFactory = MessageFactory.newInstance(); + } + else { + throw new IllegalStateException( + "SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + "found on the classpath"); + } + } + catch (SOAPException ex) { + throw new SoapMessageCreationException("Could not create MessageFactory: " + ex.getMessage(), ex); + } + } + + public WebServiceMessage createWebServiceMessage() { + try { + return createSaajSoapMessage(messageFactory.createMessage()); + } + catch (SOAPException ex) { + throw new SoapMessageCreationException("Could not create empty message: " + ex.getMessage(), ex); + } + } + + public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { + MimeHeaders mimeHeaders = new MimeHeaders(); + if (inputStream instanceof TransportInputStream) { + TransportInputStream transportInputStream = (TransportInputStream) inputStream; + for (Iterator headerNames = transportInputStream.getHeaderNames(); headerNames.hasNext();) { + String headerName = (String) headerNames.next(); + for (Iterator headerValues = transportInputStream.getHeaders(headerName); headerValues.hasNext();) { + String headerValue = (String) headerValues.next(); + StringTokenizer tokenizer = new StringTokenizer(headerValue, ","); + while (tokenizer.hasMoreTokens()) { + mimeHeaders.addHeader(headerName, tokenizer.nextToken().trim()); + } + } + } + } + try { + return createSaajSoapMessage(messageFactory.createMessage(mimeHeaders, inputStream)); + } + catch (SOAPException ex) { + throw new SoapMessageCreationException("Could not create message from InputStream: " + ex.getMessage(), ex); + } + } + + private WebServiceMessage createSaajSoapMessage(SOAPMessage requestMessage) { + if (SaajUtils.getSaajVersion() >= SaajUtils.SAAJ_13) { + return new Saaj13SoapMessage(requestMessage); + } + else if (SaajUtils.getSaajVersion() == SaajUtils.SAAJ_12) { + return new Saaj12SoapMessage(requestMessage); + } + else { + throw new IllegalStateException( + "SaajSoapMessageContextFactory requires SAAJ 1.2, which was not" + "found on the classpath"); + } + } + + /** + * Sets the protocol for the MessageFactory. Only used for SAAJ 1.3+, defaults to + * SOAPConstants.DEFAULT_SOAP_PROTOCOL (i.e. SOAP 1.1). + * + * @see MessageFactory#newInstance(String) + * @see javax.xml.soap.SOAPConstants#DEFAULT_SOAP_PROTOCOL + * @see javax.xml.soap.SOAPConstants#SOAP_1_1_PROTOCOL + * @see javax.xml.soap.SOAPConstants#SOAP_1_2_PROTOCOL + * @see javax.xml.soap.SOAPConstants#DYNAMIC_SOAP_PROTOCOL + */ + public void setSoapProtocol(String messageFactoryProtocol) { + this.messageFactoryProtocol = messageFactoryProtocol; + } +} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java index 9a416c74..e5ef46a8 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessage.java @@ -20,17 +20,16 @@ import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; import org.springframework.ws.soap.SoapEnvelope; +import org.springframework.ws.soap.SoapVersion; import org.springframework.ws.soap.saaj.SaajSoapMessage; /** - * SAAJ 1.2 specific implementation of the SoapMessage interface. Accessed via the - * SaajSoapMessageContext. + * SAAJ 1.2 specific implementation of the SoapMessage interface. * * @author Arjen Poutsma * @see javax.xml.soap.SOAPMessage - * @see org.springframework.ws.soap.saaj.SaajSoapMessageContext */ -class Saaj12SoapMessage extends SaajSoapMessage { +public class Saaj12SoapMessage extends SaajSoapMessage { public Saaj12SoapMessage(SOAPMessage soapMessage) { super(soapMessage); @@ -40,4 +39,7 @@ class Saaj12SoapMessage extends SaajSoapMessage { return new Saaj12SoapEnvelope(saajEnvelope); } + public SoapVersion getVersion() { + return SoapVersion.SOAP_11; + } } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessageContext.java deleted file mode 100644 index 8ffcb9f6..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj12/Saaj12SoapMessageContext.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj.saaj12; - -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPMessage; - -import org.springframework.ws.soap.saaj.SaajSoapMessage; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.transport.TransportRequest; - -/** - * SAAJ 1.2 specific implementation of the SoapMessageContext interface. Created by the - * SaajSoapMessageContextFactory. - * - * @author Arjen Poutsma - * @see org.springframework.ws.soap.saaj.SaajSoapMessageContextFactory - */ -public class Saaj12SoapMessageContext extends SaajSoapMessageContext { - - /** - * Creates a new instance based on the given SAAJ request message, and a message factory. - * - * @param request the request message - * @param transportRequest the transport request - * @param messageFactory the message factory used for creating a response - */ - public Saaj12SoapMessageContext(SOAPMessage request, - TransportRequest transportRequest, - MessageFactory messageFactory) { - super(new Saaj12SoapMessage(request), transportRequest, messageFactory); - } - - protected SaajSoapMessage createSaajSoapMessage(SOAPMessage saajMessage) { - return new Saaj12SoapMessage(saajMessage); - } - - public void setSaajRequest(SOAPMessage request) { - setRequest(new Saaj12SoapMessage(request)); - } - - public void setSaajResponse(SOAPMessage response) { - setResponse(new Saaj12SoapMessage(response)); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java index 0a96a428..63c9208e 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessage.java @@ -22,14 +22,19 @@ import javax.xml.soap.SOAPMessage; import org.springframework.ws.soap.SoapEnvelope; import org.springframework.ws.soap.saaj.SaajSoapMessage; -class Saaj13SoapMessage extends SaajSoapMessage { +/** + * SAAJ 1.3 specific implementation of the SoapMessage interface. + * + * @author Arjen Poutsma + */ +public class Saaj13SoapMessage extends SaajSoapMessage { /** * Create a new SaajSoapMessage based on the given SAAJ SOAPMessage. * * @param soapMessage the SAAJ SOAPMessage */ - protected Saaj13SoapMessage(SOAPMessage soapMessage) { + public Saaj13SoapMessage(SOAPMessage soapMessage) { super(soapMessage); } diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessageContext.java b/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessageContext.java deleted file mode 100644 index c60dd80d..00000000 --- a/core/src/main/java/org/springframework/ws/soap/saaj/saaj13/Saaj13SoapMessageContext.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj.saaj13; - -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPMessage; - -import org.springframework.ws.soap.saaj.SaajSoapMessage; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.transport.TransportRequest; - -/** - * SAAJ 1.3 specific implementation of the SoapMessageContext interface. Created by the - * SaajSoapMessageContextFactory. - * - * @author Arjen Poutsma - * @see org.springframework.ws.soap.saaj.SaajSoapMessageContextFactory - */ -public class Saaj13SoapMessageContext extends SaajSoapMessageContext { - - /** - * Creates a new instance based on the given SAAJ request message, and a message factory. - * - * @param request the request message - * @param transportRequest the transport request - * @param messageFactory the message factory used for creating a response - */ - public Saaj13SoapMessageContext(SOAPMessage request, - TransportRequest transportRequest, - MessageFactory messageFactory) { - super(new Saaj13SoapMessage(request), transportRequest, messageFactory); - } - - protected SaajSoapMessage createSaajSoapMessage(SOAPMessage saajMessage) { - return new Saaj13SoapMessage(saajMessage); - } - - public void setSaajRequest(SOAPMessage request) { - setRequest(new Saaj13SoapMessage(request)); - } - - public void setSaajResponse(SOAPMessage response) { - setResponse(new Saaj13SoapMessage(response)); - } -} diff --git a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java index 5680f08b..0ef4b49d 100644 --- a/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java +++ b/core/src/main/java/org/springframework/ws/soap/saaj/support/SaajUtils.java @@ -150,18 +150,6 @@ public abstract class SaajUtils { } } - /** - * Loads a SAAJ SOAPMessage from the given resource. - * - * @param resource the resource to read from - * @return the loaded SAAJ message - * @throws SOAPException if the message cannot be constructed - * @throws IOException if the input stream resource cannot be loaded - */ - public static SOAPMessage loadMessage(Resource resource) throws SOAPException, IOException { - return loadMessage(resource, MessageFactory.newInstance()); - } - /** * Loads a SAAJ SOAPMessage from the given resource with a given message factory. * diff --git a/core/src/main/java/org/springframework/ws/transport/SimpleTransportContext.java b/core/src/main/java/org/springframework/ws/transport/SimpleTransportContext.java new file mode 100644 index 00000000..32ea9024 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/transport/SimpleTransportContext.java @@ -0,0 +1,46 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport; + +/** + * Simple implementation of the TransportContext interface. + * + * @author Arjen Poutsma + */ +public class SimpleTransportContext implements TransportContext { + + private final TransportInputStream transportInputStream; + + private final TransportOutputStream transportOutputStream; + + /** + * Creates a new SimpleTransportContext that exposes the given streams. + */ + public SimpleTransportContext(TransportInputStream transportInputStream, + TransportOutputStream transportOutputStream) { + this.transportInputStream = transportInputStream; + this.transportOutputStream = transportOutputStream; + } + + public TransportInputStream getTransportInputStream() { + return transportInputStream; + } + + public TransportOutputStream getTransportOutputStream() { + return transportOutputStream; + } +} diff --git a/core/src/main/java/org/springframework/ws/transport/TransportContext.java b/core/src/main/java/org/springframework/ws/transport/TransportContext.java index 4bc488cc..06aa10ab 100644 --- a/core/src/main/java/org/springframework/ws/transport/TransportContext.java +++ b/core/src/main/java/org/springframework/ws/transport/TransportContext.java @@ -1,15 +1,21 @@ package org.springframework.ws.transport; /** - * Defines the contract for Web service request that come in via a transport. Exposes headers and the inputstream to - * read from. + * Strategy interface for determining the current {@link TransportInputStream} and {@link TransportOutputStream}. + *

+ * An instance of this class can be associated with a thread via the {@link TransportContextHolder} class. * * @author Arjen Poutsma */ public interface TransportContext { - TransportRequest getTransportRequest() throws TransportException; - - TransportResponse getTransportResponse() throws TransportException; + /** + * Returns the current TransportInputStream. + */ + TransportInputStream getTransportInputStream(); + /** + * Returns the current TransportOutputStream. + */ + TransportOutputStream getTransportOutputStream(); } diff --git a/core/src/main/java/org/springframework/ws/transport/TransportContextHolder.java b/core/src/main/java/org/springframework/ws/transport/TransportContextHolder.java new file mode 100644 index 00000000..d893bdd6 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/transport/TransportContextHolder.java @@ -0,0 +1,46 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.ws.transport; + +/** + * Simple holder class that associates a TransportContext instance with the current thread. The + * TransportContext will be inherited by any child threads spawned by the current thread. + * + * @author Arjen Poutsma + * @see TransportContext + */ +public abstract class TransportContextHolder { + + private static final ThreadLocal transportContextHolder = new InheritableThreadLocal(); + + /** + * Associate the given TransportContext with the current thread. + * + * @param transportContext the current transport context, or null to reset the thread-bound context + */ + public static void setTransportContext(TransportContext transportContext) { + transportContextHolder.set(transportContext); + } + + /** + * Return the TransportContext associated with the current thread, if any. + * + * @return the current transport context, or null if none + */ + public static TransportContext getTransportContext() { + return (TransportContext) transportContextHolder.get(); + } +} diff --git a/core/src/main/java/org/springframework/ws/transport/TransportInputStream.java b/core/src/main/java/org/springframework/ws/transport/TransportInputStream.java new file mode 100644 index 00000000..6569c847 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/transport/TransportInputStream.java @@ -0,0 +1,97 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; + +/** + * A TransportInputStream is an input stream with MIME input headers. It is used to construct {@link + * org.springframework.ws.WebServiceMessage WebServiceMessages} from a transport. + * + * @author Arjen Poutsma + * @see #getHeaderNames() + * @see #getHeaders(String) + */ +public abstract class TransportInputStream extends InputStream { + + protected TransportInputStream() { + } + + public void close() throws IOException { + getInputStream().close(); + } + + public int available() throws IOException { + return getInputStream().available(); + } + + public synchronized void mark(int readlimit) { + try { + getInputStream().mark(readlimit); + } + catch (IOException e) { + } + } + + public boolean markSupported() { + try { + return getInputStream().markSupported(); + } + catch (IOException e) { + return false; + } + } + + public int read(byte b[]) throws IOException { + return getInputStream().read(b); + } + + public int read(byte b[], int off, int len) throws IOException { + return getInputStream().read(b, off, len); + } + + public synchronized void reset() throws IOException { + getInputStream().reset(); + } + + public long skip(long n) throws IOException { + return getInputStream().skip(n); + } + + public int read() throws IOException { + return getInputStream().read(); + } + + /** + * Returns the input stream to read from. + */ + protected abstract InputStream getInputStream() throws IOException; + + /** + * Returns an iteration over all the header names this request contains. Returns an empty Iterator if + * the request has no headers. + */ + public abstract Iterator getHeaderNames() throws IOException; + + /** + * Returns an iteration over all the string values of the specified request header. Returns an empty + * Iterator if the request did not include any headers of the specified name. + */ + public abstract Iterator getHeaders(String name) throws IOException; +} diff --git a/core/src/main/java/org/springframework/ws/transport/TransportOutputStream.java b/core/src/main/java/org/springframework/ws/transport/TransportOutputStream.java new file mode 100644 index 00000000..3b8a788f --- /dev/null +++ b/core/src/main/java/org/springframework/ws/transport/TransportOutputStream.java @@ -0,0 +1,67 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * A TransportOutputStream is an output stream with MIME input headers. It is used to write {@link + * org.springframework.ws.WebServiceMessage WebServiceMessages} to a transport. + * + * @author Arjen Poutsma + * @see #addHeader(String,String) + */ +public abstract class TransportOutputStream extends OutputStream { + + protected TransportOutputStream() { + } + + public void close() throws IOException { + getOutputStream().close(); + } + + public void flush() throws IOException { + getOutputStream().flush(); + } + + public void write(byte b[]) throws IOException { + getOutputStream().write(b); + } + + public void write(byte b[], int off, int len) throws IOException { + getOutputStream().write(b, off, len); + } + + public void write(int b) throws IOException { + getOutputStream().write(b); + } + + /** + * Adds a response header with the given name and value. This method can be called multiple times, to allow for + * headers with multiple values. + * + * @param name the name of the header + * @param value the value of the header + */ + public abstract void addHeader(String name, String value) throws IOException; + + /** + * Returns the output stream to write to. + */ + protected abstract OutputStream getOutputStream() throws IOException; +} diff --git a/core/src/main/java/org/springframework/ws/transport/TransportRequest.java b/core/src/main/java/org/springframework/ws/transport/TransportRequest.java deleted file mode 100644 index 6d0efbfd..00000000 --- a/core/src/main/java/org/springframework/ws/transport/TransportRequest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.transport; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Iterator; - -/** - * Defines the contract for Web service request that come in via a transport. Exposes headers and the inputstream to - * read from. - * - * @author Arjen Poutsma - */ -public interface TransportRequest { - - /** - * Returns an iteratoion over all the header names this request contains. Returns an empty Iterator if - * the request has no headers, this method . - */ - Iterator getHeaderNames() throws TransportException; - - /** - * Returns an iteration over all the string values of the specified request header. Returns an empty - * Iterator if the request did not include any headers of the specified name. - */ - Iterator getHeaders(String name) throws TransportException; - - /** - * Returns the contents of the request as a InputStream. - */ - InputStream getInputStream() throws TransportException, IOException; - - /** - * Return a URL handle for this request. - */ - String getUrl() throws TransportException; - -} diff --git a/core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportInputStream.java b/core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportInputStream.java new file mode 100644 index 00000000..516d54a3 --- /dev/null +++ b/core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportInputStream.java @@ -0,0 +1,65 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.ws.transport.TransportException; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.support.EnumerationIterator; + +/** + * HTTP Servlet specific implementation of the TransportInputStream interface. Exposes the + * HttpServletRequest. + * + * @author Arjen Poutsma + * @see #getHttpServletRequest() + */ +public class HttpServletTransportInputStream extends TransportInputStream { + + private final HttpServletRequest httpServletRequest; + + /** + * Constructs a new instance of the HttpTransportRequest with the given + * HttpServletRequest. + */ + public HttpServletTransportInputStream(HttpServletRequest httpServletRequest) throws IOException { + this.httpServletRequest = httpServletRequest; + } + + protected InputStream getInputStream() throws IOException { + return httpServletRequest.getInputStream(); + } + + /** + * Returns the wrapped HttpServletRequest. + */ + public HttpServletRequest getHttpServletRequest() { + return httpServletRequest; + } + + public Iterator getHeaderNames() throws TransportException { + return new EnumerationIterator(httpServletRequest.getHeaderNames()); + } + + public Iterator getHeaders(String name) throws TransportException { + return new EnumerationIterator(httpServletRequest.getHeaders(name)); + } +} diff --git a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportResponse.java b/core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportOutputStream.java similarity index 61% rename from core/src/main/java/org/springframework/ws/transport/http/HttpTransportResponse.java rename to core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportOutputStream.java index 64ce7f99..99c32588 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportResponse.java +++ b/core/src/main/java/org/springframework/ws/transport/http/HttpServletTransportOutputStream.java @@ -20,38 +20,39 @@ import java.io.IOException; import java.io.OutputStream; import javax.servlet.http.HttpServletResponse; -import org.springframework.ws.transport.TransportResponse; +import org.springframework.ws.transport.TransportOutputStream; /** - * HTTP-specific implementation of the TransportResponse interface. Exposes the - * HttpServletResponse + * HTTP Servlet specific implementation of the TransportOutputStream interface. Exposes the + * HttpServletResponse. * * @author Arjen Poutsma + * @see #getHttpServletResponse() */ -public class HttpTransportResponse implements TransportResponse { +public class HttpServletTransportOutputStream extends TransportOutputStream { - private final HttpServletResponse response; + private final HttpServletResponse httpServletResponse; /** * Constructs a new instance of the HttpTransportResponse with the given * HttpServletResponse. */ - public HttpTransportResponse(HttpServletResponse response) { - this.response = response; + public HttpServletTransportOutputStream(HttpServletResponse httpServletResponse) throws IOException { + this.httpServletResponse = httpServletResponse; + } + + protected OutputStream getOutputStream() throws IOException { + return httpServletResponse.getOutputStream(); } /** * Returns the wrapped HttpServletResponse. */ public HttpServletResponse getHttpServletResponse() { - return response; + return httpServletResponse; } public void addHeader(String name, String value) { - response.addHeader(name, value); - } - - public OutputStream getOutputStream() throws IOException { - return response.getOutputStream(); + httpServletResponse.addHeader(name, value); } } diff --git a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportContext.java b/core/src/main/java/org/springframework/ws/transport/http/HttpTransportContext.java deleted file mode 100644 index c6f5a250..00000000 --- a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportContext.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.springframework.ws.transport.http; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.util.Assert; -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; - -/** - * HTTP-specific implementation of the TransportContext interface. Exposes the - * HttpServletRequest and HttpServletResponse. - * - * @author Arjen Poutsma - */ -public class HttpTransportContext implements TransportContext { - - private final HttpTransportRequest transportRequest; - - private final HttpTransportResponse transportResponse; - - /** - * Constructs a new instance of the HttpTransportContext with the given HttpServletRequest - * and HttpServletResponse - */ - public HttpTransportContext(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { - Assert.notNull(httpServletRequest, "No httpServletRequest given"); - Assert.notNull(httpServletResponse, "No httpServletResponse given"); - transportRequest = new HttpTransportRequest(httpServletRequest); - transportResponse = new HttpTransportResponse(httpServletResponse); - } - - public TransportRequest getTransportRequest() { - return transportRequest; - } - - public TransportResponse getTransportResponse() { - return transportResponse; - } - - /** - * Returns the wrapped HttpServletRequest. - */ - public HttpServletRequest getHttpServletRequest() { - return transportRequest.getHttpServletRequest(); - } - - /** - * Returns the wrapped HttpServletResponse. - */ - public HttpServletResponse getHttpServletRespo() { - return transportResponse.getHttpServletResponse(); - } - -} diff --git a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportRequest.java b/core/src/main/java/org/springframework/ws/transport/http/HttpTransportRequest.java deleted file mode 100644 index 21de9eb9..00000000 --- a/core/src/main/java/org/springframework/ws/transport/http/HttpTransportRequest.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.transport.http; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.Iterator; -import javax.servlet.http.HttpServletRequest; - -import org.springframework.util.Assert; -import org.springframework.ws.transport.TransportRequest; - -/** - * HTTP-specific implementation of the TransportRequest interface. Exposes the - * HttpServletRequest - * - * @author Arjen Poutsma - */ -public class HttpTransportRequest implements TransportRequest { - - private final HttpServletRequest request; - - /** - * Constructs a new instance of the HttpTransportRequest with the given - * HttpServletRequest. - */ - public HttpTransportRequest(HttpServletRequest request) { - Assert.notNull(request, "request is required"); - this.request = request; - } - - /** - * Returns the wrapped HttpServletRequest. - */ - public HttpServletRequest getHttpServletRequest() { - return request; - } - - public Iterator getHeaders(String name) { - return new EnumerationIterator(request.getHeaders(name)); - } - - public InputStream getInputStream() throws IOException { - return request.getInputStream(); - } - - public Iterator getHeaderNames() { - return new EnumerationIterator(request.getHeaderNames()); - } - - public String getUrl() { - StringBuffer url = new StringBuffer(request.getScheme()); - url.append("://").append(request.getServerName()).append(':').append(request.getServerPort()); - url.append(request.getRequestURI()); - return url.toString(); - } - - /** - * Private static class that adapts a header enumeration provided by the HttpServletRequest and provides it as an - * iterator. - */ - private static class EnumerationIterator implements Iterator { - - private final Enumeration enumeration; - - public EnumerationIterator(Enumeration enumeration) { - this.enumeration = enumeration; - } - - public boolean hasNext() { - return enumeration.hasMoreElements(); - } - - public Object next() { - return enumeration.nextElement(); - } - - public void remove() { - throw new UnsupportedOperationException(); - } - } -} diff --git a/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java b/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java index 52e3b106..f87b61dc 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java +++ b/core/src/main/java/org/springframework/ws/transport/http/MessageDispatcherServlet.java @@ -26,7 +26,7 @@ import org.springframework.ws.EndpointAdapter; import org.springframework.ws.EndpointExceptionResolver; import org.springframework.ws.EndpointMapping; import org.springframework.ws.MessageDispatcher; -import org.springframework.ws.context.MessageContextFactory; +import org.springframework.ws.WebServiceMessageFactory; /** * Servlet for simplified dispatching of Web service messages. Delegates to a MessageDispatcher and a @@ -75,9 +75,9 @@ public class MessageDispatcherServlet extends FrameworkServlet { public static final String ENDPOINT_MAPPING_BEAN_NAME = "endpointMapping"; /** - * Well-known name for the MessageContextFactory object in the bean factory for this namespace. + * Well-known name for the WebServiceMessageFactory object in the bean factory for this namespace. */ - public static final String MESSAGE_CONTEXT_FACTORY_BEAN_NAME = "messageContextFactory"; + public static final String WEB_SERVICE_MESSAGE_FACTORY_BEAN_NAME = "messageFactory"; /** * Well-known name for the MessageDispatcher object in the bean factory for this namespace. @@ -187,7 +187,7 @@ public class MessageDispatcherServlet extends FrameworkServlet { } protected void initFrameworkServlet() throws ServletException, BeansException { - initMessageContextFactory(); + initWebServiceMessageFactory(); initMessageDispatcher(); } @@ -343,29 +343,29 @@ public class MessageDispatcherServlet extends FrameworkServlet { } } - private void initMessageContextFactory() throws BeansException { - MessageContextFactory messageContextFactory; + private void initWebServiceMessageFactory() throws BeansException { + WebServiceMessageFactory messageFactory; try { - messageContextFactory = (MessageContextFactory) getWebApplicationContext() - .getBean(MESSAGE_CONTEXT_FACTORY_BEAN_NAME, MessageContextFactory.class); + messageFactory = (WebServiceMessageFactory) getWebApplicationContext() + .getBean(WEB_SERVICE_MESSAGE_FACTORY_BEAN_NAME, WebServiceMessageFactory.class); } catch (NoSuchBeanDefinitionException ignored) { - messageContextFactory = (MessageContextFactory) getDefaultStrategy(MessageContextFactory.class); + messageFactory = (WebServiceMessageFactory) getDefaultStrategy(WebServiceMessageFactory.class); if (logger.isInfoEnabled()) { - logger.info("Unable to locate MessageContextFactory with name '" + MESSAGE_CONTEXT_FACTORY_BEAN_NAME + - "': using default [" + messageContextFactory + "]"); + logger.info("Unable to locate WebServiceMessageFactory with name '" + + WEB_SERVICE_MESSAGE_FACTORY_BEAN_NAME + "': using default [" + messageFactory + "]"); } - if (messageContextFactory instanceof InitializingBean) { + if (messageFactory instanceof InitializingBean) { try { - ((InitializingBean) messageContextFactory).afterPropertiesSet(); + ((InitializingBean) messageFactory).afterPropertiesSet(); } catch (Exception ex) { - throw new BeanInitializationException( - "Could not invoke afterPropertiesSet() on messageContextFactory", ex); + throw new BeanInitializationException("Could not invoke afterPropertiesSet() on message factory", + ex); } } } - handlerAdapter.setMessageContextFactory(messageContextFactory); + handlerAdapter.setMessageFactory(messageFactory); } private void initMessageDispatcher() { diff --git a/core/src/main/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapter.java b/core/src/main/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapter.java index 8fe08703..8bd23090 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapter.java +++ b/core/src/main/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapter.java @@ -28,33 +28,38 @@ import org.springframework.web.servlet.HandlerAdapter; import org.springframework.web.servlet.ModelAndView; import org.springframework.ws.NoEndpointFoundException; import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; import org.springframework.ws.context.MessageContext; -import org.springframework.ws.context.MessageContextFactory; import org.springframework.ws.endpoint.MessageEndpoint; import org.springframework.ws.soap.SoapMessage; +import org.springframework.ws.transport.SimpleTransportContext; +import org.springframework.ws.transport.TransportContext; +import org.springframework.ws.transport.TransportContextHolder; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.TransportOutputStream; /** * Adapter to use the MessageEndpoint interface with the generic DispatcherServlet. Requires a - * MessageContextFactory, which is used to convert the incoming HttpServletRequest into a - * MessageContext, and passes that context to the mapped MessageEndpoint. If a response is - * created, that is sent via the HttpServletResponse. + * {@link WebServiceMessageFactory}, which is used to convert the incoming HttpServletRequest into a {@link + * WebServiceMessage}, and passes that context to the mapped MessageEndpoint. If a response is created, + * that is sent via the HttpServletResponse. *

* Note that the MessageDispatcher implements the MessageEndpoint interface, enabling this * adapter to function as a gateway to further message handling logic. * * @author Arjen Poutsma * @see org.springframework.ws.endpoint.MessageEndpoint - * @see MessageContextFactory * @see org.springframework.ws.MessageDispatcher */ public class MessageEndpointHandlerAdapter implements HandlerAdapter, InitializingBean { private static final Log logger = LogFactory.getLog(MessageEndpointHandlerAdapter.class); - private MessageContextFactory messageContextFactory; + private WebServiceMessageFactory messageFactory; - public void setMessageContextFactory(MessageContextFactory messageContextFactory) { - this.messageContextFactory = messageContextFactory; + public void setMessageFactory(WebServiceMessageFactory messageFactory) { + this.messageFactory = messageFactory; } public long getLastModified(HttpServletRequest request, Object handler) { @@ -78,34 +83,43 @@ public class MessageEndpointHandlerAdapter implements HandlerAdapter, Initializi } public final void afterPropertiesSet() throws Exception { - Assert.notNull(messageContextFactory, "messageContextFactory is required"); - logger.info("Using message context factory " + messageContextFactory); + Assert.notNull(messageFactory, "messageFactory is required"); + logger.info("Using message factory [" + messageFactory + "]"); } private void handlePost(HttpServletRequest httpServletRequest, MessageEndpoint endpoint, HttpServletResponse httpServletResponse) throws Exception { - HttpTransportContext transportContext = new HttpTransportContext(httpServletRequest, httpServletResponse); - MessageContext messageContext = messageContextFactory.createContext(transportContext); + TransportInputStream tis = new HttpServletTransportInputStream(httpServletRequest); + TransportOutputStream tos = new HttpServletTransportOutputStream(httpServletResponse); + + TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); + TransportContextHolder.setTransportContext(new SimpleTransportContext(tis, tos)); + try { + WebServiceMessage messageRequest = messageFactory.createWebServiceMessage(tis); + MessageContext messageContext = new DefaultMessageContext(messageRequest, messageFactory); endpoint.invoke(messageContext); if (!messageContext.hasResponse()) { httpServletResponse.setStatus(HttpServletResponse.SC_NO_CONTENT); } else { - WebServiceMessage webServiceResponse = messageContext.getResponse(); - if (webServiceResponse instanceof SoapMessage && - ((SoapMessage) webServiceResponse).getSoapBody().hasFault()) { + WebServiceMessage messageResponse = messageContext.getResponse(); + if (messageResponse instanceof SoapMessage && + ((SoapMessage) messageResponse).getSoapBody().hasFault()) { httpServletResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } else { httpServletResponse.setStatus(HttpServletResponse.SC_OK); } - messageContext.sendResponse(new HttpTransportResponse(httpServletResponse)); + messageResponse.writeTo(tos); } } catch (NoEndpointFoundException ex) { httpServletResponse.setStatus(HttpServletResponse.SC_NOT_FOUND); } + finally { + TransportContextHolder.setTransportContext(previousTransportContext); + } } } diff --git a/core/src/main/resources/org/springframework/ws/transport/http/MessageDispatcherServlet.properties b/core/src/main/resources/org/springframework/ws/transport/http/MessageDispatcherServlet.properties index e418729f..a27f274a 100644 --- a/core/src/main/resources/org/springframework/ws/transport/http/MessageDispatcherServlet.properties +++ b/core/src/main/resources/org/springframework/ws/transport/http/MessageDispatcherServlet.properties @@ -4,4 +4,4 @@ org.springframework.ws.MessageDispatcher=org.springframework.ws.soap.SoapMessageDispatcher -org.springframework.ws.context.MessageContextFactory=org.springframework.ws.soap.saaj.SaajSoapMessageContextFactory \ No newline at end of file +org.springframework.ws.WebServiceMessageFactory=org.springframework.ws.soap.saaj.SaajSoapMessageFactory \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/AbstractWebServiceMessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/AbstractWebServiceMessageFactoryTestCase.java new file mode 100644 index 00000000..aa055d46 --- /dev/null +++ b/core/src/test/java/org/springframework/ws/AbstractWebServiceMessageFactoryTestCase.java @@ -0,0 +1,35 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws; + +import junit.framework.TestCase; + +public abstract class AbstractWebServiceMessageFactoryTestCase extends TestCase { + + protected WebServiceMessageFactory messageFactory; + + protected final void setUp() throws Exception { + messageFactory = createMessageFactory(); + } + + public void testCreateEmptyMessage() throws Exception { + WebServiceMessage message = messageFactory.createWebServiceMessage(); + assertNotNull("WebServiceMessage is null", message); + } + + protected abstract WebServiceMessageFactory createMessageFactory() throws Exception; +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/MessageDispatcherTest.java b/core/src/test/java/org/springframework/ws/MessageDispatcherTest.java index ca8f4a33..18f377b3 100644 --- a/core/src/test/java/org/springframework/ws/MessageDispatcherTest.java +++ b/core/src/test/java/org/springframework/ws/MessageDispatcherTest.java @@ -20,18 +20,24 @@ import java.util.Collections; import junit.framework.TestCase; import org.easymock.MockControl; +import org.springframework.ws.context.DefaultMessageContext; import org.springframework.ws.context.MessageContext; -import org.springframework.ws.mock.MockMessageContext; public class MessageDispatcherTest extends TestCase { private MessageDispatcher dispatcher; - private MockMessageContext messageContext; + private MessageContext messageContext; + + private MockControl factoryControl; + + private WebServiceMessageFactory factoryMock; protected void setUp() throws Exception { dispatcher = new MessageDispatcher(); - messageContext = new MockMessageContext(); + factoryControl = MockControl.createControl(WebServiceMessageFactory.class); + factoryMock = (WebServiceMessageFactory) factoryControl.getMock(); + messageContext = new DefaultMessageContext(new MockWebServiceMessage(), factoryMock); } public void testGetEndpoint() throws Exception { @@ -44,8 +50,10 @@ public class MessageDispatcherTest extends TestCase { mappingControl.expectAndReturn(mappingMock.getEndpoint(messageContext), chain); mappingControl.replay(); + factoryControl.replay(); EndpointInvocationChain result = dispatcher.getEndpoint(messageContext); mappingControl.verify(); + factoryControl.verify(); assertEquals("getEndpoint returns invalid EndpointInvocationChain", chain, result); } @@ -57,8 +65,10 @@ public class MessageDispatcherTest extends TestCase { Object endpoint = new Object(); adapterControl.expectAndReturn(adapterMock.supports(endpoint), true); adapterControl.replay(); + factoryControl.replay(); EndpointAdapter result = dispatcher.getEndpointAdapter(endpoint); adapterControl.verify(); + factoryControl.verify(); assertEquals("getEnpointAdapter returns invalid EndpointAdapter", adapterMock, result); } @@ -70,6 +80,7 @@ public class MessageDispatcherTest extends TestCase { Object endpoint = new Object(); adapterControl.expectAndReturn(adapterMock.supports(endpoint), false); adapterControl.replay(); + factoryControl.replay(); try { dispatcher.getEndpointAdapter(endpoint); fail("getEndpointAdapter does not throw IllegalStateException for unsupported endpoint"); @@ -78,6 +89,7 @@ public class MessageDispatcherTest extends TestCase { // Expected } adapterControl.verify(); + factoryControl.verify(); } public void testProcessEndpointExceptionReturnsResponse() throws Exception { @@ -98,9 +110,12 @@ public class MessageDispatcherTest extends TestCase { }; dispatcher.setEndpointExceptionResolvers(Collections.singletonList(resolver)); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), new MockWebServiceMessage()); + factoryControl.replay(); dispatcher.processEndpointException(messageContext, endpoint, ex); assertNotNull("processEndpointException sets no response", messageContext.getResponse()); + factoryControl.verify(); } public void testProcessUnsupportedEndpointException() throws Exception { @@ -149,10 +164,12 @@ public class MessageDispatcherTest extends TestCase { new EndpointInvocationChain(endpoint, new EndpointInterceptor[]{interceptorMock1, interceptorMock2}); mappingControl.expectAndReturn(mappingMock.getEndpoint(messageContext), chain); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), new MockWebServiceMessage()); mappingControl.replay(); interceptorControl.replay(); adapterControl.replay(); + factoryControl.replay(); // response required for interceptor invocation messageContext.getResponse(); dispatcher.dispatch(messageContext); @@ -160,6 +177,7 @@ public class MessageDispatcherTest extends TestCase { mappingControl.verify(); interceptorControl.verify(); adapterControl.verify(); + factoryControl.verify(); } public void testFlowNoResponse() throws Exception { @@ -189,12 +207,14 @@ public class MessageDispatcherTest extends TestCase { mappingControl.replay(); interceptorControl.replay(); adapterControl.replay(); + factoryControl.replay(); dispatcher.dispatch(messageContext); mappingControl.verify(); interceptorControl.verify(); adapterControl.verify(); + factoryControl.verify(); } public void testInterceptedRequestFlow() throws Exception { @@ -218,10 +238,12 @@ public class MessageDispatcherTest extends TestCase { new EndpointInvocationChain(endpoint, new EndpointInterceptor[]{interceptorMock1, interceptorMock2}); mappingControl.expectAndReturn(mappingMock.getEndpoint(messageContext), chain); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), new MockWebServiceMessage()); mappingControl.replay(); interceptorControl.replay(); adapterControl.replay(); + factoryControl.replay(); // response required for interceptor invocation messageContext.getResponse(); @@ -231,6 +253,7 @@ public class MessageDispatcherTest extends TestCase { mappingControl.verify(); interceptorControl.verify(); adapterControl.verify(); + factoryControl.verify(); } public void testInterceptedResponseFlow() throws Exception { @@ -255,10 +278,12 @@ public class MessageDispatcherTest extends TestCase { new EndpointInvocationChain(endpoint, new EndpointInterceptor[]{interceptorMock1, interceptorMock2}); mappingControl.expectAndReturn(mappingMock.getEndpoint(messageContext), chain); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), new MockWebServiceMessage()); mappingControl.replay(); interceptorControl.replay(); adapterControl.replay(); + factoryControl.replay(); // response required for interceptor invocation messageContext.getResponse(); @@ -267,6 +292,7 @@ public class MessageDispatcherTest extends TestCase { mappingControl.verify(); interceptorControl.verify(); adapterControl.verify(); + factoryControl.verify(); } } \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/mock/MockWebServiceMessage.java b/core/src/test/java/org/springframework/ws/MockWebServiceMessage.java similarity index 98% rename from core/src/test/java/org/springframework/ws/mock/MockWebServiceMessage.java rename to core/src/test/java/org/springframework/ws/MockWebServiceMessage.java index 8210aec7..8a54775c 100644 --- a/core/src/test/java/org/springframework/ws/mock/MockWebServiceMessage.java +++ b/core/src/test/java/org/springframework/ws/MockWebServiceMessage.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ws.mock; +package org.springframework.ws; import java.io.IOException; import java.io.InputStream; @@ -34,7 +34,6 @@ import javax.xml.transform.stream.StreamResult; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.util.FileCopyUtils; -import org.springframework.ws.WebServiceMessage; import org.springframework.xml.sax.SaxUtils; import org.springframework.xml.transform.StringSource; diff --git a/core/src/test/java/org/springframework/ws/MockWebServiceMessageFactory.java b/core/src/test/java/org/springframework/ws/MockWebServiceMessageFactory.java new file mode 100644 index 00000000..9124d5a9 --- /dev/null +++ b/core/src/test/java/org/springframework/ws/MockWebServiceMessageFactory.java @@ -0,0 +1,38 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws; + +import java.io.IOException; +import java.io.InputStream; +import javax.xml.transform.TransformerException; +import javax.xml.transform.stream.StreamSource; + +public class MockWebServiceMessageFactory implements WebServiceMessageFactory { + + public WebServiceMessage createWebServiceMessage() { + return new MockWebServiceMessage(); + } + + public WebServiceMessage createWebServiceMessage(InputStream inputStream) throws IOException { + try { + return new MockWebServiceMessage(new StreamSource(inputStream)); + } + catch (TransformerException ex) { + throw new IOException(ex.getMessage()); + } + } +} diff --git a/core/src/test/java/org/springframework/ws/context/DefaultMessageContextTest.java b/core/src/test/java/org/springframework/ws/context/DefaultMessageContextTest.java new file mode 100644 index 00000000..61b820c1 --- /dev/null +++ b/core/src/test/java/org/springframework/ws/context/DefaultMessageContextTest.java @@ -0,0 +1,73 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.context; + +import java.util.Arrays; + +import junit.framework.TestCase; +import org.easymock.MockControl; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; + +public class DefaultMessageContextTest extends TestCase { + + private DefaultMessageContext context; + + private MockControl factoryControl; + + private WebServiceMessageFactory factoryMock; + + private WebServiceMessage request; + + protected void setUp() throws Exception { + factoryControl = MockControl.createControl(WebServiceMessageFactory.class); + factoryMock = (WebServiceMessageFactory) factoryControl.getMock(); + request = new MockWebServiceMessage(); + context = new DefaultMessageContext(request, factoryMock); + } + + public void testRequest() throws Exception { + assertEquals("Invalid request returned", request, context.getRequest()); + } + + public void testResponse() throws Exception { + WebServiceMessage response = new MockWebServiceMessage(); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), response); + factoryControl.replay(); + + WebServiceMessage result = context.getResponse(); + assertEquals("Invalid response returned", response, result); + factoryControl.verify(); + } + + public void testProperties() throws Exception { + assertEquals("Invalid property names returned", 0, context.getPropertyNames().length); + String name = "name"; + assertFalse("Property set", context.containsProperty(name)); + String value = "value"; + context.setProperty(name, value); + assertTrue("Property not set", context.containsProperty(name)); + assertEquals("Invalid property names returned", Arrays.asList(new String[]{name}), + Arrays.asList(context.getPropertyNames())); + assertEquals("Invalid property value returned", value, context.getProperty(name)); + context.removeProperty(name); + assertFalse("Property set", context.containsProperty(name)); + assertEquals("Invalid property names returned", 0, context.getPropertyNames().length); + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/endpoint/AbstractMessageEndpointTestCase.java b/core/src/test/java/org/springframework/ws/endpoint/AbstractMessageEndpointTestCase.java index f3b9c619..8405b198 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/AbstractMessageEndpointTestCase.java +++ b/core/src/test/java/org/springframework/ws/endpoint/AbstractMessageEndpointTestCase.java @@ -18,8 +18,10 @@ package org.springframework.ws.endpoint; import javax.xml.transform.Source; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.xml.transform.StringSource; public abstract class AbstractMessageEndpointTestCase extends AbstractEndpointTestCase { @@ -33,13 +35,16 @@ public abstract class AbstractMessageEndpointTestCase extends AbstractEndpointTe public void testNoResponse() throws Exception { endpoint = createNoResponseEndpoint(); StringSource requestSource = new StringSource(REQUEST); - MockMessageContext context = new MockMessageContext(new MockWebServiceMessage(requestSource)); + + MessageContext context = + new DefaultMessageContext(new MockWebServiceMessage(requestSource), new MockWebServiceMessageFactory()); endpoint.invoke(context); assertFalse("Response message created", context.hasResponse()); } protected final void testSource(Source requestSource) throws Exception { - MockMessageContext context = new MockMessageContext(new MockWebServiceMessage(requestSource)); + MessageContext context = + new DefaultMessageContext(new MockWebServiceMessage(requestSource), new MockWebServiceMessageFactory()); endpoint.invoke(context); assertTrue("No response message created", context.hasResponse()); assertXMLEqual(RESPONSE, ((MockWebServiceMessage) context.getResponse()).getPayloadAsString()); diff --git a/core/src/test/java/org/springframework/ws/endpoint/MarshallingPayloadEndpointTest.java b/core/src/test/java/org/springframework/ws/endpoint/MarshallingPayloadEndpointTest.java index 188f9811..e4c7e3fb 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/MarshallingPayloadEndpointTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/MarshallingPayloadEndpointTest.java @@ -18,7 +18,6 @@ package org.springframework.ws.endpoint; import java.io.StringReader; import java.io.StringWriter; - import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; @@ -28,19 +27,36 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import org.custommonkey.xmlunit.XMLTestCase; - +import org.easymock.MockControl; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.XmlMappingException; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; public class MarshallingPayloadEndpointTest extends XMLTestCase { - public void testInvoke() throws Exception { - MockWebServiceMessage request = new MockWebServiceMessage(""); - final Transformer transformer = TransformerFactory.newInstance().newTransformer(); + private Transformer transformer; + private MessageContext context; + + private MockControl factoryControl; + + private WebServiceMessageFactory factoryMock; + + protected void setUp() throws Exception { + MockWebServiceMessage request = new MockWebServiceMessage(""); + transformer = TransformerFactory.newInstance().newTransformer(); + factoryControl = MockControl.createControl(WebServiceMessageFactory.class); + factoryMock = (WebServiceMessageFactory) factoryControl.getMock(); + + context = new DefaultMessageContext(request, factoryMock); + + } + + public void testInvoke() throws Exception { Unmarshaller unmarshaller = new Unmarshaller() { public Object unmarshal(Source source) throws XmlMappingException { try { @@ -76,17 +92,18 @@ public class MarshallingPayloadEndpointTest extends XMLTestCase { endpoint.setUnmarshaller(unmarshaller); endpoint.afterPropertiesSet(); - MockMessageContext context = new MockMessageContext(request); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), new MockWebServiceMessage()); + factoryControl.replay(); + endpoint.invoke(context); MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); assertNotNull("Invalid result", response); assertXMLEqual("Invalid response", "", response.getPayloadAsString()); + + factoryControl.verify(); } public void testInvokeNullResponse() throws Exception { - MockWebServiceMessage request = new MockWebServiceMessage(""); - final Transformer transformer = TransformerFactory.newInstance().newTransformer(); - Unmarshaller unmarshaller = new Unmarshaller() { public Object unmarshal(Source source) throws XmlMappingException { try { @@ -115,9 +132,10 @@ public class MarshallingPayloadEndpointTest extends XMLTestCase { endpoint.setMarshaller(marshaller); endpoint.setUnmarshaller(unmarshaller); endpoint.afterPropertiesSet(); - MockMessageContext context = new MockMessageContext(request); + factoryControl.replay(); endpoint.invoke(context); assertFalse("Response created", context.hasResponse()); + factoryControl.verify(); } } diff --git a/core/src/test/java/org/springframework/ws/endpoint/MessageEndpointAdapterTest.java b/core/src/test/java/org/springframework/ws/endpoint/MessageEndpointAdapterTest.java index 17b3a17b..d9ad292e 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/MessageEndpointAdapterTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/MessageEndpointAdapterTest.java @@ -18,8 +18,9 @@ package org.springframework.ws.endpoint; import junit.framework.TestCase; import org.easymock.MockControl; - -import org.springframework.ws.mock.MockMessageContext; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; public class MessageEndpointAdapterTest extends TestCase { @@ -40,7 +41,7 @@ public class MessageEndpointAdapterTest extends TestCase { } public void testInvoke() throws Exception { - MockMessageContext context = new MockMessageContext(); + MessageContext context = new DefaultMessageContext(new MockWebServiceMessageFactory()); endpointMock.invoke(context); endpointControl.replay(); diff --git a/core/src/test/java/org/springframework/ws/endpoint/PayloadEndpointAdapterTest.java b/core/src/test/java/org/springframework/ws/endpoint/PayloadEndpointAdapterTest.java index ec707e11..56b88fa8 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/PayloadEndpointAdapterTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/PayloadEndpointAdapterTest.java @@ -18,7 +18,6 @@ package org.springframework.ws.endpoint; import java.io.StringReader; import java.io.StringWriter; - import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; @@ -27,10 +26,10 @@ import javax.xml.transform.stream.StreamSource; import org.custommonkey.xmlunit.XMLTestCase; import org.easymock.MockControl; - +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; import org.springframework.ws.context.MessageContext; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockWebServiceMessage; public class PayloadEndpointAdapterTest extends XMLTestCase { @@ -62,7 +61,7 @@ public class PayloadEndpointAdapterTest extends XMLTestCase { } }; endpoint.invoke(request.getPayloadSource()); - MessageContext messageContext = new MockMessageContext(request); + MessageContext messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); adapter.invoke(messageContext, endpoint); MockWebServiceMessage response = (MockWebServiceMessage) messageContext.getResponse(); assertNotNull("No response created", response); @@ -70,7 +69,7 @@ public class PayloadEndpointAdapterTest extends XMLTestCase { } public void testInvokeNoResponse() throws Exception { - MessageContext messageContext = new MockMessageContext(); + MessageContext messageContext = new DefaultMessageContext(new MockWebServiceMessageFactory()); endpointMock.invoke(messageContext.getRequest().getPayloadSource()); endpointControl.setMatcher(MockControl.ALWAYS_MATCHER); endpointControl.setReturnValue(null); diff --git a/core/src/test/java/org/springframework/ws/endpoint/StaxStreamPayloadEndpointTest.java b/core/src/test/java/org/springframework/ws/endpoint/StaxStreamPayloadEndpointTest.java index 0c246af4..6c8496e1 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/StaxStreamPayloadEndpointTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/StaxStreamPayloadEndpointTest.java @@ -25,9 +25,10 @@ import javax.xml.transform.TransformerFactory; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.soap.SOAPFactory; -import org.springframework.ws.mock.MockTransportRequest; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.axiom.AxiomSoapMessage; -import org.springframework.ws.soap.axiom.AxiomSoapMessageContext; +import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory; import org.springframework.xml.transform.StringResult; import org.springframework.xml.transform.StringSource; @@ -75,7 +76,9 @@ public class StaxStreamPayloadEndpointTest extends AbstractMessageEndpointTestCa SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory(); AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory); transformer.transform(new StringSource(REQUEST), request.getPayloadResult()); - AxiomSoapMessageContext context = new AxiomSoapMessageContext(request, new MockTransportRequest()); + AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory(); + soapMessageFactory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(request, soapMessageFactory); MessageEndpoint endpoint = createResponseEndpoint(); endpoint.invoke(context); @@ -90,7 +93,9 @@ public class StaxStreamPayloadEndpointTest extends AbstractMessageEndpointTestCa SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory(); AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory); transformer.transform(new StringSource(REQUEST), request.getPayloadResult()); - AxiomSoapMessageContext context = new AxiomSoapMessageContext(request, new MockTransportRequest()); + AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory(); + soapMessageFactory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(request, soapMessageFactory); MessageEndpoint endpoint = createNoResponseEndpoint(); endpoint.invoke(context); diff --git a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadLoggingInterceptorTest.java b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadLoggingInterceptorTest.java index 82e5e994..cda7afc4 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadLoggingInterceptorTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadLoggingInterceptorTest.java @@ -22,8 +22,10 @@ import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; public class PayloadLoggingInterceptorTest extends TestCase { @@ -31,7 +33,7 @@ public class PayloadLoggingInterceptorTest extends TestCase { private CountingAppender appender; - private MockMessageContext messageContext; + private MessageContext messageContext; protected void setUp() throws Exception { interceptor = new PayloadLoggingInterceptor(); @@ -39,7 +41,7 @@ public class PayloadLoggingInterceptorTest extends TestCase { BasicConfigurator.configure(appender); Logger.getRootLogger().setLevel(Level.DEBUG); MockWebServiceMessage request = new MockWebServiceMessage(""); - messageContext = new MockMessageContext(request); + messageContext = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); appender.reset(); } diff --git a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadTransformingInterceptorTest.java b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadTransformingInterceptorTest.java index 836db781..89808a07 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadTransformingInterceptorTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadTransformingInterceptorTest.java @@ -24,8 +24,10 @@ import org.custommonkey.xmlunit.XMLTestCase; import org.custommonkey.xmlunit.XMLUnit; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.xml.sax.SaxUtils; import org.springframework.xml.transform.StringResult; @@ -55,7 +57,7 @@ public class PayloadTransformingInterceptorTest extends XMLTestCase { interceptor.setRequestXslt(xslt); interceptor.afterPropertiesSet(); MockWebServiceMessage request = new MockWebServiceMessage(input); - MockMessageContext context = new MockMessageContext(request); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); boolean result = interceptor.handleRequest(context, null); assertTrue("Invalid interceptor result", result); @@ -68,7 +70,7 @@ public class PayloadTransformingInterceptorTest extends XMLTestCase { interceptor.setResponseXslt(xslt); interceptor.afterPropertiesSet(); MockWebServiceMessage request = new MockWebServiceMessage(input); - MockMessageContext context = new MockMessageContext(request); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); boolean result = interceptor.handleRequest(context, null); assertTrue("Invalid interceptor result", result); @@ -81,7 +83,7 @@ public class PayloadTransformingInterceptorTest extends XMLTestCase { interceptor.setResponseXslt(xslt); interceptor.afterPropertiesSet(); MockWebServiceMessage request = new MockWebServiceMessage(input); - MockMessageContext context = new MockMessageContext(request); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(input); @@ -96,7 +98,7 @@ public class PayloadTransformingInterceptorTest extends XMLTestCase { interceptor.setRequestXslt(xslt); interceptor.afterPropertiesSet(); MockWebServiceMessage request = new MockWebServiceMessage(input); - MockMessageContext context = new MockMessageContext(request); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(input); diff --git a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadValidatingInterceptorTest.java b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadValidatingInterceptorTest.java index 8e1826a7..55c5f6cb 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadValidatingInterceptorTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/interceptor/PayloadValidatingInterceptorTest.java @@ -30,13 +30,14 @@ import javax.xml.transform.stream.StreamSource; import junit.framework.TestCase; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; +import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; +import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage; import org.springframework.ws.soap.saaj.support.SaajUtils; import org.springframework.ws.soap.soap11.Soap11Fault; import org.springframework.ws.soap.soap12.Soap12Fault; @@ -45,9 +46,9 @@ public class PayloadValidatingInterceptorTest extends TestCase { private PayloadValidatingInterceptor interceptor; - private MockWebServiceMessage request; + private MessageContext context; - private MockMessageContext messageContext; + private SaajSoapMessageFactory factory; protected void setUp() throws Exception { interceptor = new PayloadValidatingInterceptor(); @@ -55,8 +56,10 @@ public class PayloadValidatingInterceptorTest extends TestCase { interceptor.setValidateRequest(true); interceptor.setValidateResponse(true); interceptor.afterPropertiesSet(); - request = new MockWebServiceMessage(); - messageContext = new MockMessageContext(request); + + factory = new SaajSoapMessageFactory(); + factory.afterPropertiesSet(); + context = new DefaultMessageContext(factory); } public void testHandleInvalidRequestSoap11() throws Exception { @@ -65,13 +68,12 @@ public class PayloadValidatingInterceptorTest extends TestCase { Transformer transformer = TransformerFactory.newInstance().newTransformer(); InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml"); transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody())); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(invalidMessage, new MockTransportRequest(), messageFactory); + context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory); boolean result = interceptor.handleRequest(context, null); assertFalse("Invalid response from interceptor", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), @@ -87,13 +89,14 @@ public class PayloadValidatingInterceptorTest extends TestCase { Transformer transformer = TransformerFactory.newInstance().newTransformer(); InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml"); transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody())); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(invalidMessage, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory); boolean result = interceptor.handleRequest(context, null); assertFalse("Invalid response from interceptor", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(), @@ -115,13 +118,12 @@ public class PayloadValidatingInterceptorTest extends TestCase { Transformer transformer = TransformerFactory.newInstance().newTransformer(); InputStream inputStream = getClass().getResourceAsStream("invalidMessage.xml"); transformer.transform(new StreamSource(inputStream), new DOMResult(invalidMessage.getSOAPBody())); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(invalidMessage, new MockTransportRequest(), messageFactory); + context = new DefaultMessageContext(new Saaj13SoapMessage(invalidMessage), factory); boolean result = interceptor.handleRequest(context, null); assertFalse("Invalid response from interceptor", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), @@ -132,29 +134,37 @@ public class PayloadValidatingInterceptorTest extends TestCase { } public void testHandlerInvalidRequest() throws Exception { + MockWebServiceMessage request = new MockWebServiceMessage(); request.setPayload(new ClassPathResource("invalidMessage.xml", getClass())); - boolean result = interceptor.handleRequest(messageContext, null); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + boolean result = interceptor.handleRequest(context, null); assertFalse("Invalid response from interceptor", result); } public void testHandleValidRequest() throws Exception { + MockWebServiceMessage request = new MockWebServiceMessage(); request.setPayload(new ClassPathResource("validMessage.xml", getClass())); - boolean result = interceptor.handleRequest(messageContext, null); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + boolean result = interceptor.handleRequest(context, null); assertTrue("Invalid response from interceptor", result); - assertFalse("Response set", messageContext.hasResponse()); + assertFalse("Response set", context.hasResponse()); } public void testHandleInvalidResponse() throws Exception { - MockWebServiceMessage response = (MockWebServiceMessage) messageContext.getResponse(); + MockWebServiceMessage request = new MockWebServiceMessage(); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(new ClassPathResource("invalidMessage.xml", getClass())); - boolean result = interceptor.handleResponse(messageContext, null); + boolean result = interceptor.handleResponse(context, null); assertFalse("Invalid response from interceptor", result); } public void testHandleValidResponse() throws Exception { - MockWebServiceMessage response = (MockWebServiceMessage) messageContext.getResponse(); + MockWebServiceMessage request = new MockWebServiceMessage(); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(new ClassPathResource("validMessage.xml", getClass())); - boolean result = interceptor.handleResponse(messageContext, null); + boolean result = interceptor.handleResponse(context, null); assertTrue("Invalid response from interceptor", result); } @@ -169,11 +179,9 @@ public class PayloadValidatingInterceptorTest extends TestCase { MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage saajMessage = SaajUtils.loadMessage(new ClassPathResource("validSoapMessage.xml", getClass()), messageFactory); - SaajSoapMessageContext soapContext = - new Saaj13SoapMessageContext(saajMessage, new MockTransportRequest(), messageFactory); - boolean result = interceptor.handleRequest(soapContext, null); + boolean result = interceptor.handleRequest(context, null); assertTrue("Invalid response from interceptor", result); - assertFalse("Response set", soapContext.hasResponse()); + assertFalse("Response set", context.hasResponse()); } finally { // Reset the property @@ -196,8 +204,10 @@ public class PayloadValidatingInterceptorTest extends TestCase { interceptor.setSchemas(new Resource[]{new ClassPathResource("productSchema.xsd", getClass()), new ClassPathResource("sizeSchema.xsd", getClass())}); interceptor.afterPropertiesSet(); - request.setPayload(new ClassPathResource("invalidMessage.xml", getClass())); - boolean result = interceptor.handleRequest(messageContext, null); + MockWebServiceMessage request = + new MockWebServiceMessage(new ClassPathResource("invalidMessage.xml", getClass())); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + boolean result = interceptor.handleRequest(context, null); assertFalse("Invalid response from interceptor", result); } @@ -205,19 +215,24 @@ public class PayloadValidatingInterceptorTest extends TestCase { interceptor.setSchemas(new Resource[]{new ClassPathResource("productSchema.xsd", getClass()), new ClassPathResource("sizeSchema.xsd", getClass())}); interceptor.afterPropertiesSet(); - request.setPayload(new ClassPathResource("validMessage.xml", getClass())); - boolean result = interceptor.handleRequest(messageContext, null); + MockWebServiceMessage request = + new MockWebServiceMessage(new ClassPathResource("validMessage.xml", getClass())); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + + boolean result = interceptor.handleRequest(context, null); assertTrue("Invalid response from interceptor", result); - assertFalse("Response set", messageContext.hasResponse()); + assertFalse("Response set", context.hasResponse()); } public void testHandleInvalidResponseMultipleSchemas() throws Exception { interceptor.setSchemas(new Resource[]{new ClassPathResource("productSchema.xsd", getClass()), new ClassPathResource("sizeSchema.xsd", getClass())}); interceptor.afterPropertiesSet(); - MockWebServiceMessage response = (MockWebServiceMessage) messageContext.getResponse(); + MockWebServiceMessage request = new MockWebServiceMessage(); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(new ClassPathResource("invalidMessage.xml", getClass())); - boolean result = interceptor.handleResponse(messageContext, null); + boolean result = interceptor.handleResponse(context, null); assertFalse("Invalid response from interceptor", result); } @@ -225,9 +240,11 @@ public class PayloadValidatingInterceptorTest extends TestCase { interceptor.setSchemas(new Resource[]{new ClassPathResource("productSchema.xsd", getClass()), new ClassPathResource("sizeSchema.xsd", getClass())}); interceptor.afterPropertiesSet(); - MockWebServiceMessage response = (MockWebServiceMessage) messageContext.getResponse(); + MockWebServiceMessage request = new MockWebServiceMessage(); + context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); + MockWebServiceMessage response = (MockWebServiceMessage) context.getResponse(); response.setPayload(new ClassPathResource("validMessage.xml", getClass())); - boolean result = interceptor.handleResponse(messageContext, null); + boolean result = interceptor.handleResponse(context, null); assertTrue("Invalid response from interceptor", result); } } \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/endpoint/mapping/EndpointMappingTest.java b/core/src/test/java/org/springframework/ws/endpoint/mapping/EndpointMappingTest.java index dd0c29ca..0f88491c 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/mapping/EndpointMappingTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/mapping/EndpointMappingTest.java @@ -17,98 +17,111 @@ package org.springframework.ws.endpoint.mapping; import junit.framework.TestCase; +import org.easymock.MockControl; import org.springframework.context.support.StaticApplicationContext; import org.springframework.ws.EndpointInterceptor; import org.springframework.ws.EndpointInvocationChain; import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.interceptor.EndpointInterceptorAdapter; -import org.springframework.ws.mock.MockMessageContext; public class EndpointMappingTest extends TestCase { + private MessageContext mockContext; + + private MockControl contextControl; + + protected void setUp() throws Exception { + contextControl = MockControl.createControl(MessageContext.class); + mockContext = (MessageContext) contextControl.getMock(); + } + public void testDefaultEndpoint() throws Exception { - final MockMessageContext context = new MockMessageContext(); Object defaultEndpoint = new Object(); AbstractEndpointMapping mapping = new AbstractEndpointMapping() { protected Object getEndpointInternal(MessageContext givenRequest) throws Exception { - assertEquals("Invalid request passed", context, givenRequest); + assertEquals("Invalid request passed", mockContext, givenRequest); return null; } }; mapping.setDefaultEndpoint(defaultEndpoint); + contextControl.replay(); - EndpointInvocationChain result = mapping.getEndpoint(context); + EndpointInvocationChain result = mapping.getEndpoint(mockContext); assertNotNull("No EndpointInvocatioChain returned", result); assertEquals("Default Endpoint not returned", defaultEndpoint, result.getEndpoint()); + contextControl.verify(); } public void testEndpoint() throws Exception { - final MockMessageContext context = new MockMessageContext(); final Object endpoint = new Object(); AbstractEndpointMapping mapping = new AbstractEndpointMapping() { protected Object getEndpointInternal(MessageContext givenRequest) throws Exception { - assertEquals("Invalid request passed", context, givenRequest); + assertEquals("Invalid request passed", mockContext, givenRequest); return endpoint; } }; + contextControl.replay(); - EndpointInvocationChain result = mapping.getEndpoint(context); + EndpointInvocationChain result = mapping.getEndpoint(mockContext); assertNotNull("No EndpointInvocatioChain returned", result); assertEquals("Unexpected Endpoint returned", endpoint, result.getEndpoint()); + contextControl.verify(); } public void testEndpointInterceptors() throws Exception { - final MockMessageContext context = new MockMessageContext(); final Object endpoint = new Object(); EndpointInterceptor interceptor = new EndpointInterceptorAdapter(); AbstractEndpointMapping mapping = new AbstractEndpointMapping() { protected Object getEndpointInternal(MessageContext givenRequest) throws Exception { - assertEquals("Invalid request passed", context, givenRequest); + assertEquals("Invalid request passed", mockContext, givenRequest); return endpoint; } }; + contextControl.replay(); mapping.setInterceptors(new EndpointInterceptor[]{interceptor}); - EndpointInvocationChain result = mapping.getEndpoint(context); + EndpointInvocationChain result = mapping.getEndpoint(mockContext); assertEquals("Unexpected amount of EndpointInterceptors returned", 1, result.getInterceptors().length); assertEquals("Unexpected EndpointInterceptor returned", interceptor, result.getInterceptors()[0]); + contextControl.verify(); } public void testEndpointBeanName() throws Exception { - final MockMessageContext context = new MockMessageContext(); StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.registerSingleton("endpoint", Object.class); AbstractEndpointMapping mapping = new AbstractEndpointMapping() { protected Object getEndpointInternal(MessageContext message) throws Exception { - assertEquals("Invalid request", context, message); + assertEquals("Invalid request", mockContext, message); return "endpoint"; } }; mapping.setApplicationContext(applicationContext); + contextControl.replay(); - EndpointInvocationChain result = mapping.getEndpoint(context); + EndpointInvocationChain result = mapping.getEndpoint(mockContext); assertNotNull("No endpoint returned", result); + contextControl.verify(); } public void testEndpointInvalidBeanName() throws Exception { - final MockMessageContext context = new MockMessageContext(); - StaticApplicationContext applicationContext = new StaticApplicationContext(); applicationContext.registerSingleton("endpoint", Object.class); AbstractEndpointMapping mapping = new AbstractEndpointMapping() { protected Object getEndpointInternal(MessageContext message) throws Exception { - assertEquals("Invalid request", context, message); + assertEquals("Invalid request", mockContext, message); return "noSuchBean"; } }; mapping.setApplicationContext(applicationContext); + contextControl.replay(); - EndpointInvocationChain result = mapping.getEndpoint(context); + EndpointInvocationChain result = mapping.getEndpoint(mockContext); assertNull("No endpoint returned", result); + contextControl.verify(); } diff --git a/core/src/test/java/org/springframework/ws/endpoint/mapping/PayloadRootQNameEndpointMappingTest.java b/core/src/test/java/org/springframework/ws/endpoint/mapping/PayloadRootQNameEndpointMappingTest.java index 875c59e6..86402211 100644 --- a/core/src/test/java/org/springframework/ws/endpoint/mapping/PayloadRootQNameEndpointMappingTest.java +++ b/core/src/test/java/org/springframework/ws/endpoint/mapping/PayloadRootQNameEndpointMappingTest.java @@ -19,7 +19,10 @@ package org.springframework.ws.endpoint.mapping; import javax.xml.namespace.QName; import junit.framework.TestCase; -import org.springframework.ws.mock.MockMessageContext; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; public class PayloadRootQNameEndpointMappingTest extends TestCase { @@ -31,7 +34,8 @@ public class PayloadRootQNameEndpointMappingTest extends TestCase { } public void testResolveQNames() throws Exception { - MockMessageContext context = new MockMessageContext(""); + MockWebServiceMessage request = new MockWebServiceMessage(""); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); QName qName = mapping.resolveQName(context); assertNotNull("mapping returns null", qName); @@ -39,7 +43,8 @@ public class PayloadRootQNameEndpointMappingTest extends TestCase { } public void testGetQNameNameNamespace() throws Exception { - MockMessageContext context = new MockMessageContext(""); + MockWebServiceMessage request = new MockWebServiceMessage(""); + MessageContext context = new DefaultMessageContext(request, new MockWebServiceMessageFactory()); QName qName = mapping.resolveQName(context); assertNotNull("mapping returns null", qName); diff --git a/core/src/test/java/org/springframework/ws/mock/MockMessageContext.java b/core/src/test/java/org/springframework/ws/mock/MockMessageContext.java deleted file mode 100644 index 208e00b7..00000000 --- a/core/src/test/java/org/springframework/ws/mock/MockMessageContext.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.mock; - -import java.io.IOException; - -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.context.AbstractMessageContext; -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportResponse; - -/** - * Mock implementation of the MessageContext interface. - * - * @author Arjen Poutsma - */ -public class MockMessageContext extends AbstractMessageContext { - - private TransportResponse transportResponse; - - public MockMessageContext() { - super(new MockWebServiceMessage(), new MockTransportRequest()); - } - - public MockMessageContext(MockWebServiceMessage request) { - super(request, new MockTransportRequest()); - } - - public MockMessageContext(MockWebServiceMessage request, TransportContext transportContext) { - super(request, transportContext.getTransportRequest()); - transportResponse = transportContext.getTransportResponse(); - } - - public MockMessageContext(String content) { - super(new MockWebServiceMessage(content), new MockTransportRequest()); - } - - protected WebServiceMessage createResponseMessage() { - return new MockWebServiceMessage(); - } - - public void sendResponse(TransportResponse transportResponse) throws IOException { - getResponse().writeTo(this.transportResponse.getOutputStream()); - } -} diff --git a/core/src/test/java/org/springframework/ws/mock/MockTransportContext.java b/core/src/test/java/org/springframework/ws/mock/MockTransportContext.java deleted file mode 100644 index d4aca745..00000000 --- a/core/src/test/java/org/springframework/ws/mock/MockTransportContext.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.mock; - -import org.springframework.ws.transport.TransportContext; -import org.springframework.ws.transport.TransportRequest; -import org.springframework.ws.transport.TransportResponse; - -/** - * Mock implementation of the TransportContext interface. - * - * @author Arjen Poutsma - */ -public class MockTransportContext implements TransportContext { - - private MockTransportRequest request; - - private MockTransportResponse response; - - public MockTransportContext() { - request = new MockTransportRequest(); - response = new MockTransportResponse(); - } - - public MockTransportContext(MockTransportRequest request) { - this.request = request; - } - - public MockTransportContext(MockTransportRequest request, MockTransportResponse response) { - this.request = request; - this.response = response; - } - - public TransportRequest getTransportRequest() { - return request; - } - - public TransportResponse getTransportResponse() { - return response; - } -} diff --git a/core/src/test/java/org/springframework/ws/mock/MockTransportRequest.java b/core/src/test/java/org/springframework/ws/mock/MockTransportRequest.java deleted file mode 100644 index 85d897f5..00000000 --- a/core/src/test/java/org/springframework/ws/mock/MockTransportRequest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.mock; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Iterator; -import java.util.Properties; - -import org.springframework.util.Assert; -import org.springframework.ws.transport.TransportRequest; - -/** - * Mock implementation of the TransportRequest interface. - * - * @author Arjen Poutsma - */ -public class MockTransportRequest implements TransportRequest { - - private byte[] contents; - - private Properties headers; - - private String url; - - public MockTransportRequest() { - headers = new Properties(); - contents = new byte[0]; - } - - public MockTransportRequest(Properties headers, byte[] contents) { - Assert.notNull(headers, "headers must not be null"); - Assert.notNull(contents, "contents must not be null"); - this.headers = headers; - this.contents = contents; - } - - public MockTransportRequest(byte[] contents) { - Assert.notNull(contents, "contents must not be null"); - this.contents = contents; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getUrl() { - return url; - } - - public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(contents); - } - - public Iterator getHeaderNames() { - return headers.keySet().iterator(); - } - - public Iterator getHeaders(String name) { - String value = headers.getProperty(name); - return value != null ? Collections.singletonList(value).iterator() : Collections.EMPTY_LIST.iterator(); - } - - public void addHeader(String name, String value) { - headers.setProperty(name, value); - } -} diff --git a/core/src/test/java/org/springframework/ws/mock/MockTransportResponse.java b/core/src/test/java/org/springframework/ws/mock/MockTransportResponse.java deleted file mode 100644 index e6a4771d..00000000 --- a/core/src/test/java/org/springframework/ws/mock/MockTransportResponse.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.mock; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.Properties; - -import org.springframework.ws.transport.TransportResponse; - -/** - * Mock implementation of the TransportResponse interface. - * - * @author Arjen Poutsma - */ -public class MockTransportResponse implements TransportResponse { - - private Properties headers = new Properties(); - - private ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - public void addHeader(String name, String value) { - String currentValue = headers.getProperty(name); - if (currentValue != null) { - value = currentValue + "," + value; - } - headers.setProperty(name, value); - } - - public Properties getHeaders() { - return headers; - } - - public String getContents() { - try { - return new String(outputStream.toByteArray(), "UTF-8"); - } - catch (UnsupportedEncodingException e) { - return ""; - } - } - - public OutputStream getOutputStream() throws IOException { - return outputStream; - } -} diff --git a/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactoryTest.java b/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactoryTest.java deleted file mode 100644 index b308d52b..00000000 --- a/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextFactoryTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.pox.dom; - -import junit.framework.TestCase; -import org.springframework.ws.mock.MockTransportContext; -import org.springframework.ws.mock.MockTransportRequest; - -public class DomPoxMessageContextFactoryTest extends TestCase { - - private DomPoxMessageContextFactory contextFactory; - - protected void setUp() throws Exception { - contextFactory = new DomPoxMessageContextFactory(); - contextFactory.afterPropertiesSet(); - } - - public void testCreateContext() throws Exception { - String content = ""; - MockTransportRequest transportRequest = new MockTransportRequest(content.getBytes("UTF-8")); - MockTransportContext transportContext = new MockTransportContext(transportRequest); - DomPoxMessageContext context = (DomPoxMessageContext) contextFactory.createContext(transportContext); - assertNotNull("No context returned", context); - } -} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextTest.java b/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextTest.java deleted file mode 100644 index 35599158..00000000 --- a/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageContextTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.pox.dom; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; - -import org.custommonkey.xmlunit.XMLTestCase; -import org.springframework.ws.WebServiceMessage; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.mock.MockTransportResponse; -import org.springframework.xml.transform.StringResult; -import org.springframework.xml.transform.StringSource; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -public class DomPoxMessageContextTest extends XMLTestCase { - - private DomPoxMessageContext context; - - private Transformer transformer; - - protected void setUp() throws Exception { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - documentBuilderFactory.setNamespaceAware(true); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.newDocument(); - Element element = document.createElementNS("http://springframework.org/spring-ws", "element"); - document.appendChild(element); - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformer = transformerFactory.newTransformer(); - MockTransportRequest transportRequest = new MockTransportRequest(); - context = new DomPoxMessageContext(document, transportRequest, documentBuilder, transformer); - } - - public void testGetRequest() throws Exception { - WebServiceMessage message = context.getRequest(); - assertNotNull("No request returned", message); - StringResult result = new StringResult(); - transformer.transform(message.getPayloadSource(), result); - assertXMLEqual("", result.toString()); - } - - public void testGetResponse() throws Exception { - WebServiceMessage message = context.getResponse(); - assertNotNull("No request returned", message); - } - - public void testSendResponse() throws Exception { - WebServiceMessage message = context.getResponse(); - String content = ""; - StringSource source = new StringSource(content); - transformer.transform(source, message.getPayloadResult()); - MockTransportResponse transportResponse = new MockTransportResponse(); - context.sendResponse(transportResponse); - assertXMLEqual(transportResponse.getContents(), content); - } -} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageFactoryTest.java b/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageFactoryTest.java new file mode 100644 index 00000000..f36c102f --- /dev/null +++ b/core/src/test/java/org/springframework/ws/pox/dom/DomPoxMessageFactoryTest.java @@ -0,0 +1,29 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.pox.dom; + +import org.springframework.ws.AbstractWebServiceMessageFactoryTestCase; +import org.springframework.ws.WebServiceMessageFactory; + +public class DomPoxMessageFactoryTest extends AbstractWebServiceMessageFactoryTestCase { + + protected WebServiceMessageFactory createMessageFactory() throws Exception { + DomPoxMessageFactory factory = new DomPoxMessageFactory(); + factory.afterPropertiesSet(); + return factory; + } +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageFactoryTestCase.java new file mode 100644 index 00000000..afc3557a --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/AbstractSoapMessageFactoryTestCase.java @@ -0,0 +1,29 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap; + +import org.springframework.ws.AbstractWebServiceMessageFactoryTestCase; +import org.springframework.ws.WebServiceMessage; + +public abstract class AbstractSoapMessageFactoryTestCase extends AbstractWebServiceMessageFactoryTestCase { + + public void testCreateEmptySoapMessage() throws Exception { + WebServiceMessage message = messageFactory.createWebServiceMessage(); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + } + +} diff --git a/core/src/test/java/org/springframework/ws/soap/SoapMessageDispatcherTest.java b/core/src/test/java/org/springframework/ws/soap/SoapMessageDispatcherTest.java index ca3ea04f..2ca7ecad 100644 --- a/core/src/test/java/org/springframework/ws/soap/SoapMessageDispatcherTest.java +++ b/core/src/test/java/org/springframework/ws/soap/SoapMessageDispatcherTest.java @@ -26,9 +26,10 @@ import javax.xml.soap.SOAPMessage; import junit.framework.TestCase; import org.easymock.MockControl; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; +import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; +import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage; import org.springframework.ws.soap.soap11.Soap11Fault; import org.springframework.ws.soap.soap12.Soap12Fault; @@ -40,10 +41,13 @@ public class SoapMessageDispatcherTest extends TestCase { private SoapEndpointInterceptor interceptorMock; + private SaajSoapMessageFactory factory; + protected void setUp() throws Exception { interceptorControl = MockControl.createControl(SoapEndpointInterceptor.class); interceptorMock = (SoapEndpointInterceptor) interceptorControl.getMock(); dispatcher = new SoapMessageDispatcher(); + factory = new SaajSoapMessageFactory(); } public void testProcessMustUnderstandHeadersUnderstoodSoap11() throws Exception { @@ -53,8 +57,9 @@ public class SoapMessageDispatcherTest extends TestCase { request.getSOAPHeader().addHeaderElement(new QName("http://www.springframework.org", "Header")); header.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT); header.setMustUnderstand(true); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(true); @@ -75,8 +80,9 @@ public class SoapMessageDispatcherTest extends TestCase { request.getSOAPHeader().addHeaderElement(new QName("http://www.springframework.org", "Header")); header.setMustUnderstand(true); header.setRole(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(true); @@ -97,8 +103,9 @@ public class SoapMessageDispatcherTest extends TestCase { .addHeaderElement(new QName("http://www.springframework.org", "Header", "spring-ws")); header.setActor(SOAPConstants.URI_SOAP_ACTOR_NEXT); header.setMustUnderstand(true); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(false); @@ -110,7 +117,7 @@ public class SoapMessageDispatcherTest extends TestCase { boolean result = dispatcher.handleRequest(chain, context); assertFalse("Header understood", result); assertTrue("Context has no response", context.hasResponse()); - SoapBody responseBody = context.getSoapResponse().getSoapBody(); + SoapBody responseBody = ((SoapMessage) context.getResponse()).getSoapBody(); assertTrue("Response body has no fault", responseBody.hasFault()); Soap11Fault fault = (Soap11Fault) responseBody.getFault(); assertEquals("Invalid fault code", new QName(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE, "MustUnderstand"), @@ -129,8 +136,9 @@ public class SoapMessageDispatcherTest extends TestCase { .addHeaderElement(new QName("http://www.springframework.org", "Header", "spring-ws")); header.setMustUnderstand(true); header.setRole(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(false); @@ -142,7 +150,8 @@ public class SoapMessageDispatcherTest extends TestCase { boolean result = dispatcher.handleRequest(chain, context); assertFalse("Header understood", result); assertTrue("Context has no response", context.hasResponse()); - SoapBody responseBody = context.getSoapResponse().getSoapBody(); + SoapMessage response = (SoapMessage) context.getResponse(); + SoapBody responseBody = response.getSoapBody(); assertTrue("Response body has no fault", responseBody.hasFault()); Soap12Fault fault = (Soap12Fault) responseBody.getFault(); assertEquals("Invalid fault code", new QName(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE, "MustUnderstand"), @@ -150,7 +159,7 @@ public class SoapMessageDispatcherTest extends TestCase { assertEquals("Invalid fault string", SoapMessageDispatcher.DEFAULT_MUST_UNDERSTAND_FAULT, fault.getFaultReasonText(Locale.ENGLISH)); assertEquals("Invalid fault actor", SOAPConstants.URI_SOAP_1_2_ROLE_NEXT, fault.getFaultActorOrRole()); - SoapHeader responseHeader = context.getSoapResponse().getSoapHeader(); + SoapHeader responseHeader = response.getSoapHeader(); Iterator iterator = responseHeader.examineAllHeaderElements(); assertTrue("Response header has no elements", iterator.hasNext()); SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next(); @@ -167,8 +176,9 @@ public class SoapMessageDispatcherTest extends TestCase { String headerActor = "http://www/springframework.org/role"; header.setActor(headerActor); header.setMustUnderstand(true); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(true); @@ -182,7 +192,7 @@ public class SoapMessageDispatcherTest extends TestCase { interceptorControl.verify(); } - public void testProcessMustUnderstandHeadersForRoleSoap11() throws Exception { + public void testProcessMustUnderstandHeadersForRoleSoap12() throws Exception { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); SOAPMessage request = messageFactory.createMessage(); SOAPHeaderElement header = request.getSOAPHeader() @@ -190,8 +200,9 @@ public class SoapMessageDispatcherTest extends TestCase { String headerRole = "http://www/springframework.org/role"; header.setRole(headerRole); header.setMustUnderstand(true); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorMock.understands(null); interceptorControl.setMatcher(MockControl.ALWAYS_MATCHER); interceptorControl.setReturnValue(true); @@ -209,8 +220,9 @@ public class SoapMessageDispatcherTest extends TestCase { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage request = messageFactory.createMessage(); request.getSOAPHeader().detachNode(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(request), factory); interceptorControl.replay(); SoapEndpointInvocationChain chain = new SoapEndpointInvocationChain(new Object(), diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageContextFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java similarity index 54% rename from core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageContextFactoryTest.java rename to core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java index c140e42e..18a000a8 100644 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageContextFactoryTest.java +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap11MessageFactoryTest.java @@ -16,18 +16,19 @@ package org.springframework.ws.soap.axiom; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.context.AbstractSoap11MessageContextFactoryTestCase; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.soap.soap11.AbstractSoap11MessageFactoryTestCase; -public class AxiomSoap11MessageContextFactoryTest extends AbstractSoap11MessageContextFactoryTestCase { +public class AxiomSoap11MessageFactoryTest extends AbstractSoap11MessageFactoryTestCase { - protected MessageContextFactory createSoapMessageContextFactory() { - return new AxiomSoapMessageContextFactory(); + protected WebServiceMessageFactory createMessageFactory() throws Exception { + AxiomSoapMessageFactory factory = new AxiomSoapMessageFactory(); + factory.afterPropertiesSet(); + return factory; } - public void testCreateContextAttachment() throws Exception { - // Axiom 1.1.1 has a fatal bug with regard to SwA + public void testCreateSoapMessageAttachment() throws Exception { + // Axiom 1.1.1 has a fatal bug with regard to SwA } - -} +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageContextFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageContextFactoryTest.java deleted file mode 100644 index 659982b5..00000000 --- a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageContextFactoryTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.springframework.ws.soap.axiom; - -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.context.AbstractSoap12MessageContextFactoryTestCase; - -public class AxiomSoap12MessageContextFactoryTest extends AbstractSoap12MessageContextFactoryTestCase { - - protected MessageContextFactory createSoapMessageContextFactory() { - return new AxiomSoapMessageContextFactory(); - } - - public void testCreateContextAttachments() throws Exception { - // Axiom does not support SwA with SOAP 1.2 - } -} diff --git a/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java new file mode 100644 index 00000000..d3f4b51a --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/axiom/AxiomSoap12MessageFactoryTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.axiom; + +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.soap.soap12.AbstractSoap12MessageFactoryTestCase; + +public class AxiomSoap12MessageFactoryTest extends AbstractSoap12MessageFactoryTestCase { + + protected WebServiceMessageFactory createMessageFactory() throws Exception { + AxiomSoapMessageFactory factory = new AxiomSoapMessageFactory(); + factory.afterPropertiesSet(); + return factory; + } + + public void testCreateEmptyMessage() throws Exception { + } + + public void testCreateSoapMessageAttachment() throws Exception { + // Axiom does not support SwA with SOAP 1.2 + } + +} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextFactoryTestCase.java deleted file mode 100644 index e709633a..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextFactoryTestCase.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import java.util.Properties; - -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.mock.MockTransportContext; -import org.springframework.ws.soap.Attachment; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.SoapVersion; - -public abstract class AbstractSoap11MessageContextFactoryTestCase extends AbstractSoapMessageContextFactoryTestCase { - - public void testCreateContextNoAttachment() throws Exception { - Properties headers = new Properties(); - headers.setProperty("Content-Type", "text/xml"); - headers.setProperty("SOAPAction", "\"Some-URI\""); - MockTransportContext transportContext = createTransportContext(headers, "soap11.xml"); - - MessageContext messageContext = contextFactory.createContext(transportContext); - SoapMessage requestMessage = (SoapMessage) messageContext.getRequest(); - assertNotNull("Request null", requestMessage); - assertEquals("Invalid soap version", SoapVersion.SOAP_11, requestMessage.getVersion()); - } - - public void testCreateContextAttachment() throws Exception { - Properties headers = new Properties(); - headers.setProperty("Content-Type", - "multipart/related; type=\"text/xml\"; boundary=\"----=_Part_0_11416420.1149699787554\""); - MockTransportContext transportContext = createTransportContext(headers, "soap11-attachment.bin"); - - MessageContext messageContext = contextFactory.createContext(transportContext); - SoapMessage requestMessage = (SoapMessage) messageContext.getRequest(); - assertEquals("Invalid soap version", SoapVersion.SOAP_11, requestMessage.getVersion()); - Attachment attachment = requestMessage.getAttachment("interface21"); - assertNotNull("No attachment read", attachment); - } - -} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextTestCase.java deleted file mode 100644 index 249bef84..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap11MessageContextTestCase.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.InputStreamSource; -import org.springframework.ws.soap.SoapVersion; - -public abstract class AbstractSoap11MessageContextTestCase extends AbstractSoapMessageContextTestCase { - - public void testWriteToTransportResponse() throws Exception { - messageContext.getResponse(); // create response - messageContext.sendResponse(transportResponse); - assertXMLEqual("

", - transportResponse.getContents()); - assertTrue("Invalid Content-Type set", transportResponse.getHeaders().getProperty("Content-Type") - .indexOf(SoapVersion.SOAP_11.getContentType()) != -1); - } - - public void testWriteToTransportResponseAttachment() throws Exception { - InputStreamSource inputStreamSource = new ByteArrayResource("contents".getBytes("UTF-8")); - messageContext.getSoapResponse().addAttachment(inputStreamSource, "text/plain"); - messageContext.sendResponse(transportResponse); - assertTrue("Invalid Content-Type set", transportResponse.getHeaders().getProperty("Content-Type") - .indexOf(SoapVersion.SOAP_11.getContentType()) != -1); - } - -} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextFactoryTestCase.java deleted file mode 100644 index 7816b419..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextFactoryTestCase.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.springframework.ws.soap.context; - -import java.util.Properties; - -import org.springframework.ws.context.MessageContext; -import org.springframework.ws.mock.MockTransportContext; -import org.springframework.ws.soap.Attachment; -import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.SoapVersion; - -public abstract class AbstractSoap12MessageContextFactoryTestCase extends AbstractSoapMessageContextFactoryTestCase { - - public void testCreateContextNoAttachment() throws Exception { - Properties headers = new Properties(); - headers.setProperty("Content-Type", "application/soap+xml"); - headers.setProperty("SOAPAction", "\"Some-URI\""); - MockTransportContext transportContext = createTransportContext(headers, "soap12.xml"); - - MessageContext messageContext = contextFactory.createContext(transportContext); - SoapMessage requestMessage = (SoapMessage) messageContext.getRequest(); - assertNotNull("Request null", requestMessage); - assertEquals("Invalid soap version", SoapVersion.SOAP_12, requestMessage.getVersion()); - } - - public void testCreateContextAttachments() throws Exception { - Properties headers = new Properties(); - headers.setProperty("Content-Type", - "multipart/related; type=\"application/soap+xml\"; boundary=\"----=_Part_0_11416420.1149699787554\""); - MockTransportContext transportContext = createTransportContext(headers, "soap12-attachment.bin"); - - MessageContext messageContext = contextFactory.createContext(transportContext); - SoapMessage requestMessage = (SoapMessage) messageContext.getRequest(); - assertEquals("Invalid soap version", SoapVersion.SOAP_12, requestMessage.getVersion()); - Attachment attachment = requestMessage.getAttachment("interface21"); - assertNotNull("No attachment read", attachment); - } - -} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextTestCase.java deleted file mode 100644 index 52124094..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoap12MessageContextTestCase.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.InputStreamSource; -import org.springframework.ws.soap.SoapVersion; - -public abstract class AbstractSoap12MessageContextTestCase extends AbstractSoapMessageContextTestCase { - - public void testWriteToTransportResponse() throws Exception { - messageContext.getResponse(); // create response - messageContext.sendResponse(transportResponse); - assertXMLEqual("
", - transportResponse.getContents()); - assertTrue("Invalid Content-Type set", transportResponse.getHeaders().getProperty("Content-Type") - .indexOf(SoapVersion.SOAP_12.getContentType()) != -1); - } - - public void testWriteToTransportResponseAttachment() throws Exception { - InputStreamSource inputStreamSource = new ByteArrayResource("contents".getBytes("UTF-8")); - messageContext.getSoapResponse().addAttachment(inputStreamSource, "text/plain"); - messageContext.sendResponse(transportResponse); - assertTrue("Invalid Content-Type set", transportResponse.getHeaders().getProperty("Content-Type") - .indexOf(SoapVersion.SOAP_12.getContentType()) != -1); - } - -} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextFactoryTestCase.java deleted file mode 100644 index efe10902..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextFactoryTestCase.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.springframework.ws.soap.context; - -import java.io.IOException; -import java.util.Properties; - -import junit.framework.TestCase; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.util.FileCopyUtils; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.mock.MockTransportContext; -import org.springframework.ws.mock.MockTransportRequest; - -public abstract class AbstractSoapMessageContextFactoryTestCase extends TestCase { - - protected MessageContextFactory contextFactory; - - protected final void setUp() throws Exception { - contextFactory = createSoapMessageContextFactory(); - if (contextFactory instanceof InitializingBean) { - ((InitializingBean) contextFactory).afterPropertiesSet(); - } - } - - protected MockTransportContext createTransportContext(Properties headers, String requestFile) throws IOException { - byte[] contents = FileCopyUtils - .copyToByteArray(AbstractSoapMessageContextFactoryTestCase.class.getResourceAsStream(requestFile)); - return new MockTransportContext(new MockTransportRequest(headers, contents)); - } - - protected abstract MessageContextFactory createSoapMessageContextFactory() throws Exception; - -} diff --git a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextTestCase.java b/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextTestCase.java deleted file mode 100644 index ecbedbb9..00000000 --- a/core/src/test/java/org/springframework/ws/soap/context/AbstractSoapMessageContextTestCase.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.context; - -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; - -import org.custommonkey.xmlunit.XMLTestCase; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.mock.MockTransportResponse; -import org.springframework.ws.transport.TransportRequest; - -public abstract class AbstractSoapMessageContextTestCase extends XMLTestCase { - - protected SoapMessageContext messageContext; - - protected Transformer transformer; - - protected MockTransportResponse transportResponse; - - protected final void setUp() throws Exception { - TransformerFactory transformerFactory = TransformerFactory.newInstance(); - transformer = transformerFactory.newTransformer(); - TransportRequest transportRequest = new MockTransportRequest(); - transportResponse = new MockTransportResponse(); - messageContext = createMessageContext(transportRequest); - } - - protected abstract SoapMessageContext createMessageContext(TransportRequest transportRequest) throws Exception; - - -} diff --git a/core/src/test/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolverTest.java b/core/src/test/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolverTest.java index 7f04feee..7f0922ac 100644 --- a/core/src/test/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolverTest.java +++ b/core/src/test/java/org/springframework/ws/soap/endpoint/SimpleSoapExceptionResolverTest.java @@ -20,17 +20,18 @@ import java.util.Locale; import junit.framework.TestCase; import org.easymock.MockControl; +import org.springframework.ws.MockWebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.context.SoapMessageContext; import org.springframework.ws.soap.soap11.Soap11Body; public class SimpleSoapExceptionResolverTest extends TestCase { private SimpleSoapExceptionResolver exceptionResolver; - private MockControl contextControl; - - private SoapMessageContext contextMock; + private MessageContext messageContext; private MockControl messageControl; @@ -40,10 +41,15 @@ public class SimpleSoapExceptionResolverTest extends TestCase { private Soap11Body bodyMock; + private MockControl factoryControl; + + private WebServiceMessageFactory factoryMock; + protected void setUp() throws Exception { exceptionResolver = new SimpleSoapExceptionResolver(); - contextControl = MockControl.createControl(SoapMessageContext.class); - contextMock = (SoapMessageContext) contextControl.getMock(); + factoryControl = MockControl.createControl(WebServiceMessageFactory.class); + factoryMock = (WebServiceMessageFactory) factoryControl.getMock(); + messageContext = new DefaultMessageContext(new MockWebServiceMessage(), factoryMock); messageControl = MockControl.createControl(SoapMessage.class); messageMock = (SoapMessage) messageControl.getMock(); bodyControl = MockControl.createControl(Soap11Body.class); @@ -53,15 +59,15 @@ public class SimpleSoapExceptionResolverTest extends TestCase { public void testResolveExceptionInternal() throws Exception { Exception exception = new Exception("message"); - contextControl.expectAndReturn(contextMock.getSoapResponse(), messageMock); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), messageMock); messageControl.expectAndReturn(messageMock.getSoapBody(), bodyMock); bodyControl.expectAndReturn(bodyMock.addServerOrReceiverFault(exception.getMessage(), Locale.ENGLISH), null); - contextControl.replay(); + factoryControl.replay(); messageControl.replay(); bodyControl.replay(); - boolean result = exceptionResolver.resolveExceptionInternal(contextMock, null, exception); + boolean result = exceptionResolver.resolveExceptionInternal(messageContext, null, exception); assertTrue("Invalid result", result); - contextControl.verify(); + factoryControl.verify(); messageControl.verify(); bodyControl.verify(); } diff --git a/core/src/test/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolverTest.java b/core/src/test/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolverTest.java index 1c42b61a..80c2de21 100644 --- a/core/src/test/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolverTest.java +++ b/core/src/test/java/org/springframework/ws/soap/endpoint/SoapFaultMappingExceptionResolverTest.java @@ -23,12 +23,13 @@ import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPMessage; import org.custommonkey.xmlunit.XMLTestCase; -import org.springframework.ws.mock.MockTransportRequest; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapMessageException; import org.springframework.ws.soap.SoapVersion; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; +import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; +import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessage; import org.springframework.ws.soap.soap11.Soap11Fault; import org.springframework.ws.soap.soap12.Soap12Fault; @@ -36,8 +37,12 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { private SoapFaultMappingExceptionResolver resolver; + private SaajSoapMessageFactory factory; + protected void setUp() throws Exception { resolver = new SoapFaultMappingExceptionResolver(); + factory = new SaajSoapMessageFactory(); + } public void testGetDepth() throws Exception { @@ -56,13 +61,14 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(message, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(message), factory); boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla")); assertTrue("resolveException returns false", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), @@ -79,13 +85,14 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(message, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(message), factory); boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla")); assertTrue("resolveException returns false", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(), @@ -102,13 +109,14 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(message, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(message), factory); boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla")); assertTrue("resolveException returns false", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(), @@ -125,13 +133,14 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(message, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(message), factory); boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla")); assertTrue("resolveException returns false", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getServerOrReceiverFaultName(), @@ -150,13 +159,14 @@ public class SoapFaultMappingExceptionResolverTest extends XMLTestCase { resolver.setDefaultFault(defaultFault); MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage message = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(message, new MockTransportRequest(), messageFactory); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + MessageContext context = new DefaultMessageContext(new Saaj13SoapMessage(message), factory); boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla")); assertTrue("resolveException returns false", result); assertTrue("Context has no response", context.hasResponse()); - SoapMessage response = context.getSoapResponse(); + SoapMessage response = (SoapMessage) context.getResponse(); assertTrue("Resonse has no fault", response.getSoapBody().hasFault()); Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault(); assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(), diff --git a/core/src/test/java/org/springframework/ws/soap/endpoint/interceptor/SoapEnvelopeLoggingInterceptorTest.java b/core/src/test/java/org/springframework/ws/soap/endpoint/interceptor/SoapEnvelopeLoggingInterceptorTest.java index e21908ac..97645c00 100644 --- a/core/src/test/java/org/springframework/ws/soap/endpoint/interceptor/SoapEnvelopeLoggingInterceptorTest.java +++ b/core/src/test/java/org/springframework/ws/soap/endpoint/interceptor/SoapEnvelopeLoggingInterceptorTest.java @@ -16,18 +16,15 @@ package org.springframework.ws.soap.endpoint.interceptor; -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPMessage; - import junit.framework.TestCase; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.soap.saaj.SaajSoapMessageContext; -import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; +import org.springframework.ws.soap.saaj.SaajSoapMessageFactory; public class SoapEnvelopeLoggingInterceptorTest extends TestCase { @@ -35,16 +32,16 @@ public class SoapEnvelopeLoggingInterceptorTest extends TestCase { private CountingAppender appender; - private SaajSoapMessageContext messageContext; + private MessageContext messageContext; protected void setUp() throws Exception { interceptor = new SoapEnvelopeLoggingInterceptor(); appender = new SoapEnvelopeLoggingInterceptorTest.CountingAppender(); BasicConfigurator.configure(appender); Logger.getRootLogger().setLevel(Level.DEBUG); - MessageFactory messageFactory = MessageFactory.newInstance(); - SOAPMessage saajMessage = messageFactory.createMessage(); - messageContext = new Saaj13SoapMessageContext(saajMessage, new MockTransportRequest(), messageFactory); + SaajSoapMessageFactory factory = new SaajSoapMessageFactory(); + factory.afterPropertiesSet(); + messageContext = new DefaultMessageContext(factory); appender.reset(); } diff --git a/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/DelegatingSoapEndpointMappingTest.java b/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/DelegatingSoapEndpointMappingTest.java index d15ea3b0..50ed4bbf 100644 --- a/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/DelegatingSoapEndpointMappingTest.java +++ b/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/DelegatingSoapEndpointMappingTest.java @@ -20,7 +20,9 @@ import junit.framework.TestCase; import org.easymock.MockControl; import org.springframework.ws.EndpointInvocationChain; import org.springframework.ws.EndpointMapping; -import org.springframework.ws.mock.MockMessageContext; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.soap.SoapEndpointInvocationChain; public class DelegatingSoapEndpointMappingTest extends TestCase { @@ -41,7 +43,7 @@ public class DelegatingSoapEndpointMappingTest extends TestCase { public void testGetEndpointMapping() throws Exception { String role = "http://www.springframework.org/spring-ws/role"; endpointMapping.setActorOrRole(role); - MockMessageContext context = new MockMessageContext(); + MessageContext context = new DefaultMessageContext(new MockWebServiceMessageFactory()); EndpointInvocationChain delegateChain = new EndpointInvocationChain(new Object()); control.expectAndReturn(mock.getEndpoint(context), delegateChain); control.replay(); diff --git a/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMappingTest.java b/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMappingTest.java index 693ad8b0..16675d87 100644 --- a/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMappingTest.java +++ b/core/src/test/java/org/springframework/ws/soap/endpoint/mapping/SoapActionEndpointMappingTest.java @@ -16,36 +16,54 @@ package org.springframework.ws.soap.endpoint.mapping; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.HashMap; +import java.util.Map; + import junit.framework.TestCase; -import org.springframework.ws.mock.MockMessageContext; -import org.springframework.ws.mock.MockTransportContext; -import org.springframework.ws.mock.MockTransportRequest; -import org.springframework.ws.mock.MockWebServiceMessage; +import org.springframework.ws.MockWebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; +import org.springframework.ws.transport.SimpleTransportContext; +import org.springframework.ws.transport.StubTransportInputStream; +import org.springframework.ws.transport.StubTransportOutputStream; +import org.springframework.ws.transport.TransportContext; +import org.springframework.ws.transport.TransportContextHolder; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.TransportOutputStream; public class SoapActionEndpointMappingTest extends TestCase { private SoapActionEndpointMapping mapping; - private MockTransportRequest request; + private MessageContext context; - private MockMessageContext context; + private Map headers; protected void setUp() throws Exception { - request = new MockTransportRequest(); - MockTransportContext transportContext = new MockTransportContext(request); - context = new MockMessageContext(new MockWebServiceMessage(), transportContext); + headers = new HashMap(); + TransportInputStream tis = new StubTransportInputStream(new ByteArrayInputStream(new byte[0]), headers); + TransportOutputStream tos = new StubTransportOutputStream(new ByteArrayOutputStream()); + TransportContext transportContext = new SimpleTransportContext(tis, tos); + TransportContextHolder.setTransportContext(transportContext); mapping = new SoapActionEndpointMapping(); + context = new DefaultMessageContext(new MockWebServiceMessageFactory()); + } + + protected void tearDown() throws Exception { + TransportContextHolder.setTransportContext(null); } public void testGetLookupKeyForMessage() throws Exception { String soapAction = "http://springframework.org/spring-ws/SoapAction"; - request.addHeader(SoapActionEndpointMapping.SOAP_ACTION_HEADER, soapAction); + headers.put(SoapActionEndpointMapping.SOAP_ACTION_HEADER, soapAction); assertEquals("Invalid lookup key", soapAction, mapping.getLookupKeyForMessage(context)); } public void testGetLookupKeyForMessageQuoted() throws Exception { String soapAction = "http://springframework.org/spring-ws/SoapAction"; - request.addHeader(SoapActionEndpointMapping.SOAP_ACTION_HEADER, "\"" + soapAction + "\""); + headers.put(SoapActionEndpointMapping.SOAP_ACTION_HEADER, "\"" + soapAction + "\""); assertEquals("Invalid lookup key", soapAction, mapping.getLookupKeyForMessage(context)); } diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java new file mode 100644 index 00000000..7bbf2b5f --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageFactoryTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.saaj; + +import javax.xml.soap.SOAPConstants; + +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.soap.soap11.AbstractSoap11MessageFactoryTestCase; + +public class SaajSoap11MessageFactoryTest extends AbstractSoap11MessageFactoryTestCase { + + protected WebServiceMessageFactory createMessageFactory() throws Exception { + SaajSoapMessageFactory factory = new SaajSoapMessageFactory(); + factory.setSoapProtocol(SOAPConstants.SOAP_1_1_PROTOCOL); + factory.afterPropertiesSet(); + return factory; + } +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageContextFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageContextFactoryTest.java deleted file mode 100644 index 91ddd5ee..00000000 --- a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageContextFactoryTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.springframework.ws.soap.saaj; - -import javax.xml.soap.SOAPConstants; - -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.context.AbstractSoap12MessageContextFactoryTestCase; - -public class SaajSoap12MessageContextFactoryTest extends AbstractSoap12MessageContextFactoryTestCase { - - protected MessageContextFactory createSoapMessageContextFactory() throws Exception { - SaajSoapMessageContextFactory contextFactory = new SaajSoapMessageContextFactory(); - contextFactory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); - return contextFactory; - } - -} diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageFactoryTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageFactoryTest.java new file mode 100644 index 00000000..603e1d48 --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap12MessageFactoryTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.saaj; + +import javax.xml.soap.SOAPConstants; + +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.soap.soap12.AbstractSoap12MessageFactoryTestCase; + +public class SaajSoap12MessageFactoryTest extends AbstractSoap12MessageFactoryTestCase { + + protected WebServiceMessageFactory createMessageFactory() throws Exception { + SaajSoapMessageFactory factory = new SaajSoapMessageFactory(); + factory.setSoapProtocol(SOAPConstants.SOAP_1_2_PROTOCOL); + factory.afterPropertiesSet(); + return factory; + } +} diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11MessageContextTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11MessageContextTest.java deleted file mode 100644 index 15b2e0f5..00000000 --- a/core/src/test/java/org/springframework/ws/soap/saaj/saaj12/Saaj12Soap11MessageContextTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj.saaj12; - -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; - -import org.springframework.ws.soap.context.AbstractSoap11MessageContextTestCase; -import org.springframework.ws.soap.context.SoapMessageContext; -import org.springframework.ws.transport.TransportRequest; - -public class Saaj12Soap11MessageContextTest extends AbstractSoap11MessageContextTestCase { - - protected SoapMessageContext createMessageContext(TransportRequest transportRequest) throws SOAPException { - MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); - return new Saaj12SoapMessageContext(messageFactory.createMessage(), transportRequest, messageFactory); - } -} diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11MessageContextTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11MessageContextTest.java deleted file mode 100644 index 0b55d54a..00000000 --- a/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap11MessageContextTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj.saaj13; - -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; - -import org.springframework.ws.soap.context.AbstractSoap11MessageContextTestCase; -import org.springframework.ws.soap.context.SoapMessageContext; -import org.springframework.ws.transport.TransportRequest; - -public class Saaj13Soap11MessageContextTest extends AbstractSoap11MessageContextTestCase { - - protected SoapMessageContext createMessageContext(TransportRequest transportRequest) throws SOAPException { - MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); - return new Saaj13SoapMessageContext(messageFactory.createMessage(), transportRequest, messageFactory); - } -} diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12MessageContextTest.java b/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12MessageContextTest.java deleted file mode 100644 index 8f2761ef..00000000 --- a/core/src/test/java/org/springframework/ws/soap/saaj/saaj13/Saaj13Soap12MessageContextTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2006 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ws.soap.saaj.saaj13; - -import javax.xml.soap.MessageFactory; -import javax.xml.soap.SOAPConstants; -import javax.xml.soap.SOAPException; - -import org.springframework.ws.soap.context.AbstractSoap12MessageContextTestCase; -import org.springframework.ws.soap.context.SoapMessageContext; -import org.springframework.ws.transport.TransportRequest; - -public class Saaj13Soap12MessageContextTest extends AbstractSoap12MessageContextTestCase { - - protected SoapMessageContext createMessageContext(TransportRequest transportRequest) throws SOAPException { - MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); - return new Saaj13SoapMessageContext(messageFactory.createMessage(), transportRequest, messageFactory); - } -} diff --git a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java new file mode 100644 index 00000000..75450f7b --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageFactoryTestCase.java @@ -0,0 +1,67 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.soap11; + +import java.io.InputStream; +import java.util.Properties; + +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.soap.AbstractSoapMessageFactoryTestCase; +import org.springframework.ws.soap.Attachment; +import org.springframework.ws.soap.SoapMessage; +import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.StubTransportInputStream; +import org.springframework.ws.transport.TransportInputStream; + +public abstract class AbstractSoap11MessageFactoryTestCase extends AbstractSoapMessageFactoryTestCase { + + public void testCreateEmptyMessage() throws Exception { + WebServiceMessage message = messageFactory.createWebServiceMessage(); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_11, soapMessage.getVersion()); + } + + public void testCreateSoapMessageNoAttachment() throws Exception { + InputStream is = AbstractSoap11MessageFactoryTestCase.class.getResourceAsStream("soap11.xml"); + final Properties headers = new Properties(); + headers.setProperty("Content-Type", "text/xml"); + TransportInputStream tis = new StubTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_11, soapMessage.getVersion()); + } + + public void testCreateSoapMessageAttachment() throws Exception { + InputStream is = AbstractSoap11MessageFactoryTestCase.class.getResourceAsStream("soap11-attachment.bin"); + Properties headers = new Properties(); + headers.setProperty("Content-Type", + "multipart/related; type=\"text/xml\"; boundary=\"----=_Part_0_11416420.1149699787554\""); + TransportInputStream tis = new StubTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_11, soapMessage.getVersion()); + Attachment attachment = soapMessage.getAttachment("interface21"); + assertNotNull("No attachment read", attachment); + } + + +} diff --git a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java index 69c4dca6..af47b027 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap11/AbstractSoap11MessageTestCase.java @@ -17,12 +17,16 @@ package org.springframework.ws.soap.soap11; import java.io.ByteArrayOutputStream; +import java.util.Properties; import junit.framework.Assert; +import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.ws.soap.AbstractSoapMessageTestCase; import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.StubTransportOutputStream; public abstract class AbstractSoap11MessageTestCase extends AbstractSoapMessageTestCase { @@ -40,4 +44,28 @@ public abstract class AbstractSoap11MessageTestCase extends AbstractSoapMessageT assertXMLEqual("
", new String(outputStream.toByteArray(), "UTF-8")); } + + public void testWriteToTransportOutputStream() throws Exception { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + StubTransportOutputStream tos = new StubTransportOutputStream(bos); + soapMessage.writeTo(tos); + String result = bos.toString("UTF-8"); + assertXMLEqual("
", + result); + String contentType = (String) tos.getHeaders().get("Content-Type"); + assertTrue("Invalid Content-Type set", contentType.indexOf(SoapVersion.SOAP_11.getContentType()) != -1); + } + + public void testWriteToTransportResponseAttachment() throws Exception { + InputStreamSource inputStreamSource = new ByteArrayResource("contents".getBytes("UTF-8")); + soapMessage.addAttachment(inputStreamSource, "text/plain"); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + final Properties headers = new Properties(); + StubTransportOutputStream tos = new StubTransportOutputStream(bos); + soapMessage.writeTo(tos); + String contentType = (String) tos.getHeaders().get("Content-Type"); + assertTrue("Invalid Content-Type set", contentType.indexOf(SoapVersion.SOAP_11.getContentType()) != -1); + } + + } diff --git a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java new file mode 100644 index 00000000..149269ff --- /dev/null +++ b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageFactoryTestCase.java @@ -0,0 +1,67 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.soap.soap12; + +import java.io.InputStream; +import java.util.Properties; + +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.soap.AbstractSoapMessageFactoryTestCase; +import org.springframework.ws.soap.Attachment; +import org.springframework.ws.soap.SoapMessage; +import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.StubTransportInputStream; +import org.springframework.ws.transport.TransportInputStream; + +public abstract class AbstractSoap12MessageFactoryTestCase extends AbstractSoapMessageFactoryTestCase { + + public void testCreateEmptyMessage() throws Exception { + WebServiceMessage message = messageFactory.createWebServiceMessage(); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_12, soapMessage.getVersion()); + } + + public void testCreateSoapMessageNoAttachment() throws Exception { + InputStream is = AbstractSoap12MessageFactoryTestCase.class.getResourceAsStream("soap12.xml"); + final Properties headers = new Properties(); + headers.setProperty("Content-Type", "application/soap+xml"); + TransportInputStream tis = new StubTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_12, soapMessage.getVersion()); + } + + public void testCreateSoapMessageAttachment() throws Exception { + InputStream is = AbstractSoap12MessageFactoryTestCase.class.getResourceAsStream("soap12-attachment.bin"); + Properties headers = new Properties(); + headers.setProperty("Content-Type", + "multipart/related; type=\"application/soap+xml\"; boundary=\"----=_Part_0_11416420.1149699787554\""); + TransportInputStream tis = new StubTransportInputStream(is, headers); + + WebServiceMessage message = messageFactory.createWebServiceMessage(tis); + assertTrue("Not a SoapMessage", message instanceof SoapMessage); + SoapMessage soapMessage = (SoapMessage) message; + assertEquals("Invalid soap version", SoapVersion.SOAP_12, soapMessage.getVersion()); + Attachment attachment = soapMessage.getAttachment("interface21"); + assertNotNull("No attachment read", attachment); + } + + +} diff --git a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageTestCase.java b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageTestCase.java index 410842b3..9509a53b 100644 --- a/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageTestCase.java +++ b/core/src/test/java/org/springframework/ws/soap/soap12/AbstractSoap12MessageTestCase.java @@ -19,10 +19,13 @@ package org.springframework.ws.soap.soap12; import java.io.ByteArrayOutputStream; import junit.framework.Assert; +import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.ws.soap.AbstractSoapMessageTestCase; import org.springframework.ws.soap.SoapVersion; +import org.springframework.ws.transport.StubTransportOutputStream; public abstract class AbstractSoap12MessageTestCase extends AbstractSoapMessageTestCase { @@ -42,5 +45,26 @@ public abstract class AbstractSoap12MessageTestCase extends AbstractSoapMessageT new ClassPathResource("soap12.xsd", AbstractSoap12MessageTestCase.class)}; } + public void testWriteToTransportResponse() throws Exception { + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + StubTransportOutputStream tos = new StubTransportOutputStream(bos); + soapMessage.writeTo(tos); + String result = bos.toString("UTF-8"); + + assertXMLEqual("
", result); + String contentType = (String) tos.getHeaders().get("Content-Type"); + assertTrue("Invalid Content-Type set", contentType.indexOf(SoapVersion.SOAP_12.getContentType()) != -1); + } + + public void testWriteToTransportResponseAttachment() throws Exception { + InputStreamSource inputStreamSource = new ByteArrayResource("contents".getBytes("UTF-8")); + soapMessage.addAttachment(inputStreamSource, "text/plain"); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + StubTransportOutputStream tos = new StubTransportOutputStream(bos); + soapMessage.writeTo(tos); + String contentType = (String) tos.getHeaders().get("Content-Type"); + assertTrue("Invalid Content-Type set", contentType.indexOf(SoapVersion.SOAP_12.getContentType()) != -1); + } + } diff --git a/core/src/test/java/org/springframework/ws/transport/StubTransportInputStream.java b/core/src/test/java/org/springframework/ws/transport/StubTransportInputStream.java new file mode 100644 index 00000000..4517d0ea --- /dev/null +++ b/core/src/test/java/org/springframework/ws/transport/StubTransportInputStream.java @@ -0,0 +1,51 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; + +import org.springframework.util.Assert; + +public class StubTransportInputStream extends TransportInputStream { + + private Map headers; + + private InputStream inputStream; + + public StubTransportInputStream(InputStream inputStream, Map headers) { + Assert.notNull(inputStream, "inputStream must not be null"); + Assert.notNull(headers, "headers must not be null"); + this.inputStream = inputStream; + this.headers = headers; + } + + protected InputStream getInputStream() throws IOException { + return inputStream; + } + + public Iterator getHeaderNames() throws IOException { + return headers.keySet().iterator(); + } + + public Iterator getHeaders(String name) throws IOException { + return Collections.singleton(headers.get(name)).iterator(); + } +} diff --git a/core/src/test/java/org/springframework/ws/transport/StubTransportOutputStream.java b/core/src/test/java/org/springframework/ws/transport/StubTransportOutputStream.java new file mode 100644 index 00000000..3e9e568c --- /dev/null +++ b/core/src/test/java/org/springframework/ws/transport/StubTransportOutputStream.java @@ -0,0 +1,48 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.util.Assert; + +public class StubTransportOutputStream extends TransportOutputStream { + + private Map headers = new HashMap(); + + private OutputStream outputStream; + + public StubTransportOutputStream(OutputStream outputStream) { + Assert.notNull(outputStream, "outputStream must not be null"); + this.outputStream = outputStream; + } + + protected OutputStream getOutputStream() throws IOException { + return outputStream; + } + + public Map getHeaders() { + return headers; + } + + public void addHeader(String name, String value) throws IOException { + headers.put(name, value); + } +} diff --git a/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportInputStreamTest.java b/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportInputStreamTest.java new file mode 100644 index 00000000..125ad686 --- /dev/null +++ b/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportInputStreamTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.util.Arrays; +import java.util.Iterator; + +import junit.framework.TestCase; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.util.FileCopyUtils; + +public class HttpServletTransportInputStreamTest extends TestCase { + + private HttpServletTransportInputStream tis; + + private MockHttpServletRequest request; + + private byte[] content; + + protected void setUp() throws Exception { + request = new MockHttpServletRequest(); + content = "content".getBytes("UTF-8"); + request.setContent(content); + tis = new HttpServletTransportInputStream(request); + } + + public void testReadInputStream() throws Exception { + request.setContent(content); + byte[] result = FileCopyUtils.copyToByteArray(tis); + assertTrue("Invalid contents", Arrays.equals(content, result)); + } + + public void testHeaders() throws Exception { + String headerName = "Header"; + String headerValue = "Value"; + request.addHeader(headerName, headerValue); + Iterator iterator = tis.getHeaderNames(); + assertTrue("No headers found", iterator.hasNext()); + assertEquals("Invalid header", headerName, iterator.next()); + iterator = tis.getHeaders(headerName); + assertTrue("No header values found", iterator.hasNext()); + assertEquals("Invalid header value", headerValue, iterator.next()); + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportOutputStreamTest.java b/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportOutputStreamTest.java new file mode 100644 index 00000000..b9daf8cc --- /dev/null +++ b/core/src/test/java/org/springframework/ws/transport/http/HttpServletTransportOutputStreamTest.java @@ -0,0 +1,52 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.util.Arrays; +import java.util.Collections; + +import junit.framework.TestCase; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.util.FileCopyUtils; + +public class HttpServletTransportOutputStreamTest extends TestCase { + + private HttpServletTransportOutputStream tos; + + private MockHttpServletResponse response; + + protected void setUp() throws Exception { + response = new MockHttpServletResponse(); + tos = new HttpServletTransportOutputStream(response); + } + + public void testWriteOutputStream() throws Exception { + byte[] content = "content".getBytes("UTF-8"); + FileCopyUtils.copy(content, tos); + assertTrue("Invalid contents", Arrays.equals(content, response.getContentAsByteArray())); + } + + public void testHeaders() throws Exception { + String headerName = "Header"; + String headerValue = "Value"; + tos.addHeader(headerName, headerValue); + assertTrue("No header set", response.getHeaderNames().contains(headerName)); + assertEquals("Invalid header value set", Collections.singletonList(headerValue), + response.getHeaders(headerName)); + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/transport/http/HttpTransportRequestTest.java b/core/src/test/java/org/springframework/ws/transport/http/HttpTransportRequestTest.java deleted file mode 100644 index 94c66c24..00000000 --- a/core/src/test/java/org/springframework/ws/transport/http/HttpTransportRequestTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.springframework.ws.transport.http; - -import java.util.Iterator; - -import junit.framework.TestCase; -import org.springframework.mock.web.MockHttpServletRequest; - -public class HttpTransportRequestTest extends TestCase { - - private HttpTransportRequest transportRequest; - - private MockHttpServletRequest mockRequest; - - protected void setUp() throws Exception { - mockRequest = new MockHttpServletRequest(); - transportRequest = new HttpTransportRequest(mockRequest); - } - - public void testGetHttpServletRequest() throws Exception { - assertEquals("Invalid request", mockRequest, transportRequest.getHttpServletRequest()); - } - - public void testGetHeaderNames() throws Exception { - mockRequest.addHeader("header1", "value11"); - mockRequest.addHeader("header1", "value12"); - mockRequest.addHeader("header2", "value2"); - Iterator headers = transportRequest.getHeaderNames(); - assertTrue("Invalid amount of header names", headers.hasNext()); - String header = (String) headers.next(); - assertTrue("Invalid header", "header1".equals(header) || "header2".equals(header)); - assertTrue("Invalid amount of header names", headers.hasNext()); - header = (String) headers.next(); - assertTrue("Invalid header", "header1".equals(header) || "header2".equals(header)); - assertFalse("Invalid amount of header names", headers.hasNext()); - } - - public void testGetHeaders() throws Exception { - mockRequest.addHeader("header", "value1"); - mockRequest.addHeader("header", "value2"); - Iterator values = transportRequest.getHeaders("header"); - assertTrue("Invalid amount of header names", values.hasNext()); - String value = (String) values.next(); - assertTrue("Invalid value", "value1".equals(value) || "value2".equals(value)); - assertTrue("Invalid amount of header names", values.hasNext()); - value = (String) values.next(); - assertTrue("Invalid value", "value1".equals(value) || "value2".equals(value)); - assertFalse("Invalid amount of header names", values.hasNext()); - } - - public void testGetURL() throws Exception { - mockRequest.setScheme("http"); - mockRequest.setServerName("www.example.com"); - mockRequest.setServerPort(8080); - mockRequest.setRequestURI("/services/Service"); - String url = transportRequest.getUrl(); - assertNotNull("No url returned", url); - assertEquals("Invalid url returned", "http://www.example.com:8080/services/Service", url); - } -} \ No newline at end of file diff --git a/core/src/test/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapterTest.java b/core/src/test/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapterTest.java index c71ed509..2e717374 100644 --- a/core/src/test/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapterTest.java +++ b/core/src/test/java/org/springframework/ws/transport/http/MessageEndpointHandlerAdapterTest.java @@ -24,12 +24,11 @@ import org.easymock.MockControl; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.ws.NoEndpointFoundException; -import org.springframework.ws.context.MessageContextFactory; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.context.MessageContext; import org.springframework.ws.endpoint.MessageEndpoint; -import org.springframework.ws.mock.MockTransportContext; import org.springframework.ws.soap.SoapBody; import org.springframework.ws.soap.SoapMessage; -import org.springframework.ws.soap.context.SoapMessageContext; public class MessageEndpointHandlerAdapterTest extends TestCase { @@ -45,54 +44,50 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { private MockHttpServletResponse httpResponse; - private MockControl endpointControl; - - private MessageEndpoint endpointMock; - private MockControl factoryControl; - private MessageContextFactory factoryMock; - - private MockControl contextControl; - - private SoapMessageContext contextMock; + private WebServiceMessageFactory factoryMock; private MockControl messageControl; - private SoapMessage messageMock; + private SoapMessage responseMock; private MockControl bodyControl; private SoapBody bodyMock; + private SoapMessage requestMock; + protected void setUp() throws Exception { adapter = new MessageEndpointHandlerAdapter(); httpRequest = new MockHttpServletRequest(); httpResponse = new MockHttpServletResponse(); - endpointControl = MockControl.createControl(MessageEndpoint.class); - endpointMock = (MessageEndpoint) endpointControl.getMock(); - factoryControl = MockControl.createControl(MessageContextFactory.class); - factoryMock = (MessageContextFactory) factoryControl.getMock(); - adapter.setMessageContextFactory(factoryMock); - contextControl = MockControl.createControl(SoapMessageContext.class); - contextMock = (SoapMessageContext) contextControl.getMock(); + factoryControl = MockControl.createControl(WebServiceMessageFactory.class); + factoryMock = (WebServiceMessageFactory) factoryControl.getMock(); + adapter.setMessageFactory(factoryMock); messageControl = MockControl.createControl(SoapMessage.class); - messageMock = (SoapMessage) messageControl.getMock(); + requestMock = (SoapMessage) messageControl.getMock(); + responseMock = (SoapMessage) messageControl.getMock(); bodyControl = MockControl.createControl(SoapBody.class); bodyMock = (SoapBody) bodyControl.getMock(); } public void testHandleNonPost() throws Exception { httpRequest.setMethod("GET"); - endpointControl.replay(); + replayMockControls(); + MessageEndpoint endpoint = new MessageEndpoint() { + + public void invoke(MessageContext messageContext) throws Exception { + } + }; try { - adapter.handle(httpRequest, httpResponse, endpointMock); + adapter.handle(httpRequest, httpResponse, endpoint); fail("ServletException expected"); } catch (ServletException ex) { // expected } - endpointControl.verify(); + verifyMockControls(); } public void testHandlePostNoResponse() throws Exception { @@ -100,16 +95,18 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { httpRequest.setContent(MessageEndpointHandlerAdapterTest.REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); - endpointMock.invoke(null); - endpointControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryMock.createContext(new MockTransportContext()); + factoryMock.createWebServiceMessage(new HttpServletTransportInputStream(httpRequest)); factoryControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryControl.setReturnValue(contextMock); - contextControl.expectAndReturn(contextMock.hasResponse(), false); + factoryControl.setReturnValue(responseMock); replayMockControls(); + MessageEndpoint endpoint = new MessageEndpoint() { - adapter.handle(httpRequest, httpResponse, endpointMock); + public void invoke(MessageContext messageContext) throws Exception { + } + }; + + adapter.handle(httpRequest, httpResponse, endpoint); assertEquals("Invalid status code on response", HttpServletResponse.SC_NO_CONTENT, httpResponse.getStatus()); assertEquals("Response written", 0, httpResponse.getContentAsString().length()); @@ -121,21 +118,24 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { httpRequest.setContent(MessageEndpointHandlerAdapterTest.REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); - endpointMock.invoke(null); - endpointControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryMock.createContext(new MockTransportContext()); + factoryMock.createWebServiceMessage(new HttpServletTransportInputStream(httpRequest)); factoryControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryControl.setReturnValue(contextMock); - contextControl.expectAndReturn(contextMock.hasResponse(), true); - contextControl.expectAndReturn(contextMock.getResponse(), messageMock); - messageControl.expectAndReturn(messageMock.getSoapBody(), bodyMock); + factoryControl.setReturnValue(requestMock); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), responseMock); + messageControl.expectAndReturn(responseMock.getSoapBody(), bodyMock); bodyControl.expectAndReturn(bodyMock.hasFault(), false); - contextMock.sendResponse(new HttpTransportResponse(httpResponse)); - contextControl.setMatcher(MockControl.ALWAYS_MATCHER); + responseMock.writeTo(new HttpServletTransportOutputStream(httpResponse)); + messageControl.setMatcher(MockControl.ALWAYS_MATCHER); replayMockControls(); + MessageEndpoint endpoint = new MessageEndpoint() { - adapter.handle(httpRequest, httpResponse, endpointMock); + public void invoke(MessageContext messageContext) throws Exception { + messageContext.getResponse(); + } + }; + + adapter.handle(httpRequest, httpResponse, endpoint); assertEquals("Invalid status code on response", HttpServletResponse.SC_OK, httpResponse.getStatus()); verifyMockControls(); @@ -146,24 +146,26 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { httpRequest.setContent(MessageEndpointHandlerAdapterTest.REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); - endpointMock.invoke(null); - endpointControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryMock.createContext(new MockTransportContext()); + factoryMock.createWebServiceMessage(new HttpServletTransportInputStream(httpRequest)); factoryControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryControl.setReturnValue(contextMock); - contextControl.expectAndReturn(contextMock.hasResponse(), true); - contextControl.expectAndReturn(contextMock.getResponse(), messageMock); - messageControl.expectAndReturn(messageMock.getSoapBody(), bodyMock); + factoryControl.setReturnValue(requestMock); + factoryControl.expectAndReturn(factoryMock.createWebServiceMessage(), responseMock); + messageControl.expectAndReturn(responseMock.getSoapBody(), bodyMock); bodyControl.expectAndReturn(bodyMock.hasFault(), true); - contextMock.sendResponse(null); - contextControl.setMatcher(MockControl.ALWAYS_MATCHER); + responseMock.writeTo(new HttpServletTransportOutputStream(httpResponse)); + messageControl.setMatcher(MockControl.ALWAYS_MATCHER); replayMockControls(); + MessageEndpoint endpoint = new MessageEndpoint() { - adapter.handle(httpRequest, httpResponse, endpointMock); + public void invoke(MessageContext messageContext) throws Exception { + messageContext.getResponse(); + } + }; - assertEquals("Invalid status code on response", - HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + adapter.handle(httpRequest, httpResponse, endpoint); + + assertEquals("Invalid status code on response", HttpServletResponse.SC_INTERNAL_SERVER_ERROR, httpResponse.getStatus()); verifyMockControls(); } @@ -173,16 +175,20 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { httpRequest.setContent(MessageEndpointHandlerAdapterTest.REQUEST.getBytes("UTF-8")); httpRequest.setContentType("text/xml; charset=\"utf-8\""); httpRequest.setCharacterEncoding("UTF-8"); - endpointMock.invoke(null); - endpointControl.setMatcher(MockControl.ALWAYS_MATCHER); - endpointControl.setThrowable(new NoEndpointFoundException(null)); - factoryMock.createContext(new MockTransportContext()); + factoryMock.createWebServiceMessage(new HttpServletTransportInputStream(httpRequest)); factoryControl.setMatcher(MockControl.ALWAYS_MATCHER); - factoryControl.setReturnValue(contextMock); + factoryControl.setReturnValue(requestMock); replayMockControls(); - adapter.handle(httpRequest, httpResponse, endpointMock); + MessageEndpoint endpoint = new MessageEndpoint() { + + public void invoke(MessageContext messageContext) throws Exception { + throw new NoEndpointFoundException(messageContext.getRequest()); + } + }; + + adapter.handle(httpRequest, httpResponse, endpoint); assertEquals("No 404 returned", HttpServletResponse.SC_NOT_FOUND, httpResponse.getStatus()); verifyMockControls(); @@ -190,17 +196,13 @@ public class MessageEndpointHandlerAdapterTest extends TestCase { } private void replayMockControls() { - endpointControl.replay(); factoryControl.replay(); - contextControl.replay(); messageControl.replay(); bodyControl.replay(); } private void verifyMockControls() { - endpointControl.verify(); factoryControl.verify(); - contextControl.verify(); messageControl.verify(); bodyControl.verify(); } diff --git a/core/src/test/resources/org/springframework/ws/soap/context/soap11-attachment.bin b/core/src/test/resources/org/springframework/ws/soap/soap11/soap11-attachment.bin similarity index 100% rename from core/src/test/resources/org/springframework/ws/soap/context/soap11-attachment.bin rename to core/src/test/resources/org/springframework/ws/soap/soap11/soap11-attachment.bin diff --git a/core/src/test/resources/org/springframework/ws/soap/context/soap11.xml b/core/src/test/resources/org/springframework/ws/soap/soap11/soap11.xml similarity index 100% rename from core/src/test/resources/org/springframework/ws/soap/context/soap11.xml rename to core/src/test/resources/org/springframework/ws/soap/soap11/soap11.xml diff --git a/core/src/test/resources/org/springframework/ws/soap/context/soap12-attachment.bin b/core/src/test/resources/org/springframework/ws/soap/soap12/soap12-attachment.bin similarity index 100% rename from core/src/test/resources/org/springframework/ws/soap/context/soap12-attachment.bin rename to core/src/test/resources/org/springframework/ws/soap/soap12/soap12-attachment.bin diff --git a/core/src/test/resources/org/springframework/ws/soap/context/soap12.xml b/core/src/test/resources/org/springframework/ws/soap/soap12/soap12.xml similarity index 100% rename from core/src/test/resources/org/springframework/ws/soap/context/soap12.xml rename to core/src/test/resources/org/springframework/ws/soap/soap12/soap12.xml diff --git a/samples/echo/client/saaj/build.xml b/samples/echo/client/saaj/build.xml index 2cabefd0..e4cd5cfb 100644 --- a/samples/echo/client/saaj/build.xml +++ b/samples/echo/client/saaj/build.xml @@ -21,6 +21,7 @@ + diff --git a/samples/echo/src/main/webapp/WEB-INF/spring-ws-servlet.xml b/samples/echo/src/main/webapp/WEB-INF/spring-ws-servlet.xml index 2ec8cf18..40c10d46 100755 --- a/samples/echo/src/main/webapp/WEB-INF/spring-ws-servlet.xml +++ b/samples/echo/src/main/webapp/WEB-INF/spring-ws-servlet.xml @@ -1,6 +1,7 @@ + This endpoint mapping uses the qualified name of the payload (body contents) to determine the endpoint for diff --git a/samples/echo/src/main/webapp/WEB-INF/web.xml b/samples/echo/src/main/webapp/WEB-INF/web.xml index e41e5bb3..ac936d8b 100755 --- a/samples/echo/src/main/webapp/WEB-INF/web.xml +++ b/samples/echo/src/main/webapp/WEB-INF/web.xml @@ -10,18 +10,6 @@ Returns a given string(only A-Z and a-z chars allowed). See echo.xsd file. - - - log4jConfigLocation - /WEB-INF/log4j.properties - - - - - org.springframework.web.util.Log4jConfigListener - - spring-ws @@ -45,7 +33,7 @@ - index.html + index.html \ No newline at end of file diff --git a/samples/echo/src/test/resources/log4j.properties b/samples/echo/src/test/resources/log4j.properties index c6d11b4d..ad4c9d4d 100644 --- a/samples/echo/src/test/resources/log4j.properties +++ b/samples/echo/src/test/resources/log4j.properties @@ -1,16 +1,5 @@ -log4j.rootCategory=WARN, stdout, logfile +log4j.rootCategory=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n - -log4j.appender.logfile=org.apache.log4j.RollingFileAppender -log4j.appender.logfile.File=${@PROJECT_NAME@.root}/@PROJECT_NAME@.log -log4j.appender.logfile.MaxFileSize=512KB - -# Keep three backup files -log4j.appender.logfile.MaxBackupIndex=3 -log4j.appender.logfile.layout=org.apache.log4j.PatternLayout - -#Pattern to output : date priority [category] - line_separator -log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n diff --git a/sandbox/pom.xml b/sandbox/pom.xml index 6196dd8e..005b9fb7 100644 --- a/sandbox/pom.xml +++ b/sandbox/pom.xml @@ -15,5 +15,53 @@ org.springframework.ws spring-ws-core + + + org.springframework + spring-context + + + org.springframework + spring-web + + + org.springframework + spring-webmvc + + + org.springframework + spring-mock + + + + javax.xml.soap + saaj-api + 1.3 + provided + + + javax.servlet + servlet-api + 2.4 + provided + + + javax.jms + jms + 1.1 + + + + commons-httpclient + commons-httpclient + 3.0.1 + true + + + org.mortbay.jetty + jetty + 6.0.1 + test + \ No newline at end of file diff --git a/sandbox/src/main/java/org/springframework/ws/client/MarshallingWebServiceTemplate.java b/sandbox/src/main/java/org/springframework/ws/client/MarshallingWebServiceTemplate.java deleted file mode 100644 index 4128ba86..00000000 --- a/sandbox/src/main/java/org/springframework/ws/client/MarshallingWebServiceTemplate.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.springframework.ws.client; - -import org.springframework.oxm.Marshaller; -import org.springframework.oxm.Unmarshaller; -import org.springframework.oxm.jaxb1.impl.FlightsImpl; - -/** - * @author Arjen Poutsma - */ -public class MarshallingWebServiceTemplate { - private Marshaller marshaller; - private Unmarshaller unmarshaller; - - public Marshaller getMarshaller() { - return marshaller; - } - - public void setMarshaller(Marshaller marshaller) { - this.marshaller = marshaller; - } - - public Unmarshaller getUnmarshaller() { - return unmarshaller; - } - - public void setUnmarshaller(Unmarshaller unmarshaller) { - this.unmarshaller = unmarshaller; - } - - -} diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java new file mode 100644 index 00000000..ff8c2aef --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceAccessor.java @@ -0,0 +1,68 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.endpoint.TransformerObjectSupport; +import org.springframework.ws.transport.WebServiceMessageSender; + +/** + * Base class for WebServiceTemplate and other WS-accessing helpers. + * + * @author Arjen Poutsma + */ +public abstract class WebServiceAccessor extends TransformerObjectSupport implements InitializingBean { + + private WebServiceMessageFactory messageFactory; + + private WebServiceMessageSender messageSender; + + /** + * Returns the message factory used for creating messages. + */ + public WebServiceMessageFactory getMessageFactory() { + return messageFactory; + } + + /** + * Sets the message factory used for creating messages. + */ + public void setMessageFactory(WebServiceMessageFactory messageFactory) { + this.messageFactory = messageFactory; + } + + /** + * Returns the message sender. + */ + public WebServiceMessageSender getMessageSender() { + return messageSender; + } + + /** + * Sets the message sender. + */ + public void setMessageSender(WebServiceMessageSender messageSender) { + this.messageSender = messageSender; + } + + public void afterPropertiesSet() throws Exception { + Assert.notNull(getMessageFactory(), "messageFactory is required"); + Assert.notNull(getMessageSender(), "messageSender is required"); + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageCallback.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageCallback.java new file mode 100644 index 00000000..70e0147e --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageCallback.java @@ -0,0 +1,27 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import org.springframework.ws.WebServiceMessage; + +/** + * @author Arjen Poutsma + */ +public interface WebServiceMessageCallback { + + void doInWebServiceMessage(WebServiceMessage message) throws Exception; +} diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageExtractor.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageExtractor.java new file mode 100644 index 00000000..5fb3029b --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceMessageExtractor.java @@ -0,0 +1,33 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import org.springframework.ws.WebServiceMessage; + +/** + * @author Arjen Poutsma + */ +public interface WebServiceMessageExtractor { + + /** + * Process the content in the given WebServiceMessage, creating a corresponding result object. + * + * @param message the message to extract data from + * @return an arbitrary result object, or null if none + */ + Object extractData(WebServiceMessage message) throws Exception; +} diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java new file mode 100644 index 00000000..a8c2a258 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceOperations.java @@ -0,0 +1,45 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import javax.xml.transform.Source; + +/** + * @author Arjen Poutsma + */ +public interface WebServiceOperations { + + /** + * Sends a web service message that contains the given payload. Returns the payload of the response message, if + * any. + * + * @param payload the payload of the message. + * @return the payload of the response message, or null if no response is given + */ + Source send(Source payload); + + /** + * Sends a web service message that contains the given payload, marshalled by the configured + * Marshaller. Returns the unmarshalled payload of the response message, if any. + * + * @param payload the object to marshal into a message payload + * @return the unmarshalled payload of the response message, or null if no response is given + */ + Object marshalAndSend(Object payload); + + Object send(WebServiceMessageCallback callback, WebServiceMessageExtractor extractor); +} diff --git a/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java b/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java new file mode 100644 index 00000000..779c80f9 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/client/WebServiceTemplate.java @@ -0,0 +1,128 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import java.io.IOException; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; + +import org.springframework.oxm.Marshaller; +import org.springframework.oxm.Unmarshaller; +import org.springframework.util.Assert; +import org.springframework.ws.WebServiceException; +import org.springframework.ws.WebServiceMessage; + +/** + * @author Arjen Poutsma + */ +public class WebServiceTemplate extends WebServiceAccessor implements WebServiceOperations { + + private Marshaller marshaller; + + private Unmarshaller unmarshaller; + + /** + * Returns the marshaller for this template. + */ + public Marshaller getMarshaller() { + return marshaller; + } + + /** + * Sets the marshaller for this template. + */ + public void setMarshaller(Marshaller marshaller) { + this.marshaller = marshaller; + } + + /** + * Returns the unmarshaller for this template. + */ + public Unmarshaller getUnmarshaller() { + return unmarshaller; + } + + /** + * Sets the unmarshaller for this template. + */ + public void setUnmarshaller(Unmarshaller unmarshaller) { + this.unmarshaller = unmarshaller; + } + + public Object marshalAndSend(final Object payload) { + checkMarshallerAndUnmarshaller(); + return send(new WebServiceMessageCallback() { + public void doInWebServiceMessage(WebServiceMessage message) throws IOException { + getMarshaller().marshal(payload, message.getPayloadResult()); + } + }, new WebServiceMessageExtractor() { + public Object extractData(WebServiceMessage message) throws IOException { + return getUnmarshaller().unmarshal(message.getPayloadSource()); + } + }); + } + + public Source send(final Source payload) { + return (Source) send(new WebServiceMessageCallback() { + public void doInWebServiceMessage(WebServiceMessage message) throws Exception { + Transformer transformer = createTransformer(); + transformer.transform(payload, message.getPayloadResult()); + } + }, new WebServiceMessageExtractor() { + public Object extractData(WebServiceMessage message) throws WebServiceException { + return message.getPayloadSource(); + } + }); + } + + private void checkMarshallerAndUnmarshaller() throws IllegalStateException { + if (getMarshaller() == null) { + throw new IllegalStateException("No marshaller registered. Check configuration of WebServiceTemplate."); + } + if (getUnmarshaller() == null) { + throw new IllegalStateException("No unmarshaller registered. Check configuration of WebServiceTemplate."); + } + } + + public WebServiceMessage send(WebServiceMessageCallback callback) { + return (WebServiceMessage) send(callback, new WebServiceMessageExtractor() { + public Object extractData(WebServiceMessage message) throws Exception { + return message; + } + }); + } + + public Object send(WebServiceMessageCallback callback, WebServiceMessageExtractor extractor) { + Assert.notNull(callback, "callback must not be null"); + Assert.notNull(extractor, "extractor must not be null"); + WebServiceMessage request = getMessageFactory().createWebServiceMessage(); + try { + callback.doInWebServiceMessage(request); + WebServiceMessage response = getMessageSender().send(request); + if (response == null) { + return null; + } + else { + return extractor.extractData(response); + } + } + catch (Exception e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + return null; + } + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java new file mode 100644 index 00000000..fdc20081 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/WebServiceMessageSender.java @@ -0,0 +1,18 @@ +package org.springframework.ws.transport; + +import org.springframework.ws.WebServiceMessage; + +/** + * @author Arjen Poutsma + */ +public interface WebServiceMessageSender { + + /** + * Sends the given web service message and returns the result, if any. + * + * @param message the message to be sent + * @return the result, or null if none + */ + WebServiceMessage send(WebServiceMessage message); + +} diff --git a/core/src/main/java/org/springframework/ws/transport/TransportResponse.java b/sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java similarity index 63% rename from core/src/main/java/org/springframework/ws/transport/TransportResponse.java rename to sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java index 740ddce8..c1324b5b 100644 --- a/core/src/main/java/org/springframework/ws/transport/TransportResponse.java +++ b/sandbox/src/main/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSender.java @@ -14,21 +14,13 @@ * limitations under the License. */ -package org.springframework.ws.transport; +package org.springframework.ws.transport.http; -import java.io.IOException; -import java.io.OutputStream; +import org.springframework.ws.transport.WebServiceMessageSender; /** - * Defines the contract for Web service request that come in via a transport. Exposes headers and the inputstream to - * read from. - * * @author Arjen Poutsma */ -public interface TransportResponse { - - void addHeader(String name, String value); - - OutputStream getOutputStream() throws IOException; +public abstract class AbstractHttpWebServiceMessageSender implements WebServiceMessageSender { } diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportInputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportInputStream.java new file mode 100644 index 00000000..78295e70 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportInputStream.java @@ -0,0 +1,73 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; +import org.springframework.ws.transport.TransportInputStream; + +/** + * @author Arjen Poutsma + */ +public class HttpUrlConnectionTransportInputStream extends TransportInputStream { + + private final HttpURLConnection connection; + + public HttpUrlConnectionTransportInputStream(HttpURLConnection connection) throws IOException { + Assert.notNull(connection, "connection must not be null"); + this.connection = connection; + } + + public Iterator getHeaderNames() throws IOException { + List headerNames = new ArrayList(); + // Header field 0 is the status line, so we start at 1 + int i = 1; + while (true) { + String headerName = connection.getHeaderField(i); + if (!StringUtils.hasLength(headerName)) { + break; + } + headerNames.add(headerName); + i++; + } + return headerNames.iterator(); + } + + public Iterator getHeaders(String name) throws IOException { + String headerField = connection.getHeaderField(name); + if (headerField == null) { + return Collections.EMPTY_LIST.iterator(); + } + else { + Set tokens = StringUtils.commaDelimitedListToSet(headerField); + return tokens.iterator(); + } + } + + protected InputStream getInputStream() throws IOException { + return connection.getInputStream(); + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportOutputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportOutputStream.java new file mode 100644 index 00000000..aec2dfe0 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/http/HttpUrlConnectionTransportOutputStream.java @@ -0,0 +1,45 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.HttpURLConnection; + +import org.springframework.util.Assert; +import org.springframework.ws.transport.TransportOutputStream; + +/** + * @author Arjen Poutsma + */ +public class HttpUrlConnectionTransportOutputStream extends TransportOutputStream { + + private final HttpURLConnection connection; + + public HttpUrlConnectionTransportOutputStream(HttpURLConnection connection) throws IOException { + Assert.notNull(connection, "connection must not be null"); + this.connection = connection; + } + + public void addHeader(String name, String value) throws IOException { + connection.setRequestProperty(name, value); + } + + protected OutputStream getOutputStream() throws IOException { + return connection.getOutputStream(); + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/http/SimpleHttpWebServiceMessageSender.java b/sandbox/src/main/java/org/springframework/ws/transport/http/SimpleHttpWebServiceMessageSender.java new file mode 100644 index 00000000..76927219 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/http/SimpleHttpWebServiceMessageSender.java @@ -0,0 +1,31 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.transport.WebServiceMessageSender; + +/** + * @author Arjen Poutsma + */ +public class SimpleHttpWebServiceMessageSender implements WebServiceMessageSender { + + public final WebServiceMessage send(WebServiceMessage message) { + //TODO implement + throw new UnsupportedOperationException("Not implemented"); + } +} diff --git a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageContextFactoryTest.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportException.java similarity index 55% rename from core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageContextFactoryTest.java rename to sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportException.java index ad954d37..2590d624 100644 --- a/core/src/test/java/org/springframework/ws/soap/saaj/SaajSoap11MessageContextFactoryTest.java +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportException.java @@ -1,5 +1,5 @@ /* - * Copyright 2005 the original author or authors. + * Copyright 2006 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,15 +14,20 @@ * limitations under the License. */ -package org.springframework.ws.soap.saaj; +package org.springframework.ws.transport.jms; -import org.springframework.ws.context.MessageContextFactory; -import org.springframework.ws.soap.context.AbstractSoap11MessageContextFactoryTestCase; +import org.springframework.ws.transport.TransportException; -public class SaajSoap11MessageContextFactoryTest extends AbstractSoap11MessageContextFactoryTestCase { +/** + * @author Arjen Poutsma + */ +public class JmsTransportException extends TransportException { - protected MessageContextFactory createSoapMessageContextFactory() { - return new SaajSoapMessageContextFactory(); + public JmsTransportException(String string) { + super(string); } -} \ No newline at end of file + public JmsTransportException(String string, Throwable throwable) { + super(string, throwable); + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java new file mode 100644 index 00000000..a78ce260 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportInputStream.java @@ -0,0 +1,70 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.jms; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Iterator; +import javax.jms.JMSException; +import javax.jms.TextMessage; + +import org.springframework.util.Assert; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.support.EnumerationIterator; + +/** + * @author Arjen Poutsma + */ +public class JmsTransportInputStream extends TransportInputStream { + + private final TextMessage textMessage; + + public JmsTransportInputStream(TextMessage textMessage) throws IOException { + Assert.notNull(textMessage, "textMessage must not be null"); + this.textMessage = textMessage; + } + + protected InputStream getInputStream() throws IOException { + try { + return new ByteArrayInputStream(textMessage.getText().getBytes("UTF-8")); + } + catch (JMSException ex) { + throw new IOException("Could not get text of message: " + ex.getMessage()); + } + } + + public Iterator getHeaderNames() throws IOException { + try { + return new EnumerationIterator(textMessage.getPropertyNames()); + } + catch (JMSException ex) { + throw new IOException("Could not get property names: " + ex.getMessage()); + } + } + + public Iterator getHeaders(String name) throws IOException { + try { + String value = textMessage.getStringProperty(name); + return Collections.singletonList(value).iterator(); + } + catch (JMSException ex) { + throw new IOException("Could not get property value: " + ex.getMessage()); + } + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java new file mode 100644 index 00000000..345f5137 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportMessageListener.java @@ -0,0 +1,108 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.jms; + +import java.io.IOException; +import javax.jms.Message; +import javax.jms.MessageListener; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.util.Assert; +import org.springframework.ws.NoEndpointFoundException; +import org.springframework.ws.WebServiceMessage; +import org.springframework.ws.WebServiceMessageFactory; +import org.springframework.ws.context.DefaultMessageContext; +import org.springframework.ws.context.MessageContext; +import org.springframework.ws.endpoint.MessageEndpoint; +import org.springframework.ws.transport.SimpleTransportContext; +import org.springframework.ws.transport.TransportContext; +import org.springframework.ws.transport.TransportContextHolder; +import org.springframework.ws.transport.TransportInputStream; +import org.springframework.ws.transport.TransportOutputStream; + +/** + * @author Arjen Poutsma + */ +public class JmsTransportMessageListener implements MessageListener, InitializingBean { + + private static final Log logger = LogFactory.getLog(JmsTransportMessageListener.class); + + private WebServiceMessageFactory messageFactory; + + private MessageEndpoint endpoint; + + public void setMessageFactory(WebServiceMessageFactory messageFactory) { + this.messageFactory = messageFactory; + } + + public void afterPropertiesSet() throws Exception { + Assert.notNull(messageFactory, "messageFactory is required"); + logger.info("Using message factory [" + messageFactory + "]"); + } + + public void onMessage(Message message) { + if (message instanceof TextMessage) { + TextMessage textMessage = (TextMessage) message; + try { + handleTextMessage(textMessage); + } + catch (IOException ex) { + throw new JmsTransportException("Could not create message: " + ex.getMessage(), ex); + } + catch (Exception ex) { + throw new JmsTransportException("Could not handle message: " + ex.getMessage(), ex); + } + } + else { + throw new JmsTransportException("JmsTransportMessageListener can only handle TextMessages"); + } + } + + private void handleTextMessage(TextMessage textMessage) throws Exception { + TransportInputStream tis = new JmsTransportInputStream(textMessage); + TransportOutputStream tos = new JmsTransportOutputStream(getSession()); + + TransportContext previousTransportContext = TransportContextHolder.getTransportContext(); + TransportContextHolder.setTransportContext(new SimpleTransportContext(tis, tos)); + + try { + WebServiceMessage messageRequest = messageFactory.createWebServiceMessage(tis); + MessageContext messageContext = new DefaultMessageContext(messageRequest, messageFactory); + endpoint.invoke(messageContext); + if (messageContext.hasResponse()) { + WebServiceMessage messageResponse = messageContext.getResponse(); + messageResponse.writeTo(tos); + } + } + catch (NoEndpointFoundException ex) { + // do nothing + } + finally { + TransportContextHolder.setTransportContext(previousTransportContext); + } + + } + + private Session getSession() { + //TODO implement + throw new UnsupportedOperationException("Not implemented"); + } +} diff --git a/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java new file mode 100644 index 00000000..b19464f8 --- /dev/null +++ b/sandbox/src/main/java/org/springframework/ws/transport/jms/JmsTransportOutputStream.java @@ -0,0 +1,85 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.jms; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import javax.jms.JMSException; +import javax.jms.Session; +import javax.jms.TextMessage; + +import org.springframework.util.Assert; +import org.springframework.ws.transport.TransportOutputStream; + +/** + * @author Arjen Poutsma + */ +public class JmsTransportOutputStream extends TransportOutputStream { + + private TextMessage textMessage; + + private Session session; + + public JmsTransportOutputStream(Session session) { + Assert.notNull(session, "session must not be null"); + this.session = session; + } + + private TextMessage getTextMessage() throws IOException { + if (textMessage == null) { + try { + textMessage = session.createTextMessage(); + } + catch (JMSException ex) { + throw new IOException("Could not create text message: " + ex.getMessage()); + } + } + return textMessage; + } + + protected OutputStream getOutputStream() throws IOException { + return new TextMessageOutputStream(getTextMessage()); + } + + public void addHeader(String name, String value) throws IOException { + try { + getTextMessage().setStringProperty(name, value); + } + catch (JMSException ex) { + throw new IOException("Could not set property " + ex.getMessage()); + } + } + + private static class TextMessageOutputStream extends ByteArrayOutputStream { + + private final TextMessage textMessage; + + public TextMessageOutputStream(TextMessage textMessage) { + this.textMessage = textMessage; + } + + public void close() throws IOException { + try { + textMessage.setText(new String(toString("UTF-8"))); + } + catch (JMSException ex) { + throw new IOException("Could not set message text: " + ex.getMessage()); + } + } + } +} diff --git a/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java b/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java new file mode 100644 index 00000000..67edd555 --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ws/client/WebServiceTemplateTest.java @@ -0,0 +1,67 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.client; + +import junit.framework.TestCase; +import org.easymock.MockControl; +import org.springframework.oxm.Marshaller; +import org.springframework.oxm.Unmarshaller; + +public class WebServiceTemplateTest extends TestCase { + + private WebServiceTemplate template; + + private MockControl marshallerControl; + + private Marshaller marshallerMock; + + private MockControl unmarshallerControl; + + private Unmarshaller unmarshallerMock; + + protected void setUp() throws Exception { + template = new WebServiceTemplate(); + marshallerControl = MockControl.createControl(Marshaller.class); + marshallerMock = (Marshaller) marshallerControl.getMock(); + template.setMarshaller(marshallerMock); + unmarshallerControl = MockControl.createControl(Unmarshaller.class); + unmarshallerMock = (Unmarshaller) unmarshallerControl.getMock(); + template.setUnmarshaller(unmarshallerMock); + } + + public void testMarshalAndSendNoMarshallerSet() throws Exception { + template.setMarshaller(null); + try { + template.marshalAndSend(new Object()); + fail("IllegalStateException expected"); + } + catch (IllegalStateException ex) { + // expected behavior + } + } + + public void testMarshalAndSendNoUnmarshallerSet() throws Exception { + template.setUnmarshaller(null); + try { + template.marshalAndSend(new Object()); + fail("IllegalStateException expected"); + } + catch (IllegalStateException ex) { + // expected behavior + } + } +} \ No newline at end of file diff --git a/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java b/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java new file mode 100644 index 00000000..dbcbc71c --- /dev/null +++ b/sandbox/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderTestCase.java @@ -0,0 +1,58 @@ +/* + * Copyright 2006 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ws.transport.http; + +import java.io.IOException; +import javax.servlet.GenericServlet; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import junit.framework.TestCase; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.servlet.Context; +import org.mortbay.jetty.servlet.ServletHolder; +import org.springframework.util.FileCopyUtils; + +public abstract class AbstractHttpWebServiceMessageSenderTestCase extends TestCase { + + protected Server jettyServer; + + protected static final String HEADER_NAME = "SOAPAction"; + + protected static final String HEADER_VALUE = "http://springframework.org/spring-ws"; + + protected void setUp() throws Exception { + jettyServer = new Server(8888); + Context root = new Context(jettyServer, "/"); + root.addServlet(new ServletHolder(new EchoServlet()), "/*"); + jettyServer.start(); + } + + private static class EchoServlet extends GenericServlet { + + public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + HttpServletRequest httpServletRequest = (HttpServletRequest) req; + HttpServletResponse httpServletResponse = (HttpServletResponse) res; + assertEquals("Invalid header", HEADER_VALUE, httpServletRequest.getHeader(HEADER_NAME)); + httpServletResponse.addHeader(HEADER_NAME, HEADER_VALUE); + FileCopyUtils.copy(req.getInputStream(), res.getOutputStream()); + } + } +} diff --git a/security/src/test/java/org/springframework/ws/soap/security/xwss/XwsSecurityInterceptorTest.java b/security/src/test/java/org/springframework/ws/soap/security/xwss/XwsSecurityInterceptorTest.java index 92b73b63..12b71933 100644 --- a/security/src/test/java/org/springframework/ws/soap/security/xwss/XwsSecurityInterceptorTest.java +++ b/security/src/test/java/org/springframework/ws/soap/security/xwss/XwsSecurityInterceptorTest.java @@ -16,18 +16,12 @@ package org.springframework.ws.soap.security.xwss; -import java.io.IOException; -import java.io.InputStream; -import java.util.Collections; -import java.util.Iterator; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPMessage; import junit.framework.TestCase; import org.springframework.ws.soap.saaj.SaajSoapMessageContext; import org.springframework.ws.soap.saaj.saaj13.Saaj13SoapMessageContext; -import org.springframework.ws.transport.TransportException; -import org.springframework.ws.transport.TransportRequest; public class XwsSecurityInterceptorTest extends TestCase { @@ -52,8 +46,7 @@ public class XwsSecurityInterceptorTest extends TestCase { } }; - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new DummyTransportRequest(), messageFactory); + SaajSoapMessageContext context = new Saaj13SoapMessageContext(request, messageFactory); interceptor.handleRequest(context, null); assertEquals("Invalid request", validatedRequest, context.getSaajRequest()); } @@ -74,29 +67,10 @@ public class XwsSecurityInterceptorTest extends TestCase { }; SOAPMessage request = messageFactory.createMessage(); - SaajSoapMessageContext context = - new Saaj13SoapMessageContext(request, new DummyTransportRequest(), messageFactory); + SaajSoapMessageContext context = new Saaj13SoapMessageContext(request, messageFactory); context.setSaajResponse(response); interceptor.handleResponse(context, null); assertEquals("Invalid response", securedResponse, context.getSaajResponse()); } - private static class DummyTransportRequest implements TransportRequest { - - public Iterator getHeaderNames() { - return Collections.EMPTY_LIST.iterator(); - } - - public Iterator getHeaders(String name) { - return Collections.EMPTY_LIST.iterator(); - } - - public String getUrl() throws TransportException { - return null; - } - - public InputStream getInputStream() throws IOException { - return null; - } - } } \ No newline at end of file