KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nanocontainer > aop > dynaop > DynaopAspectsManagerTestCase


1 /*****************************************************************************
2  * Copyright (c) PicoContainer Organization. All rights reserved. *
3  * ------------------------------------------------------------------------- *
4  * The software in this package is published under the terms of the BSD *
5  * style license a copy of which has been included with this distribution in *
6  * the LICENSE.txt file. *
7  * *
8  * Idea by Rachel Davies, Original code by various *
9  *****************************************************************************/

10 package org.nanocontainer.aop.dynaop;
11
12 import org.nanocontainer.aop.AbstractAopTestCase;
13 import org.nanocontainer.aop.AspectsManager;
14 import org.nanocontainer.aop.ClassPointcut;
15 import org.nanocontainer.aop.ComponentPointcut;
16 import org.nanocontainer.aop.LoggingInterceptor;
17 import org.nanocontainer.aop.MethodPointcut;
18 import org.nanocontainer.aop.PointcutsFactory;
19 import org.nanocontainer.aop.defaults.AspectsComponentAdapterFactory;
20 import org.nanocontainer.testmodel.AnotherInterface;
21 import org.nanocontainer.testmodel.Dao;
22 import org.nanocontainer.testmodel.DaoImpl;
23 import org.nanocontainer.testmodel.IdGenerator;
24 import org.nanocontainer.testmodel.IdGeneratorImpl;
25 import org.nanocontainer.testmodel.Identifiable;
26 import org.nanocontainer.testmodel.IdentifiableMixin;
27 import org.nanocontainer.testmodel.OrderEntity;
28 import org.nanocontainer.testmodel.OrderEntityImpl;
29 import org.picocontainer.MutablePicoContainer;
30 import org.picocontainer.defaults.ComponentAdapterFactory;
31 import org.picocontainer.defaults.DefaultPicoContainer;
32
33 import java.lang.reflect.Method JavaDoc;
34
35 /**
36  * @author Stephen Molitor
37  */

