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

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Nov 6 16:32:26 EST 2008


Author: kabir.khan at jboss.com
Date: 2008-11-06 16:32:26 -0500 (Thu, 06 Nov 2008)
New Revision: 80618

Added:
   projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java
   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/JBossClDelegatingClassPool.java
   projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/support/TestMockClassLoaderPolicyModule.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
   projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTestDelegate.java
Modified:
   projects/aop/trunk/asintegration-mc/.classpath
   projects/aop/trunk/asintegration-mc/pom.xml
Log:
[JBAOP-666] Add skeleton tests and skeleton classpool, domain and factory

Modified: projects/aop/trunk/asintegration-mc/.classpath
===================================================================
--- projects/aop/trunk/asintegration-mc/.classpath	2008-11-06 21:04:49 UTC (rev 80617)
+++ projects/aop/trunk/asintegration-mc/.classpath	2008-11-06 21:32:26 UTC (rev 80618)
@@ -3,7 +3,7 @@
 	<classpathentry excluding="**/*.java" including="jbossorg-eula.txt" kind="src" path="src/etc"/>
 	<classpathentry kind="src" path="src/main"/>
 	<classpathentry excluding="**/*.java" kind="src" output="target/test-classes" path="src/resources/tests"/>
-	<classpathentry excluding="org/jboss/test/aop/classpool/jbosscl/support/" kind="src" output="target/test-classes" path="src/tests"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/tests"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.0.2/activation-1.0.2.jar"/>
 	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>

