[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