1 package com.tirsen.nanning.config; 2 3 import com.tirsen.nanning.AspectException; 4 import com.tirsen.nanning.AspectInstance; 5 import com.tirsen.nanning.MethodInterceptor; 6 import com.tirsen.nanning.MixinInstance; 7 8 import java.lang.reflect.Method ; 9 10 public class InterceptorAspect implements Aspect { 11 public static final int SINGLETON = 0; 12 public static final int PER_METHOD = SINGLETON + 1; 13 public static final int PER_INSTANCE = PER_METHOD + 1; 14 15 private Class interceptorClass; 16 private int stateManagement; 17 private MethodInterceptor singletonInterceptor; 18 private Pointcut pointcut; 19 20 public InterceptorAspect(MethodInterceptor interceptor) { 21 this(new AllPointcut(), interceptor); 22 } 23 24 public InterceptorAspect(Class interceptorClass, int stateManagement) { 25 this(new AllPointcut(), interceptorClass, stateManagement); 26 } 27 28 public InterceptorAspect(Pointcut pointcut, Class interceptorClass, int stateManagement) { 29 this.stateManagement = stateManagement; 30 assert stateManagement == SINGLETON || stateManagement == PER_METHOD || stateManagement == PER_INSTANCE 31 : "SINGLETON, PER_METHOD and PER_INSTANCE is supported only, not " + stateManagement; 32 33 if (stateManagement == SINGLETON) { 34 singletonInterceptor = createInterceptor(); 35 } 36 37 setPointcut(pointcut); 38 39 this.interceptorClass = interceptorClass; 40 } 41 42 public void setPointcut(Pointcut pointcut) { 43 this.pointcut = pointcut; 44 } 45 46 public InterceptorAspect(Pointcut pointcut, MethodInterceptor interceptor) { 47 this.pointcut = pointcut; 48 singletonInterceptor = interceptor; 49 stateManagement = SINGLETON; 50 } 51 52 public Class getInterceptorClass() { 53 return interceptorClass; 54 } 55 56 public int getStateManagement() { 57 return stateManagement; 58 } 59 60 private MethodInterceptor createInterceptor() { 61 try { 62 return (MethodInterceptor) interceptorClass.newInstance(); 63 } catch (Exception e) { 64 throw new AspectException(e); 65 } 66 } 67 68 public void introduce(AspectInstance instance) { 69 } 70 71 Method [] getMethodsToAdvise(AspectInstance instance, MixinInstance mixin) { 72 return pointcut.methodsToAdvise(instance, mixin); 73 } 74 75 public void advise(AspectInstance instance) { 76 if (stateManagement == SINGLETON) { 77 pointcut.advise(instance, singletonInterceptor); 78 79 } else if (stateManagement == PER_INSTANCE) { 80 pointcut.advise(instance, createInterceptor()); 81 82 } else if (stateManagement == PER_METHOD) { 83 pointcut.advise(instance, interceptorClass); 84 85 } 86 } 87 88 public Pointcut getPointcut() { 89 return pointcut; 90 } 91 } 92 | Popular Tags |