[jboss-cvs] JBossAS SVN: r80654 - in projects/aop/trunk/asintegration-mc/src: main/org/jboss/aop/classpool/jbosscl and 1 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Nov 7 08:22:11 EST 2008


Author: kabir.khan at jboss.com
Date: 2008-11-07 08:22:11 -0500 (Fri, 07 Nov 2008)
New Revision: 80654

Modified:
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java
   projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java
   projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
Log:
[JBAOP-666]
*Make the test framework create the Modules containing the classloading metadata and register them in the DomainRegistry. This would normally be done by the deployers in AS.
*Rework the access to the ClassLoaderSystem since the IsolatedClassLoaderTestHelper has its own copy.



Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -105,7 +105,7 @@
    {
       if (!module.getDeterminedDomainName().equals(ClassLoaderSystem.DEFAULT_DOMAIN_NAME))
       {
-         ClassLoaderSystem system = ClassLoaderSystem.getInstance();
+         ClassLoaderSystem system = registry.getSystem();
          String domainName = module.getDeterminedDomainName();
          ClassLoaderDomain domain = system.getDomain(domainName);
    

Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -23,6 +23,7 @@
 
 import org.jboss.aop.Domain;
 import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloading.spi.dependency.Module;
 
 /**
@@ -32,6 +33,8 @@
  */
 public interface DomainRegistry
 {
+   ClassLoaderSystem getSystem();
+   
    boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader);
 
    void cleanupLoader(ClassLoader loader);

Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -64,7 +64,7 @@
          if (module != null && module.getDeterminedParentDomainName() != null)
          {
             //It is scoped
-            ClassLoaderSystem sys = ClassLoaderSystem.getInstance();
+            ClassLoaderSystem sys = registry.getSystem();
             ClassLoaderDomain domain = sys.getDomain(module.getDeterminedDomainName());
             boolean parentFirst = module.isJ2seClassLoadingCompliance();
             ClassPool parentDomainPool = getParentUnitClassPool(cl); 

Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -39,6 +39,8 @@
 {
    final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
    
+   ClassLoaderSystem system;
+   
    /** classloader domains by their classloaders */
    private Map<ClassLoader, WeakReference<ClassLoaderDomain>> classLoaderDomainsByLoader = new WeakHashMap<ClassLoader, WeakReference<ClassLoaderDomain>>();
 
@@ -51,7 +53,25 @@
    /** Modules by classloader */
    private Map<ClassLoader, WeakReference<Module>> classLoaderModules = new WeakHashMap<ClassLoader, WeakReference<Module>>();
    
-   private Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>(); 
+   private Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
+   
+   /**
+    * Needed for the tests, not expected to be needed in production
+    */
+   @Deprecated
+   public void setSystem(ClassLoaderSystem system)
+   {
+      this.system = system;
+   }
+   
+   public synchronized ClassLoaderSystem getSystem()
+   {
+      if (system == null)
+      {
+         system = ClassLoaderSystem.getInstance();
+      }
+      return system;
+   }
 
    public synchronized boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader)
    {
@@ -59,7 +79,7 @@
       {
          throw new IllegalArgumentException("initMapsForLoader() should only be called if parentUnitLoader is different from loader");
       }
-      ClassLoaderSystem system = ClassLoaderSystem.getInstance();
+      ClassLoaderSystem system = getSystem();
       
       String domainName = module.getDeterminedDomainName();
       ClassLoaderDomain clDomain = system.getDomain(domainName);

Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -70,7 +70,7 @@
    private ClassPoolDomain getDomain(Module module, ClassLoader cl)
    {
       ClassLoaderDomain domain = null;
-      ClassLoaderSystem sys = ClassLoaderSystem.getInstance();
+      ClassLoaderSystem sys = registry.getSystem();
       if (module != null && module.getDeterminedParentDomainName() != null)
       {
          //It is scoped

Modified: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -51,7 +51,9 @@
       try
       {
          clA = createClassLoader("A", true, PACKAGE_A);
+         assertModule(clA);
          clB = createClassLoader("B", true, PACKAGE_B);
+         assertModule(clB);
          try
          {
             Class<?> aFromA = clA.loadClass(CLASS_A);
@@ -90,8 +92,11 @@
       try
       {
          clA = createClassLoader("A", true, PACKAGE_A);
+         assertModule(clA);
          clB = createClassLoader("B", true, PACKAGE_B);
+         assertModule(clB);
          clC = createChildDomainParentFirstClassLoader("C", "CHILD", true, PACKAGE_C);
+         assertModule(clC);
          
          childDomain = getChildDomainForLoader(clC);
          assertNotNull(childDomain);
@@ -135,8 +140,10 @@
       try
       {
          clA = createChildDomainParentFirstClassLoader("A", "ChildA", true, PACKAGE_A);
+         assertModule(clA);
          clB = createChildDomainParentLastClassLoader("B", "ChildB", true, PACKAGE_B);
-         
+         assertModule(clB);
+
          domainA = getChildDomainForLoader(clA);
          assertNotNull(domainA);
          assertSame(helper.getDomain(), domainA.getParent());
@@ -168,9 +175,13 @@
       try
       {
          clScoped = createChildDomainParentFirstClassLoader("SCOPED", "SCOPED", true, PACKAGE_B);
+         assertModule(clScoped);
          assertCannotLoadClass(clScoped, CLASS_A);
          
          clGlobal = createClassLoader("GLOBAL", true, PACKAGE_A);
+         assertModule(clScoped);
+         assertModule(clGlobal);
+
          Class<?> aFromChild = clScoped.loadClass(CLASS_A);
          assertNotNull(aFromChild);
          Class<?> aFromParent = clGlobal.loadClass(CLASS_A);

Modified: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2008-11-07 13:22:11 UTC (rev 80654)
@@ -23,27 +23,32 @@
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.WeakHashMap;
 
 import javassist.ClassPool;
 import junit.framework.Test;
 
 import org.jboss.aop.AspectManager;
-import org.jboss.aop.asintegration.jboss5.DomainRegistry;
 import org.jboss.aop.asintegration.jboss5.VFSClassLoaderDomainRegistry;
 import org.jboss.aop.classpool.jbosscl.JBossClClassPoolFactory;
 import org.jboss.classloader.plugins.filter.PatternClassFilter;
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.DelegateLoader;
 import org.jboss.classloader.spi.filter.ClassFilter;
 import org.jboss.classloader.test.support.IsolatedClassLoaderTestHelper;
-import org.jboss.classloader.test.support.MockClassLoaderHelper;
 import org.jboss.classloader.test.support.MockClassLoaderPolicy;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoaderPolicyModule;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
 import org.jboss.test.AbstractTestCaseWithSetup;
 import org.jboss.test.AbstractTestDelegate;
+import org.jboss.test.aop.classpool.jbosscl.support.TestMockClassLoaderPolicyModule;
 
 /**
  * Base class for testing the new JBoss classloaders
@@ -70,15 +75,14 @@
    public final static String CLASS_B = PACKAGE_B + ".B";
    public final static String CLASS_C = PACKAGE_C + ".C";
    
-   //I don't think this is needed with the way the classloading system works, it maintains the hard references?
-   //Keep a strong reference to the classloaders so that they are not garbage collected
-   //final static Set<ClassLoader> registeredClassLoaders = new HashSet<ClassLoader>();
+   //Keep strong references to the Modules since the domainRegistry only has weak references
+   private Set<Module> modules = new HashSet<Module>();
    
    private Map<ClassLoader, ClassLoaderDomain> scopedChildDomainsByLoader = new WeakHashMap<ClassLoader, ClassLoaderDomain>();
 
    /** The classloader helper */
    protected static IsolatedClassLoaderTestHelper helper;
-   protected static DomainRegistry domainRegistry;
+   protected static VFSClassLoaderDomainRegistry domainRegistry;
    
    static
    {
@@ -160,10 +164,21 @@
             domain = createScopedClassLoaderDomainParentLast(domainName);
          }
       }
-      MockClassLoaderPolicy policy = MockClassLoaderHelper.createMockClassLoaderPolicy("A");
+      MockClassLoadingMetaData metaData = createClassLoadingMetaData(name);
+      metaData.setDomain(domainName);
+      metaData.setParentDomain(domain.getParentDomainName());
+      metaData.setJ2seClassLoadingCompliance(parentFirst);
+      metaData.setImportAll(importAll);
+      metaData.setPathsAndPackageNames(packages);
+      MockClassLoaderPolicyModule module = new MockClassLoaderPolicyModule(metaData, name);
+      
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+      policy.setImportAll(importAll);
       policy.setPathsAndPackageNames(packages);
       ClassLoader classLoader = createClassLoader(domain, policy);
+
       scopedChildDomainsByLoader.put(classLoader, domain);
+      registerModule(classLoader, module);
       return classLoader;
    }
    
@@ -222,8 +237,72 @@
       }
    }
    
-   /////////////////////////////////////////////////////////
-   // These are lifted from AOPIntegrationTest
+   protected MockClassLoadingMetaData createClassLoadingMetaData(String name)
+   {
+      MockClassLoadingMetaData metaData = new MockClassLoadingMetaData(name);
+      //These should always be set
+      metaData.setBlackListable(true);
+      metaData.setCacheable(true);
+      //Default to the test domain
+      metaData.setDomain(helper.getDomain().getName());
+      metaData.setParentDomain(helper.getDomain().getParentDomainName());
+      return metaData;
+   }
+   
+   protected MockClassLoadingMetaData createClassLoadingMetaDataFromPolicy(MockClassLoaderPolicy policy)
+   {
+      MockClassLoadingMetaData metaData = createClassLoadingMetaData(policy.getName());
+      metaData.setImportAll(policy.isImportAll());
+      metaData.setPathsAndPackageNames(policy.getPackageNames());
+      //TODO should set more OSGi stuff in metaData here
+      return metaData;
+   }
+   
+   protected void registerModule(ClassLoader loader, MockClassLoaderPolicyModule module)
+   {
+      if (helper.getSystem() != domainRegistry.getSystem())
+      {
+         domainRegistry.setSystem(helper.getSystem());
+      }
+      //Add the hard reference to the Module since the registry's reference is weak
+      //In the real workd this would be maintained by the deployers
+      modules.add(module);
+      //TODO I have just hacked the domain and the parentUnitLoader here so this might cause problems
+      //with the tests if we try to do weaving. However, it should be fine while just testing pools
+      //and loaders
+      domainRegistry.initMapsForLoader(loader, module, null, null);
+   }
+   
+   protected void unregisterModule(ClassLoader loader)
+   {
+      //Remove the hard reference to the Module
+      modules.remove(domainRegistry.getModule(loader));
+      
+      domainRegistry.cleanupLoader(loader);
+   }
+   
+   protected void assertModule(ClassLoader loader)
+   {
+      ClassLoaderSystem system = helper.getSystem();
+      ClassLoaderDomain domainForLoader = scopedChildDomainsByLoader.get(loader);
+      if (domainForLoader == null)
+      {
+         domainForLoader = helper.getDomain();
+      }
+      assertNotNull(domainForLoader);
+      
+      ClassLoaderDomain domainForModule = domainRegistry.getClassLoaderDomainForLoader(loader);
+      assertNotNull(domainForModule);
+      assertSame(domainForLoader, domainForModule);
+      
+      Module module = domainRegistry.getModule(loader);
+      assertNotNull(module);
+      assertEquals(domainForModule.getName(), module.getDomainName());
+      assertEquals(domainForModule.getParentDomainName(), module.getParentDomainName());
+   }
+   
+   ////////////////////////////////////////////////////////////////////////
+   // These are lifted from AOPIntegrationTest, but have some modifications
    /**
     * Create a classloader
     * 
@@ -235,9 +314,18 @@
     * @return the classloader
     * @throws Exception for any error
     */
-   protected static ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
+   protected ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
    {
-      return helper.createClassLoader(name, importAll, packages);
+      MockClassLoadingMetaData metaData = createClassLoadingMetaData(name);
+      metaData.setImportAll(importAll);
+      metaData.setPathsAndPackageNames(packages);
+      metaData.setDomain(helper.getDomain().getName());
+      TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, name);
+      
+      ClassLoader loader = helper.createClassLoader(name, importAll, packages); 
+      registerModule(loader, module);
+      
+      return loader;
    }
    
    /**
@@ -251,9 +339,14 @@
     * @return the classloader
     * @throws Exception for any error
     */
-   protected static ClassLoader createClassLoaderInDomain(MockClassLoaderPolicy policy) throws Exception
+   protected ClassLoader createClassLoader(MockClassLoaderPolicy policy) throws Exception
    {
-      return helper.createClassLoader(policy);
+      MockClassLoadingMetaData metaData = createClassLoadingMetaDataFromPolicy(policy);
+      TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, policy.getName());
+      
+      ClassLoader loader = helper.createClassLoader(policy);
+      registerModule(loader, module);
+      return loader;
    }
    
    /**
@@ -290,7 +383,14 @@
     */
    public ClassLoader createClassLoader(ClassLoaderDomain domain, MockClassLoaderPolicy policy) throws Exception
    {
-      return helper.createClassLoader(domain, policy);
+      MockClassLoadingMetaData metaData = createClassLoadingMetaDataFromPolicy(policy);
+      metaData.setDomain(domain.getName());
+      metaData.setParentDomain(domain.getParentDomainName());
+      TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, policy.getName());
+      
+      ClassLoader loader = helper.createClassLoader(domain, policy);
+      registerModule(loader, module);
+      return loader;
    }
 
    /**
@@ -299,8 +399,9 @@
     * @param classLoader the classloader
     * @throws Exception for any error
     */
-   protected static void unregisterClassLoader(ClassLoader classLoader) throws Exception
+   protected void unregisterClassLoader(ClassLoader classLoader) throws Exception
    {
+      unregisterModule(classLoader);
       helper.unregisterClassLoader(classLoader);
    }
 




More information about the jboss-cvs-commits mailing list