[jboss-cvs] JBossAS SVN: r96656 - projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Nov 20 15:16:29 EST 2009


Author: flavia.rainone at jboss.com
Date: 2009-11-20 15:16:29 -0500 (Fri, 20 Nov 2009)
New Revision: 96656

Modified:
   projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java
   projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java
   projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java
   projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java
Log:
[JBREFLECT-68] VFSClassLoaderDomainRegistry is singleton. This commit also includes refactoring:
- code has been moved away from RegisterModuleCallback and into VFSClassLoaderDomainRegistry
- DomainRegistry.initMapsForLoader(ClassLoader,Module) has been refactored into initMapsForModule(Module)
- DomainRegistry.cleanUpLoader(ClassLoader) has been refactored to cleanUpModule(Module)

Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java	2009-11-20 20:11:36 UTC (rev 96655)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/DomainRegistry.java	2009-11-20 20:16:29 UTC (rev 96656)
@@ -37,9 +37,9 @@
    
    ClassLoaderDomain getDefaultDomain();
    
-   boolean initMapsForLoader(ClassLoader loader, Module module, ClassLoader parentUnitLoader);
+   boolean initMapsForModule(Module module);
 
-   void cleanupLoader(ClassLoader loader);
+   void cleanupModule(Module module);
    
    ClassLoaderDomain getClassLoaderDomainForLoader(ClassLoader cl);
 

Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java	2009-11-20 20:11:36 UTC (rev 96655)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/RegisterModuleCallback.java	2009-11-20 20:16:29 UTC (rev 96656)
@@ -26,13 +26,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.jboss.classloading.spi.dependency.ClassLoading;
 import org.jboss.classloading.spi.dependency.Module;
 import org.jboss.classloading.spi.dependency.ModuleRegistry;
-import org.jboss.classloading.spi.vfs.dependency.VFSClassLoaderPolicyModule;
-import org.jboss.classpool.spi.ClassPoolRepository;
-import org.jboss.deployers.plugins.classloading.AbstractDeploymentClassLoaderPolicyModule;
-import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.classpool.plugins.as5.jbosscl.JBossClDelegatingClassPoolRepository;
 import org.jboss.logging.Logger;
 
 /**
@@ -40,6 +36,7 @@
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
  * @author <a href="ales.justin at jboss.com">Ales Justin</a>
+ * @author <a href="flavia.rainone at jboss.com">Flavia Rainone</a>
  * @version $Revision$
  */
 public class RegisterModuleCallback implements ModuleRegistry
@@ -57,37 +54,42 @@
    
    public synchronized void addModule(Module module)
    {
-      logger.debug("Adding module " + module);
+      if (logger.isTraceEnabled())
+      {
+         logger.trace("Adding module " + module);
+      }
       unregisteredModules.add(module);
    }
 
    public synchronized void removeModule(Module module)
    {
-      logger.debug("Removing module " + module);
-      ClassLoader classLoader = ClassLoading.getClassLoaderForModule(module);
-      ClassPoolRepository.getInstance().unregisterClassLoader(classLoader);
+      
+      ClassLoader classLoader = domainRegistry.getClassLoader(module);
+      if (logger.isTraceEnabled())
+      {
+         logger.trace("Removing module " + module + " and class loader " + classLoader);
+      }
+      JBossClDelegatingClassPoolRepository.getInstance().unregisterClassLoader(classLoader, module);
+      domainRegistry.cleanupModule(module);
       registeredModules.remove(module);
       unregisteredModules.remove(module);
    }
    
-   public synchronized Collection<Module> getUnregisteredModules()
-   {
-      return new ArrayList<Module>(unregisteredModules);
-   }
-   
    public synchronized void registerModule(Module module)
    {
-      logger.debug("Registering module " + module);
+      if (logger.isTraceEnabled())
+      {
+         logger.trace("Registering module " + module);
+      }
+      
       registeredModules.add(module);
       unregisteredModules.remove(module);
       
-      ClassLoader cl = ClassLoading.getClassLoaderForModule(module);
-      ClassLoader parentUnitLoader = null;
-      if (module instanceof AbstractDeploymentClassLoaderPolicyModule)
-      {
-         DeploymentUnit unit = AbstractDeploymentClassLoaderPolicyModule.class.cast(module).getDeploymentUnit();
-         parentUnitLoader = unit.isTopLevel() ? null : unit.getParent().getClassLoader();
-      }
-      domainRegistry.initMapsForLoader(cl, module, parentUnitLoader);
+      domainRegistry.initMapsForModule(module);
    }
-}
+   
+   public synchronized Collection<Module> getUnregisteredModules()
+   {
+      return new ArrayList<Module>(unregisteredModules);
+   }
+}
\ No newline at end of file

Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java	2009-11-20 20:11:36 UTC (rev 96655)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/SecurityActions.java	2009-11-20 20:16:29 UTC (rev 96656)
@@ -21,10 +21,14 @@
 */ 
 package org.jboss.classpool.plugins.as5;
 
+import java.lang.reflect.Method;
 import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 
