[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] catching methods *not* calling a specific method?
|
Hi -
> Is it possible to have a static pointcut that would
> flag methods whose implementations do *not* call
> another, specified method? <snip>
No. You can't pick out "missing" join points staticly with AspectJ.
Staticly, you can help an audit by detecting all the method-executions
that should call (your pointcut below) (or all the calls not
within such methods, if it's only to be called from such methods:
call (* MySuperClass+.wantedMethod())
&& !withincode(* MySuperClass+.someMethod*(..))
).
Dynamically, you can test and flag on returning from someMethod()
if it never called wantedMethod(..):
// untested, but perhaps gives you the idea
// try also using percflow or around advice :)
aspect A {
pointcut callingMethod() : execution(* MySuperClass+.someMethod*(..));
pointcut wantedCall() : call(* MySuperClass+.wantedMethod*(..))
&& withincode(* MySuperClass+.someMethod*(..));
before() : callingMethod() { push(); }
after() returning : wantedCall() { hit(); }
after() returning : callingMethod() && if (!wasHit()) {
throw new Error("failed to call ...");
}
after() : callingMethod() { pop(); }
// implementation
static ThreadLocal flag = new ThreadLocal() {
public Object initialValue() { return new Stack(); }
};
// these use ThreadLocal stack to push/pop boolean
static void push() {..} // push Boolean.FALSE
static void hit() {..} // push Boolean.TRUE
static void pop() {..} // pop
static boolean wasHit() {..} // peek, error if null
}
Hope this helps-
Wes
> ------------Original Message------------
> From: Razvan <razvan_peteanu@xxxxxxxxxx>
> To: aspectj-users@xxxxxxxxxxx
> Date: Wed, Nov-10-2004 11:36 AM
> Subject: [aspectj-users] catching methods *not* calling a specific method?
>
> Hello,
>
> Is it possible to have a static pointcut that would
> flag methods whose implementations do *not* call
> another, specified method? Some akin to:
>
> execution (* MySuperClass+.someMethod*(..)) && !(call
> (* MySuperClass+.wantedMethod()) );
>
> (which doesn't work).
>
> I'm not very sure it's possible, whether
> wantedMethod() is called depends on the program flow.
> In my case it's a linear flow (and no exceptions), but
> this is still a particular case of program flow.
>
> Thanks,
> Razvan
>
> PS (yeah, instead of checking the call, the better way
> would be to add an aspect making the call, but I
> cannot do that right now within my project's
> constraints).
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
>