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.Properties;
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 import org.w3c.dom.Element;
33
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 public class XPathPayloadEndpointMapping extends AbstractMapBasedEndpointMapping implements InitializingBean {
60
61 private String expressionString;
62
63 private XPathExpression expression;
64
65 private Properties namespaces;
66
67 private TransformerFactory transformerFactory;
68
69
70 public void setExpression(String expression) {
71 expressionString = expression;
72 }
73
74
75 public void setNamespaces(Properties namespaces) {
76 this.namespaces = namespaces;
77 }
78
79 public void afterPropertiesSet() throws Exception {
80 Assert.notNull(expressionString, "expression is required");
81 if (namespaces == null) {
82 expression = XPathExpressionFactory.createXPathExpression(expressionString);
83 }
84 else {
85 expression = XPathExpressionFactory.createXPathExpression(expressionString, namespaces);
86 }
87 transformerFactory = TransformerFactory.newInstance();
88 }
89
90 protected String getLookupKeyForMessage(MessageContext messageContext) throws Exception {
91 Element payloadElement = getMessagePayloadElement(messageContext.getRequest());
92 return expression.evaluateAsString(payloadElement);
93 }
94
95 private Element getMessagePayloadElement(WebServiceMessage message) throws TransformerException {
96 Transformer transformer = transformerFactory.newTransformer();
97 DOMResult domResult = new DOMResult();
98 transformer.transform(message.getPayloadSource(), domResult);
99 return (Element) domResult.getNode().getFirstChild();
100 }
101
102 protected boolean validateLookupKey(String key) {
103 return StringUtils.hasLength(key);
104 }
105 }