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.io.IOException;
20 import java.util.Locale;
21 import java.util.Properties;
22 import javax.xml.soap.MessageFactory;
23 import javax.xml.soap.SOAPConstants;
24 import javax.xml.soap.SOAPMessage;
25
26 import org.custommonkey.xmlunit.XMLTestCase;
27 import org.springframework.ws.context.DefaultMessageContext;
28 import org.springframework.ws.context.MessageContext;
29 import org.springframework.ws.soap.SoapMessage;
30 import org.springframework.ws.soap.SoapMessageException;
31 import org.springframework.ws.soap.SoapMessageFactory;
32 import org.springframework.ws.soap.SoapVersion;
33 import org.springframework.ws.soap.saaj.SaajSoapMessage;
34 import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
35 import org.springframework.ws.soap.soap11.Soap11Fault;
36 import org.springframework.ws.soap.soap12.Soap12Fault;
37
38 public class SoapFaultMappingExceptionResolverTest extends XMLTestCase {
39
40 private SoapFaultMappingExceptionResolver resolver;
41
42 protected void setUp() throws Exception {
43 resolver = new SoapFaultMappingExceptionResolver();
44 }
45
46 public void testGetDepth() throws Exception {
47 assertEquals("Invalid depth for Exception", 0, resolver.getDepth("java.lang.Exception", new Exception()));
48 assertEquals("Invalid depth for IllegalArgumentException", 2,
49 resolver.getDepth("java.lang.Exception", new IllegalArgumentException()));
50 assertEquals("Invalid depth for IllegalStateException", -1,
51 resolver.getDepth("IllegalArgumentException", new IllegalStateException()));
52 }
53
54 public void testResolveExceptionClientSoap11() throws Exception {
55 Properties mappings = new Properties();
56 mappings.setProperty(Exception.class.getName(), "SERVER, Server error");
57 mappings.setProperty(RuntimeException.class.getName(), "CLIENT, Client error");
58 resolver.setExceptionMappings(mappings);
59
60 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
61 SOAPMessage message = messageFactory.createMessage();
62 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
63 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
64
65 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
66 assertTrue("resolveException returns false", result);
67 assertTrue("Context has no response", context.hasResponse());
68 SoapMessage response = (SoapMessage) context.getResponse();
69 assertTrue("Response has no fault", response.getSoapBody().hasFault());
70 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
71 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
72 fault.getFaultCode());
73 assertEquals("Invalid fault string on fault", "Client error", fault.getFaultStringOrReason());
74 assertNull("Detail on fault", fault.getFaultDetail());
75 }
76
77 public void testResolveExceptionSenderSoap12() throws Exception {
78 Properties mappings = new Properties();
79 mappings.setProperty(Exception.class.getName(), "RECEIVER, Receiver error, en");
80 mappings.setProperty(RuntimeException.class.getName(), "SENDER, Sender error, en");
81 resolver.setExceptionMappings(mappings);
82
83 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
84 SOAPMessage message = messageFactory.createMessage();
85 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
86 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
87
88 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
89 assertTrue("resolveException returns false", result);
90 assertTrue("Context has no response", context.hasResponse());
91 SoapMessage response = (SoapMessage) context.getResponse();
92 assertTrue("Response has no fault", response.getSoapBody().hasFault());
93 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
94 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getClientOrSenderFaultName(),
95 fault.getFaultCode());
96 assertEquals("Invalid fault string on fault", "Sender error", fault.getFaultReasonText(Locale.ENGLISH));
97 assertNull("Detail on fault", fault.getFaultDetail());
98 }
99
100 public void testResolveExceptionServerSoap11() throws Exception {
101 Properties mappings = new Properties();
102 mappings.setProperty(Exception.class.getName(), "CLIENT, Client error");
103 mappings.setProperty(RuntimeException.class.getName(), "SERVER, Server error");
104 resolver.setExceptionMappings(mappings);
105
106 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
107 SOAPMessage message = messageFactory.createMessage();
108 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
109 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
110
111 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
112 assertTrue("resolveException returns false", result);
113 assertTrue("Context has no response", context.hasResponse());
114 SoapMessage response = (SoapMessage) context.getResponse();
115 assertTrue("Response has no fault", response.getSoapBody().hasFault());
116 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
117 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
118 fault.getFaultCode());
119 assertEquals("Invalid fault string on fault", "Server error", fault.getFaultStringOrReason());
120 assertNull("Detail on fault", fault.getFaultDetail());
121 }
122
123 public void testResolveExceptionReceiverSoap12() throws Exception {
124 Properties mappings = new Properties();
125 mappings.setProperty(Exception.class.getName(), "SENDER, Sender error");
126 mappings.setProperty(RuntimeException.class.getName(), "RECEIVER, Receiver error");
127 resolver.setExceptionMappings(mappings);
128
129 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
130 SOAPMessage message = messageFactory.createMessage();
131 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
132 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
133
134 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
135 assertTrue("resolveException returns false", result);
136 assertTrue("Context has no response", context.hasResponse());
137 SoapMessage response = (SoapMessage) context.getResponse();
138 assertTrue("Response has no fault", response.getSoapBody().hasFault());
139 Soap12Fault fault = (Soap12Fault) response.getSoapBody().getFault();
140 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_12.getServerOrReceiverFaultName(),
141 fault.getFaultCode());
142 assertEquals("Invalid fault string on fault", "Receiver error", fault.getFaultReasonText(Locale.ENGLISH));
143 assertNull("Detail on fault", fault.getFaultDetail());
144 }
145
146 public void testResolveExceptionDefault() throws Exception {
147 Properties mappings = new Properties();
148 mappings.setProperty(SoapMessageException.class.getName(), "SERVER,Server error");
149 resolver.setExceptionMappings(mappings);
150 SoapFaultDefinition defaultFault = new SoapFaultDefinition();
151 defaultFault.setFaultCode(SoapFaultDefinition.CLIENT);
152 resolver.setDefaultFault(defaultFault);
153 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
154 SOAPMessage message = messageFactory.createMessage();
155 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
156 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
157
158 boolean result = resolver.resolveException(context, null, new IllegalArgumentException("bla"));
159 assertTrue("resolveException returns false", result);
160 assertTrue("Context has no response", context.hasResponse());
161 SoapMessage response = (SoapMessage) context.getResponse();
162 assertTrue("Response 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", "bla", fault.getFaultStringOrReason());
167 assertNull("Detail on fault", fault.getFaultDetail());
168
169
170 result = resolver.resolveException(context, null, new IllegalArgumentException());
171 assertTrue("resolveException returns false", result);
172 assertTrue("Context has no response", context.hasResponse());
173 response = (SoapMessage) context.getResponse();
174 assertTrue("Response has no fault", response.getSoapBody().hasFault());
175 fault = (Soap11Fault) response.getSoapBody().getFault();
176 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getClientOrSenderFaultName(),
177 fault.getFaultCode());
178 assertEquals("Invalid fault string on fault", "java.lang.IllegalArgumentException",
179 fault.getFaultStringOrReason());
180 assertNull("Detail on fault", fault.getFaultDetail());
181 }
182
183 public void testResolveNoMessageException() throws Exception {
184 Properties mappings = new Properties();
185 mappings.setProperty(IOException.class.getName(), "SERVER");
186 resolver.setExceptionMappings(mappings);
187
188 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
189 SOAPMessage message = messageFactory.createMessage();
190 SoapMessageFactory factory = new SaajSoapMessageFactory(messageFactory);
191 MessageContext context = new DefaultMessageContext(new SaajSoapMessage(message), factory);
192
193 boolean result = resolver.resolveException(context, null, new IOException());
194 assertTrue("resolveException returns false", result);
195 assertTrue("Context has no response", context.hasResponse());
196 SoapMessage response = (SoapMessage) context.getResponse();
197 assertTrue("Response has no fault", response.getSoapBody().hasFault());
198 Soap11Fault fault = (Soap11Fault) response.getSoapBody().getFault();
199 assertEquals("Invalid fault code on fault", SoapVersion.SOAP_11.getServerOrReceiverFaultName(),
200 fault.getFaultCode());
201 assertEquals("Invalid fault string on fault", "java.io.IOException", fault.getFaultStringOrReason());
202 assertNull("Detail on fault", fault.getFaultDetail());
203 }
204
205
206 }