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

пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
пре 21 година
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. }