[jboss-cvs] JBossAS SVN: r59150 - in projects/aop/trunk/aop/src: main/org/jboss/aop/advice main/org/jboss/aop/instrument resources/test/beforeafterArgs test/org/jboss/test/aop/beforeafterArgs

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Dec 19 10:32:38 EST 2006


Author: flavia.rainone
Date: 2006-12-19 10:32:09 -0500 (Tue, 19 Dec 2006)
New Revision: 59150

Added:
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsPOJO.java
   projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java
Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AdviceMethodProperties.java
   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/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/MethodExecutionTransformer.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java
   projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml
Log:
[JBAOP-325] Implemented support to Args annotation.

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AdviceMethodProperties.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AdviceMethodProperties.java	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/advice/AdviceMethodProperties.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -77,12 +77,6 @@
       this.joinpointExceptions = joinpointExceptions;
    }
 
-   /*public void setFoundProperties(Method adviceMethod, ArrayList args)
-   {
-      this.adviceMethod = adviceMethod;
-      this.args = (Integer[])args.toArray(new int[args.size()]);
-   }*/
-   
    public void setFoundProperties(Method adviceMethod, int[] args)
    {
       this.adviceMethod = adviceMethod;

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByConJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -67,7 +67,7 @@
 
    public ConByConJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, JoinPointParameters.ONLY_ARGS);
    }
 
    protected void initialiseJoinPointNames()

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConByMethodJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -67,8 +67,17 @@
 
    public ConByMethodJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, getParameters((ConByMethodInfo) info));
    }
+   
+   private static JoinPointParameters getParameters(ConByMethodInfo info)
+   {
+      if (Modifier.isStatic(info.getCallingMethod().getModifiers()))
+      {
+         return JoinPointParameters.ONLY_ARGS;
+      }
+      return JoinPointParameters.CALLER_ARGS;
+   }
 
    protected void initialiseJoinPointNames()
    {

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructionJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -67,7 +67,7 @@
 
    public ConstructionJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, JoinPointParameters.TARGET_ARGS);
    }
 
 

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/ConstructorJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -68,7 +68,7 @@
 
    public ConstructorJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, JoinPointParameters.ONLY_ARGS);
    }
 
 

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -74,9 +74,18 @@
 
    public FieldJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, getParameters((FieldInfo) info));
    }
 
