[jboss-cvs] JBossAS SVN: r64076 - projects/aop/trunk/aop/src/main/org/jboss/aop.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Jul 16 13:58:02 EDT 2007


Author: kabir.khan at jboss.com
Date: 2007-07-16 13:58:02 -0400 (Mon, 16 Jul 2007)
New Revision: 64076

Modified:
   projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
Log:
[JBAOP-378] Make the joinpointgenerator maps "lazy"

Modified: projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java
===================================================================
--- projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-07-16 17:28:50 UTC (rev 64075)
+++ projects/aop/trunk/aop/src/main/org/jboss/aop/GeneratedClassAdvisor.java	2007-07-16 17:58:02 UTC (rev 64076)
@@ -50,6 +50,7 @@
 import org.jboss.aop.joinpoint.Joinpoint;
 import org.jboss.aop.joinpoint.MethodJoinpoint;
 import org.jboss.aop.pointcut.PointcutMethodMatch;
+import org.jboss.aop.util.UnmodifiableEmptyCollections;
 
 /**
  * Comment
@@ -76,15 +77,15 @@
 
    //TODO These are only needed for the class advisor really
    //All joinpoint generators apart from field reads and constructions go in here
-   private ConcurrentHashMap joinPointGenerators = new ConcurrentHashMap();
+   private ConcurrentHashMap joinPointGenerators = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
    //Needs its own map to avoid crashing with the field write generators
-   private ConcurrentHashMap fieldReadJoinPoinGenerators = new ConcurrentHashMap();
+   private ConcurrentHashMap fieldReadJoinPoinGenerators = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
    //Needs its own map to avoid crashing with the constructor generators
-   private ConcurrentHashMap constructionJoinPointGenerators = new ConcurrentHashMap();
+   private ConcurrentHashMap constructionJoinPointGenerators = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
    
-   ConcurrentHashMap oldInfos = new ConcurrentHashMap();
-   ConcurrentHashMap oldFieldReadInfos = new ConcurrentHashMap();
-   ConcurrentHashMap oldConstructionInfos = new ConcurrentHashMap();
+   ConcurrentHashMap oldInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+   ConcurrentHashMap oldFieldReadInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
+   ConcurrentHashMap oldConstructionInfos = UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP;
 
    boolean initialisedSuperClasses; 
 
@@ -548,7 +549,7 @@
          MethodInfo myMethodInfo = matchInfo.getInfo();
          myMethodInfo.cloneChains(classMethodInfo);
          
-         if (updateOldInfo(oldInfos, myMethodInfo))
+         if (updateOldInfo(oldInfos, myMethodInfo, OldInfoMaps.INFOS))
          {
             MethodJoinPointGenerator generator = getJoinPointGenerator(myMethodInfo);
             generator.rebindJoinpoint(myMethodInfo);
@@ -571,7 +572,7 @@
          newMethodInfos.put(keys[i], info);
 
          MethodJoinPointGenerator generator = getJoinPointGenerator(info);
-         finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+         finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
       }
       methodInterceptors = newMethodInfos;
       
@@ -583,7 +584,7 @@
             MethodInfo info = (MethodInfo)it.next();
 
             MethodJoinPointGenerator generator = getJoinPointGenerator(info);
-            finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+            finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
          }
       }      
    }
@@ -595,12 +596,12 @@
       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);
+         easyFinalizeFieldChainForInstance(oldFieldReadInfos, classAdvisor.getFieldReadInfos(), newFieldInfos, 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);
+         fullWorkFinalizeFieldChain(oldFieldReadInfos, newFieldInfos, OldInfoMaps.FIELD_READ_INFOS);
       }
    }
 
@@ -611,16 +612,16 @@
       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);
+         easyFinalizeFieldChainForInstance(oldInfos, classAdvisor.getFieldWriteInfos(), newFieldInfos, 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);
+         fullWorkFinalizeFieldChain(oldInfos, newFieldInfos, OldInfoMaps.INFOS);
       }
    }
 
-   private void easyFinalizeFieldChainForInstance(Map oldFieldInfos, FieldInfo[] classFieldInfos, ArrayList newFieldInfos)
+   private void easyFinalizeFieldChainForInstance(Map oldFieldInfos, FieldInfo[] classFieldInfos, ArrayList 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)
@@ -630,7 +631,7 @@
             FieldInfo myInfo = (FieldInfo)newFieldInfos.get(i);
             myInfo.cloneChains(classFieldInfos[i]);
             
-            if (updateOldInfo(oldFieldInfos, myInfo))
+            if (updateOldInfo(oldFieldInfos, myInfo, oldInfoMapInstance))
             {
                FieldJoinPointGenerator generator = getJoinPointGenerator(myInfo);
                generator.rebindJoinpoint(myInfo);
@@ -639,14 +640,14 @@
       }
    }
    
-   private void fullWorkFinalizeFieldChain(Map oldFieldInfos, ArrayList newFieldInfos)
+   private void fullWorkFinalizeFieldChain(Map oldFieldInfos, ArrayList 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++)
       {
          FieldInfo info = (FieldInfo)newFieldInfos.get(i);
          FieldJoinPointGenerator generator = getJoinPointGenerator(info);
-         finalizeChainAndRebindJoinPoint(oldFieldInfos, info, generator);
+         finalizeChainAndRebindJoinPoint(oldFieldInfos, info, generator, oldInfoMapInstance);
       }
    }
    
@@ -666,21 +667,21 @@
    protected void finalizeMethodCalledByMethodInterceptorChain(MethodByMethodInfo info)
    {
       MethodByMethodJoinPointGenerator generator = getJoinPointGenerator(info);
-      finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+      finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
    }
 
    @Override
    protected void finalizeConCalledByMethodInterceptorChain(ConByMethodInfo info)
    {
       ConByMethodJoinPointGenerator generator = getJoinPointGenerator(info);
-      finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+      finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
    }
 
    @Override
    protected void finalizeConCalledByConInterceptorChain(ConByConInfo info)
    {
       ConByConJoinPointGenerator generator = getJoinPointGenerator(info);
-      finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+      finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
    }
 
    @Override
@@ -692,12 +693,13 @@
       if (map == null)
       {
          map = new ConcurrentHashMap();
+         initJoinPointGeneratorsMap();
          joinPointGenerators.put(info.getJoinpoint(), map);
          map = (ConcurrentHashMap)joinPointGenerators.get(info.getJoinpoint());
       }
 
       MethodByConJoinPointGenerator generator = getJoinPointGenerator(info);
-      finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+      finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
    }
 
    private JoinPointGenerator getJoinPointGenerator(JoinPointInfo info)
@@ -807,7 +809,7 @@
       }
    }
 
-   private void finalizeChainAndRebindJoinPoint(Map oldInfos, JoinPointInfo info, JoinPointGenerator generator)
+   private void finalizeChainAndRebindJoinPoint(Map oldInfos, JoinPointInfo info, JoinPointGenerator generator, OldInfoMaps oldInfoMapInstance)
    {
       ArrayList list = info.getInterceptorChain();
       GeneratedAdvisorInterceptor[] factories = null;
@@ -817,7 +819,7 @@
       }
       info.setInterceptors(factories);
 
-      if (updateOldInfo(oldInfos, info))
+      if (updateOldInfo(oldInfos, info, oldInfoMapInstance))
       {
          generator.rebindJoinpoint(info);
       }
@@ -956,7 +958,7 @@
    /**
     * Caches the old info and checks if the chains have been updated
     */