+import org.jboss.classloader.spi.base.BaseClassLoaderSource;
+
 /**
  * 
  * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
@@ -77,4 +81,38 @@
          return GetParentAction.PRIVILEGED.getParent(loader);
       }
    }
+   
+   private static final Method getClassLoader;
+
+   static
+   {
+      getClassLoader = AccessController.doPrivileged(new PrivilegedAction<Method>()
+      {
+         public Method run()
+         {
+            try
+            {
+               Method method = BaseClassLoaderSource.class.getDeclaredMethod("getClassLoader");
+               method.setAccessible(true);
+               return method;
+            }
+            catch (NoSuchMethodException e)
+            {
+               throw new RuntimeException("Cannot get classloader from " + BaseClassLoaderSource.class.getName(), e);
+            }
+         }
+      });
+   }
+
+   static ClassLoader getClassLoader(BaseClassLoaderSource clSource)
+   {
+      try
+      {
+         return (ClassLoader)getClassLoader.invoke(clSource);
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException(e);
+      }
+   }
 }

Modified: projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java
===================================================================
--- projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java	2009-11-20 20:11:36 UTC (rev 96655)
+++ projects/jboss-classpool/trunk/src/main/java/org/jboss/classpool/plugins/as5/VFSClassLoaderDomainRegistry.java	2009-11-20 20:16:29 UTC (rev 96656)
@@ -26,9 +26,13 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 
+import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloading.spi.dependency.ClassLoading;
 import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.deployers.plugins.classloading.AbstractDeploymentClassLoaderPolicyModule;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
 
 /**
  * 
@@ -39,6 +43,13 @@
 {
    protected final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
    
+   private static final VFSClassLoaderDomainRegistry instance = new VFSClassLoaderDomainRegistry();
+   
+   public static final VFSClassLoaderDomainRegistry getInstance()
+   {
+      return instance;
+   }
+   
    private ClassLoaderSystem system;
    
    private ClassLoaderDomain defaultDomain;
@@ -57,6 +68,8 @@
 
    protected Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
    
+   protected VFSClassLoaderDomainRegistry() {}
+   
    /**
     * Needed for the tests, not expected to be needed in production
     */
@@ -91,8 +104,10 @@
       return defaultDomain;
    }
 
-   public synchronized boolean initMapsForLoader(ClassLoader loader, Module module, ClassLoader parentUnitLoader)
+   public synchronized boolean initMapsForModule(Module module)
    {
+      ClassLoader loader = ClassLoading.getClassLoaderForModule(module);
+      ClassLoader parentUnitLoader = findParentUnitLoader(module);
       if (loader == parentUnitLoader)
       {
          throw new IllegalArgumentException("initMapsForLoader() should only be called if parentUnitLoader is different from loader");
@@ -132,8 +147,9 @@
       
    }
    
-   public synchronized void cleanupLoader(ClassLoader loader)
+   public synchronized void cleanupModule(Module module)
    {
+      ClassLoader loader = this.getClassLoader(module);
       validateCleanupLoader(loader);
       WeakReference<ClassLoaderDomain> clDomainRef = classLoaderDomainsByLoader.remove(loader);
       ClassLoaderDomain clDomain = clDomainRef == null ? null : clDomainRef.get();
@@ -148,38 +164,17 @@
          }
          if (cnt == 0)
          {
-            //aopDomainsByClassLoaderDomain.remove(clDomain);
             classLoaderDomainReferenceCounts.remove(clDomain);
          }
          else
          {
             classLoaderDomainReferenceCounts.put(clDomain, ++cnt);
          }
-         //ScopedVFSClassLoaderDomain aopDomain = aopDomainsByClassLoader.remove(loader);
          classLoaderUnitParents.remove(loader);
-         WeakReference<Module> moduleRef = classLoaderModules.remove(loader);
-         if (moduleRef != null)
-         {
-            Module module = moduleRef.get();
-            if (module != null)
-            {
-               moduleClassLoaders.remove(module);
-            }
-         }
-         
-
-         /*List<ScopedVFSClassLoaderDomain> aopDomains = aopDomainsByClassLoaderDomain.get(clDomain);
-         if (aopDomains != null)
-         {
-            aopDomains.remove(aopDomain);
-         }
-         if (aopDomain != null)
-         {
-            aopDomain.getParent().unsubscribeSubDomain(aopDomain);
-         }*/
+         classLoaderModules.remove(loader);
+         moduleClassLoaders.remove(module);
       }
       cleanupLoaderDone(loader, clDomain, cnt);
-      //aopDomainsByClassLoader.remove(loader);
    }
 
    protected void validateCleanupLoader(ClassLoader loader) {}
@@ -236,4 +231,20 @@
       }
       return null;
    }
-}
+   
+   private ClassLoader findParentUnitLoader(Module module)
+   {
+      if (module instanceof AbstractDeploymentClassLoaderPolicyModule)
+      {
+         DeploymentUnit unit = AbstractDeploymentClassLoaderPolicyModule.class.cast(module).getDeploymentUnit();
+         return unit.isTopLevel() ? null : unit.getParent().getClassLoader();
+      }
+      ClassLoaderDomain domain = ClassLoaderSystem.getInstance().getDomain(module.getDeterminedDomainName());
+      if (domain.getParent() instanceof ClassLoaderToLoaderAdapter)
+      {
+         ClassLoaderToLoaderAdapter cp2la = (ClassLoaderToLoaderAdapter)domain.getParent();
+         return SecurityActions.getClassLoader(cp2la);
+      }
+      return null;
+   }
+}
\ No newline at end of file




More information about the jboss-cvs-commits mailing list