1 package org.codehaus.nanning.config;
2
3 import org.codehaus.nanning.config.Pointcut;
4 import org.codehaus.nanning.Mixin;
5 import org.codehaus.nanning.AspectInstance;
6 import org.codehaus.nanning.MethodInterceptor;
7 import org.codehaus.nanning.attribute.Attributes;
8
9 import java.lang.reflect.Method;
10 import java.util.regex.Pattern;
11 import java.util.Iterator;
12
13 public class P {
14 public static Pointcut and(Pointcut pointcut1, Pointcut pointcut2) {
15 return new And(pointcut1, pointcut2);
16 }
17
18 public static Pointcut all() {
19 return new All();
20 }
21
22 public static Pointcut isMixinInterface(final Class interfaceClass) {
23 return new IsMixinInterface(interfaceClass);
24 }
25
26 public static Pointcut not(final Pointcut pointcut) {
27 return new Not(pointcut);
28 }
29
30 public static Pointcut methodAttribute(String attribute) {
31 return new MethodAttribute(attribute);
32 }
33
34 public static Pointcut empty() {
35 return new Pointcut() {
36 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
37 return false;
38 }
39 };
40 }
41
42 public static Pointcut or(final Pointcut pointcut1, final Pointcut pointcut2) {
43 return new Or(pointcut1, pointcut2);
44 }
45
46 public static Pointcut methodName(final String pattern) {
47 return new MethodName(pattern);
48 }
49
50 public static Pointcut classAttribute(final String attribute) {
51 return new ClassAttribute(attribute);
52 }
53
54 public static Pointcut isClass(final Class classIdentifier) {
55 return new IsClass(classIdentifier);
56 }
57
58 public static class And extends Pointcut {
59 private Pointcut pointcut1;
60 private Pointcut pointcut2;
61
62 public And(Pointcut pointcut1, Pointcut pointcut2) {
63 this.pointcut1 = pointcut1;
64 this.pointcut2 = pointcut2;
65 }
66
67 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
68 return pointcut1.adviseMethod(instance, mixin, method) && pointcut2.adviseMethod(instance, mixin, method);
69 }
70 }
71
72 private static class Not extends Pointcut {
73 private final Pointcut pointcut;
74
75 public Not(Pointcut pointcut) {
76 this.pointcut = pointcut;
77 }
78
79 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
80 return !pointcut.adviseMethod(instance, mixin, method);
81 }
82 }
83
84 public static class All extends Pointcut {
85 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
86 return true;
87 }
88
89 public boolean introduceOn(AspectInstance instance) {
90 return true;
91 }
92 }
93
94 private static class IsMixinInterface extends Pointcut {
95 private final Class interfaceClass;
96
97 public IsMixinInterface(Class interfaceClass) {
98 this.interfaceClass = interfaceClass;
99 }
100
101 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
102 return checkMixin(mixin);
103 }
104
105 private boolean checkMixin(Mixin mixin) {
106 return mixin.getInterfaceClass() == interfaceClass;
107 }
108
109 public boolean introduceOn(AspectInstance instance) {
110 for (Iterator iterator = instance.getMixins().iterator(); iterator.hasNext();) {
111 Mixin mixin = (Mixin) iterator.next();
112 if (checkMixin(mixin)) {
113 return true;
114 }
115 }
116 return false;
117 }
118 }
119
120 public static class MethodAttribute extends Pointcut {
121 private String attribute;
122
123 public MethodAttribute(String attribute) {
124 this.attribute = attribute;
125 }
126
127 public String getAttribute() {
128 return attribute;
129 }
130
131 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
132 return Attributes.hasAttribute(method, attribute);
133 }
134 }
135
136 private static class Or extends Pointcut {
137 private final Pointcut pointcut1;
138 private final Pointcut pointcut2;
139
140 public Or(Pointcut pointcut1, Pointcut pointcut2) {
141 this.pointcut1 = pointcut1;
142 this.pointcut2 = pointcut2;
143 }
144
145 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
146 return pointcut1.adviseMethod(instance, mixin, method) || pointcut2.adviseMethod(instance, mixin, method);
147 }
148 }
149
150 private static class MethodName extends Pointcut {
151 private final Pattern pattern;
152
153 public MethodName(String pattern) {
154 this.pattern = Pattern.compile(pattern);
155 }
156
157 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
158 return pattern.matcher(method.getName()).matches();
159 }
160 }
161
162 private static class ClassAttribute extends Pointcut {
163 private final String attribute;
164
165 public ClassAttribute(String attribute) {
166 this.attribute = attribute;
167 }
168
169 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
170 return matches(instance);
171 }
172
173 public boolean introduceOn(AspectInstance instance) {
174 return matches(instance);
175 }
176
177 private boolean matches(AspectInstance instance) {
178 return Attributes.hasInheritedAttribute(instance.getClassIdentifier(), attribute);
179 }
180 }
181
182 private static class IsClass extends Pointcut {
183 private final Class classIdentifier;
184
185 public IsClass(Class classIdentifier) {
186 this.classIdentifier = classIdentifier;
187 }
188
189 public boolean introduceOn(AspectInstance instance) {
190 return matches(instance);
191 }
192
193 private boolean matches(AspectInstance instance) {
194 return classIdentifier.equals(instance.getClassIdentifier());
195 }
196
197 public boolean adviseMethod(AspectInstance instance, Mixin mixin, Method method) {
198 return matches(instance);
199 }
200 }
201 }
This page was automatically generated by Maven