1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }