Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
RE: [aspectj-users] Pointcut to calls to a specific field

Hi all,

to keep interested readers informed...

In cases you have the control over the design of the base code a small
redesign can help. I've tried to find a special feature for the children
collection itself (for example a filtered access) and specialized the
Collection (for example ArrayList) for the member field. The first I
wanted to have to not having my base design hooked to the aspects in any
way. With the second we can filter the specific calls to a member field
by the target type. Of course to mark every member in the base design
with a special class or interface becomes ugly. So this is not an
overall solution, but it works for my case. The pointcut declarations
look nice simple and I even like my base design better (a little ;)

Bruno

> -----Original Message-----
> From: aspectj-users-admin@xxxxxxxxxxx 
> [mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Bruno Feurer
> Sent: Thursday, June 24, 2004 15:53
> To: aspectj-users@xxxxxxxxxxx
> Subject: RE: [aspectj-users] Pointcut to calls to a specific field
> 
> 
> Hi Wes,
> 
> thanks for your reply. As a beginner in AOP, I thought, I'm 
> missing a kind of feature here. Or maybe that would form a 
> feature for future releases. I mean, all the information for 
> the weaver should be statically available and situations when 
> you are interested in field specific calls could be plenty. 
> What do you think?
> 
> For now I also came up with the idea of working with the 
> control flow. In fact I've just understood the difference 
> between the cflow and cflowbelow thing ;) So...
> 
>   call(boolean Collection.add(Object)) && 
> cflow(get(Collection MyContainer.children));
> 
> ... limits the scope to only the code also referencing the 
> field as well. But we still got all the Collection.add() 
> calls within these methods. And the cflow seems to be a 
> dynamic test as well.
> 
> I like your proxy approach, but in my case, I guess the 
> overhead of the proxy instance will be essential (lots of 
> containers) or an allocation at every access would lead into 
> a performance issue.
> 
> The warning declaration part, I didn't understand. How would 
> such a declaration look like? I mean, if you can define all 
> the "other collections", you can define the ones needed as 
> well, can't you?
> 
> cheers,
> Bruno
> 
> 
> 
> > -----Original Message-----
> > From: aspectj-users-admin@xxxxxxxxxxx
> > [mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Wes Isberg
> > Sent: Thursday, June 24, 2004 0:36
> > To: aspectj-users@xxxxxxxxxxx
> > Subject: Re: [aspectj-users] Pointcut to calls to a specific field
> > 
> > 
> > Hi Bruno -
> > 
> > This is actually a really good example of thinking in terms
> > of join points (pointcuts, advice) and not code manipulation 
> > or generation.  Though there is only one bit of code
> > 
> >      thing.field.add(something)
> > 
> > there are at least two join points (field-set, call).
> > 
> >  > I'm still not happy with the field test in the advice. Is
> > there really
> >  > no static way to capture field specific join points?
> > 
> > The field-specific join points are get() and set().
> > 
> > The call join point only knows that it has a reference;
> > it doesn't know that it is a field.  Conceptually you
> > should think of it as different join points, something like
> > 
> >    load reference from field
> >    make call
> > 
> > You pointed this out in saying
> >  > I've
> >  > found the get-access definition, but I don't see a way to
> > connect it to
> >  > a following call.
> > 
> > As for this:
> > 
> >  > And the join point annotations in
> >  > Eclipse still show up at the local Collection.add() calls.
> > 
> > As you point out, if() is a dynamic test, so the
> > static shadow of the pointcut will be on all the
> > call(boolean Collection.add(Object)) call join points.
> > If the field is private, you could safely staticly limit
> > the advised join points to calls within the declaring class:
> > 
> >    call(boolean Collection.add(Object)) && within(MyContainer)
> > 
> > If the field incidentally is the only collection, you might 
> be able to 
> > combine within() and withincode() with call to "accidentally" only 
> > specify calls to the field, and leave out the dynamic if() test. In 
> > that case you might also specify some declare-warnings to 
> signal when 
> > other collections are added to the class.  (This is not really an 
> > approach I recommend, but I've seen it work for some situations.)
> > 
> > Another approach is to proxy the field and put the
> > crosscutting behavior in the proxy.  You'd use advice to 
> > replace the field when it is set with your proxy that 
> > delegates to a collection, and your proxy class would 
> > implement whatever policy you needed.
> > 
> > Wes
> > 
> > Bruno Feurer wrote:
> > 
> > > Hi,
> > > 
> > > I'm still not happy with the field test in the advice. Is
> > there really
> > > no static way to capture field specific join points?
> > > 
> > > A new idea is to test the field reference within the pointcut
> > > definition:
> > > 
> > >   pointcut add(MyContainer container, Object child, 
> Collection c) :
> > >       call(boolean Collection.add(Object)) && this(container) &&
> > >       args(child) && target(c) && if(c == container.children);
> > > 
> > > This works also with a "clean" advice. But we still need the
> > > Collection parameter for the if statement. And the join point 
> > > annotations in Eclipse still show up at the local 
> Collection.add() 
> > > calls.
> > > 
> > > Has somebody a hint or a correction to my approaches? 
> There must be
> > > several situations for capturing calls to specific field 
> > members. I've
> > > found the get-access definition, but I don't see a way to
> > connect it
> > > to a following call.
> > > 
> > > Thanks,
> > > Bruno
> > > 
> > > 
> > > 
> > >>-----Original Message-----
> > >>From: aspectj-users-admin@xxxxxxxxxxx 
> > >>[mailto:aspectj-users-admin@xxxxxxxxxxx] On Behalf Of Bruno Feurer
> > >>Sent: Friday, June 18, 2004 16:16
> > >>To: aspectj-users@xxxxxxxxxxx
> > >>Subject: [aspectj-users] Pointcut to calls to a specific field
> > >>
> > >>
> > >>Hi there,
> > >>
> > >>how can I define a pointcut picking out calls to specific field?
> > >>
> > >>  ...
> > >>  this.children.add(someObj);
> > >>  ...
> > >>
> > >>definitions like
> > >>
> > >>  pointcut add(MyContainer container, Object child) :
> > >>      call(boolean Collection.add(Object)) && this(container) && 
> > >>args(child);
> > >>
> > >>also match
> > >>
> > >>  ...
> > >>  Collection c = new ArrayList();
> > >>  c.add(someObject);
> > >>  ...
> > >>
> > >>So I came up with the following solution:
> > >>
> > >>  pointcut add(MyContainer container, Object child, 
> Collection c) :
> > >>      call(boolean Collection.add(Object)) && this(container) &&
> > >>args(child) && target(c);
> > >>
> > >>  after(MyContainer container, Object child, Collection c) : 
> > >>add(container, child, c) {
> > >>      if (c != container.children)
> > >>          return;
> > >>      ...
> > >>  }
> > >>
> > >>Has somebody found a better solution? Some definition 
> limiting the 
> > >>pointcut only to a specified field or something alike?
> > >>
> > >>Thanks for any ideas,
> > >>Bruno Feurer
> > >>
> > >>_______________________________________________
> > >>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/aspect> j-users
> > 
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> http://dev.eclipse.org/mailman/listinfo/aspectj-users
> 



Back to the top