Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] logging the context of a timing aspect

Eric,

You can use thisEnclosingJoinPoint - to do what you want. E.g., 
      System.err.println("Called by " + thisEnclosingJoinPoint.getSignature());

See http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/progguide/apbs03.html  for more information...

> ------------Original Message-------------
> From: Eric.D.Friedman@xxxxxxxxxxxxxx
> To: aspectj-users@xxxxxxxxxxx
> Date: Thu, Jun-5-2003 10:55 AM
> Subject: [aspectj-users] logging the context of a timing aspect
> 
> I'm attempting to use a variation on one of the sample aspects and am
> unclear as to how to capture some additional information in a logging
> operation.  I'd be grateful for any insights you can offer.
> 
> I have a family of classes, all of which extend the same base class.  To
> keep it simple, let's call the base class "Parent" and the subclasses
> "Child" and "Kid."
> 
> My goal is to introduce an aspect onto this family that will start/stop a
> timer when a certain method is invoked.  That method is not defined on
> Parent, but it's defined on Child/Kid -- the return type and arguments are
> different in each case, though the name is the same.  So:
> 
> class Parent {}
> class Child extends Parent {
>   private ChildResponse send(ChildRequest req) { .. }
> }
> class Kid extends Parent {
>   private KidResponse send(KidRequest req) { .. }
> }
> 
> I have a Timer class, borrowed from the examples:
> class Timer {
>   private long start, stop;
>   public void start() { start = System.currentTimeMillis(); }
>   public void stop() { stop = System.currentTimeMillis(); }
>   public long getTime() { return stop - start; }
> }
> 
> 
> I have an aspect which introduces a Timer instance onto Parent and which
> uses before/after advice to start/stop the timer when * send(..) is invoked:
> 
> public aspect Timing {
>     pointcut sendMessage(Parent p) :
>         target(p) && call (* send(..));
> 
>     private Timer Parent.timer = new Timer();
>     public Timer getTimer(Parent p) { return p.timer; }
> 
>     before(Parent p): sendMessage(p) {
>       getTimer(p).start();
>     }
> 
>     after(Parent p): sendMessage(p) {
>       getTimer(p).stop();
>     }
> }
> 
> I have a second aspect which implements support for the logging concern:
> 
> public aspect TimerLog {
>     after(Timer t): target(t) 
>                     && call(* Timer.stop()) 
>                     && cflow(call(* Parent+.*(..))) {
>       System.err.println("Elapsed time: " + t.getTime() + " ms");
>       System.err.println("In " + thisJoinPoint.toLongString());
>       // would like a way to log information about the method in the Parent
> class hierarchy that precipitated
>       // execution of this advice
>     }
> }
> 
> This all works very well.  However, there doesn't appear to be a way for the
> TimerLog aspect to report *what* the timer was logging.  The after advice of
> the TimerLog has visibility on the Timer object, but not on the context in
> which the matching cut occurred.  The cflow() pointcut helps to ensure that
> I only log "interesting" Timing events, but it does not (AFAICT) expose the
> method in the cflow stack in which the TimerLog advice is being executed.
> 
> Obviously I could add state to the Timer object and make the Timing aspect
> responsible for setting that, though it seems I would be blurring the
> boundary between the timing concern and the logging concern in the process.
> 
> Does anyone have any insight into how "best" to accomplish what I'm after?
> 
> Thanks,
> Eric Friedman
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
> 


Back to the top