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 ...

Glen,
 
One way I can think of is to use declare warning [or declare error] to capture all those places where a deprecate class is used and have the compiler spit out a message when it finds its usage.  Maybe something like the following taken from the Quick Reference guide [http://www.eclipse.org/aspectj/doc/released/quick5.pdf]:
 
declare warning : call(Priority.new(..)) : "bad construction of Priority object.  Deprecated usage, please use Level" ;
 
Ron

________________________________

From: aspectj-users-bounces@xxxxxxxxxxx on behalf of Glenn Farrow
Sent: Wed 9/20/2006 7: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/ 
	
	
	
Glenn Farrow <glenn@xxxxxxxxxxxxxxx> <mailto: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 <mailto:matthew_webster@xxxxxxxxxx> 
	http://w3.hursley.ibm.com/~websterm/ <http://w3.hursley.ibm.com/%7Ewebsterm/%06quot;>  
	
	
Glenn Farrow <glenn@xxxxxxxxxxxxxxx> <mailto:glenn@xxxxxxxxxxxxxxx>  
Sent by: aspectj-users-bounces@xxxxxxxxxxx <mailto:aspectj-users-bounces@xxxxxxxxxxx>  

19/09/2006 15:43 

Please respond to
glenn@xxxxxxxxxxxxxxx <mailto:glenn@xxxxxxxxxxxxxxx> ; Please respond to
aspectj-users@xxxxxxxxxxx <mailto:aspectj-users@xxxxxxxxxxx> 



To
Ron Bodkin <rbodkin@xxxxxxxxxxxxxx> <mailto:rbodkin@xxxxxxxxxxxxxx>  	
cc
aspectj-users@xxxxxxxxxxx <mailto: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> 
	> [mailto: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 <mailto: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 <mailto:aspectj-users@xxxxxxxxxxx> 
	> https://dev.eclipse.org/mailman/listinfo/aspectj-users <https://dev.eclipse.org/mailman/listinfo/aspectj-users> 
	>
	>   
	_______________________________________________
	aspectj-users mailing list
	aspectj-users@xxxxxxxxxxx <mailto:aspectj-users@xxxxxxxxxxx> 
	https://dev.eclipse.org/mailman/listinfo/aspectj-users <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
	  

<<winmail.dat>>


Back to the top