Modified: projects/aop/trunk/asintegration-mc/pom.xml
===================================================================
--- projects/aop/trunk/asintegration-mc/pom.xml	2008-11-06 21:04:49 UTC (rev 80617)
+++ projects/aop/trunk/asintegration-mc/pom.xml	2008-11-06 21:32:26 UTC (rev 80618)
@@ -51,9 +51,11 @@
         <configuration>
           <excludes>
             <exclude>org/jboss/aop/junit/**</exclude>
+            <!--             
             <exclude>org/jboss/test/aop/classpool/jbosscl/support/a/A.class</exclude>
             <exclude>org/jboss/test/aop/classpool/jbosscl/support/b/B.class</exclude>
             <exclude>org/jboss/test/aop/classpool/jbosscl/support/c/C.class</exclude>
+            -->
           </excludes>
         </configuration>
       </plugin>
@@ -79,6 +81,7 @@
           </systemProperties>
         </configuration>
       </plugin>
+<!--    
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
@@ -164,6 +167,7 @@
           </execution>
         </executions>
       </plugin>
+-->
     </plugins>
   </build>
   

Added: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolDomain.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,38 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.aop.classpool.jbosscl;
+
+import org.jboss.aop.classpool.ClassPoolDomain;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class JBossClClassPoolDomain extends ClassPoolDomain
+{
+   public JBossClClassPoolDomain(String domainName, ClassPoolDomain parent)
+   {
+      // FIXME JBossClClassPool constructor
+      super(domainName, parent);
+   }
+}

Added: 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	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,118 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.aop.classpool.jbosscl;
+
+import java.net.URL;
+
+import javassist.ClassPool;
+import javassist.scopedpool.ScopedClassPool;
+import javassist.scopedpool.ScopedClassPoolFactory;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.aop.asintegration.jboss5.DomainRegistry;
+import org.jboss.aop.classpool.AbstractJBossClassPoolFactory;
+import org.jboss.aop.classpool.ClassPoolDomain;
+import org.jboss.aop.classpool.ClassPoolDomainRegistry;
+import org.jboss.aop.classpool.NonDelegatingClassPool;
+import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
+import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloading.spi.RealClassLoader;
+import org.jboss.classloading.spi.dependency.Module;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class JBossClClassPoolFactory extends AbstractJBossClassPoolFactory implements ScopedClassPoolFactory
+{
+   private DomainRegistry registry;
+   
+   public JBossClClassPoolFactory(DomainRegistry registry)
+   {
+      this.registry = registry;
+   }
+   
+   public ScopedClassPool create(ClassLoader cl, ClassPool src, ScopedClassPoolRepository repository)
+   {
+      ClassPool parent = getCreateParentClassPools(cl, src, repository);
+
+      if (cl instanceof RealClassLoader)
+      {
+         Module module = registry.getModule(cl);
+         ClassPoolDomain domain = getDomain(module, cl);  
+         return new JBossClDelegatingClassPool(domain, cl, parent, repository, getTempURL(module));
+      }
+      
+      return new NonDelegatingClassPool(cl, parent, repository, true);
+   }
+
+   private ClassPoolDomain getDomain(Module module, ClassLoader cl)
+   {
+      ClassLoaderDomain domain = null;
+      ClassLoaderSystem sys = ClassLoaderSystem.getInstance();
+      if (module != null && module.getDeterminedParentDomainName() != null)
+      {
+         //It is scoped
+         domain = sys.getDomain(module.getDeterminedDomainName());
+      }
+      
+      if (domain == null)
+      {
+         domain = sys.getDefaultDomain();
+      }
+      
+      ClassPoolDomain poolDomain = ClassPoolDomainRegistry.getInstance().getDomain(domain);
+      if (poolDomain == null)
+      {
+         String parentDomainName = domain.getParentDomainName();
+         ClassPoolDomain parentPoolDomain = null;
+         if (parentDomainName != null)
+         {
+            ClassLoaderDomain parentDomain = sys.getDomain(parentDomainName);
+            if (parentDomain == null)
+            {
+               throw new RuntimeException("No domain found called: " + parentDomainName);
+            }
+            parentPoolDomain = ClassPoolDomainRegistry.getInstance().getDomain(parentDomain);
+         }
+         poolDomain = new ClassPoolDomain(domain.getName(), parentPoolDomain);
+         
+         //The determination of parentFirst/-Last might need revisiting
+         poolDomain.setParentFirst(domain.getParentPolicy() == ParentPolicy.BEFORE);
+         
+         ClassPoolDomainRegistry.getInstance().addClassPoolDomain(domain, poolDomain);
+      }
+      return poolDomain;
+   }
+   
+
+   private URL getTempURL(Module module)
+   {
+      if (module == null)
+         return null;
+      
+      return module.getDynamicClassRoot();
+   }
+
+}

Added: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClDelegatingClassPool.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,104 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.aop.classpool.jbosscl;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+import java.security.ProtectionDomain;
+
+import javassist.CannotCompileException;
+import javassist.ClassPool;
+import javassist.CtClass;
+import javassist.scopedpool.ScopedClassPoolRepository;
+
+import org.jboss.aop.classpool.ClassPoolDomain;
+import org.jboss.aop.classpool.DelegatingClassPool;
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.virtual.plugins.context.memory.MemoryContextFactory;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class JBossClDelegatingClassPool extends DelegatingClassPool
+{
+   URL tempURL;
+   // For loadClass tmpdir creation for UCL
+   protected final Object tmplock = new Object();
+
+   protected JBossClDelegatingClassPool(ClassPoolDomain domain, ClassLoader cl, ClassPool parent,
+         ScopedClassPoolRepository repository, URL tmpURL)
+   {
+      super(domain, cl, parent, repository);
+      this.tempURL = tmpURL;
+   }
+
+   //Copied from JBoss5ClassPool
+   public Class<?> toClass(CtClass cc, ClassLoader loader, ProtectionDomain domain) throws CannotCompileException
+   {
+      lockInCache(cc);
+      final ClassLoader myloader = getClassLoader();
+      if (myloader == null || tempURL == null)
+      {
+         return super.toClass(cc, loader, domain);
+      }
+      
+      try
+      {
+         String classFileName = getResourceName(cc.getName());
+         URL outputURL = new URL(tempURL.toString() + "/" + classFileName);
+         //Write the classfile to the temporary url
+         synchronized (tmplock)
+         {
+            ByteArrayOutputStream byteout = new ByteArrayOutputStream();
+            BufferedOutputStream out = new BufferedOutputStream(byteout);
+            out.write(cc.toBytecode());
+            out.flush();
+            out.close();
+            
+            byte[] classBytes = byteout.toByteArray();
+            MemoryContextFactory factory = MemoryContextFactory.getInstance();
+            factory.putFile(outputURL, classBytes);
+
+            if (myloader instanceof BaseClassLoader)
+            {
+               //Update check to RealClassLoader once integration project catches up
+               ((BaseClassLoader)myloader).clearBlackList(classFileName);
+               
+            }
+            
+            Class<?> clazz = myloader.loadClass(cc.getName());
+
+            return clazz;
+         }
+      }
+      catch(Exception e)
+      {
+       ClassFormatError cfe = new ClassFormatError("Failed to load dyn class: " + cc.getName() + " on " + this + " loader:" + myloader);
+       cfe.initCause(e);
+       throw cfe;
+      }
+   }
+
+}

Added: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/support/TestMockClassLoaderPolicyModule.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/support/TestMockClassLoaderPolicyModule.java	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/support/TestMockClassLoaderPolicyModule.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,73 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.aop.classpool.jbosscl.support;
+
+import java.io.File;
+import java.net.URL;
+
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoaderPolicyModule;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class TestMockClassLoaderPolicyModule extends MockClassLoaderPolicyModule
+{
+   private static final long serialVersionUID = 1;
+   
+   /** In AS we need a URL to create the temporary files */
+   URL dynamicClassRoot;
+
+   public TestMockClassLoaderPolicyModule(MockClassLoadingMetaData classLoadingMetaData, String contextName)
+   {
+      // FIXME TesetMockClassLoaderPolicyModule constructor
+      super(classLoadingMetaData, contextName);
+   }
+
+   @Override
+   public synchronized URL getDynamicClassRoot()
+   {
+      if (dynamicClassRoot == null)
+      {
+         try
+         {
+            File tempdir = File.createTempFile("ucl", "", new File("."));
+            tempdir.delete();
+            tempdir.mkdir();
+            tempdir.deleteOnExit();
+
+            dynamicClassRoot = tempdir.toURL();
+         }
+         catch (Exception e)
+         {
+            // AutoGenerated
+            throw new RuntimeException(e);
+         }
+      }
+
+      return dynamicClassRoot;
+   }
+
+   
+}