+   private static JoinPointParameters getParameters(FieldInfo info)
+   {
+      if (Modifier.isStatic(info.getAdvisedField().getModifiers()))
+      {
+         return JoinPointParameters.ONLY_ARGS;
+      }
+      return JoinPointParameters.TARGET_ARGS;
+   }
+   
    protected void initialiseJoinPointNames()
    {
       joinpointClassName =
@@ -575,8 +584,8 @@
                      advisedClass.getName() + "." + advisedField.getName() + " = " +  value) +
 
             ((hasTargetObject) ?
-                  "return "  + TARGET_FIELD + "." + advisedField.getName() + ";" :
-                     "return " + advisedClass.getName() + "." + advisedField.getName() + ";") +
+                  "; return "  + TARGET_FIELD + "." + advisedField.getName() + ";" :
+                     "; return " + advisedClass.getName() + "." + advisedField.getName() + ";") +
             "}";
       }
 

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -1,4 +1,4 @@
-   /*
+ /*
   * JBoss, Home of Professional Open Source
   * Copyright 2005, JBoss Inc., and individual contributors as indicated
   * by the @authors tag. See the copyright.txt in the distribution for a
@@ -62,6 +62,211 @@
  */
 public abstract class JoinPointGenerator
 {
+   // TODO replace by enum
+   protected static class JoinPointParameters {
+      public static final JoinPointParameters ONLY_ARGS = new JoinPointParameters(false, -1, false, -1, 0, "")
+      {
+         /*public String declareArgsArray(int argsSize)
+         {
+            return "Object[] " + ARGUMENTS + " = new Object[]{$$};";
+         }*/
+      };
+      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");
+      
+      private boolean target;
+      private boolean caller;
+      
+      private int targetIndex;
+      private int callerIndex;
+      private int firstArgIndex;
+      private String listPrefix;
+      
+      private JoinPointParameters(boolean target, int targetIndex, boolean caller, int callerIndex, int firstArgIndex, String listPrefix)
+      {
+         this.target = target;
+         this.targetIndex = targetIndex;
+         this.caller = caller;
+         this.callerIndex = callerIndex;
+         this.firstArgIndex = firstArgIndex + 1;
+         this.listPrefix = listPrefix;
+      }
+      
+      public boolean hasTarget()
+      {
+         return target;
+      }
+      
+      public int getTargetIndex()
+      {
+         return targetIndex;
+      }
+      
+      public boolean hasCaller()
+      {
+         return caller;
+      }
+      
+      public int getCallerIndex()
+      {
+         return callerIndex;
+      }
+      
+      public int getFirstArgIndex()
+      {
+         return firstArgIndex;
+      }
+      
+      public String declareArgsArray(int totalParameters)
+      {
+         if (++totalParameters == firstArgIndex)
+         {
+            return "Object[] " + ARGUMENTS + " = 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++)
+         {
+            buffer.append(", ($w)$");
+            buffer.append(i);
+         }
+         buffer.append("};");
+         return buffer.toString();
+      }
+      
+      public void appendParameterListWithArgs(StringBuffer code, CtClass[] parameterTypes, boolean beginWithComma)
+      {
+
+         int j = firstArgIndex - 1;
+         int totalParameters = parameterTypes.length - j;
+         if (listPrefix == "" && totalParameters == 0)
+         {
+            return;
+         }
+
+         if (beginWithComma)
+         {
+            code.append(", ");
+         }
+
+         code.append(listPrefix);
+         if (totalParameters == 0)
+         {
+            return;
+         }
+         if (listPrefix.length() != 0)
+         {
+            code.append(", ");
+         }
+
+         castArgument(code, parameterTypes[j++], 0);
+
+         for (int i = 1; i < totalParameters; i++, j++)
+         {
+            code.append(", ");
+            castArgument(code, parameterTypes[j], i);
+         }
+      }
+
+      private static final String[][] primitiveExtractions;
+
+      static{
+         primitiveExtractions = new String[][]{
+               {"((Boolean) " + ARGUMENTS + " [", "]).booleanValue()"},
+               {"((Integer) " + ARGUMENTS + "[", "]).intValue()"},
+               {"((Double) " + ARGUMENTS + "[", "]).doubleValue()"},
+               {"((Float) " + ARGUMENTS + "[", "]).floatValue()"},
+               {"((Character) " + ARGUMENTS + "[", "]).charValue()"},
+               {"((Byte) " + ARGUMENTS + " [", "]).byteValue()"},
+               {"((Long) " + ARGUMENTS + "[", "]).longValue()"},
+               {"((Short) " + ARGUMENTS + "[", "]).shortValue()"}
+         };
+      }
+      private final void castArgument(StringBuffer code, CtClass expectedType, int i)
+      {
+
+         if (expectedType.isPrimitive())
+         {
+            String[] extraction = null;
+            if (expectedType == CtClass.booleanType)
+            {
+               extraction = primitiveExtractions[0];
+            }
+            else if (expectedType == CtClass.intType)
+            {
+               extraction = primitiveExtractions[1];
+            }
+            else if (expectedType == CtClass.doubleType)
+            {
+               extraction = primitiveExtractions[2];
+            }
+            else if (expectedType == CtClass.floatType)
+            {
+               extraction = primitiveExtractions[3];
+            }
+            else if (expectedType == CtClass.charType)
+            {
+               extraction = primitiveExtractions[4];
+            }
+            else if (expectedType == CtClass.byteType)
+            {
+               extraction = primitiveExtractions[5];
+            }
+            else if (expectedType == CtClass.longType)
+            {
+               extraction = primitiveExtractions[6];
+            }
+            else if (expectedType == CtClass.shortType)
+            {
+               extraction = primitiveExtractions[7];
+            }
+            code.append(extraction[0]);
+            code.append(i);
+            code.append(extraction[1]);
+         }
+         else
+         {
+            code.append("(");
+            code.append(expectedType.getName());
+            code.append(") ");
+            code.append(ARGUMENTS);
+            code.append("[");
+            code.append(i);
+            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";
    public static final String INVOKE_JOINPOINT = "invokeJoinpoint";
    public static final String INVOKE_TARGET = "invokeTarget";
@@ -75,10 +280,12 @@
    public static final String GENERATOR_PREFIX = "generator_";
    private static final String RETURN_VALUE = "ret";
    private static final String THROWABLE = "t";
+   private static final String ARGUMENTS= " arguments";
    protected static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
 
    private JoinPointInfo oldInfo;
    protected JoinPointInfo info;
+   private JoinPointParameters parameters;
    private static int increment;
    private Class advisorClass;
    protected GeneratedClassAdvisor advisor;
@@ -89,9 +296,11 @@
    private Field generatorField;
    private boolean initialised;
    
-   public JoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
+   protected JoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info,
+         JoinPointParameters parameters)
    {
       this.info = info;
+      this.parameters = parameters;
       this.advisor = advisor;
       this.advisorClass = advisor.getClass();
       Class[] interfaces = advisorClass.getInterfaces();
@@ -191,8 +400,10 @@
       }
       catch (Throwable e)
       {
+         e.printStackTrace();
          // AutoGenerated
          throw new RuntimeException("Error generating joinpoint class for joinpoint " + info, e);
+         
       }
       initialised = true;
    }
@@ -389,7 +600,7 @@
 
    private AdviceSetupsByType initialiseAdviceInfosAndAddFields(ClassPool pool, CtClass clazz) throws ClassNotFoundException, NotFoundException, CannotCompileException
    {
-      HashMap cflows = new HashMap();
+      HashMap<String, Integer> cflows = new HashMap<String, Integer>();
       AdviceSetup[] setups = new AdviceSetup[info.getInterceptors().length];
 
       for (int i = 0 ; i < info.getInterceptors().length ; i++)
@@ -457,11 +668,13 @@
             "}";
       }
    }
-   private void addCFlowFieldsAndGetters(ClassPool pool, AdviceSetup setup, CtClass clazz, HashMap cflows)throws NotFoundException, CannotCompileException
+   private void addCFlowFieldsAndGetters(ClassPool pool, AdviceSetup setup,
+         CtClass clazz, HashMap<String, Integer> cflows)
+         throws NotFoundException, CannotCompileException
    {
       if (setup.getCFlowString() != null)
       {
-         Integer useCFlowIndex = (Integer)cflows.get(setup.getCFlowString());
+         Integer useCFlowIndex = cflows.get(setup.getCFlowString());
          if (useCFlowIndex == null)
          {
             useCFlowIndex = new Integer(setup.getIndex());
@@ -506,7 +719,7 @@
          code = createJoinpointInvokeBody(
                clazz, 
                setups,
-               superInvoke.getExceptionTypes());
+               superInvoke.getExceptionTypes(), superInvoke.getParameterTypes());
          CtMethod invoke = CtNewMethod.make(
                superInvoke.getReturnType(), 
                superInvoke.getName(), 
@@ -522,7 +735,8 @@
       }
    }
    
-   private String createJoinpointInvokeBody(CtClass joinpointClass, AdviceSetupsByType setups, CtClass[] declaredExceptions)throws NotFoundException
+   private String createJoinpointInvokeBody(CtClass joinpointClass,
+         AdviceSetupsByType setups, CtClass[] declaredExceptions, CtClass[] parameterTypes)throws NotFoundException
    {
 
       StringBuffer code = new StringBuffer();
@@ -546,15 +760,18 @@
       }
       code.append("   try");
       code.append("   {");
-      addBeforeInvokeCode(code, setups);
+      boolean argsFound = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
+            setups.getBeforeSetups(), code);
+      addAroundInvokeCode(code, setups, joinpointClass, argsFound, parameterTypes);
 
-      addAroundInvokeCode(code, setups, joinpointClass);
-
-      addAfterInvokeCode(code, setups);
+      argsFound = addInvokeCode(AfterAdviceCallStrategy.getInstance(),
+            setups.getAfterSetups(), code) || argsFound;
+      
       code.append("   }");
       code.append("   catch(java.lang.Throwable " + THROWABLE + ")");
       code.append("   {");
-      addThrowingInvokeCode(code, setups);
+      argsFound = addInvokeCode(DefaultAdviceCallStrategy.getInstance(),
+            setups.getThrowingSetups(), code) || argsFound;
       addHandleExceptionCode(code, declaredExceptions);
       code.append("   }");
       if (!isVoid())
@@ -563,30 +780,32 @@
       }
       code.append("}");;
       
+      if (argsFound)
+      {
+         code.insert(1, parameters.declareArgsArray(parameterTypes.length));
+      }
       return code.toString();
    }   
 
