[jboss-cvs] JBossAS SVN: r59952 - in projects/aop/trunk/aop/src: test/org/jboss/test/aop/beforeafterArgs and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Jan 23 14:32:00 EST 2007


Author: flavia.rainone at jboss.com
Date: 2007-01-23 14:32:00 -0500 (Tue, 23 Jan 2007)
New Revision: 59952

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java
Log:
[JBAOP-325] After advices (and throwing) can now access the arguments array used on around invocations,
and around invocations can now access the arguments array used on before advices.

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -201,9 +201,6 @@
       String ciname;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
       CtClass[] params;
       CtClass constructorInfoClass;
 
@@ -267,7 +264,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {constructorInfoClass},
                new CtClass[0],
                "{super($1, null, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -279,30 +276,41 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
-         CtClass[] ctorParams = new CtClass[params.length + 2];
-         ctorParams[0] = jp;
-         ctorParams[1] = callingClass;
-         System.arraycopy(params, 0, ctorParams, 2, params.length);
-
+         CtClass[] ctorParams1 = new CtClass[params.length + 2];
+         CtClass[] ctorParams2 = new CtClass[3];
+         ctorParams1[0] = ctorParams2[0] = jp;
+         ctorParams1[1] = ctorParams2[1] = callingClass;
+         System.arraycopy(params, 0, ctorParams1, 2, params.length);
+         ctorParams2[2] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
          body.append("   super.callingObject=$2;");
          
+         StringBuffer setArguments = new StringBuffer();
          int offset = 2;
-         for (int i = offset ; i < ctorParams.length ; i++)
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
+         setArguments.append("}");
 
-         body.append("}");
-
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
+         
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "   setArguments($3);}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
          jp.addConstructor(protectedConstructor);
@@ -323,7 +331,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                targetClass,
                INVOKE_JOINPOINT,
                getInvokeJoinPointParameters(),

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -211,9 +211,6 @@
       String ciname;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
       CtClass[] params;
       CtClass constructorInfoClass;
 
@@ -279,7 +276,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {constructorInfoClass},
                new CtClass[0],
                "{super($1, null, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -292,18 +289,20 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
          final int offset = (hasCallingObject) ? 2 : 1;
-         CtClass[] ctorParams = new CtClass[params.length + offset];
-         ctorParams[0] = jp;
-
+         CtClass[] ctorParams1 = new CtClass[params.length + offset];
+         CtClass[] ctorParams2 = new CtClass[offset + 1];
+         ctorParams1[0] = ctorParams2[0] = jp;
          if (hasCallingObject)
          {
-            ctorParams[1] = callingClass;
+            ctorParams1[1] = ctorParams2[1] = callingClass;
          }
-         System.arraycopy(params, 0, ctorParams, offset, params.length);
-
+         System.arraycopy(params, 0, ctorParams1, offset, params.length);
+         ctorParams2[offset] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
@@ -313,21 +312,28 @@
             body.append("   super.callingObject=$" + offset + ";");
          }
 
-         for (int i = offset ; i < ctorParams.length ; i++)
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
+         setArguments.append("}");
 
-         body.append("}");
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
+
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "setArguments($" + (offset + 1) + ");}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
-
          jp.addConstructor(protectedConstructor);
-
       }
 
       private CtClass[] getInvokeJoinPointParams()
@@ -349,7 +355,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                targetClass,
                INVOKE_JOINPOINT,
                getInvokeJoinPointParams(),

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -176,9 +176,6 @@
       int index;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
       CtField targetField;
       CtClass[] originalParams;
       CtClass[] params;
@@ -252,7 +249,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {constructionInfoClass},
                new CtClass[0],
                "{super($1, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -265,12 +262,16 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
-         CtClass[] ctorParams = new CtClass[params.length + 1];
-         ctorParams[0] = jp;
-         System.arraycopy(params, 0, ctorParams, 1, params.length);
-
+         CtClass[] ctorParams1 = new CtClass[params.length + 1];
+         CtClass[] ctorParams2 = new CtClass[3];
+         ctorParams1[0] = ctorParams2[0] = jp;
+         System.arraycopy(params, 0, ctorParams1, 1, params.length);
+         ctorParams2[1] = params[0];
+         ctorParams2[2] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
@@ -279,19 +280,27 @@
          body.append("   this." + targetField.getName() + " = $2;");
          body.append("   super.setTargetObject($2);");
 
-         for (int i = offset ; i < ctorParams.length ; i++)
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
-
-         body.append("}");
+         setArguments.append("}");
+         
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
+         
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "   setArguments($3);}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
-
          jp.addConstructor(protectedConstructor);
       }
 
