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
