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 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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+) &&
  34. !preinitialization(new(..)) && !initialization(new(..));
  35. pointcut allTarget() : execution(* Target.*(..)) ;
  36. pointcut allTargetFlow() : cflow(allTarget());
  37. pointcut inTarget() : notInAspect() && allTarget();
  38. pointcut inTargetFlow() : notInAspect() && allTargetFlow();
  39. }
  40. class Target {
  41. public void run(){ }
  42. }
  43. class Base implements AspectMarker {
  44. pointcut TargetRun ()
  45. : within(Target) && execution(* *(..)) && notInAspect() ;
  46. ;
  47. pointcut TargetRunFlow ()
  48. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  49. ;
  50. }
  51. /** @testcase PR#559 subaspect advice not run for superclass cflow-based pointcut */
  52. aspect Derived extends Base {
  53. pointcut TargetSubRunFlow ()
  54. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  55. ;
  56. Object around () : inTarget() {
  57. Tester.event("inTarget class");
  58. return proceed();
  59. }
  60. Object around () : inTargetFlow() {
  61. Tester.event("inTargetFlow class");
  62. return proceed();
  63. }
  64. Object around () : TargetRun() {
  65. Tester.event("TargetRun class");
  66. return proceed();
  67. }
  68. Object around () : TargetRunFlow() {
  69. Tester.event("TargetRunFlow class");
  70. return proceed();
  71. }
  72. Object around () : TargetSubRunFlow() {
  73. Tester.event("TargetSubRunFlow class");
  74. return proceed();
  75. }
  76. }
  77. abstract aspect BaseAspect implements AspectMarker {
  78. pointcut TargetRun ()
  79. : within(Target) && execution(* *(..)) && notInAspect() ;
  80. ;
  81. pointcut TargetRunFlow ()
  82. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  83. ;
  84. }
  85. /** @testcase PR#559 subaspect advice not run for superaspect cflow-based pointcut */
  86. aspect DerivedAspect extends BaseAspect implements AspectMarker {
  87. pointcut TargetSubRunFlow ()
  88. : cflow(within(Target) && execution(* *(..))) && notInAspect()
  89. ;
  90. Object around () : TargetRun() {
  91. Tester.event("target aspect");
  92. return proceed();
  93. }
  94. Object around () : inTarget() { // TargetRun() {
  95. Tester.event("inTarget aspect");
  96. return proceed();
  97. }
  98. Object around () : inTargetFlow() { // TargetRun() {
  99. Tester.event("inTargetFlow aspect");
  100. return proceed();
  101. }
  102. Object around () : TargetRun() {
  103. Tester.event("TargetRun aspect");
  104. return proceed();
  105. }
  106. Object around () : TargetRunFlow() {
  107. Tester.event("TargetRunFlow aspect");
  108. return proceed();
  109. }
  110. Object around () : TargetSubRunFlow() {
  111. Tester.event("TargetSubRunFlow aspect");
  112. return proceed();
  113. }
  114. }