[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