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.

AdviceOrdering.java 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import org.aspectj.testing.*;
  2. public class AdviceOrdering {
  3. public static void main(String[] args) { test(); }
  4. public static void test() {
  5. new C().m();
  6. T.checkAndReset("before:aroundStart:m:aroundEnd:after:afterReturning");
  7. new C().recur(2);
  8. T.checkAndReset("P&&!cflowbelow(P):P:recur-2:P:recur-1:P:recur-0");
  9. new C().a();
  10. T.checkAndReset("C1:C2:C3:C4:A3:A4:A1:A2:B1:a");
  11. }
  12. }
  13. class T {
  14. private static StringBuffer order = new StringBuffer();
  15. public static void add(String s) {
  16. if (order.length() > 0) { order.append(':'); }
  17. order.append(s);
  18. }
  19. public static void reset() { order = new StringBuffer(); }
  20. public static void checkAndReset(String expectedValue) {
  21. Tester.checkEqual(order.toString(), expectedValue);
  22. order.setLength(0);
  23. }
  24. }
  25. class C {
  26. public void m() { T.add("m"); }
  27. public void a() { T.add("a"); }
  28. public void b() { T.add("b"); }
  29. public void c() { T.add("c"); }
  30. public void recur(int n) {
  31. T.add("recur-"+n);
  32. if (n > 0) recur(n-1);
  33. }
  34. }
  35. aspect A {
  36. pointcut cut() : target(C) && call(void m());
  37. before(): cut() { T.add("before"); }
  38. void around(): cut() {
  39. T.add("aroundStart");
  40. proceed();
  41. T.add("aroundEnd");
  42. }
  43. after(): cut() { T.add("after"); }
  44. after() returning(): cut() { T.add("afterReturning"); }
  45. }
  46. //check that P && !cflow(P) never matches anything regardless of ordering issues
  47. aspect FlowCheck {
  48. pointcut cut() : target(C) && call(void recur(int));
  49. before(): cut() && !cflow(cut()) {
  50. // should never run
  51. T.add("P&&!cflow(P)");
  52. }
  53. before(): cut() && !cflowbelow(cut()) {
  54. // should run once
  55. T.add("P&&!cflowbelow(P)");
  56. }
  57. before(): cut() && cflow(cut() && !cflow(cut())) {
  58. // should never run
  59. T.add("cflow(P&&!cflow(P))");
  60. }
  61. before(): cut() {
  62. T.add("P");
  63. }
  64. }
  65. // This cluster of aspects checks that the partial order rules work
  66. //aspect A1 dominates A2, B1 {
  67. aspect A1 { declare precedence: A1, A2 || B1;
  68. pointcut cut() : target(C) && call(void a());
  69. before(): A1.cut() { T.add("A1"); }
  70. }
  71. aspect A2 { declare precedence: A2, B1;
  72. before(): A1.cut() { T.add("A2"); }
  73. }
  74. aspect A3 { declare precedence: A3, A4, A1;
  75. before(): A1.cut() { T.add("A3"); }
  76. }
  77. aspect A4 { declare precedence: A4, A1;
  78. before(): A1.cut() { T.add("A4"); }
  79. }
  80. aspect B1 {
  81. before(): A1.cut() { T.add("B1"); }
  82. }
  83. //aspect C1 dominates C2, C3 {
  84. aspect C1 { declare precedence: C1, C2 || C3;
  85. before(): A1.cut() { T.add("C1"); }
  86. }
  87. aspect C2 { declare precedence: C2, C3;
  88. before(): A1.cut() { T.add("C2"); }
  89. }
  90. aspect C3 { declare precedence: C3, C4;
  91. before(): A1.cut() { T.add("C3"); }
  92. }
  93. //aspect C4 dominates A1, A2, A3, A4, B1 {
  94. aspect C4 { declare precedence: C4, (A1 || A2 || A3 || A4 || B1);
  95. before(): A1.cut() { T.add("C4"); }
  96. }