Hi,

Does, maybe, a 

"return pjp.proceed()" 
in the place of
"pjp.proceed()"
help?


-B.




>________________________________
> From: Romain Muller <romain.mul...@esial.net>
>To: aspectj-users@eclipse.org 
>Sent: Friday, July 27, 2012 5:46 PM
>Subject: [aspectj-users] Keeping advice code DRY when using ambiguous bindings
> 
>
>Hi,
>
>
>Given the following high-level pointcuts:
>* AnyMethod() : execution(* *(..));
>* AnyThrowing() : execution(* *(..) throws (!RuntimeException+));
>* AnnotatedClass(SomeAnnotation annotation) : within(@SomeAnnotation *) && 
>@within(annotation);
>* AnnotatedMethod(SomeAnnotation annotation) : execution(@SomeAnnotation * 
>*(..)) && @annotation(annotation);
>
>
>I want to around-advise some logic on the following join points:
>1. AnnotatedClass(annotation) && AnyMethod() && !AnyThrowing() && 
>!AnnotatedMethod(*);
>2. AnnotatedClass(annotation) && AnyThrowing() && !AnnotatedMethod(*);
>3. AnnotatedMethod(annotation) && !AnyThrowing();
>4. AnnotatedMethod(annotation) && AnyThrowing();
>
>
>The advise needs the information on the "most specific" @SomeAnnotation, and 
>in case the advised method throws checked exceptions, I need to re-throw them 
>unchanged.
>
>
>Now, for all of these advises, I need to apply the exact same logic around 
>"proceed();", but I currently have to write it four times. I could reduce it 
>to two if I didn't care about re-throwing checked exceptions unchanged (or 
>would be OK to use Unsafe#throwException(Throwable)).
>
>
>The advises pretty much look like the following (comments to call out the 
>pointcut specifics):
>Object around(final SomeAnnotation annotation)
>throws Exception // if it's a checked-throwing pointcut
>: SomePointCut(annotation) {
>try {
>return SomeClass.doSomeStuff(new Callable<Object>(){
>@Override public final Object call() throws Exception {
>proceed();
>}
>});
>} catch(final RuntimeException re) {
>throw re;
>} catch(final Exception e) {// if it's **not** a checked-throwing pointcut
>throw new AssertionError("Shouldn't have caught checked exception"); // if 
>it's **not** a checked-throwing pointcut
>} // if it's **not** a checked-throwing pointcut
>}
>
>
>So, SomeClass.doSomeStuff expects a callable, and will ".call()" it and let 
>thrown exceptions go out unchanged. I'm very annoyed having to create the "new 
>Callable" in every one of the four advises, so I've tried to have a static 
>method that gets a ProceedingJoinPoint in, to which I'd pass 
>"(ProceedingJoinPoint)thisJoinPoint", like so:
>
>
>private static final Object doSomeStuffAroundProceed(final ProceedingJoinPoint 
>pjp) {
>return SomeClass.doSomeStuff(new Callable<Object>(){
>@Override public final Object call() throws Exception {
>pjp.proceed();
>}
>});
>}
>
>
>But it turns out that when I do this, "pjp.proceed()" does nothing. Is there 
>anything i'm doing wrong.
>
>
>Other than that, is there a way I could write a single advice that'd advise 
>the four cases at once?
>
>
>Thanks in advance,
>[ Romain Muller | Software Development Engineer | romain.mul...@esial.net ] 
>
>_______________________________________________
>aspectj-users mailing list
>aspectj-users@eclipse.org
>https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
>
_______________________________________________
aspectj-users mailing list
aspectj-users@eclipse.org
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to