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 ; 9 import java.util.Iterator ; 10 import java.util.List ; 11 import java.util.ArrayList ; 12 import java.lang.reflect.Method ; 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 [] methodsToAdvise(AspectInstance instance, MixinInstance mixin) { 19 List methods = new ArrayList (Arrays.asList(mixin.getAllMethods())); 20 CollectionUtils.filter(methods, new Predicate() { 21 public boolean evaluate(Object o) { 22 return adviseMethod((Method ) o); 23 } 24 }); 25 return (Method []) methods.toArray(new Method [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 interceptorClass) { 41 advise(instance, null, interceptorClass); 42 } 43 44 public void advise(AspectInstance instance, MethodInterceptor interceptor, Class interceptorClass) { 45 if (adviseInstance(instance)) { 46 List mixins = instance.getMixins(); 47 for (Iterator iterator = mixins.iterator(); iterator.hasNext();) { 48 MixinInstance mixin = (MixinInstance) iterator.next(); 49 if (adviseMixin(mixin)) { 50 Method [] methods = methodsToAdvise(instance, mixin); 51 for (int i = 0; i < methods.length; i++) { 52 Method 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 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 method); 71 } 72 | Popular Tags |