Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] AspectJ and Eclipse RCP

Hey Dominic,

great to hear that you got everything working and thanks for sharing your findings. Much appreciated.

Cheers,
-Martin




> 
> Martin;
> 
> Thank you for your reply.  First off: I solved my issue, and AspectJ is now working as expected.  I'll walk through the issues.
> 
> Yes, I am using Equinox weaving.
> 
> Because Eclipse 4 RCP is OSGi based, OSGi issues and conventions must be addressed.
> 
> The first breakthrough I had was when I modified my pointcut to use execution instead of call.
> i.e. pointcut mypointcut: execution(* *.myMethod());
> 
> That gave me aspect oriented behavior, though my before: aspect ran after the method.
> 
> I started looking more closely at the difference between execution and call, and I found that call gets weaved around the call, i.e. in the class / method one higher than the "target" method in the stack.
> 
> This means that I need to import the AspectJ bundles into the bundles which use the annotated methods, rather than the bundles which contain the annotated methods.
> 
> I then identified (through Internet research) a more subtle difference between execution and call: namely that call is weaved against the declared type, rather than the object type.  OSGi encourages programming to interfaces, so all code that uses a service from a different bundle declares the variable as the interface type.  When I tried to annotate the concrete implementation method, AspectJ didn't do anything.  It's necessary to annotate the interface's method declaration.
> 
> Retrieving the parameter from the custom annotation was a brief struggle as well, but that too fell to Internet research.
> 
> At the end of the day, it all works, and is quite slick.  Aspect Oriented Programming and AspectJ saved me from adding a layer, and passing around a session object, to an already complex system in order to apply authorization.
> 
> For anyone that is interested here is a basic version of the aspect I created:
> Public aspect MyAspect
> {
>    pointcut mypointcut(MyAnnotation a): call(@MyAnnotation * *()) && @annotation(a);
> 
>    before(MyAnnotation a) throws MyException: mypointcut(a)
>    {
>        ...Aspect / advice code...
>    }
> }
> 
> I apologize for the length.
> 
> Thank you,
> 
> Dominic L. Hilsbos, MBA, CSDA 
> Director - Information Technology 
> Perform Air International Inc.
> 
> 
> -----Original Message-----
> From: aspectj-users-bounces@xxxxxxxxxxx [mailto:aspectj-users-bounces@xxxxxxxxxxx] On Behalf Of Martin Lippert
> Sent: Thursday, February 18, 2016 5:57 AM
> To: aspectj-users@xxxxxxxxxxx
> Subject: Re: [aspectj-users] AspectJ and Eclipse RCP
> 
> Hey Dominic,
> 
> I guess you are using the Equinox weaving feature to weave your aspects into your RCP application, right?
> Or is this limited to the scope of the bundle that the aspect lives in?
> 
> Maybe you can point me to a sample project that reproduces this behavior. Would love to take a more detailed look.
> 
> Cheers,
> -Martin
> 
> 
> 
>> 
>> Users;
>> 
>> I'm trying to use AspectJ with an Eclipse RCP program.  I want to use aspects for the normal things, i.e. authorization and logging.
>> 
>> My failures seem to fall into 2 broad types: crash and burn or don't do anything.
>> 
>> My first try aspect looks like this:
>> 
>> Public aspect MyAspect
>> {
>>   pointcut mypointcut: call(* *.myMethod());
>> 
>>   before(): mypointcut()
>>   {
>>       System.out.println("Hello Aspect oriented programming");
>>   }
>> }
>> 
>> I have extensive logging turned on, but am not really sure what I'm looking for.
>> I get this: info register aspect <MyAspect> I also get this: info 
>> weaving bundle '<my bundle>' with a bunch of stuff in between.
>> I even get: debug weaving '<MyService>'
>> 
>> MyService registers with OSGi Declarative Services, and is injected into the RCP object, but when I call myMethod on MyService the aspect isn't called.
>> 
>> On the other hand, when I set up an aspect like this:
>> Public aspect MyAspect
>> {
>>   pointcut mypointcut: call(* *.myMethod());
>> 
>>   before(): mypointcut()
>>   {
>>       System.out.println("Hello Aspect oriented programming");
>>   }
>> }
>> 
>> The RCP code freaks out, and doesn't run.
>> 
>> All the debug type output from AspectJ suggests that the AspectJ runtime is loaded and running.
>> 
>> BTW, where I eventually plan to go with this is to tie it to a Runtime Annotation, as follows:
>> Public aspect MyAspect
>> {
>>   pointcut mypointcut: call(@MyAnnotation * *());
>> 
>>   before(): mypointcut()
>>   {
>>       System.out.println("Hello Aspect oriented programming");
>>   }
>> }
>> 
>> But this too generates no aspect output.
>> 
>> Any thoughts?
>> 
>> Thank you,
>> 
>> Dominic L. Hilsbos, MBA, CSDA
>> Director - Information Technology
>> Perform Air International Inc.
>> 
>> 
>> _______________________________________________
>> aspectj-users mailing list
>> aspectj-users@xxxxxxxxxxx
>> To change your delivery options, retrieve your password, or 
>> unsubscribe from this list, visit 
>> https://dev.eclipse.org/mailman/listinfo/aspectj-users
> 
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit https://dev.eclipse.org/mailman/listinfo/aspectj-users
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://dev.eclipse.org/mailman/listinfo/aspectj-users



Back to the top