[jboss-cvs] JBossAS SVN: r68507 - in projects/aop/trunk/aop/src/main/org/jboss/aop: instrument and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Dec 21 07:11:10 EST 2007


Author: flavia.rainone at jboss.com
Date: 2007-12-21 07:11:10 -0500 (Fri, 21 Dec 2007)
New Revision: 68507

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java
   projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java
Log:
[JBAOP-487] Joinpoint infos are now unique for constructor, construction and field access joinpoints.

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/Advisor.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -128,9 +128,9 @@
    /** Read/Write lock to be used when lazy creating the collections */
    protected ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 
-   protected HashSet adviceBindings = new HashSet();
+   protected Set<AdviceBinding> adviceBindings = new HashSet<AdviceBinding>();
    protected volatile ArrayList interfaceIntroductions = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
-   protected volatile ArrayList classMetaDataBindings = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
+   protected volatile ArrayList<ClassMetaDataBinding> classMetaDataBindings = UnmodifiableEmptyCollections.EMPTY_ARRAYLIST;
    protected SimpleMetaData defaultMetaData = new SimpleMetaData();
    protected MethodMetaData methodMetaData = new MethodMetaData();
    protected FieldMetaData fieldMetaData = new FieldMetaData();
@@ -866,7 +866,7 @@
    }
 
 
