[jboss-cvs] JBossAS SVN: r82814 - in projects/jboss-cl/branches/Branch_2_0: classloader/src/main/java/org/jboss/classloader/spi/base and 3 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Jan 13 09:42:41 EST 2009
Author: adrian at jboss.org
Date: 2009-01-13 09:42:40 -0500 (Tue, 13 Jan 2009)
New Revision: 82814
Added:
projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderSource.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ModuleClassLoadingUnitTestCase.java
Modified:
projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java
projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoader.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
Log:
[JBCL-78] - Add methods to discover module/classloader for a class
Modified: projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java 2009-01-13 14:42:24 UTC (rev 82813)
+++ projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/plugins/loader/ClassLoaderToLoaderAdapter.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -33,6 +33,7 @@
import java.util.Set;
import org.jboss.classloader.spi.Loader;
+import org.jboss.classloader.spi.base.BaseClassLoaderSource;
import org.jboss.logging.Logger;
/**
@@ -41,14 +42,11 @@
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
*/
-public class ClassLoaderToLoaderAdapter implements Loader
+public class ClassLoaderToLoaderAdapter extends BaseClassLoaderSource implements Loader
{
/** The log */
private static final Logger log = Logger.getLogger(ClassLoaderToLoaderAdapter.class);
- /** The classloader */
- private ClassLoader classLoader;
-
/** The access control context of the creator of this adapter */
private AccessControlContext accessControlContext;
@@ -94,14 +92,13 @@
*/
public ClassLoaderToLoaderAdapter(ClassLoader classLoader)
{
- if (classLoader == null)
- throw new IllegalArgumentException("Null classLoader");
- this.classLoader = classLoader;
+ super(classLoader);
accessControlContext = AccessController.getContext();
}
public URL getResource(final String name)
{
+ final ClassLoader classLoader = getClassLoader();
URL url;
SecurityManager sm = System.getSecurityManager();
if (sm != null)
@@ -132,6 +129,7 @@
public void getResources(final String name, Set<URL> urls) throws IOException
{
+ final ClassLoader classLoader = getClassLoader();
Enumeration<URL> enumeration;
SecurityManager sm = System.getSecurityManager();
if (sm != null)
@@ -168,6 +166,7 @@
public Class<?> loadClass(String className)
{
+ final ClassLoader classLoader = getClassLoader();
try
{
return Class.forName(className, false, classLoader);
@@ -180,6 +179,7 @@
public Package getPackage(String name)
{
+ final ClassLoader classLoader = getClassLoader();
if (getPackage == null)
return null;
@@ -196,6 +196,7 @@
public void getPackages(Set<Package> packages)
{
+ final ClassLoader classLoader = getClassLoader();
if (getPackages == null)
return;
@@ -212,6 +213,6 @@
@Override
public String toString()
{
- return classLoader.toString();
+ return getClassLoader().toString();
}
}
Modified: projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoader.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoader.java 2009-01-13 14:42:24 UTC (rev 82813)
+++ projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoader.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -48,6 +48,7 @@
import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.classloader.spi.ClassLoaderPolicy;
import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.classloader.spi.Loader;
import org.jboss.classloader.spi.PackageInformation;
import org.jboss.classloading.spi.RealClassLoader;
import org.jboss.logging.Logger;
@@ -346,6 +347,42 @@
return result;
}
+ /**
+ * Find the classloader for a class but don't load the class
+ *
+ * @param className the class name
+ * @return the classloader
+ * @throws ClassNotFoundException if the class is not found
+ * @throws IllegalStateException if the classloader is not installed
+ * @throws SecurityException if the called doesn't have the getClassLoader runtime permission
+ */
+ public ClassLoader findClassLoader(String className) throws ClassNotFoundException
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPermission(new RuntimePermission("getClassLoader"));
+
+ BaseClassLoaderPolicy basePolicy = policy;
+ BaseClassLoaderDomain domain = basePolicy.getClassLoaderDomain();
+ if (domain == null)
+ throw new IllegalStateException(this + " classLoader is not connected to a domain (probably undeployed?) for class " + getName());
+
+ ClassLoaderUtils.checkClassName(className);
+ String path = ClassLoaderUtils.classNameToPath(className);
+
+ Loader loader = domain.findLoader(path);
+ if (loader == null)
+ throw new ClassNotFoundException("Class " + className + " not found from " + this);
+
+ // This is a bit ugly but we can't abstract this behind an interface because
+ // that would make the methods public
+ if (loader instanceof BaseClassLoaderSource)
+ return ((BaseClassLoaderSource) loader).getClassLoader();
+ if (loader instanceof BaseDelegateLoader)
+ return ((BaseDelegateLoader) loader).getPolicy().getClassLoader();
+ return null;
+ }
+
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Added: projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderSource.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderSource.java (rev 0)
+++ projects/jboss-cl/branches/Branch_2_0/classloader/src/main/java/org/jboss/classloader/spi/base/BaseClassLoaderSource.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -0,0 +1,56 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2007, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt 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.classloader.spi.base;
+
+/**
+ * BaseClassLoaderSource.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class BaseClassLoaderSource
+{
+ /** The classloader */
+ private ClassLoader classLoader;
+
+ /**
+ * Create a new BaseClassLoaderSource.
+ *
+ * @param classLoader the classloader
+ */
+ public BaseClassLoaderSource(ClassLoader classLoader)
+ {
+ if (classLoader == null)
+ throw new IllegalArgumentException("Null classLoader");
+ this.classLoader = classLoader;
+ }
+
+ /**
+ * Get the classloader
+ *
+ * @return the classloader
+ */
+ protected ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
+}
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-01-13 14:42:24 UTC (rev 82813)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -21,12 +21,18 @@
*/
package org.jboss.classloading.spi.dependency;
+import java.io.IOException;
import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -53,6 +59,9 @@
*/
public abstract class Module extends NameAndVersionSupport
{
+ /** The modules by classloader */
+ private static Map<ClassLoader, Module> modulesByClassLoader = new ConcurrentHashMap<ClassLoader, Module>();
+
/** The context name */
private String contextName;
@@ -73,6 +82,40 @@
/** The requirements */
private List<RequirementDependencyItem> requirementDependencies;
+
+ /**
+ * Register a classloader for a module
+ *
+ * @param module the module
+ * @param classLoader the classloader
+ * @throws IllegalArgumentException for a null parameter
+ */
+ protected static void registerModuleClassLoader(Module module, ClassLoader classLoader)
+ {
+ if (module == null)
+ throw new IllegalArgumentException("Null module");
+ if (classLoader == null)
+ throw new IllegalArgumentException("Null classloader");
+
+ modulesByClassLoader.put(classLoader, module);
+ }
+
+ /**
+ * Register a classloader for a module
+ *
+ * @param module the module
+ * @param classLoader the classloader
+ * @throws IllegalArgumentException for a null parameter
+ */
+ protected static void unregisterModuleClassLoader(Module module, ClassLoader classLoader)
+ {
+ if (module == null)
+ throw new IllegalArgumentException("Null module");
+ if (classLoader == null)
+ throw new IllegalArgumentException("Null classloader");
+
+ modulesByClassLoader.remove(classLoader);
+ }
/**
* Create a new Module with the default version
@@ -314,6 +357,112 @@
}
/**
+ * Find the module that loads a class
+ *
+ * @param className the class name
+ * @return the module or null if the class is not loaded by a registered module classloader
+ * @throws ClassNotFoundException when the class is not found
+ * @throws IllegalStateException when the module is not associated with a classloader
+ */
+ public Module getModuleForClass(String className) throws ClassNotFoundException
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ sm.checkPermission(new RuntimePermission("getClassLoader"));
+
+ ClassLoader cl = getClassLoaderForClass(className);
+
+ // Determine the module (if any) for the classloader
+ if (cl != null)
+ return modulesByClassLoader.get(cl);
+ // Unknown
+ return null;
+ }
+
+ /**
+ * Get the classloader for a class name
+ *
+ * @param className the class name
+ * @return the class
+ * @throws ClassNotFoundException when the class is not found
+ * @throws IllegalStateException when the module is not associated with a classloader
+ */
+ protected ClassLoader getClassLoaderForClass(String className) throws ClassNotFoundException
+ {
+ // Determine the classloader for this class
+ final Class<?> clazz = loadClass(className);
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return clazz.getClassLoader();
+ }
+ });
+ }
+ return clazz.getClassLoader();
+ }
+
+ /**
+ * Load a class for this module
+ *
+ * @param className the class name
+ * @return the class
+ * @throws ClassNotFoundException when the class is not found
+ * @throws IllegalStateException when the module is not associated with a classloader
+ */
+ public Class<?> loadClass(String className) throws ClassNotFoundException
+ {
+ ClassLoader classLoader = getClassLoader();
+ if (classLoader == null)
+ throw new IllegalStateException("No classloader for this module " + this);
+ return classLoader.loadClass(className);
+ }
+
+ /**
+ * Get a resource for this module
+ *
+ * @param resourceName the resource name
+ * @return the class
+ * @throws IllegalStateException when the module is not associated with a classloader
+ */
+ public URL getResource(String resourceName)
+ {
+ ClassLoader classLoader = getClassLoader();
+ if (classLoader == null)
+ throw new IllegalStateException("No classloader for this module " + this);
+ return classLoader.getResource(resourceName);
+ }
+
+ /**
+ * Get resources for this module
+ *
+ * @param resourceName the resource name
+ * @return the class
+ * @throws IOException for an error
+ * @throws IllegalStateException when the module is not associated with a classloader
+ */
+ public Enumeration<URL> getResources(String resourceName) throws IOException
+ {
+ ClassLoader classLoader = getClassLoader();
+ if (classLoader == null)
+ throw new IllegalStateException("No classloader for this module " + this);
+ return classLoader.getResources(resourceName);
+ }
+
+ /**
+ * Get the classloader for this module
+ *
+ * @return the classloader
+ */
+ protected ClassLoader getClassLoader()
+ {
+ return null;
+ }
+
+ /**
* Visit the resources in this module
* using the filter defined on the visitor
*
Modified: projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java 2009-01-13 14:42:24 UTC (rev 82813)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -21,12 +21,17 @@
*/
package org.jboss.classloading.spi.dependency.policy;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+
import org.jboss.classloader.plugins.loader.ClassLoaderToLoaderAdapter;
import org.jboss.classloader.spi.ClassLoaderPolicy;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.DelegateLoader;
import org.jboss.classloader.spi.Loader;
import org.jboss.classloader.spi.ParentPolicy;
+import org.jboss.classloader.spi.base.BaseClassLoader;
import org.jboss.classloader.spi.filter.LazyFilteredDelegateLoader;
import org.jboss.classloading.spi.dependency.Domain;
import org.jboss.classloading.spi.dependency.Module;
@@ -67,7 +72,45 @@
{
super(classLoadingMetaData, contextName);
}
-
+
+ @Override
+ protected ClassLoader getClassLoaderForClass(final String className) throws ClassNotFoundException
+ {
+ if (classLoader == null)
+ throw new IllegalStateException("No classloader for module " + this);
+
+ if (classLoader instanceof BaseClassLoader == false)
+ return super.getClassLoaderForClass(className);
+
+ final BaseClassLoader bcl = (BaseClassLoader) classLoader;
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null)
+ {
+ try
+ {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<ClassLoader>()
+ {
+ public ClassLoader run() throws Exception
+ {
+ return bcl.findClassLoader(className);
+ }
+ });
+ }
+ catch (PrivilegedActionException e)
+ {
+ Throwable t = e.getCause();
+ if (t instanceof ClassNotFoundException)
+ throw (ClassNotFoundException) t;
+ if (t instanceof Error)
+ throw (Error) t;
+ if (t instanceof RuntimeException)
+ throw (RuntimeException) t;
+ throw new RuntimeException("Error during findClassLoader for " + className, e);
+ }
+ }
+ return bcl.findClassLoader(className);
+ }
+
/**
* Register the classloader policy with a classloader system
*
@@ -88,6 +131,7 @@
ClassLoader result = system.registerClassLoaderPolicy(domainName, parentPolicy, parentName, getPolicy());
this.system = system;
this.classLoader = result;
+ registerModuleClassLoader(this, result);
return result;
}
@@ -111,6 +155,7 @@
Loader loader = new ClassLoaderToLoaderAdapter(parent);
ClassLoader result = registerClassLoaderPolicy(system, loader);
this.classLoader = result;
+ registerModuleClassLoader(this, result);
return result;
}
@@ -134,6 +179,7 @@
ClassLoader result = system.registerClassLoaderPolicy(domainName, parentPolicy, loader, getPolicy());
this.system = system;
this.classLoader = result;
+ registerModuleClassLoader(this, result);
return result;
}
@@ -154,6 +200,8 @@
{
if (system != null && policy != null)
system.unregisterClassLoaderPolicy(policy);
+ if (classLoader != null)
+ unregisterModuleClassLoader(this, classLoader);
classLoader = null;
system = null;
policy = null;
@@ -165,12 +213,8 @@
* @return the policy
*/
protected abstract ClassLoaderPolicy determinePolicy();
-
- /**
- * Get the classloader
- *
- * @return the classloader
- */
+
+ @Override
protected ClassLoader getClassLoader()
{
return classLoader;
Added: projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ModuleClassLoadingUnitTestCase.java
===================================================================
--- projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ModuleClassLoadingUnitTestCase.java (rev 0)
+++ projects/jboss-cl/branches/Branch_2_0/classloading/src/test/java/org/jboss/test/classloading/dependency/test/ModuleClassLoadingUnitTestCase.java 2009-01-13 14:42:40 UTC (rev 82814)
@@ -0,0 +1,257 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, 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.classloading.dependency.test;
+
+import java.net.URL;
+import java.util.Enumeration;
+
+import junit.framework.Test;
+
+import org.jboss.classloader.plugins.ClassLoaderUtils;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
+import org.jboss.classloading.spi.metadata.ClassLoadingMetaDataFactory;
+import org.jboss.kernel.spi.dependency.KernelControllerContext;
+import org.jboss.test.classloading.dependency.support.a.A;
+import org.jboss.test.classloading.dependency.support.b.B;
+import org.jboss.test.classloading.dependency.support.c.C;
+
+/**
+ * ModuleClassLoadingUnitTestCase.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class ModuleClassLoadingUnitTestCase extends AbstractMockClassLoaderUnitTest
+{
+ public static Test suite()
+ {
+ return suite(ModuleClassLoadingUnitTestCase.class);
+ }
+
+ public ModuleClassLoadingUnitTestCase(String name)
+ {
+ super(name);
+ }
+
+ public void testLoadClassFromThisModule() throws Exception
+ {
+ MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ a.getCapabilities().addCapability(factory.createModule("ModuleA"));
+ a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+ a.setPathsAndPackageNames(A.class);
+ KernelControllerContext contextA = install(a);
+ try
+ {
+ ClassLoader clA = assertClassLoader(contextA);
+ Module moduleA = assertModule(contextA);
+ Class<?> result = moduleA.loadClass(A.class.getName());
+ assertEquals(clA, result.getClassLoader());
+
+ Module other = moduleA.getModuleForClass(A.class.getName());
+ assertEquals(moduleA, other);
+ }
+ finally
+ {
+ uninstall(contextA);
+ }
+ assertNoClassLoader(contextA);
+ }
+
+ public void testLoadClassFromOtherModule() throws Exception
+ {
+ MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ a.getCapabilities().addCapability(factory.createModule("ModuleA"));
+ a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+ a.setPathsAndPackageNames(A.class);
+ KernelControllerContext contextA = install(a);
+ try
+ {
+ ClassLoader clA = assertClassLoader(contextA);
+ Module moduleA = assertModule(contextA);
+
+ MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+ b.getRequirements().addRequirement(factory.createRequireModule("ModuleA"));
+ b.setPathsAndPackageNames(B.class);
+ KernelControllerContext contextB = install(b);
+ try
+ {
+ assertClassLoader(contextB);
+ Module moduleB = assertModule(contextB);
+ Class<?> result = moduleB.loadClass(A.class.getName());
+ assertEquals(clA, result.getClassLoader());
+
+ Module other = moduleB.getModuleForClass(A.class.getName());
+ assertEquals(moduleA, other);
+ }
+ finally
+ {
+ uninstall(contextB);
+ }
+ }
+ finally
+ {
+ uninstall(contextA);
+ }
+ assertNoClassLoader(contextA);
+ }
+
+ public void testLoadClassNotFound() throws Exception
+ {
+ MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ a.getCapabilities().addCapability(factory.createModule("ModuleA"));
+ a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+ a.setPathsAndPackageNames(A.class);
+ KernelControllerContext contextA = install(a);
+ try
+ {
+ assertClassLoader(contextA);
+ Module moduleA = assertModule(contextA);
+
+ MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+ b.getRequirements().addRequirement(factory.createRequireModule("ModuleA"));
+ b.setPathsAndPackageNames(B.class);
+ KernelControllerContext contextB = install(b);
+ try
+ {
+ assertClassLoader(contextB);
+ try
+ {
+ moduleA.loadClass(C.class.getName());
+ fail("Should not be here!");
+ }
+ catch (Exception e)
+ {
+ checkThrowable(ClassNotFoundException.class, e);
+ }
+ try
+ {
+ moduleA.getModuleForClass(C.class.getName());
+ fail("Should not be here!");
+ }
+ catch (Exception e)
+ {
+ checkThrowable(ClassNotFoundException.class, e);
+ }
+ Module moduleB = assertModule(contextB);
+ try
+ {
+ moduleB.loadClass(C.class.getName());
+ fail("Should not be here!");
+ }
+ catch (Exception e)
+ {
+ checkThrowable(ClassNotFoundException.class, e);
+ }
+ try
+ {
+ moduleB.getModuleForClass(C.class.getName());
+ fail("Should not be here!");
+ }
+ catch (Exception e)
+ {
+ checkThrowable(ClassNotFoundException.class, e);
+ }
+ }
+ finally
+ {
+ uninstall(contextB);
+ }
+ }
+ finally
+ {
+ uninstall(contextA);
+ }
+ assertNoClassLoader(contextA);
+ }
+
+ public void testLoadClassNotAModule() throws Exception
+ {
+ MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ a.getCapabilities().addCapability(factory.createModule("ModuleA"));
+ a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+ a.setPathsAndPackageNames(A.class);
+ KernelControllerContext contextA = install(a);
+ try
+ {
+ assertClassLoader(contextA);
+ Module moduleA = assertModule(contextA);
+
+ MockClassLoadingMetaData b = new MockClassLoadingMetaData("b");
+ b.getRequirements().addRequirement(factory.createRequireModule("ModuleA"));
+ b.setPathsAndPackageNames(B.class);
+ KernelControllerContext contextB = install(b);
+ try
+ {
+ assertClassLoader(contextB);
+ Module moduleB = assertModule(contextB);
+ moduleA.loadClass(Object.class.getName());
+ assertNull(moduleA.getModuleForClass(Object.class.getName()));
+ moduleB.loadClass(Object.class.getName());
+ assertNull(moduleB.getModuleForClass(Object.class.getName()));
+ }
+ finally
+ {
+ uninstall(contextB);
+ }
+ }
+ finally
+ {
+ uninstall(contextA);
+ }
+ assertNoClassLoader(contextA);
+ }
+
+ public void testGetResourceFromThisModule() throws Exception
+ {
+ MockClassLoadingMetaData a = new MockClassLoadingMetaData("a");
+ ClassLoadingMetaDataFactory factory = ClassLoadingMetaDataFactory.getInstance();
+ a.getCapabilities().addCapability(factory.createModule("ModuleA"));
+ a.getCapabilities().addCapability(factory.createPackage(A.class.getPackage().getName()));
+ a.setPathsAndPackageNames(A.class);
+ KernelControllerContext contextA = install(a);
+ try
+ {
+ assertClassLoader(contextA);
+ String path = ClassLoaderUtils.classNameToPath(A.class);
+ URL expected = getResource("/" + path);
+ Module moduleA = assertModule(contextA);
+ URL actual = moduleA.getResource(path);
+ assertEquals(expected, actual);
+
+ Enumeration<URL> actuals = moduleA.getResources(path);
+ assertTrue(actuals.hasMoreElements());
+ actual = actuals.nextElement();
+ assertEquals(expected, actual);
+ assertFalse(actuals.hasMoreElements());
+ }
+ finally
+ {
+ uninstall(contextA);
+ }
+ assertNoClassLoader(contextA);
+ }
+}
More information about the jboss-cvs-commits
mailing list