1   /*
2    * Copyright 2007 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.soap.server.endpoint;
18  
19  import java.util.Locale;
20  import javax.xml.namespace.QName;
21  import javax.xml.soap.MessageFactory;
22  import javax.xml.soap.SOAPConstants;
23  import javax.xml.soap.SOAPMessage;
24  
25  import junit.framework.TestCase;
26  import org.springframework.ws.context.DefaultMessageContext;
27  import org.springframework.ws.context.MessageContext;
28  import org.springframework.ws.soap.SoapMessage;
29  import org.springframework.ws.soap.SoapMessageFactory;
30  import org.springframework.ws.soap.SoapVersion;
31  import org.springframework.ws.soap.saaj.SaajSoapMessage;
32  import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
33  import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
34  import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;
35  import org.springframework.ws.soap.soap11.Soap11Fault;
36  import org.springframework.ws.soap.soap12.Soap12Fault;
37  
38  public class SoapFaultAnnotationExceptionResolverTest extends TestCase {
39  
40      private SoapFaultAnnotationExceptionResolver resolver;
41  
42      protected void setUp() throws Exception {
43          resolver = new SoapFaultAnnotationExceptionResolver();
44      }
45  
46      public void testResolveExceptionClientSoap11() throws Exception {
47          MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
48          SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
49          MessageContext context = new DefaultMessageContext(factory);
50  
51          boolean result = resolver.resolveException(context, null, new MyClientException());
52          assertTrue("resolveException returns false", result);
53          assertTrue("Context has no response", context.hasResponse());
54          SoapMessage response = (SoapMessage) context.getResponse();
55          assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
56          Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
57          assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
58                  fault.getFaultCode());
59          assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
60          assertNull("Detail on fault", fault.getFaultDetail());
61      }
62  
63      public void testResolveExceptionSenderSoap12() throws Exception {
64          MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
65          SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
66          MessageContext context = new DefaultMessageContext(factory);
67  
68          boolean result = resolver.resolveException(context, null, new MySenderException());
69          assertTrue("resolveException returns false", result);
70          assertTrue("Context has no response", context.hasResponse());
71          SoapMessage response = (SoapMessage) context.getResponse();
72          assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
73          Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
74          assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(),
75                  fault.getFaultCode());
76          assertEquals("Invalid fault string on fault", "Sender error", fault.getFaultReasonText(Locale.ENGLISH));
77          assertNull("Detail on fault", fault.getFaultDetail());
78      }
79  
80      public void testResolveExceptionServerSoap11() throws Exception {
81          MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
82          SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
83          MessageContext context = new DefaultMessageContext(factory);
84  
85          boolean result = resolver.resolveException(context, null, new MyServerException());
86          assertTrue("resolveException returns false", result);
87          assertTrue("Context has no response", context.hasResponse());
88          SoapMessage response = (SoapMessage) context.getResponse();
89          assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
90          Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
91          assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
92                  fault.getFaultCode());
93          assertEquals("Invalid fault string on fault", "Server error", fault.getFaultStringOrReason());
94          assertNull("Detail on fault", fault.getFaultDetail());
95      }
96  
97      public void testResolveExceptionReceiverSoap12() throws Exception {
98          MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
99          SOAPMessage message = saajFactory.createMessage();
100         SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
101         MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
102 
103         boolean result = resolver.resolveException(context, null, new MyReceiverException());
104         assertTrue("resolveException returns false", result);
105         assertTrue("Context has no response", context.hasResponse());
106         SoapMessage response = (SoapMessage) context.getResponse();
107         assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
108         Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
109         assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getServerOrReceiverFaultName(),
110                 fault.getFaultCode());
111         assertEquals("Invalid fault string on fault", "Receiver error", fault.getFaultReasonText(Locale.ENGLISH));
112         assertNull("Detail on fault", fault.getFaultDetail());
113     }
114 
115     public void testResolveExceptionDefault() throws Exception {
116         SoapFaultDefinition defaultFault = new SoapFaultDefinition();
117         defaultFault.setFaultCode(SoapFaultDefinition.CLIENT);
118         defaultFault.setFaultStringOrReason("faultstring");
119         resolver.setDefaultFault(defaultFault);
120         MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
121         SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
122         MessageContext context = new DefaultMessageContext(factory);
123 
124         boolean result = resolver.resolveException(context, null, new NonAnnotatedException());
125         assertTrue("resolveException returns false", result);
126         assertTrue("Context has no response", context.hasResponse());
127         SoapMessage response = (SoapMessage) context.getResponse();
128         assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
129         Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
130         assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
131                 fault.getFaultCode());
132         assertEquals("Invalid fault string on fault", "faultstring", fault.getFaultStringOrReason());
133         assertNull("Detail on fault", fault.getFaultDetail());
134     }
135 
136     public void testResolveExceptionCustom() throws Exception {
137         MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
138         SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
139         MessageContext context = new DefaultMessageContext(factory);
140 
141         boolean result = resolver.resolveException(context, null, new MyCustomException());
142         assertTrue("resolveException returns false", result);
143         assertTrue("Context has no response", context.hasResponse());
144         SoapMessage response = (SoapMessage) context.getResponse();
145         assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
146         Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
147         assertEquals("Invalid fault code on fault", new QName("http://springframework.org/spring-ws", "Fault"),
148                 fault.getFaultCode());
149         assertEquals("Invalid fault string on fault", "MyCustomException thrown", fault.getFaultStringOrReason());
150         assertEquals("Invalid fault locale on fault", new Locale("nl"), fault.getFaultStringLocale());
151     }
152 
153     public void testResolveExceptionInheritance() throws Exception {
154         MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
155         SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
156         MessageContext context = new DefaultMessageContext(factory);
157 
158         boolean result = resolver.resolveException(context, null, new MySubClientException());
159         assertTrue("resolveException returns false", result);
160         assertTrue("Context has no response", context.hasResponse());
161         SoapMessage response = (SoapMessage) context.getResponse();
162         assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
163         Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
164         assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
165                 fault.getFaultCode());
166         assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
167         assertNull("Detail on fault", fault.getFaultDetail());
168     }
169 
170     public void testResolveExceptionExceptionMessage() throws Exception {
171         MessageFactory saajFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
172         SoapMessageFactory factory = new SaajSoapMessageFactory(saajFactory);
173         MessageContext context = new DefaultMessageContext(factory);
174 
175         boolean result = resolver.resolveException(context, null, new NoStringOrReasonException("Exception message"));
176         assertTrue("resolveException returns false", result);
177         assertTrue("Context has no response", context.hasResponse());
178         SoapMessage response = (SoapMessage) context.getResponse();
179         assertTrue("Resonse has no fault", response.getSoapBody().hasFault());
180         Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
181         assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
182                 fault.getFaultCode());
183         assertEquals("Invalid fault string on fault", "Exception message", fault.getFaultStringOrReason());
184         assertNull("Detail on fault", fault.getFaultDetail());
185     }
186 
187     @SoapFault(faultCode = FaultCode.CLIENT, faultStringOrReason = "Client error")
188     public class MyClientException extends Exception {
189 
190     }
191 
192     public class MySubClientException extends MyClientException {
193 
194     }
195 
196     @SoapFault(faultCode = FaultCode.CLIENT)
197     public class NoStringOrReasonException extends Exception {
198 
199         public NoStringOrReasonException(String message) {
200             super(message);
201         }
202     }
203 
204     @SoapFault(faultCode = FaultCode.SENDER, faultStringOrReason = "Sender error")
205     public class MySenderException extends Exception {
206 
207     }
208 
209     @SoapFault(faultCode = FaultCode.SERVER, faultStringOrReason = "Server error")
210     public class MyServerException extends Exception {
211 
212     }
213 
214     @SoapFault(faultCode = FaultCode.RECEIVER, faultStringOrReason = "Receiver error")
215     public class MyReceiverException extends Exception {
216 
217     }
218 
219     @SoapFault(faultCode = FaultCode.CUSTOM, customFaultCode = "{http://springframework.org/spring-ws}Fault",
220             faultStringOrReason = "MyCustomException thrown", locale = "nl")
221     public class MyCustomException extends Exception {
222 
223     }
224 
225     public class NonAnnotatedException extends Exception {
226 
227     }
228 
229 
230 }