[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