[jboss-cvs] JBossAS SVN: r62636 - in projects/microcontainer/trunk/classloader: src/main/org/jboss/classloader/plugins and 12 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Apr 30 10:10:17 EDT 2007


Author: adrian at jboss.org
Date: 2007-04-30 10:10:17 -0400 (Mon, 30 Apr 2007)
New Revision: 62636

Added:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java
Modified:
   projects/microcontainer/trunk/classloader/.classpath
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java
Log:
Fix some todos including made the JDK checking hack partially configurable,
added support for shutting down the classloading and finally
running the testsuite under a security manager (although the security config
is currently broken).

Modified: projects/microcontainer/trunk/classloader/.classpath
===================================================================
--- projects/microcontainer/trunk/classloader/.classpath	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/.classpath	2007-04-30 14:10:17 UTC (rev 62636)
@@ -1,22 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-  <classpathentry kind="src" path="src/main"/>
-  <classpathentry kind="src" path="src/tests"/>
-  <classpathentry kind="output" path="target/eclipse-classes"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA.jar" sourcepath="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/profiler/jvmti/jboss-profiler-jvmti/1.0.0.CR5/jboss-profiler-jvmti-1.0.0.CR5.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
-  <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA-sources.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
-  <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+	<classpathentry kind="src" path="src/main"/>
+	<classpathentry kind="src" output="target/eclipse-classes-tests" path="src/tests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA.jar" sourcepath="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/profiler/jvmti/jboss-profiler-jvmti/1.0.0.CR5/jboss-profiler-jvmti-1.0.0.CR5.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
+	<classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA-sources.jar"/>
+	<classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
+	<classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+	<classpathentry kind="output" path="target/eclipse-classes"/>
 </classpath>

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -29,10 +29,6 @@
 import java.security.PrivilegedAction;
 import java.security.ProtectionDomain;
 
-import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
-import org.jboss.util.UnreachableStatementException;
-
 /**
  * ClassLoaderUtils.
  * 
@@ -41,9 +37,6 @@
  */
 public class ClassLoaderUtils
 {
-   /** The hack to the security manager */
-   private static final Hack hack = new Hack();
-   
    /**
     * Check the class name makes sense
     * 
@@ -157,35 +150,6 @@
    }
    
    /**
-    * Used to check whether the classloading request is from the jdk<p>
-    * 
-    * This is a hack because of broken behaviour by the JDKs where they assume
-    * they can load their own classes from any classloader.
-    * 
-    * @return true when it is a JDK request
-    */
-   public static boolean isRequestFromJDK()
-   {
-      Class[] context = hack.getClassContext();
-      for (Class clazz : context)
-      {
-         // Review others?
-         if (Hack.class.isAssignableFrom(clazz) == false &&
-             ClassLoaderUtils.class.isAssignableFrom(clazz) == false &&
-             BaseClassLoaderDomain.class.isAssignableFrom(clazz) == false &&
-             BaseClassLoader.class.isAssignableFrom(clazz) == false &&
-             ClassLoader.class.isAssignableFrom(clazz) == false &&
-             Class.class.isAssignableFrom(clazz) == false)
-         {
-            ClassLoader cl = clazz.getClassLoader();
-            // Review: I don't think this true for all JDKs? i.e. JDK classes have no classloader.
-            return (cl == null);
-         }
-      }
-      throw new UnreachableStatementException();
-   }
-   
-   /**
     * Formats the class as a string
     * 
     * @param clazz the class
@@ -217,7 +181,7 @@
 
       builder.append(clazz);
       builder.append('{');
-      ClassLoader cl = clazz.getClassLoader();
+      ClassLoader cl = getClassLoader(clazz);
       builder.append("cl=").append(cl);
       builder.append(" codeSource=");
       builder.append(getCodeSource(clazz));
@@ -225,6 +189,27 @@
    }
    
    /**
+    * Get the classloader for a class
+    * 
+    * @param clazz the class
+    * @return the classloader or null if it doesn't have one
+    */
+   private static final ClassLoader getClassLoader(final Class<?> clazz)
+   {
+      SecurityManager sm = System.getSecurityManager();
+      if (sm == null)
+         return clazz.getClassLoader();
+      
+      return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+      {
+         public ClassLoader run()
+         {
+            return clazz.getClassLoader();
+         }
+      });
+   }
+   
+   /**
     * Get the protected domain for a class
     * 
     * @param clazz the class
@@ -258,18 +243,4 @@
          return null;
       return protectionDomain.getCodeSource();
    }
-   
-   /**
-    * Extend the security manager so we can get access to the stacktrace
-    * 
-    * TODO move this hack somewhere else?
-    */
-   private static class Hack extends SecurityManager
-   {
-      @Override
-      public Class[] getClassContext()
-      {
-         return super.getClassContext();
-      }
-   }
 }

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,110 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, 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.classloader.plugins.jdk;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
+import org.jboss.classloader.spi.jdk.JDKChecker;
+
+/**
+ * AbstractJDKChecker.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class AbstractJDKChecker implements JDKChecker
+{
+   /** The hack to the security manager */
+   private static final Hack hack;
+   
+   static
+   {
+      hack = AccessController.doPrivileged(new PrivilegedAction<Hack>()
+      {
+         public Hack run()
+         {
+            return new Hack();
+         }
+      });
+   }
+   
+   public boolean isJDKRequest(String name)
+   {
+      Class<?> requesting = getRequestingClass(hack.getClassContext());
+      return isJDKRequestingClass(name, requesting);
+   }
+
+   /**
+    * Get the  requesting class
+    * 
+    * @param stack the class stack 
+    * @return the requesting class
+    */
+   protected Class<?> getRequestingClass(Class[] stack)
+   {
+      for (Class clazz : stack)
+      {
+         if (Hack.class.isAssignableFrom(clazz) == false &&
+             JDKChecker.class.isAssignableFrom(clazz) == false &&
+             BaseClassLoaderDomain.class.isAssignableFrom(clazz) == false &&
+             ClassLoader.class.isAssignableFrom(clazz) == false &&
+             Class.class.isAssignableFrom(clazz) == false)
+         {
+             return clazz;
+         }
+      }
+      throw new RuntimeException("Should not be here!");
+   }
+   
+   /**
+    * Whether the requesting class is from the JDK<p>
+    * 
+    * The default implementation returs true if the requesting class is not loaded from
+    * {@link BaseClassLoader}
+    * 
+    * @param name the name of the class being loaded
+    * @param requesting the requesting class
+    * @return true it is from the JDK
+    */
+   protected boolean isJDKRequestingClass(String name, Class<?> requesting)
+   {
+      ClassLoader cl = requesting.getClassLoader();
+      if (cl == null)
+         return true;
+      return (cl instanceof BaseClassLoader == false);
+   }
+   
+   /**
+    * Extend the security manager so we can get access to the stacktrace
+    */
+   private static class Hack extends SecurityManager
+   {
+      @Override
+      public Class[] getClassContext()
+      {
+         return super.getClassContext();
+      }
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -332,16 +332,6 @@
    }
 
    /**
-    * Get the parent classloader
-    * 
-    * @return the parent classloader
-    */
-   protected ClassLoader getParentClassLoader()
-   {
-      return getClass().getClassLoader();
-   }
-
-   /**
     * Fixup the parent to the our classloader as parent if we don't have an explicit one
     */
    private void fixUpParent()

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -33,6 +33,8 @@
 import org.jboss.classloader.plugins.filter.PackageClassFilter;
 import org.jboss.classloader.spi.base.BaseClassLoaderPolicy;
 import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
