1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.soap.addressing.server;
18
19 import java.net.URI;
20 import java.util.Arrays;
21 import java.util.Iterator;
22 import javax.xml.transform.TransformerException;
23
24 import org.springframework.beans.factory.InitializingBean;
25 import org.springframework.core.Ordered;
26 import org.springframework.util.Assert;
27 import org.springframework.ws.context.MessageContext;
28 import org.springframework.ws.server.EndpointInterceptor;
29 import org.springframework.ws.server.EndpointInvocationChain;
30 import org.springframework.ws.server.EndpointMapping;
31 import org.springframework.ws.soap.SoapHeader;
32 import org.springframework.ws.soap.SoapHeaderElement;
33 import org.springframework.ws.soap.SoapMessage;
34 import org.springframework.ws.soap.addressing.core.MessageAddressingProperties;
35 import org.springframework.ws.soap.addressing.messageid.MessageIdStrategy;
36 import org.springframework.ws.soap.addressing.messageid.UuidMessageIdStrategy;
37 import org.springframework.ws.soap.addressing.version.Addressing10;
38 import org.springframework.ws.soap.addressing.version.Addressing200408;
39 import org.springframework.ws.soap.addressing.version.AddressingVersion;
40 import org.springframework.ws.soap.server.SoapEndpointInvocationChain;
41 import org.springframework.ws.soap.server.SoapEndpointMapping;
42 import org.springframework.ws.transport.WebServiceMessageSender;
43 import org.springframework.xml.transform.TransformerObjectSupport;
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public abstract class AbstractAddressingEndpointMapping extends TransformerObjectSupport
67 implements SoapEndpointMapping, InitializingBean, Ordered {
68
69 private String[] actorsOrRoles;
70
71 private boolean isUltimateReceiver = true;
72
73 private MessageIdStrategy messageIdStrategy;
74
75 private WebServiceMessageSender[] messageSenders = new WebServiceMessageSender[0];
76
77 private AddressingVersion[] versions;
78
79 private EndpointInterceptor[] preInterceptors = new EndpointInterceptor[0];
80
81 private EndpointInterceptor[] postInterceptors = new EndpointInterceptor[0];
82
83 private int order = Integer.MAX_VALUE;
84
85
86
87 protected AbstractAddressingEndpointMapping() {
88 initDefaultStrategies();
89 }
90
91
92
93
94
95
96 protected void initDefaultStrategies() {
97 this.versions = new AddressingVersion[]{new Addressing200408(), new Addressing10()};
98 messageIdStrategy = new UuidMessageIdStrategy();
99 }
100
101 public final void setActorOrRole(String actorOrRole) {
102 Assert.notNull(actorOrRole, "actorOrRole must not be null");
103 actorsOrRoles = new String[]{actorOrRole};
104 }
105
106 public final void setActorsOrRoles(String[] actorsOrRoles) {
107 Assert.notEmpty(actorsOrRoles, "actorsOrRoles must not be empty");
108 this.actorsOrRoles = actorsOrRoles;
109 }
110
111 public final void setUltimateReceiver(boolean ultimateReceiver) {
112 this.isUltimateReceiver = ultimateReceiver;
113 }
114
115 public final int getOrder() {
116 return order;
117 }
118
119
120
121
122
123
124
125
126 public final void setOrder(int order) {
127 this.order = order;
128 }
129
130
131
132
133
134 public final void setPreInterceptors(EndpointInterceptor[] preInterceptors) {
135 Assert.notNull(preInterceptors, "'preInterceptors' must not be null");
136 this.preInterceptors = preInterceptors;
137 }
138
139
140
141
142
143 public final void setPostInterceptors(EndpointInterceptor[] postInterceptors) {
144 Assert.notNull(postInterceptors, "'postInterceptors' must not be null");
145 this.postInterceptors = postInterceptors;
146 }
147
148
149
150
151
152
153 public final void setMessageIdStrategy(MessageIdStrategy messageIdStrategy) {
154 Assert.notNull(messageIdStrategy, "'messageIdStrategy' must not be null");
155 this.messageIdStrategy = messageIdStrategy;
156 }
157
158
159
160
161 public MessageIdStrategy getMessageIdStrategy() {
162 return messageIdStrategy;
163 }
164
165
166
167
168
169
170
171
172 public final void setMessageSender(WebServiceMessageSender messageSender) {
173 Assert.notNull(messageSender, "'messageSender' must not be null");
174 setMessageSenders(new WebServiceMessageSender[]{messageSender});
175 }
176
177
178
179
180
181
182
183
184 public final void setMessageSenders(WebServiceMessageSender[] messageSenders) {
185 Assert.notNull(messageSenders, "'messageSenders' must not be null");
186 this.messageSenders = messageSenders;
187 }
188
189
190
191
192
193
194 public final WebServiceMessageSender[] getMessageSenders() {
195 return this.messageSenders;
196 }
197
198
199
200
201
202
203
204
205 public final void setVersions(AddressingVersion[] versions) {
206 this.versions = versions;
207 }
208
209 public void afterPropertiesSet() throws Exception {
210 if (logger.isInfoEnabled()) {
211 logger.info("Supporting " + Arrays.asList(versions));
212 }
213 }
214
215 public final EndpointInvocationChain getEndpoint(MessageContext messageContext) throws TransformerException {
216 Assert.isInstanceOf(SoapMessage.class, messageContext.getRequest());
217 SoapMessage request = (SoapMessage) messageContext.getRequest();
218 for (AddressingVersion version : versions) {
219 if (supports(version, request)) {
220 if (logger.isDebugEnabled()) {
221 logger.debug("Request [" + request + "] uses [" + version + "]");
222 }
223 MessageAddressingProperties requestMap = version.getMessageAddressingProperties(request);
224 if (requestMap == null) {
225 return null;
226 }
227 Object endpoint = getEndpointInternal(requestMap);
228 if (endpoint == null) {
229 return null;
230 }
231 return getEndpointInvocationChain(endpoint, version, requestMap);
232 }
233 }
234 return null;
235 }
236
237
238
239
240
241 private EndpointInvocationChain getEndpointInvocationChain(Object endpoint,
242 AddressingVersion version,
243 MessageAddressingProperties requestMap) {
244 URI responseAction = getResponseAction(endpoint, requestMap);
245 URI faultAction = getFaultAction(endpoint, requestMap);
246
247 WebServiceMessageSender[] messageSenders = getMessageSenders(endpoint);
248 MessageIdStrategy messageIdStrategy = getMessageIdStrategy(endpoint);
249
250 EndpointInterceptor[] interceptors =
251 new EndpointInterceptor[preInterceptors.length + postInterceptors.length +
252 1];
253 System.arraycopy(preInterceptors, 0, interceptors, 0, preInterceptors.length);
254 AddressingEndpointInterceptor interceptor = new AddressingEndpointInterceptor(version, messageIdStrategy,
255 messageSenders, responseAction, faultAction);
256 interceptors[preInterceptors.length] = interceptor;
257 System.arraycopy(postInterceptors, 0, interceptors, preInterceptors.length + 1, postInterceptors.length);
258 return new SoapEndpointInvocationChain(endpoint, interceptors, actorsOrRoles, isUltimateReceiver);
259 }
260
261 private boolean supports(AddressingVersion version, SoapMessage request) {
262 SoapHeader header = request.getSoapHeader();
263 if (header != null) {
264 for (Iterator<SoapHeaderElement> iterator = header.examineAllHeaderElements(); iterator.hasNext();) {
265 SoapHeaderElement headerElement = iterator.next();
266 if (version.understands(headerElement)) {
267 return true;
268 }
269 }
270 }
271 return false;
272 }
273
274
275
276
277
278
279
280
281 protected WebServiceMessageSender[] getMessageSenders(Object endpoint) {
282 return getMessageSenders();
283 }
284
285
286
287
288
289
290
291
292 protected MessageIdStrategy getMessageIdStrategy(Object endpoint) {
293 return getMessageIdStrategy();
294 }
295
296
297
298
299
300
301
302
303 protected abstract Object getEndpointInternal(MessageAddressingProperties map);
304
305
306
307
308
309
310
311
312
313 protected abstract URI getResponseAction(Object endpoint, MessageAddressingProperties requestMap);
314
315
316
317
318
319
320
321
322
323 protected abstract URI getFaultAction(Object endpoint, MessageAddressingProperties requestMap);
324
325 }