[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] [Newbie] Pick out a call / execution only in the hierarchy leafs
|
Hi,
I realized that the reason because the call-based pointcut is not
working for me is that I'm not weaving a third party classes, which are
clients of my classes via the "Hollywood principle". I don't want to
weave my aspects into these classes if I can.
So, to avoid this weaving I'm enforced to use an execution-based aspect.
Now the question is how to pick out execution join points only in the
hierarchy leafs, with the requeriments stated in the previous posts. In
other word, is it possible to achieve with an execution-based pointcut
the same result of:
public pointcut getOptionsPointcut(OptionHandler targetObject) :
call(public String[] OptionHandler.getOptions())
&& target(targetObject)
&& target(Randomizable+)
;
Thanks in advance.
Santi
Petecan wrote:
Hi again,
Thanks. I have already tried it, but this pointcut definition fails in
capturing what I need (Am I doing something wrong?):
/*****************************/
public pointcut getOptionsPointcut(OptionHandler targetObject) :
call(public String[] OptionHandler.getOptions())
&& target(targetObject)
&& target(Randomizable+)
;
/*****************************/
The only partial solution I have found is using a combination of
execution and cflowbelow:
/*****************************/
public pointcut getOptionsPointcut(OptionHandler targetObject) :
execution(public String[] OptionHandler.getOptions())
&& within(targetObject);
String[] around(OptionHandler targetObject) :
getOptionsPointcut(targetObject) &&
!cflowbelow(getOptionsPointcut(OptionHandler)){
showJPInfo("Around GET", thisJoinPoint);
return WekaUtils.appendOptions(getOption(targetObject),
proceed(targetObject));
}
/*****************************/
But that don't works, because although it solves the chained advised
problem described in the first post, it adds the following problem
when I have aggregated Randomizable & OptionHandler objects and I want
to retrive its options.:
/*****************************/
class A implements OptionHandler, Randomizable{
private A anotherA;
...
String[] getOptions(){
super.getOptions() ...
anotherA.getOptions(); //<==This call is not adviced and I
want to!!.
}
}
/*****************************/
This is giving me a serious headache.
Best regards
Santi
Bruno Feurer wrote:
sorry, use "target" instead of "withincode"! we don't have a method
pattern here...
-----Original Message-----
From: aspectj-users-admin@xxxxxxxxxxx
[mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Bruno Feurer
Sent: Thursday, July 22, 2004 11:09
To: aspectj-users@xxxxxxxxxxx
Subject: RE: [aspectj-users] [Newbie] Pick out a call / execution
only in the hierarchy leafs
Hi Petecan,
try ...
public pointcut getOptionsPointcut() :
call(public String[] OptionHandler.getOptions())
&& withincode(Randomizable+)
;
As stated in the Programming Guide
(http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspec
tj-home/do
c/progguide/language-joinPoints.html#d0e1288) calls should not
capture super calls.
Bruno
-----Original Message-----
From: aspectj-users-admin@xxxxxxxxxxx
[mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Petecan
Sent: Thursday, July 22, 2004 11:30
To: aspectj-users@xxxxxxxxxxx
Subject: [aspectj-users] [Newbie] Pick out a call / execution only
in the hierarchy leafs
Hi all,
I have the following two interfaces:
/*****************************/
public Interface OptionHandler{
...
String[] getOptions();
}
public Interface Randomizable{
...
}
/*****************************/
And I want to advice all calls to the
OptionHandler.getOptions method
within Randomizable & OptionHandler implementing classes. I use the
following pointcut and advice:
/*****************************/
public pointcut getOptionsPointcut() :
execution(public String[] OptionHandler.getOptions())
&& within(Randomizable+)
;
String[] around() : getOptionsPointcut(){
return Utils.appendOptions(getOption(), proceed());
}
/*****************************/
Now, given the following hierarchy:
/*****************************/
class A implements OptionHandler, Randomizable{
String[] getOptions(){
...
}
}
class B extends A{
String[] getOptions(){
super.getOptions();
...
}
}
/*****************************/
The poincut captures both the getOptions() execution in A and
B, and I want it to capture only the execution in the "leaf" class
of the hierarchy (class B, in this case). In other words, the
A.getOptions must be picked out only if it is directly invoked but
not if it
is called
from a redefining method via the super reference. How can I do
that?. Is there a better or more elegant way of defining the
pointcut to capture these joint points?.
Best Regards
Santi.
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspect> j-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/aspectj-users