@@ -301,7 +310,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                CtClass.voidType,
                INVOKE_JOINPOINT,
                params,

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -165,10 +165,6 @@
       int index;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
-      CtField targetField;
       CtClass[] params;
       CtClass constructorInfoClass;
 
@@ -227,7 +223,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {constructorInfoClass},
                new CtClass[0],
                "{super($1, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -240,31 +236,42 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
-         CtClass[] ctorParams = new CtClass[params.length + 1];
-         ctorParams[0] = jp;
-         System.arraycopy(params, 0, ctorParams, 1, params.length);
-
+         CtClass[] ctorParams1 = new CtClass[params.length + 1];
+         CtClass[] ctorParams2 = new CtClass[2];
+         ctorParams1[0] = ctorParams2[0] = jp;
+         System.arraycopy(params, 0, ctorParams1, 1, params.length);
+         ctorParams2[1] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
 
          int offset = 1;
-         for (int i = offset ; i < ctorParams.length ; i++)
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
+         setArguments.append("}");
 
-         body.append("}");
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
+
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "   setArguments($2);}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
          jp.addConstructor(protectedConstructor);
-
       }
 
       /**
@@ -273,7 +280,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                advisedClass,
                INVOKE_JOINPOINT,
                params,

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -223,14 +223,9 @@
       CtClass advisedClass;
       CtField advisedField;
       String finame;
-      int index;
       boolean hasTargetObject;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
-      CtField targetField;
       CtClass fieldType;
       CtClass fieldInfoClass;
       boolean read;
@@ -293,7 +288,7 @@
 
       private void addTypedTargetField()throws CannotCompileException
       {
-         targetField = new CtField(advisedClass, TARGET_FIELD, jp);
+         CtField targetField = new CtField(advisedClass, TARGET_FIELD, jp);
          jp.addField(targetField);
          targetField.setModifiers(Modifier.PROTECTED);
       }
@@ -305,7 +300,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {fieldInfoClass},
                new CtClass[0],
                "{super($1, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -321,7 +316,7 @@
       protected void addProtectedConstructor() throws CannotCompileException, NotFoundException
       {
 
-         protectedConstructor = CtNewConstructor.make(
+         CtConstructor protectedConstructor = CtNewConstructor.make(
                createProtectedCtorParams(),
                new CtClass[0],
                createProtectedCtorBody(),
@@ -475,7 +470,7 @@
 
       protected CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                advisedField.getType(),
                INVOKE_JOINPOINT,
                getInvokeJoinPointParams(),
@@ -561,7 +556,7 @@
 
       protected CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                CtClass.voidType,
                JoinPointGenerator.INVOKE_JOINPOINT,
                getInvokeJoinPointParams(),

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -262,9 +262,6 @@
       String initializer = null;
       if (mixin.getConstruction() == null)
       {
-         CtConstructor[] constructors = mixinClass.getConstructors();
-         for (int i = 0; i < constructors.length; i++)
-            System.out.println("constructors[" + i + "] = " + constructors[i].getSignature());
          if (mixinClass.getConstructor("()V") == null)
          {
             throw new RuntimeException("Default constructor of mixin class '" +

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -64,7 +64,7 @@
 {
    // TODO replace by enum
    protected static class JoinPointParameters {
-      public static final JoinPointParameters ONLY_ARGS = new JoinPointParameters(false, -1, false, -1, 0, "");
+      public static final JoinPointParameters ONLY_ARGS = new JoinPointParameters(false, -1, false, -1, 0, null);
       public static final JoinPointParameters TARGET_ARGS = new JoinPointParameters(true, 1, false, -1, 1, "$1");
       public static final JoinPointParameters CALLER_ARGS = new JoinPointParameters(false, -1, true, 1, 1, "$1");
       public static final JoinPointParameters TARGET_CALLER_ARGS = new JoinPointParameters(true, 1, true, 2, 2, "$1, $2");
@@ -75,16 +75,16 @@
       private int targetIndex;
       private int callerIndex;
       private int firstArgIndex;
-      private String listPrefix;
+      private String targetCallerList;
       
-      private JoinPointParameters(boolean target, int targetIndex, boolean caller, int callerIndex, int firstArgIndex, String listPrefix)
+      private JoinPointParameters(boolean target, int targetIndex, boolean caller, int callerIndex, int firstArgIndex, String targetCallerList)
       {
          this.target = target;
          this.targetIndex = targetIndex;
          this.caller = caller;
          this.callerIndex = callerIndex;
          this.firstArgIndex = firstArgIndex + 1;
-         this.listPrefix = listPrefix;
+         this.targetCallerList = targetCallerList;
       }
       
       public final boolean hasTarget()
@@ -114,44 +114,40 @@
       
       public final String declareArgsArray(int totalParameters)
       {
+         StringBuffer buffer = new StringBuffer("Object[] ");
+         buffer.append(ARGUMENTS);
          if (++totalParameters == firstArgIndex)
          {
-            return "Object[] " + ARGUMENTS + " = new Object[0];";
+            buffer.append(" = new Object[0];");
          }
-         StringBuffer buffer = new StringBuffer("Object[] ");
-         buffer.append(ARGUMENTS);
-         buffer.append(" = new Object[]{($w)$");
-         buffer.append(firstArgIndex);
-         for (int i = firstArgIndex + 1; i < totalParameters; i++)
+         else
          {
-            buffer.append(", ($w)$");
-            buffer.append(i);
+            buffer.append(" = new Object[]{($w)$");
+            buffer.append(firstArgIndex);
+            for (int i = firstArgIndex + 1; i < totalParameters; i++)
+            {
+               buffer.append(", ($w)$");
+               buffer.append(i);
+            }
+            buffer.append("};");
          }
-         buffer.append("};");
          return buffer.toString();
       }
       
-      public final void appendParameterListWithArgs(StringBuffer code, CtClass[] parameterTypes, boolean beginWithComma)
+      public final void appendParameterList(StringBuffer code, CtClass[] parameterTypes)
       {
 
          int j = firstArgIndex - 1;
          int totalParameters = parameterTypes.length - j;
-         if (listPrefix == "" && totalParameters == 0)
+         if (targetCallerList != null)
          {
-            return;
+            code.append(targetCallerList);
          }
-
-         if (beginWithComma)
-         {
-            code.append(", ");
-         }
-
-         code.append(listPrefix);
          if (totalParameters == 0)
          {
             return;
          }
-         if (listPrefix.length() != 0)
+         if (targetCallerList != null)
          {
             code.append(", ");
          }
@@ -164,7 +160,19 @@
             castArgument(code, parameterTypes[j], i);
          }
       }
-
+      
+      public final void appendParameterListWithArgs(StringBuffer code)
+      {
+         if (targetCallerList != null)
+         {
+            code.append(targetCallerList);
+            code.append(",");
+         }
+         
+         code.append(ARGUMENTS);
+      }
+      
+      
       private static final String[][] primitiveExtractions;
 
       static{
@@ -232,33 +240,6 @@
             code.append("]");
          }
       }
-
-      public void appendArgsArrayList(StringBuffer code, CtClass[] parameterTypes)
-      {
-         int j = firstArgIndex - 1;
-         int totalParameters = parameterTypes.length - j;
-
-         if (totalParameters == 0)
-         {
-            return;
-         }
-         code.append("(");
-         code.append(parameterTypes[j++].getName());
-         code.append(") ");
-         code.append(ARGUMENTS);
-         code.append("[0]");
-         
-         for (int i = 1; i < totalParameters; i++, j++)
-         {
-            code.append(", (");
-            code.append(parameterTypes[j].getName());
-            code.append(") ");
-            code.append(ARGUMENTS);
-            code.append("[");
-            code.append(i);
-            code.append("]");
-         }
-      }
    }
    
    public static final String INFO_FIELD = "info";
@@ -276,6 +257,7 @@
    private static final String RETURN_VALUE = "ret";
    private static final String THROWABLE = "t";
    private static final String ARGUMENTS= " arguments";
+   private static final String GET_ARGUMENTS= " getArguments()";
    protected static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
 
    private JoinPointInfo oldInfo;
@@ -755,18 +737,23 @@
       }
       code.append("   try");
       code.append("   {");
-      boolean argsFound = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
+      boolean argsFoundBefore = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
             setups.getBeforeSetups(), code);
-      addAroundInvokeCode(code, setups, joinpointClass, argsFound, parameterTypes);
-
-      argsFound = addInvokeCode(AfterAdviceCallStrategy.getInstance(),
-            setups.getAfterSetups(), code) || argsFound;
-      
-      code.append("   }");
-      code.append("   catch(java.lang.Throwable " + THROWABLE + ")");
-      code.append("   {");
-      argsFound = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
-            setups.getThrowingSetups(), code) || argsFound;
+      // process after code
+      StringBuffer afterCode = new StringBuffer();
+      boolean argsFoundAfter = addInvokeCode(AfterAdviceCallStrategy.getInstance(),
+            setups.getAfterSetups(), afterCode);
+      afterCode.append("   }");
+      afterCode.append("   catch(java.lang.Throwable " + THROWABLE + ")");
+      afterCode.append("   {");
+      argsFoundAfter = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
+            setups.getThrowingSetups(), afterCode) || argsFoundAfter;
+      // add around according to whether @Args were found before and/or later
+      addAroundInvokeCode(code, setups, joinpointClass, argsFoundBefore,
+            argsFoundAfter, parameterTypes);
+      // add after code
+      code.append(afterCode.toString());
+      // finish code body
       addHandleExceptionCode(code, declaredExceptions);
       code.append("   }");
       if (!isVoid())
@@ -775,12 +762,13 @@
       }
       code.append("}");;
       
-      if (argsFound)
+      // declare arguments array if necessary
+      if (argsFoundBefore || argsFoundAfter)
       {
          code.insert(1, parameters.declareArgsArray(parameterTypes.length));
       }
       return code.toString();
-   }   
+   }
 
    private boolean addInvokeCode(AdviceCallStrategy callStrategy, AdviceSetup[] setups, StringBuffer code) throws NotFoundException
    {
@@ -800,7 +788,8 @@
    
    
    private void addAroundInvokeCode(StringBuffer code, AdviceSetupsByType setups,
-         CtClass joinpointClass, boolean argsFound, CtClass[] parameterTypes) throws NotFoundException
+         CtClass joinpointClass, boolean argsFoundBefore, boolean argsFoundAfter,
+         CtClass[] parameterTypes) throws NotFoundException
    {
       if (setups.getAroundSetups() != null)
       {
@@ -827,15 +816,15 @@
 
          code.append("      if(" + INFO_FIELD + ".getInterceptors() != null)");
          code.append("      {");
-         code.append("         " + joinpointFqn + " jp = new " + joinpointClass.getName() + "(this");
-         if (argsFound)
+         code.append("         " + joinpointFqn + " jp = new " + joinpointClass.getName() + "(this, ");
+         if (argsFoundBefore)
          {
-            parameters.appendParameterListWithArgs(code, parameterTypes, true);
+            parameters.appendParameterListWithArgs(code);
             
          }
          else
          {
-            code.append(", $$");
+            code.append("$$");
          }
          
          code.append(aspects.toString() + cflows.toString() + ");");
@@ -845,17 +834,23 @@
          }
          code.append("jp.invokeNext();");
          
+         if (argsFoundAfter)
+         {
+            code.append(ARGUMENTS);
+            code.append(" = jp.getArguments();");
+         }
+         
          code.append("      }");
          code.append("      else");
          code.append("      {");
          
-         addDispatchCode(code, parameterTypes, argsFound);
+         addDispatchCode(code, parameterTypes, argsFoundBefore);
          
          code.append("      }");
       }
       else
       {
-         addDispatchCode(code, parameterTypes, argsFound);
+         addDispatchCode(code, parameterTypes, argsFoundBefore);
       }
    }
 
@@ -869,7 +864,7 @@
       code.append("super.dispatch(");
       if (argsFound)
       {
-         parameters.appendParameterListWithArgs(code, parameterTypes, false);
+         parameters.appendParameterList(code, parameterTypes);
       }
       else
       {
@@ -938,17 +933,23 @@
    private void createConstructors(ClassPool pool, CtClass superClass, CtClass clazz, AdviceSetupsByType setups) throws NotFoundException, CannotCompileException
    {
       CtConstructor[] superCtors = superClass.getDeclaredConstructors();
-      if (superCtors.length != 2 && !this.getClass().equals(MethodJoinPointGenerator.class))
+      if (superCtors.length != 3 && !this.getClass().equals(MethodJoinPointGenerator.class)
+            && !FieldJoinPointGenerator.class.isAssignableFrom(this.getClass()))
       {
-         throw new RuntimeException("JoinPoints should only have 2 and only constructors, not " + superCtors.length);
+         throw new RuntimeException("JoinPoints should only have 3 and only constructors, not " + superCtors.length);
       }
-      else if (superCtors.length != 3 && this.getClass().equals(MethodJoinPointGenerator.class))
+      else if (superCtors.length != 2 && FieldJoinPointGenerator.class.isAssignableFrom(this.getClass()))
       {
-         throw new RuntimeException("Method JoinPoints should only have 2 and only constructors, not " + superCtors.length);
+         throw new RuntimeException("Field JoinPoints should only have 2 and only constructors, not " + superCtors.length);
       }
+      else if (superCtors.length != 4 && this.getClass().equals(MethodJoinPointGenerator.class))
+      {
+         throw new RuntimeException("Method JoinPoints should only have 4 and only constructors, not " + superCtors.length);
+      }
       
       int publicIndex = -1;
-      int protectedIndex = -1;
+      int protectedIndex1 = -1;
+      int protectedIndex2 = -1;
       int defaultIndex = -1;
       
       for (int i = 0 ; i < superCtors.length ; i++)
@@ -961,13 +962,20 @@
          }
          else if (Modifier.isProtected(modifier))
          {
-            protectedIndex = i;
+            if (protectedIndex1 == -1)
+            {
+               protectedIndex1 = i;
+            }
+            else
+            {
+               protectedIndex2 = i;
+            }
          }
       }
       
-      if (publicIndex < 0 || protectedIndex < 0)
+      if (publicIndex < 0 || protectedIndex1 < 0)
       {
-         throw new RuntimeException("One of the JoinPoint constructors should be public, the other protected");
+         throw new RuntimeException("One of the JoinPoint constructors should be public, and at least one of them should be protected");
       }
       
       if (defaultIndex >= 0)
@@ -976,7 +984,14 @@
       }
       
       createPublicConstructor(superCtors[publicIndex], clazz, setups);
-      createProtectedConstructor(pool, superCtors[protectedIndex], clazz, setups);
+      if (protectedIndex2 == -1)
+      {
+         createProtectedConstructors(pool, superCtors[protectedIndex1], null, clazz, setups);
+      }
+      else
+      {
+         createProtectedConstructors(pool, superCtors[protectedIndex1], superCtors[protectedIndex2], clazz, setups);
+      }
       createCopyConstructorAndMethod(pool, clazz);
    }
 
@@ -1024,18 +1039,17 @@
    }
    
    /**
-    * This is the constructor that will be called by the invokeJoinPoint() method, make sure it
-    * copies across all the non-per-instance aspects
+    * These are the constructors that will be called by the invokeJoinPoint() method,
+    * make sure it copies across all the non-per-instance aspects
     */
