View Javadoc
1   /*
2    * Copyright 2002-2013 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.aop.config;
18  
19  import java.util.HashSet;
20  import java.util.Set;
21  
22  import org.junit.Before;
23  import org.junit.Test;
24  
25  import org.springframework.beans.factory.config.BeanDefinition;
26  import org.springframework.beans.factory.config.BeanReference;
27  import org.springframework.beans.factory.parsing.BeanComponentDefinition;
28  import org.springframework.beans.factory.parsing.ComponentDefinition;
29  import org.springframework.beans.factory.parsing.CompositeComponentDefinition;
30  import org.springframework.beans.factory.support.DefaultListableBeanFactory;
31  import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
32  import org.springframework.core.io.Resource;
33  import org.springframework.tests.beans.CollectingReaderEventListener;
34  
35  import static org.junit.Assert.*;
36  import static org.springframework.tests.TestResourceUtils.*;
37  
38  /**
39   * @author Rob Harrop
40   * @author Juergen Hoeller
41   * @author Chris Beams
42   */
43  public final class AopNamespaceHandlerEventTests {
44  
45  	private static final Class<?> CLASS = AopNamespaceHandlerEventTests.class;
46  
47  	private static final Resource CONTEXT =  qualifiedResource(CLASS, "context.xml");
48  	private static final Resource POINTCUT_EVENTS_CONTEXT =  qualifiedResource(CLASS, "pointcutEvents.xml");
49  	private static final Resource POINTCUT_REF_CONTEXT = qualifiedResource(CLASS, "pointcutRefEvents.xml");
50  	private static final Resource DIRECT_POINTCUT_EVENTS_CONTEXT = qualifiedResource(CLASS, "directPointcutEvents.xml");
51  
52  	private CollectingReaderEventListener eventListener = new CollectingReaderEventListener();
53  
54  	private XmlBeanDefinitionReader reader;
55  
56  	private DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
57  
58  
59  
60  	@Before
61  	public void setUp() throws Exception {
62  		this.reader = new XmlBeanDefinitionReader(this.beanFactory);
63  		this.reader.setEventListener(this.eventListener);
64  	}
65  
66  	@Test
67  	public void testPointcutEvents() throws Exception {
68  		this.reader.loadBeanDefinitions(POINTCUT_EVENTS_CONTEXT);
69  		ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
70  		assertEquals("Incorrect number of events fired", 1, componentDefinitions.length);
71  		assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
72  
73  		CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
74  		assertEquals("aop:config", compositeDef.getName());
75  
76  		ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
77  		assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
78  		PointcutComponentDefinition pcd = null;
79  		for (int i = 0; i < nestedComponentDefs.length; i++) {
80  			ComponentDefinition componentDefinition = nestedComponentDefs[i];
81  			if (componentDefinition instanceof PointcutComponentDefinition) {
82  				pcd = (PointcutComponentDefinition) componentDefinition;
83  				break;
84  			}
85  		}
86  		assertNotNull("PointcutComponentDefinition not found", pcd);
87  		assertEquals("Incorrect number of BeanDefinitions", 1, pcd.getBeanDefinitions().length);
88  	}
89  
90  	@Test
91  	public void testAdvisorEventsWithPointcutRef() throws Exception {
92  		this.reader.loadBeanDefinitions(POINTCUT_REF_CONTEXT);
93  		ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
94  		assertEquals("Incorrect number of events fired", 2, componentDefinitions.length);
95  
96  		assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
97  		CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
98  		assertEquals("aop:config", compositeDef.getName());
99  
100 		ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
101 		assertEquals("Incorrect number of inner components", 3, nestedComponentDefs.length);
102 		AdvisorComponentDefinition acd = null;
103 		for (int i = 0; i < nestedComponentDefs.length; i++) {
104 			ComponentDefinition componentDefinition = nestedComponentDefs[i];
105 			if (componentDefinition instanceof AdvisorComponentDefinition) {
106 				acd = (AdvisorComponentDefinition) componentDefinition;
107 				break;
108 			}
109 		}
110 		assertNotNull("AdvisorComponentDefinition not found", acd);
111 		assertEquals(1, acd.getBeanDefinitions().length);
112 		assertEquals(2, acd.getBeanReferences().length);
113 
114 		assertTrue("No advice bean found", componentDefinitions[1] instanceof BeanComponentDefinition);
115 		BeanComponentDefinition adviceDef = (BeanComponentDefinition) componentDefinitions[1];
116 		assertEquals("countingAdvice", adviceDef.getBeanName());
117 	}
118 
119 	@Test
120 	public void testAdvisorEventsWithDirectPointcut() throws Exception {
121 		this.reader.loadBeanDefinitions(DIRECT_POINTCUT_EVENTS_CONTEXT);
122 		ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
123 		assertEquals("Incorrect number of events fired", 2, componentDefinitions.length);
124 
125 		assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
126 		CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
127 		assertEquals("aop:config", compositeDef.getName());
128 
129 		ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
130 		assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
131 		AdvisorComponentDefinition acd = null;
132 		for (int i = 0; i < nestedComponentDefs.length; i++) {
133 			ComponentDefinition componentDefinition = nestedComponentDefs[i];
134 			if (componentDefinition instanceof AdvisorComponentDefinition) {
135 				acd = (AdvisorComponentDefinition) componentDefinition;
136 				break;
137 			}
138 		}
139 		assertNotNull("AdvisorComponentDefinition not found", acd);
140 		assertEquals(2, acd.getBeanDefinitions().length);
141 		assertEquals(1, acd.getBeanReferences().length);
142 
143 		assertTrue("No advice bean found", componentDefinitions[1] instanceof BeanComponentDefinition);
144 		BeanComponentDefinition adviceDef = (BeanComponentDefinition) componentDefinitions[1];
145 		assertEquals("countingAdvice", adviceDef.getBeanName());
146 	}
147 
148 	@Test
149 	public void testAspectEvent() throws Exception {
150 		this.reader.loadBeanDefinitions(CONTEXT);
151 		ComponentDefinition[] componentDefinitions = this.eventListener.getComponentDefinitions();
152 		assertEquals("Incorrect number of events fired", 5, componentDefinitions.length);
153 
154 		assertTrue("No holder with nested components", componentDefinitions[0] instanceof CompositeComponentDefinition);
155 		CompositeComponentDefinition compositeDef = (CompositeComponentDefinition) componentDefinitions[0];
156 		assertEquals("aop:config", compositeDef.getName());
157 
158 		ComponentDefinition[] nestedComponentDefs = compositeDef.getNestedComponents();
159 		assertEquals("Incorrect number of inner components", 2, nestedComponentDefs.length);
160 		AspectComponentDefinition acd = null;
161 		for (int i = 0; i < nestedComponentDefs.length; i++) {
162 			ComponentDefinition componentDefinition = nestedComponentDefs[i];
163 			if (componentDefinition instanceof AspectComponentDefinition) {
164 				acd = (AspectComponentDefinition) componentDefinition;
165 				break;
166 			}
167 		}
168 
169 		assertNotNull("AspectComponentDefinition not found", acd);
170 		BeanDefinition[] beanDefinitions = acd.getBeanDefinitions();
171 		assertEquals(5, beanDefinitions.length);
172 		BeanReference[] beanReferences = acd.getBeanReferences();
173 		assertEquals(6, beanReferences.length);
174 
175 		Set<String> expectedReferences = new HashSet<String>();
176 		expectedReferences.add("pc");
177 		expectedReferences.add("countingAdvice");
178 		for (int i = 0; i < beanReferences.length; i++) {
179 			BeanReference beanReference = beanReferences[i];
180 			expectedReferences.remove(beanReference.getBeanName());
181 		}
182 		assertEquals("Incorrect references found", 0, expectedReferences.size());
183 
184 		for (int i = 1; i < componentDefinitions.length; i++) {
185 			assertTrue(componentDefinitions[i] instanceof BeanComponentDefinition);
186 		}
187 
188 		ComponentDefinition[] nestedComponentDefs2 = acd.getNestedComponents();
189 		assertEquals("Inner PointcutComponentDefinition not found", 1, nestedComponentDefs2.length);
190 		assertTrue(nestedComponentDefs2[0] instanceof PointcutComponentDefinition);
191 		PointcutComponentDefinition pcd = (PointcutComponentDefinition) nestedComponentDefs2[0];
192 		assertEquals("Incorrect number of BeanDefinitions", 1, pcd.getBeanDefinitions().length);
193 	}
194 
195 }