[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