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