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.

PR559.java 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import org.aspectj.testing.Tester;
  2. /**
  3. * This test case shows:
  4. * - no difference whether extending a class or aspect or interface
  5. * - underlying "within"-based pointcut works
  6. * - containing cflow-based pointcut does not
  7. * - true only of inherited pointcuts - member pointcuts work fine
  8. *
  9. * Note that to avoid pointcut cycles,
  10. * pointcuts exclude code within a common superinterface.
  11. * It is not enough (now) to exclude code in the advice's super-most class subclasses.
  12. *
  13. * @testcase PR#559 subclass advice not run for join points selected by superclass cflow-based pointcuts
  14. */
  15. public class PR559 {
  16. public static void main( String args[] ) {
  17. Tester.expectEvent("target aspect");
  18. Tester.expectEvent("inTarget class");
  19. Tester.expectEvent("inTarget aspect");
  20. Tester.expectEvent("inTargetFlow class");
  21. Tester.expectEvent("inTargetFlow aspect");
  22. Tester.expectEvent("TargetRun aspect");
  23. Tester.expectEvent("TargetRun class");
  24. Tester.expectEvent("TargetRunFlow aspect");
  25. Tester.expectEvent("TargetRunFlow class");
  26. Tester.expectEvent("TargetSubRunFlow aspect");
  27. Tester.expectEvent("TargetSubRunFlow class");
  28. new Target().run();
  29. Tester.checkAllEvents();
  30. }
  31. }
  32. interface AspectMarker {
  33. pointcut notInAspect() : ! within(AspectMarker+) && !preinitialization(new(..));
  34. pointcut allTarget() : execution(* Target.*(..)) ;
  35. pointcut allTargetFlow() : cflow(allTarget());
  36. pointcut inTarget() : notInAspect() && allTarget();
  37. pointcut inTargetFlow() : notInAspect() && allTargetFlow();
  38. }
  39. class Target {
  40. public void run(){ }
  41. }
  42. class Base implements AspectMarker {
  43. pointcut TargetRun ()
  44. : within(Target) && execution(* *(..)) && notInAspect() ;
  45. ;
  46. pointcut TargetRunFlow ()
  47. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  48. ;
  49. }
  50. /** @testcase PR#559 subaspect advice not run for superclass cflow-based pointcut */
  51. aspect Derived extends Base {
  52. pointcut TargetSubRunFlow ()
  53. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  54. ;
  55. Object around () : inTarget() {
  56. Tester.event("inTarget class");
  57. return proceed();
  58. }
  59. Object around () : inTargetFlow() {
  60. Tester.event("inTargetFlow class");
  61. return proceed();
  62. }
  63. Object around () : TargetRun() {
  64. Tester.event("TargetRun class");
  65. return proceed();
  66. }
  67. Object around () : TargetRunFlow() {
  68. Tester.event("TargetRunFlow class");
  69. return proceed();
  70. }
  71. Object around () : TargetSubRunFlow() {
  72. Tester.event("TargetSubRunFlow class");
  73. return proceed();
  74. }
  75. }
  76. abstract aspect BaseAspect implements AspectMarker {
  77. pointcut TargetRun ()
  78. : within(Target) && execution(* *(..)) && notInAspect() ;
  79. ;
  80. pointcut TargetRunFlow ()
  81. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  82. ;
  83. }
  84. /** @testcase PR#559 subaspect advice not run for superaspect cflow-based pointcut */
  85. aspect DerivedAspect extends BaseAspect implements AspectMarker {
  86. pointcut TargetSubRunFlow ()
  87. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  88. ;
  89. Object around () : TargetRun() {
  90. Tester.event("target aspect");
  91. return proceed();
  92. }
  93. Object around () : inTarget() { // TargetRun() {
  94. Tester.event("inTarget aspect");
  95. return proceed();
  96. }
  97. Object around () : inTargetFlow() { // TargetRun() {
  98. Tester.event("inTargetFlow aspect");
  99. return proceed();
  100. }
  101. Object around () : TargetRun() {
  102. Tester.event("TargetRun aspect");
  103. return proceed();
  104. }
  105. Object around () : TargetRunFlow() {
  106. Tester.event("TargetRunFlow aspect");
  107. return proceed();
  108. }
  109. Object around () : TargetSubRunFlow() {
  110. Tester.event("TargetSubRunFlow aspect");
  111. return proceed();
  112. }
  113. }