-   protected void createInterceptorChain(InterceptorFactory[] factories, ArrayList newinterceptors, Joinpoint joinpoint)
+   protected void createInterceptorChain(InterceptorFactory[] factories, ArrayList<Interceptor> newinterceptors, Joinpoint joinpoint)
    {
       for (int i = 0; i < factories.length; i++)
       {
@@ -986,14 +986,14 @@
       return name.substring(lastIndex + 1);
    }
 
-   protected ArrayList initializeConstructorChain()
+   protected ConstructorInfo[] initializeConstructorChain()
    {
       if (clazz != null && constructors == null)
       {
           constructors = clazz.getDeclaredConstructors();
       }
 
-      ArrayList newInfos = new ArrayList(constructors.length);
+      ConstructorInfo[] newInfos = new ConstructorInfo[constructors.length];
       for (int i = 0; i < constructors.length; i++)
       {
          final ConstructorInfo info = new ConstructorInfo();
@@ -1003,9 +1003,9 @@
          {
             final String name = ConstructorExecutionTransformer.constructorFactory(getSimpleName(clazz));
             final Class[] types = constructors[i].getParameterTypes();
-            Method method = (Method) AccessController.doPrivileged(new PrivilegedExceptionAction()
+            Method method = AccessController.doPrivileged(new PrivilegedExceptionAction<Method>()
             {
-               public Object run() throws Exception
+               public Method run() throws Exception
                {
                   return clazz.getDeclaredMethod(name, types);
                }
@@ -1020,18 +1020,18 @@
          }
 
          info.setAdvisor(this);
-         newInfos.add(info);
+         newInfos[i] = info;
 
          try
          {
             final String name = ConstructorExecutionTransformer.getConstructorInfoFieldName(getSimpleName(clazz), i);
-            AccessController.doPrivileged(new PrivilegedExceptionAction()
+            AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
             {
                public Object run() throws Exception
                {
                   Field infoField = clazz.getDeclaredField(name);
                   infoField.setAccessible(true);
-                  infoField.set(null, new WeakReference(info));
+                  infoField.set(null, new WeakReference<ConstructorInfo>(info));
                   return null;
                }
             });
@@ -1047,22 +1047,22 @@
       return newInfos;
    }
 
-   protected ArrayList initializeConstructionChain()
+   protected ConstructionInfo[] initializeConstructionChain()
    {
-      ArrayList newInfos = new ArrayList(constructors.length);
+      ConstructionInfo[] newInfos = new ConstructionInfo[constructors.length];
       for (int i = 0; i < constructors.length; i++)
       {
          ConstructionInfo info = new ConstructionInfo();
          info.setConstructor(constructors[i]);
          info.setIndex(i);
          info.setAdvisor(this);
-         newInfos.add(info);
+         newInfos[i] = info;
 
          try
          {
             Field infoField = clazz.getDeclaredField(ConstructionTransformer.getConstructionInfoFieldName(getSimpleName(clazz), i));
             infoField.setAccessible(true);
-            infoField.set(null, new WeakReference(info));
+            infoField.set(null, new WeakReference<ConstructionInfo>(info));
          }
          catch (NoSuchFieldException e)
          {
@@ -1077,37 +1077,37 @@
       return newInfos;
    }
 
-   protected void finalizeConstructorChain(ArrayList newConstructorInfos)
+   protected void finalizeChain(JoinPointInfo[] infos)
    {
-      for (int i = 0; i < newConstructorInfos.size(); i++)
+      for (int i = 0; i < infos.length; i++)
       {
-         ConstructorInfo info = (ConstructorInfo) newConstructorInfos.get(i);
-         ArrayList list = info.getInterceptorChain();
+         JoinPointInfo info = infos[i];
+         ArrayList<Interceptor> list = info.getInterceptorChain();
          Interceptor[] interceptors = null;
          if (list.size() > 0)
          {
-          interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+          interceptors = applyPrecedence(list.toArray(new Interceptor[list.size()]));
          }
          info.setInterceptors(interceptors);
       }
    }
 
-   protected void finalizeConstructionChain(ArrayList newConstructionInfos)
-   {
-      for (int i = 0; i < newConstructionInfos.size(); i++)
-      {
-         ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
-         ArrayList list = info.getInterceptorChain();
-         Interceptor[] interceptors = null;
-         if (list.size() > 0)
-         {
-          interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
-         }
-         info.setInterceptors(interceptors);
-      }
-   }
+//   protected void finalizeConstructionChain(ArrayList newConstructionInfos)
+//   {
+//      for (int i = 0; i < newConstructionInfos.size(); i++)
+//      {
+//         ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
+//         ArrayList list = info.getInterceptorChain();
+//         Interceptor[] interceptors = null;
+//         if (list.size() > 0)
+//         {
+//          interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+//         }
+//         info.setInterceptors(interceptors);
+//      }
+//   }
 
-   protected void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+   protected void resolveConstructorPointcut(AdviceBinding binding)
    {
       for (int i = 0; i < constructors.length; i++)
       {
@@ -1117,19 +1117,18 @@
             if (AspectManager.verbose) System.err.println("[debug] constructor matched binding: " + constructor);
             adviceBindings.add(binding);
             binding.addAdvisor(this);
-            ConstructorInfo info = (ConstructorInfo)newConstructorInfos.get(i);
-            pointcutResolved(info, binding, new ConstructorJoinpoint(constructor));
+            pointcutResolved(constructorInfos[i], binding, new ConstructorJoinpoint(constructor));
          }
       }
    }
 
-   protected void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+   protected void resolveConstructionPointcut(AdviceBinding binding)
    {
-      if (newConstructionInfos.size() > 0)
+      if (constructionInfos.length > 0)
       {
-         for (Iterator it = newConstructionInfos.iterator() ; it.hasNext() ; )
+         for (int i = 0; i < constructionInfos.length ;i++)
          {
-            ConstructionInfo info = (ConstructionInfo)it.next();
+            ConstructionInfo info = constructionInfos[i];
             Constructor constructor = info.getConstructor();
             if (binding.getPointcut().matchesConstruction(this, constructor))
             {
@@ -1158,10 +1157,10 @@
     */
    protected void pointcutResolved(JoinPointInfo info, AdviceBinding binding, Joinpoint joinpoint)
    {
-      ArrayList curr = info.getInterceptorChain();
+      ArrayList<Interceptor> curr = info.getInterceptorChain();
       if (binding.getCFlow() != null)
       {
-         ArrayList cflowChain = new ArrayList();
+         ArrayList<Interceptor> cflowChain = new ArrayList<Interceptor>();
          createInterceptorChain(binding.getInterceptorFactories(), cflowChain, joinpoint);
          Interceptor[] cflowInterceptors = (Interceptor[]) cflowChain.toArray(new Interceptor[cflowChain.size()]);
          curr.add(new CFlowInterceptor(binding.getCFlowString(), binding.getCFlow(), cflowInterceptors));

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassAdvisor.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -114,10 +114,10 @@
    // Used by instrumentor to access separate interceptor chains for read and write access
    /** @deprecated Use fieldReadInfos instead*/
    private Interceptor[][] fieldReadInterceptors;
-   private FieldInfo[] fieldReadInfos;
+   protected FieldInfo[] fieldReadInfos;
    /** @deprecated Use fieldWriteInfos instead */
    private Interceptor[][] fieldWriteInterceptors;
-   private FieldInfo[] fieldWriteInfos;
+   protected FieldInfo[] fieldWriteInfos;
 
 
    protected Field[] advisedFields;
@@ -270,7 +270,7 @@
          final AspectManager theManager = manager;
          //register class loader: necessary when clazz was precompiled through aopc
          manager.registerClassLoader(clazz.getClassLoader());
-         AccessController.doPrivileged(new PrivilegedExceptionAction()
+         AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
          {
             public Object run() throws Exception
             {
@@ -428,11 +428,11 @@
       doesHaveAspects = adviceBindings.size() > 0;
    }
 
-   protected void resolveFieldPointcut(ArrayList newFieldInfos, AdviceBinding binding, boolean write)
+   protected void resolveFieldPointcut(FieldInfo[] newFieldInfos, AdviceBinding binding, boolean write)
    {
-      for (int i = 0; i < advisedFields.length; i++)
+      for (int i = 0; i < newFieldInfos.length; i++)
       {
-         Field field = advisedFields[i];
+         Field field = newFieldInfos[i].getField();
 
          if ((!write && binding.getPointcut().matchesGet(this, field))
          || (write && binding.getPointcut().matchesSet(this, field)))
@@ -440,8 +440,7 @@
             if (AspectManager.verbose) System.err.println("[debug] field matched " + ((write) ? "write" : "read") + " binding: " + field);
             adviceBindings.add(binding);
             binding.addAdvisor(this);
-            FieldInfo info = (FieldInfo)newFieldInfos.get(i);
-            pointcutResolved(info, binding, new FieldJoinpoint(field));
+            pointcutResolved(newFieldInfos[i], binding, new FieldJoinpoint(field));
          }
       }
    }
@@ -480,9 +479,9 @@
       return newInterceptors;
    }
 
-   protected ArrayList initializeFieldReadChain()
+   protected FieldInfo[] initializeFieldReadChain()
    {
-      ArrayList chain = new ArrayList(advisedFields.length);
+      FieldInfo[] chain = new FieldInfo[advisedFields.length];
       for (int i = 0; i < advisedFields.length; i++)
       {
          FieldInfo info = new FieldInfo();
@@ -501,13 +500,13 @@
             //Just means not advised
          }
 
-         chain.add(info);
+         chain[i] = info;
 
          try
          {
             Field infoField = clazz.getDeclaredField(FieldAccessTransformer.getFieldReadInfoFieldName(advisedFields[i].getName()));
             infoField.setAccessible(true);
-            infoField.set(null, new WeakReference(info));
+            infoField.set(null, new WeakReference<FieldInfo>(info));
          }
          catch (NoSuchFieldException e)
          {
@@ -517,14 +516,13 @@
          {
             throw new RuntimeException(e);
          }
-
       }
       return chain;
    }
 
-   protected ArrayList initializeFieldWriteChain()
+   protected FieldInfo[] initializeFieldWriteChain()
    {
-      ArrayList chain = new ArrayList(advisedFields.length);
+      FieldInfo[] chain = new FieldInfo[advisedFields.length];
       for (int i = 0; i < advisedFields.length; i++)
       {
          FieldInfo info = new FieldInfo();
@@ -543,13 +541,13 @@
             //Just means not advised
          }
 
-         chain.add(info);
+         chain[i] = info;
 
          try
          {
             Field infoField = clazz.getDeclaredField(FieldAccessTransformer.getFieldWriteInfoFieldName(advisedFields[i].getName()));
             infoField.setAccessible(true);
-            infoField.set(null, new WeakReference(info));
+            infoField.set(null, new WeakReference<FieldInfo>(info));
          }
          catch (NoSuchFieldException e)
          {
@@ -564,44 +562,83 @@
       return chain;
    }
 
-   protected void finalizeFieldReadChain(ArrayList newFieldInfos)
+//   protected void finalizeChain(JoinPointInfo[] infos)
+//   {
+//      for (int i = 0; i < infos.length; i++)
+//      {
+//         JoinPointInfo info = infos[i];
+//         ArrayList<Interceptor> list = info.getInterceptorChain();
+//         Interceptor[] interceptors = null;
+//         if (list.size() > 0)
+//         {
+//          interceptors = applyPrecedence(list.toArray(new Interceptor[list.size()]));
+//         }
+//         info.setInterceptors(interceptors);
+//      }
+//   }
+   
+   protected void createInterceptorChains() throws Exception
    {
-      for (int i = 0; i < newFieldInfos.size(); i++)
+      if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("Creating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
+      MethodInterceptors newMethodInfos = initializeMethodChain();
+      // TODO flavia remove this
+      boolean buildFieldConsChain = true;
+      if (fieldReadInfos == null)
       {
-         FieldInfo info = (FieldInfo)newFieldInfos.get(i);
-         ArrayList list = info.getInterceptorChain();
-         Interceptor[] interceptors = null;
-         if (list.size() > 0)
+         buildFieldConsChain = false;
+         this.fieldReadInfos = initializeFieldReadChain();
+         this.fieldWriteInfos = initializeFieldWriteChain();
+      }
+      
+      this.constructorInfos = initializeConstructorChain();
+      this.constructionInfos = initializeConstructionChain();
+
+      synchronized (manager.getBindings())
+      {
+         Iterator it = manager.getBindings().values().iterator();
+         while (it.hasNext())
          {
-          interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
+            AdviceBinding binding = (AdviceBinding) it.next();
+            if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName() + " " + binding.getPointcut().getExpr());
+            resolveMethodPointcut(newMethodInfos, binding);
+            resolveFieldPointcut(fieldReadInfos, binding, false);
+            resolveFieldPointcut(fieldWriteInfos, binding, true);
+            resolveConstructorPointcut(binding);
+            resolveConstructionPointcut(binding);
          }
-         info.setInterceptors(interceptors);
       }
+
+      finalizeChains(newMethodInfos);
+      populateInterceptorsFromInfos();
+
+      doesHaveAspects = adviceBindings.size() > 0;
+      // Notify observer about this change
+      if (this.interceptorChainObserver != null)
+      {
+         this.interceptorChainObserver.interceptorChainsUpdated(fieldReadInterceptors, fieldWriteInterceptors,
+               constructorInterceptors, methodInterceptors);
+      }
    }
-
-   protected void finalizeFieldWriteChain(ArrayList newFieldInfos)
+   
+   private void resetChain(JoinPointInfo[] infos)
    {
-      for (int i = 0; i < newFieldInfos.size(); i++)
+      for (int i = 0; i < infos.length; i++)
       {
-         FieldInfo info = (FieldInfo)newFieldInfos.get(i);
-         ArrayList list = info.getInterceptorChain();
-         Interceptor[] interceptors = null;
-         if (list.size() > 0)
-         {
-          interceptors = applyPrecedence((Interceptor[]) list.toArray(new Interceptor[list.size()]));
-         }
-         info.setInterceptors(interceptors);
+         infos[i].getInterceptorChain().clear();
       }
    }
-
-   protected void createInterceptorChains() throws Exception
+   
+   protected void updateInterceptorChains() throws Exception
    {
-      if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("Creating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));
+      if (AspectManager.verbose && logger.isDebugEnabled())
+      {
+         logger.debug("Updating chains for " + clazz + " " + ((clazz != null) ? clazz.getClassLoader() : null ));  
+      }
       MethodInterceptors newMethodInfos = initializeMethodChain();
-      ArrayList newFieldReadInfos = initializeFieldReadChain();
-      ArrayList newFieldWriteInfos = initializeFieldWriteChain();
-      ArrayList newConstructorInfos = initializeConstructorChain();
-      ArrayList newConstructionInfos = initializeConstructionChain();
+      resetChain(fieldReadInfos);
+      resetChain(fieldWriteInfos);
+      resetChain(constructorInfos);
+      resetChain(constructionInfos);
 
       synchronized (manager.getBindings())
       {
@@ -611,14 +648,14 @@
             AdviceBinding binding = (AdviceBinding) it.next();
             if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName() + " " + binding.getPointcut().getExpr());
             resolveMethodPointcut(newMethodInfos, binding);
-            resolveFieldPointcut(newFieldReadInfos, binding, false);
-            resolveFieldPointcut(newFieldWriteInfos, binding, true);
-            resolveConstructorPointcut(newConstructorInfos, binding);
-            resolveConstructionPointcut(newConstructionInfos, binding);
+            resolveFieldPointcut(fieldReadInfos, binding, false);
+            resolveFieldPointcut(fieldWriteInfos, binding, true);
+            resolveConstructorPointcut(binding);
+            resolveConstructionPointcut(binding);
          }
       }
 
-      finalizeChains(newMethodInfos, newFieldReadInfos, newFieldWriteInfos, newConstructorInfos, newConstructionInfos);
+      finalizeChains(newMethodInfos);
       populateInterceptorsFromInfos();
 
       doesHaveAspects = adviceBindings.size() > 0;
@@ -630,17 +667,13 @@
       }
    }
 
-   protected void finalizeChains(MethodInterceptors newMethodInfos, ArrayList newFieldReadInfos, ArrayList newFieldWriteInfos, ArrayList newConstructorInfos, ArrayList newConstructionInfos)
+   protected void finalizeChains(MethodInterceptors newMethodInfos)
    {
       finalizeMethodChain(newMethodInfos);
-      finalizeFieldReadChain(newFieldReadInfos);
-      finalizeFieldWriteChain(newFieldWriteInfos);
-      finalizeConstructorChain(newConstructorInfos);
-      finalizeConstructionChain(newConstructionInfos);
-      fieldReadInfos = (FieldInfo[]) newFieldReadInfos.toArray(new FieldInfo[newFieldReadInfos.size()]);
-      fieldWriteInfos = (FieldInfo[]) newFieldWriteInfos.toArray(new FieldInfo[newFieldWriteInfos.size()]);
-      constructorInfos = (ConstructorInfo[]) newConstructorInfos.toArray(new ConstructorInfo[newConstructorInfos.size()]);
-      constructionInfos = (ConstructionInfo[]) newConstructionInfos.toArray(new ConstructionInfo[newConstructionInfos.size()]);
+      finalizeChain(fieldReadInfos);
+      finalizeChain(fieldWriteInfos);
+      finalizeChain(constructorInfos);
+      finalizeChain(constructionInfos);
    }
    
    private MethodByConInfo initializeConstructorCallerInterceptorsMap(Class callingClass, int callingIndex, String calledClass, long calledMethodHash, Method calledMethod) throws Exception
@@ -861,11 +894,22 @@
       try
       {
          adviceBindings.clear();
-         createInterceptorChains();
+         if (this.constructionInfos == null)
+         {
+            createInterceptorChains();
+         }
+         else
+         {
+            updateInterceptorChains();
+         }
          rebuildCallerInterceptors();
       }
       catch (Exception ex)
       {
+         if (ex instanceof RuntimeException)
+         {
+            throw (RuntimeException) ex;
+         }
          throw new RuntimeException(ex);
       }
    }
@@ -1959,7 +2003,7 @@
          {
             try
             {
-               AccessController.doPrivileged(new PrivilegedExceptionAction()
+               AccessController.doPrivileged(new PrivilegedExceptionAction<Object>()
                {
                   public Object run()
                   {
@@ -1973,7 +2017,7 @@
                Exception ex = e.getException();
                if (ex instanceof RuntimeException)
                {
-                  throw (RuntimeException)ex;
+                  throw (RuntimeException) ex;
                }
                throw new RuntimeException(ex);
             }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/ClassContainer.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -21,12 +21,10 @@
   */
 package org.jboss.aop;
 
-import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -83,7 +81,7 @@
 
    protected Field[] advisedFields;
 
-   private void populateFieldTable(ArrayList fields, final Class superclass)
+   private void populateFieldTable(ArrayList<Field> fields, final Class superclass)
    {
       if (superclass == null) return;
       if (superclass.equals(Object.class)) return;
@@ -92,10 +90,10 @@
 
       // if (!isAdvised(superclass)) return;
 
-      ArrayList temp = new ArrayList();
-      Field[] declaredFields = (Field[]) AccessController.doPrivileged(new PrivilegedAction()
+      ArrayList<Field> temp = new ArrayList<Field>();
+      Field[] declaredFields = AccessController.doPrivileged(new PrivilegedAction<Field[]>()
       {
-         public Object run()
+         public Field[] run()
          {
             return superclass.getDeclaredFields();
          }
@@ -116,12 +114,10 @@
     */
    protected void createFieldTable()
    {
-      ArrayList fields = new ArrayList();
-
+      ArrayList<Field> fields = new ArrayList<Field>();
       populateFieldTable(fields, clazz);
+      advisedFields = fields.toArray(new Field[fields.size()]);
 
-      advisedFields = (Field[]) fields.toArray(new Field[fields.size()]);
-
    }
 
    protected void rebuildInterceptors()
@@ -246,7 +242,7 @@
    protected void createInterceptorChains()
    {
       MethodInterceptors newMethodInfos = initializeMethodChain();
-      ArrayList newConstructorInfos = initializeConstructorChain();
+      constructorInfos = initializeConstructorChain();
 
       LinkedHashMap bindings = manager.getBindings();
       synchronized (bindings)
@@ -259,16 +255,12 @@
                AdviceBinding binding = (AdviceBinding) it.next();
                if (AspectManager.verbose && logger.isDebugEnabled()) logger.debug("iterate binding " + binding.getName());
                resolveMethodPointcut(newMethodInfos, binding);
-               resolveConstructorPointcut(newConstructorInfos, binding);
+               resolveConstructorPointcut(binding);
             }
          }
       }
-      finalizeConstructorChain(newConstructorInfos);
+      finalizeChain(constructorInfos);
       finalizeMethodChain(newMethodInfos);
-      constructorInfos = new ConstructorInfo[newConstructorInfos.size()];
-      if (constructorInfos.length > 0)
-         constructorInfos = (ConstructorInfo[]) newConstructorInfos.toArray(constructorInfos);
-
       populateInterceptorsFromInfos();
 
       doesHaveAspects = adviceBindings.size() > 0;

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -26,6 +26,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -35,9 +36,9 @@
 import org.jboss.aop.advice.AdviceBinding;
 import org.jboss.aop.advice.AspectDefinition;
 import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
+import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.advice.InterceptorFactory;
 import org.jboss.aop.advice.PrecedenceSorter;
-import org.jboss.aop.advice.annotation.JoinPoint;
 import org.jboss.aop.instrument.ConByConJoinPointGenerator;
 import org.jboss.aop.instrument.ConByMethodJoinPointGenerator;
 import org.jboss.aop.instrument.ConstructionJoinPointGenerator;
@@ -69,10 +70,11 @@
    public static final String GET_PARENT_ADVISOR = "getParentAdvisor";
 
    MethodInterceptors methodInfos = new MethodInterceptors(this);
-   ArrayList constructorInfos = new ArrayList();
-   ArrayList constructionInfos = new ArrayList();
-   ArrayList fieldReadInfos = new ArrayList();
-   ArrayList fieldWriteInfos = new ArrayList();
+// TODO Flavia   
+//   ArrayList<ConstructorInfo> constructorInfos = new ArrayList();
+//   ArrayList<ConstructionInfo> constructionInfos = new ArrayList();
+//   ArrayList<FieldInfo> fieldReadInfos = new ArrayList();
+//   ArrayList<FieldInfo> fieldWriteInfos = new ArrayList();
    /** Super class methods that have been overrridden - these need special handling in this weaving mode */
    ArrayList overriddenMethods = new ArrayList(); 
 
@@ -84,9 +86,9 @@
    //Needs its own map to avoid crashing with the constructor generators
    private volatile ConcurrentHashMap constructionJoinPointGenerators = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
    
-   ConcurrentHashMap oldInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
-   ConcurrentHashMap oldFieldReadInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
-   ConcurrentHashMap oldConstructionInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+   ConcurrentHashMap<Joinpoint, Interceptor[]> oldInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+   ConcurrentHashMap<Joinpoint, Interceptor[]> oldFieldReadInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+   ConcurrentHashMap<Joinpoint, Interceptor[]> oldConstructionInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
 
    boolean initialisedSuperClasses; 
 
@@ -169,14 +171,15 @@
    {
       FieldInfo copy = (FieldInfo)info.copy();
       copy.setAdvisor(this);
-      if (copy.isRead())
-      {
-         addFieldReadInfo(copy);
-      }
-      else
-      {
-         addFieldWriteInfo(copy);
-      }
+// TODO Flavia
+//      if (copy.isRead())
+//      {
+//         addFieldReadInfo(copy);
+//      }
+//      else
+//      {
+//         addFieldWriteInfo(copy);
+//      }
       return copy;
    }
 
@@ -287,11 +290,10 @@
          super.resolveMethodPointcut(newMethodInterceptors, binding);
          handleOverriddenMethods(binding);
       }
-
    }
 
    @Override
-   protected void resolveFieldPointcut(ArrayList newFieldInfos, AdviceBinding binding, boolean write)
+   protected void resolveFieldPointcut(FieldInfo[] newFieldInfos, AdviceBinding binding, boolean write)
    {
       GeneratedClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
       if (classAdvisor == null)
@@ -302,15 +304,15 @@
    }
 
    @Override
-   protected void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+   protected void resolveConstructorPointcut( AdviceBinding binding)
    {
-      advisorStrategy.resolveConstructorPointcut(newConstructorInfos, binding);
+      advisorStrategy.resolveConstructorPointcut(binding);
    }
 
    @Override
-   protected void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+   protected void resolveConstructionPointcut(AdviceBinding binding)
    {
-      advisorStrategy.resolveConstructionPointcut(newConstructionInfos, binding);
+      advisorStrategy.resolveConstructionPointcut(binding);
    }
    
    /**
@@ -369,14 +371,14 @@
    /**
     * Generated class advisor sub class will override
     */
-   protected void initialiseConstructors()
+   protected void initialiseConstructors(Collection<ConstructorInfo> constructorInfos)
    {
    }
 
    /**
     * Called by initialiseConstructors() in generated advisor sub classes
     */
-   protected void addConstructorInfo(ConstructorInfo ci)
+   protected void addConstructorInfo(ConstructorInfo ci, Collection<ConstructorInfo> constructorInfos)
    {
       constructorInfos.add(ci);
       //If we do dynamic invokes the constructor will need to be accessible via reflection
@@ -386,84 +388,111 @@
    @Override
    protected void createInterceptorChains() throws Exception
    {
+      System.out.println("Creating interceptor chains on advisor " + this.getClass().getName());
       advisorStrategy.createInterceptorChains();
    }
    
-   @Override
-   protected ArrayList initializeConstructorChain()
-   {
-      if (super.initialized)
-      {
-         for (Iterator it = constructorInfos.iterator() ; it.hasNext() ; )
-         {
-            ((ConstructorInfo)it.next()).clear();
-         }
-      }
-      return constructorInfos;
-   }
+// TODO Flavia
+//   @Override
+//   protected ArrayList initializeConstructorChain()
+//   {
+//      if (super.initialized)
+//      {
+//         for (Iterator it = constructorInfos.iterator() ; it.hasNext() ; )
+//         {
+//            ((ConstructorInfo)it.next()).clear();
+//         }
+//      }
+//      return constructorInfos;
+//   }
 
    /**
     * Generated class advisor sub class will override
     */
-   protected void initialiseConstructions()
+   protected void initialiseConstructions(Collection<ConstructionInfo> constructorInfos)
    {
    }
 
    /**
     * Called by initialiseConstructions() in generated advisor sub classes
     */
-   protected void addConstructionInfo(ConstructionInfo ci)
+   protected void addConstructionInfo(ConstructionInfo ci, Collection<ConstructionInfo> constructionInfos)
    {
       constructionInfos.add(ci);
    }
 
-   @Override
-   protected ArrayList initializeConstructionChain()
-   {
-      if (super.initialized)
-      {
-         for (Iterator it = constructionInfos.iterator() ; it.hasNext() ; )
-         {
-            ((ConstructionInfo)it.next()).clear();
-         }
-      }
-      return constructionInfos;
-   }
+// TODO Flavia
+//   @Override
+//   protected ArrayList initializeConstructionChain()
+//   {
+//      if (super.initialized)
+//      {
+//         for (Iterator it = constructionInfos.iterator() ; it.hasNext() ; )
+//         {
+//            ((ConstructionInfo)it.next()).clear();
+//         }
+//      }
+//      return constructionInfos;
+//   }
 
    /**
     * Generated class advisor sub class will override
     */
-   protected void initialiseFieldReads()
+   protected void initialiseFieldReads(Collection<FieldInfo> fieldReadInfos)
    {
    }
 
    /**
     * Called by initialiseFieldReads() in generated advisor sub classes
     */
-   protected void addFieldReadInfo(FieldInfo fi)
+   protected void addFieldReadInfo(FieldInfo fi, Collection<FieldInfo> fieldReadInfos)
    {
       fieldReadInfos.add(fi);
       //If we do dynamic invokes the field will need to be accessible via reflection
       advisorStrategy.makeAccessibleField(fi);
    }
 
+   // TODO Flavia remove this once the process is complete
    @Override
-   protected ArrayList initializeFieldReadChain()
+   protected ConstructorInfo[] initializeConstructorChain()
    {
+      // TODO remove this
+      if (this.constructorInfos != null)
+      {
+         return this.constructorInfos;
+      }
+      return super.initializeConstructorChain();
+   }
+   
+   // TODO remove this once the process is complete
+   @Override
+   protected ConstructionInfo[] initializeConstructionChain()
+   {
+      // TODO remove this
+      if (this.constructionInfos != null)
+      {
+         return this.constructionInfos;
+      }
+      return super.initializeConstructionChain();
+   }
+   
+   @Override
+   protected FieldInfo[] initializeFieldReadChain()
+   {
       return mergeFieldInfos(fieldReadInfos, true);
    }
 
    /**
     * Generated class advisor sub class will override
     */
-   protected void initialiseFieldWrites()
+   protected void initialiseFieldWrites(Collection<FieldInfo> fieldWriteInfos)
    {
    }
 
    /**
     * Called by initialiseFieldWrites() in generated advisor sub classes
     */
-   protected void addFieldWriteInfo(FieldInfo fi)
+   protected void addFieldWriteInfo(FieldInfo fi, Collection<FieldInfo> fieldWriteInfos)
    {
       fieldWriteInfos.add(fi);
       //If we do dynamic invokes the field will need to be accessible via reflection
@@ -471,7 +500,7 @@
    }
 
    @Override
-   protected ArrayList initializeFieldWriteChain()
+   protected FieldInfo[] initializeFieldWriteChain()
    {
       return mergeFieldInfos(fieldWriteInfos, false);
    }
@@ -479,42 +508,31 @@
    /* Creates a full list of field infos for all fields, using the ones added by
     * generated advisor for advised fields.
     */
-   private ArrayList mergeFieldInfos(ArrayList advisedInfos, boolean read)
+   private FieldInfo[] mergeFieldInfos(FieldInfo[] advisedInfos, boolean read)
    {
-      ArrayList newInfos = new ArrayList(advisedFields.length);
+      FieldInfo[] newInfos = new FieldInfo[advisedFields.length];
 
-      FieldInfo nextFieldInfo = null;
-      Iterator it = advisedInfos.iterator();
-      if (it.hasNext())
-      {
-         nextFieldInfo = (FieldInfo)it.next();
-      }
+      int nextIndex = 0;
+      int advisedInfosLength = advisedInfos == null? 0: advisedInfos.length;
 
       for (int i = 0 ; i < advisedFields.length ; i++)
       {
-         if (nextFieldInfo != null && nextFieldInfo.getIndex() == i)
+         if (nextIndex < advisedInfosLength && advisedInfos[nextIndex].getIndex() == i)
          {
             if (super.initialized)
             {
-               nextFieldInfo.clear();
+               advisedInfos[nextIndex].clear();
             }
 
-            newInfos.add(nextFieldInfo);
-            if (it.hasNext())
-            {
-               nextFieldInfo = (FieldInfo)it.next();
-            }
-            else
-            {
-               nextFieldInfo = null;
-            }
+            newInfos[i] = advisedInfos[nextIndex];
+            nextIndex++;
          }
          else
          {
             FieldInfo info = new FieldInfo(this, read);
             info.setAdvisedField(advisedFields[i]);
             info.setIndex(i);
-            newInfos.add(info);
+            newInfos[i] = info;
          }
       }
 
@@ -522,7 +540,7 @@
    }
 
    @Override
-   protected void finalizeChains(MethodInterceptors newMethodInfos, ArrayList newFieldReadInfos, ArrayList newFieldWriteInfos, ArrayList newConstructorInfos, ArrayList newConstructionInfos)
+   protected void finalizeChains(MethodInterceptors newMethodInfos)
    {
       ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
       if (classAdvisor != null)
@@ -540,7 +558,12 @@
             }
          }
       }
-      super.finalizeChains(newMethodInfos, newFieldReadInfos, newFieldWriteInfos, newConstructorInfos, newConstructionInfos);
+      
+      finalizeMethodChain(newMethodInfos);
+      finalizeFieldReadChain();
+      finalizeFieldWriteChain();
+      advisorStrategy.finalizeConstructorChain(constructorInfos);
+      advisorStrategy.finalizeConstructionChain(constructionInfos);
    }
 
    @Override
@@ -608,82 +631,65 @@
          }
       }      
    }
-
-   @Override
-   protected void finalizeFieldReadChain(ArrayList newFieldInfos)
+   
+   private void finalizeFieldReadChain()
    {
       ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
       if (classAdvisor != null)
       {
          //We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
-         easyFinalizeFieldChainForInstance(oldFieldReadInfos, classAdvisor.getFieldReadInfos(), newFieldInfos, OldInfoMaps.FIELD_READ_INFOS);
+         easyFinalizeFieldChainForInstance(oldFieldReadInfos, classAdvisor.getFieldReadInfos(), fieldReadInfos, OldInfoMaps.FIELD_READ_INFOS);
       }
       else
       {
          //We are either the class advisor or an instanceadvisor with own data so we need to do all the work
-         fullWorkFinalizeFieldChain(oldFieldReadInfos, newFieldInfos, OldInfoMaps.FIELD_READ_INFOS);
+         fullWorkFinalizeFieldChain(oldFieldReadInfos, fieldReadInfos, OldInfoMaps.FIELD_READ_INFOS);
       }
    }
 
-   @Override
-   protected void finalizeFieldWriteChain(ArrayList newFieldInfos)
+   protected void finalizeFieldWriteChain()
    {
       ClassAdvisor classAdvisor = getClassAdvisorIfInstanceAdvisorWithNoOwnDataWithEffectOnAdvices();
       if (classAdvisor != null)
       {
          //We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
-         easyFinalizeFieldChainForInstance(oldInfos, classAdvisor.getFieldWriteInfos(), newFieldInfos, OldInfoMaps.INFOS);
+         easyFinalizeFieldChainForInstance(oldInfos, classAdvisor.getFieldWriteInfos(), fieldWriteInfos, OldInfoMaps.INFOS);
       }
       else
       {
          //We are either the class advisor or an instanceadvisor with own data so we need to do all the work
-         fullWorkFinalizeFieldChain(oldInfos, newFieldInfos, OldInfoMaps.INFOS);
+         fullWorkFinalizeFieldChain(oldInfos, fieldWriteInfos, OldInfoMaps.INFOS);
       }
    }
 
-   private void easyFinalizeFieldChainForInstance(Map oldFieldInfos, FieldInfo[] classFieldInfos, ArrayList newFieldInfos, OldInfoMaps oldInfoMapInstance)
+   private void easyFinalizeFieldChainForInstance(Map<Joinpoint, Interceptor[]> oldFieldInfos, FieldInfo[] classFieldInfos, FieldInfo[] newFieldInfos, OldInfoMaps oldInfoMapInstance)
    {
       //We are an instance advisor with no own data influencing the chains, copy these from the parent advisor
-      if (newFieldInfos.size() > 0)
+      for (int i = 0; i < newFieldInfos.length; i++)
       {
-         for (int i = 0; i < newFieldInfos.size(); i++)
+         FieldInfo myInfo = (FieldInfo) newFieldInfos[i];
+         myInfo.cloneChains(classFieldInfos[i]);
+
+         if (updateOldInfo(oldFieldInfos, myInfo, oldInfoMapInstance))
          {
-            FieldInfo myInfo = (FieldInfo)newFieldInfos.get(i);
-            myInfo.cloneChains(classFieldInfos[i]);
-            
-            if (updateOldInfo(oldFieldInfos, myInfo, oldInfoMapInstance))
-            {
-               FieldJoinPointGenerator generator = getJoinPointGenerator(myInfo);
-               generator.rebindJoinpoint(myInfo);
-            }
+            FieldJoinPointGenerator generator = getJoinPointGenerator(myInfo);
+            generator.rebindJoinpoint(myInfo);
          }
       }
    }
    
-   private void fullWorkFinalizeFieldChain(Map oldFieldInfos, ArrayList newFieldInfos, OldInfoMaps oldInfoMapInstance)
+   private void fullWorkFinalizeFieldChain(Map<Joinpoint, Interceptor[]> oldFieldInfos, FieldInfo[] newFieldInfos, OldInfoMaps oldInfoMapInstance)
    {
       //We are either the class advisor or an instanceadvisor with own data so we need to do all the work
-      for (int i = 0; i < newFieldInfos.size(); i++)
+      for (int i = 0; i < newFieldInfos.length; i++)
       {
-         FieldInfo info = (FieldInfo)newFieldInfos.get(i);
+         FieldInfo info = (FieldInfo)newFieldInfos[i];
          FieldJoinPointGenerator generator = getJoinPointGenerator(info);
          finalizeChainAndRebindJoinPoint(oldFieldInfos, info, generator, oldInfoMapInstance);
       }
    }
-   
-   @Override
-   protected void finalizeConstructorChain(ArrayList newConstructorInfos)
-   {
-      advisorStrategy.finalizeConstructorChain(newConstructorInfos);
-   }
 
    @Override
-   protected void finalizeConstructionChain(ArrayList newConstructionInfos)
-   {
-      advisorStrategy.finalizeConstructionChain(newConstructionInfos);
-   }
-
-   @Override
    protected void finalizeMethodCalledByMethodInterceptorChain(MethodByMethodInfo info)
    {
       MethodByMethodJoinPointGenerator generator = getJoinPointGenerator(info);
@@ -829,9 +835,9 @@
       }
    }
 
-   private void finalizeChainAndRebindJoinPoint(Map oldInfos, JoinPointInfo info, JoinPointGenerator generator, OldInfoMaps oldInfoMapInstance)
+   private void finalizeChainAndRebindJoinPoint(Map<Joinpoint, Interceptor[]> oldInfos, JoinPointInfo info, JoinPointGenerator generator, OldInfoMaps oldInfoMapInstance)
    {
-      ArrayList list = info.getInterceptorChain();
+      ArrayList<Interceptor> list = info.getInterceptorChain();
       GeneratedAdvisorInterceptor[] factories = null;
       if (list.size() > 0)
       {
@@ -978,18 +984,18 @@
    /**
     * Caches the old info and checks if the chains have been updated
     */
-   private boolean updateOldInfo(Map oldInfos, JoinPointInfo newInfo, OldInfoMaps oldInfoMapInstance)
+   private boolean updateOldInfo(Map<Joinpoint, Interceptor[]> oldInfos, JoinPointInfo newInfo, OldInfoMaps oldInfoMapInstance)
    {
-      JoinPointInfo oldInfo = (JoinPointInfo)oldInfos.get(newInfo.getJoinpoint());
-      if (oldInfo != null)
+      Interceptor[] oldChain = oldInfos.get(newInfo.getJoinpoint());
+      if (oldChain != null)
       {
          //We are not changing any of the bindings
-         if (oldInfo.equalChains(newInfo))
+         if (newInfo.equalChains(oldChain))
          {
             return false;
          }
       }
-      oldInfo = newInfo.copy();
+      Interceptor[] currentOldChain = newInfo.getInterceptors();
       
       if (oldInfoMapInstance == OldInfoMaps.INFOS) 
       {
@@ -1007,8 +1013,14 @@
       {
          throw new RuntimeException("Unrecognised map");
       }
-      
-      oldInfos.put(newInfo.getJoinpoint(), oldInfo);
+      if (currentOldChain != null)
+      {
+         oldInfos.put(newInfo.getJoinpoint(), currentOldChain);
+      }
+      else if (oldChain != null)
+      {
+         oldInfos.remove(newInfo.getJoinpoint());
+      }
       return true;
    }
 
@@ -1135,7 +1147,7 @@
       }
    }
    
-   protected ConcurrentHashMap initOldInfosMap()
+   protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldInfosMap()
    {
       if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
       {
@@ -1144,7 +1156,7 @@
          {
             if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
             {
-               oldInfos = new ConcurrentHashMap();
+               oldInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
             }
          }
          finally
@@ -1155,7 +1167,7 @@
       return oldInfos;
    }
    
-   protected ConcurrentHashMap initOldFieldReadInfosMap()
+   protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldFieldReadInfosMap()
    {
       if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
       {
@@ -1164,7 +1176,7 @@
          {
             if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
             {
-               oldFieldReadInfos = new ConcurrentHashMap();
+               oldFieldReadInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
             }
          }
          finally
@@ -1175,7 +1187,7 @@
       return oldFieldReadInfos;
    }
    
-   protected ConcurrentHashMap initOldConstructionInfosMap()
+   protected ConcurrentHashMap<Joinpoint, Interceptor[]> initOldConstructionInfosMap()
    {
       if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
       {
@@ -1184,7 +1196,7 @@
          {
             if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
             {
-               oldConstructionInfos = new ConcurrentHashMap();
+               oldConstructionInfos = new ConcurrentHashMap<Joinpoint, Interceptor[]>();
             }
          }
          finally
@@ -1220,10 +1232,10 @@
       Set getPerInstanceAspectDefinitions();
       Map getPerInstanceJoinpointAspectDefinitions();
       void rebuildInterceptors();
-      void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding);
-      void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding);
-      void finalizeConstructorChain(ArrayList newConstructorInfos);
-      void finalizeConstructionChain(ArrayList newConstructionInfos);
+      void resolveConstructorPointcut(AdviceBinding binding);
+      void resolveConstructionPointcut(AdviceBinding binding);
+      void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos);
+      void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos);
       void makeAccessibleField(FieldInfo fi);
       void makeAccessibleMethod(MethodInfo mi);
    }
@@ -1235,10 +1247,22 @@
       public void initialise(Class clazz, AspectManager manager)
       {
          initialiseMethods();
-         initialiseConstructors();
-         initialiseConstructions();
-         initialiseFieldReads();
-         initialiseFieldWrites();
+         // initialise constructor info array
+         Collection<ConstructorInfo> constructorInfoCol = new ArrayList<ConstructorInfo>();
+         initialiseConstructors(constructorInfoCol);
+         constructorInfos = constructorInfoCol.toArray(new ConstructorInfo[constructorInfoCol.size()]);
+         // initialise construction info array
+         Collection<ConstructionInfo> constructionInfoCol = new ArrayList<ConstructionInfo>();
+         initialiseConstructions(constructionInfoCol);
+         constructionInfos = constructionInfoCol.toArray(new ConstructionInfo[constructionInfoCol.size()]);
+         // initalise field read info array
+         Collection<FieldInfo> fieldReadInfoCol = new ArrayList<FieldInfo>();
+         initialiseFieldReads(fieldReadInfoCol);
+         fieldReadInfos = fieldReadInfoCol.toArray(new FieldInfo[fieldReadInfoCol.size()]);
+         // initalise field write info array
+         Collection<FieldInfo> fieldWriteInfoCol = new ArrayList<FieldInfo>();
+         initialiseFieldWrites(fieldWriteInfoCol);
+         fieldWriteInfos = fieldWriteInfoCol.toArray(new FieldInfo[fieldWriteInfoCol.size()]);
          
          GeneratedClassAdvisor.super.setManager(manager);
 
@@ -1495,31 +1519,34 @@
          GeneratedClassAdvisor.super.rebuildInterceptors();
       }
 
-      public void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+      public void resolveConstructorPointcut(AdviceBinding binding)
       {
-         GeneratedClassAdvisor.super.resolveConstructorPointcut(newConstructorInfos, binding);
+         GeneratedClassAdvisor.super.resolveConstructorPointcut(binding);
       }
 
-      public void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+      public void resolveConstructionPointcut(AdviceBinding binding)
       {
-         GeneratedClassAdvisor.super.resolveConstructionPointcut(newConstructionInfos, binding);
+         GeneratedClassAdvisor.super.resolveConstructionPointcut(binding);
       }
 
-      public void finalizeConstructorChain(ArrayList newConstructorInfos)
+      public void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos)
       {
-         for (int i = 0; i < newConstructorInfos.size(); i++)
+         for (int i = 0; i < newConstructorInfos.length; i++)
          {
-            ConstructorInfo info = (ConstructorInfo) newConstructorInfos.get(i);
+            ConstructorInfo info = newConstructorInfos[i];
             ConstructorJoinPointGenerator generator = getJoinPointGenerator(info);
+            Class clazz = info.getClazz();
+            if (clazz != null)
+            System.out.println("Finalizing constructor chain for constructor of class " + clazz.getName());
             finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
          }
       }
 
-      public void finalizeConstructionChain(ArrayList newConstructionInfos)
+      public void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos)
       {
-         for (int i = 0; i < newConstructionInfos.size(); i++)
+         for (int i = 0; i < newConstructionInfos.length; i++)
          {
-            ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
+            ConstructionInfo info = newConstructionInfos[i];
             ConstructionJoinPointGenerator generator = getJoinPointGenerator(info);
             finalizeChainAndRebindJoinPoint(oldConstructionInfos, info, generator, OldInfoMaps.CONSTRUCTION_INFOS);
          }
@@ -1701,26 +1728,45 @@
          }
          else
          {
-            GeneratedClassAdvisor.super.rebuildInterceptors();
+            // check if it is initilized
+            if (GeneratedClassAdvisor.this.fieldReadInfos == null)
+            {
+               try
+               {
+                  GeneratedClassAdvisor.this.createInterceptorChains();
+               }
+               catch (Exception ex)
+               {
+                  if (ex instanceof RuntimeException)
+                  {
+                     throw (RuntimeException) ex;
+                  }
+                  throw new RuntimeException(ex);
+               }
+            }
+            else
+            {
+               GeneratedClassAdvisor.super.rebuildInterceptors();
+            }
          }
       }
 
-      public void resolveConstructorPointcut(ArrayList newConstructorInfos, AdviceBinding binding)
+      public void resolveConstructorPointcut(AdviceBinding binding)
       {
          //Since the instance already exists it makes no sense to have bindings for constructors
       }
 
-      public void resolveConstructionPointcut(ArrayList newConstructionInfos, AdviceBinding binding)
+      public void resolveConstructionPointcut(AdviceBinding binding)
       {
          //Since the instance already exists it makes no sense to have bindings for constructors         
       }
 
-      public void finalizeConstructorChain(ArrayList newConstructorInfos)
+      public void finalizeConstructorChain(ConstructorInfo[] newConstructorInfos)
       {
          //Since the instance already exists it makes no sense to have bindings for constructors
       }
 
-      public void finalizeConstructionChain(ArrayList newConstructionInfos)
+      public void finalizeConstructionChain(ConstructionInfo[] newConstructionInfos)
       {
          //Since the instance already exists it makes no sense to have bindings for constructors
       }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/JoinPointInfo.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -23,6 +23,7 @@
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Collection;
 
 import org.jboss.aop.advice.GeneratedAdvisorInterceptor;
 import org.jboss.aop.advice.Interceptor;
@@ -33,25 +34,25 @@
 {
    private Interceptor[] interceptors;
 
-   private ArrayList interceptorChain = new ArrayList();
+   private ArrayList<Interceptor> interceptorChain = new ArrayList<Interceptor>();
    
-   private WeakReference advisor;
+   private WeakReference<Advisor> advisor;
    
    protected volatile Joinpoint joinpoint;
    
-   protected WeakReference clazz;
+   protected WeakReference<Class> clazz;
    
    private String adviceString;
 
    protected JoinPointInfo()
    {
-      this.clazz = new WeakReference(null);
+      this.clazz = new WeakReference<Class>(null);
    }
    
    protected JoinPointInfo(Advisor advisor, Class clazz)
    {
       setAdvisor(advisor);
-      this.clazz = new WeakReference(clazz); 
+      this.clazz = new WeakReference<Class>(clazz); 
    }
    
    /*
@@ -86,12 +87,12 @@
 
    public Class getClazz()
    {
-      return (Class)clazz.get(); 
+      return clazz.get(); 
    }
    
    public void setAdvisor(Advisor advisor) 
    {
-      this.advisor = new WeakReference(advisor);
+      this.advisor = new WeakReference<Advisor>(advisor);
    }
 
    public boolean hasAdvices()
@@ -99,15 +100,15 @@
       return (interceptors != null && interceptors.length > 0);
    }
    
-   public boolean equalChains(JoinPointInfo other)
+   public boolean equalChains(Interceptor[] otherInterceptors)
    {
-      if (this.interceptors == null && other.interceptors == null) return true;
-      if (!(this.interceptors != null && other.interceptors != null))return false;
-      if (this.interceptors.length != other.interceptors.length) return false;
+      if (this.interceptors == null && otherInterceptors == null) return true;
+      if (!(this.interceptors != null && otherInterceptors != null))return false;
+      if (this.interceptors.length != otherInterceptors.length) return false;
       
       for (int i = 0 ; i < this.interceptors.length ; i++)
       {
-         if(!this.interceptors[i].equals(other.interceptors[i])) return false;
+         if(!this.interceptors[i].equals(otherInterceptors[i])) return false;
       }
 
       return true;
@@ -122,7 +123,7 @@
       return joinpoint;
    }
    
-   public ArrayList getInterceptorChain() {
+   public ArrayList<Interceptor> getInterceptorChain() {
       return interceptorChain;
    }
 

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/instrument/GeneratedAdvisorInstrumentor.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -232,46 +232,54 @@
             genadvisor);
       genadvisor.addMethod(initialiseMethods);
 
+      CtMethod superInitialiseConstructors =
+            genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_CONSTRUCTORS);
       CtMethod initialiseConstructors = CtNewMethod.make(
             Modifier.PROTECTED,
             CtClass.voidType,
             INITIALISE_CONSTRUCTORS,
-            EMPTY_SIG,
+            superInitialiseConstructors.getParameterTypes(),
             EMPTY_EXCEPTIONS,
             null,
             genadvisor);
       genadvisor.addMethod(initialiseConstructors);
 
+      CtMethod superInitialiseConstructions =
+         genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_CONSTRUCTIONS);
       CtMethod initialiseConstructions = CtNewMethod.make(
             Modifier.PROTECTED,
             CtClass.voidType,
             INITIALISE_CONSTRUCTIONS,
-            EMPTY_SIG,
+            superInitialiseConstructions.getParameterTypes(),
             EMPTY_EXCEPTIONS,
             (isBaseClass(clazz)) ?
-                  null : "{super." + INITIALISE_CONSTRUCTIONS + "();}",
+                  null : "{super." + INITIALISE_CONSTRUCTIONS + "($1);}",
             genadvisor);
       genadvisor.addMethod(initialiseConstructions);
 
+      CtMethod superInitialiseFieldReads =
+         genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_FIELD_READS);
       CtMethod initialiseFieldReads = CtNewMethod.make(
             Modifier.PROTECTED,
             CtClass.voidType,
             INITIALISE_FIELD_READS,
-            EMPTY_SIG,
+            superInitialiseFieldReads.getParameterTypes(),
             EMPTY_EXCEPTIONS,
             (isBaseClass(clazz)) ?
-                  null : "{super." + INITIALISE_FIELD_READS + "();}",
+                  null : "{super." + INITIALISE_FIELD_READS + "($1);}",
             genadvisor);
       genadvisor.addMethod(initialiseFieldReads);
 
+      CtMethod superInitialiseFieldWrites =
+         genadvisor.getSuperclass().getDeclaredMethod(INITIALISE_FIELD_WRITES);
       CtMethod initialiseFieldWrites = CtNewMethod.make(
             Modifier.PROTECTED,
             CtClass.voidType,
             INITIALISE_FIELD_WRITES,
-            EMPTY_SIG,
+            superInitialiseFieldWrites.getParameterTypes(),
             EMPTY_EXCEPTIONS,
             (isBaseClass(clazz)) ?
-                  null : "{super." + INITIALISE_FIELD_WRITES + "();}",
+                  null : "{super." + INITIALISE_FIELD_WRITES + "($1);}",
             genadvisor);
       genadvisor.addMethod(initialiseFieldWrites);
 
@@ -631,7 +639,8 @@
 
       StringBuffer advicesUpdatedCode = new StringBuffer();
       StringBuffer initialiseInfosForInstanceCode = new StringBuffer();
-
+      initialiseInfosForInstanceCode.append("java.util.Collection fieldReadCol = new java.util.ArrayList();");
+      initialiseInfosForInstanceCode.append("java.util.Collection fieldWriteCol = new java.util.ArrayList();");
       while (true)
       {
          CtField[] fields = superAdvisor.getDeclaredFields();
@@ -662,6 +671,13 @@
                String code = infoName + " = super.copyInfoFromClassAdvisor(((" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "())." + infoName + ");";
                initialiseInfosForInstanceCode.append(code);
             }
+            if (infoClassName.equals(FieldInfo.class.getName()))
+            {
+               initialiseInfosForInstanceCode.append("if (").append(infoName).append(".isRead()){");
+               initialiseInfosForInstanceCode.append("fieldReadCol.add(").append(infoName).append(");");
+               initialiseInfosForInstanceCode.append("} else { fieldWriteCol.add(");
+               initialiseInfosForInstanceCode.append(infoName).append(");}");
+            }
          }
 
          if (isBaseClass(superClass))
@@ -673,7 +689,8 @@
          superClass = superClass.getSuperclass();
          superAdvisor = superAdvisor.getSuperclass();
       }
-      
+      initialiseInfosForInstanceCode.append("fieldReadInfos = (org.jboss.aop.FieldInfo[]) fieldReadCol.toArray(new org.jboss.aop.FieldInfo[fieldReadCol.size()]);");
+      initialiseInfosForInstanceCode.append("fieldWriteInfos = (org.jboss.aop.FieldInfo[]) fieldWriteCol.toArray(new org.jboss.aop.FieldInfo[fieldWriteCol.size()]);");
       if (initialiseInfosForInstanceCode.length() > 0)
       {
          initialiseInfosForInstanceCode.insert(0, genadvisor.getName() + " classAdvisor = (" + genadvisor.getName() + ")" + clazz.getName() + "." + GET_CLASS_ADVISOR + "();");
@@ -750,7 +767,7 @@
             index + ", " +
             "\"" + fieldName + "\", " +
             wrapperHash + "L, this, true);" +
-         GeneratedClassAdvisor.ADD_FIELD_READ_INFO + "(" + infoName + ");";
+         GeneratedClassAdvisor.ADD_FIELD_READ_INFO + "(" + infoName + ", $1);";
 
       addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_READS);
    }
@@ -764,7 +781,7 @@
             index + ", " +
             "\"" + fieldName + "\", " +
             wrapperHash + "L, this, false);" +
-         GeneratedClassAdvisor.ADD_FIELD_WRITE_INFO + "(" + infoName + ");";
+         GeneratedClassAdvisor.ADD_FIELD_WRITE_INFO + "(" + infoName + ", $1);";
 
       addCodeToInitialiseMethod(genadvisor, code, INITIALISE_FIELD_WRITES);
    }
@@ -778,7 +795,7 @@
             index + ", " +
             wrapperHash + "L, " +
             constructorHash + "L, this);" +
-         GeneratedClassAdvisor.ADD_CONSTRUCTOR_INFO + "(" + infoName + ");";
+         GeneratedClassAdvisor.ADD_CONSTRUCTOR_INFO + "(" + infoName + ", $1);";
 
       addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTORS);
    }
@@ -791,7 +808,7 @@
             "java.lang.Class.forName(\"" + clazz.getName() + "\")," +
             index + ", " +
             constructorHash + "L, this);" +
-         GeneratedClassAdvisor.ADD_CONSTRUCTION_INFO + "(" + infoName + ");";
+         GeneratedClassAdvisor.ADD_CONSTRUCTION_INFO + "(" + infoName + ", $1);";
 
       addCodeToInitialiseMethod(genadvisor, code, INITIALISE_CONSTRUCTIONS);
    }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/util/ConstructorComparator.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -22,6 +22,7 @@
 package org.jboss.aop.util;
 
 import java.lang.reflect.Constructor;
+import java.util.Comparator;
 
 
 /**
@@ -31,13 +32,13 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class ConstructorComparator implements java.util.Comparator
+public class ConstructorComparator implements Comparator<Constructor>
 {
    private ConstructorComparator() {}
 
-   public static final java.util.Comparator INSTANCE = new ConstructorComparator();
+   public static final java.util.Comparator<Constructor> INSTANCE = new ConstructorComparator();
         
-   private int compare(Constructor m1, Constructor m2) {
+   public int compare(Constructor m1, Constructor m2) {
       try {
          Class[] args1 = m1.getParameterTypes();
          Class[] args2 = m2.getParameterTypes();
@@ -55,8 +56,4 @@
       // unreachable.
       throw new Error();
    }
-
-   public int compare(Object o1, Object o2) {
-      return compare((Constructor) o1, (Constructor) o2);
-   }
 }

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java	2007-12-21 12:08:20 UTC (rev 68506)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/util/FieldComparator.java	2007-12-21 12:11:10 UTC (rev 68507)
@@ -22,6 +22,7 @@
 package org.jboss.aop.util;
 
 import java.lang.reflect.Field;
+import java.util.Comparator;
 
 /**
  * Compares Fields. This is used to make sure the field IDs line up between
@@ -30,18 +31,13 @@
  * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
  * @version $Revision$
  */
-public class FieldComparator implements java.util.Comparator {
+public class FieldComparator implements Comparator<Field> {
 
     private FieldComparator() {}
 
-    public static final java.util.Comparator INSTANCE = new FieldComparator();
+    public static final Comparator<Field> INSTANCE = new FieldComparator();
         
-    private int compare(Field m1, Field m2) {
+    public int compare(Field m1, Field m2) {
        return m1.getName().compareTo(m2.getName());
     }
-
-    public int compare(Object o1, Object o2) {
-        return compare((Field) o1, (Field) o2);
-    }
-
 }




More information about the jboss-cvs-commits mailing list