[jboss-cvs] JBossAS SVN: r73804 - in projects/jboss-deployers/trunk/deployers-impl/src: tests/org/jboss/test/deployers/classloading/test and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu May 29 11:03:02 EDT 2008


Author: adrian at jboss.org
Date: 2008-05-29 11:03:02 -0400 (Thu, 29 May 2008)
New Revision: 73804

Modified:
   projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractClassLoaderDescribeDeployer.java
   projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractLevelClassLoaderSystemDeployer.java
   projects/jboss-deployers/trunk/deployers-impl/src/tests/org/jboss/test/deployers/classloading/test/SubDeploymentMockClassLoaderUnitTestCase.java
Log:
[JBDEPLOY-40] - Allow a subdeployment classloader to become a top level classloader

Modified: projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractClassLoaderDescribeDeployer.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractClassLoaderDescribeDeployer.java	2008-05-29 14:48:33 UTC (rev 73803)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractClassLoaderDescribeDeployer.java	2008-05-29 15:03:02 UTC (rev 73804)
@@ -91,7 +91,16 @@
          
          // For non top level classloaders, we need to control the domain
          // since the parent is the deployment classloader
-         deployment.setDomain(unit.getName());
+         String unitName = unit.getName();
+         if (deployment.getParentDomain() == null)
+         {
+            deployment.setDomain(unitName);
+            log.debug("Will use synthetic domain for classloader of subdeployment: " + unitName);
+         }
+         else
+         {
+            log.debug("Will create top level classloader for subdeployment: " + unitName);
+         }
       }
       
       // Create the module

Modified: projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractLevelClassLoaderSystemDeployer.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractLevelClassLoaderSystemDeployer.java	2008-05-29 14:48:33 UTC (rev 73803)
+++ projects/jboss-deployers/trunk/deployers-impl/src/main/org/jboss/deployers/plugins/classloading/AbstractLevelClassLoaderSystemDeployer.java	2008-05-29 15:03:02 UTC (rev 73804)
@@ -114,7 +114,7 @@
          throw new IllegalStateException("Module is not an instance of " + ClassLoaderPolicyModule.class.getName() + " actual=" + module.getClass().getName());
       ClassLoaderPolicyModule classLoaderPolicyModule = (ClassLoaderPolicyModule) module;
 
-      if (unit.isTopLevel())
+      if (unit.isTopLevel() || module.getParentDomainName() != null)
       {
          // Top level, just create the classloader
          return classLoaderPolicyModule.registerClassLoaderPolicy(system);

Modified: projects/jboss-deployers/trunk/deployers-impl/src/tests/org/jboss/test/deployers/classloading/test/SubDeploymentMockClassLoaderUnitTestCase.java
===================================================================
--- projects/jboss-deployers/trunk/deployers-impl/src/tests/org/jboss/test/deployers/classloading/test/SubDeploymentMockClassLoaderUnitTestCase.java	2008-05-29 14:48:33 UTC (rev 73803)
+++ projects/jboss-deployers/trunk/deployers-impl/src/tests/org/jboss/test/deployers/classloading/test/SubDeploymentMockClassLoaderUnitTestCase.java	2008-05-29 15:03:02 UTC (rev 73804)
@@ -28,6 +28,7 @@
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloading.spi.metadata.ClassLoadingMetaData;
 import org.jboss.deployers.client.spi.DeployerClient;
 import org.jboss.deployers.client.spi.Deployment;
@@ -78,7 +79,7 @@
       assertNoDomain("top/sub");
    }
 
-   public void testSubDeploymentClassLoader() throws Exception
+   public void testSubDeploymentClassLoaderSynthetic() throws Exception
    {
       DeployerClient deployer = getMainDeployer();
 
@@ -110,6 +111,78 @@
       assertEquals(Arrays.asList("top/sub", "top"), deployer2.undeployed);
    }
 
