Hi Glenn,

 

AspectJ provides a way to match based on the runtime type of arguments using args. The method execution signature matches based on the statically declared type of the method parameter. It sounds like you would like a way to match based on the static type of the parameter being passed in, but that’s not available in AspectJ. I haven’t found a need for a feature like this and I think AspectJ has to balance the benefit of adding new features with the cost of added complexity.

 

To find calls that pass a priority that’s not a level, you could match using args and make a runtime error. And as Ron DiFrango noted, you could also make it a compile-time error to construct a Priority (or even use call((Priority+ && !Level+).new(..)) for subclasses of Priority that aren’t a Level).

 


From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Glenn Farrow
Sent: Wednesday, September 20, 2006 4:33 AM
To: [email protected]
Subject: Re: [aspectj-users] It was related to inheritance and deprecatedmethods ...

 

Ya as per my previous email I understand that it wasn't matching because the method signature for the log method specifies a Priority for the first parameter, even though that class is deprecated.  My point was that Aspectj should match based on the type of the parameter actually being passed (which is a Level).  The run time type of that parameter must be preserved in the byte code as a Level.

What if, for example to catch uses of a deprecated class, I wanted to differentiate between calls to log() that were passing in a Priority and calls that were passing in a Level?  I would have no way to do this if matching is based on the method signature and not the actual parameter types passed.


Matthew Webster wrote:


Glenn,

The first pointcut does not match because the call() PCD does not match. You have asked to match a method that takes Level as the first parameter while the method you are calling takes a Category. The match takes place at compile- not run-time. Your other pointcuts match with a run-time test because you are matching and binding with the args() PCD. They will also match the call below but the advice will not be invoked at run-time because the first argument is a Category and not a Level:

        logger.log(Priority.FATAL,"");

The following pointcut will always match without a runtime test:

        pointcut logCall() : target(Logger) && !within(LoggingAspect) && call(void log(Priority, ..));



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, [EMAIL PROTECTED]
http://w3.hursley.ibm.com/~websterm/[1]


Glenn Farrow <[EMAIL PROTECTED]>
Sent by: [EMAIL PROTECTED]

19/09/2006 16:50

Please respond to
[EMAIL PROTECTED]; Please respond to
[email protected]

To

Matthew Webster/UK/[EMAIL PROTECTED]

cc

[email protected]

Subject

[aspectj-users] It was related to inheritance and deprecated        methods ...

 

 

 




although I believe it should still work with Level.

Here is the log4j method declaration:

               public void log(Priority p, Object message);
however Priority is deprecated so you are supposed to pass in a Level (which implements Priority).

Here is my method call:

                _logger.log(Level.ERROR, "My error message");

The following pointcut does NOT match:

   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Level, ..));

The following pointcuts DO match:  

   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(..));
   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Priority p, ..));
   pointcut logCall(Level p) : target(Logger) && args(p, ..) && !within(LoggingAspect) && call(void log(Priority+ p, ..));

So even though I am passing in a Level in my method call, the fact that the method is defined to accept a (deprecated) Priority prevents the first pointcut from matching?

Also can anyone explain why the 3 pointcuts that do match all require a runtime test?

Glenn


Matthew Webster wrote:

Glenn,


Unfortunately pointcuts not matching is one of the hardest things to diagnose. Could you post you whole aspect (or as much of it as you are willing to disclose) and a full example of a join point you are trying to match. Also could you give some examples of your environment e.g. AJDT, Ant or load-time weaving.


Cheers


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,
[EMAIL PROTECTED]
http://w3.hursley.ibm.com/~websterm/[1]

Glenn Farrow <[EMAIL PROTECTED]>
Sent by:
[EMAIL PROTECTED]

19/09/2006 15:43

Please respond to
[EMAIL PROTECTED]; Please respond to
[email protected]

 

To

Ron Bodkin <[EMAIL PROTECTED]>

cc

[email protected]

Subject

Re: [aspectj-users] Pointcut fails to match when arguments        combinedwith ".."

 

 

 





No, tried that too previously.  Same result.



Ron Bodkin wrote:
> I think you want args(p, ..) to match any number of arguments as long as the
> first one is a Level; args(p) will match exactly one argument of type Level.
>
> -----Original Message-----
> From:
[EMAIL PROTECTED]
> [
mailto:[EMAIL PROTECTED]] On Behalf Of Glenn Farrow
> Sent: Tuesday, September 19, 2006 6:33 AM
> To:
[email protected]
> Subject: [aspectj-users] Pointcut fails to match when arguments combinedwith
> ".."
>
> Observer the following pointcut and advice which is supposed to match
> all calls to Logger.log(..).  Logger.log always takes a Level as the
> first parameter.  However the advice never gets applied.
>
>     pointcut logCall(Level p) : target(Logger) && args(p) &&
> !within(LoggingAspect) && call(void log(..));
>     before(Level p) : logCall(p) {
>         Errors.add(p);
>     }
>
> If I revise the pointcut and advice as follows it does get applied.
> AspectJ seems to be getting confused when trying to use arguments and
> specifying additional optional arguments using wildcards.
>
> pointcut logCall() : target(Logger) && !within(LoggingAspect) &&
> call(void(log(..));
> before() : logCall() {
>     dummy();
> }
>
> What's the scoop?  I've also tried the following and it doesn't match
> either:
>
>     pointcut logCall(Level p) : target(Logger) && args(p) &&
> !within(LoggingAspect) && call(void log(Level, ..));
>     before(Level p) : logCall(p) {
>         Errors.add(p);
>     }
>
>
>
>
>
> _______________________________________________
> aspectj-users mailing list
>
[email protected]
>
https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>  
_______________________________________________
aspectj-users mailing list

[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users


 


 
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users
  
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to