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