Thanks Andy,
It works great :)

On 4/26/10, Andy Clement <[email protected]> wrote:
>
> Hi,
>
> inline answers:
>
>
> On 26 April 2010 00:43, Mohammad Norouzi <[email protected]> wrote:
> > Thank you Andy,
> > I got it. As you stated @annotation is for dynamic matching and this has
> > performance issues, can you tell me how can I access the annotation on
> the
> > method in a static way? I assumed that we can access it through
> > thisJoinPointStaticPart but I couldn't find any method for that.
> >
> >         pointcut eventMethods(Object obj,Object iparam) :
> >             within(@Observable com..*)
> >             && execution(@Event * *.*(..))
> >             && target(obj)
> >             && args(iparam);
>
>
> If you do need to bind the annotation, you should use @annotation() -
> yes there is some cost due to retrieval of it, but it should be the
> same cost as if you accessed it through thisJoinPointStaticPart (and
> you'd get it through that by accessing the method and retrieving it
> via reflection).  I only wanted you to avoid @annotation if you were
> just matching and not binding because that is usually unnecessary
> overhead.  So the best thing to do above is add the @annotation
> clause:
>
>           pointcut eventMethods(Object obj,Object iparam,Event e) :
>               within(@Observable com..*)
>              && @annotation(e)
>
>              && execution(@Event * *.*(..))
>               && target(obj)
>               && args(iparam);
>
>
> See http://eclipse.org/aspectj/doc/released/README-167.html (the
> bottom section on annotation binding) for some comparisons on recent
> improvements in this area.  There is an optimized syntax for some
> kinds of annotation value that avoids any reflection cost but maybe
> get your code working first before changing it to exploit that.  If
> you are interested in learning more,
> http://eclipse.org/aspectj/doc/released/README-161.html - see the
> section on 'optimized syntax for annotation value binding'.
>
>
> > Apart from that I've got another problem. I want to add a field with an
> > annotation on it inside all classes which are marked with @Observable. I
> had
> > a look at OvserverProtocol example and some others in Internet but they
> > don't meet my requirements. So I have this code:
> >
> >     interface ObservableInterface {};
> >
> >     declare parents: @Observable com..* implements ObservableInterface;
> >
> >     @EJB
> >     private EventDispatcher ObservableInterface.eventDispatcher;
> >
> >
> > now in my advice how can I call dispatch(Event) method of that observable
> > class:
> >
> >         after(Object obj,Object iparam) : eventMethods(obj,iparam) {
> >
> >
> System.out.println("thisJoinPoint:"+thisJoinPointStaticPart.toLongString());
> >
> >
> System.out.println("thisJoinPointSig:"+thisJoinPointStaticPart.getSignature().toLongString());
> >             System.out.println("input param: "+iparam);
> >             System.out.println("target objet: "+obj);
> >             com.foo.listener.Event e = new com.foo.listener.Event();
> >             e.setName("don't know"); //1
> >             e.setParam(iparam);
> >             e.setSource(obj.getClass().getName());
> >
> >             //eventDispatcher.dispatch(e); //2
> >
> >         }
> >
> > //1   how to access @Event to extract event name from it
> > //2   how to call dispatch(Event) method
>
>
> //1 - use the binding code I showed above
> //2
> -  ((ObservableInterface)thisJoinPoint.getThis()).eventDispatcher.dispatch(e);
>   or bind 'this' in the pointcut and access the eventdispatcher on it.
>
>
> Andy
>
>
> >
> > thanks
> >
> > On Sun, Apr 25, 2010 at 10:17 PM, Andy Clement <[email protected]
> >
> > wrote:
> >>
> >> @annotation can match dynamically.  dynamic matching throughtout
> >> AspectJ means we couldn't check what you asked statically (at compile
> >> time) so had to insert some code to check it at runtime.  Static
> >> matching leaves no runtime overhead.
> >>
> >> > eventMethods(Event e,Object obj,Object iparam) :
> >> > ...
> >> > && @args(e)
> >>
> >> That isn't what you want.  That would match where the join point takes
> >> an argument and that the type of that argument has the Event
> >> annotation.  Eg. this method would match because SomeType is marked
> >> @Event:
> >>
> >> public void foo(SomeType obj)
> >>
> >> where:
> >>
> >> @Event
> >> class SomeType {}
> >>
> >> What you want is:
> >>
> >> eventMethods(Event e, Object obj, Object iparam):
> >> && @annotation(e)
> >>
> >> because '@annotation' is being matched against the subject of the
> >> joinpoint and for method execution, the subject is the method itself.
> >>
> >> Andy
> >>
> >> On 25 April 2010 10:32, Mohammad Norouzi <[email protected]> wrote:
> >> > 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
> >> >
> >> >
> >> _______________________________________________
> >> 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