1
16
17 package org.springframework.ws.server.endpoint.mapping;
18
19 import java.lang.reflect.Method;
20 import java.util.ArrayList;
21 import java.util.List;
22 import javax.xml.namespace.QName;
23 import javax.xml.transform.TransformerFactory;
24
25 import org.springframework.core.annotation.AnnotationUtils;
26 import org.springframework.util.StringUtils;
27 import org.springframework.ws.context.MessageContext;
28 import org.springframework.ws.server.EndpointMapping;
29 import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
30 import org.springframework.ws.server.endpoint.annotation.PayloadRoots;
31 import org.springframework.ws.server.endpoint.support.PayloadRootUtils;
32 import org.springframework.xml.transform.TransformerFactoryUtils;
33
34
53 public class PayloadRootAnnotationMethodEndpointMapping extends AbstractAnnotationMethodEndpointMapping<QName> {
54
55 private static TransformerFactory transformerFactory;
56
57 static {
58 setTransformerFactory(TransformerFactoryUtils.newInstance());
59 }
60
61
66 public static void setTransformerFactory(TransformerFactory transformerFactory) {
67 PayloadRootAnnotationMethodEndpointMapping.transformerFactory = transformerFactory;
68 }
69
70 @Override
71 protected QName getLookupKeyForMessage(MessageContext messageContext) throws Exception {
72 return PayloadRootUtils.getPayloadRootQName(messageContext.getRequest().getPayloadSource(), transformerFactory);
73 }
74
75 @Override
76 protected List<QName> getLookupKeysForMethod(Method method) {
77 List<QName> result = new ArrayList<QName>();
78
79 PayloadRoots payloadRoots = AnnotationUtils.findAnnotation(method, PayloadRoots.class);
80 if (payloadRoots != null) {
81 for (PayloadRoot payloadRoot : payloadRoots.value()) {
82 result.add(getQNameFromAnnotation(payloadRoot));
83 }
84 }
85 else {
86 PayloadRoot payloadRoot = AnnotationUtils.findAnnotation(method, PayloadRoot.class);
87 if (payloadRoot != null) {
88 result.add(getQNameFromAnnotation(payloadRoot));
89 }
90 }
91
92 return result;
93 }
94
95 private QName getQNameFromAnnotation(PayloadRoot payloadRoot) {
96 if (StringUtils.hasLength(payloadRoot.localPart()) && StringUtils.hasLength(
97 payloadRoot.namespace())) {
98 return new QName(payloadRoot.namespace(), payloadRoot.localPart());
99 }
100 else {
101 return new QName(payloadRoot.localPart());
102 }
103 }
104
105 }
106