Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] advice precedence

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[quote Adrian Colyer::on 1/4/2005 3:18 PM]
| A good question to start the new year with :)
|
|> What is the rule for precedence between lets say a before, around and
|> an after advice defined in one single aspect and affecting the same
|> joinpoint ?
|
|> But when trying some with AJDT / AJ 1.2.0 on Eclipse 3.0.1 I have some
|> results that depends on the source code order of my advices:
|
| As you quote from the user guide:
|
|> "If the two pieces of advice are defined in the same aspect, then
|> there are two cases:
|>     * If either are after advice, then the one that appears later in
|> the aspect has precedence over the one that appears earlier.
|>     * Otherwise, then the one that appears earlier in the aspect has
|> precedence over the one that appears later. "
|
| On the "way in" to a join point, the advice with the highest precedence
| executes first, and on the "way out" the advice with the highest
| precedence executes last.
|
| Here "later in the aspect" means "later in the source file" - ie. exactly
| that the order depends on the order of the advice declarations in the
| source file.
|
|> "before, around, after" in source leads to
|> before
|> around -->
|>   hello
|> around --<
|> after
|
| This order is derived as follows:
|
| given the pair (before, around) then by the second clause the one that
| appears earlier in the source has precedence:
|
| before -> around
|
| given the pair(around, after) the by the first clause the after advice has
| precedence so we get:
|
| after -> around
|
| on the "way in" the highest precedence goes first so we see "before,
| around-entry" and on the way out the highest precedence goes last so we
| see "around-exit, after". Giving:
|
| before
| around-entry
| hello
| around-exit
| after
|
|> "around, before, after" in source leads to
|> around -->
|> before
|>   hello
|> around --<
|> after
|
| This order is derived as follows:
|
| given the pair (around, before) then by the second clause the one that
| appears earlier in the source has precedence:
|
| around -> before
|
| given the pair (around, after) then by the first clause the after advice
| has precedence:
|
| after -> around
|
| on the "way in" this gives us "around-entry, before" and on the "way-out"
| this gives us "around-exit, after". Giving:
|
| around-entry
| before
| hello
| around-exit
| after
|
|> "before, after, around" in source leads to a compilation error that
|> says "can't determine precedence between two or more pieces of advice
|> that apply to the same join point: method-execution(void
|>  preced.Preced.hello())"
|
| Applying the first rule to the pair (before, after) we see that the after
| advice has precedence:
|
| after -> before
|
| Applying the first rule to the pair (after, around) we see that the around
| advice has precedence:
|
| around -> after
|
| Applying the second rule to the pair (before, around), we see that the
| before advice has precedence:
|
| before -> around
|
| If we put these together we get: around -> after -> before -> around ->
| ...
| In previous versions of AspectJ I recall this being reported as a
| "circular precedence error" or some similar wording - but the error
| message has subsequently been improved to give the one that you witnessed.
|
| -- Adrian
| Adrian_Colyer@xxxxxxxxxx
|
|
Thanks for explanation. Very interesting. I would like to know why/rationale behind this solution.
My expectation would be that the lexical order inside a source to determine the precedence of same
type advices (precedence of all befores, precedence of all around, etc) and to assume that before is
always before, and so one.

many thanks in advance,
- --
:pope

|
| Alexandre Vasseur <avasseur@xxxxxxxxx>
| Sent by: aspectj-users-admin@xxxxxxxxxxx
| 03/01/2005 10:17
| Please respond to
| aspectj-users@xxxxxxxxxxx
|
|
| To
| aspectj-users@xxxxxxxxxxx
| cc
|
| Subject
| [aspectj-users] advice precedence
|
|
|
|
|
|
| Hi
|
| I discovered today that one of my assumption seems to be wrong.
| What is the rule for precedence between lets say a before, around and
| an after advice defined in one single aspect and affecting the same
| joinpoint ?
|
| In both Manning and Wiley books on AspectJ, I understood that it would
| happen like this:
| "before, around, after".
|
| But when trying some with AJDT / AJ 1.2.0 on Eclipse 3.0.1 I have some
| results that depends on the source code order of my advices:
|
| "before, around, after" in source leads to
| before
| around -->
|   hello
| around --<
| after
|
| "around, before, after" in source leads to  [ see the before nested
| within the around' proceed() ]
| around -->
| before
|   hello
| around --<
| after
|
| "before, after, around" in source leads to a compilation error that
| says "can't determine precedence between two or more pieces of advice
| that apply to the same join point: method-execution(void
|  preced.Preced.hello())"
|
|
| Reading the AspectJ Programming guide did not give me a clue except
| perhaps:
| "If the two pieces of advice are defined in the same aspect, then
| there are two cases:
|     * If either are after advice, then the one that appears later in
| the aspect has precedence over the one that appears earlier.
|     * Otherwise, then the one that appears earlier in the aspect has
| precedence over the one that appears later. "
|
| Does that means that there is no implicit rule that say that a before
| advice will execute before the around advice (as long as those are in
| the same aspect).
| Why the 3rd source order leads to a compilation error ?
|
|
| Below the little code snip
| Alex
|
| package preced;
| public class Preced {
|
|                  public void hello() {
|                                  System.out.println("  hello");
|                  }
|
|                  public static void main(String[] args) {
|                                  (new Preced()).hello();
|                  }
|
|                  static aspect MyAspect {
|                                  before() : execution(* *Preced.hello()) {
|  System.out.println("before");
|                                  }
|                                  Object around() : execution(*
| *Preced.hello()) {
|  System.out.println("around -->");
|                                                  proceed();
|  System.out.println("around --<");
|                                                  return null;
|                                  }
|                                  after() : execution(* *Preced.hello()) {
|  System.out.println("after");
|                                  }
|                  }
| }
| _______________________________________________
| aspectj-users mailing list
| aspectj-users@xxxxxxxxxxx
| http://dev.eclipse.org/mailman/listinfo/aspectj-users
|
|
| _______________________________________________
| aspectj-users mailing list
| aspectj-users@xxxxxxxxxxx
| http://dev.eclipse.org/mailman/listinfo/aspectj-users
|

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)

iD8DBQFB2psrTTDTje0R2dgRAriyAJ4+d+m0ArXzpD9Ivc5niuOX5wXNagCfaPkZ
czCTFL0bdA2jCuIS/PKDQyo=
=fBzF
-----END PGP SIGNATURE-----


Back to the top