Dean,

Yes, you are right. it works!

I love this forum. :)

Thanks you for the explanation between "call" vs "execute" !

-herve


On Dec 14, 2007 11:10 AM, Dean Wampler <[EMAIL PROTECTED]> wrote:

> Doing a quick read of your code, I think the problem is that you're using
> "call(...)" in the pointcut definition, which won't work with the reflection
> API. The "call" means aspectj will try to advise the code that is calling
> the method, but that's happening inside Java's reflection API, which aspectj
> won't touch. Even if aspectj could advise JDK code, it still wouldn't know
> to advise the reflection API in this situation, because the method is
> referred to by a string name, rather than by the actual class and method
> itself.
> Instead, I think if you use "execute(...)" in your pointcut, it will work.
> In this case, aspectj will advise your code - the method whose exception you
> are trying to catch.
>
> I hope this works!
>
> dean
>
>
> On Dec 14, 2007, at 1:02 PM, Herve Attia wrote:
>
> Hello,
>
> First of all, I'm a newbie with AOP. I'm learning aspectJ framework
>
> I'm testing the "*exception introduction pattern*" example ( ch11.4.2)
> from the "AspectJ in action" book.
>
> The sample works great until you invoke the caller object using reflection
> API. The *PreserveCheckedException *advice code (described below ) is NOT
> invoked anymore.
>
> Once the the *ConcernAspect *around advice throws the 
> *ConcernRuntimeException,
> *this exception is directly wrapped within an *
> java.lang.reflect.InvocationTargetException .*
>
> The issue is not related to the sample but to some side effect between
> reflection framework exception handling and AspectJ weaving.
>
> How can we make the PreserveBusinessException advice code invoked in this
> special case ?
>
> I attached the source code.
>
> Thanks for your advice! ;)
>
> -herve
>
>
>
>
> ///////////////////  test program ////////////////////////////////
>
> import java.lang.reflect.Method;
>
>
> public class TestException {
>     public static void main(String[] args) {
>     BusinessClass bc = new BusinessClass();
>
> /*
>      //works fine!. PreserveBusinessException Advice code is invoked
>      bc.businessMethod1();
>     try {
>         bc.businessMethod2();
>     } catch (Exception ex) {
>         // Do something...
>         // Log it, execute recovery mechanism, etc.
>         System.out.println ("Caught:" + ex);
>     }
> */
>
>     try {
>
>         //PreserveBusinessException Advice code is not invoked
>
> *        Class cl=Class.forName ("BusinessClass");
>         Method method = cl.getMethod("businessMethod2", null);
>         method.invoke(bc, null);*
>
>
>     } catch (Exception ex) {
>         // Do something...
>         // Log it, execute recovery mechanism, etc.
>         System.out.println("Caught:" + ex);
>     }
>   }
> }
>
> ////////////////////////  abstract aspect class ///////////////////////
>
> public abstract aspect *ConcernAspect *{
>     abstract pointcut operations();
>
>     Object around() : operations() {
>     try {
>         return proceed();
>     }
>      catch (Throwable ex) {
>         // do something
>         throw new ConcernRuntimeException(ex);
>     }
>  }
> }
>
>
> ////////////////////////  PreserveBusinessException : aspect which
> captures all the methods throwing a *ConcernRuntimeException *and throws
> the cause instead ///////////////////////
>
> public aspect *PreserveBusinessException *{
>     declare precedence: PreserveBusinessException, ConcernAspect+;
>
>     after() throwing(ConcernRuntimeException ex) throws BusinessException:
> call(* *.*(..) throws BusinessException) {
>     Throwable cause = ex.getCause();
>     System.out.println("PreserveBusinessException advice called:" + ex);
>
>     if (cause instanceof BusinessException) {
>         throw (BusinessException)cause;
>     }
>     throw ex;
>     }
> }
>
>
> ////////////////////////  business concrete aspect implementation class
> ///////////////////////
>
> public aspect *BusinessConcernAspect *extends ConcernAspect {
>     pointcut operations() : execution(* BusinessClass.business*());
> }
>
>
> ////////////////////////  businessClass ///////////////////////
>
> public class BusinessClass {
>     public void businessMethod2() throws BusinessException,
> IllegalStateException{
>     // business logic...
>     throw new BusinessException();
>     }
> }
>
>
> ////////////////////////  BusinessException class ///////////////////////
>
> public class BusinessException extends Exception {
> }
>
> ////////////////////////  ConcernRuntimeException class
> ///////////////////////
>
> public class ConcernRuntimeException extends RuntimeException {
>     public ConcernRuntimeException(Throwable cause) {
>     super(cause);
>     }
> }
>
>
>
>
> <testException.rar>_______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
> Dean Wampler, Ph.D.
> dean at objectmentor.com
> http://www.objectmentor.com
> See also:
> http://www.aspectprogramming.com  AOP advocacy site
> http://aquarium.rubyforge.org     AOP for Ruby
> http://www.contract4j.org         Design by Contract for Java5
>
>
>
>
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>


-- 

www.herveattia.com
Cell (650) 861 0007
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to