38 public class DynaopAspectsManagerTestCase extends AbstractAopTestCase {
39
40     private AspectsManager aspects = new DynaopAspectsManager();
41     private ComponentAdapterFactory caFactory = new AspectsComponentAdapterFactory(aspects);
42     private MutablePicoContainer pico = new DefaultPicoContainer(caFactory);
43     private PointcutsFactory cuts = aspects.getPointcutsFactory();
44
45     public void testInterceptor() {
46         StringBuffer JavaDoc log = new StringBuffer JavaDoc();
47         aspects.registerInterceptor(cuts.instancesOf(Dao.class), cuts.allMethods(), new LoggingInterceptor(log));
48         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
49         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
50         verifyIntercepted(dao, log);
51     }
52
53     public void testContainerSuppliedInterceptor() {
54         aspects.registerInterceptor(cuts.instancesOf(Dao.class), cuts.allMethods(), LoggingInterceptor.class);
55
56         pico.registerComponentImplementation("log", StringBuffer JavaDoc.class);
57         pico.registerComponentImplementation(LoggingInterceptor.class);
58         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
59
60         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
61         StringBuffer JavaDoc log = (StringBuffer JavaDoc) pico.getComponentInstance("log");
62         verifyIntercepted(dao, log);
63     }
64
65     public void testComponentInterceptor() {
66         StringBuffer JavaDoc log = new StringBuffer JavaDoc();
67
68         aspects.registerInterceptor(cuts.component("intercepted"), cuts.allMethods(), new LoggingInterceptor(log));
69         pico.registerComponentImplementation("intercepted", DaoImpl.class);
70         pico.registerComponentImplementation("notIntercepted", DaoImpl.class);
71
72         Dao intercepted = (Dao) pico.getComponentInstance("intercepted");
73         Dao notIntercepted = (Dao) pico.getComponentInstance("notIntercepted");
74
75         verifyIntercepted(intercepted, log);
76         verifyNotIntercepted(notIntercepted, log);
77     }
78
79     public void testContainerSuppliedComponentInterceptor() {
80         aspects.registerInterceptor(cuts.component("intercepted"), cuts.allMethods(), LoggingInterceptor.class);
81
82         pico.registerComponentImplementation("log", StringBuffer JavaDoc.class);
83         pico.registerComponentImplementation(LoggingInterceptor.class);
84         pico.registerComponentImplementation("intercepted", DaoImpl.class);
85         pico.registerComponentImplementation("notIntercepted", DaoImpl.class);
86
87         StringBuffer JavaDoc log = (StringBuffer JavaDoc) pico.getComponentInstance("log");
88         Dao intercepted = (Dao) pico.getComponentInstance("intercepted");
89         Dao notIntercepted = (Dao) pico.getComponentInstance("notIntercepted");
90
91         verifyIntercepted(intercepted, log);
92         verifyNotIntercepted(notIntercepted, log);
93     }
94
95     public void testMixin() {
96         aspects.registerMixin(cuts.instancesOf(Dao.class), IdentifiableMixin.class);
97         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
98         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
99         verifyMixin(dao);
100         assertTrue(dao instanceof AnotherInterface);
101     }
102
103     public void testContainerSuppliedMixin() {
104         aspects.registerMixin(cuts.instancesOf(OrderEntity.class), IdentifiableMixin.class);
105         pico.registerComponentImplementation("order1", OrderEntityImpl.class);
106         pico.registerComponentImplementation("order2", OrderEntityImpl.class);
107
108         // register mixin dependency:
109
pico.registerComponentImplementation(IdGenerator.class, IdGeneratorImpl.class);
110
111         Identifiable order1 = (Identifiable) pico.getComponentInstance("order1");
112         Identifiable order2 = (Identifiable) pico.getComponentInstance("order2");
113
114         assertEquals(new Integer JavaDoc(1), order1.getId());
115         assertEquals(new Integer JavaDoc(2), order2.getId());
116
117         // order1 and order2 do NOT share the same mixin instance (usually a
118
// good thing),
119
// although their mixin instances do share the same IdGenerator
120
order1.setId(new Integer JavaDoc(42));
121         assertEquals(new Integer JavaDoc(42), order1.getId());
122         assertEquals(new Integer JavaDoc(2), order2.getId());
123     }
124
125     public void testContainerSuppliedMixinWithMixinExplicitlyRegistered() {
126         aspects.registerMixin(cuts.instancesOf(OrderEntity.class), IdentifiableMixin.class);
127         pico.registerComponentImplementation(IdentifiableMixin.class);
128         pico.registerComponentImplementation("order1", OrderEntityImpl.class);
129         pico.registerComponentImplementation("order2", OrderEntityImpl.class);
130
131         Identifiable order1 = (Identifiable) pico.getComponentInstance("order1");
132         Identifiable order2 = (Identifiable) pico.getComponentInstance("order2");
133
134         assertEquals(new Integer JavaDoc(1), order1.getId());
135         assertEquals(new Integer JavaDoc(1), order2.getId());
136
137         // order1 and order2 share the same IdentifiableMixin object (not
138
// usually what you want!)
139
order1.setId(new Integer JavaDoc(42));
140         assertEquals(new Integer JavaDoc(42), order1.getId());
141         assertEquals(new Integer JavaDoc(42), order2.getId());
142     }
143
144     public void testComponentMixin() {
145         pico.registerComponentImplementation("hasMixin", DaoImpl.class);
146         pico.registerComponentImplementation("noMixin", DaoImpl.class);
147
148         aspects.registerMixin(cuts.component("hasMixin"), IdentifiableMixin.class);
149
150         Dao hasMixin = (Dao) pico.getComponentInstance("hasMixin");
151         Dao noMixin = (Dao) pico.getComponentInstance("noMixin");
152
153         verifyMixin(hasMixin);
154         verifyNoMixin(noMixin);
155         assertTrue(hasMixin instanceof AnotherInterface);
156     }
157
158     public void testContainerSuppliedComponentMixin() {
159         aspects.registerMixin(cuts.componentName("hasMixin*"), new Class JavaDoc[]{Identifiable.class},
160                 IdentifiableMixin.class);
161
162         pico.registerComponentImplementation("hasMixin1", OrderEntityImpl.class);
163         pico.registerComponentImplementation("hasMixin2", OrderEntityImpl.class);
164         pico.registerComponentImplementation("noMixin", OrderEntityImpl.class);
165         pico.registerComponentImplementation(IdGenerator.class, IdGeneratorImpl.class);
166
167         Identifiable hasMixin1 = (Identifiable) pico.getComponentInstance("hasMixin1");
168         Identifiable hasMixin2 = (Identifiable) pico.getComponentInstance("hasMixin1");
169         OrderEntity noMixin = (OrderEntity) pico.getComponentInstance("noMixin");
170
171         assertFalse(noMixin instanceof Identifiable);
172         assertEquals(new Integer JavaDoc(1), hasMixin1.getId());
173         assertEquals(new Integer JavaDoc(2), hasMixin2.getId());
174
175         hasMixin1.setId(new Integer JavaDoc(42));
176         assertEquals(new Integer JavaDoc(42), hasMixin1.getId());
177         assertEquals(new Integer JavaDoc(2), hasMixin2.getId());
178     }
179
180     public void testMixinExplicitInterfaces() {
181         aspects.registerMixin(cuts.instancesOf(Dao.class), new Class JavaDoc[]{Identifiable.class}, IdentifiableMixin.class);
182         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
183         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
184         verifyMixin(dao);
185         assertFalse(dao instanceof AnotherInterface);
186     }
187
188     public void testComponentMixinExplicitInterfaces() {
189         pico.registerComponentImplementation("hasMixin", DaoImpl.class);
190         pico.registerComponentImplementation("noMixin", DaoImpl.class);
191
192         aspects.registerMixin(cuts.component("hasMixin"), new Class JavaDoc[]{Identifiable.class}, IdentifiableMixin.class);
193
194         Dao hasMixin = (Dao) pico.getComponentInstance("hasMixin");
195         Dao noMixin = (Dao) pico.getComponentInstance("noMixin");
196
197         verifyMixin(hasMixin);
198         verifyNoMixin(noMixin);
199
200         assertFalse(hasMixin instanceof AnotherInterface);
201     }
202
203     public void testCustomClassPointcut() {
204         StringBuffer JavaDoc log = new StringBuffer JavaDoc();
205
206         ClassPointcut customCut = new ClassPointcut() {
207             public boolean picks(Class JavaDoc clazz) {
208                 return true;
209             }
210         };
211
212         aspects.registerInterceptor(customCut, cuts.allMethods(), new LoggingInterceptor(log));
213         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
214         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
215         verifyIntercepted(dao, log);
216     }
217
218     public void testCustomMethodPointcut() {
219         StringBuffer JavaDoc log = new StringBuffer JavaDoc();
220
221         MethodPointcut customCut = new MethodPointcut() {
222             public boolean picks(Method JavaDoc method) {
223                 return true;
224             }
225         };
226
227         aspects.registerInterceptor(cuts.instancesOf(Dao.class), customCut, new LoggingInterceptor(log));
228         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
229         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
230         verifyIntercepted(dao, log);
231     }
232
233     public void testCustomComponentPointcut() {
234         StringBuffer JavaDoc log = new StringBuffer JavaDoc();
235
236         ComponentPointcut customCut = new ComponentPointcut() {
237             public boolean picks(Object JavaDoc componentKey) {
238                 return true;
239             }
240         };
241
242         aspects.registerInterceptor(customCut, cuts.allMethods(), new LoggingInterceptor(log));
243         pico.registerComponentImplementation(Dao.class, DaoImpl.class);
244         Dao dao = (Dao) pico.getComponentInstance(Dao.class);
245         verifyIntercepted(dao, log);
246     }
247
248 }
Popular Tags