[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