[jboss-cvs] JBossAS SVN: r69628 - projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Feb 5 16:17:32 EST 2008
Author: adrian at jboss.org
Date: 2008-02-05 16:17:32 -0500 (Tue, 05 Feb 2008)
New Revision: 69628
Modified:
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
Log:
[JBMICROCONT-234] - Ignore findLoadedClass() results if the associated classloader of the result is not valid
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java 2008-02-05 20:35:11 UTC (rev 69627)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java 2008-02-05 21:17:32 UTC (rev 69628)
@@ -216,11 +216,27 @@
// Did we already load this class?
Class<?> result = findLoadedClass(name);
+ if (result != null)
+ {
+ // Has this classloader been undeployed?
+ ClassLoader otherClassLoader = getClassLoader(result);
+ if (otherClassLoader != null && otherClassLoader != this && otherClassLoader instanceof RealClassLoader)
+ {
+ RealClassLoader rcl = (RealClassLoader) otherClassLoader;
+ // Ignore when undeployed
+ if (rcl.isValid() == false)
+ {
+ if (trace)
+ log.trace(this + " ignoring already loaded class from undeployed classloader " + ClassLoaderUtils.classToString(result));
+ result = null;
+ }
+ }
+ }
if (result != null && trace)
- log.trace(this + " already loaded class " + name + " " + ClassLoaderUtils.classToString(result));
+ log.trace(this + " already loaded class " + ClassLoaderUtils.classToString(result));
// If this is an array, use Class.forName() to resolve it
- if (name.charAt(0) == '[')
+ if (result == null && name.charAt(0) == '[')
{
if (trace)
log.trace(this + " resolving array class " + name + " using Class.forName()");
@@ -595,7 +611,7 @@
public boolean isValid()
{
BaseClassLoaderPolicy basePolicy = policy;
- return basePolicy.getClassLoader() != null;
+ return basePolicy.getClassLoaderUnchecked() != null;
}
public Class<?> getCachedClass(String name)
@@ -815,4 +831,25 @@
notifyAll();
}
}
+
+ /**
+ * Get the classloader for a class
+ *
+ * @param clazz the class
+ * @return the classloader or null if it doesn't have one
+ */
+ private static final ClassLoader getClassLoader(final Class<?> clazz)
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null)
+ return clazz.getClassLoader();
+
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return clazz.getClassLoader();
+ }
+ });
+ }
}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java 2008-02-05 20:35:11 UTC (rev 69627)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java 2008-02-05 21:17:32 UTC (rev 69628)
@@ -261,6 +261,7 @@
shutdownPolicy();
this.domain = null;
}
+
/**
* Get the classloader
*
@@ -274,6 +275,16 @@
}
/**
+ * Get the classloader
+ *
+ * @return the classloader
+ */
+ synchronized BaseClassLoader getClassLoaderUnchecked()
+ {
+ return classLoader;
+ }
+
+ /**
* Set the classloader<p>
*
* NOTE: Package private for security reasons
More information about the jboss-cvs-commits
mailing list