Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] passing information to a pointcut




Simon,

Did you see my other posting? Using pertypewithin() allows you to have a
different logger for each class which is what your example shows. If you
want a different logger for an arbitrary set of join points I suggest
defining a separate concrete aspect.

Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester,  SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/

Simon Heinzle <simon.heinzle@xxxxxxxxxx>@eclipse.org on 13/04/2005 16:19:50

Please respond to aspectj-users@xxxxxxxxxxx

Sent by:    aspectj-users-bounces@xxxxxxxxxxx


To:    aspectj-users@xxxxxxxxxxx
cc:
Subject:    Re: [aspectj-users] passing information to a pointcut


Matthew,

Thanks for the reply but with your solution it's not possible to use 2
or more different loggers.

The idea is to have a generic abstract aspect together with a concrete
implementation. The concrete implementation should decide which logger
to use dependent on the pointcut taken.

(log4j has a complete hierarchie of loggers dependent on their name)

Anyway, I can live with the current solution for development code.

Regards,
Simon


Matthew Webster wrote:
>
>
>
> Simon,
>
> The this, target and args pointcuts are sufficient to expose all context
> available at a joint point. The log object you are trying to obtain is
not
> a property of the joint point but rather a field defined by a property of
> the join point i.e. this. In a simplified version the Log object is
> obtained through a template method:
>
> public abstract aspect AbstractAspect2 {
>
>     protected abstract Log getLog();
>
>     protected abstract pointcut beforeTrace();
>
>     before() : beforeTrace() {
>         Log l = getLog();
>         if (l.isEnabled()) l.log("Before.");
>     }
>
> }
>
> public aspect Aspect2 extends AbstractAspect2 {
>     private static Log testLog = new Log(true, "Test");
>
>     protected Log getLog() {
>             return testLog;
>     }
>
>     protected pointcut beforeTrace() : beforeTraceTest()
>        || beforeTraceTest2();
>
>       pointcut beforeTraceTest() :
>        execution(* Test.doSome(..));
>
>       pointcut beforeTraceTest2() :
>         execution(* Test2.doSome(..));
>
> }
>
> However you have a secondary concern which is to use a different Log
object
> of each class. For a solution to your problem see my posting wrt the new
> pertypewithin() feature of AspectJ 5:
> http://dev.eclipse.org/mhonarc/lists/aspectj-dev/msg01261.html.
>
> Matthew Webster
> AOSD Project
> Java Technology Centre, MP146
> IBM Hursley Park, Winchester,  SO21 2JN, England
> Telephone: +44 196 2816139 (external) 246139 (internal)
> Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
> http://w3.hursley.ibm.com/~websterm/
>
> Simon Heinzle <simon.heinzle@xxxxxxxxxx>@eclipse.org on 13/04/2005
14:51:11
>
> Please respond to aspectj-users@xxxxxxxxxxx
>
> Sent by:    aspectj-users-bounces@xxxxxxxxxxx
>
>
> To:    aspectj-users@xxxxxxxxxxx
> cc:
> Subject:    Re: [aspectj-users] passing information to a pointcut
>
>
> Hi all,
>
> I want to share the workaround i found for the my problem:
> (note the abstract aspect will work as Logging - Handling Layer whereas
> the concrete aspect will just contain Logger-Instances & pointcuts)
>
> public abstract aspect AbstractAspect {
>          private static Log logref;
>
>          public static boolean setLog(Log l) {
>                  logref = l;
>                  return l.isEnabled();
>          }
>
>          abstract pointcut beforeTrace();
>
>          before() : beforeTrace() {
>                  logref.log("Before.");
>          }
> }
>
> public aspect Aspect extends AbstractAspect {
>          private static Log testLog = new Log(true, "Test");
>          private static Log test2Log = new Log(true, "Test2");
>
>          pointcut beforeTrace() : beforeTraceTest()
>                          || beforeTraceTest2();
>
>          pointcut beforeTraceTest() :
>                          execution(* Test.doSome(..))
>                          && if (setLog(testLog));
>          pointcut beforeTraceTest2() :
>                           execution(* Test2.doSome(..))
>                          && if (setLog(test2Log));
>
> }
>
>
> I'm not happy with this solution as it involves a method call & the
> target application is Logging (which in case of debug disabled) is quite
> time critical. However the JIT may optimize that away.
>
> Perhaps some of you see another way to do such a thing?
>
> Regards,
> Simon
>
>
> Simon Heinzle wrote:
>
>>Hi everybody,
>>
>>is there a possibility to pass information other than args() and this()
>>and alike to a pointcut?? For example like
>>
>>pointcut logPointcut(Object thiz, Object logger) :
>>    call (* *..Clazz.method(..) && this(thiz) && logger(myLogger);
>>                                                     \--------------/
>>(something like this) ---------------------------------------^
>>
>>Didn't find any information on that...
>>
>>Thanks,
>>Simon
>>_______________________________________________
>>aspectj-users mailing list
>>aspectj-users@xxxxxxxxxxx
>>https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users




Back to the top