-   private void createProtectedConstructor(ClassPool pool, CtConstructor superCtor,
-         CtClass clazz, AdviceSetupsByType setups)
+   private void createProtectedConstructors(ClassPool pool, CtConstructor superCtor1,
+         CtConstructor superCtor2, CtClass clazz, AdviceSetupsByType setups)
          throws CannotCompileException, NotFoundException
    {
       
-      CtClass[] superParams = superCtor.getParameterTypes();
       ArrayList<AdviceSetup> aspects = new ArrayList<AdviceSetup>(); 
       ArrayList<Integer> cflows = new ArrayList<Integer>();
-      StringBuffer adviceInit = new StringBuffer(); 
+      StringBuffer adviceInit  = new StringBuffer(); 
       
       AdviceSetup[] allSetups = setups.getAllSetups();
       for (int i = 0 ; i < allSetups.length ; i++)
@@ -1062,18 +1076,32 @@
             cflows.add(allSetups[i].useCFlowFrom());
          }
       }
-
-      StringBuffer cflowInit = new StringBuffer();
-
-      //Set up the parameters
+      createProtectedConstructor(pool, clazz, superCtor1, allSetups, aspects, cflows,
+            adviceInit.toString());
+      if (superCtor2 != null)
+      {
+         createProtectedConstructor(pool, clazz, superCtor2, allSetups, aspects, cflows,
+            adviceInit.toString());
+      }
+   }
+   
+   private void createProtectedConstructor(ClassPool pool, CtClass clazz,
+         CtConstructor superCtor, AdviceSetup[] allSetups,
+         ArrayList<AdviceSetup> aspects, ArrayList<Integer> cflows,
+         String aspectInitialization)
+      throws NotFoundException, CannotCompileException
+   {
+      // Set up the parameters
+      CtClass[] superParams = superCtor.getParameterTypes();
       CtClass[] params = new CtClass[superParams.length + aspects.size() + cflows.size()];
       System.arraycopy(superParams, 0, params, 0, superParams.length);
 
+      StringBuffer init = new StringBuffer();
       for (int i = 0 ; i < aspects.size() ; i++)
       {
          AdviceSetup setup = (AdviceSetup)aspects.get(i);
          params[i + superParams.length] = setup.getAspectCtClass();
-         adviceInit.append("this." + setup.getAspectFieldName() + " = $" + (i + superParams.length + 1) + ";");
+         init.append("this." + setup.getAspectFieldName() + " = $" + (i + superParams.length + 1) + ";");
       }
       final int aspectsLength = superParams.length + aspects.size();
       if (cflows.size() > 0 )
@@ -1082,8 +1110,8 @@
          for (int i = 0 ; i < cflows.size() ; i++)
          {
             params[i + aspectsLength] = astCFlowExpr;
-            cflowInit.append("cflow" + cflows.get(i) + "= $" + (i + aspectsLength + 1) + ";");
-            cflowInit.append("matchesCflow" + cflows.get(i) + " = getCFlow" + allSetups[i].useCFlowFrom() + "();");
+            init.append("cflow" + cflows.get(i) + "= $" + (i + aspectsLength + 1) + ";");
+            init.append("matchesCflow" + cflows.get(i) + " = getCFlow" + allSetups[i].useCFlowFrom() + "();");
          }
       }
       
