0 Replies Latest reply on May 5, 2011 10:27 AM by stevenodb

    Passing MetaData through Invocations

    stevenodb

      I'm trying to use the JBoss AOP *Invocation structure to pass metadata between two advices on the same Jointpoint (one call, the other exection). I read this in the documentation of JBossAOP:

       

      You can attach untyped metadata to the invocation object, or even to the response. This allows advices to pass contextual data to one another in the incoming invocation or outgoing response for instance if you had advices running on a remote client that wanted to pass contextual data to server-side aspects. This method on invocation gets you access to a org.jboss.aop.metadata.SimpleMetaData instance so that you can attach or read data. SimpleMetaData getMetaData()

       

      So I was hopeful that I could push some metadata on in one advice, and pull it of in a later advice. However, I don't seem to be able to get it to work. All I'm pulling off at the receiving end are null-pointers.

       

      Some example code:

       

      Caller side aspect:

       

      @Aspect(scope=Scope.PER_INSTANCE)

      public class HelloWorldCaller {

       

        @PointcutDef("call(java.lang.String $instanceof{backend.HelloBackEndRemote}->getValue(..))")

        public static Pointcut getValueCallerPointcut;

       

       

        @Bind(pointcut="hello.HelloWorldCaller.getValueCallerPointcut", type=AdviceType.AROUND)

                public Object helloAdv(CallerInvocation invocation) throws Throwable {

       

                          Object invResult = null;

       

        SimpleMetaData md = invocation.getMetaData();

        md.addMetaData("pom", "appel", "peer", PayloadKey.AS_IS);

       

                          try {

                                         invResult = invocation.invokeNext();

                          } catch (Exception e) {

                                    e.printStackTrace();

                          }

       

       

        return "[caller " + invResult + "]";

                }

      }

       

      Callee side aspect:

       

      @Aspect(scope=Scope.PER_INSTANCE)

      public class HelloWorldCallee {

       

        @PointcutDef("execution(java.lang.String $instanceof{backend.HelloBackEndRemote}->getValue(..))")

        public static Pointcut getValueCalleePointcut;

       

        @Bind(pointcut="hellocruel.HelloWorldCallee.getValueCalleePointcut", type=AdviceType.AROUND)

                public Object helloAdv(MethodInvocation invocation) throws Throwable {

       

                          Object invResult = null;

       

                          SimpleMetaData md = invocation.getMetaData();

                          Object obj = invocation.getMetaData("pom", "appel");

       

                          Object obj2 = invocation.getResponseAttachment("appel");

       

                          try {

                                    invResult = invocation.invokeNext();

                          } catch (Exception e) {

                                    e.printStackTrace();

                          }

       

                          String result = "";

                          if (invResult != null) {

                                    result = (String)invResult;

                          }

       

        return result + " [callee Goodbye World.]";

                }

      }

       

      Even when I'm debugging the respectitive MetaData fields in the MethodInvocation object are null.

       

      Is this supported behaviour? Am I doing something wrong?

       

      Thanks in advance.

      Steven.