Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
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-----


Back to the top