Yes, proxying could be getting in the way and you may need to adjust your pointcut to cope with an invocation via a proxy (particularly if the proxy is actually invoking the code via reflection - using AspectJ with reflective invocation needs special consideration).
Andy On 14 July 2010 08:02, Kashtan, Daniel <[email protected]> wrote: > Hey Andy, > > Sorry about the last confusing email. I was able to figure out what was > causing me to have problems with using aspects inside the bundle where the > aspect was defined. The ant build just has to have the inpath set correctly. > I was having trouble because of some stale copy compilation business that I > took care of. > > Also, I was able to get rid of javac in my ant build and just use iajc, so > less clutter :) Thanks for pointing out that I just had to get rid of those > useless @override annotations. > > I am still not able to get the call pointcut to work. It still works as > execution. My inpath for that bundle touches every source file in that > bundle, so does this mean that the call to that function has to be coming > from outside the bundle? When I run through the debugger, the function is > getting called from within the same bundle, but in the stack trace, there is > some funky proxy stuff going on in-between where the function is called and > where it finally executes the method. Could this be messing up aspectJ? Let > me know what you think. > ________________________________________ > From: [email protected] [[email protected]] > On Behalf Of Andy Clement [[email protected]] > Sent: Tuesday, July 13, 2010 10:49 AM > To: [email protected] > Subject: Re: [aspectj-users] Aspectj only works on annotations when they are > in the same project? (using OSGI) > > On 13 July 2010 06:16, Kashtan, Daniel <[email protected]> wrote: >> You mentioned that Joinpoints in undo_1.0.0.jar will not be woven. I agreed >> with that, but tried to see if they would anyways, and I am able to get >> advice to get called even if the annotation I am using in on a method in the >> undo jar. I am confused by this, does it have something to do with the way >> execution works? > > i don't quite understand what you mean. If you want to weave what is > in undo_1.0.0.jar it needs to be on the inpath. If you have it on the > aspectpath we only discover aspects on it and use it to resolve type > references. Any AspectJ pointcut will attempt to match against code > it sees - either source or code from inpath. > >> >> compile: >> [iajc] error at public void commit() >> [iajc] ^^^^^^ >> [iajc] >> /home/djkasht/workspaceBlueprint/bp/bp-trunk/bundles/Undo/src/undo/UndoServiceImp.java:44:0::0 >> The method commit() of type UndoServiceImp must override a superclass method >> [iajc] error at public void start(BundleContext context) throws Exception >> [iajc] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >> [iajc] >> /home/djkasht/workspaceBlueprint/bp/bp-trunk/bundles/Undo/src/undo/UndoServiceImp.java:88:0::0 >> The method start(BundleContext) of type UndoServiceImp must override a >> superclass method >> [iajc] error at public void stop(BundleContext arg0) throws Exception > > I think you'll find that you are using @Override on a method that > implements an interface - so you aren't really overriding. This is > the eclipse compiler behaving a little different to javac. > >> Here is what my merged iajc ant call looks like: >> >> <!--<javac srcdir="src" destdir="${bin.dir}" debug="true" >> source="1.5" target="1.5"> >> <classpath refid="classpath" /> >> </javac>--> >> <iajc srcdir="src" sourceRoots="src/undo/aspect" >> destdir="${bin.dir}" debug="true" source="1.5"> >> <classpath> >> <pathelement path="classpath" /> >> <pathelement >> location="${blueprint.home}/lib/aspectjrt.jar" /> >> <pathelement location="${bin.dir}" /> >> </classpath> >> <classpath refid="classpath" /> >> </iajc> > > I see - you have used sourceroots to weave your undo jar - I thought > you would use inpath if you wanted to do that (as you'd already built > that jar). Yes, execution will weave into undo if you pass it on > sourceroots - as I mentioned above pointcuts will be matched against > all code on the inpath or passed in as source. > > Andy > > >> >> ________________________________________ >> From: [email protected] [[email protected]] >> On Behalf Of Andy Clement [[email protected]] >> Sent: Monday, July 12, 2010 3:55 PM >> To: [email protected] >> Subject: Re: [aspectj-users] Aspectj only works on annotations when they are >> in the same project? (using OSGI) >> >> If your call joinpoints are in 'src' for the bundle, then yes they >> should be candidates for weaving. Joinpoints in undo_1.0.0.jar will >> not be woven (but I think you realise that). >> >> You could merge your steps together and see if that makes any >> difference. Pass the source to iajc rather than performing that >> earlier javac step. >> >> Andy >> >> On 12 July 2010 11:48, Kashtan, Daniel <[email protected]> wrote: >>> My call joinpoints should be in the code being passed to for weaving. The >>> method I annotated is called by a function in a different package, but the >>> same bundle. I believe I tell IAJC to compile everything in ${bin.dir} to >>> ${woven.bin.dir}. When I say everything, it should compile everything in >>> the bundle (all the packages). Here is my javac and iajc ant build code >>> below. I am unsure about if this is the problem, but it sure seems to be >>> the only thing possible. >>> >>> <javac srcdir="src" destdir="${bin.dir}" debug="true" >>> source="1.5" target="1.5"> >>> <classpath refid="classpath" /> >>> </javac> >>> <mkdir dir="${woven.bin.dir}" /> >>> <iajc inpath="${bin.dir}" destdir="${woven.bin.dir}" >>> aspectPath="${blueprint.home}/plugins/undo_1.0.0.jar" debug="true" >>> source="1.5"> >>> <classpath refid="classpath" /> >>> </iajc> >>> ________________________________________ >>> From: [email protected] [[email protected]] >>> On Behalf Of Andy Clement [[email protected]] >>> Sent: Monday, July 12, 2010 2:05 PM >>> To: [email protected] >>> Subject: Re: [aspectj-users] Aspectj only works on annotations when they >>> are in the same project? (using OSGI) >>> >>> Are you sure your call join points were in the code being passed to >>> AspectJ for weaving? If your call joinpoints were not but your >>> execution joinpoints were, that would cause what you are seeing. >>> >>> Andy >>> >>> On 12 July 2010 10:56, Kashtan, Daniel <[email protected]> wrote: >>>> I finally got my adivce to intercept an annotated method join point. I am >>>> not sure exactly what did it. When I changed it from call to execution it >>>> worked. I had tried this before, but had no success. I made a lot of >>>> changes to my ant build files, so it must have been a combination of >>>> things that straightened out the problem. Can anyone elaborate on why >>>> execution would make it work when call would not? It is a little >>>> anti-climatic to not fully understand why things went right. >>>> >>>> Also, here is my final advice code: >>>> >>>> after() : execution(@Test * *(..)) >>>> { >>>> System.out.println("COMMIT!"); >>>> } >>>> ________________________________________ >>>> From: [email protected] >>>> [[email protected]] On Behalf Of Kashtan, Daniel >>>> [[email protected]] >>>> Sent: Monday, July 12, 2010 9:54 AM >>>> To: [email protected] >>>> Subject: RE: [aspectj-users] Aspectj only works on annotations when they >>>> are in the same project? (using OSGI) >>>> >>>> I added source="1.5" to both of the iajc ant calls I make, but nothing >>>> changed. >>>> >>>> I went through the steps of the project you detailed and I was able to >>>> build it all and get the same output at the end. This is a great proof of >>>> concept for confidence. >>>> >>>> Any other suggestions on what I could try? I am still not able to get it >>>> to work in my project. I'll let you know what I did if I figure it out >>>> first :) >>>> ________________________________________ >>>> From: [email protected] >>>> [[email protected]] On Behalf Of Andy Clement >>>> [[email protected]] >>>> Sent: Friday, July 09, 2010 5:33 PM >>>> To: [email protected] >>>> Subject: Re: [aspectj-users] Aspectj only works on annotations when they >>>> are in the same project? (using OSGI) >>>> >>>> And that Test annotation has runtime retention does it? >>>> >>>>> Also, is what I am trying to do possible? >>>>> I've gotten an aspect to work that intercepts system.out.println in other >>>>> bundles, but this annotation based one is killing me :( >>>> >>>> You haven't said anything that makes me believe it isn't possible, but >>>> I can't quite put my finger on what you are not quite doing. What if >>>> you ignore Ant and do something far simpler: >>>> >>>> one/Test.java --- >>>> import java.lang.annotation.*; >>>> >>>> @Retention(RetentionPolicy.RUNTIME) >>>> public @interface Test {} >>>> --- >>>> >>>> one/Azpect.java --- >>>> public aspect Azpect { >>>> before(): call(@Test * *(..)) {} >>>> } >>>> --- >>>> >>>> two/Code.java --- >>>> public class Code { >>>> �...@test >>>> public void m() {} >>>> >>>> public void n() {} >>>> >>>> public void foo() { >>>> m(); >>>> n(); >>>> m(); >>>> } >>>> } >>>> --- >>>> >>>> Now to build it: >>>> 1) build the aspect and annotation (your project 'A') >>>> cd one >>>> ajc *.java -1.5 -outjar azpect.jar >>>> >>>> 2) build the code (your project 'B') >>>> cd ..\two >>>> ajc Code.java -classpath >>>> "..\one\azpect.jar;n:\aspectj169-dev\lib\aspectjrt.jar" -1.5 >>>> >>>> 3) weave the code >>>> cd ..\three >>>> ajc -inpath ..\two -aspectpath ..\one\azpect.jar -showWeaveInfo -1.5 -d . >>>> Join point 'method-call(void Code.m())' in Type 'Code' (Code.java:8) >>>> advised by before advice from 'Azpect' (azpect.jar!Azpect.class:2(from >>>> Azpect.java)) >>>> Join point 'method-call(void Code.m())' in Type 'Code' (Code.java:10) >>>> advised by before advice from 'Azpect' (azpect.jar!Azpect.class:2(from >>>> Azpect.java)) >>>> >>>> So the two calls to m() were advised. >>>> >>>> Now we just have to work out why whatever you are doing is different >>>> to that. Have you tried specifying source="1.5" in your iajc task? >>>> >>>> Andy >>>> >>>> On 9 July 2010 13:56, Kashtan, Daniel <[email protected]> wrote: >>>>> As I test my code more and more, it seems that I can get aspects working >>>>> across bundles, but I can't with annotations, and I can't get the >>>>> annotations to trigger interception even in the same bundle as the aspect. >>>>> >>>>> The top one will work, but the one below it won't, despite the function >>>>> pullData() having the annotation above it. There must be something >>>>> causing aspectj to not recognise that annotation :( >>>>> >>>>> after() : call(* pullData(..)) >>>>> { >>>>> System.out.println("COMMIT!@"); >>>>> } >>>>> >>>>> after() : call(@Test * *(..)) >>>>> { >>>>> System.out.println("COMMIT!"); >>>>> } >>>>> ________________________________________ >>>>> From: [email protected] >>>>> [[email protected]] On Behalf Of Kashtan, Daniel >>>>> [[email protected]] >>>>> Sent: Friday, July 09, 2010 3:04 PM >>>>> To: [email protected] >>>>> Subject: RE: [aspectj-users] Aspectj only works on annotations when they >>>>> are in the same project? (using OSGI) >>>>> >>>>> I changed my build so that my woven code is put in a separate folder, >>>>> which my build step now uses. I still can't get my aspect to work though, >>>>> but this seems like a good idea anyways. >>>>> >>>>> (answer to you last paragraph) >>>>> A is on the classpath of B. I am able to get B to see my annotation >>>>> without any trouble. I am not sure what an eclipse builder step is, so I >>>>> believe I am not using one. I am doing everything from the command line >>>>> and just using eclipse as an editor. Here is where my iajc ant call lives: >>>>> >>>>> <target name="compile"> >>>>> <mkdir dir="${bin.dir}" /> >>>>> <javac srcdir="src" destdir="${bin.dir}" debug="true"> >>>>> <classpath refid="classpath" /> >>>>> </javac> >>>>> <mkdir dir="${woven.bin.dir}" /> >>>>> <iajc inpath="${bin.dir}" destdir="${woven.bin.dir}" >>>>> aspectPath="${blueprint.home}/plugins/undo_1.0.0.jar" debug="true"> >>>>> <classpath refid="classpath" /> >>>>> </iajc> >>>>> <copy todir="${woven.bin.dir}"> >>>>> <fileset dir="src" excludes="**/*Test.java" /> >>>>> </copy> >>>>> </target> >>>>> >>>>> >>>>> Also, is what I am trying to do possible? I've gotten an aspect to work >>>>> that intercepts system.out.println in other bundles, but this annotation >>>>> based one is killing me :( >>>>> ________________________________________ >>>>> From: [email protected] >>>>> [[email protected]] On Behalf Of Andy Clement >>>>> [[email protected]] >>>>> Sent: Friday, July 09, 2010 2:36 PM >>>>> To: [email protected] >>>>> Subject: Re: [aspectj-users] Aspectj only works on annotations when they >>>>> are in the same project? (using OSGI) >>>>> >>>>> i'd be very cautious about specifying the output folder to be the same >>>>> as the input folder: inpath="${bin.dir}" destdir="${bin.dir}" >>>>> >>>>> it isn't like aspectj pre-loads all the code ready to do a weave, you >>>>> might get very strange results with that. how about: >>>>> inpath="${bin.dir}" destdir="${woven.bin.dir}" >>>>> >>>>> I presume, although your annotation is in bundle A that you are using >>>>> it in bundle B? I got that impression. If that is the case, how is >>>>> the code in B compiling unless A is on the classpath? You aren't >>>>> using an Ant step defined as an eclipse builder step are you? The >>>>> iajc is something that is running later? >>>>> >>>>> Andy >>>>> >>>>> On 9 July 2010 09:55, Kashtan, Daniel <[email protected]> wrote: >>>>>> I hope I can explain everything correctly. >>>>>> >>>>>> I have my aspect in bundle A. My join points are in bundle B. My >>>>>> annotation is in bundle A, but I am not even sure if this matters at >>>>>> all. My ant compilation for bundle B has an aspect path dependency I >>>>>> believe, I use this iajc tag: >>>>>> >>>>>> <iajc inpath="${bin.dir}" destdir="${bin.dir}" >>>>>> aspectPath="${blueprint.home}/plugins/undo_1.0.0.jar" debug="true"> >>>>>> <classpath refid="classpath" /> >>>>>> </iajc> >>>>>> >>>>>> I have another aspectj function in my .aj file in bundle A. This one >>>>>> works, which is why I think the usage of annotations is somehow causing >>>>>> the problem. >>>>>> >>>>>> void around() : call(void java.io.PrintStream.println(String)) >>>>>> && !within(HelloAspect){ >>>>>> System.out.println("Hi from HelloAspect ;-)"); >>>>>> } >>>>>> >>>>>> ________________________________________ >>>>>> From: [email protected] >>>>>> [[email protected]] On Behalf Of Andy Clement >>>>>> [[email protected]] >>>>>> Sent: Friday, July 09, 2010 11:55 AM >>>>>> To: [email protected] >>>>>> Subject: Re: [aspectj-users] Aspectj only works on annotations when they >>>>>> are in the same project? (using OSGI) >>>>>> >>>>>> Hi, >>>>>> >>>>>> How does your code containing the join points compile if you don't >>>>>> have the annotation in the same project that is using it? Do you have >>>>>> a classpath dependency (maybe an aspectpath dependency) from the join >>>>>> point containing project to the aspectj project? I would need to know >>>>>> how the annotation is being used in the code-to-be-woven and what >>>>>> relationships you have between the projects. >>>>>> >>>>>> Andy >>>>>> >>>>>> On 9 July 2010 07:19, Kashtan, Daniel <[email protected]> wrote: >>>>>>> Hey all, >>>>>>> >>>>>>> I am using compile-time-weaving and OSGI. I cannot figure out why, but >>>>>>> my aspects don't work unless my annotation file is in the same project >>>>>>> where my join points are. Basically, I have gotten the aspect below to >>>>>>> work if my aspect is in one project, and my annotation and java code >>>>>>> with join points are in another. I'd like to move my annotation file >>>>>>> into the same project as the one with the aspect, but my aspects will >>>>>>> stop working then :( >>>>>>> >>>>>>> I am using aspect code like this: >>>>>>> >>>>>>> after() : call(@CommitingFunction * *(..)) >>>>>>> { >>>>>>> System.out.println("Commit clicked"); >>>>>>> } >>>>>>> >>>>>>> My annotation is simply just this: >>>>>>> >>>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>>> public @interface CommitingFunction >>>>>>> { >>>>>>> >>>>>>> } >>>>>>> >>>>>>> This e-mail and any files transmitted with it may be proprietary and >>>>>>> are intended solely for the use of the individual or entity to whom >>>>>>> they are addressed. If you have received this e-mail in error please >>>>>>> notify the sender. >>>>>>> Please note that any views or opinions presented in this e-mail are >>>>>>> solely those of the author and do not necessarily represent those of >>>>>>> ITT Corporation. The recipient should check this e-mail and any >>>>>>> attachments for the presence of viruses. ITT accepts no liability for >>>>>>> any damage caused by any virus transmitted by this e-mail. >>>>>>> _______________________________________________ >>>>>>> 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 >>>>> >>>> _______________________________________________ >>>> 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 >> _______________________________________________ >> 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