@@ -1098,8 +1126,9 @@
       
       }
       body.append(");");
-      body.append(adviceInit.toString());
-      body.append(cflowInit.toString());
+      body.append(aspectInitialization);
+      body.append(init.toString());
+      
       body.append("}");   
       CtConstructor ctor = CtNewConstructor.make(
           params, 
@@ -1723,7 +1752,14 @@
             }
             break;
          case AdviceMethodProperties.ARGS_ARG:
-            code.append(ARGUMENTS);
+            if (isAround)
+            {
+               code.append(GET_ARGUMENTS);
+            }
+            else
+            {
+               code.append(ARGUMENTS);
+            }
             // return true when args has been found; false otherwise
             return true;
          default:

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -194,10 +194,6 @@
       boolean hasTargetObject;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
-      CtField targetField;
       CtClass[] params;
       CtClass methodInfoClass;
 
@@ -266,7 +262,7 @@
 
       private void addTypedTargetField()throws CannotCompileException
       {
-         targetField = new CtField(targetClass, TARGET_FIELD, jp);
+         CtField targetField = new CtField(targetClass, TARGET_FIELD, jp);
          jp.addField(targetField);
          targetField.setModifiers(Modifier.PROTECTED);
       }
@@ -277,7 +273,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {methodInfoClass},
                new CtClass[0],
                "{super($1, null, null, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -290,18 +286,21 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
          final int offset =  hasTargetObject ? 3 : 2;
