1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
40
41
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 }