[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [aspectj-users] toString Aspect aspect browser
|
Wes,
It's a bit convoluted, but this should work around the limitation you cited:
private interface IPhilipsTarget {}
private interface IPhilipsTargetException {}
declare parents : (!ToStringEnhancer && com.philips..*)
implements IPhilipsTarget;
// exclude any subclasses that are not defined in com.philips or a subpackage
declare parents : (IPhilipsTarget && !com.philips..*)
implements IPhilipsTargetException;
String around(Object targ) : target(targ)
&& target(IPhilipsTarget) && !target(IPhilipsTargetException)
...
Ron Bodkin
Chief Technology Officer
New Aspects of Security
m: (415) 509-2895
> ------------Original Message-------------
> From: Wes Isberg <wes@xxxxxxxxxxxxxx>
> To: aspectj-users@xxxxxxxxxxx
> Date: Thu, Jul-24-2003 11:55 AM
> Subject: Re: [aspectj-users] toString Aspect aspect browser
>
> This is an interesting question: how to advise toString()
> that could be implemented in a superclass.
>
> It's not clear which calls to toString() you want:
>
> - *all* calls, from and to any code
> - only calls to your code, though from anywhere
>
> Writing a pointcut for "all" or "anywhere" runs up against
> issues with code the compiler controls, but it might work
> to combine call and execution. Some background, in brief:
>
> - to handle method call join points, ajc needs the calling code
> - to handle method execution join points, ajc needs the code
> implementing the method
> - call join points enclose a corresponding execution
> join point
>
> (See links below for more details)
>
> Since you are replacing the join point, you can combine
> call and execution:
>
> // warnings: weak style, untested...
> String around(Object targ) : target(targ)
> && !cflow(execution(String toStringUtil(Object)))
> && (call(String toString()))
> || execution(String toString()))) {
> return toStringUtil(targ);
> }
>
> So where ajc controls the caller, it will be replaced at
> the call join point. Where ajc controls the implementation,
> it will be replaced at the execution join point.
>
> Note that I used cflow to prevent recursion, so
> toStringUtil(Object) { {code} } can use toString().
>
> This pointcut might be bad style because it speaks to all
> code, though the runtime namespace will include code that
> was and wasn't controlled by ajc. (i.e., it is implicitly
> restricted by the scope of code the compiler controls).
> One way restrict the scope to your code is as follows:
>
> private interface IPhilipsTarget {}
>
> declare parents : (!ToStringEnhancer && com.philips..*)
> implements IPhilipsTarget;
>
> String around(Object targ) : target(targ)
> && target(IPhilipsTarget)
> ...rest the same
>
> There's one problem with this. A subtype of a com.philips..*
> type will be treated as IPhilipsTarget even if it is not in
> com.philips..*
>
> Wes
>
> Links:
> - The Programming guide limitations appendix
>
> http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/progguide/limitations.html
>
> - The FAQ entry on the difference between call and execution
>
> http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/faq.html#q:comparecallandexecution
>
> - The 1.1 readme section on callee-side call join points
> (implemented in 1.0, but not in 1.1)
>
> http://dev.eclipse.org/viewcvs/indextech.cgi/~checkout~/aspectj-home/doc/README-11.html#NO_CALLEE_SIDE_CALL
>
>
>
> jon.pallas@xxxxxxxxxxx wrote:
>
> > Thanks Ron
> >
> > I now see that i should have used execution() rather than call()
> >
> >
> > The problem is that if
> >
> > public String toString() if is implemented only in java.lang,Object;
> >
> > The aspect cant find it as a joinpoint.
> >
> > if i implement toString() in my class
> >
> > public String toString() { return "You wont see this because the aspect
> > will get there first";}
> >
> > It is found by the asect and i get my nice string out.
> >
> >
> > Is there a way around this??
> >
> > Thanks again
> > Jon
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > "DiFrango, Ron" <ron.difrango@xxxxxxxxxxxxxx>
> > 2003-07-24 03:38 PM
> >
> >
> > To: "'aspectj-users@xxxxxxxxxxx'" <aspectj-users@xxxxxxxxxxx>
> > cc: Jon Pallas/EHV/CE/PHILIPS@EMEA3
> > Subject: RE: [aspectj-users] toString Aspect aspect browser
> > Classification:
> >
> >
> >
> > Jon,
> >
> > I got it to work with the following:
> >
> > public pointcut myClass(Object obj) : within(com.philips.sct..*)
> > && this(obj);
> >
> > public pointcut myToString(Object obj) :
> > myClass(obj)
> > && execution(public String toString());
> >
> > String around(Object obj) : myToString(obj) {
> > return StringUtil.toString(obj);
> > }
> >
> > Thanks,
> >
> > Ron DiFrango
> >
> >
> > -----Original Message-----
> > From: jon.pallas@xxxxxxxxxxx [mailto:jon.pallas@xxxxxxxxxxx]
> > Sent: Thursday, July 24, 2003 7:58 AM
> > To: aspectj-users@xxxxxxxxxxx
> > Subject: [aspectj-users] toString Aspect aspect browser
> >
> >
> > Hi All
> >
> >
> > I am new to aspectj so I may be doing something simple wrong any help
> > would be apperciated.
> >
> > I have writen an Aspect that i want to intersept any call to toString().
> > The code is below
> > using the aspect browser in eclipse i can see that it only affects classes
> >
> > that are not in
> > com.philips.sct? but his is what i want tbe be affected?
> >
> > Is it just the browser or is it my code?
> >
> > Thanks
> > Jon
> >
> >
> >
> >
> > 1)
> >
> > package com.philips.sct.aspects;
> >
> > import com.philips.common.util.StringUtil;
> >
> > public aspect ToStringEnhancerAspect {
> >
> > public pointcut myClass(Object obj) : within(com.philips.sct..*)
> > && this(obj);
> >
> >
> > public pointcut myAspects() : within(com.philips.sct.aspects.*);
> >
> >
> > public pointcut myToString(Object obj) : !myAspects()
> > && myClass(obj)
> > && call(public String toString())
> > ;
> >
> > String around (Object obj): myToString(obj){
> > return StringUtil.toString(obj);
> > }
> > }
> >
> >
> > _______________________________________________
> > aspectj-users mailing list
> > aspectj-users@xxxxxxxxxxx
> > http://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
> > **************************************************************************
> > The information transmitted herewith is sensitive information intended
> > only
> > for use by the individual or entity to which it is addressed. If the
> > reader
> > of this message is not the intended recipient, you are hereby notified
> > that
> > any review, retransmission, dissemination, distribution, copying or other
> > use of, or taking of any action in reliance upon this information is
> > strictly prohibited. If you have received this communication in error,
> > please contact the sender and delete the material from your computer.
> >
> >
> >
> > _______________________________________________
> > 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
>