Added: 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	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,371 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.aop.classpool.jbosscl.test;
+
+import junit.framework.Test;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+
+/**
+ * Tests the behaviour of the new classloaders
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class ClassLoaderWithRepositorySanityTestCase extends JBossClClassPoolTest
+{
+
+   public ClassLoaderWithRepositorySanityTestCase(String name)
+   {
+      super(name);
+   }
+
+   public static Test suite()
+   {
+      return suite(ClassLoaderWithRepositorySanityTestCase.class);
+   }
+
+   public void testGlobalScope() throws Exception
+   {
+      ClassLoader clA = null;
+      ClassLoader clB = null;
+      try
+      {
+         clA = createClassLoader("A", true, PACKAGE_A);
+         clB = createClassLoader("B", true, PACKAGE_B);
+         try
+         {
+            Class<?> aFromA = clA.loadClass(CLASS_A);
+            assertNotNull(aFromA);
+            Class<?> bFromA = clA.loadClass(CLASS_B);
+            assertNotNull(bFromA);
+            Class<?> aFromB = clB.loadClass(CLASS_A);
+            Class<?> bFromB = clB.loadClass(CLASS_B);
+            assertSame(aFromA, aFromB);
+            assertSame(bFromA, bFromB);
+            assertSame(clA, aFromA.getClassLoader());
+            assertSame(clB, bFromB.getClassLoader());
+         }
+         finally
+         {
+            unregisterClassLoader(clB);
+         }
+         Class<?> aFromA = clA.loadClass(CLASS_A);
+         assertNotNull(aFromA);
+
+         assertCannotLoadClass(clA, CLASS_B);
+      }
+      finally
+      {
+         unregisterClassLoader(clA);
+      }
+      assertCannotLoadClass(helper.getDomain(), CLASS_A);
+   }
+
+   public void testChildDomain() throws Exception
+   {
+      ClassLoader clA = null;
+      ClassLoader clB = null;
+      ClassLoaderDomain childDomain = null;
+      ClassLoader clC = null;
+      try
+      {
+         clA = createClassLoader("A", true, PACKAGE_A);
+         clB = createClassLoader("B", true, PACKAGE_B);
+         clC = createChildDomainParentFirstClassLoader("C", "CHILD", true, PACKAGE_C);
+         
+         childDomain = getChildDomainForLoader(clC);
+         assertNotNull(childDomain);
+         assertSame(helper.getDomain(), childDomain.getParent());
+
+         Class<?> aFromA = clA.loadClass(CLASS_A);
+         assertNotNull(aFromA);
+         Class<?> bFromB = clB.loadClass(CLASS_B);
+         assertNotNull(bFromB);
+         Class<?> cFromC = clC.loadClass(CLASS_C);
+         assertNotNull(cFromC);
+         Class<?> aFromC = clC.loadClass(CLASS_A);
+         assertNotNull(aFromC);
+         Class<?> bFromC = clC.loadClass(CLASS_B);
+         assertNotNull(bFromC);
+         
+         assertSame(aFromA, aFromC);
+         assertSame(bFromB, bFromC);
+         assertSame(clA, aFromA.getClassLoader());
+         assertSame(clB, bFromB.getClassLoader());
+         assertSame(clC, cFromC.getClassLoader());
+         
+         assertCannotLoadClass(clA, CLASS_C);
+         assertCannotLoadClass(clB, CLASS_C);
+      }
+      finally
+      {
+         unregisterClassLoader(clA);
+         unregisterClassLoader(clB);
+         unregisterClassLoader(clC);
+         unregisterDomain(childDomain.getName());
+      }
+   }
+   
+   public void testSiblingDomains() throws Exception
+   {
+      ClassLoader clA = null;
+      ClassLoader clB = null;
+      ClassLoaderDomain domainA = null;
+      ClassLoaderDomain domainB = null;
+      try
+      {
+         clA = createChildDomainParentFirstClassLoader("A", "ChildA", true, PACKAGE_A);
+         clB = createChildDomainParentLastClassLoader("B", "ChildB", true, PACKAGE_B);
+         
+         domainA = getChildDomainForLoader(clA);
+         assertNotNull(domainA);
+         assertSame(helper.getDomain(), domainA.getParent());
+         domainB = getChildDomainForLoader(clB);
+         assertNotNull(domainB);
+         assertSame(helper.getDomain(), domainB.getParent());
+         assertNotSame(domainA, domainB);
+
+         Class<?> clazzA = clA.loadClass(CLASS_A);
+         assertSame(clA, clazzA.getClassLoader());
+         Class<?> clazzB = clB.loadClass(CLASS_B);
+         assertSame(clB, clazzB.getClassLoader());
+         assertCannotLoadClass(clA, CLASS_B);
+         assertCannotLoadClass(clB, CLASS_A);
+      }
+      finally
+      {
+         unregisterClassLoader(clA);
+         unregisterClassLoader(clB);
+         unregisterDomain(domainA);
+         unregisterDomain(domainB);
+      }
+   }
+   
+   public void testChildWithNewClassesInParent() throws Exception
+   {
+      ClassLoader clGlobal = null;
+      ClassLoader clScoped = null;
+      try
+      {
+         clScoped = createChildDomainParentFirstClassLoader("SCOPED", "SCOPED", true, PACKAGE_B);
+         assertCannotLoadClass(clScoped, CLASS_A);
+         
+         clGlobal = createClassLoader("GLOBAL", true, PACKAGE_A);
+         Class<?> aFromChild = clScoped.loadClass(CLASS_A);
+         assertNotNull(aFromChild);
+         Class<?> aFromParent = clGlobal.loadClass(CLASS_A);
+         assertNotNull(aFromParent);
+         assertSame(aFromChild, aFromParent);
+         assertSame(clGlobal, aFromParent.getClassLoader());
+      }
+      finally
+      {
+         unregisterClassLoader(clGlobal);
+         unregisterClassLoader(clScoped);
+         unregisterDomain(getChildDomainForLoader(clScoped));
+      }
+   }
+   
+   public void testChildOverrideWithParentDelegation() throws Exception
+   {
+      ClassLoader clGlobal = null;
+      ClassLoader clScoped = null;
+      try
+      {
+         clGlobal = createClassLoader("GLOBAL", true, PACKAGE_A);
+         clScoped = createChildDomainParentFirstClassLoader("SCOPED", "SCOPED", true, PACKAGE_B);
+         Class<?> aFromParent = clGlobal.loadClass(CLASS_A);
+         assertNotNull(aFromParent);
+         Class<?> aFromChild = clScoped.loadClass(CLASS_A);
+         assertNotNull(aFromChild);
+         assertSame(aFromParent, aFromChild);
+         assertSame(clGlobal, aFromParent.getClassLoader());
+      }
+      finally
+      {
+         unregisterClassLoader(clGlobal);
+         unregisterClassLoader(clScoped);
+         unregisterDomain(getChildDomainForLoader(clScoped));
+      }
+   }
+
+   public void testReminder() 
+   {
+      //This is a reminder that the commented tests further down need porting to jboss-cl
+      //The tests in this class are originally from UclClassLoaderSanityTestCase
+      fail("Remaining tests need to be ported to jboss cl. See comment in code :-)");
+   }
+   
+//   public void testChildOverrideWithNoParentDelegation() throws Exception
+//   {
+//      ClassLoader clGlobal = null;
+//      try
+//      {
+//         clGlobal = createGlobalClassLoader(JAR_A_1);
+//         ClassLoader clScoped = createChildClassLoader(JAR_A_2, false);
+//         Class<?> aFromParent = clGlobal.loadClass(CLASS_A);
+//         assertNotNull(aFromParent);
+//         Class<?> aFromChild = clScoped.loadClass(CLASS_A);
+//         assertNotNull(aFromChild);
+//         assertNotSame(aFromParent, aFromChild);
+//         assertSame(clGlobal, aFromParent.getClassLoader());
+//         assertSame(clScoped, aFromChild.getClassLoader());
+//      }
+//      finally
+//      {
+//         removeClassLoaderFromRepository(clGlobal);
+//      }
+//   }
+//   
+//   public void testURLChildOfGlobalUcl() throws Exception
+//   {
+//      ClassLoader clGlobal = null;
+//      try
+//      {
+//         clGlobal = createGlobalClassLoader(JAR_A_1);
+//         ClassLoader clChildA = createChildURLClassLoader(clGlobal, JAR_B_1);
+//         
+//         Class<?> aFromA = clChildA.loadClass(CLASS_A);
+//         assertSame(clGlobal, aFromA.getClassLoader());
+//         Class<?> bFromA = clChildA.loadClass(CLASS_B);
+//         assertSame(clChildA, bFromA.getClassLoader());
+//         
+//         ClassLoader clChildB = createChildURLClassLoader(clGlobal, JAR_A_2);
+//         Class<?> aFromB = clChildB.loadClass(CLASS_A);
+//         assertSame(clGlobal, aFromB.getClassLoader());
+//      }
+//      finally
+//      {
+//         removeClassLoaderFromRepository(clGlobal);
+//      }
+//   }
+//   
+//   public void testUndeploySibling() throws Exception
+//   {
+//      ClassLoader clA = null;
+//      ClassLoader clB = null;
+//      try
+//      {
+//         try
+//         {
+//            clA = createGlobalClassLoader(JAR_A_1);
+//            assertCannotLoadClass(clA, CLASS_B);
+//            
+//            clB = createGlobalClassLoader(JAR_B_1);
+//            Class<?> bFromA = clA.loadClass(CLASS_B);
+//            assertSame(clB, bFromA.getClassLoader());
+//         }
+//         finally
+//         {
+//            removeClassLoaderFromRepository(clB);
+//         }
+//         assertCannotLoadClass(clA, CLASS_B);
+//      }
+//      finally
+//      {
+//         removeClassLoaderFromRepository(clA);
+//      }
+//   }
+//
+//   
+////   public void testUndeployParentDomainClassLoader() throws Exception
+////   {
+////      ClassLoader globalA = null;
+////      ClassLoader globalB = null;
+////      ClassLoader child = null;
+////      try
+////      {
+////         try
+////         {
+////            globalA = createGlobalClassLoader(JAR_A_1);
+////            assertCannotLoadClass(globalA, CLASS_B);
+////            
+////            child = createChildClassLoader(JAR_C_1, true);
+////            assertCannotLoadClass(child, CLASS_B);
+////            
+////            globalB = createGlobalClassLoader(JAR_B_1);
+////            Class<?> bFromChild = child.loadClass(CLASS_B);
+////            Class<?> bFromA = globalA.loadClass(CLASS_B);
+////            assertSame(globalB, bFromA.getClassLoader());
+////            assertSame(bFromA, bFromChild);
+////         }
+////         finally
+////         {
+////            removeClassLoaderFromRepository(globalB);
+////         }
+////         assertCannotLoadClass(child, CLASS_B);
+////      }
+////      finally
+////      {
+////         removeClassLoaderFromRepository(globalA);
+////      }
+////   }
+//   
+//   public void testUclWithParentClassLoader() throws Exception
+//   {
+//      ClassLoader parent = createChildURLClassLoader(null, JAR_B_1);
+//      ClassLoader global = null;
+//      try
+//      {
+//         global = createGlobalClassLoaderWithParent(JAR_A_1, parent);
+//         Class<?> aFromGlobal = global.loadClass(CLASS_A);
+//         assertSame(global, aFromGlobal.getClassLoader());
+//         Class<?> bFromGlobal = global.loadClass(CLASS_B);
+//         assertSame(parent, bFromGlobal.getClassLoader());
+//         Class<?> bFromParent = parent.loadClass(CLASS_B);
+//         assertSame(bFromGlobal, bFromParent);
+//      }
+//      finally
+//      {
+//         removeClassLoaderFromRepository(global);
+//      }
+//   }
+//
+//   
+//   public void testUclWithParentClassLoaderAndSameClassInDomain() throws Exception
+//   {
+//      ClassLoader parent = createChildURLClassLoader(null, JAR_B_1);
+//      ClassLoader globalA = null;
+//      ClassLoader globalB = null;
+//      try
+//      {
+//         globalA = createGlobalClassLoaderWithParent(JAR_A_1, parent);
+//         Class<?> aFromGlobal = globalA.loadClass(CLASS_A);
+//         assertSame(globalA, aFromGlobal.getClassLoader());
+//
+//         globalB = createGlobalClassLoader(JAR_B_2);
+//         Class<?> bFromGlobalA = globalA.loadClass(CLASS_B);
+//         assertSame(globalB, bFromGlobalA.getClassLoader());
+//         Class<?> bFromParent = parent.loadClass(CLASS_B);
+//         assertSame(parent, bFromParent.getClassLoader());
+//         assertNotSame(bFromGlobalA, bFromParent);
+//      }
+//      finally
+//      {
+//         removeClassLoaderFromRepository(globalA);
+//         removeClassLoaderFromRepository(globalB);
+//      }
+//   }
+//
+//
+}

Added: 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	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,339 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.aop.classpool.jbosscl.test;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+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.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.test.AbstractTestCaseWithSetup;
+import org.jboss.test.AbstractTestDelegate;
+
+/**
+ * Base class for testing the new JBoss classloaders
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class JBossClClassPoolTest extends AbstractTestCaseWithSetup
+{
+   //These might not be needed with the new loaders
+//   public final static URL JAR_A_1 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-a1.jar");
+//   public final static URL JAR_A_2 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-a2.jar");
+//   public final static URL JAR_B_1 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-b1.jar");
+//   public final static URL JAR_B_2 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-b2.jar");
+//   public final static URL JAR_C_1 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-c1.jar");
+//   public final static URL JAR_C_2 = getURLRelativeToProjectRoot("target/jboss-aop-asintegration-jmx-test-classpool-c2.jar");
+
+   public static final String PACKAGE_ROOT = "org.jboss.test.aop.classpool.jbosscl.support";
+   public static final String PACKAGE_A = PACKAGE_ROOT + ".a";
+   public static final String PACKAGE_B = PACKAGE_ROOT + ".b";
+   public static final String PACKAGE_C = PACKAGE_ROOT + ".c";
+
+   public final static String CLASS_A = PACKAGE_A + ".A";
+   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>();
+   
+   private Map<ClassLoader, ClassLoaderDomain> scopedChildDomainsByLoader = new WeakHashMap<ClassLoader, ClassLoaderDomain>();
+
+   /** The classloader helper */
+   protected static IsolatedClassLoaderTestHelper helper;
+   protected static DomainRegistry domainRegistry;
+   
+   static
+   {
+      domainRegistry = new VFSClassLoaderDomainRegistry();
+      AspectManager.setClassPoolFactory(new JBossClClassPoolFactory(domainRegistry));
+   }
+
+   
+   public static Test suite(Class<?> clazz)
+   {
+      return suite(clazz, new Class[0]);
+   }
+   
+   public static Test suite(Class<?> clazz, Class<?>... packages)
+   {
+      return suite(clazz, true, packages);
+   }
+   
+   public static Test suite(Class<?> clazz, boolean importAll, Class<?>... packages)
+   {
+      helper = new IsolatedClassLoaderTestHelper();
+      ClassFilter aopFilter = new PatternClassFilter(new String[] { "org\\.jboss\\.aop\\..+", "org\\.jboss\\.metadata\\..+"}, new String[] { "org/jboss/aop/.+", "org/jboss/metadata/.+"}, null);
+      Class<?> newClass = helper.initializeClassLoader(clazz, aopFilter, importAll, packages);
+      return AbstractTestCaseWithSetup.suite(newClass);
+   }
+
+   
+   public JBossClClassPoolTest(String name)
+   {
+      super(name);
+   }
+
+   public static AbstractTestDelegate getDelegate(Class<?> clazz) throws Exception
+   {
+      return new JBossClClassPoolTestDelegate(clazz);
+   }
+   
+   protected static URL getURLRelativeToProjectRoot(String relativePath)
+   {
+      try
+      {
+         URL url = JBossClClassPoolTest.class.getProtectionDomain().getCodeSource().getLocation();
+         String location = url.toString();
+         int index = location.lastIndexOf("/asintegration-mc/") + "/asintegration-mc/".length();
+         location = location.substring(0, index);
+         
+         location = location + relativePath;
+         return new URL(location);
+      }
+      catch (MalformedURLException e)
+      {
+         // AutoGenerated
+         throw new RuntimeException(e);
+      }
+   }
+
+
+   protected ClassLoader createChildDomainParentFirstClassLoader(String name, String domainName, boolean importAll, String... packages) throws Exception
+   {
+      return createChildDomainClassLoader(name, domainName, true, importAll, packages);
+   }
+   
+   protected ClassLoader createChildDomainParentLastClassLoader(String name, String domainName, boolean importAll, String... packages) throws Exception
+   {
+      return createChildDomainClassLoader(name, domainName, false, importAll, packages);
+   }
+   
+   protected ClassLoader createChildDomainClassLoader(String name, String domainName, boolean parentFirst, boolean importAll, String... packages) throws Exception
+   {
+      ClassLoaderDomain domain = helper.getSystem().getDomain(domainName);
+      if (domain == null)
+      {
+         if (parentFirst)
+         {
+            domain = createScopedClassLoaderDomainParentFirst(domainName);
+         }
+         else
+         {
+            domain = createScopedClassLoaderDomainParentLast(domainName);
+         }
+      }
+      MockClassLoaderPolicy policy = MockClassLoaderHelper.createMockClassLoaderPolicy("A");
+      policy.setPathsAndPackageNames(packages);
+      ClassLoader classLoader = createClassLoader(domain, policy);
+      scopedChildDomainsByLoader.put(classLoader, domain);
+      return classLoader;
+   }
+   
+   /**
+    * Here since we cannot access this via the classloading api
+    */
+   protected ClassLoaderDomain getChildDomainForLoader(ClassLoader loader)
+   {
+      return scopedChildDomainsByLoader.get(loader);
+   }
+   
+   public void unregisterDomain(ClassLoaderDomain domain)
+   {
+      if (domain != null)
+      {
+         helper.unregisterDomain(domain.getName());
+      }
+   }
+
+   protected void assertCannotLoadClass(ClassLoader cl, String className)
+   {
+      try
+      {
+         cl.loadClass(className);
+         fail("Should not have been able to load " + className);
+      }
+      catch(Exception expected)
+      {
+      }
+   }
+   
+   protected void assertCannotLoadCtClass(ClassPool pool, String className)
+   {
+      try
+      {
+         pool.get(className);
+      }
+      catch(Exception e)
+      {
+      }
+   }
+   
+   protected void assertCannotLoadClass(ClassLoaderDomain domain, String className)
+   {
+      try
+      {
+         Class<?> clazz = domain.loadClass(className);
+         if (clazz == null)
+         {
+            return;
+         }
+         fail("Should not have been able to load " + className);
+      }
+      catch(Exception expected)
+      {
+      }
+   }
+   
+   /////////////////////////////////////////////////////////
+   // These are lifted from AOPIntegrationTest
+   /**
+    * Create a classloader
+    * 
+    * It exports everything
+    *
+    * @param name the name
+    * @param importAll whether to import all
+    * @param packages the packages
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   protected static ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
+   {
+      return helper.createClassLoader(name, importAll, packages);
+   }
+   
+   /**
+    * Create a classloader
+    * 
+    * It exports everything
+    *
+    * @param name the name
+    * @param importAll whether to import all
+    * @param packages the packages
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   protected static ClassLoader createClassLoaderInDomain(MockClassLoaderPolicy policy) throws Exception
+   {
+      return helper.createClassLoader(policy);
+   }
+   
+   /**
+    * Create a scoped classloader domain using the test domain as parent
+    * using the parent first policy
+    * 
+    * @param name the name
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomainParentFirst(String name)
+   {
+      return helper.createScopedClassLoaderDomainParentFirst(name);
+   }
+
+   /**
+    * Create a scoped classloader domain using the test domain as parent
+    * using the parent last policy
+    * 
+    * @param name the name
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomainParentLast(String name)
+   {
+      return helper.createScopedClassLoaderDomainParentLast(name);
+   }
+
+   /**
+    * Create a classloader
+    *
+    * @param domain the domain
+    * @param policy the policy
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   public ClassLoader createClassLoader(ClassLoaderDomain domain, MockClassLoaderPolicy policy) throws Exception
+   {
+      return helper.createClassLoader(domain, policy);
+   }
+
+   /**
+    * Unregister a classloader
+    * 
+    * @param classLoader the classloader
+    * @throws Exception for any error
+    */
+   protected static void unregisterClassLoader(ClassLoader classLoader) throws Exception
+   {
+      helper.unregisterClassLoader(classLoader);
+   }
+
+   /**
+    * Create the default delegate loader
+    * 
+    * @return the loaders
+    */
+   public List<? extends DelegateLoader> createDefaultDelegates()
+   {
+      return helper.createDefaultDelegates();
+   }
+
+   /**
+    * Create delegate loaders from policies
+    * 
+    * @param policies the policies
+    * @return the loaders
+    */
+   public List<? extends DelegateLoader> createDelegates(ClassLoaderPolicy... policies)
+   {
+      return helper.createDelegates(policies);
+   }
+
+
+   /**
+    * Unregister a domain
+    * 
+    * @param name the domain name
+    */
+   public void unregisterDomain(String name)
+   {
+      helper.unregisterDomain(name);
+   }
+   
+}

Added: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTestDelegate.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTestDelegate.java	                        (rev 0)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTestDelegate.java	2008-11-06 21:32:26 UTC (rev 80618)
@@ -0,0 +1,39 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.test.aop.classpool.jbosscl.test;
+
+import org.jboss.test.AbstractTestDelegate;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class JBossClClassPoolTestDelegate extends AbstractTestDelegate
+{
+
+   public JBossClClassPoolTestDelegate(Class<?> clazz)
+   {
+      super(clazz);
+   }
+
+}




More information about the jboss-cvs-commits mailing list