[jboss-cvs] JBossAS SVN: r104806 - in projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool: plugins and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri May 14 13:34:53 EDT 2010


Author: kabir.khan at jboss.com
Date: 2010-05-14 13:34:53 -0400 (Fri, 14 May 2010)
New Revision: 104806

Modified:
   projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/base/BaseClassPool.java
   projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java
Log:
[CLASSPOOL-9] Optimize plainParentGet() to avoid NotFoundExceptions

Modified: projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/base/BaseClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/base/BaseClassPool.java	2010-05-14 16:59:07 UTC (rev 104805)
+++ projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/base/BaseClassPool.java	2010-05-14 17:34:53 UTC (rev 104806)
@@ -82,45 +82,6 @@
       return clazz;
    }
 
-   /**
-    * Uses the parent ClassPool, if available, to create the CtClass representing
-    * {@code classname}.
-    * 
-    * @param classname the name of the queried CtClass
-    * @param useCache  whether the ScopedClassPool cache should be used to search for the CtClass
-    * @param trace     enables tracing
-    * @return          a {@code CtClass} representing {@code classname}
-    */
-   protected CtClass createParentCtClass(String classname, boolean useCache, boolean trace)
-   {
-      if (parent == null)
-      {
-         return null;
-      }
-
-      //Make parent create class
-      if (parent instanceof BaseClassPool)
-      {
-         return ((BaseClassPool)parent).createCtClass(classname, useCache);
-      }
-      else
-      {
-         return plainParentGet(classname);
-      }
-   }
-   
-   private CtClass plainParentGet(String classname)
-   {
-      try
-      {
-         return parent.get(classname);
-      }
-      catch (NotFoundException e)
-      {
-      }
-      return null;
-   }
-
    public ClassPool getParent()
    {
       return parent;

Modified: projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java
===================================================================
--- projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java	2010-05-14 16:59:07 UTC (rev 104805)
+++ projects/jboss-classpool/trunk/classpool/src/main/java/org/jboss/classpool/plugins/NonDelegatingClassPool.java	2010-05-14 17:34:53 UTC (rev 104806)
@@ -21,12 +21,17 @@
  */ 
 package org.jboss.classpool.plugins;
 
-import org.jboss.classpool.base.BaseClassPool;
-import org.jboss.classpool.spi.AbstractClassPool;
+import java.util.Set;
 
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.NotFoundException;
+import javassist.bytecode.Descriptor;
+
+import org.jboss.classpool.base.BaseClassPool;
 import org.jboss.classpool.scoped.ScopedClassPoolRepository;
+import org.jboss.classpool.spi.AbstractClassPool;
+import org.jboss.util.collection.ConcurrentSet;
 
 
 /**
@@ -37,6 +42,10 @@
  */
 public class NonDelegatingClassPool extends BaseClassPool
 {
+   private Set<String> parentBlacklist = new ConcurrentSet<String>(100, .75f, 3);
+   
+   private Set<String> parentWhitelist = new ConcurrentSet<String>(100, .75f, 3);
+   
    public NonDelegatingClassPool(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository, boolean parentFirst)
    {
       super(cl, src, repository, AbstractClassPool.SEARCH_LOCAL_ONLY_STRATEGY);
@@ -66,4 +75,82 @@
       if (trace)logger.trace(this + " created " + classname + " " + getClassPoolLogStringForClass(clazz));
       return clazz;
    }
+   
+   /**
+    * Uses the parent ClassPool, if available, to create the CtClass representing
+    * {@code classname}.
+    * 
+    * @param classname the name of the queried CtClass
+    * @param useCache  whether the ScopedClassPool cache should be used to search for the CtClass
+    * @param trace     enables tracing
+    * @return          a {@code CtClass} representing {@code classname}
+    */
+   private CtClass createParentCtClass(String classname, boolean useCache, boolean trace)
+   {
+      if (parent == null)
+      {
+         return null;
+      }
+
+      //Make parent create class
+      if (parent instanceof BaseClassPool)
+      {
+         return ((BaseClassPool)parent).createCtClass(classname, useCache);
+      }
+      else
+      {
+         return plainParentGet(classname);
+      }
+   }
+   
+   private CtClass plainParentGet(String classname)
+   {
+      String real = classname;
+
+      try
+      {
+         if (parentWhitelist.contains(classname))
+            return parent.get(classname);
+      }
+      catch (NotFoundException e)
+      {
+         //This should not happen
+         logger.warn(classname + " not loaded from parent despite having been loaded before");
+         return null;
+      }
+      
+      if (parentBlacklist.contains(classname))
+         return null;
+
+      // accept "[L<class name>;" as a class name.
+      if (classname.charAt(0) == '[')
+          real = Descriptor.toClassName(real);
+      if (real.endsWith("[]"))
+          real = classname.substring(0, real.indexOf('['));
+
+      try
+      {
+         if (parent.find(classname) != null)
+         {
+            CtClass clazz = parent.get(real);
+            parentWhitelist.add(real);
+            if (real != classname)
+               parentWhitelist.add(real);
+            return clazz;
+         }
+      }
+      catch (NotFoundException e)
+      {
+         //This should not happen
+         logger.warn(classname + " not loaded from parent despite having been found");
+      }
+      
+      parentBlacklist.add(real);
+      if (real != classname)
+         parentBlacklist.add(classname);
+
+      return null;
+   }
+
+
 }




More information about the jboss-cvs-commits mailing list