-         CtClass[] ctorParams = new CtClass[params.length + offset];
-         ctorParams[0] = jp;
-         ctorParams[1] = callingClass;
+         CtClass[] ctorParams1 = new CtClass[params.length + offset];
+         CtClass[] ctorParams2 = new CtClass[offset + 1];
+         ctorParams1[0] = ctorParams2[0] = jp;
+         ctorParams1[1] = ctorParams2[1] = callingClass;
          if (hasTargetObject)
          {
-            ctorParams[2] = targetClass;
+            ctorParams1[2] = ctorParams2[2] = targetClass;
          }
-         System.arraycopy(params, 0, ctorParams, offset, params.length);
-
+         System.arraycopy(params, 0, ctorParams1, offset, params.length);
+         ctorParams2[offset] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
@@ -312,23 +311,30 @@
             body.append("   super.targetObject=$3;");
             body.append("   this.tgt=$3;");
          }
-
-         for (int i = offset ; i < ctorParams.length ; i++)
+         
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
+         setArguments.append("}");
 
-         body.append("}");
 
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
 
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "setArguments($" + (offset + 1) + ");}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
          jp.addConstructor(protectedConstructor);
-
       }
 
 
@@ -354,7 +360,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                targetMethod.getReturnType(),
                INVOKE_JOINPOINT,
                getInvokeJoinPointParameters(),

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -203,10 +203,6 @@
       boolean hasTargetObject;
 
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
-      CtField targetField;
       CtClass[] params;
       CtClass methodInfoClass;
 
