[jboss-cvs] JBossAS SVN: r59981 - in projects/aop/trunk/aop/src: resources/test/beforeafterArgs and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Jan 24 14:52:57 EST 2007
Author: flavia.rainone at jboss.com
Date: 2007-01-24 14:52:57 -0500 (Wed, 24 Jan 2007)
New Revision: 59981
Modified:
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/resources/test/beforeafterArgs/jboss-aop.xml
projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java
Log:
[JBAOP-325] @Args support on field joinponts added.
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java 2007-01-24 19:47:29 UTC (rev 59980)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/FieldJoinPointGenerator.java 2007-01-24 19:52:57 UTC (rev 59981)
@@ -250,16 +250,34 @@
{
addTypedTargetField();
}
+ addArgumentFieldAndAccessor();
addInvokeJoinpointMethod();
addFieldInfoField();
addPublicConstructor();
- addProtectedConstructor();
+ addProtectedConstructors();
addDispatchMethods();
TransformerCommon.compileOrLoadClass(advisedClass, jp);
return jp;
}
+ protected void addArgumentFieldAndAccessor() throws CannotCompileException, NotFoundException
+ {
+ CtField argumentsField = new CtField(
+ instrumentor.forName("java.lang.Object[]"), ARGUMENTS, jp);
+ argumentsField.setModifiers(Modifier.PROTECTED);
+ jp.addField(argumentsField);
+ CtMethod getArguments = CtNewMethod.make(createGetArgumentsBody(), jp);
+ getArguments.setModifiers(Modifier.PUBLIC);
+ jp.addMethod(getArguments);
+ CtMethod setArguments = CtNewMethod.make(createSetArgumentsBody(), jp);
+ setArguments.setModifiers(Modifier.PUBLIC);
+ jp.addMethod(setArguments);
+ }
+
+ protected abstract String createGetArgumentsBody();
+ protected abstract String createSetArgumentsBody();
+
private static String debugFields(CtClass clazz) throws NotFoundException
{
StringBuffer sb = new StringBuffer();
@@ -310,25 +328,58 @@
}
/**
- * This constructor will be called by invokeJoinpoint in the generated subclass when we need to
- * instantiate a joinpoint containing target and args
+ * These constructors will be called by invokeJoinpoint in the generated
+ * subclass when we need to instantiate a joinpoint containing target and args
*/
- protected void addProtectedConstructor() throws CannotCompileException, NotFoundException
+ protected void addProtectedConstructors() throws CannotCompileException, NotFoundException
{
+ CtClass[] ctorParams1 = (hasTargetObject) ? new CtClass[2] : new CtClass[1];
+ CtClass[] ctorParams2 = (hasTargetObject) ? new CtClass[3] : new CtClass[2];
+
+ ctorParams1[0] = ctorParams2[0] = jp;
+ if (hasTargetObject) ctorParams1[1] = ctorParams2[1] = advisedClass;
+ ctorParams2[ctorParams2.length - 1] = getArgumentType();
+
+ StringBuffer body = new StringBuffer();
+ body.append("{");
+ body.append(" this($1." + INFO_FIELD + ");");
+ if (hasTargetObject)
+ {
+ body.append(" this." + TARGET_FIELD + " = $2;");
+ body.append(" super.setTargetObject($2);");
+ }
+
+ if (getArgumentType() != null)
+ {
+ CtConstructor protectedConstructor = CtNewConstructor.make(
+ ctorParams1,
+ new CtClass[0],
+ body.toString() + "}",
+ jp);
+ protectedConstructor.setModifiers(Modifier.PROTECTED);
+ jp.addConstructor(protectedConstructor);
+ }
+ else
+ {
+ ctorParams2 = ctorParams1;
+ }
+ String setArguments = createSetValue();
CtConstructor protectedConstructor = CtNewConstructor.make(
- createProtectedCtorParams(),
+ ctorParams2,
new CtClass[0],
- createProtectedCtorBody(),
+ body.toString() + setArguments + "}",
jp);
protectedConstructor.setModifiers(Modifier.PROTECTED);
-
jp.addConstructor(protectedConstructor);
+
+
}
- protected abstract CtClass[] createProtectedCtorParams() throws NotFoundException;
- protected abstract String createProtectedCtorBody();
+ protected abstract CtClass getArgumentType() throws NotFoundException;
+ protected abstract String createSetValue();
protected abstract CtClass[] getInvokeJoinPointParams() throws NotFoundException;
+
/**
* Add an empty invokeJoinpoint() method. This method will be overridden by generated subclasses,
* when the interceptors are rebuilt
@@ -438,31 +489,16 @@
return READ_INVOCATION_CT_TYPE;
}
- protected CtClass[] createProtectedCtorParams() throws NotFoundException
+ protected CtClass getArgumentType()
{
- CtClass[] ctorParams = (hasTargetObject) ? new CtClass[2] : new CtClass[1];
- ctorParams[0] = jp;
- if (hasTargetObject) ctorParams[1] = advisedClass;
-
- return ctorParams;
+ return null;
}
-
- protected String createProtectedCtorBody()
+
+ protected String createSetValue()
{
- StringBuffer body = new StringBuffer();
- body.append("{");
- body.append(" this($1." + INFO_FIELD + ");");
-
- if (hasTargetObject)
- {
- body.append(" this." + TARGET_FIELD + " = $2;");
- body.append(" super.setTargetObject($2);");
- }
-
- body.append("}");
- return body.toString();
+ return "";
}
-
+
protected CtClass[] getInvokeJoinPointParams() throws NotFoundException
{
return (hasTargetObject) ? new CtClass[] {advisedClass} : new CtClass[0];
@@ -496,6 +532,36 @@
"{return " + "$1." + advisedField.getName() + ";}" :
"{return " + advisedClass.getName() + "." + advisedField.getName() + ";}";
}
+
+ protected String createGetArgumentsBody()
+ {
+ StringBuffer code = new StringBuffer("public java.lang.Object[] getArguments()");
+ code.append("{ ");
+ code.append(" if(");
+ code.append(ARGUMENTS);
+ code.append(" == null)");
+ code.append(" {");
+ code.append(" ");
+ code.append(ARGUMENTS);
+ code.append(" = new java.lang.Object[0];");
+ code.append(" }");
+ code.append(" return ");
+ code.append(ARGUMENTS);
+ code.append("; ");
+ code.append("}");
+ return code.toString();
+ }
+
+ protected String createSetArgumentsBody()
+ {
+ StringBuffer code = new StringBuffer(
+ "public void setArguments(java.lang.Object[] args)");
+ code.append("{ ");
+ code.append(ARGUMENTS);
+ code.append("=args;");
+ code.append("}");
+ return code.toString();
+ }
}
private static class WriteBaseClassGenerator extends BaseClassGenerator
@@ -510,43 +576,19 @@
{
return WRITE_INVOCATION_CT_TYPE;
}
-
- protected CtClass[] createProtectedCtorParams() throws NotFoundException
+
+ protected CtClass getArgumentType() throws NotFoundException
{
- CtClass[] ctorParams = (hasTargetObject) ? new CtClass[3] : new CtClass[2];
- ctorParams[0] = jp;
- if (hasTargetObject)
- {
- ctorParams[1] = advisedClass;
- ctorParams[2] = advisedField.getType();
- }
- else
- {
- ctorParams[1] = advisedField.getType();
- }
-
- return ctorParams;
+ return advisedField.getType();
}
- protected String createProtectedCtorBody()
+ protected String createSetValue()
{
- StringBuffer body = new StringBuffer();
- body.append("{");
- body.append(" this($1." + INFO_FIELD + ");");
-
if (hasTargetObject)
{
- body.append(" this." + TARGET_FIELD + " = $2;");
- body.append(" super.setTargetObject($2);");
- body.append(" super.value = ($w)$3;");
+ return " super.value = ($w)$3;";
}
- else
- {
- body.append(" super.value = ($w)$2;");
- }
-
- body.append("}");
- return body.toString();
+ return " super.value = ($w)$2;";
}
protected CtClass[] getInvokeJoinPointParams() throws NotFoundException
@@ -592,5 +634,36 @@
"{$1." + advisedField.getName() + " = $2;}" :
"{" + advisedClass.getName() + "." + advisedField.getName() + " = $1;}";
}
+
+ protected String createGetArgumentsBody()
+ {
+ StringBuffer code = new StringBuffer("public java.lang.Object[] getArguments()");
+ code.append("{ ");
+ code.append(" if(");
+ code.append(ARGUMENTS);
+ code.append(" == null)");
+ code.append(" {");
+ code.append(" ");
+ code.append(ARGUMENTS);
+ code.append(" = new java.lang.Object[]{super.value};");
+ code.append(" }");
+ code.append(" return ");
+ code.append(ARGUMENTS);
+ code.append("; ");
+ code.append("}");
+ return code.toString();
+ }
+
+ protected String createSetArgumentsBody()
+ {
+ StringBuffer code = new StringBuffer(
+ "public void setArguments(java.lang.Object[] args)");
+ code.append("{ ");
+ code.append(ARGUMENTS);
+ code.append("=args;");
+ code.append(" super.value=args[0];");
+ code.append("}");
+ return code.toString();
+ }
}
}
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2007-01-24 19:47:29 UTC (rev 59980)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/JoinPointGenerator.java 2007-01-24 19:52:57 UTC (rev 59981)
@@ -254,7 +254,7 @@
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 String ARGUMENTS= "arguments";
private static final String GET_ARGUMENTS= " getArguments()";
protected static final CtClass[] EMPTY_CTCLASS_ARRAY = new CtClass[0];
@@ -944,10 +944,6 @@
{
throw new RuntimeException("JoinPoints should have 2 or 3 constructors, not " + superCtors.length);
}
- else if (superCtors.length != 2 && FieldJoinPointGenerator.class.isAssignableFrom(this.getClass()))
- {
- throw new RuntimeException("Field JoinPoints should only have 2 and only constructors, not " + superCtors.length);
- }
else if (superCtors.length != 4 && superCtors.length != 3 && this.getClass().equals(MethodJoinPointGenerator.class))
{
throw new RuntimeException("Method JoinPoints should have 3 or 4 constructors, not " + superCtors.length);
Modified: projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml
===================================================================
--- projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml 2007-01-24 19:47:29 UTC (rev 59980)
+++ projects/aop/trunk/aop/src/resources/test/beforeafterArgs/jboss-aop.xml 2007-01-24 19:52:57 UTC (rev 59981)
@@ -7,7 +7,7 @@
<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="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"/>
@@ -20,8 +20,9 @@
</bind>
<bind pointcut="field(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->field3)">
+ <advice name="around3" 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="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"/>
@@ -29,12 +30,13 @@
<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="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"/>
+ <advice name="around3" 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="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"/>
@@ -43,6 +45,7 @@
<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" />
+ <throwing name="throwing" aspect="org.jboss.test.aop.beforeafterArgs.ArgsAspect" />
</bind>
<bind pointcut="execution(* org.jboss.test.aop.beforeafterArgs.ArgsPOJO->method2(..))">
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java 2007-01-24 19:47:29 UTC (rev 59980)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsAspect.java 2007-01-24 19:52:57 UTC (rev 59981)
@@ -25,6 +25,7 @@
import org.jboss.aop.advice.annotation.Args;
import org.jboss.aop.advice.annotation.Thrown;
+import org.jboss.aop.joinpoint.Invocation;
import org.jboss.aop.joinpoint.MethodCalledByMethodInvocation;
import org.jboss.aop.joinpoint.MethodInvocation;
@@ -204,9 +205,8 @@
public void after8(@Args Object[] arguments)
{
- before8 = true;
- before8Args = arguments;
- // TODO make after 8 realize changes made during around invocations
+ after8 = true;
+ after8Args = arguments;
}
public Object around1(MethodInvocation invocation) throws Throwable
@@ -223,7 +223,7 @@
return invocation.invokeNext();
}
- public Object around3(MethodInvocation invocation, @Args Object[] arguments) throws Throwable
+ public Object around3(@org.jboss.aop.advice.annotation.Invocation Invocation invocation, @Args Object[] arguments) throws Throwable
{
around3 = true;
around3Args = arguments;
@@ -233,7 +233,6 @@
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
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java 2007-01-24 19:47:29 UTC (rev 59980)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/beforeafterArgs/ArgsTestCase.java 2007-01-24 19:52:57 UTC (rev 59981)
@@ -80,6 +80,7 @@
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around1);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
assertFalse(ArgsAspect.throwing);
}
@@ -103,6 +104,7 @@
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around1);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
assertFalse(ArgsAspect.throwing);
}
@@ -128,6 +130,7 @@
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around1);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
assertFalse(ArgsAspect.throwing);
assertEquals("before6", pojo.field2);
@@ -136,15 +139,18 @@
public void test4()
{
pojo.field3 = 10;
-
+ assertTrue(ArgsAspect.around3);
assertTrue(ArgsAspect.after1);
assertTrue(ArgsAspect.after2);
assertTrue(ArgsAspect.after3);
- assertNotNull(ArgsAspect.after2Args);
+ assertNotNull(ArgsAspect.around3Args);
+ assertEquals(1, ArgsAspect.around3Args.length);
+ assertEquals(10, ArgsAspect.around3Args[0]);
assertSame(ArgsAspect.after2Args, ArgsAspect.after3Args);
assertEquals(1, ArgsAspect.after2Args.length);
assertEquals(10, ArgsAspect.after2Args[0]);
+
assertFalse(ArgsAspect.after6);
assertFalse(ArgsAspect.after7);
assertFalse(ArgsAspect.after8);
@@ -166,6 +172,7 @@
assertTrue(ArgsAspect.before1);
assertTrue(ArgsAspect.before2);
assertTrue(ArgsAspect.before3);
+ assertTrue(ArgsAspect.around3);
assertTrue(ArgsAspect.after1);
assertTrue(ArgsAspect.after2);
assertTrue(ArgsAspect.after3);
@@ -188,6 +195,36 @@
public void test6()
{
+ ArgsPOJO.field4 = false;
+
+ assertTrue(ArgsAspect.before1);
+ assertTrue(ArgsAspect.before2);
+ assertTrue(ArgsAspect.before3);
+ assertTrue(ArgsAspect.around3);
+ assertTrue(ArgsAspect.after1);
+ assertTrue(ArgsAspect.after2);
+ assertTrue(ArgsAspect.after3);
+ assertNotNull(ArgsAspect.before2Args);
+ assertSame(ArgsAspect.before2Args, ArgsAspect.before3Args);
+ assertSame(ArgsAspect.before2Args, ArgsAspect.around3Args);
+ assertSame(ArgsAspect.around3Args, ArgsAspect.after2Args);
+ assertSame(ArgsAspect.before2Args, ArgsAspect.after3Args);
+ assertEquals(1, ArgsAspect.before2Args.length);
+ assertEquals(false, ((Boolean) ArgsAspect.before2Args[0]).booleanValue());
+
+ 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 test7()
+ {
pojo.method1("test6", 6, true, null);
assertTrue(ArgsAspect.before3);
@@ -212,10 +249,11 @@
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around1);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
assertFalse(ArgsAspect.throwing);
}
- public void test7()
+ public void test8()
{
pojo.method2("test7", 0, false, null);
assertTrue(ArgsAspect.before7);
@@ -245,17 +283,23 @@
assertFalse(ArgsAspect.after6);
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
assertFalse(ArgsAspect.throwing);
}
- public void test8()
+ public void test9()
{
+ boolean exceptionThrown = false;
try
{
pojo.method3((short) 0, 100);
}
catch(POJOException e)
- {}
+ {
+ exceptionThrown = true;
+ }
+ assertTrue(exceptionThrown);
+
assertTrue(ArgsAspect.throwing);
assertNotNull(ArgsAspect.throwingArgs);
assertEquals(2, ArgsAspect.throwingArgs.length);
@@ -276,14 +320,46 @@
assertFalse(ArgsAspect.after8);
assertFalse(ArgsAspect.around1);
assertFalse(ArgsAspect.around2);
+ assertFalse(ArgsAspect.around3);
}
- public void test9()
+ public void test10()
{
+ boolean exceptionThrown = false;
try
{
pojo.method4();
} catch (POJOException e)
- {}
+ {
+ exceptionThrown = true;
+ }
+ assertTrue(exceptionThrown);
+
+ assertTrue(ArgsAspect.before8);
+ assertTrue(ArgsAspect.around2);
+ assertTrue(ArgsAspect.throwing);
+
+ assertNotNull(ArgsAspect.before8Args);
+ assertSame(ArgsAspect.before8Args, ArgsAspect.around2Args);
+ assertSame(ArgsAspect.around2Args, ArgsAspect.throwingArgs);
+
+ assertEquals(2, ArgsAspect.before8Args.length);
+ assertEquals((short) -8, ((Short) ArgsAspect.before8Args[0]).shortValue());
+ assertEquals((long) 8, ((Long) ArgsAspect.before8Args[1]).longValue());
+
+ assertFalse(ArgsAspect.before1);
+ assertFalse(ArgsAspect.before2);
+ assertFalse(ArgsAspect.before3);
+ assertFalse(ArgsAspect.before6);
+ assertFalse(ArgsAspect.before7);
+ assertFalse(ArgsAspect.after1);
+ assertFalse(ArgsAspect.after2);
+ assertFalse(ArgsAspect.after3);
+ assertFalse(ArgsAspect.after6);
+ assertFalse(ArgsAspect.after7);
+ // after 8 is not called due to the exceptio thrown
+ assertFalse(ArgsAspect.after8);
+ assertFalse(ArgsAspect.around1);
+ assertFalse(ArgsAspect.around3);
}
}
\ No newline at end of file
More information about the jboss-cvs-commits
mailing list