1 /*
2  * Copyright 2005-2011 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *       http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 /**
35  * Implementation of the {@link EndpointMapping} interface that uses the {@link PayloadRoot} annotation to map methods
36  * to request payload root elements.
37  *
38  * <p>Endpoints typically have the following form:
39  * <pre>
40  * &#64;Endpoint
41  * public class MyEndpoint{
42  *      &#64;PayloadRoot(localPart = "Request",
43  *                   namespace = "http://springframework.org/spring-ws")
44  *      public Source doSomethingWithRequest() {
45  *         ...
46  *      }
47  * }
48  * </pre>
49  *
50  * @author Arjen Poutsma
51  * @since 1.0.0
52  */

53 public class PayloadRootAnnotationMethodEndpointMapping extends AbstractAnnotationMethodEndpointMapping<QName> {
54
55     private static TransformerFactory transformerFactory;
56
57     static {
58         setTransformerFactory(TransformerFactoryUtils.newInstance());
59     }
60
61     /**
62      * Override the default {@link TransformerFactory}.
63      * 
64      * @param transformerFactory
65      */

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