@@ -277,7 +273,7 @@
 
       private void addTypedTargetField()throws CannotCompileException
       {
-         targetField = new CtField(targetClass, TARGET_FIELD, jp);
+         CtField targetField = new CtField(targetClass, TARGET_FIELD, jp);
          jp.addField(targetField);
          targetField.setModifiers(Modifier.PROTECTED);
       }
@@ -288,7 +284,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {methodInfoClass},
                new CtClass[0],
                "{super($1, null, null, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -301,19 +297,22 @@
        * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructor()
+         throws CannotCompileException, NotFoundException
       {
          int offset = 1;
          if (hasTargetObject) offset++;
          if (hasCallingObject) offset++;
-         CtClass[] ctorParams = new CtClass[params.length + offset];
+         CtClass[] ctorParams1 = new CtClass[params.length + offset];
+         CtClass[] ctorParams2 = new CtClass[offset + 1];
 
          int index = 0;
-         ctorParams[index++] = jp;
-         if (hasTargetObject) ctorParams[index++] = targetClass;
-         if (hasCallingObject) ctorParams[index] = callingClass;
-         System.arraycopy(params, 0, ctorParams, offset, params.length);
-
+         ctorParams1[index] = ctorParams2[index++] = jp;
+         if (hasTargetObject) ctorParams1[index] = ctorParams2[index++] = targetClass;
+         if (hasCallingObject) ctorParams1[index] = ctorParams2[index++] = callingClass;
+         System.arraycopy(params, 0, ctorParams1, offset, params.length);
+         ctorParams2[index++] = instrumentor.forName("java.lang.Object[]");
+         
          StringBuffer body = new StringBuffer();
          body.append("{");
          body.append("   this($1." + INFO_FIELD + ");");
@@ -323,22 +322,29 @@
             body.append("   this.tgt=$2;");
          }
          if (hasCallingObject) body.append("   super.callingObject=$" + (hasTargetObject ? 3 : 2) + ";");