-   private boolean updateOldInfo(Map oldInfos, JoinPointInfo newInfo)
+   private boolean updateOldInfo(Map oldInfos, JoinPointInfo newInfo, OldInfoMaps oldInfoMapInstance)
    {
       JoinPointInfo oldInfo = (JoinPointInfo)oldInfos.get(newInfo.getJoinpoint());
       if (oldInfo != null)
@@ -968,6 +970,24 @@
          }
       }
       oldInfo = newInfo.copy();
+      
+      if (oldInfoMapInstance == OldInfoMaps.INFOS) 
+      {
+         oldInfos = initOldInfosMap();
+      }
+      else if (oldInfoMapInstance == OldInfoMaps.FIELD_READ_INFOS)
+      {
+         oldInfos = initOldFieldReadInfosMap();
+      }
+      else if (oldInfoMapInstance == OldInfoMaps.CONSTRUCTION_INFOS)
+      {
+         oldInfos = initOldConstructionInfosMap();
+      }
+      else
+      {
+         throw new RuntimeException("Unrecognised map");
+      }
+      
       oldInfos.put(newInfo.getJoinpoint(), oldInfo);
       return true;
    }
@@ -1037,6 +1057,124 @@
       return rebindJoinPointWithInstanceInformation(newinfo);
    }
    
