您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

PointcutExpressionImpl.java 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /* *******************************************************************
  2. * Copyright (c) 2004 IBM Corporation.
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Common Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/cpl-v10.html
  8. *
  9. * ******************************************************************/
  10. package org.aspectj.weaver.internal.tools;
  11. import java.lang.reflect.Constructor;
  12. import java.lang.reflect.Field;
  13. import java.lang.reflect.Member;
  14. import java.lang.reflect.Method;
  15. import org.aspectj.lang.JoinPoint;
  16. import org.aspectj.weaver.patterns.AbstractPatternNodeVisitor;
  17. import org.aspectj.weaver.patterns.ArgsAnnotationPointcut;
  18. import org.aspectj.weaver.patterns.ArgsPointcut;
  19. import org.aspectj.weaver.patterns.CflowPointcut;
  20. import org.aspectj.weaver.patterns.IfPointcut;
  21. import org.aspectj.weaver.patterns.NotAnnotationTypePattern;
  22. import org.aspectj.weaver.patterns.NotPointcut;
  23. import org.aspectj.weaver.patterns.Pointcut;
  24. import org.aspectj.weaver.patterns.ThisOrTargetAnnotationPointcut;
  25. import org.aspectj.weaver.patterns.ThisOrTargetPointcut;
  26. import org.aspectj.weaver.tools.FuzzyBoolean;
  27. import org.aspectj.weaver.tools.PointcutExpression;
  28. /**
  29. * Map from weaver.tools interface to internal Pointcut implementation...
  30. */
  31. public class PointcutExpressionImpl implements PointcutExpression {
  32. private Pointcut pointcut;
  33. private String expression;
  34. public PointcutExpressionImpl(Pointcut pointcut, String expression) {
  35. this.pointcut = pointcut;
  36. this.expression = expression;
  37. }
  38. public boolean couldMatchJoinPointsInType(Class aClass) {
  39. return pointcut.fastMatch(aClass).maybeTrue();
  40. }
  41. public boolean mayNeedDynamicTest() {
  42. HasPossibleDynamicContentVisitor visitor = new HasPossibleDynamicContentVisitor();
  43. pointcut.traverse(visitor, null);
  44. return visitor.hasDynamicContent();
  45. }
  46. /* (non-Javadoc)
  47. * @see org.aspectj.weaver.tools.PointcutExpression#matchesMethodCall(java.lang.reflect.Method, java.lang.Class, java.lang.Class, java.lang.reflect.Member)
  48. */
  49. public FuzzyBoolean matchesMethodCall(Method aMethod, Class thisClass,
  50. Class targetClass, Member withinCode) {
  51. return fuzzyMatch(pointcut.matchesStatically(
  52. JoinPoint.METHOD_CALL,
  53. aMethod,
  54. thisClass,
  55. targetClass,
  56. withinCode));
  57. }
  58. /* (non-Javadoc)
  59. * @see org.aspectj.weaver.tools.PointcutExpression#matchesMethodExecution(java.lang.reflect.Method, java.lang.Class)
  60. */
  61. public FuzzyBoolean matchesMethodExecution(Method aMethod, Class thisClass) {
  62. return fuzzyMatch(pointcut.matchesStatically(
  63. JoinPoint.METHOD_EXECUTION,
  64. aMethod,
  65. thisClass,
  66. thisClass,
  67. null));
  68. }
  69. /* (non-Javadoc)
  70. * @see org.aspectj.weaver.tools.PointcutExpression#matchesConstructorCall(java.lang.reflect.Constructor, java.lang.Class, java.lang.reflect.Member)
  71. */
  72. public FuzzyBoolean matchesConstructorCall(Constructor aConstructor,
  73. Class thisClass, Member withinCode) {
  74. return fuzzyMatch(pointcut.matchesStatically(
  75. JoinPoint.CONSTRUCTOR_CALL,
  76. aConstructor,
  77. thisClass,
  78. aConstructor.getDeclaringClass(),
  79. withinCode));
  80. }
  81. /* (non-Javadoc)
  82. * @see org.aspectj.weaver.tools.PointcutExpression#matchesConstructorExecution(java.lang.reflect.Constructor)
  83. */
  84. public FuzzyBoolean matchesConstructorExecution(Constructor aConstructor, Class thisClass) {
  85. return fuzzyMatch(pointcut.matchesStatically(
  86. JoinPoint.CONSTRUCTOR_EXECUTION,
  87. aConstructor,
  88. thisClass,
  89. thisClass,
  90. null));
  91. }
  92. /* (non-Javadoc)
  93. * @see org.aspectj.weaver.tools.PointcutExpression#matchesAdviceExecution(java.lang.reflect.Method, java.lang.Class)
  94. */
  95. public FuzzyBoolean matchesAdviceExecution(Method anAdviceMethod,
  96. Class thisClass) {
  97. return fuzzyMatch(pointcut.matchesStatically(
  98. JoinPoint.ADVICE_EXECUTION,
  99. anAdviceMethod,
  100. thisClass,
  101. thisClass,
  102. null));
  103. }
  104. /* (non-Javadoc)
  105. * @see org.aspectj.weaver.tools.PointcutExpression#matchesHandler(java.lang.Class, java.lang.Class, java.lang.reflect.Member)
  106. */
  107. public FuzzyBoolean matchesHandler(Class exceptionType, Class inClass,
  108. Member withinCode) {
  109. return fuzzyMatch(pointcut.matchesStatically(
  110. JoinPoint.EXCEPTION_HANDLER,
  111. new Handler(inClass,exceptionType),
  112. inClass,
  113. inClass,
  114. withinCode));
  115. }
  116. /* (non-Javadoc)
  117. * @see org.aspectj.weaver.tools.PointcutExpression#matchesInitialization(java.lang.reflect.Constructor)
  118. */
  119. public FuzzyBoolean matchesInitialization(Constructor aConstructor) {
  120. return fuzzyMatch(pointcut.matchesStatically(
  121. JoinPoint.INITIALIZATION,
  122. aConstructor,
  123. aConstructor.getDeclaringClass(),
  124. aConstructor.getDeclaringClass(),
  125. null));
  126. }
  127. /* (non-Javadoc)
  128. * @see org.aspectj.weaver.tools.PointcutExpression#matchesPreInitialization(java.lang.reflect.Constructor)
  129. */
  130. public FuzzyBoolean matchesPreInitialization(Constructor aConstructor) {
  131. return fuzzyMatch(pointcut.matchesStatically(
  132. JoinPoint.PREINTIALIZATION,
  133. aConstructor,
  134. aConstructor.getDeclaringClass(),
  135. aConstructor.getDeclaringClass(),
  136. null));
  137. }
  138. /* (non-Javadoc)
  139. * @see org.aspectj.weaver.tools.PointcutExpression#matchesStaticInitialization(java.lang.Class)
  140. */
  141. public FuzzyBoolean matchesStaticInitialization(Class aClass) {
  142. return fuzzyMatch(pointcut.matchesStatically(
  143. JoinPoint.STATICINITIALIZATION,
  144. null,
  145. aClass,
  146. aClass,
  147. null
  148. ));
  149. }
  150. /* (non-Javadoc)
  151. * @see org.aspectj.weaver.tools.PointcutExpression#matchesFieldSet(java.lang.reflect.Field, java.lang.Class, java.lang.Class, java.lang.reflect.Member)
  152. */
  153. public FuzzyBoolean matchesFieldSet(Field aField, Class thisClass,
  154. Class targetClass, Member withinCode) {
  155. return fuzzyMatch(pointcut.matchesStatically(
  156. JoinPoint.FIELD_SET,
  157. aField,
  158. thisClass,
  159. targetClass,
  160. withinCode));
  161. }
  162. /* (non-Javadoc)
  163. * @see org.aspectj.weaver.tools.PointcutExpression#matchesFieldGet(java.lang.reflect.Field, java.lang.Class, java.lang.Class, java.lang.reflect.Member)
  164. */
  165. public FuzzyBoolean matchesFieldGet(Field aField, Class thisClass,
  166. Class targetClass, Member withinCode) {
  167. return fuzzyMatch(pointcut.matchesStatically(
  168. JoinPoint.FIELD_GET,
  169. aField,
  170. thisClass,
  171. targetClass,
  172. withinCode));
  173. }
  174. /* (non-Javadoc)
  175. * @see org.aspectj.weaver.tools.PointcutExpression#matchesDynamically(java.lang.Object, java.lang.Object, java.lang.Object[])
  176. */
  177. public boolean matchesDynamically(Object thisObject, Object targetObject,
  178. Object[] args) {
  179. return pointcut.matchesDynamically(thisObject,targetObject,args);
  180. }
  181. /* (non-Javadoc)
  182. * @see org.aspectj.weaver.tools.PointcutExpression#getPointcutExpression()
  183. */
  184. public String getPointcutExpression() {
  185. return expression;
  186. }
  187. private FuzzyBoolean fuzzyMatch(org.aspectj.util.FuzzyBoolean fb) {
  188. if (fb == org.aspectj.util.FuzzyBoolean.YES) return FuzzyBoolean.YES;
  189. if (fb == org.aspectj.util.FuzzyBoolean.NO) return FuzzyBoolean.NO;
  190. if (fb == org.aspectj.util.FuzzyBoolean.MAYBE) return FuzzyBoolean.MAYBE;
  191. throw new IllegalArgumentException("Cant match FuzzyBoolean " + fb);
  192. }
  193. private static class HasPossibleDynamicContentVisitor extends AbstractPatternNodeVisitor {
  194. private boolean hasDynamicContent = false;
  195. public boolean hasDynamicContent() { return hasDynamicContent; }
  196. public Object visit(ArgsAnnotationPointcut node, Object data) {
  197. hasDynamicContent = true;
  198. return null;
  199. }
  200. public Object visit(ArgsPointcut node, Object data) {
  201. hasDynamicContent = true;
  202. return null;
  203. }
  204. public Object visit(CflowPointcut node, Object data) {
  205. hasDynamicContent = true;
  206. return null;
  207. }
  208. public Object visit(IfPointcut node, Object data) {
  209. hasDynamicContent = true;
  210. return null;
  211. }
  212. public Object visit(NotAnnotationTypePattern node, Object data) {
  213. return node.getNegatedPattern().accept(this, data);
  214. }
  215. public Object visit(NotPointcut node, Object data) {
  216. return node.getNegatedPointcut().accept(this, data);
  217. }
  218. public Object visit(ThisOrTargetAnnotationPointcut node, Object data) {
  219. hasDynamicContent = true;
  220. return null;
  221. }
  222. public Object visit(ThisOrTargetPointcut node, Object data) {
  223. hasDynamicContent = true;
  224. return null;
  225. }
  226. }
  227. public static class Handler implements Member {
  228. private Class decClass;
  229. private Class exType;
  230. public Handler(Class decClass, Class exType) {
  231. this.decClass = decClass;
  232. this.exType = exType;
  233. }
  234. public int getModifiers() {
  235. return 0;
  236. }
  237. public Class getDeclaringClass() {
  238. return decClass;
  239. }
  240. public String getName() {
  241. return null;
  242. }
  243. public Class getHandledExceptionType() {
  244. return exType;
  245. }
  246. public boolean isSynthetic() {
  247. return false;
  248. }
  249. }
  250. }