-
-         for (int i = offset ; i < ctorParams.length ; i++)
+         
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
+         setArguments.append("}");
 
-         body.append("}");
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
+               new CtClass[0],
+               body.toString() + setArguments.toString(),
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
+
          protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+               ctorParams2,
                new CtClass[0],
-               body.toString(),
+               body.toString() + "   setArguments($" + index + ");}",
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
-
          jp.addConstructor(protectedConstructor);
-
       }
 
       private CtClass[] getInvokeJoinpointParameters()
@@ -366,7 +372,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                targetMethod.getReturnType(),
                INVOKE_JOINPOINT,
                getInvokeJoinpointParameters(),

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -181,10 +181,7 @@
       boolean hasTargetObject;
       
       CtClass jp;
-      CtMethod invokeJoinpointMethod;
-      CtConstructor publicConstructor;
-      CtConstructor protectedConstructor;
-      CtField targetField;
+      
       CtClass[] originalParams;
       CtClass[] params;
       CtClass methodInfoClass;
@@ -218,7 +215,7 @@
          addMethodInfoField();
          addDefaultConstructor();
          addPublicConstructor();
-         addProtectedConstructor();
+         addProtectedConstructors();
          addDispatchMethods();
          
          TransformerCommon.compileOrLoadClass(advisedClass, jp);
@@ -252,7 +249,7 @@
       
       private void addTypedTargetField()throws CannotCompileException
       {
-         targetField = new CtField(advisedClass, TARGET_FIELD, jp);
+         CtField targetField = new CtField(advisedClass, TARGET_FIELD, jp);
          jp.addField(targetField);
          targetField.setModifiers(Modifier.PROTECTED | Modifier.TRANSIENT);
       }