+   
+   protected void initJoinPointGeneratorsMap()
+   {
+      if (joinPointGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (joinPointGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               joinPointGenerators = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+   }
+   
+   protected void initFieldReadJoinPointGeneratorsMap()
+   {
+      if (fieldReadJoinPoinGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (fieldReadJoinPoinGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               fieldReadJoinPoinGenerators = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+   }
+   
+   protected void initConstructionJoinPointGeneratorsMap()
+   {
+      if (constructionJoinPointGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (constructionJoinPointGenerators == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               constructionJoinPointGenerators = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+   }
+   
+   protected ConcurrentHashMap initOldInfosMap()
+   {
+      if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (oldInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               oldInfos = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+      return oldInfos;
+   }
+   
+   protected ConcurrentHashMap initOldFieldReadInfosMap()
+   {
+      if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (oldFieldReadInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               oldFieldReadInfos = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+      return oldFieldReadInfos;
+   }
+   
+   protected ConcurrentHashMap initOldConstructionInfosMap()
+   {
+      if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+      {
+         lockWrite();
+         try
+         {
+            if (oldConstructionInfos == UnmodifiableEmptyCollections.EMPTY_CONCURRENT_HASHMAP)
+            {
+               oldConstructionInfos = new ConcurrentHashMap();
+            }
+         }
+         finally
+         {
+            unlockWrite();
+         }
+      }
+      return oldConstructionInfos;
+   }
+   
    /**
     * Encapsulates different behaviours depending on if this is an instance or class advisor
     */
@@ -1118,6 +1256,7 @@
          if (generator == null)
          {
             generator = new MethodJoinPointGenerator(GeneratedClassAdvisor.this, info);
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), generator);
          }
          return generator;
@@ -1131,6 +1270,7 @@
             if (generator == null)
             {
                generator = new FieldJoinPointGenerator(GeneratedClassAdvisor.this, info);
+               initFieldReadJoinPointGeneratorsMap();
                fieldReadJoinPoinGenerators.put(info.getJoinpoint(), generator);
             }
             return generator;
@@ -1141,6 +1281,7 @@
             if (generator == null)
             {
                generator = new FieldJoinPointGenerator(GeneratedClassAdvisor.this, info);
+               initJoinPointGeneratorsMap();
                joinPointGenerators.put(info.getJoinpoint(), generator);
             }
             return generator;
@@ -1154,6 +1295,7 @@
          if (generator == null)
          {
             generator = new ConstructorJoinPointGenerator(GeneratedClassAdvisor.this, info);
+            initConstructionJoinPointGeneratorsMap();
             constructionJoinPointGenerators.put(info.getJoinpoint(), generator);
          }
          return generator;
@@ -1165,6 +1307,7 @@
          if (generator == null)
          {
             generator = new ConstructionJoinPointGenerator(GeneratedClassAdvisor.this, info);
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), generator);
          }
          return generator;
@@ -1178,6 +1321,7 @@
          if (map == null)
          {
             map = new ConcurrentHashMap();
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), map);
             map = (ConcurrentHashMap)joinPointGenerators.get(info.getJoinpoint());
          }
@@ -1198,6 +1342,7 @@
          if (generator == null)
          {
             generator = new ConByMethodJoinPointGenerator(GeneratedClassAdvisor.this, info);
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), generator);
          }
          return generator;
@@ -1210,6 +1355,7 @@
          if (generator == null)
          {
             generator = new ConByConJoinPointGenerator(GeneratedClassAdvisor.this, info);
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), generator);
          }
          return generator;
@@ -1223,6 +1369,7 @@
          if (map == null)
          {
             map = new ConcurrentHashMap();
+            initJoinPointGeneratorsMap();
             joinPointGenerators.put(info.getJoinpoint(), map);
             map = (ConcurrentHashMap)joinPointGenerators.get(info.getJoinpoint());
          }
@@ -1304,7 +1451,7 @@
          {
             ConstructorInfo info = (ConstructorInfo) newConstructorInfos.get(i);
             ConstructorJoinPointGenerator generator = getJoinPointGenerator(info);
-            finalizeChainAndRebindJoinPoint(oldInfos, info, generator);
+            finalizeChainAndRebindJoinPoint(oldInfos, info, generator, OldInfoMaps.INFOS);
          }
       }
 
@@ -1314,7 +1461,7 @@
          {
             ConstructionInfo info = (ConstructionInfo) newConstructionInfos.get(i);
             ConstructionJoinPointGenerator generator = getJoinPointGenerator(info);
-            finalizeChainAndRebindJoinPoint(oldConstructionInfos, info, generator);
+            finalizeChainAndRebindJoinPoint(oldConstructionInfos, info, generator, OldInfoMaps.CONSTRUCTION_INFOS);
          }
       }
 
@@ -1528,4 +1675,8 @@
          //Do nothing, field was already made accessible in class advisor
       }
    }
+   
+   enum OldInfoMaps{
+      INFOS, FIELD_READ_INFOS, CONSTRUCTION_INFOS;
+   }
 }




More information about the jboss-cvs-commits mailing list