[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] generate a StackTraceElement

> match any joinpoint that occurs during the 
> execution of an advice which has
> a JoinPoint parameter. What I am missing?

Your pointcut didn't pick out any join points.  Did you try 
it on Valerio's code?

It works only if there is exactly one JoinPoint arg.  You'll
find some variation in the current implementation of advice.  
And since the compiler  does not currently support 
args(.., JoinPoint, ..), the reflective approach is 
what works.  

And to state it clearly: there's no guarantee that there will
be any JoinPoint parameter to advice in this or any other 
version of AspectJ.  (Nor is there any guarantee that the
context bound in the advice will be a parameter to the 
advice.)

Wes

> ------------Original Message------------
> From: Alexandru Popescu <alexandru.popescu@xxxxxxxxx>
> To: aspectj-users@xxxxxxxxxxx
> Date: Thu, Feb-10-2005 1:17 PM
> Subject: Re: [aspectj-users] generate a StackTraceElement
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> [quote Wes Isberg::on 2/10/2005 10:23 PM]
> |
> |> | You can't bind the JoinPoint available in advice this way.
> |> |
> |> Why not? I think I have even read about this in one of AJ book
> |
> | Ok, I should have said "shouldn't" not "can't".
> |
> | You can't, or shouldn't, because we (intentionally) haven't
> | documented in the programming guide the order or contents
> | of advice parameters.
> 
> I have noticed that these are not documented. However, if I correctly 
> used the pointcuts i have
> expressed the following: match any joinpoint that occurs during the 
> execution of an advice which has
> a JoinPoint parameter. What I am missing?
> 
> - --
> :alex |.::the_mindstorm::.|
> 
> By experiment you might find different
> | behaviors for different join points, different compiler
> | options, and different versions or implementations of
> | the compiler/weaver.
> |
> | If you want to print any available JoinPoint|StaticPart argument,
> | you can do that with the code below.  It's a bit like looking
> | at the bytecode methods that implement advice: neat, but I
> | wouldn't rely on it for real code.
> |
> | Wes
> |
> | P.S. -
> |> Why not? I think I have even read about this in one of AJ book
> |> (Cookbook?).
> |
> | I can't speak to the cookbook; I haven't read it.  I would
> | hope/expect that the cookbook gave similar caveats when
> | presenting it.  If a language feature is not in the
> | programming guide, developers are at their peril to rely on it.
> |
> | ---------------- bugs/Main.java
> | package bugs;
> |
> | import org.aspectj.lang.JoinPoint;
> | import org.aspectj.lang.Signature;
> | import org.aspectj.lang.reflect.SourceLocation;
> |
> | import util.IAspect;
> |
> | /**
> |  */
> | public class Main {
> |
> |     public static void main(String[] args) {
> |     }
> | }
> | aspect A implements IAspect {
> |     before() : within(Main) {
> |         System.out.println("before() " + thisJoinPointStaticPart);
> |     }
> | }
> | aspect B implements IAspect {
> |     before() : adviceexecution() && !within(B) {
> |         if (!logAdvisedJoinPoint(thisJoinPoint.getArgs())) {
> |             logThisJoinPoint(-1, thisJoinPointStaticPart);
> |         }
> |     }
> |     boolean logAdvisedJoinPoint(Object[] args) {
> |         boolean logged = false;
> |         for (int i = 0; !logged && (i < args.length); i++) {
> |             if (args[i] instanceof JoinPoint) {
> |                 logThisJoinPoint(i,
> |                   ((JoinPoint) args[i]).getStaticPart());
> |                 return true;
> |             } else if (args[i] instanceof JoinPoint.StaticPart) {
> |                 logThisJoinPoint(i,
> |                    (JoinPoint.StaticPart) args[i]);
> |                 return true;
> |             }
> |
> |         }
> |         return false;
> |     }
> |     void logThisJoinPoint(int index, JoinPoint.StaticPart jp) {
> |         Signature sig = jp.getSignature();
> |         SourceLocation loc = jp.getSourceLocation();
> |         StackTraceElement ste = new StackTraceElement
> |             (sig.getDeclaringType().getName(), sig.getName(),
> |                 loc.getFileName(), loc.getLine());
> |         print((-1<index? "advisee " : " advice ")
> |                + index + ": " + ste);
> |     }
> |     void print(String s) {
> |         System.out.print(s + "\n");
> |     }
> | }
> |
> |
> |>
> |> - --
> |> :alex |.::the_mindstorm::.|
> |>
> |> | The code below works, logging all the adviceexecution
> |> | join points.
> |> |
> |> | Valerio, do you instead want to log the join points being
> |> | advised by the advice (in Main below, staticinitialization
> |> | and method-execution)?  If the pointcuts were named and
> |> | enumerable, you could do that, but it's awkward.  What's
> |> | the use-case for this? Does the variable
> |> | thisEnclosingJoinPointStaticPart help?
> |> |
> |> | Wes
> |> |
> |> | ------------------ bug/Main.java
> |> | package bugs;
> |> |
> |> | import org.aspectj.lang.JoinPoint;
> |> | import org.aspectj.lang.Signature;
> |> | import org.aspectj.lang.reflect.SourceLocation;
> |> |
> |> | /**
> |> |  */
> |> | public class Main {
> |> |
> |> |     public static void main(String[] args) {
> |> |     }
> |> | }
> |> | aspect A {
> |> |     before() : within(Main) {
> |> |         System.out.println("before() "
> |> |              + thisJoinPointStaticPart);
> |> |     }
> |> | }
> |> | aspect B implements IAspect {
> |> |     before() : adviceexecution() && !within(B) {
> |> |         log(thisJoinPointStaticPart);
> |> |     }
> |> |     void log(JoinPoint.StaticPart jp) {
> |> |         Signature sig = jp.getSignature();
> |> |         SourceLocation loc = jp.getSourceLocation();
> |> |         StackTraceElement ste = new StackTraceElement
> |> |             (sig.getDeclaringType().getName(), sig.getName(),
> |> |                 loc.getFileName(), loc.getLine());
> |> |         System.out.println("BeforeAndAfter advice: "+ ste);
> |> |     }
> |> | }
> |> |
> |> |
> |> |
> |> |> ------------Original Message------------
> |> |> From: Alexandru Popescu <alexandru.popescu@xxxxxxxxx>
> |> |> To: aspectj-users@xxxxxxxxxxx
> |> |> Date: Thu, Feb-10-2005 10:16 AM
> |> |> Subject: Re: [aspectj-users] generate a StackTraceElement
> |> |>
> |> | [quote Valerio Schiavoni::on 2/10/2005 6:44 PM]
> |> | | On Thursday 10 February 2005 16:29, Alexandru Popescu wrote:
> |> | |> The only available pointcut related to aspects is the
> |> | adviceexecution() but
> |> | |> you cannot refine it further to match a before advice and after
> |> | advice.
> |> | |
> |> | | i don't need to refine it. It'd be enough to be able to "dump" 
> the
> |> | stack
> |> | | everytime an advice is executed.
> |> | |
> |> | | i tried with :
> |> | |
> |> | | pointcut Advices(): adviceexecution() && within(TraceAspect);
> |> | |
> |> | |     after(): Advices() {
> |> | |           StackTraceElement ste = new StackTraceElement
> |> | | (thisJoinPoint.getSignature().getDeclaringType().getName(),
> |> | |                 thisJoinPoint.getSignature().getName(),
> |> | |                 thisJoinPoint.getSourceLocation().getFileName(),
> |> | |                 thisJoinPoint.getSourceLocation().getLine());
> |> | |          System.out.println("BeforeAndAfter advice: "+ ste);
> |> | | }
> |> | |
> |> | | so, if another advice is present, i want to get info about that
> |> join
> |> | point.
> |> | | This is not possible? If so...why ?
> |> | |
> |> | | thanks,
> |> | | valerio
> |> |
> |> | I think what you are looking for is something in this direction:
> |> |
> |> | pointcut advices(JoinPoint jp): adviceexecution() && args(jp) &&
> |> | within(...)
> |> |
> |> | --
> |> | :alex |.::the_mindstorm::.|
> |> _______________________________________________
> |> 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)
> |>
> |> iD8DBQFCC7i5TTDTje0R2dgRAp2cAJ9aXgpux84+BDEsNCFrvFbqPnqgRACaAwgh
> |> lEQpjClpH6nDezCBm6ZM58Q=
> |> =Ri8P
> |> -----END PGP SIGNATURE-----
> |> _______________________________________________
> |> 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)
> 
> iD8DBQFCC84LTTDTje0R2dgRAjdtAJ4lwNsGD4PKrJJ3EwzXGoeU6GmtHgCcDbZt
> FlVkbO2MdToGExKvMhyu2z8=
> =LLgm
> -----END PGP SIGNATURE-----
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
>