+import org.jboss.classloader.spi.jdk.JDKChecker;
+import org.jboss.classloader.spi.jdk.JDKCheckerFactory;
 import org.jboss.logging.Logger;
 
 /**
@@ -178,6 +180,22 @@
       return null;
    }
 
+   /**
+    * Check whether this a request from the jdk if it is return the relevant classloader<p>
+    * 
+    * By default this uses the {@Link JDKCheckerFactory} and returns the system classloader if true.
+    * 
+    * @param name the class name
+    * @return the classloader
+    */
+   protected ClassLoader isJDKRequest(String name)
+   {
+      JDKChecker checker = JDKCheckerFactory.getChecker();
+      if (checker.isJDKRequest(name))
+         return ClassLoader.getSystemClassLoader();
+      return null;
+   }
+
    @Override
    protected void toLongString(StringBuilder builder)
    {

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,10 @@
  */
 package org.jboss.classloader.spi;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 import org.jboss.classloader.plugins.system.ClassLoaderSystemBuilder;
@@ -51,6 +54,9 @@
    
    /** The registered domains by name */
    private Map<String, ClassLoaderDomain> registeredDomains = new HashMap<String, ClassLoaderDomain>();
+
+   /** Whether the system is shutdown */
+   private boolean shutdown = false;
    
    /**
     * Get the classloading system instance
@@ -69,6 +75,9 @@
     */
    public synchronized ClassLoaderDomain getDefaultDomain()
    {
+      if (shutdown)
+         throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+      
       // Already constructed
       if (defaultDomain != null)
          return defaultDomain;
@@ -165,6 +174,10 @@
    {
       if (name == null)
          throw new IllegalArgumentException("Null name");
+
+      if (shutdown)
+         throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+
       ClassLoaderDomain result = registeredDomains.get(name);
       
       // See whether this is the default domain
@@ -221,8 +234,11 @@
 
    private void internalRegisterDomain(String name, ClassLoaderDomain domain)
    {
-      
+      if (shutdown)
+         throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+
       registeredDomains.put(name, domain);
+      super.registerDomain(domain);
       
       log.debug(this + " registered domain=" + domain.toLongString());
    }
@@ -236,11 +252,11 @@
     */
    public synchronized void unregisterDomain(ClassLoaderDomain domain)
    {
-      
       if (isDomainRegistered(domain) == false)
          throw new IllegalStateException("Domain is not registered " + domain);
       
       registeredDomains.remove(domain.getName());
+      super.unregisterDomain(domain);
       
       log.debug(this + " unregistered domain=" + domain.toLongString());
    }
@@ -262,36 +278,6 @@
    }
    
    /**
-    * Unregister a policy with the default domain<p>
-    * 
-    * Equivalent to {@link #unregisterClassLoaderPolicy(ClassLoaderDomain, ClassLoaderPolicy)} using
-    * {@link #getDefaultDomain()} as the ClassLoaderDomain
-    * 
-    * @param policy the policy
-    * @throws IllegalArgumentException if a parameter is null
-    * @throws IllegalStateException if the policy is not registered with the default domain  
-    */
-   public void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
-   {
-      unregisterClassLoaderPolicy(getDefaultDomain(), policy);
-   }
-   
-   /**
-    * Unregister a classloader with the default domain<p>
-    * 
-    * Equivalent to {@link #unregisterClassLoader(ClassLoaderDomain, ClassLoader)} using
-    * {@link #getDefaultDomain()} as the ClassLoaderDomain
-    * 
-    * @param classLoader classLoader
-    * @throws IllegalArgumentException if a parameter is null
-    * @throws IllegalStateException if the policy is not registered with the default domain  
-    */
-   public void unregisterClassLoader(ClassLoader classLoader)
-   {
-      unregisterClassLoader(getDefaultDomain(), classLoader);
-   }
-   
-   /**
     * Register a policy with a domain
     * 
     * @param domain the domain
@@ -304,36 +290,72 @@
    {
       if (isDomainRegistered(domain) == false)
          throw new IllegalArgumentException("Domain is not registered: " + domain);
+      
+      synchronized (this)
+      {
+         if (shutdown)
+            throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+      }
       return super.registerClassLoaderPolicy(domain, policy);
    }
    
    /**
-    * Unregister a policy with a domain
+    * Unregister a policy from its domain
     * 
-    * @param domain the domain
     * @param policy the policy
     * @throws IllegalArgumentException if a parameter is null
-    * @throws IllegalStateException if the domain is not registered or if the policy is not registered with the domain  
+    * @throws IllegalStateException if the policy is not registered with the default domain  
     */
-   public void unregisterClassLoaderPolicy(ClassLoaderDomain domain, ClassLoaderPolicy policy)
+   public void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
    {
-      if (isDomainRegistered(domain) == false)
-         throw new IllegalArgumentException("Domain is not registered: " + domain);
-      super.unregisterClassLoaderPolicy(domain, policy);
+      super.unregisterClassLoaderPolicy(policy);
    }
    
    /**
-    * Unregister a policy with a domain
+    * Unregister a classloader from its domain
     * 
-    * @param domain the domain
-    * @param classLoader the class loader
+    * @param classLoader classLoader
     * @throws IllegalArgumentException if a parameter is null
-    * @throws IllegalStateException if the policy is not registered with the domain  
+    * @throws IllegalStateException if the policy is not registered with the default domain  
     */
-   public void unregisterClassLoader(ClassLoaderDomain domain, ClassLoader classLoader)
+   public void unregisterClassLoader(ClassLoader classLoader)
    {
-      if (isDomainRegistered(domain) == false)
-         throw new IllegalArgumentException("Domain is not registered: " + domain);
-      super.unregisterClassLoader(domain, classLoader);
+      super.unregisterClassLoader(classLoader);
    }
+
+   /**
+    * Shutdown the classloader system<p>
+    * 
+    * Unregisters all domains by default
+    */
+   public synchronized void shutdown()
+   {
+      if (shutdown)
+         return;
+
+      log.debug(toLongString() + " SHUTDOWN!");
+      shutdown = true;
+      
+      while (true)
+      {
+         List<ClassLoaderDomain> domains = new ArrayList<ClassLoaderDomain>(registeredDomains.values());
+         Iterator<ClassLoaderDomain> iterator = domains.iterator();
+         if (iterator.hasNext() == false)
+            break;
+         
+         while (iterator.hasNext())
+         {
+            ClassLoaderDomain domain = iterator.next();
+            unregisterDomain(domain);
+         }
+      }
+   }
+   
+   @Override
+   protected void toLongString(StringBuilder builder)
+   {
+      if (shutdown)
+         builder.append("SHUTDOWN! ");
+      super.toLongString(builder);
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -411,6 +411,14 @@
    }
 
    /**
+    * Shutdown the classloader
+    */
+   protected void shutdownClassLoader()
+   {
+      log.debug(toLongString() + " shutdown!");
+   }
+   
+   /**
     * For subclasses to add things to the long string
     * 
     * @param builder the builder

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -23,6 +23,8 @@
 
 import java.io.IOException;
 import java.net.URL;
+import java.security.ProtectionDomain;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -41,7 +43,6 @@
  * This class hides some of the implementation details and allows
  * package access to the protected methods.
  *
- * TODO add handling of domain shutdown
  * TODO add caching (needs to be per classloader when not AllExports policy)
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
@@ -51,6 +52,9 @@
    /** The log */
    private static final Logger log = Logger.getLogger(BaseClassLoaderDomain.class);
 
+   /** The classloader system to which we belong */
+   private BaseClassLoaderSystem system;
+   
    /** The classloaders  in the order they were registered */
    private List<ClassLoaderInformation> classLoaders = new CopyOnWriteArrayList<ClassLoaderInformation>();
 
@@ -64,6 +68,71 @@
    private int order = 0;
    
    /**
+    * Get the classloader system
+    * 
+    * @return the classloader system
+    */
+   synchronized BaseClassLoaderSystem getClassLoaderSystem()
+   {
+      return system;
+   }
+   
+   /**
+    * Get the classloader system
+    * 
+    * @param system the classloader system
+    */
+   synchronized void setClassLoaderSystem(BaseClassLoaderSystem system)
+   {
+      if (system == null)
+         shutdownDomain();
+      this.system = system;
+   }
+
+   /**
+    * Shutdown the domain<p>
+    * 
+    * The default implementation just unregisters all classloaders
+    */
+   protected void shutdownDomain()
+   {
+      log.debug(toLongString() + " shutdown!");
+
+      // Unregister all classloaders
+      while (true)
+      {
+         Iterator<ClassLoaderInformation> iterator = classLoaders.iterator();
+         if (iterator.hasNext() == false)
+            break;
+
+         while (iterator.hasNext())
+         {
+            ClassLoaderInformation info = iterator.next();
+            if (info != null)
+               unregisterClassLoader(info.getClassLoader());
+         }
+      }
+   }
+   
+   /**
+    * Transform the byte code<p>
+    * 
+    * By default, this delegates to the classloader system
+    * 
+    * @param className the class name
+    * @param byteCode the byte code
+    * @param protectionDomain the protection domain
+    * @return the transformed byte code
+    */
+   protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
+   {
+      BaseClassLoaderSystem system = getClassLoaderSystem();
+      if (system != null)
+         system.transform(className, byteCode, protectionDomain);
+      return byteCode;
+   }
+
+   /**
     * Invoked before classloading is attempted to allow a preload attempt, e.g. from the parent
     * 
     * @param name the class resource name
@@ -118,6 +187,9 @@
    Class<?> loadClass(BaseClassLoader classLoader, String name, boolean allExports) throws ClassNotFoundException
    {
       boolean trace = log.isTraceEnabled();
+
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
       
       String path = ClassLoaderUtils.classNameToPath(name);
       
@@ -187,17 +259,20 @@
             loader = findAfterLoader(path, name);
 
          // Finally see whether this is the JDK assuming it can load its classes from any classloader
-         if (loader == null && ClassLoaderUtils.isRequestFromJDK())
+         if (loader == null)
          {
-            ClassLoader hack = getClass().getClassLoader();
-            if (trace)
-               log.trace(this + " trying to load " + name + " using hack " + hack);
-            Class<?> result = hack.loadClass(name);
-            if (result != null)
+            ClassLoader hack = policy.isJDKRequest(name);
+            if (hack != null)
             {
                if (trace)
-                  log.trace(this + " loaded from hack " + hack + " " + ClassLoaderUtils.classToString(result));
-               return result;
+                  log.trace(this + " trying to load " + name + " using hack " + hack);
+               Class<?> result = hack.loadClass(name);
+               if (result != null)
+               {
+                  if (trace)
+                     log.trace(this + " loaded from hack " + hack + " " + ClassLoaderUtils.classToString(result));
+                  return result;
+               }
             }
          }
       }
@@ -263,6 +338,9 @@
    {
       boolean trace = log.isTraceEnabled();
 
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
       // Try the before attempt
       URL result = beforeGetResource(name, resourceName);
       if (result != null)
@@ -387,6 +465,9 @@
    {
       boolean trace = log.isTraceEnabled();
 
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
       // Try the before attempt
       beforeGetResources(name, resourceName, urls);
 
@@ -517,8 +598,18 @@
    {
       // nothing
    }
-   
+
    /**
+    * Get the parent classloader
+    * 
+    * @return the parent classloader
+    */
+   protected ClassLoader getParentClassLoader()
+   {
+      return getClass().getClassLoader();
+   }
+
+   /**
     * Register a classloader 
     * 
     * @param classLoader the classloader
@@ -527,6 +618,9 @@
    {
       log.debug(this + " registerClassLoader " + classLoader.toLongString());
 
+      if (getClassLoaderSystem() == null)
+         throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+      
       try
       {
          beforeRegisterClassLoader(classLoader, classLoader.getPolicy());

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,6 +25,7 @@
 import java.util.List;
 
 import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.logging.Logger;
 
 /**
  * Base ClassLoader policy.<p>
@@ -37,6 +38,9 @@
  */
 public abstract class BaseClassLoaderPolicy
 {
+   /** The log */
+   private static final Logger log = Logger.getLogger(BaseClassLoaderPolicy.class);
+   
    /** The classloader for this policy */
    private volatile BaseClassLoader classLoader;
 
@@ -89,8 +93,10 @@
    protected abstract ProtectionDomain getProtectionDomain(String className, String path);
    
    /**
-    * Transform the byte code
+    * Transform the byte code<p>
     * 
+    * By default, this delegates to the domain
+    * 
     * @param className the class name
     * @param byteCode the byte code
     * @param protectionDomain the protection domain
@@ -98,11 +104,21 @@
     */
    protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
    {
-      // TODO should delegate to the domain by default
+      BaseClassLoaderDomain domain = getClassLoaderDomain();
+      if (domain != null)
+         domain.transform(className, byteCode, protectionDomain);
       return byteCode;
    }
 
    /**
+    * Check whether this a request from the jdk if it is return the relevant classloader
+    * 
+    * @param name the class name
+    * @return the classloader
+    */
+   protected abstract ClassLoader isJDKRequest(String name);
+   
+   /**
     * A long version of toString()
     * 
     * @return the long string
@@ -174,6 +190,7 @@
    {
       if (this.domain != domain)
          throw new IllegalStateException("Policy is not a part of the domain " + this + " domain=" + domain);
+      shutdownPolicy();
       this.domain = null;
    }
    /**
@@ -181,8 +198,10 @@
     * 
     * @return the classloader
     */
-   BaseClassLoader getClassLoader()
+   synchronized BaseClassLoader getClassLoader()
    {
+      if (classLoader == null)
+         throw new IllegalStateException("No classloader associated with policy therefore it is no longer registered " + toLongString());
       return classLoader;
    }
    
@@ -194,10 +213,23 @@
     * @param classLoader the classloader
     * @throws IllegalStateException if the classloader is already set
     */
-   void setClassLoader(BaseClassLoader classLoader)
+   synchronized void setClassLoader(BaseClassLoader classLoader)
    {
       if (this.classLoader != null)
          throw new IllegalStateException("Policy already has a classloader previous=" + classLoader);
       this.classLoader = classLoader;
    }
+   
+   /**
+    * Shutdown the policy<p>
+    * 
+    * The default implementation removes and shutdowns the classloader
+    */
+   synchronized protected void shutdownPolicy()
+   {
+      log.debug(toLongString() + " shutdown!");
+      BaseClassLoader classLoader = this.classLoader;
+      this.classLoader = null;
+      classLoader.shutdownClassLoader();
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,8 @@
  */
 package org.jboss.classloader.spi.base;
 
-import org.jboss.classloader.spi.ClassLoaderDomain;
+import java.security.ProtectionDomain;
+
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 
 /**
@@ -68,6 +69,32 @@
    }
 
    /**
+    * Register a domain
+    * 
+    * @param domain the domain to register
+    * @throws IllegalArgumentException for a null domain
+    */
+   protected void registerDomain(BaseClassLoaderDomain domain)
+   {
+      if (domain == null)
+         throw new IllegalArgumentException("Null domain");
+      domain.setClassLoaderSystem(this);
+   }
+
+   /**
+    * Unregister a domain
+    * 
+    * @param domain the domain to unregister
+    * @throws IllegalArgumentException for a null domain
+    */
+   protected void unregisterDomain(BaseClassLoaderDomain domain)
+   {
+      if (domain == null)
+         throw new IllegalArgumentException("Null domain");
+      domain.setClassLoaderSystem(null);
+   }
+   
+   /**
     * Register a policy with a domain
     * 
     * @param domain the domain
@@ -89,15 +116,12 @@
    /**
     * Unregister a policy with a domain
     * 
-    * @param domain the domain
     * @param policy the policy
     * @throws IllegalArgumentException if a parameter is null
     * @throws IllegalStateException if the policy is not registered with the domain  
     */
-   protected void unregisterClassLoaderPolicy(BaseClassLoaderDomain domain, ClassLoaderPolicy policy)
+   protected void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
    {
-      if (domain == null)
-         throw new IllegalArgumentException("Null domain");
       if (policy == null)
          throw new IllegalArgumentException("Null policy");
       
@@ -105,21 +129,21 @@
       BaseClassLoader classLoader = basePolicy.getClassLoader();
       if (classLoader == null)
          throw new IllegalStateException("Policy has no associated classloader, it is therefore not registered with a domain. " + policy.toLongString());
+      BaseClassLoaderDomain domain = basePolicy.getClassLoaderDomain();
+      if (domain == null)
+         throw new IllegalStateException("Policy has no domain " + policy.toLongString());
       domain.unregisterClassLoader(classLoader);
    }
    
    /**
     * Unregister a policy with a domain
     * 
-    * @param domain the domain
     * @param classLoader the class loader
     * @throws IllegalArgumentException if a parameter is null
     * @throws IllegalStateException if the policy is not registered with the domain  
     */
-   protected void unregisterClassLoader(ClassLoaderDomain domain, ClassLoader classLoader)
+   protected void unregisterClassLoader(ClassLoader classLoader)
    {
-      if (domain == null)
-         throw new IllegalArgumentException("Null domain");
       if (classLoader == null)
          throw new IllegalArgumentException("Null classLoader");
       
@@ -127,7 +151,7 @@
          throw new IllegalStateException("ClassLoader is not the correct type and therefore not registered: " + classLoader);
       
       BaseClassLoader baseClassLoader = (BaseClassLoader) classLoader;
-      unregisterClassLoaderPolicy(domain, baseClassLoader.getPolicy());
+      unregisterClassLoaderPolicy(baseClassLoader.getPolicy());
    }
 
    /**
@@ -141,4 +165,19 @@
    {
       return new BaseClassLoader(policy);
    }
+   
+   /**
+    * Transform the byte code<p>
+    *
+    * By default this does nothing
+    * 
+    * @param className the class name
+    * @param byteCode the byte code
+    * @param protectionDomain the protection domain
+    * @return the transformed byte code
+    */
+   protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
+   {
+      return byteCode;
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -26,6 +26,7 @@
 import java.util.Set;
 
 import org.jboss.classloader.spi.Loader;
+import org.jboss.logging.Logger;
 
 /**
  * Base DelegateLoader.
@@ -35,6 +36,9 @@
  */
 public class BaseDelegateLoader implements Loader
 {
+   /** The log */
+   private static final Logger log = Logger.getLogger(BaseDelegateLoader.class);
+   
    /** The delegate loader policy */
    private BaseClassLoaderPolicy delegate;
 
@@ -59,27 +63,33 @@
    public Class<?> loadClass(String className)
    {
       BaseClassLoader classLoader = delegate.getClassLoader();
-      // REVIEW: Should probably add some kind of warning here
       if (classLoader == null)
+      {
+         log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
          return null;
+      }
       return classLoader.loadClassLocally(className);
    }
    
    public URL getResource(String name, String resourceName)
    {
       BaseClassLoader classLoader = delegate.getClassLoader();
-      // REVIEW: Should probably add some kind of warning here
       if (classLoader == null)
+      {
+         log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
          return null;
+      }
       return classLoader.getResourceLocally(name, resourceName);
    }
 
    public void getResources(String name, String resourceName, Set<URL> urls) throws IOException
    {
       BaseClassLoader classLoader = delegate.getClassLoader();
-      // REVIEW: Should probably add some kind of warning here
       if (classLoader == null)
+      {
+         log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
          return;
+      }
       classLoader.getResourcesLocally(name, resourceName, urls);
    }
 

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -104,7 +104,7 @@
          return super.getResource(name, resourceName);
       }
       if (trace)
-         log.trace(this + " " + name + " NOT match filter=" + filter);
+         log.trace(this + " " + name + " does NOT match filter=" + filter);
       return null;
    }
 
@@ -118,7 +118,7 @@
          super.getResources(name, resourceName, urls);
       }
       if (trace)
-         log.trace(this + " " + name + " matches does NOT match filter=" + filter);
+         log.trace(this + " " + name + " does NOT match filter=" + filter);
    }
 
    @Override

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, 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.classloader.spi.jdk;
+
+/**
+ * Used to check whether the classloading request is from the jdk<p>
+ * 
+ * This is a hack because of broken behaviour by the JDKs where they assume
+ * they can load their own classes from any classloader.
+ */
+public interface JDKChecker 
+{
+   /**
+    * Check wether this is a request from the JDK
+    * 
+    * @param name the class name
+    * @param stack the stack
+    * @return true when from the JDK
+    */
+   boolean isJDKRequest(String name);
+}

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, 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.classloader.spi.jdk;
+
+import org.jboss.classloader.plugins.jdk.AbstractJDKChecker;
+
+/**
+ * JDKCheckerFactory.
+ * 
+ * TODO parameterize this
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class JDKCheckerFactory
+{
+   /** The checker */
+   private static JDKChecker checker = new AbstractJDKChecker(); 
+   
+   /**
+    * Retrieve the checker for the JDK we are running on
+    * 
+    * @return the checker
+    */
+   public static JDKChecker getChecker()
+   {
+      return checker;
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,8 +21,9 @@
  */
 package org.jboss.test.classloader;
 
+import java.security.ProtectionDomain;
+
 import junit.framework.AssertionFailedError;
-import junit.framework.TestSuite;
 
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.plugins.system.DefaultClassLoaderSystem;
@@ -30,7 +31,8 @@
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.ParentPolicy;
-import org.jboss.test.BaseTestCase;
+import org.jboss.test.AbstractTestCaseWithSetup;
+import org.jboss.test.AbstractTestDelegate;
 import org.jboss.test.classloader.support.MockClassLoaderPolicy;
 
 /**
@@ -39,21 +41,9 @@
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
-public abstract class AbstractClassLoaderTest extends BaseTestCase
+public abstract class AbstractClassLoaderTest extends AbstractTestCaseWithSetup
 {
    /**
-    * Create a new testsuite for the class
-    * 
-    * TODO move to BaseTestCase
-    * @param clazz the class
-    * @return the suite
-    */
-   public static TestSuite suite(Class<?> clazz)
-   {
-      return new TestSuite(clazz);
-   }
-
-   /**
     * Raise an assertion failed error for an error
     * 
     * TODO move to AbstractTestCase
@@ -62,19 +52,51 @@
     */
    protected void failure(String reason, Throwable cause)
    {
-      log.error(reason, cause);
+      getLog().error(reason, cause);
       if (cause instanceof AssertionFailedError)
          throw (AssertionFailedError) cause;
       Error error = new AssertionFailedError(reason);
       error.initCause(cause);
       throw error;
    }
-   
+
+   public static AbstractTestDelegate getDelegate(Class<?> clazz)
+   {
+      AbstractTestDelegate delegate = new AbstractTestDelegate(clazz);
+      delegate.enableSecurity = true;
+      return delegate;
+   }
+
+   @Override
+   protected void setUp() throws Exception
+   {
+      super.setUp();
+      configureLogging();
+   }
+
    public AbstractClassLoaderTest(String name)
    {
       super(name);
    }
    
+   public ProtectionDomain getProtectionDomain(String name)
+   {
+      SecurityManager sm = suspendSecurity();
+      try
+      {
+         Class<?> clazz = getClass().getClassLoader().loadClass(name);
+         return clazz.getProtectionDomain();
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new Error("Class not found " + name, e);
+      }
+      finally
+      {
+         resumeSecurity(sm);
+      }
+   }
+   
    protected ClassLoaderSystem createClassLoaderSystem()
    {
       // We always create a new one to avoid things in the default domain leaking across tests
@@ -91,7 +113,7 @@
    protected ClassLoader createClassLoaderSystemWithModifiedBootstrapAndMockClassLoader()
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
-      return createMockClassLoader(system);
+      return createAndRegisterMockClassLoader(system);
    }
    
    protected ClassLoader registerPolicyWithDefaultDomain(ClassLoaderPolicy policy, ClassLoaderSystem system)
@@ -99,25 +121,25 @@
       return system.registerClassLoaderPolicy(policy);
    }
    
-   protected ClassLoader createMockClassLoader(ClassLoaderSystem system)
+   protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system)
    {
-      return createMockClassLoader(system, "mock");
+      return createAndRegisterMockClassLoader(system, "mock");
    }
    
-   protected ClassLoader createMockClassLoader(ClassLoaderSystem system, String name)
+   protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, String name)
    {
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name, this);
       return system.registerClassLoaderPolicy(policy);
    }
    
