You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PointcutDesignatorHandlerTest.java 9.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /* *******************************************************************
  2. * Copyright (c) 2005 Contributors.
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * Adrian Colyer Initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.tools;
  13. import org.aspectj.util.LangUtil;
  14. import junit.framework.TestCase;
  15. /**
  16. * @author Adrian Colyer
  17. *
  18. */
  19. public class PointcutDesignatorHandlerTest extends TestCase {
  20. boolean needToSkip = false;
  21. protected void setUp() throws Exception {
  22. super.setUp();
  23. needToSkip = needToSkipPointcutParserTests();
  24. }
  25. /** this condition can occur on the build machine only, and is way too complex to fix right now... */
  26. private boolean needToSkipPointcutParserTests() {
  27. if (!LangUtil.is15VMOrGreater()) return false;
  28. try {
  29. Class.forName("org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate",false,this.getClass().getClassLoader());//ReflectionBasedReferenceTypeDelegate.class.getClassLoader());
  30. } catch (ClassNotFoundException cnfEx) {
  31. return true;
  32. }
  33. return false;
  34. }
  35. public void testParseWithoutHandler() {
  36. if (needToSkip) return;
  37. try {
  38. PointcutParser
  39. .getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution()
  40. .parsePointcutExpression("bean(service.*");
  41. fail("should not be able to parse bean(service.*)");
  42. } catch(IllegalArgumentException ex) {
  43. assertTrue("contains bean",ex.getMessage().indexOf("bean") != -1);
  44. }
  45. }
  46. public void testParseWithHandler() {
  47. if (needToSkip) return;
  48. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  49. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  50. parser.registerPointcutDesignatorHandler(beanHandler);
  51. parser.parsePointcutExpression("bean(service.*)");
  52. assertEquals("service.*",beanHandler.getExpressionLastAskedToParse());
  53. }
  54. /*
  55. * Bug 205907 - the registered pointcut designator does not also get registered with the
  56. * InternalUseOnlyPointcutParser inside the Java15ReflectionBasedReferenceTypeDelegate code. First test checks
  57. * parsing is OK
  58. */
  59. public void testParsingBeanInReferencePointcut01() throws Exception {
  60. if (needToSkip) return;
  61. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  62. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  63. parser.registerPointcutDesignatorHandler(beanHandler);
  64. // The pointcut in CounterAspect look as follows:
  65. //
  66. // @Pointcut("execution(* setAge(..)) && bean(testBean1)")
  67. // public void testBean1SetAge() { }
  68. // This should be found and resolved
  69. // PointcutExpression pc =
  70. parser.parsePointcutExpression("CounterAspect.testBean1SetAge()");
  71. }
  72. /*
  73. * Bug 205907 - the registered pointcut designator does not also get registered with the
  74. * InternalUseOnlyPointcutParser inside the Java15ReflectionBasedReferenceTypeDelegate code. This test checks the
  75. * actual matching.
  76. */
  77. public void testParsingBeanInReferencePointcut02() throws Exception {
  78. if (needToSkip) return;
  79. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  80. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  81. parser.registerPointcutDesignatorHandler(beanHandler);
  82. // The pointcut in CounterAspect look as follows:
  83. //
  84. // @Pointcut("execution(* toString(..)) && bean(testBean1)")
  85. // public void testBean1toString() { }
  86. // This should be found and resolved
  87. PointcutExpression pc = parser.parsePointcutExpression("CounterAspect.testBean1toString()");
  88. DefaultMatchingContext context = new DefaultMatchingContext();
  89. context.addContextBinding("beanName", "testBean1");
  90. pc.setMatchingContext(context);
  91. ShadowMatch sm = pc.matchesMethodExecution(Object.class.getMethod("toString", new Class[0]));
  92. assertTrue(sm.alwaysMatches());
  93. sm = pc.matchesMethodExecution(Object.class.getMethod("hashCode", new Class[0]));
  94. assertTrue(sm.neverMatches());
  95. context = new DefaultMatchingContext();
  96. context.addContextBinding("beanName", "testBean2");
  97. pc.setMatchingContext(context);
  98. sm = pc.matchesMethodExecution(Object.class.getMethod("toString", new Class[0]));
  99. assertTrue(sm.neverMatches());
  100. }
  101. public void testParseWithHandlerAndMultipleSegments() {
  102. if (needToSkip) return;
  103. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  104. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  105. parser.registerPointcutDesignatorHandler(beanHandler);
  106. parser.parsePointcutExpression("bean(org.xyz.someapp..*)");
  107. assertEquals("org.xyz.someapp..*",beanHandler.getExpressionLastAskedToParse());
  108. }
  109. public void testStaticMatch() throws Exception {
  110. if (needToSkip) return;
  111. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  112. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  113. parser.registerPointcutDesignatorHandler(beanHandler);
  114. PointcutExpression pc = parser.parsePointcutExpression("bean(myBean)");
  115. DefaultMatchingContext context = new DefaultMatchingContext();
  116. context.addContextBinding("beanName","myBean");
  117. pc.setMatchingContext(context);
  118. ShadowMatch sm = pc.matchesMethodExecution(Object.class.getMethod("toString",new Class[0]));
  119. assertTrue(sm.alwaysMatches());
  120. context.addContextBinding("beanName", "notMyBean");
  121. sm = pc.matchesMethodExecution(Object.class.getMethod("toString",new Class[0]));
  122. assertTrue(sm.neverMatches());
  123. }
  124. public void testDynamicMatch() throws Exception {
  125. if (needToSkip) return;
  126. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  127. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  128. beanHandler.simulateDynamicTest = true;
  129. parser.registerPointcutDesignatorHandler(beanHandler);
  130. PointcutExpression pc = parser.parsePointcutExpression("bean(myBean)");
  131. ShadowMatch sm = pc.matchesMethodExecution(Object.class.getMethod("toString",new Class[0]));
  132. DefaultMatchingContext context = new DefaultMatchingContext();
  133. assertTrue(sm.maybeMatches());
  134. assertFalse(sm.alwaysMatches());
  135. assertFalse(sm.neverMatches());
  136. context.addContextBinding("beanName","myBean");
  137. sm.setMatchingContext(context);
  138. assertTrue(sm.matchesJoinPoint(null, null, null).matches());
  139. context.addContextBinding("beanName", "notMyBean");
  140. assertFalse(sm.matchesJoinPoint(null, null, null).matches());
  141. }
  142. public void testFastMatch() {
  143. if (needToSkip) return;
  144. PointcutParser parser = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution();
  145. BeanDesignatorHandler beanHandler = new BeanDesignatorHandler();
  146. parser.registerPointcutDesignatorHandler(beanHandler);
  147. PointcutExpression pc = parser.parsePointcutExpression("bean(myBean)");
  148. DefaultMatchingContext context = new DefaultMatchingContext();
  149. context.addContextBinding("beanName","myBean");
  150. pc.setMatchingContext(context);
  151. assertTrue(pc.couldMatchJoinPointsInType(String.class));
  152. context.addContextBinding("beanName","yourBean");
  153. assertFalse(pc.couldMatchJoinPointsInType(String.class));
  154. }
  155. private class BeanDesignatorHandler implements PointcutDesignatorHandler {
  156. private String askedToParse;
  157. public boolean simulateDynamicTest = false;
  158. public String getDesignatorName() {
  159. return "bean";
  160. }
  161. /* (non-Javadoc)
  162. * @see org.aspectj.weaver.tools.PointcutDesignatorHandler#parse(java.lang.String)
  163. */
  164. public ContextBasedMatcher parse(String expression) {
  165. this.askedToParse = expression;
  166. return new BeanPointcutExpression(expression,this.simulateDynamicTest);
  167. }
  168. public String getExpressionLastAskedToParse() {
  169. return this.askedToParse;
  170. }
  171. }
  172. private class BeanPointcutExpression implements ContextBasedMatcher {
  173. private final String beanNamePattern;
  174. private final boolean simulateDynamicTest;
  175. public BeanPointcutExpression(String beanNamePattern, boolean simulateDynamicTest) {
  176. this.beanNamePattern = beanNamePattern;
  177. this.simulateDynamicTest = simulateDynamicTest;
  178. }
  179. public boolean couldMatchJoinPointsInType(Class aClass) {
  180. return true;
  181. }
  182. /* (non-Javadoc)
  183. * @see org.aspectj.weaver.tools.ContextBasedMatcher#couldMatchJoinPointsInType(java.lang.Class)
  184. */
  185. public boolean couldMatchJoinPointsInType(Class aClass, MatchingContext context) {
  186. if (this.beanNamePattern.equals(context.getBinding("beanName"))) {
  187. return true;
  188. } else {
  189. return false;
  190. }
  191. }
  192. /* (non-Javadoc)
  193. * @see org.aspectj.weaver.tools.ContextBasedMatcher#mayNeedDynamicTest()
  194. */
  195. public boolean mayNeedDynamicTest() {
  196. return this.simulateDynamicTest;
  197. }
  198. public FuzzyBoolean matchesStatically(MatchingContext matchContext) {
  199. if (this.simulateDynamicTest) return FuzzyBoolean.MAYBE;
  200. if (this.beanNamePattern.equals(matchContext.getBinding("beanName"))) {
  201. return FuzzyBoolean.YES;
  202. } else {
  203. return FuzzyBoolean.NO;
  204. }
  205. }
  206. /* (non-Javadoc)
  207. * @see org.aspectj.weaver.tools.ContextBasedMatcher#matchesDynamically(org.aspectj.weaver.tools.MatchingContext)
  208. */
  209. public boolean matchesDynamically(MatchingContext matchContext) {
  210. return this.beanNamePattern.equals(matchContext.getBinding("beanName"));
  211. }
  212. }
  213. }