[jboss-cvs] JBossAS SVN: r57964 - in projects/aop/trunk/aop/src: main/org/jboss/aop/instrument resources/test/field test/org/jboss/test/aop/field
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Nov 1 11:00:09 EST 2006
Author: kabir.khan at jboss.com
Date: 2006-11-01 11:00:00 -0500 (Wed, 01 Nov 2006)
New Revision: 57964
Modified:
projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
projects/aop/trunk/aop/src/resources/test/field/jboss-aop.xml
projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/FieldTestCase.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/POJO.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubPOJO.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubSubPOJO.java
projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/TraceInterceptor.java
Log:
[JBAOP-301] FieldAccess for inherited fields does not get replaced
Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/Instrumentor.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -22,6 +22,7 @@
package org.jboss.aop.instrument;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -518,7 +519,7 @@
{
return callerTransformer.applyCallerPointcuts(clazz, advisor);
}
-
+
/**
* Find all classes that this class references. If any of those classes are advised and have field and/or constructor
* interception, do instrumentation on this class so that those fields and constructors are instrumented
@@ -531,21 +532,18 @@
{
AOPClassPool pool = AOPClassPool.createAOPClassPool(clazz.getClassPool(), AOPClassPoolRepository.getInstance());
-// if (clazz.getName().startsWith("org.jboss.test.aop.scopedextender."))
-// {
-// //Debug
-// System.out.println("========> Converting references for " + clazz.getName() + " in " + clazz.getClassPool());
-// System.out.println("---> Created temp pool " + pool);
-// }
- Iterator it = clazz.getRefClasses().iterator();
- while (it.hasNext())
+ //Class.getRefClasses() only gets classes explicitly referenced in the class. We need to check the super classes and do some extra handling
+ for (ReferenceClassIterator it = new ReferenceClassIterator(clazz.getRefClasses()) ; it.hasNext() ; )
{
- ref = (String) it.next();
+ ref = it.next();
if (!manager.convertReference(ref)
|| manager.isNonAdvisableClassName(ref)
|| ref.startsWith("java.")
|| ref.startsWith("javax.")
- || ref.startsWith("[")) continue;
+ || ref.startsWith("["))
+ {
+ continue;
+ }
// Only need a temporary advisor for resolving metadata
CtClass ctRef = null;
try
@@ -566,22 +564,17 @@
}
}
if (!isTransformable(ctRef)) continue;
-
+
+ it.addSuperClass(ctRef);
+
ClassAdvisor advisor = manager.getTempClassAdvisor(ctRef);
-// if (clazz.getName().startsWith("org.jboss.test.aop.scopedextender."))
-// {
-// //Debug
-// System.out.println("---> Found class " + ctRef.getName() + " in " + ctRef.getClassPool());
-// System.out.println("---> Using manager " + manager + " should convert fields " + !manager.shouldSkipFieldAccess(ref));
-// }
if (!manager.shouldSkipFieldAccess(ref) && !ref.equals(clazz.getName()))
{
List fields = getAdvisableFields(ctRef);
if (fieldAccessTransformer.replaceFieldAccess(fields, ctRef, advisor))
{
-// System.out.println("---> !!!Replaced field access!!!");
manager.addFieldInterceptionMarker(ref);
converted = true;
}
@@ -1037,4 +1030,58 @@
protected abstract CtMethod createMixinInvokeMethod(CtClass clazz, CtClass mixinClass, String initializer, CtMethod method, long hash)
throws CannotCompileException, NotFoundException, Exception;
+ private static class ReferenceClassIterator
+ {
+ int size;
+ int current;
+ ArrayList classes;
+ HashSet handledClasses;
+ String currentEntry;
+
+ public ReferenceClassIterator(Collection refClasses)
+ {
+ size = refClasses.size();
+ classes = new ArrayList(refClasses.size());
+ classes.addAll(refClasses);
+ handledClasses = new HashSet(refClasses.size());
+ }
+
+ boolean hasNext()
+ {
+ while (current < size)
+ {
+ String s = (String) classes.get(current++);
+ if (!handledClasses.contains(s))
+ {
+ handledClasses.add(s);
+ currentEntry = s;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ String next()
+ {
+ return currentEntry;
+ }
+
+ void addSuperClass(CtClass clazz)throws NotFoundException
+ {
+ if (clazz != null)
+ {
+ CtClass superClass = clazz.getSuperclass();
+ if (superClass != null)
+ {
+ String name = superClass.getName();
+ if (!handledClasses.contains(name))
+ {
+ classes.add(name);
+ size++;
+ }
+ }
+ }
+ }
+ }
+
}
\ No newline at end of file
Modified: projects/aop/trunk/aop/src/resources/test/field/jboss-aop.xml
===================================================================
--- projects/aop/trunk/aop/src/resources/test/field/jboss-aop.xml 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/resources/test/field/jboss-aop.xml 2006-11-01 16:00:00 UTC (rev 57964)
@@ -6,4 +6,13 @@
<bind pointcut="field(* org.jboss.test.aop.field.SubSubPOJO->field)">
<interceptor class="org.jboss.test.aop.field.TraceInterceptor"/>
</bind>
+ <bind pointcut="field(* org.jboss.test.aop.field.POJO->pojoInherited)">
+ <interceptor class="org.jboss.test.aop.field.TraceInterceptor"/>
+ </bind>
+ <bind pointcut="field(* org.jboss.test.aop.field.SubPOJO->subpojoInherited)">
+ <interceptor class="org.jboss.test.aop.field.TraceInterceptor"/>
+ </bind>
+ <bind pointcut="field(* org.jboss.test.aop.field.SubSubPOJO->mine)">
+ <interceptor class="org.jboss.test.aop.field.TraceInterceptor"/>
+ </bind>
</aop>
\ No newline at end of file
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/FieldTestCase.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/FieldTestCase.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/FieldTestCase.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -21,6 +21,8 @@
*/
package org.jboss.test.aop.field;
+import java.lang.reflect.Method;
+
import junit.framework.Test;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
@@ -70,4 +72,24 @@
SubSubPOJO spojo = new SubSubPOJO(4);
assertEquals("Field is not set correctly", spojo.getSubSubPOJOField()/2, (spojo.getSubPOJOField()));
}
+
+ public void testFieldInheritance()
+ {
+ System.out.println("*** testFieldInheritance");
+ SubSubPOJO pojo = new SubSubPOJO(4);
+
+ TraceInterceptor.intercepted = false;
+ pojo.mine = 5;
+ assertTrue(TraceInterceptor.intercepted);
+
+
+ TraceInterceptor.intercepted = false;
+ pojo.pojoInherited = 5;
+ assertTrue(TraceInterceptor.intercepted);
+
+ TraceInterceptor.intercepted = false;
+ pojo.subpojoInherited = 5;
+ assertTrue(TraceInterceptor.intercepted);
+ }
+
}
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/POJO.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/POJO.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/POJO.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -29,6 +29,7 @@
public class POJO
{
int field;
+ int pojoInherited;
public POJO() {}
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubPOJO.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubPOJO.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubPOJO.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -29,6 +29,8 @@
public class SubPOJO extends POJO
{
private int field;
+ int subpojoInherited;
+
public SubPOJO() { }
public SubPOJO(int i)
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubSubPOJO.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubSubPOJO.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/SubSubPOJO.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -29,6 +29,7 @@
public class SubSubPOJO extends SubPOJO
{
public int field;
+ public int mine;
public SubSubPOJO(int i)
{
Modified: projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/TraceInterceptor.java
===================================================================
--- projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/TraceInterceptor.java 2006-11-01 15:03:26 UTC (rev 57963)
+++ projects/aop/trunk/aop/src/test/org/jboss/test/aop/field/TraceInterceptor.java 2006-11-01 16:00:00 UTC (rev 57964)
@@ -23,6 +23,7 @@
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.joinpoint.FieldReadInvocation;
+import org.jboss.aop.joinpoint.FieldWriteInvocation;
import org.jboss.aop.joinpoint.Invocation;
/**
@@ -32,7 +33,7 @@
*/
public class TraceInterceptor implements Interceptor
{
-
+ public static boolean intercepted;
public String getName()
{
return "TraceInterceptor";
@@ -40,11 +41,16 @@
public Object invoke(Invocation invocation) throws Throwable
{
+ intercepted = true;
String msg = null;
if (invocation instanceof FieldReadInvocation)
{
msg = "read field name: " + ((FieldReadInvocation)invocation).getField();
}
+ else if (invocation instanceof FieldWriteInvocation)
+ {
+ msg = "write field name: " + ((FieldWriteInvocation)invocation).getField();
+ }
try
{
More information about the jboss-cvs-commits
mailing list