1   /*
2    * Copyright 2005 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.server.endpoint;
18  
19  import javax.xml.soap.MessageFactory;
20  import javax.xml.stream.XMLOutputFactory;
21  import javax.xml.stream.XMLStreamConstants;
22  import javax.xml.stream.XMLStreamReader;
23  import javax.xml.stream.XMLStreamWriter;
24  import javax.xml.transform.Transformer;
25  import javax.xml.transform.TransformerFactory;
26  
27  import org.apache.axiom.om.OMAbstractFactory;
28  import org.apache.axiom.soap.SOAPFactory;
29  
30  import org.springframework.ws.context.DefaultMessageContext;
31  import org.springframework.ws.context.MessageContext;
32  import org.springframework.ws.soap.axiom.AxiomSoapMessage;
33  import org.springframework.ws.soap.axiom.AxiomSoapMessageFactory;
34  import org.springframework.ws.soap.saaj.SaajSoapMessage;
35  import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
36  import org.springframework.xml.transform.StringResult;
37  import org.springframework.xml.transform.StringSource;
38  
39  /**
40   * Test case for AbstractStaxStreamPayloadEndpoint.
41   *
42   * @see AbstractStaxStreamPayloadEndpoint
43   */
44  public class StaxStreamPayloadEndpointTest extends AbstractMessageEndpointTestCase {
45  
46      protected MessageEndpoint createNoResponseEndpoint() {
47          return new AbstractStaxStreamPayloadEndpoint() {
48              protected void invokeInternal(XMLStreamReader streamReader, XMLStreamWriter streamWriter) throws Exception {
49                  assertNotNull("No StreamReader passed", streamReader);
50              }
51          };
52      }
53  
54      protected MessageEndpoint createNoRequestPayloadEndpoint() {
55          return new AbstractStaxStreamPayloadEndpoint() {
56              protected void invokeInternal(XMLStreamReader streamReader, XMLStreamWriter streamWriter) throws Exception {
57                  assertNull("StreamReader passed", streamReader);
58              }
59          };
60      }
61  
62      protected MessageEndpoint createResponseEndpoint() {
63          return new AbstractStaxStreamPayloadEndpoint() {
64              protected void invokeInternal(XMLStreamReader streamReader, XMLStreamWriter streamWriter) throws Exception {
65                  assertNotNull("No streamReader passed", streamReader);
66                  assertNotNull("No streamWriter passed", streamReader);
67                  assertEquals("Not a start element", XMLStreamConstants.START_ELEMENT, streamReader.next());
68                  assertEquals("Invalid start event local name", REQUEST_ELEMENT, streamReader.getLocalName());
69                  assertEquals("Invalid start event namespace", NAMESPACE_URI, streamReader.getNamespaceURI());
70                  assertTrue("streamReader has no next element", streamReader.hasNext());
71                  assertEquals("Not a end element", XMLStreamConstants.END_ELEMENT, streamReader.next());
72                  assertEquals("Invalid end event local name", REQUEST_ELEMENT, streamReader.getLocalName());
73                  assertEquals("Invalid end event namespace", NAMESPACE_URI, streamReader.getNamespaceURI());
74                  streamWriter.setDefaultNamespace(NAMESPACE_URI);
75                  streamWriter.writeStartElement(NAMESPACE_URI, RESPONSE_ELEMENT);
76                  streamWriter.writeDefaultNamespace(NAMESPACE_URI);
77                  streamWriter.writeEndElement();
78                  streamWriter.flush();
79                  streamWriter.close();
80              }
81  
82              protected XMLOutputFactory createXmlOutputFactory() {
83                  XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
84                  outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", Boolean.TRUE);
85                  return outputFactory;
86              }
87          };
88      }
89  
90      public void testSaajResponse() throws Exception {
91          Transformer transformer = TransformerFactory.newInstance().newTransformer();
92          MessageFactory messageFactory = MessageFactory.newInstance();
93          SaajSoapMessage request = new SaajSoapMessage(messageFactory.createMessage());
94          transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
95          SaajSoapMessageFactory soapMessageFactory = new SaajSoapMessageFactory();
96          soapMessageFactory.afterPropertiesSet();
97          MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
98  
99          MessageEndpoint endpoint = createResponseEndpoint();
100         endpoint.invoke(context);
101         assertTrue("context has not response", context.hasResponse());
102         StringResult stringResult = new StringResult();
103         transformer.transform(context.getResponse().getPayloadSource(), stringResult);
104         assertXMLEqual(RESPONSE, stringResult.toString());
105     }
106 
107     public void testAxiomResponse() throws Exception {
108         Transformer transformer = TransformerFactory.newInstance().newTransformer();
109         SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
110         AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
111         transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
112         AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
113         soapMessageFactory.afterPropertiesSet();
114         MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
115 
116         MessageEndpoint endpoint = createResponseEndpoint();
117         endpoint.invoke(context);
118         assertTrue("context has not response", context.hasResponse());
119         StringResult stringResult = new StringResult();
120         transformer.transform(context.getResponse().getPayloadSource(), stringResult);
121         assertXMLEqual(RESPONSE, stringResult.toString());
122     }
123 
124     public void testAxiomNoResponse() throws Exception {
125         Transformer transformer = TransformerFactory.newInstance().newTransformer();
126         SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
127         AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
128         transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
129         AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
130         soapMessageFactory.afterPropertiesSet();
131         MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
132 
133         MessageEndpoint endpoint = createNoResponseEndpoint();
134         endpoint.invoke(context);
135         assertFalse("context has response", context.hasResponse());
136     }
137 
138     public void testAxiomResponseNoPayloadCaching() throws Exception {
139         Transformer transformer = TransformerFactory.newInstance().newTransformer();
140         SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
141         AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
142         transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
143         AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
144         soapMessageFactory.setPayloadCaching(false);
145         soapMessageFactory.afterPropertiesSet();
146         MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
147 
148         MessageEndpoint endpoint = createResponseEndpoint();
149         endpoint.invoke(context);
150         assertTrue("context has not response", context.hasResponse());
151 
152         StringResult stringResult = new StringResult();
153         transformer.transform(context.getResponse().getPayloadSource(), stringResult);
154         assertXMLEqual(RESPONSE, stringResult.toString());
155     }
156 
157     public void testAxiomNoResponseNoPayloadCaching() throws Exception {
158         Transformer transformer = TransformerFactory.newInstance().newTransformer();
159         SOAPFactory axiomFactory = OMAbstractFactory.getSOAP11Factory();
160         AxiomSoapMessage request = new AxiomSoapMessage(axiomFactory);
161         transformer.transform(new StringSource(REQUEST), request.getPayloadResult());
162         AxiomSoapMessageFactory soapMessageFactory = new AxiomSoapMessageFactory();
163         soapMessageFactory.setPayloadCaching(false);
164         soapMessageFactory.afterPropertiesSet();
165         MessageContext context = new DefaultMessageContext(request, soapMessageFactory);
166 
167         MessageEndpoint endpoint = createNoResponseEndpoint();
168         endpoint.invoke(context);
169         assertFalse("context has response", context.hasResponse());
170     }
171 
172 
173 }