KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > config > AbstractPointcut


1 package com.tirsen.nanning.config;
2
3 import com.tirsen.nanning.MixinInstance;
4 import com.tirsen.nanning.AspectInstance;
5 import com.tirsen.nanning.MethodInterceptor;
6 import com.tirsen.nanning.AspectException;
7
8 import java.util.Arrays JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.lang.reflect.Method JavaDoc;
13
14 import org.apache.commons.collections.CollectionUtils;
15 import org.apache.commons.collections.Predicate;
16
17 public abstract class AbstractPointcut implements Pointcut {
18     public Method JavaDoc[] methodsToAdvise(AspectInstance instance, MixinInstance mixin) {
19         List JavaDoc methods = new ArrayList JavaDoc(Arrays.asList(mixin.getAllMethods()));
20         CollectionUtils.filter(methods, new Predicate() {
21             public boolean evaluate(Object JavaDoc o) {
22                 return adviseMethod((Method JavaDoc) o);
23             }
24         });
25         return (Method JavaDoc[]) methods.toArray(new Method JavaDoc[methods.size()]);
26     }
27
28     public boolean adviseInstance(AspectInstance instance) {
29         return true;
30     }
31
32     public boolean adviseMixin(MixinInstance mixin) {
33         return true;
34     }
35
36     public void advise(AspectInstance instance, MethodInterceptor interceptor) {
37         advise(instance, interceptor, null);
38     }
39
40     public void advise(AspectInstance instance, Class JavaDoc interceptorClass) {
41         advise(instance, null, interceptorClass);
42     }
43
44     public void advise(AspectInstance instance, MethodInterceptor interceptor, Class JavaDoc interceptorClass) {
45         if (adviseInstance(instance)) {
46             List JavaDoc mixins = instance.getMixins();
47             for (Iterator JavaDoc iterator = mixins.iterator(); iterator.hasNext();) {
48                 MixinInstance mixin = (MixinInstance) iterator.next();
49                 if (adviseMixin(mixin)) {
50                     Method JavaDoc[] methods = methodsToAdvise(instance, mixin);
51                     for (int i = 0; i < methods.length; i++) {
52                         Method JavaDoc method = methods[i];
53                         if (interceptor != null) {
54                             mixin.addInterceptor(method, interceptor);
55                         } else if (interceptorClass != null) {
56                             try {
57                                 mixin.addInterceptor(method, (MethodInterceptor) interceptorClass.newInstance());
58                             } catch (Exception JavaDoc e) {
59                                 throw new AspectException(e);
60                             }
61                         } else {
62                             assert false : "interceptor or class needs to be specified";
63                         }
64                     }
65                 }
66             }
67         }
68     }
69
70     public abstract boolean adviseMethod(Method JavaDoc method);
71 }
72
Popular Tags