+   public void testSubDeploymentClassLoaderSpecifiedDefaultDomain() throws Exception
+   {
+      DeployerClient deployer = getMainDeployer();
+
+      Deployment deployment = createSimpleDeployment("top");
+      ClassLoadingMetaData top = addClassLoadingMetaData(deployment, "top", null, A.class);
+      top.setImportAll(true);
+      
+      ContextInfo sub = addChild(deployment, "sub");
+      ClassLoadingMetaData topSub = addClassLoadingMetaData(sub, "top/sub", null, false, B.class);
+      topSub.setDomain(ClassLoaderSystem.DEFAULT_DOMAIN_NAME);
+      topSub.setParentDomain(ClassLoaderSystem.DEFAULT_DOMAIN_NAME);
+      topSub.setImportAll(true);
+      
+      DeploymentUnit unit = assertDeploy(deployer, deployment);
+      
+      assertEquals(Arrays.asList("top", "top/sub"), deployer2.deployed);
+      assertEquals(NONE, deployer2.undeployed);
+      
+      ClassLoader cl = unit.getClassLoader();
+      
+      DeploymentUnit subDeployment = assertChild(unit, "top/sub");
+      ClassLoader clSub = subDeployment.getClassLoader();
+
+      assertLoadClass(cl, A.class);
+      assertLoadClass(cl, B.class, clSub);
+      assertLoadClass(clSub, A.class, cl);
+      assertLoadClass(clSub, B.class);
+      
+      assertUndeploy(deployer, deployment);
+      assertNoDomain("top/sub");
+
+      assertEquals(Arrays.asList("top", "top/sub"), deployer2.deployed);
+      assertEquals(Arrays.asList("top/sub", "top"), deployer2.undeployed);
+   }
+
+   public void testSubDeploymentClassLoaderSpecifiedOtherDomain() throws Exception
+   {
+      DeployerClient deployer = getMainDeployer();
+
+      Deployment deployment = createSimpleDeployment("top");
+      ClassLoadingMetaData top = addClassLoadingMetaData(deployment, "top", null, A.class);
+      top.setImportAll(true);
+      
+      ContextInfo sub = addChild(deployment, "sub");
+      ClassLoadingMetaData topSub = addClassLoadingMetaData(sub, "top/sub", null, false, B.class);
+      topSub.setDomain("TestDomain");
+      topSub.setParentDomain(ClassLoaderSystem.DEFAULT_DOMAIN_NAME);
+      topSub.setImportAll(true);
+      
+      DeploymentUnit unit = assertDeploy(deployer, deployment);
+      assertDomain("TestDomain");
+      
+      assertEquals(Arrays.asList("top", "top/sub"), deployer2.deployed);
+      assertEquals(NONE, deployer2.undeployed);
+      
+      ClassLoader cl = unit.getClassLoader();
+      assertLoadClass(cl, A.class);
+      assertLoadClassFail(cl, B.class);
+      
+      DeploymentUnit subDeployment = assertChild(unit, "top/sub");
+      ClassLoader clSub = subDeployment.getClassLoader();
+      assertLoadClass(clSub, A.class, cl);
+      assertLoadClass(clSub, B.class);
+      
+      assertUndeploy(deployer, deployment);
+      assertNoDomain("top/sub");
+
+      assertEquals(Arrays.asList("top", "top/sub"), deployer2.deployed);
+      assertEquals(Arrays.asList("top/sub", "top"), deployer2.undeployed);
+   }
+
    public void testMultipleSubDeploymentClassLoader() throws Exception
    {
       DeployerClient deployer = getMainDeployer();
@@ -178,6 +251,51 @@
       assertEquals(Arrays.asList("top", "top/sub"), deployer2.deployed);
       assertEquals(Arrays.asList("top/sub", "top"), deployer2.undeployed);
    }
+
+   public void testMultipleSubDeploymentClassLoaderSpecifiedDomain() throws Exception
+   {
+      DeployerClient deployer = getMainDeployer();
+
+      Deployment deployment = createSimpleDeployment("top");
+      addClassLoadingMetaData(deployment, "top", null);
+      
+      ContextInfo sub1 = addChild(deployment, "sub1");
+      ClassLoadingMetaData topSub1 = addClassLoadingMetaData(sub1, "top/sub1", null, A.class);
+      topSub1.setDomain("TestDomain");
+      topSub1.setParentDomain(ClassLoaderSystem.DEFAULT_DOMAIN_NAME);
+      topSub1.setImportAll(true);
+      
+      ContextInfo sub2 = addChild(deployment, "sub2");
+      ClassLoadingMetaData topSub2 = addClassLoadingMetaData(sub2, "top/sub2", null, B.class);
+      topSub2.setDomain("TestDomain");
+      topSub2.setParentDomain(ClassLoaderSystem.DEFAULT_DOMAIN_NAME);
+      topSub2.setImportAll(true);
+      
+      DeploymentUnit unit = assertDeploy(deployer, deployment);
+      assertDomain("TestDomain");
+
+      ClassLoader cl = unit.getClassLoader();
+      assertLoadClassFail(cl, A.class);
+      assertLoadClassFail(cl, B.class);
+      
+      DeploymentUnit subDeployment1 = assertChild(unit, "top/sub1");
+      ClassLoader clSub1 = subDeployment1.getClassLoader();
+      DeploymentUnit subDeployment2 = assertChild(unit, "top/sub2");
+      ClassLoader clSub2 = subDeployment2.getClassLoader();
+
+      Class<?> aFrom1 = assertLoadClass(clSub1, A.class);
+      Class<?> bFrom1 = assertLoadClass(clSub1, B.class, clSub2);
+      
+      Class<?> aFrom2 = assertLoadClass(clSub2, A.class, clSub1);
+      Class<?> bFrom2 = assertLoadClass(clSub2, B.class);
+      
+      assertNotSame(clSub1, clSub2);
+      assertSame(aFrom1, aFrom2);
+      assertSame(bFrom1, bFrom2);
+      
+      assertUndeploy(deployer, deployment);
+      assertNoDomain("TopDomain");
+   }
    
    protected DeploymentUnit assertChild(DeploymentUnit parent, String name)
    {




More information about the jboss-cvs-commits mailing list