1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.ws.server.endpoint.mapping;
18
19 import java.util.Map;
20 import javax.xml.transform.Transformer;
21 import javax.xml.transform.TransformerException;
22 import javax.xml.transform.TransformerFactory;
23 import javax.xml.transform.dom.DOMResult;
24
25 import org.springframework.beans.factory.InitializingBean;
26 import org.springframework.util.Assert;
27 import org.springframework.util.StringUtils;
28 import org.springframework.ws.WebServiceMessage;
29 import org.springframework.ws.context.MessageContext;
30 import org.springframework.xml.xpath.XPathExpression;
31 import org.springframework.xml.xpath.XPathExpressionFactory;
32
33 import org.w3c.dom.Element;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class XPathPayloadEndpointMapping extends AbstractMapBasedEndpointMapping implements InitializingBean {
61
62 private String expressionString;
63
64 private XPathExpression expression;
65
66 private Map<String, String> namespaces;
67
68 private TransformerFactory transformerFactory;
69
70
71 public void setExpression(String expression) {
72 expressionString = expression;
73 }
74
75
76 public void setNamespaces(Map<String, String> namespaces) {
77 this.namespaces = namespaces;
78 }
79
80 public void afterPropertiesSet() throws Exception {
81 Assert.notNull(expressionString, "expression is required");
82 if (namespaces == null) {
83 expression = XPathExpressionFactory.createXPathExpression(expressionString);
84 }
85 else {
86 expression = XPathExpressionFactory.createXPathExpression(expressionString, namespaces);
87 }
88 transformerFactory = TransformerFactory.newInstance();
89 }
90
91 @Override
92 protected String getLookupKeyForMessage(MessageContext messageContext) throws Exception {
93 Element payloadElement = getMessagePayloadElement(messageContext.getRequest());
94 return expression.evaluateAsString(payloadElement);
95 }
96
97 private Element getMessagePayloadElement(WebServiceMessage message) throws TransformerException {
98 Transformer transformer = transformerFactory.newTransformer();
99 DOMResult domResult = new DOMResult();
100 transformer.transform(message.getPayloadSource(), domResult);
101 return (Element) domResult.getNode().getFirstChild();
102 }
103
104 @Override
105 protected boolean validateLookupKey(String key) {
106 return StringUtils.hasLength(key);
107 }
108 }