1   /*
2    * Copyright 2005-2012 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.config;
18  
19  import java.util.Collection;
20  import java.util.List;
21  import java.util.Map;
22  
23  import org.springframework.context.ApplicationContext;
24  import org.springframework.context.support.ClassPathXmlApplicationContext;
25  import org.springframework.ws.server.EndpointAdapter;
26  import org.springframework.ws.server.EndpointExceptionResolver;
27  import org.springframework.ws.server.EndpointMapping;
28  import org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter;
29  import org.springframework.ws.server.endpoint.adapter.method.MessageContextMethodArgumentResolver;
30  import org.springframework.ws.server.endpoint.adapter.method.MethodArgumentResolver;
31  import org.springframework.ws.server.endpoint.adapter.method.MethodReturnValueHandler;
32  import org.springframework.ws.server.endpoint.adapter.method.SourcePayloadMethodProcessor;
33  import org.springframework.ws.server.endpoint.adapter.method.StaxPayloadMethodArgumentResolver;
34  import org.springframework.ws.server.endpoint.adapter.method.XPathParamMethodArgumentResolver;
35  import org.springframework.ws.server.endpoint.adapter.method.dom.Dom4jPayloadMethodProcessor;
36  import org.springframework.ws.server.endpoint.adapter.method.dom.DomPayloadMethodProcessor;
37  import org.springframework.ws.server.endpoint.adapter.method.dom.JDomPayloadMethodProcessor;
38  import org.springframework.ws.server.endpoint.adapter.method.dom.XomPayloadMethodProcessor;
39  import org.springframework.ws.server.endpoint.adapter.method.jaxb.JaxbElementPayloadMethodProcessor;
40  import org.springframework.ws.server.endpoint.adapter.method.jaxb.XmlRootElementPayloadMethodProcessor;
41  import org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping;
42  import org.springframework.ws.soap.addressing.server.AnnotationActionEndpointMapping;
43  import org.springframework.ws.soap.server.endpoint.SimpleSoapExceptionResolver;
44  import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;
45  import org.springframework.ws.soap.server.endpoint.adapter.method.SoapHeaderElementMethodArgumentResolver;
46  import org.springframework.ws.soap.server.endpoint.adapter.method.SoapMethodArgumentResolver;
47  import org.springframework.ws.soap.server.endpoint.mapping.SoapActionAnnotationMethodEndpointMapping;
48  
49  import org.junit.Before;
50  import org.junit.Test;
51  
52  import static org.junit.Assert.assertEquals;
53  import static org.junit.Assert.assertTrue;
54  
55  /**
56   * @author Arjen Poutsma
57   */
58  public class AnnotationDrivenBeanDefinitionParserTest {
59  
60      private ApplicationContext applicationContext;
61  
62      @Before
63      public void setUp() throws Exception {
64          applicationContext =
65                  new ClassPathXmlApplicationContext("annotationDrivenBeanDefinitionParserTest.xml", getClass());
66      }
67  
68      @Test
69      public void endpointMappings() {
70          Map<String, EndpointMapping> result = applicationContext.getBeansOfType(EndpointMapping.class);
71          assertEquals("invalid amount of endpoint mappings found", 3, result.size());
72          assertContainsInstanceOf(result.values(), PayloadRootAnnotationMethodEndpointMapping.class);
73          assertContainsInstanceOf(result.values(), SoapActionAnnotationMethodEndpointMapping.class);
74          assertContainsInstanceOf(result.values(), AnnotationActionEndpointMapping.class);
75      }
76  
77      @Test
78      public void endpointAdapters() {
79          Map<String, EndpointAdapter> result =
80                  applicationContext.getBeansOfType(EndpointAdapter.class);
81          assertEquals("invalid amount of endpoint mappings found", 1, result.size());
82          DefaultMethodEndpointAdapter endpointAdapter = (DefaultMethodEndpointAdapter) result.values().iterator().next();
83  
84          List<MethodArgumentResolver> argumentResolvers = endpointAdapter.getMethodArgumentResolvers();
85          assertTrue("No argumentResolvers created", !argumentResolvers.isEmpty());
86          assertContainsInstanceOf(argumentResolvers, MessageContextMethodArgumentResolver.class);
87          assertContainsInstanceOf(argumentResolvers, XPathParamMethodArgumentResolver.class);
88          assertContainsInstanceOf(argumentResolvers, SoapMethodArgumentResolver.class);
89          assertContainsInstanceOf(argumentResolvers, SoapHeaderElementMethodArgumentResolver.class);
90          assertContainsInstanceOf(argumentResolvers, DomPayloadMethodProcessor.class);
91          assertContainsInstanceOf(argumentResolvers, SourcePayloadMethodProcessor.class);
92          assertContainsInstanceOf(argumentResolvers, Dom4jPayloadMethodProcessor.class);
93          assertContainsInstanceOf(argumentResolvers, XmlRootElementPayloadMethodProcessor.class);
94          assertContainsInstanceOf(argumentResolvers, JaxbElementPayloadMethodProcessor.class);
95          assertContainsInstanceOf(argumentResolvers, JDomPayloadMethodProcessor.class);
96          assertContainsInstanceOf(argumentResolvers, StaxPayloadMethodArgumentResolver.class);
97          assertContainsInstanceOf(argumentResolvers, XomPayloadMethodProcessor.class);
98  
99          List<MethodReturnValueHandler> returnValueHandlers = endpointAdapter.getMethodReturnValueHandlers();
100         assertTrue("No returnValueHandlers created", !returnValueHandlers.isEmpty());
101         assertContainsInstanceOf(returnValueHandlers, DomPayloadMethodProcessor.class);
102         assertContainsInstanceOf(returnValueHandlers, SourcePayloadMethodProcessor.class);
103         assertContainsInstanceOf(returnValueHandlers, Dom4jPayloadMethodProcessor.class);
104         assertContainsInstanceOf(returnValueHandlers, XmlRootElementPayloadMethodProcessor.class);
105         assertContainsInstanceOf(returnValueHandlers, JaxbElementPayloadMethodProcessor.class);
106         assertContainsInstanceOf(returnValueHandlers, JDomPayloadMethodProcessor.class);
107         assertContainsInstanceOf(returnValueHandlers, XomPayloadMethodProcessor.class);
108     }
109 
110     @Test
111     public void endpointExceptionResolver() {
112         Map<String, EndpointExceptionResolver> result = applicationContext.getBeansOfType(EndpointExceptionResolver.class);
113         assertEquals("invalid amount of endpoint exception resolvers found", 2, result.size());
114         assertContainsInstanceOf(result.values(), SoapFaultAnnotationExceptionResolver.class);
115         assertContainsInstanceOf(result.values(), SimpleSoapExceptionResolver.class);
116     }
117 
118 
119     private <T> void assertContainsInstanceOf(Collection<T> collection, Class<? extends T> clazz) {
120         boolean found = false;
121         for (T item : collection) {
122             if (item.getClass().equals(clazz)) {
123                 found = true;
124                 break;
125             }
126         }
127         assertTrue("No [" + clazz.getName() + "] instance found", found);
128     }
129 
130 }