[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