@@ -273,7 +270,7 @@
        */
       private void addPublicConstructor() throws CannotCompileException
       {
-         publicConstructor = CtNewConstructor.make(
+         CtConstructor publicConstructor = CtNewConstructor.make(
                new CtClass[] {methodInfoClass}, 
                new CtClass[0],
                "{super($1, $1.getInterceptors()); this." + INFO_FIELD + " = $1;}",
@@ -283,14 +280,16 @@
       }
       
       /**
-       * This constructor will be called by invokeJoinpoint in the generated subclass when we need to 
+       * These constructor will be called by invokeJoinpoint in the generated subclass when we need to 
        * instantiate a joinpoint containing target and args
        */
-      protected void addProtectedConstructor() throws CannotCompileException
+      protected void addProtectedConstructors() throws CannotCompileException, NotFoundException
       {
-         CtClass[] ctorParams = new CtClass[params.length + 1];
-         ctorParams[0] = jp;
-         System.arraycopy(params, 0, ctorParams, 1, params.length);
+         CtClass[] ctorParams1 = new CtClass[params.length + 1];
+         CtClass[] ctorParams2 = null;
+         ctorParams1[0] = jp;
+         // copy first parameter
+         System.arraycopy(params, 0, ctorParams1, 1, params.length);
          
          StringBuffer body = new StringBuffer();
          body.append("{");
@@ -299,26 +298,47 @@
          int offset = 1;
          if (hasTargetObject)
          {
+            offset = 2;
+            // second version of constructor, that receives Arguments array
+            ctorParams2 = new CtClass[3];
+            System.arraycopy(ctorParams1, 0, ctorParams2, 0, 2);
+            ctorParams2[2] = instrumentor.forName("java.lang.Object[]");
+            
             body.append("   this." + TARGET_FIELD + " = $2;");
             body.append("   super.setTargetObject($2);");
-            offset = 2;
          }
+         else
+         {
+            ctorParams2 = new CtClass[2];
+            ctorParams2[0] = ctorParams1[0];
+            ctorParams2[1] = ctorParams1[0].getClassPool().get("java.lang.Object[]");
+         }
          
-         for (int i = offset ; i < ctorParams.length ; i++)
+         
+         StringBuffer setArguments = new StringBuffer();
+         for (int i = offset ; i < ctorParams1.length ; i++)
          {
-            body.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
+            setArguments.append("   arg" + (i - offset) + " = $" + (i + 1)  + ";");
          }
          
-         body.append("}");
-         protectedConstructor = CtNewConstructor.make(
-               ctorParams,
+         setArguments.append("}");
+         
+         CtConstructor protectedConstructor = CtNewConstructor.make(
+               ctorParams1,
                new CtClass[0],
-               body.toString(),
+               body.toString() + setArguments.toString(),
                jp);
          protectedConstructor.setModifiers(Modifier.PROTECTED);
                
          jp.addConstructor(protectedConstructor);
-         
+
+         protectedConstructor = CtNewConstructor.make(
+               ctorParams2,
+               new CtClass[0],
+               body.toString() + "   setArguments($" + (offset + 1) + ");}",
+               jp);
+         protectedConstructor.setModifiers(Modifier.PROTECTED);
+         jp.addConstructor(protectedConstructor);
       }
       
       /**
@@ -327,7 +347,7 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         invokeJoinpointMethod  = CtNewMethod.make(
+         CtMethod invokeJoinpointMethod  = CtNewMethod.make(
                advisedMethod.getReturnType(), 
                INVOKE_JOINPOINT, 
                params, 

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -61,8 +61,10 @@
 
    static boolean around1 = false;
    static boolean around2 = false;
+   static boolean around3 = false;
    static Object[] around1Args = null;
    static Object[] around2Args = null;
+   static Object[] around3Args = null;
    
    static boolean throwing = false;
    static Object[] throwingArgs = null;
@@ -95,8 +97,10 @@
       
       around1 = false;
       around2 = false;
+      around3 = false;
       around1Args = null;
       around2Args = null;
+      around3Args = null;
       
       throwing = false;
       throwingArgs = null;
@@ -219,6 +223,13 @@
       return invocation.invokeNext();
    }
    
+   public Object around3(MethodInvocation invocation, @Args Object[] arguments) throws Throwable
+   {
+      around3 = true;
+      around3Args = arguments;
+      return invocation.invokeNext();
+   }
+   
    public void throwing(@Args Object[] arguments, @Thrown Throwable throwable)
    {
       throwing = true;

Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java	2007-01-23 19:05:12 UTC (rev 59951)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java	2007-01-23 19:32:00 UTC (rev 59952)
@@ -199,7 +199,7 @@
       assertEquals(6, ((Integer) ArgsAspect.before3Args[1]).intValue());
       assertEquals(true, ((Boolean) ArgsAspect.before3Args[2]).booleanValue());
       assertNull(ArgsAspect.before3Args[3]);
-      
+      System.out.println("AROUND ARGS: " + ArgsAspect.around3Args);
       assertFalse(ArgsAspect.before1);
       assertFalse(ArgsAspect.before2);
       assertFalse(ArgsAspect.before6);
@@ -224,6 +224,7 @@
       
       assertNotNull(ArgsAspect.before7Args);
       assertSame(ArgsAspect.before7Args, ArgsAspect.after7Args);
+      assertSame(ArgsAspect.before7Args, ArgsAspect.around1Args);
       assertEquals(4, ArgsAspect.before7Args.length);
       assertEquals("after7", ArgsAspect.before7Args[0]);
       assertEquals(14, ((Integer) ArgsAspect.before7Args[1]).intValue());
@@ -233,15 +234,6 @@
       assertEquals(1, ((ArgsPOJO[]) ArgsAspect.before7Args[3]).length);
       assertNull(((ArgsPOJO[]) ArgsAspect.before7Args[3])[0]);
       
-      assertNotNull(ArgsAspect.around1Args);
-      assertEquals(4, ArgsAspect.around1Args.length);
-      assertEquals("before7", ArgsAspect.around1Args[0]);
-      assertEquals(7, ((Integer) ArgsAspect.around1Args[1]).intValue());
-      assertEquals(true, ((Boolean) ArgsAspect.around1Args[2]).booleanValue());
-      
-      assertNotNull(ArgsAspect.around1Args[3]);
-      assertEquals(0, ((ArgsPOJO[]) ArgsAspect.around1Args[3]).length);
-      
       assertFalse(ArgsAspect.before1);
       assertFalse(ArgsAspect.before2);
       assertFalse(ArgsAspect.before3);




More information about the jboss-cvs-commits mailing list