-   private void addBeforeInvokeCode(StringBuffer code, AdviceSetupsByType setups) throws NotFoundException
+   private boolean addInvokeCode(AdviceCallStrategy callStrategy, AdviceSetup[] setups, StringBuffer code) throws NotFoundException
    {
-      AdviceSetup[] bsetups = setups.getBeforeSetups();
-      if (bsetups != null)
+      if (setups == null || setups.length == 0)
       {
-         for (int i = 0 ; i < bsetups.length ; i++)
-         {
-            AdviceMethodProperties properties = bsetups[i].getAdviceMethodProperties();
-            
-            if (properties != null)
-            {
-               code.append(bsetups[i].getAspectFieldName() + "." + bsetups[i].getAdviceName() + "(");
-               appendAdviceCallParameters(code, properties, false);
-               code.append(");");
-            }
-         }
+         return false;
       }
+      boolean argsFound = false;
+      String key = callStrategy.generateKey(this);
+      for (int i = 0 ; i < setups.length ; i++)
+      {
+         argsFound = callStrategy.appendAdviceCall(setups[i], key, code, this)
+            || argsFound;
+      }
+      return argsFound;
    }
    
    
-   private void addAroundInvokeCode(StringBuffer code, AdviceSetupsByType setups, CtClass joinpointClass) throws NotFoundException
+   private void addAroundInvokeCode(StringBuffer code, AdviceSetupsByType setups,
+         CtClass joinpointClass, boolean argsFound, CtClass[] parameterTypes) throws NotFoundException
    {
       if (setups.getAroundSetups() != null)
       {
@@ -613,8 +832,18 @@
 
          code.append("      if(" + INFO_FIELD + ".getInterceptors() != null)");
          code.append("      {");
-         code.append("         " + joinpointFqn + " jp = new " + joinpointClass.getName() + "(this, $$" + aspects.toString() + cflows.toString() + ");");
+         code.append("         " + joinpointFqn + " jp = new " + joinpointClass.getName() + "(this");
+         if (argsFound)
+         {
+            parameters.appendParameterListWithArgs(code, parameterTypes, true);
+            
+         }
+         else
+         {
+            code.append(", $$");
+         }
          
+         code.append(aspects.toString() + cflows.toString() + ");");
          if (!isVoid())
          {
             code.append("          " + RETURN_VALUE + " = ($r)");
@@ -625,67 +854,35 @@
          code.append("      else");
          code.append("      {");
          
-         addDispatchCode(code);
+         addDispatchCode(code, parameterTypes, argsFound);
          
          code.append("      }");
       }
       else
       {
-         addDispatchCode(code);
+         addDispatchCode(code, parameterTypes, argsFound);
       }
    }
 
-   private void addDispatchCode(StringBuffer code)
+   private final void addDispatchCode(StringBuffer code, CtClass[] parameterTypes,
+         boolean argsFound)
    {
       if (! isVoid())
       {
          code.append("          " + RETURN_VALUE + " = ");
       }
-      code.append("super.dispatch($$);");
-   }
-   
-   private void addAfterInvokeCode(StringBuffer code, AdviceSetupsByType setups) throws NotFoundException
-   {
-      AdviceSetup[] asetups = setups.getAfterSetups();
-      if (asetups != null)
+      code.append("super.dispatch(");
+      if (argsFound)
       {
-         for (int i = 0 ; i < asetups.length ; i++)
-         {
-            AdviceMethodProperties properties = asetups[i].getAdviceMethodProperties();
-            
-            if (properties != null)
-            {
-               if (!isVoid() && !properties.isAdviceVoid())
-               {
-                  code.append("          " + RETURN_VALUE + " = (" + getReturnType().getName() + ")");
-               }
-               code.append(asetups[i].getAspectFieldName() + "." + asetups[i].getAdviceName() + "(");
-               appendAdviceCallParameters(code, properties, false);
-               code.append(");");
-            }
-         }
+         parameters.appendParameterListWithArgs(code, parameterTypes, false);
       }
-   }
-   
-   private void addThrowingInvokeCode(StringBuffer code, AdviceSetupsByType setups) throws NotFoundException
-   {
-      AdviceSetup[] tsetups = setups.getThrowingSetups();
-      if (tsetups != null)
+      else
       {
-         for (int i = 0 ; i < tsetups.length ; i++)
-         {
-            AdviceMethodProperties properties = tsetups[i].getAdviceMethodProperties();
-            
-            if (properties != null)
-            {
-               code.append(tsetups[i].getAspectFieldName() + "." + tsetups[i].getAdviceName() + "(");
-               appendAdviceCallParameters(code, properties, false);
-               code.append(");");
-            }
-         }
+         code.append("$$");
       }
+      code.append(");");
    }
-
+   
    private void addHandleExceptionCode(StringBuffer code, CtClass[] declaredExceptions)
    {
       for (int i = 0 ; i < declaredExceptions.length ; i++)
@@ -730,43 +927,7 @@
       body.append("   try{");
       body.append("      switch(++" + CURRENT_ADVICE + "){");
       
-      int addedAdvice = 0;
-      for (int i = 0 ; i < aroundSetups.length ; i++)
-      {
-         if (!aroundSetups[i].shouldInvokeAspect())
-         {
-            //We are invoking a static method/ctor, do not include advice in chain
-            continue;
-         }
-      
-         AdviceMethodProperties properties = AdviceMethodFactory.AROUND.findAdviceMethod(getAdviceMethodProperties(aroundSetups[i]));
-         if (properties == null || properties.getAdviceMethod() == null)
-         {
-//            throw new RuntimeException("DEBUG ONLY Properties was null " + aroundSetups[i].getAspectClass().getName() + "." + aroundSetups[i].getAdviceName());
-            continue;
-         }
-         
-         body.append("      case " + (++addedAdvice) + ":");
-         if (aroundSetups[i].getCFlowString() != null)
-         {
-            body.append("         if (matchesCflow" + aroundSetups[i].useCFlowFrom() + ")");
-            body.append("         {");
-            appendAroundCallString(body, returnStr, aroundSetups[i], properties);
-            body.append("         }");
-            body.append("         else");
-            body.append("         {");
-            body.append("            " + returnStr + " invokeNext();");
-            body.append("         }");
-         }
-         else
-         {
-            appendAroundCallString(body, returnStr, aroundSetups[i], properties);
-         }
-         
-         
-         body.append("      break;");
-      }
-      
+      addInvokeCode(AroundAdviceCallStrategy.getInstance(), aroundSetups, body);
       body.append("      default:");
       body.append("         " + returnStr + "this.dispatch();");
       body.append("      }");
@@ -871,12 +1032,14 @@
     * This is the constructor 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) throws CannotCompileException, NotFoundException
+   private void createProtectedConstructor(ClassPool pool, CtConstructor superCtor,
+         CtClass clazz, AdviceSetupsByType setups)
+         throws CannotCompileException, NotFoundException
    {
       
       CtClass[] superParams = superCtor.getParameterTypes();
-      ArrayList aspects = new ArrayList(); 
-      ArrayList cflows = new ArrayList();
+      ArrayList<AdviceSetup> aspects = new ArrayList<AdviceSetup>(); 
+      ArrayList<Integer> cflows = new ArrayList<Integer>();
       StringBuffer adviceInit = new StringBuffer(); 
       
       AdviceSetup[] allSetups = setups.getAllSetups();
@@ -889,7 +1052,10 @@
          
          if (allSetups[i].requiresInstanceAdvisor())
          {
-            adviceInit.append(allSetups[i].getAspectFieldName() + " = " + allSetups[i].getAspectInitialiserName() + "();");
+            adviceInit.append(allSetups[i].getAspectFieldName());
+            adviceInit.append(" = ");
+            adviceInit.append(allSetups[i].getAspectInitialiserName());
+            adviceInit.append("();");
          }
          else
          {
@@ -898,7 +1064,7 @@
          
          if (allSetups[i].isNewCFlow())
          {
-            cflows.add(new Integer(allSetups[i].useCFlowFrom()));
+            cflows.add(allSetups[i].useCFlowFrom());
          }
       }
 
@@ -1101,76 +1267,7 @@
       
       return sb.toString();
    }
-
-   public void appendAroundCallString(StringBuffer invokeNextBody, String returnStr, AdviceSetup setup, AdviceMethodProperties properties)
-   {
-      int[] args = properties.getArgs();
-      
-      final boolean firstParamIsInvocation = (args.length >= 1 && args[0] == AdviceMethodProperties.INVOCATION_ARG);
-
-      if (!firstParamIsInvocation)
-      {
-         invokeNextBody.append("try{");
-         invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.push(this); ");
-      }
-
-      invokeNextBody.append("   " + returnStr + " " + setup.getAspectFieldName() + "." + properties.getAdviceName() + "(");
-      appendAdviceCallParameters(invokeNextBody, properties, true);
-      invokeNextBody.append(");");
-      
-      if (!firstParamIsInvocation)
-      {
-         invokeNextBody.append("}finally{");
-         invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.pop(); ");
-         invokeNextBody.append("}");
-      }
-   }
-
-   private void appendAdviceCallParameters(StringBuffer invokeNextBody, AdviceMethodProperties properties, boolean isAround) 
-   {
-      final int[] args = properties.getArgs(); 
-      final Class[] adviceParams = properties.getAdviceMethod().getParameterTypes();
-      for (int i = 0 ; i < args.length ; i++)
-      {
-         if (i > 0) invokeNextBody.append(", ");
-
-         switch(args[i])
-         {
-         case AdviceMethodProperties.INVOCATION_ARG:
-            invokeNextBody.append(castToAdviceProperties(i, adviceParams) + "this");
-            break;
-         case AdviceMethodProperties.JOINPOINT_ARG:
-            invokeNextBody.append(castToAdviceProperties(i, adviceParams) + INFO_FIELD);
-            break;
-         case AdviceMethodProperties.RETURN_ARG:
-            invokeNextBody.append(castToAdviceProperties(i, adviceParams) + RETURN_VALUE);
-            break;
-         case AdviceMethodProperties.THROWABLE_ARG:
-            invokeNextBody.append(castToAdviceProperties(i, adviceParams) + THROWABLE);
-            break;
-         default:
-            if (isAround)
-            {
-               invokeNextBody.append(castToAdviceProperties(i, adviceParams) + "this.arg" + args[i]);
-            }
-            else 
-            {
-               //The parameter array is 1-based, and the invokeJoinPoint method may also take the target and caller objects
-               int offset = 1;
-               if (hasTargetObject()) offset++;
-               if (hasCallingObject()) offset++;
-               invokeNextBody.append(castToAdviceProperties(i, adviceParams) + "$" + (args[i] + offset));
-            }
-         }
-      }
-   }
    
-   private String castToAdviceProperties(int i, Class[] args)
-   {
-      //In case of overloaded methods javassist sometimes seems to pick up the wrong method - use explicit casts to get hold of the parameters
-      return "(" + ClassExpression.simpleType(args[i]) + ")";
-   }
-   
    protected class AdviceSetup
    {
       int index;
@@ -1405,16 +1502,16 @@
       AdviceSetupsByType(AdviceSetup[] setups)
       {
          allSetups = setups;
-         ArrayList beforeAspects = null;
-         ArrayList afterAspects = null;
-         ArrayList throwingAspects = null;
-         ArrayList aroundAspects = null;
+         ArrayList<AdviceSetup> beforeAspects = null;
+         ArrayList<AdviceSetup> afterAspects = null;
+         ArrayList<AdviceSetup> throwingAspects = null;
+         ArrayList<AdviceSetup> aroundAspects = null;
 
          for (int i = 0 ; i < setups.length ; i++)
          {
             if (setups[i].isBefore())
             {
-               if (beforeAspects == null) beforeAspects = new ArrayList();
+               if (beforeAspects == null) beforeAspects = new ArrayList<AdviceSetup>();
                
                AdviceMethodProperties properties = AdviceMethodFactory.BEFORE.findAdviceMethod(getAdviceMethodProperties(setups[i]));
                if (properties != null)
@@ -1426,7 +1523,7 @@
             }
             else if (setups[i].isAfter())
             {
-               if (afterAspects == null) afterAspects = new ArrayList();
+               if (afterAspects == null) afterAspects = new ArrayList<AdviceSetup>();
                AdviceMethodProperties properties = AdviceMethodFactory.AFTER.findAdviceMethod(getAdviceMethodProperties(setups[i]));
                if (properties != null)
                {
@@ -1437,7 +1534,7 @@
             }
             else if (setups[i].isThrowing())
             {
-               if (throwingAspects == null) throwingAspects = new ArrayList();
+               if (throwingAspects == null) throwingAspects = new ArrayList<AdviceSetup>();
                AdviceMethodProperties properties = AdviceMethodFactory.THROWING.findAdviceMethod(getAdviceMethodProperties(setups[i]));
                if (properties != null)
                {
@@ -1448,7 +1545,7 @@
             }
             else
             {
-               if (aroundAspects == null) aroundAspects = new ArrayList();
+               if (aroundAspects == null) aroundAspects = new ArrayList<AdviceSetup>();
                AdviceMethodProperties properties = AdviceMethodFactory.AROUND.findAdviceMethod(getAdviceMethodProperties(setups[i]));
                if (properties != null)
                {
@@ -1508,7 +1605,7 @@
          {
             try
             {
-               AccessController.doPrivileged(new PrivilegedExceptionAction()
+               AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
                {
                   public Object run() throws Exception
                   {
@@ -1537,4 +1634,253 @@
          }
       };
    }
-}
+
+
+   private static abstract class AdviceCallStrategy
+   {
+      public abstract String generateKey(JoinPointGenerator generator);
+      public abstract boolean appendAdviceCall(AdviceSetup setup, String key,
+           StringBuffer code, JoinPointGenerator generator) throws NotFoundException;
+      
+      private final boolean appendAdviceCall(AdviceSetup setup, StringBuffer code,
+            boolean isAround, JoinPointGenerator generator) 
+      {
+         AdviceMethodProperties properties = setup.getAdviceMethodProperties();
+         if (properties == null)
+         {
+            return false;
+         }
+         code.append(setup.getAspectFieldName());
+         code.append(".");
+         code.append(setup.getAdviceName());
+         code.append("(");
+         
+         
+         final int[] args = properties.getArgs();
+         boolean argsFound = false;
+         if (args.length > 0)
+         {
+            final Class[] adviceParams = properties.getAdviceMethod().getParameterTypes();
+            argsFound = appendParameters(code, args[0], adviceParams[0],
+                  isAround, generator);
+            for (int i = 1 ; i < args.length ; i++)
+            {
+               code.append(", ");
+               argsFound = appendParameters(code, args[i], adviceParams[i],
+                     isAround, generator) || argsFound;
+            }
+         }
+         
+         code.append(");");
+         return argsFound;
+      }
+      /**
+       * @param code
+       * @param isAround
+       * @param args
+       * @param adviceParams
+       * @param argsFound
+       * @param i
+       * @return
+       */
+      private final boolean appendParameters(StringBuffer code, final int arg,
+            final Class adviceParam, boolean isAround, JoinPointGenerator generator)
+      {
+         code.append("(");
+         // In case of overloaded methods javassist sometimes seems to pick up the wrong method - use explicit casts to get hold of the parameters
+         code.append(ClassExpression.simpleType(adviceParam));
+         code.append(")");
+         switch(arg)
+         {
+         case AdviceMethodProperties.INVOCATION_ARG:
+            code.append("this");
+            break;
+         case AdviceMethodProperties.JOINPOINT_ARG:
+            code.append(INFO_FIELD);
+            break;
+         case AdviceMethodProperties.RETURN_ARG:
+            code.append(RETURN_VALUE);
+            break;
+         case AdviceMethodProperties.THROWABLE_ARG:
+            code.append(THROWABLE);
+            break;
+         case AdviceMethodProperties.ARGS_ARG:
+            code.append(ARGUMENTS);
+            return true;
+         default:
+            if (isAround)
+            {
+               code.append("this.arg");
+               code.append(arg);
+            }
+            else 
+            {
+               //The parameter array is 1-based, and the invokeJoinPoint method may also take the target and caller objects
+               code.append("$");
+               code.append(arg + generator.parameters.getFirstArgIndex());
+            }
+         }
+         return false;
+      }
+   }
+   
+   private static class AroundAdviceCallStrategy extends AdviceCallStrategy
+   {
+      private static ThreadLocal<AroundAdviceCallStrategy> INSTANCE;
+      
+      static
+      {
+         INSTANCE = new ThreadLocal<AroundAdviceCallStrategy>();
+         INSTANCE.set(new AroundAdviceCallStrategy());
+      }
+      
+      public static final AroundAdviceCallStrategy getInstance()
+      {
+         return INSTANCE.get();
+      }
+      
+      private AroundAdviceCallStrategy() {}
+      
+      private int addedAdvice = 0;
+      
+      public String generateKey(JoinPointGenerator generator)
+      {
+         addedAdvice = 0;
+         if (generator.isVoid())
+         {
+            return "";
+         }
+         return "return ($w)";
+      }
+      
+      public boolean appendAdviceCall(AdviceSetup setup, String key,
+            StringBuffer code, JoinPointGenerator generator)
+      {
+         if (!setup.shouldInvokeAspect())
+         {
+            //We are invoking a static method/ctor, do not include advice in chain
+            return false;
+         }
+      
+         boolean result = false;
+         AdviceMethodProperties properties = AdviceMethodFactory.AROUND.
+            findAdviceMethod(generator.getAdviceMethodProperties(setup));
+         if (properties == null || properties.getAdviceMethod() == null)
+         {
+            // throw new RuntimeException("DEBUG ONLY Properties was null " + 
+            // aroundSetups[i].getAspectClass().getName() + "." + aroundSetups[i].getAdviceName());
+            return false;
+         }
+         
+         code.append("      case ");
+         code.append(++addedAdvice);
+         code.append(":");
+         
+         if (setup.getCFlowString() != null)
+         {
+            code.append("         if (matchesCflow" + setup.useCFlowFrom() + ")");
+            code.append("         {");
+            result = appendAroundCallString(code, key, setup, properties, generator);
+            code.append("         }");
+            code.append("         else");
+            code.append("         {");
+            code.append("            ");
+            code.append(key);
+            code.append(" invokeNext();");
+            code.append("         }");
+         }
+         else
+         {
+            result = appendAroundCallString(code, key, setup, properties, generator);
+         }
+         
+         code.append("      break;");
+         return result;
+      }
+      
+      
+      public boolean appendAroundCallString(StringBuffer invokeNextBody,
+            String returnStr, AdviceSetup setup, AdviceMethodProperties properties,
+            JoinPointGenerator generator)
+      {
+         int[] args = properties.getArgs();
+         
+         final boolean firstParamIsInvocation =
+            (args.length >= 1 && args[0] == AdviceMethodProperties.INVOCATION_ARG);
+
+         if (!firstParamIsInvocation)
+         {
+            invokeNextBody.append("try{");
+            invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.push(this); ");
+         }
+         invokeNextBody.append("   ");
+         invokeNextBody.append(returnStr);
+         invokeNextBody.append(" ");
+         boolean result = super.appendAdviceCall(setup, invokeNextBody, true, generator);
+         
+         if (!firstParamIsInvocation)
+         {
+            invokeNextBody.append("}finally{");
+            invokeNextBody.append("   org.jboss.aop.joinpoint.CurrentInvocation.pop(); ");
+            invokeNextBody.append("}");
+         }
+         return result;
+      }
+   }
+   
+   private static class DefaultAdviceCallStrategy extends AdviceCallStrategy
+   {
+      private static DefaultAdviceCallStrategy INSTANCE = new DefaultAdviceCallStrategy();
+      
+      public static final DefaultAdviceCallStrategy getInstance()
+      {
+         return INSTANCE;
+      }
+      
+      private DefaultAdviceCallStrategy() {}
+
+      public String generateKey(JoinPointGenerator generator)
+      {
+         return null;
+      }
+      
+      public boolean appendAdviceCall(AdviceSetup setup, String key,
+            StringBuffer code, JoinPointGenerator generator)
+      {
+         return super.appendAdviceCall(setup, code, false, generator);
+      }
+   }
+   
+   private static class AfterAdviceCallStrategy extends AdviceCallStrategy
+   {
+      private static AfterAdviceCallStrategy INSTANCE = new AfterAdviceCallStrategy();
+      
+      public static final AfterAdviceCallStrategy getInstance()
+      {
+         return INSTANCE;
+      }
+      
+      private AfterAdviceCallStrategy() {}
+
+      public String generateKey(JoinPointGenerator generator)
+      {
+         if (generator.isVoid())
+         {
+            return "";
+         }
+         return "          " + RETURN_VALUE + " = (" +
+         generator.getReturnType().getName() + ")";
+      }
+
+      public boolean appendAdviceCall(AdviceSetup setup, String key,
+            StringBuffer code, JoinPointGenerator generator) throws NotFoundException
+      {
+         AdviceMethodProperties properties = setup.getAdviceMethodProperties();
+         if (properties != null && !properties.isAdviceVoid())
+         {
+            code.append(key);
+         }
+         return super.appendAdviceCall(setup, code, false, generator);
+      }
+   }
+}
\ No newline at end of file

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByConJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -61,8 +61,17 @@
 
    public MethodByConJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, getParameters((MethodByConInfo) info));
    }
+   
+   private static JoinPointParameters getParameters(MethodByConInfo info)
+   {
+      if (Modifier.isStatic(info.getMethod().getModifiers()))
+      {
+         return JoinPointParameters.ONLY_ARGS;
+      }
+      return JoinPointParameters.TARGET_ARGS;
+   }
 
    protected void initialiseJoinPointNames()
    {
@@ -337,8 +346,6 @@
        */
       private CtMethod addInvokeJoinpointMethod() throws CannotCompileException, NotFoundException
       {
-         CtClass[] invokeParams = null;
-
          invokeJoinpointMethod  = CtNewMethod.make(
                targetMethod.getReturnType(),
                INVOKE_JOINPOINT,

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodByMethodJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -61,9 +61,26 @@
 
    public MethodByMethodJoinPointGenerator(GeneratedClassAdvisor advisor, JoinPointInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, getParameters((MethodByMethodInfo) info));
    }
 
+   private static JoinPointParameters getParameters(MethodByMethodInfo info)
+   {
+      if (Modifier.isStatic(info.getCallingMethod().getModifiers()))
+      {
+         if (Modifier.isStatic(info.getMethod().getModifiers()))
+         {
+            return JoinPointParameters.ONLY_ARGS;
+         }
+         return JoinPointParameters.TARGET_ARGS;
+      }
+      if (Modifier.isStatic(info.getMethod().getModifiers()))
+      {
+         return JoinPointParameters.CALLER_ARGS;
+      }
+      return JoinPointParameters.TARGET_CALLER_ARGS;
+   }
+   
    protected void initialiseJoinPointNames()
    {
       joinpointClassName = getInfoClassName(

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodExecutionTransformer.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -402,5 +402,13 @@
       {
          return instrumentor;
       }
+
+      /**
+       * @param wmethod2
+       */
+      public void setMethod(CtMethod method)
+      {
+         this.method = method;
+      }
    }
 }
\ No newline at end of file

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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/MethodJoinPointGenerator.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -62,8 +62,17 @@
 
    public MethodJoinPointGenerator(GeneratedClassAdvisor advisor, MethodInfo info)
    {
-      super(advisor, info);
+      super(advisor, info, getParameters((MethodInfo) info));
    }
+   
+   private static JoinPointParameters getParameters(MethodInfo info)
+   {
+      if (Modifier.isStatic(info.getAdvisedMethod().getModifiers()))
+      {
+         return JoinPointParameters.ONLY_ARGS;
+      }
+      return JoinPointParameters.TARGET_ARGS;
+   }
 
    protected void initialiseJoinPointNames()
    {

Modified: projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml
===================================================================
--- projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml	2006-12-19 15:32:09 UTC (rev 59150)
@@ -2,6 +2,65 @@
 <!DOCTYPE aop SYSTEM "jboss-aop_1_0.dtd">
 
 <aop>
+   <!-- @Args test -->
+	<aspect class="org.jboss.test.aop.beforeafterArgs.ArgsAspect" scope="PER_VM"/>
+
+	<bind pointcut="field(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->field1)">
+		<before name="before1" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+      <before name="before2" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before4" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before5" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+   </bind>
+   
+   <bind pointcut="set(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->field2)">
+      <before name="before6" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+      <after name="after6" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+   </bind>
+
+	<bind pointcut="field(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->field3)">
+		<after name="after1" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+      <after name="after2" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after4" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after5" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+   </bind>
+
+	<bind pointcut="field(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->field4)">
+		<before name="before1" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+      <before name="before2" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before4" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<before name="before5" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after1" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+      <after name="after2" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after4" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+		<after name="after5" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect"/>
+   </bind>
+
+	<bind pointcut="execution(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method1(..))">
+	   <before name="before3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	   <after name="after3" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	</bind>
+
+	<bind pointcut="execution(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method2(..))">
+	   <before name="before7" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	   <advice name="around1" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	   <after name="after7" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	</bind>
+
+	<bind pointcut="execution(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method3(..))">
+	   <throwing name="throwing" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	</bind>
+	
+	<bind pointcut="call(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method3(..)) AND withincode(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method4(..))">
+      <before name="before8" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+      <advice name="around2" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+      <after name="after8" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	   <throwing name="throwing" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
+	</bind>
+	
    <!-- @JoinPoint test -->
 	<aspect class="org.jboss.test.aop.beforeafterArgs.JoinPointAspect" scope="PER_VM"/>
 

Added: 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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -0,0 +1,228 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.aop.beforeafterArgs;
+
+import junit.framework.Assert;
+
+import org.jboss.aop.advice.annotation.Args;
+import org.jboss.aop.advice.annotation.Thrown;
+import org.jboss.aop.joinpoint.MethodCalledByMethodInvocation;
+import org.jboss.aop.joinpoint.MethodInvocation;
+
+/**
+ * Aspect used on @Args parameter tests.
+ * 
+ * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
+ */
+public class ArgsAspect
+{
+   static boolean before1 = false;
+   static boolean before2 = false;
+   static boolean before3 = false;
+   static boolean before6 = false;
+   static boolean before7 = false;
+   static boolean before8 = false;
+   static Object[] before2Args = null;
+   static Object[] before3Args = null;
+   static Object[] before6Args = null;
+   static Object[] before7Args = null;
+   static Object[] before8Args = null;
+
+   static boolean after1 = false;
+   static boolean after2 = false;
+   static boolean after3 = false;
+   static boolean after6 = false;
+   static boolean after7 = false;
+   static boolean after8 = false;
+   static Object[] after2Args = null;
+   static Object[] after3Args = null;
+   static Object[] after6Args = null;
+   static Object[] after7Args = null;
+   static Object[] after8Args = null;
+
+   static boolean around1 = false;
+   static boolean around2 = false;
+   static Object[] around1Args = null;
+   static Object[] around2Args = null;
+   
+   static boolean throwing = false;
+   static Object[] throwingArgs = null;
+   
+   public static void clear()
+   {
+      before1 = false;
+      before2 = false;
+      before3 = false;
+      before6 = false;
+      before7 = false;
+      before8 = false;
+      before2Args = null;
+      before3Args = null;
+      before6Args = null;
+      before7Args = null;
+      before8Args = null;
+      
+      after1 = false;
+      after2 = false;
+      after3 = false;
+      after6 = false;
+      after7 = false;
+      after8 = false;
+      after2Args = null;
+      after3Args = null;
+      after6Args = null;
+      after7Args = null;
+      after8Args = null;
+      
+      around1 = false;
+      around2 = false;
+      around1Args = null;
+      around2Args = null;
+      
+      throwing = false;
+      throwingArgs = null;
+   }
+   
+   public void before1()
+   {
+      before1 = true;
+   }
+   
+   public void before2(@Args Object[] arguments)
+   {
+      before2 = true;
+      before2Args = arguments;
+   }
+   
+   public void before3(@Args Object arguments)
+   {
+      before3 = true;
+      before3Args = (Object[]) arguments;
+   }
+   
+   public void before4(@Args String arguments)
+   {
+      Assert.fail("This advice should never be executed");
+   }
+
+   public void before5(@Args char[] arguments)
+   {
+      Assert.fail("This advice should never be executed");
+   }
+   
+   public void before6(@Args Object[] arguments)
+   {
+      before6 = true;
+      before6Args = arguments;
+      arguments[0] = "before6";
+   }
+   
+   public void before7(@Args Object[] arguments)
+   {
+      before7 = true;
+      before7Args = arguments;
+      before7Args[0] = "before7";
+      before7Args[1] = new Integer(7);
+      before7Args[2] = Boolean.TRUE;
+      before7Args[3] = new ArgsPOJO[0];
+   }
+
+   public void before8(@Args Object[] arguments)
+   {
+      before8 = true;
+      before8Args = arguments;
+      before8Args[0] = new Short((short) -8);
+      before8Args[1] = new Long((long) 8);
+   }
+   
+   public void after1()
+   {
+      after1 = true;
+   }
+   
+   public void after2(@Args Object[] arguments)
+   {
+      after2 = true;
+      after2Args = arguments;
+   }
+   
+   public void after3(@Args Object arguments)
+   {
+      after3 = true;
+      after3Args = (Object[]) arguments;
+   }
+   
+   public void after4(@Args String arguments)
+   {
+      Assert.fail("This advice should never be executed");
+   }
+
+   public void after5(@Args char[] arguments)
+   {
+      Assert.fail("This advice should never be executed");
+   }
+   
+   public void after6(@Args Object[] arguments)
+   {
+      after6 = true;
+      after6Args = arguments;
+      arguments[0] = "after6";
+   }
+
+   public void after7(@Args Object[] arguments)
+   {
+      after7 = true;
+      after7Args = arguments;
+      after7Args[0] = "after7";
+      after7Args[1] = new Integer(14);
+      after7Args[2] = Boolean.FALSE;
+      after7Args[3] = new ArgsPOJO[]{null};
+   }
+   
+   public void after8(@Args Object[] arguments)
+   {
+      before8 = true;
+      before8Args = arguments;
+      // TODO make after 8 realize changes made during around invocations
+   }
+   
+   public Object around1(MethodInvocation invocation) throws Throwable
+   {
+      around1 = true;
+      around1Args = invocation.getArguments();
+      return invocation.invokeNext();
+   }
+   
+   public Object around2(MethodCalledByMethodInvocation invocation) throws Throwable
+   {
+      around2 = true;
+      around2Args = invocation.getArguments();
+      return invocation.invokeNext();
+   }
+   
+   public void throwing(@Args Object[] arguments, @Thrown Throwable throwable)
+   {
+      throwing = true;
+      System.out.println("RECEIVING ARGUMENTS: " + arguments);
+      throwingArgs = arguments;
+   }
+}
\ No newline at end of file

Added: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsPOJO.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsPOJO.java	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsPOJO.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.aop.beforeafterArgs;
+
+/**
+ * Plain old java object used on @Args parameter tests.
+ * 
+ * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
+ */
+public class ArgsPOJO
+{
+   public Object field1;
+   
+   public String field2;
+   
+   public int field3;
+   
+   public static boolean field4;
+   
+   public void method1(String param1, int param2, boolean param3, ArgsPOJO[] param4)
+   {}
+   
+   public void method2(String param1, int param2, boolean param3, ArgsPOJO[] param4)
+   {}
+   
+   public void method3(short param1, long param2) throws POJOException
+   {
+      throw new POJOException();
+   }
+   
+   public void method4() throws POJOException
+   {
+      this.method3((short) -4, (long) 4);
+   }
+}
\ No newline at end of file

Added: 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	2006-12-19 15:06:45 UTC (rev 59149)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java	2006-12-19 15:32:09 UTC (rev 59150)
@@ -0,0 +1,297 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.aop.beforeafterArgs;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.jboss.test.aop.AOPTestWithSetup;
+
+/**
+ * Tests the use of @Args parameters.
+ * 
+ * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
+ */
+public class ArgsTestCase extends AOPTestWithSetup
+{
+   private ArgsPOJO pojo;
+
+   public static void main(String[] args)
+   {
+      TestRunner.run(suite());
+   }
+
+   public static Test suite()
+   {
+      TestSuite suite = new TestSuite("ArgsTestCase");
+      suite.addTestSuite(ArgsTestCase.class);
+      return suite;
+   }
+
+   public ArgsTestCase(String name)
+   {
+      super(name);
+   }
+
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      this.pojo = new ArgsPOJO();
+      ArgsAspect.clear();
+   }
+   
+   public void test1()
+   {
+      Object text = pojo.field1;
+      assertTrue(ArgsAspect.before1);
+      assertTrue(ArgsAspect.before2);
+      assertTrue(ArgsAspect.before3);
+      assertSame(ArgsAspect.before2Args, ArgsAspect.before3Args);
+      assertEquals(0, ArgsAspect.before2Args.length);
+      
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after3);
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test2()
+   {
+      pojo.field1 = "test2";
+      assertTrue(ArgsAspect.before1);
+      assertTrue(ArgsAspect.before2);
+      assertTrue(ArgsAspect.before3);
+      assertSame(ArgsAspect.before2Args, ArgsAspect.before3Args);
+      assertEquals(1, ArgsAspect.before2Args.length);
+      assertEquals("test2", ArgsAspect.before2Args[0]);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after3);
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test3()
+   {
+      pojo.field2 = "test3";
+      assertTrue(ArgsAspect.before6);
+      assertTrue(ArgsAspect.after6);
+      assertNotNull(ArgsAspect.before6Args);
+      assertSame(ArgsAspect.before6Args, ArgsAspect.after6Args);
+      assertEquals(1, ArgsAspect.before6Args.length);
+      assertEquals("after6", ArgsAspect.before6Args[0]);
+      
+      assertFalse(ArgsAspect.before1);
+      assertFalse(ArgsAspect.before2);
+      assertFalse(ArgsAspect.before3);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after3);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+      
+      assertEquals("before6", pojo.field2);
+   }
+   
+   public void test4()
+   {
+      pojo.field3 = 10;
+      
+      assertTrue(ArgsAspect.after1);
+      assertTrue(ArgsAspect.after2);
+      assertTrue(ArgsAspect.after3);
+      assertNotNull(ArgsAspect.after2Args);
+      assertSame(ArgsAspect.after2Args, ArgsAspect.after3Args);
+      assertEquals(1, ArgsAspect.after2Args.length);
+      assertEquals(10, ArgsAspect.after2Args[0]);
+      
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.before1);
+      assertFalse(ArgsAspect.before2);
+      assertFalse(ArgsAspect.before3);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test5()
+   {
+      boolean result = ArgsPOJO.field4 && true;
+      
+      assertTrue(ArgsAspect.before1);
+      assertTrue(ArgsAspect.before2);
+      assertTrue(ArgsAspect.before3);
+      assertTrue(ArgsAspect.after1);
+      assertTrue(ArgsAspect.after2);
+      assertTrue(ArgsAspect.after3);
+      assertNotNull(ArgsAspect.before2Args);
+      assertSame(ArgsAspect.before2Args, ArgsAspect.before3Args);
+      assertSame(ArgsAspect.before2Args, ArgsAspect.after2Args);
+      assertSame(ArgsAspect.before2Args, ArgsAspect.after3Args);
+      assertEquals(0, ArgsAspect.before2Args.length);
+      
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test6()
+   {
+      pojo.method1("test6", 6, true, null);
+      
+      assertTrue(ArgsAspect.before3);
+      assertTrue(ArgsAspect.after3);
+      assertNotNull(ArgsAspect.before3Args);
+      assertSame(ArgsAspect.before3Args, ArgsAspect.after3Args);
+      assertEquals(4, ArgsAspect.before3Args.length);
+      assertEquals("test6", ArgsAspect.before3Args[0]);
+      assertEquals(6, ((Integer) ArgsAspect.before3Args[1]).intValue());
+      assertEquals(true, ((Boolean) ArgsAspect.before3Args[2]).booleanValue());
+      assertNull(ArgsAspect.before3Args[3]);
+      
+      assertFalse(ArgsAspect.before1);
+      assertFalse(ArgsAspect.before2);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test7()
+   {
+      pojo.method2("test7", 0, false, null);
+      assertTrue(ArgsAspect.before7);
+      assertTrue(ArgsAspect.after7);
+      assertTrue(ArgsAspect.around1);
+      
+      assertNotNull(ArgsAspect.before7Args);
+      assertSame(ArgsAspect.before7Args, ArgsAspect.after7Args);
+      assertEquals(4, ArgsAspect.before7Args.length);
+      assertEquals("after7", ArgsAspect.before7Args[0]);
+      assertEquals(14, ((Integer) ArgsAspect.before7Args[1]).intValue());
+      assertEquals(false, ((Boolean) ArgsAspect.before7Args[2]).booleanValue());
+      
+      assertNotNull(ArgsAspect.before7Args[3]);
+      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);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after3);
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around2);
+      assertFalse(ArgsAspect.throwing);
+   }
+   
+   public void test8()
+   {
+      try
+      {
+         pojo.method3((short) 0, 100);
+      }
+      catch(POJOException e)
+      {}
+      assertTrue(ArgsAspect.throwing);
+      assertNotNull(ArgsAspect.throwingArgs);
+      assertEquals(2, ArgsAspect.throwingArgs.length);
+      assertEquals(0, ((Short) ArgsAspect.throwingArgs[0]).shortValue());
+      assertEquals(100, ((Long) ArgsAspect.throwingArgs[1]).longValue());
+      
+      assertFalse(ArgsAspect.before1);
+      assertFalse(ArgsAspect.before2);
+      assertFalse(ArgsAspect.before3);
+      assertFalse(ArgsAspect.before6);
+      assertFalse(ArgsAspect.before7);
+      assertFalse(ArgsAspect.before8);
+      assertFalse(ArgsAspect.after1);
+      assertFalse(ArgsAspect.after2);
+      assertFalse(ArgsAspect.after3);
+      assertFalse(ArgsAspect.after6);
+      assertFalse(ArgsAspect.after7);
+      assertFalse(ArgsAspect.after8);
+      assertFalse(ArgsAspect.around1);
+      assertFalse(ArgsAspect.around2);
+   }
+   
+   public void test9()
+   {
+      try
+      {
+         pojo.method4();
+      } catch (POJOException e)
+      {}
+   }
+}
\ No newline at end of file




More information about the jboss-cvs-commits mailing list