Hi Andy,
Thanks... what does 'dynamic match' mean?
I finally end up with a pointcut that match my desired points but the thing
is that when I want to pass the Event annotation the pointcut doesn't work
anymore

To pass the annotation I changed the signature to

eventMethods(Event e,Object obj,Object iparam) :
...
&& @args(e)

is this correct?

On 4/25/10, Andy Clement <[email protected]> wrote:
>
> I've only looked at it quickly, but first thing I spot is you haven't
> used '..' in the within clause.
>
> within(@Observable com.*)
>
> will match packages com.Foo, com.Bar, it will not match
> com.somewhere.Foo or com.somewhere.else.Bar.  I doubt that is what you
> want so change it to double dot.
>
> within(@Observable com..*)
>
> Also I see you using @annotation(Event) - did you really need a
> dynamic match on that?  If you don't you could just statically match
> it by remove the @annotation clause and putting the annotation in the
> execution pointcut:
>
> execution(@Event * *.*(..))
>
>
> Andy
>
>
> On 25 April 2010 02:17, Mohammad Norouzi <[email protected]> wrote:
> > Hi Simone,
> > Can you please tell me what's wrong with this pointcut. I want all the
> > methods which is in a type annotated with @Observable and the method
> itself
> > annotated with @Event
> >
> > @Observable
> > public class O1 {
> >
> >    @Event(value = {"EVENT1","EVENT2"})
> >    public void method1(String str) {
> >
> >    }
> > }
> >
> > package com.foo.aspect;
> >
> > import com.foo.annotation.*;
> >
> > public aspect EventDispatcherAspect {
> >
> >         pointcut eventMethods(Object obj,Object iparam) :
> >             within(@Observable com.*)
> >         &&    execution(* *.*(..))
> >         && @annotation(Event)
> >         && args(iparam)
> >         && target(obj);
> >
> >         after(Object obj,Object iparam) returning:
> eventMethods(obj,iparam)
> > {
> >
> >
> System.out.println("thisJoinPoint:"+thisJoinPointStaticPart.toLongString());
> >
> >
> System.out.println("thisJoinPointSig:"+thisJoinPointStaticPart.getSignature().toLongString());
> >             //System.out.println("Events: "+e.value());
> >
> >         }
> > }
> >
> >
> > Regards,
> > Mohammad
> > --------------------------
> >
> > On Wed, Apr 21, 2010 at 4:51 PM, Simone Gianni <[email protected]>
> wrote:
> >>
> >> Hi Mohammad,
> >> nope, unfortunately AspectJ is not able to declare fields "dynamically",
> >> moreover private fields injected by AspectJ have a number of limitations
> >> that are being solved (they have mangled names).
> >>
> >> What you can do however is :
> >> - Declare an interface WithObserverABC
> >> - Use an ITD to place a privare field on that interface
> >> - Inject that interface on all classes that have @Observable
> >> - Write the aspect that calls the observer method when an @Observable
> >> method is executed.
> >>
> >> public aspect InjectObserverABC {
> >>   public interface WithObserverABC {}
> >>
> >>   // this could be private, except for name mangling, depends on AspectJ
> >> version
> >>   public ObserverAbc WithObserverABC.abcObserver = new
> ObserverABCImpl();
> >>
> >>   // you could narrow this
> >>   declare parents : hasmethod(@Observable *(..)) implements
> >> WithObserverABC;
> >>
> >>   before(WithObserverABC instance) : execution(@Observable *
> >> WithObserverABC+.*(..)) && this(instance) {
> >>     instance.abcObserver.
> >> notifyObserver();
> >>   }
> >> }
> >>
> >> I'm not sure about the syntax (I wrote it here in this email, and i need
> >> compiler support when writing pointcuts :) ), but you should get the
> idea.
> >> Eventually you can try to play with generics/abstract aspects to make it
> >> easier to inject new observers, but I cannot think of a way of doing
> this
> >> completely automatically (apart from using APT to parse classes with
> >> @Observer and generate dynamically aop.xml to instantiate concrete
> aspects
> >> ... but that's another story :) )
> >>
> >> Hope this helps,
> >> Simone
> >>
> >> 2010/4/20 Mohammad Norouzi <[email protected]>
> >>>
> >>> Hi Simone,
> >>> >>if I understand correctly, when a method annotated with @Observable
> is
> >>> >> executed, you want to see if there are fields in that class with an
> instance
> >>> >> of an observer, and call a method on the observer.<<
> >>> Actually, when a method is annotated with @Observable (before executing
> >>> and at the time of compiling codes) I want to add (not see) those
> interfaces
> >>> that annotated with @Observer, as  private fields in the observable and
> I
> >>> want to add them because both observer and observable are EJB session
> beans
> >>> so the application server will take the burden of instantiating those
> >>> observers using its injection technique
> >>>
> >>> What I need is something like this:
> >>> for(MyObserver o : observers){
> >>>    declare a private field with a name in this instance of observable
> >>> class
> >>> }
> >>>
> >>>
> >>> On Mon, Apr 19, 2010 at 2:22 PM, Simone Gianni <[email protected]>
> >>> wrote:
> >>>>
> >>>> Hi Mohammad,
> >>>> if I understand correctly, when a method annotated with @Observable is
> >>>> executed, you want to see if there are fields in that class with an
> instance
> >>>> of an observer, and call a method on the observer.
> >>>>
> >>>> You can use AspectJ to execute an advice before/after/around the
> >>>> execution of @Obervable methods, and use thisJoinPoint or the this()
> >>>> construct to find the instance of the method.
> >>>>
> >>>> Once you are there, you must use plain java reflection, and not
> AspectJ,
> >>>> to find fields in that class that contains an observer and invoke
> observer
> >>>> methods.
> >>>>
> >>>> To add @EJB annotation to all fields of type X where X is annotated
> with
> >>>> @Observer, you can use declare @class and write a type pattern that
> uses
> >>>> @Observer annotation. If @Observer annotation is placed on methods,
> you can
> >>>> use hasmethod() to find classes that has such methods, but beware
> cause
> >>>> hasmethod is somewhat experimental.
> >>>>
> >>>> Hope this helps,
> >>>> Simone
> >>>>
> >>>> 2010/4/19 is_maximum <[email protected]>
> >>>>>
> >>>>> Thanks Simone, yes this is exactly what I want... but another
> question
> >>>>> is
> >>>>> that this is used using 'declare' and as far as I know declare is
> >>>>> placed in
> >>>>> aspect definition. How can I place it in a for-loop.
> >>>>>
> >>>>> Let me tell you the scenario may be I am in wrong way...
> >>>>>
> >>>>> I am trying to implement an observer pattern in EJB 3.0. I saw many
> >>>>> implementation using aspectJ but mine is a little different. The
> >>>>> difference
> >>>>> is that I want to inject observer into observable...
> >>>>>
> >>>>> Because session beans are managed object and in my case both observer
> >>>>> and
> >>>>> observable supposed to be session beans I want application server
> >>>>> injects
> >>>>> observer session beans in observable SB and then call observer
> methods
> >>>>>
> >>>>> These observer and observable methods will be annotated by the
> >>>>> developer
> >>>>> with say @Observer and @Observable
> >>>>>
> >>>>> What I wanted was to look for @Observer methods and find their
> >>>>> interface and
> >>>>> put them like this:
> >>>>>
> >>>>> @EJB
> >>>>> private ObserverInterface1 observer1
> >>>>>
> >>>>> than each time the determined method is called I can call
> >>>>> observer1.notifyObserver() method
> >>>>>
> >>>>> Can you please help me on this?
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> Simone Gianni-2 wrote:
> >>>>> >
> >>>>> > Hi  Mohammad,
> >>>>> > maybe you are loooking for the declare annotation statement?
> >>>>> >
> >>>>> >
> http://www.eclipse.org/aspectj/doc/next/adk15notebook/annotations-declare.html
> >>>>> >
> >>>>> > Simone
> >>>>> >
> >>>>> >
> >>>>>
> >>>>>
> >>>>> -----
> >>>>> --
> >>>>> Regards
> >>>>>
> >>>>> Mohammad Norouzi
> >>>>>
> >>>>> Help each other to reach the future faster
> >>>>>
> >>>>> http://pixelshot.wordpress.com Pixelshot Photoblog
> >>>>>
> >>>>> http://brainable.blogspot.com Brainable Blog
> >>>>>
> >>>>>
> >>>>> --
> >>>>> View this message in context:
> >>>>>
> http://old.nabble.com/How-to-rewrite-a-class-with-AspectJ-tp28280867p28287273.html
> >>>>> Sent from the AspectJ - users mailing list archive at Nabble.com.
> >>>>>
> >>>>> _______________________________________________
> >>>>> aspectj-users mailing list
> >>>>> [email protected]
> >>>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> aspectj-users mailing list
> >>>> [email protected]
> >>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>>>
> >>>
> >>>
> >>> _______________________________________________
> >>> aspectj-users mailing list
> >>> [email protected]
> >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>>
> >>
> >>
> >> _______________________________________________
> >> aspectj-users mailing list
> >> [email protected]
> >> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >>
> >
> >
> > _______________________________________________
> > aspectj-users mailing list
> > [email protected]
> > https://dev.eclipse.org/mailman/listinfo/aspectj-users
> >
> >
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>



-- 
Regards,
Mohammad
--------------------------
Sun Certified Web Developer
ExpertsExchange Certified, Master:
http://www.experts-exchange.com/M_1938796.html
Have a look at some pictures @ http://pixelshot.wordpress.com/
Do you like to read, see http://brainable.blogspot.com/
For the Persians see http://fekre-motefavet.blogspot.com/
English Forum:
http://n2.nabble.com/English-Phrase-Finder-For-Persians-f3274251.html
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to