-   protected ClassLoader createMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain)
+   protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain)
    {
-      return createMockClassLoader(system, domain, "mock");
+      return createAndRegisterMockClassLoader(system, domain, "mock");
    }
    
-   protected ClassLoader createMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain, String name)
+   protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain, String name)
    {
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name, this);
       return system.registerClassLoaderPolicy(domain, policy);
    }
    
@@ -133,8 +155,18 @@
    
    protected void assertClassLoader(Class<?> clazz, ClassLoader expected)
    {
-      log.debug("Should be the expected classloader expected=" + expected + " actual=" + clazz.getClassLoader());
-      assertEquals("Should be the expected classloader", expected, clazz.getClassLoader());
+      ClassLoader classLoader = null;
+      SecurityManager sm = suspendSecurity();
+      try
+      {
+         classLoader = clazz.getClassLoader();
+      }
+      finally
+      {
+         resumeSecurity(sm);
+      }
+      getLog().debug("Should be the expected classloader expected=" + expected + " actual=" + classLoader);
+      assertEquals("Should be the expected classloader", expected, classLoader);
    }
    
    protected Class<?> assertLoadClass(Class<?> reference, ClassLoader start)
@@ -173,7 +205,7 @@
       try
       {
          result = start.loadClass(name);
-         log.debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
+         getLog().debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
       }
       catch (ClassNotFoundException e)
       {
@@ -236,7 +268,7 @@
       try
       {
          result = Class.forName(name, true, start);
-         log.debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
+         getLog().debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
       }
       catch (ClassNotFoundException e)
       {

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,7 +25,7 @@
 
 import javax.naming.Context;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -38,7 +38,7 @@
  */
 public class ModifiedBootstrapUnitTestCase extends AbstractClassLoaderTest
 {
-   public static TestSuite suite()
+   public static Test suite()
    {
       return suite(ModifiedBootstrapUnitTestCase.class);
    }

Added: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, 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.classloader.delegate.support.a;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+
+/**
+ * TestADelegateClassLoaderDomain.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class TestADelegateClassLoaderDomain
+{
+   public static ClassLoaderDomain getSomething()
+   {
+      return null;
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -28,14 +28,16 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
+import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.classloader.spi.DelegateLoader;
 import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
 import org.jboss.test.classloader.AbstractClassLoaderTest;
 import org.jboss.test.classloader.TestThread;
 import org.jboss.test.classloader.delegate.support.a.TestA1;
+import org.jboss.test.classloader.delegate.support.a.TestADelegateClassLoaderDomain;
 import org.jboss.test.classloader.delegate.support.a.TestAbstractFactory;
 import org.jboss.test.classloader.delegate.support.a.TestSleep;
 import org.jboss.test.classloader.delegate.support.b.TestB1;
@@ -43,14 +45,14 @@
 import org.jboss.test.classloader.support.MockClassLoaderPolicy;
 
 /**
- * ModifiedBootstrapUnitTestCase.
+ * DelegateUnitTestCase
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 1.1 $
  */
 public class DelegateUnitTestCase extends AbstractClassLoaderTest
 {
-   public static TestSuite suite()
+   public static Test suite()
    {
       return suite(DelegateUnitTestCase.class);
    }
@@ -64,11 +66,11 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
       pb.setPaths(TestB1.class);
       ClassLoader b = system.registerClassLoaderPolicy(pb);
 
-      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
       pa.setPaths(TestA1.class);
       ClassLoader a = system.registerClassLoaderPolicy(pa);
       
@@ -80,11 +82,11 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
       pb.setPaths(TestB1.class);
       ClassLoader b = system.registerClassLoaderPolicy(pb);
 
-      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
       pa.setPaths(TestA1.class);
       pa.setDelegates(Collections.singletonList(new FilteredDelegateLoader(pb)));
       ClassLoader a = system.registerClassLoaderPolicy(pa);
@@ -99,10 +101,10 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       
-      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
       pb.setPaths(TestB1.class);
 
-      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
       pa.setPaths(TestA1.class);
 
       List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
@@ -121,14 +123,48 @@
       assertClassEquality(testFactoryImplementationClass, instance.getClass());
    }
    
+   public void testDelegateToAnotherCodeSource() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
+      pb.setPaths(ClassLoaderDomain.class);
+      ClassLoader b = system.registerClassLoaderPolicy(pb);
+
+      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
+      pa.setPaths(TestADelegateClassLoaderDomain.class);
+      pa.setDelegates(Collections.singletonList(new FilteredDelegateLoader(pb)));
+      ClassLoader a = system.registerClassLoaderPolicy(pa);
+      
+      Class<?> fromB = assertLoadClass(ClassLoaderDomain.class, b, false);
+      Class<?> delegate = assertLoadClass(TestADelegateClassLoaderDomain.class, a, false);
+      
+      SecurityManager sm = suspendSecurity();
+      try
+      {
+         System.out.println(delegate.getProtectionDomain());
+      }
+      finally
+      {
+         resumeSecurity(sm);
+      }
+      
+      Method method = delegate.getMethod("getSomething", null);
+      Class<?> fromA = method.getReturnType();
+      assertNotNull(fromA);
+      assertClassLoader(fromA, b);
+      
+      assertClassEquality(fromB, fromA);
+   }
+   
    public void testAbstractFactoryWrongWay() throws Exception
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       
-      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+      MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
       pb.setPaths(TestB1.class);
 
-      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+      MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
       pa.setPaths(TestA1.class);
 
       List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
@@ -151,13 +187,13 @@
    {
       for (int i = 0; i < 10; ++i)
       {
-         log.debug("Attempt: " + i);
+         getLog().debug("Attempt: " + i);
          ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
          
-         MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+         MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
          pb.setPaths(TestB1.class);
 
-         MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+         MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
          pa.setPaths(TestA1.class);
 
          List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -42,7 +42,7 @@
 import org.jboss.test.classloader.support.MockClassLoaderPolicy;
 
 /**
- * ClassLoadingSystemUnitTestCase.
+ * CircularLoadUnitTestCase.
  * 
  * @author <a href="adrian at jboss.com">Adrian Brock</a>
  * @author Simone.Bordet at hp.com
@@ -51,33 +51,33 @@
  */
 public class CircularLoadUnitTestCase extends AbstractClassLoaderTest
 {
-   public static TestSuite suite()
-   {
-      return suite(CircularLoadUnitTestCase.class);
-   }
-
    public CircularLoadUnitTestCase(String name)
    {
       super(name);
    }
+   
+   public static Test suite()
+   {
+      return suite(CircularLoadUnitTestCase.class);
+   }
 
    public void testLinkageError() throws Exception
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy le0 = new MockClassLoaderPolicy("le0");
+      MockClassLoaderPolicy le0 = new MockClassLoaderPolicy("le0", this);
       le0.setPathsAndPackageNames(Base.class);
       le0.setImportAll(true);
       le0.setIncluded(Base.class, UserOfBase.class);
       ClassLoader cl0 = system.registerClassLoaderPolicy(le0);
 
-      MockClassLoaderPolicy le1 = new MockClassLoaderPolicy("le1");
+      MockClassLoaderPolicy le1 = new MockClassLoaderPolicy("le1", this);
       le1.setPathsAndPackageNames(Base.class);
       le1.setImportAll(true);
       le1.setIncluded(Base.class, Support.class);
       ClassLoader cl1 = system.registerClassLoaderPolicy(le1);
 
-      MockClassLoaderPolicy all = new MockClassLoaderPolicy("all");
+      MockClassLoaderPolicy all = new MockClassLoaderPolicy("all", this);
       all.setPackageNames(Base.class);
       all.setImportAll(true);
       ClassLoader cl2 = system.registerClassLoaderPolicy(all);
@@ -100,7 +100,7 @@
          // Now invoke UserOfBase.testBase(Support)
          Class[] sig = { supportClass };
          Method testBase = userOfBaseClass.getMethod("testBase", sig);
-         log.info(testBase.toString());
+         getLog().info(testBase.toString());
          Object[] args = { support };
          testBase.invoke(userOfBase, args);
       }
@@ -113,12 +113,12 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy mock = new MockClassLoaderPolicy();
+      MockClassLoaderPolicy mock = new MockClassLoaderPolicy(this);
       mock.setPathsAndPackageNames(Base.class);
       mock.setIncluded(LoginInfo.class, UsrMgr.class, UserOfUsrMgr.class, UserOfLoginInfo.class);
       ClassLoader cl = system.registerClassLoaderPolicy(mock);
 
-      log.info("Begin testPackageProtected");
+      getLog().info("Begin testPackageProtected");
 
       try
       {
@@ -135,13 +135,13 @@
          Constructor ctor1 = c1.getConstructor(ctorsig1);
          Object[] args1 = {"jduke", "theduke"};
          Object o1 = ctor1.newInstance(args1);
-         log.info("UserOfUsrMgr.CS: "+o1.getClass().getProtectionDomain().getCodeSource());
+         getLog().info("UserOfUsrMgr.CS: "+o1.getClass().getProtectionDomain().getCodeSource());
 
          // Now invoke UserOfUsrMgr.changePassword(char[] password)
          char[] password = "theduke2".toCharArray();
          Class[] sig = {password.getClass()};
          Method changePassword = c1.getMethod("changePassword", sig);
-         log.info(changePassword.toString());
+         getLog().info(changePassword.toString());
          Object[] args = {password};
          changePassword.invoke(o1, args);
       }
@@ -155,13 +155,13 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy any0 = new MockClassLoaderPolicy("any0");
+      MockClassLoaderPolicy any0 = new MockClassLoaderPolicy("any0", this);
       any0.setPathsAndPackageNames(Support.class);
       any0.setImportAll(true);
       any0.setIncluded(Base.class, Class0.class, Class2.class);
       ClassLoader cl0 = system.registerClassLoaderPolicy(any0);
       
-      MockClassLoaderPolicy any1 = new MockClassLoaderPolicy("any1");
+      MockClassLoaderPolicy any1 = new MockClassLoaderPolicy("any1", this);
       any1.setPathsAndPackageNames(Support.class);
       any1.setImportAll(true);
       any1.setIncluded(Class0.class, Class2.class);
@@ -178,13 +178,13 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
       j0.setPathsAndPackageNames(Support.class);
       j0.setImportAll(true);
       j0.setIncluded(Class0.class);
       ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
 
-      MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1");
+      MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1", this);
       j1.setPathsAndPackageNames(Support.class);
       j1.setImportAll(true);
       j1.setIncluded(Class2.class);
@@ -212,13 +212,13 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
       j0.setPathsAndPackageNames(Support.class);
       j0.setImportAll(true);
       j0.setIncluded(Class0.class);
       ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
 
-      MockClassLoaderPolicy j3 = new MockClassLoaderPolicy("j3");
+      MockClassLoaderPolicy j3 = new MockClassLoaderPolicy("j3", this);
       j3.setPathsAndPackageNames(Support.class);
       j3.setImportAll(true);
       j3.setIncluded(Derived.class);
@@ -236,19 +236,19 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+      MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
       j0.setPathsAndPackageNames(Support.class);
       j0.setImportAll(true);
       j0.setIncluded(Class0.class);
       ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
 
-      MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1");
+      MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1", this);
       j1.setPathsAndPackageNames(Support.class);
       j1.setImportAll(true);
       j1.setIncluded(Class1.class);
       ClassLoader cl1 = system.registerClassLoaderPolicy(j1);
 
-      MockClassLoaderPolicy j2 = new MockClassLoaderPolicy("j2");
+      MockClassLoaderPolicy j2 = new MockClassLoaderPolicy("j2", this);
       j2.setPathsAndPackageNames(Support.class);
       j2.setImportAll(true);
       j2.setIncluded(Class2.class);

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
 import java.net.URL;
 import java.util.concurrent.CountDownLatch;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -45,12 +45,12 @@
 {
    private CountDownLatch waiting = new CountDownLatch(1);
    private Throwable sawError;
-
-   public static TestSuite suite()
+   
+   public static Test suite()
    {
       return suite(CircularityErrorUnitTestCase.class);
    }
-
+   
    public CircularityErrorUnitTestCase(String name)
    {
       super(name);
@@ -66,7 +66,7 @@
       // Thread1 throws ClassCircularityError
 
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
-      final ClassLoader cl = system.registerClassLoaderPolicy(new TestClassLoaderPolicy());
+      final ClassLoader cl = system.registerClassLoaderPolicy(new TestClassLoaderPolicy(this));
 
       Class cls = assertLoadClass(Support.class, cl);
 
@@ -86,9 +86,9 @@
 
             try
             {
-               log.debug("Thread " + Thread.currentThread() + " loading...");
+               getLog().debug("Thread " + Thread.currentThread() + " loading...");
                assertLoadClass(Derived.class, cl);
-               log.debug("Thread " + Thread.currentThread() + " loading done !");
+               getLog().debug("Thread " + Thread.currentThread() + " loading done !");
             }
             catch (Throwable t)
             {
@@ -98,9 +98,9 @@
       }, "CircularityErrorThread");
       thread1.start();
 
-      log.debug("Thread " + Thread.currentThread() + " waiting...");
+      getLog().debug("Thread " + Thread.currentThread() + " waiting...");
       waiting.await();
-      log.debug("Thread " + Thread.currentThread() + " woken up !");
+      getLog().debug("Thread " + Thread.currentThread() + " woken up !");
 
       // Ask this thread to trigger a loadClassInternal directly; the thread will be put to sleep
       // but the JVM has already registered the fact that
@@ -115,15 +115,16 @@
 
    public class TestClassLoaderPolicy extends MockClassLoaderPolicy
    {
-      public TestClassLoaderPolicy()
+      public TestClassLoaderPolicy(AbstractClassLoaderTest test)
       {
+         super(test);
          setPaths(Support.class);
       }
 
       @Override
       public URL getResource(String name)
       {
-         log.debug(Thread.currentThread() + " is now asked to load class: " + name);
+         getLog().debug(Thread.currentThread() + " is now asked to load class: " + name);
 
          if (name.equals(ClassLoaderUtils.classNameToPath(Derived.class.getName())))
          {
@@ -133,13 +134,13 @@
             // Do not release the lock on the classloader
             try
             {
-               log.debug("Loading " + name + ", waiting...");
+               getLog().debug("Loading " + name + ", waiting...");
                Thread.sleep(2000);
-               log.debug("Loading " + name + " end wait");
+               getLog().debug("Loading " + name + " end wait");
             }
             catch (InterruptedException x)
             {
-               log.debug("Sleep was interrupted", x);
+               getLog().debug("Sleep was interrupted", x);
             }
          }
 

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -26,7 +26,7 @@
 import java.util.TimerTask;
 import java.util.Vector;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -52,8 +52,8 @@
    private Timer newInstanceTimer;
    private int doneCount;
    private ClassLoader cl;
-
-   public static TestSuite suite()
+   
+   public static Test suite()
    {
       return suite(ConcurrentLoaderUnitTestCase.class);
    }
@@ -67,11 +67,11 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
       
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
       policy.setPaths(Support.class);
       cl = system.registerClassLoaderPolicy(policy);
       
-      log.debug("Creating " + NUMBER_OF_THREADS + " threads...");
+      getLog().debug("Creating " + NUMBER_OF_THREADS + " threads...");
       newInstanceTimer = new Timer(true);
       newInstanceTimer.scheduleAtFixedRate(new NewInstanceTask(), 0, 100);
       doneCount = 0;
@@ -81,15 +81,15 @@
          loader.start();
          loaders.add(loader);
       }
-      log.debug("All threads created");
-      Thread.sleep(2000);
+      getLog().debug("All threads created");
+      Thread.sleep(1000);
 
       synchronized(lock)
       {
-         lock.notifyAll ();
+         lock.notifyAll();
       }
       
-      log.debug("Unlocked all Loader threads");
+      getLog().debug("Unlocked all Loader threads");
       
       synchronized(lock)
       {
@@ -97,9 +97,9 @@
          {
             lock.wait();
          }
-         log.debug("Loader doneCount=" + doneCount);
+         getLog().debug("Loader doneCount=" + doneCount);
       }
-      log.debug("All Loaders are done");
+      getLog().debug("All Loaders are done");
       newInstanceTimer.cancel();
       
       for (Loader loader : loaders)
@@ -116,18 +116,18 @@
          int size = classes.size();
          Class[] theClasses = new Class[size];
          classes.toArray(theClasses);
-         log.debug("NewInstanceTask, creating " + size + " instances");
+         getLog().trace("NewInstanceTask, creating " + size + " instances");
          for (int c = 0; c < theClasses.length; ++c)
          {
             try
             {
                Class clazz = theClasses[c];
                Object obj = clazz.newInstance();
-               log.debug("Created instance=" + obj);
+               getLog().trace("Created instance=" + obj);
             }
             catch(Throwable t)
             {
-               log.error("Error instantiating class " + theClasses[c], t);
+               getLog().error("Error instantiating class " + theClasses[c], t);
             }
          }
       }
@@ -153,35 +153,35 @@
          {
             try
             {
-               log.debug("Thread ready: " + classid);
-               lock.wait ();
+               getLog().debug("Thread ready: " + classid);
+               lock.wait();
             }
             catch (Exception e)
             {
-               log.error("Error during wait", e);
+               getLog().error("Error during wait", e);
             }
          }
-         log.debug("loading class... " + className);
+         getLog().trace("loading class... " + className);
          for (int i = 0; i < NUMBER_OF_LOADING; ++i)
          {
-            log.debug("loading class with id " + classid + " for the " + i + "th time");
+            getLog().trace("loading class with id " + classid + " for the " + i + "th time");
             try
             {
-               log.debug("before load...");
-               long sleep = (long) (1000 * Math.random());
+               getLog().trace("before load...");
+               long sleep = (long) (500 * Math.random());
                Thread.sleep(sleep);
                Class clazz = cl.loadClass (className);
                classes.add(clazz);
                Object obj = clazz.newInstance();
-               log.debug("Class " + className + " loaded, obj=" + obj);
+               getLog().trace("Class " + className + " loaded, obj=" + obj);
             }
             catch (Throwable e)
             {
-               log.debug("Failed to load class and create instance", e);
+               getLog().debug("Failed to load class and create instance", e);
                error = e;
             }
          }
-         log.debug("...Done loading classes. " + classid);
+         getLog().debug("...Done loading classes. " + classid);
          synchronized( lock )
          {
             doneCount++;

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,7 @@
  */
 package org.jboss.test.classloader.old.test;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.spi.ClassLoaderSystem;
 import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -37,7 +37,7 @@
  */
 public class LoaderUnitTestCase extends AbstractClassLoaderTest
 {
-   public static TestSuite suite()
+   public static Test suite()
    {
       return suite(LoaderUnitTestCase.class);
    }
@@ -51,12 +51,12 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
       policy.setPaths(Support.class);
       final ClassLoader cl = system.registerClassLoaderPolicy(policy);
 
       // Set our interrupted flag
-      log.debug("Setting interrupt flag");
+      getLog().debug("Setting interrupt flag");
       Thread.currentThread().interrupt();
       try
       {
@@ -72,7 +72,7 @@
    {
       ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
 
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
       policy.setPaths(Support.class);
       ClassLoader cl = system.registerClassLoaderPolicy(policy);
 

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,12 +25,14 @@
 import java.net.URL;
 import java.security.ProtectionDomain;
 import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Set;
 
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
 import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.test.classloader.AbstractClassLoaderTest;
 
 /**
  * MockClassLoaderPolicy.
@@ -54,16 +56,19 @@
    
    private boolean importAll;
    
-   public MockClassLoaderPolicy()
+   private AbstractClassLoaderTest test;
+   
+   public MockClassLoaderPolicy(AbstractClassLoaderTest test)
    {
-      this(null);
+      this(null, test);
    }
 
-   public MockClassLoaderPolicy(String name)
+   public MockClassLoaderPolicy(String name, AbstractClassLoaderTest test)
    {
       if (name == null)
          name = "mock";
       this.name = name;
+      this.test = test;
    }
    
    @Override
@@ -76,7 +81,7 @@
    {
       this.delegates = delegates;
    }
-
+   
    public String[] getPaths()
    {
       return paths;
@@ -204,19 +209,65 @@
    }
 
    @Override
-   public void getResources(String name, Set<URL> urls) throws IOException
+   public void getResources(String path, Set<URL> urls) throws IOException
    {
-      // TODO getResources
-      throw new org.jboss.util.NotImplementedException("getResources");
+      if (paths == null)
+         return;
+
+      if (excluded != null)
+      {
+         for (String excludedPath : excluded)
+         {
+            if (excludedPath.equals(path))
+               return;
+         }
+      }
+
+      if (included != null)
+      {
+         boolean include = false;
+         for (String includedPath : included)
+         {
+            if (includedPath.equals(path))
+            {
+               include = true;
+               break;
+            }
+         }
+         if (include == false)
+            return;
+      }
       
+      ClassLoader parent = getClass().getClassLoader();
+      for (int i = 0; i < paths.length; ++i)
+      {
+         if (path.startsWith(paths[i]))
+         {
+            Enumeration<URL> enumeration = parent.getResources(path);
+            while (enumeration.hasMoreElements())
+               urls.add(enumeration.nextElement());
+         }
+      }
    }
-
+   
    @Override
    protected ProtectionDomain getProtectionDomain(String className, String path)
    {
-      return getClass().getProtectionDomain();
+      return test.getProtectionDomain(className);
    }
 
+   /*
+    * Overridden to not load jboss classes
+    * this is so we don't expose classes from the classpath
+    * that we haven't explicitly declared in the policy
+    */
+   protected ClassLoader isJDKRequest(String name)
+   {
+      if (name.startsWith("org.jboss."))
+         return null;
+      return super.isJDKRequest(name);
+   }
+
    @Override 
    public void toLongString(StringBuilder builder)
    {

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java	2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java	2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestSuite;
+import junit.framework.Test;
 
 import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -40,7 +40,7 @@
  */
 public class ClassLoadingSystemUnitTestCase extends AbstractClassLoaderTest
 {
-   public static TestSuite suite()
+   public static Test suite()
    {
       return suite(ClassLoadingSystemUnitTestCase.class);
    }
@@ -67,7 +67,7 @@
    {
       MockClassLoaderSystem system = createMockClassLoaderSystem();
       MockClassLoaderDomain domain = system.createAndRegisterDomain("mock");
-      ClassLoader cl1 = createMockClassLoader(system, domain);
+      ClassLoader cl1 = createAndRegisterMockClassLoader(system, domain);
       
       List<ClassLoader> expected = new ArrayList<ClassLoader>();
       expected.add(cl1);
@@ -75,7 +75,7 @@
       assertEquals(expected, domain.added);
       assertEmpty(domain.removed);
 
-      ClassLoader cl2 = createMockClassLoader(system, domain);
+      ClassLoader cl2 = createAndRegisterMockClassLoader(system, domain);
       expected.add(cl2);
       
       assertEquals(expected, domain.added);
@@ -86,7 +86,7 @@
    {
       MockClassLoaderSystem system = createMockClassLoaderSystem();
       MockClassLoaderDomain domain = system.createAndRegisterDomain("mock");
-      ClassLoader cl1 = createMockClassLoader(system, domain);
+      ClassLoader cl1 = createAndRegisterMockClassLoader(system, domain);
       
       List<ClassLoader> expected = new ArrayList<ClassLoader>();
       expected.add(cl1);
@@ -94,7 +94,7 @@
       assertEquals(expected, domain.added);
       assertEmpty(domain.removed);
 
-      system.unregisterClassLoader(domain, cl1);
+      system.unregisterClassLoader(cl1);
       
       assertEquals(expected, domain.added);
       assertEquals(expected, domain.removed);




More information about the jboss-cvs-commits mailing list