Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] It was related to inheritance and deprecatedmethods ...


Glenn,

What is the purpose of your aspect? You seem concerned about static vs. dynamic pointcut matching. Are you trying to use declare warning/error (which requires static matching)? All AspectJ pointcuts conceptually match dynamically but the process is optimized by the compiler if enough information is available.

I am also puzzled by your reference to AspectJ matching deprecated methods. Until Java 5 deprecation was a comment in the code to allow javac to issue a warning but no information made it into to byte-code (needed by AspectJ). Now you can use an annotation but you must explicitly match this using the appropriate pointcut: AspectJ does not give deprecated methods or their invocation any special treatment.

>>My point was that AspectJ should match based on the type of the parameter actually being passed (which is a Level).
>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
Matching on the static type of an on used as a method parameter is not supported because it doesn't make sense. In the example below you would like to distinguish between the two calls to log(). As you can see it is the runtime type that is important not the type of the local variable used.

public class Test {

        public static void main(String[] args) {

                Logger logger = new Logger();
                Level l = Level.INFO;
                Priority p = Level.INFO;
                logger.log(l,"");
                logger.log(p,"");
        }

}

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/



"Ron Bodkin" <rbodkin@xxxxxxxxxxxxxx>
Sent by: aspectj-users-bounces@xxxxxxxxxxx

20/09/2006 17:21

Please respond to
aspectj-users@xxxxxxxxxxx

To
<aspectj-users@xxxxxxxxxxx>
cc
Subject
RE: [aspectj-users] It was related to inheritance        and        deprecatedmethods ...





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: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Glenn Farrow
Sent:
Wednesday, September 20, 2006 4:33 AM
To:
aspectj-users@xxxxxxxxxxx
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,
matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/[1]

Glenn Farrow <glenn@xxxxxxxxxxxxxxx>
Sent by:
aspectj-users-bounces@xxxxxxxxxxx

19/09/2006 16:50


Please respond to
glenn@xxxxxxxxxxxxxxx; Please respond to
aspectj-users@xxxxxxxxxxx


To
Matthew Webster/UK/IBM@IBMGB
cc
aspectj-users@xxxxxxxxxxx
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,
matthew_webster@xxxxxxxxxx
http://w3.hursley.ibm.com/~websterm/[1]

Glenn Farrow <glenn@xxxxxxxxxxxxxxx>
Sent by:
aspectj-users-bounces@xxxxxxxxxxx

19/09/2006 15:43


Please respond to
glenn@xxxxxxxxxxxxxxx; Please respond to
aspectj-users@xxxxxxxxxxx

 


To
Ron Bodkin <rbodkin@xxxxxxxxxxxxxx>
cc
aspectj-users@xxxxxxxxxxx
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:
aspectj-users-bounces@xxxxxxxxxxx
> [
mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Glenn Farrow
> Sent: Tuesday, September 19, 2006 6:33 AM
> To:
aspectj-users@xxxxxxxxxxx
> 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
>
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
  _______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top