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

21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
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. }