[jboss-cvs] JBossAS SVN: r64277 - in projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader: spi/base and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jul 25 14:10:42 EDT 2007


Author: adrian at jboss.org
Date: 2007-07-25 14:10:42 -0400 (Wed, 25 Jul 2007)
New Revision: 64277

Added:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java
Modified:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.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/filter/PackageClassFilter.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTest.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java
Log:
Make the IsolatedClassLoader more of a helper. Fix the transform chain so it actually returns the modified byte code. Make the JDKCheckerFactory work even when it is not visible from the TCL. Refactor the includeJava to the PatternClassFilter. Add a CombiningClassFilter

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/CombiningClassFilter.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -0,0 +1,94 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, 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.plugins.filter;
+
+import org.jboss.classloader.spi.filter.ClassFilter;
+
+/**
+ * CombiningClassFilter.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class CombiningClassFilter implements ClassFilter
+{
+   /** The filters */
+   private ClassFilter[] filters;
+   
+   /**
+    * Create a new CombiningClassFilter.
+    * 
+    * @param filters the filters
+    * @return the filter
+    * @throws IllegalArgumentException for null filters
+    */
+   public static CombiningClassFilter create(ClassFilter... filters)
+   {
+      return new CombiningClassFilter(filters);
+   }
+   
+   /**
+    * Create a new CombiningClassFilter.
+    * 
+    * @param filters the filters
+    * @throws IllegalArgumentException for null filters
+    */
+   public CombiningClassFilter(ClassFilter[] filters)
+   {
+      if (filters == null)
+         throw new IllegalArgumentException("Null filters");
+      this.filters = filters;
+   }
+   
+   public boolean matchesClassName(String className)
+   {
+      for (ClassFilter filter : filters)
+      {
+         if (filter.matchesClassName(className))
+            return true;
+      }
+      return false;
+   }
+
+   public boolean matchesResourcePath(String resourcePath)
+   {
+      for (ClassFilter filter : filters)
+      {
+         if (filter.matchesResourcePath(resourcePath))
+            return true;
+      }
+      return false;
+   }
+   
+   @Override
+   public String toString()
+   {
+      StringBuilder builder = new StringBuilder();
+      for (int i = 0; i < filters.length; ++i)
+      {
+         builder.append(filters[i]);
+         if (i < filters.length-1)
+            builder.append(", ");
+      }
+      return builder.toString();
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/JavaOnlyClassFilter.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -44,4 +44,10 @@
    {
       return "JAVA_ONLY";
    }
+
+   @Override
+   public void setIncludeJava(boolean includeJava)
+   {
+      throw new UnsupportedOperationException("This class is immutable");
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/NothingButJavaClassFilter.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -44,4 +44,10 @@
    {
       return "NOTHING_BUT_JAVA";
    }
+
+   @Override
+   public void setIncludeJava(boolean includeJava)
+   {
+      throw new UnsupportedOperationException("This class is immutable");
+   }
 }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/filter/PatternClassFilter.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -41,6 +41,9 @@
    /** The resource patterns as regular expressions */
    private Pattern[] resourcePatterns;
    
+   /** Whether to include java */
+   private boolean includeJava = false;
+   
    /**
     * Create a new PatternClassFilter.
     * 
@@ -76,6 +79,26 @@
       }
    }
 
+   /**
+    * Get the includeJava.
+    * 
+    * @return the includeJava.
+    */
+   public boolean isIncludeJava()
+   {
+      return includeJava;
+   }
+
+   /**
+    * Set the includeJava.
+    * 
+    * @param includeJava the includeJava.
+    */
+   public void setIncludeJava(boolean includeJava)
+   {
+      this.includeJava = includeJava;
+   }
+
    public boolean matchesClassName(String className)
    {
       if (className == null)
@@ -87,7 +110,9 @@
          if (matcher.matches())
             return true;
       }
-      return false;
+      if (includeJava == false)
+         return false;
+      return JavaOnlyClassFilter.INSTANCE.matchesClassName(className);
    }
 
    public boolean matchesResourcePath(String resourcePath)
@@ -101,12 +126,18 @@
          if (matcher.matches())
             return true;
       }
-      return false;
+      if (includeJava == false)
+         return false;
+      return JavaOnlyClassFilter.INSTANCE.matchesResourcePath(resourcePath);
    }
 
    @Override
    public String toString()
    {
-      return Arrays.asList(classPatterns).toString();
+      StringBuilder builder = new StringBuilder();
+      builder.append(Arrays.asList(classPatterns));
+      if (isIncludeJava())
+         builder.append(" <INCLUDE_JAVA>");
+      return builder.toString();
    }
 }

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-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -261,7 +261,7 @@
             ProtectionDomain protectionDomain = basePolicy.getProtectionDomain(name, resourcePath);
             try
             {
-               byteCode = policy.transform(name, byteCode, protectionDomain);
+              byteCode = policy.transform(name, byteCode, protectionDomain);
             }
             catch (Throwable t)
             {

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-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -165,7 +165,7 @@
    {
       BaseClassLoaderSystem system = getClassLoaderSystem();
       if (system != null)
-         system.transform(classLoader, className, byteCode, protectionDomain);
+         return system.transform(classLoader, className, byteCode, protectionDomain);
       return byteCode;
    }
    

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-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -137,7 +137,7 @@
    {
       BaseClassLoaderDomain domain = getClassLoaderDomain();
       if (domain != null)
-         domain.transform(getClassLoader(), className, byteCode, protectionDomain);
+         return domain.transform(getClassLoader(), className, byteCode, protectionDomain);
       return byteCode;
    }
 

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/PackageClassFilter.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -23,7 +23,6 @@
 
 import java.util.Arrays;
 
-import org.jboss.classloader.plugins.filter.JavaOnlyClassFilter;
 import org.jboss.classloader.plugins.filter.PatternClassFilter;
 
 /**
@@ -37,9 +36,6 @@
    /** The patterns as regular expressions */
    private String[] packageNames;
    
-   /** Whether to include java */
-   private boolean includeJava = false;
-   
    /**
     * Convert package names to class patterns
     * 
@@ -118,50 +114,12 @@
       this.packageNames = packageNames;
    }
 
-   /**
-    * Get the includeJava.
-    * 
-    * @return the includeJava.
-    */
-   public boolean isIncludeJava()
-   {
-      return includeJava;
-   }
-
-   /**
-    * Set the includeJava.
-    * 
-    * @param includeJava the includeJava.
-    */
-   public void setIncludeJava(boolean includeJava)
-   {
-      this.includeJava = includeJava;
-   }
-
-   public boolean matchesClassName(String className)
-   {
-      if (super.matchesClassName(className))
-         return true;
-      if (includeJava == false)
-         return false;
-      return JavaOnlyClassFilter.INSTANCE.matchesClassName(className);
-   }
-
-   public boolean matchesResourcePath(String resourcePath)
-   {
-      if (super.matchesResourcePath(resourcePath))
-         return true;
-      if (includeJava == false)
-         return false;
-      return JavaOnlyClassFilter.INSTANCE.matchesResourcePath(resourcePath);
-   }
-
    @Override
    public String toString()
    {
       StringBuilder builder = new StringBuilder();
       builder.append(Arrays.asList(packageNames));
-      if (includeJava)
+      if (isIncludeJava())
          builder.append(" <INCLUDE_JAVA>");
       return builder.toString();
    }

Modified: 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	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -50,7 +50,22 @@
             String className = System.getProperty(JDKChecker.class.getName(), defaultChecker);
             try
             {
-               Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
+               Class<?> clazz = null;
+               try
+               {
+                  clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
+               }
+               catch (ClassNotFoundException e)
+               {
+                  try
+                  {
+                     clazz = getClass().getClassLoader().loadClass(className);
+                  }
+                  catch (ClassNotFoundException ignored)
+                  {
+                     throw e;
+                  }
+               }
                Object result = clazz.newInstance();
                return JDKChecker.class.cast(result);
             }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTest.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTest.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTest.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -21,23 +21,11 @@
  */
 package org.jboss.classloader.test.support;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.extensions.TestSetup;
 import junit.framework.Test;
 
-import org.jboss.classloader.plugins.system.DefaultClassLoaderSystem;
-import org.jboss.classloader.spi.ClassLoaderDomain;
 import org.jboss.classloader.spi.ClassLoaderSystem;
-import org.jboss.classloader.spi.ParentPolicy;
-import org.jboss.classloader.spi.filter.ClassFilter;
-import org.jboss.classloader.spi.filter.PackageClassFilter;
-import org.jboss.logging.Logger;
 import org.jboss.test.AbstractTestCaseWithSetup;
 import org.jboss.test.AbstractTestDelegate;
-import org.jboss.test.logging.LoggingPlugin;
-import org.jboss.test.security.PolicyPlugin;
 
 /**
  * IsolatedClassLoaderTest.
@@ -47,8 +35,8 @@
  */
 public abstract class IsolatedClassLoaderTest extends AbstractTestCaseWithSetup
 {
-   // The last classloader system
-   private static ClassLoaderSystem system;
+   // The last helper
+   private static IsolatedClassLoaderTestHelper helper;
 
    /**
     * Get the delegate
@@ -97,105 +85,33 @@
     * It exports everything
     * It imports nothing
     * 
-    * @see #getParentPackages()
     * @param clazz the test class
     * @param packages the classes in packages that should also be included
     * @return the test
     */
    public static Test suite(Class<?> clazz, Class<?>... packages)
    {
-      return suite(clazz, false, getParentPackages(), packages);
+      return suite(clazz, false, packages);
    }
    
    /**
     * Create a test with test's package visible and the packages
-    * of the classes listed with the default parent packages
-    *
-    * It exports everything
-    * 
-    * @see #getParentPackages()
-    * @param importAll whether to import all
-    * @param clazz the test class
-    * @param packages the classes in packages that should also be included
-    * @return the test
-    */
-   public static Test suite(Class<?> clazz, boolean importAll, Class<?>... packages)
-   {
-      return suite(clazz, importAll, getParentPackages(), packages);
-   }
-   
-   /**
-    * Create a test with test's package visible and the packages
     * of the classes listed
     * 
     * It exports everything
     * 
-    * @see #getParentPackages()
     * @param clazz the test class
     * @param importAll whether to import all
-    * @param parentPackages the packages that are not isolated
     * @param packages the classes in packages that should also be included
     * @return the test
     */
-   public static Test suite(Class<?> clazz, boolean importAll, Set<String> parentPackages, Class<?>... packages)
+   public static Test suite(Class<?> clazz, boolean importAll, Class<?>... packages)
    {
-      // A new classloader system for each test
-      system = new DefaultClassLoaderSystem();
-
-      // The parent filter
-      PackageClassFilter filter = new PackageClassFilter(parentPackages.toArray(new String[parentPackages.size()]));
-      filter.setIncludeJava(true);
-      ParentPolicy parentPolicy = new ParentPolicy(filter, ClassFilter.NOTHING);
-      ClassLoaderDomain domain = system.createAndRegisterDomain("TEST", parentPolicy);
-      
-      // Configure the policy for the test
-      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
-      Set<Class> classes = new HashSet<Class>();
-      classes.add(clazz);
-      for (Class<?> c : packages)
-         classes.add(c);
-      policy.setImportAll(importAll);
-      policy.setPathsAndPackageNames(classes.toArray(new Class[classes.size()]));
-      
-      // Create the classloader
-      ClassLoader classLoader = system.registerClassLoaderPolicy(domain, policy);
-
-      // Load the class from the isolated classloader
-      try
-      {
-         clazz = classLoader.loadClass(clazz.getName());
-      }
-      catch (ClassNotFoundException e)
-      {
-         throw new RuntimeException("Unable to load test class in isolated classloader " + clazz, e);
-      }
-      
+      helper = new IsolatedClassLoaderTestHelper();
+      Class<?> newClass = helper.initializeClassLoader(clazz, importAll, packages);
       // Create the test based on the isolated class
-      return AbstractTestCaseWithSetup.suite(clazz);
+      return AbstractTestCaseWithSetup.suite(newClass);
    }
-
-   /**
-    * Get the packages that should not be isolated
-    * (and by transience their dependent classes, e.g. log4j in the classpath)<p>
-    * 
-    * NOTE: The transient packages cannot be used directly by the test
-    * unless explicity mentioned in this list.
-    * 
-    * @return the test support packages
-    */
-   public static Set<String> getParentPackages()
-   {
-      Set<String> result = new HashSet<String>();
-      result.add(Test.class.getPackage().getName());
-      result.add(TestSetup.class.getPackage().getName());
-      result.add(AbstractTestCaseWithSetup.class.getPackage().getName());
-      result.add(Logger.class.getPackage().getName());
-      result.add(LoggingPlugin.class.getPackage().getName());
-      result.add(PolicyPlugin.class.getPackage().getName());
-      result.add(ClassLoaderSystem.class.getPackage().getName());
-      result.add(IsolatedClassLoaderTest.class.getPackage().getName());
-      return result;
-   }
    
    @Override
    protected void setUp() throws Exception
@@ -220,9 +136,9 @@
     * 
     * @return the classloader
     */
-   public ClassLoaderSystem getClassLoaderSystem()
+   public static ClassLoaderSystem getClassLoaderSystem()
    {
-      return system;
+      return helper.getSystem();
    }
    
    /**
@@ -236,7 +152,7 @@
     * @return the classloader
     * @throws Exception for any error
     */
-   protected ClassLoader createClassLoader(String name, String packages) throws Exception
+   protected static ClassLoader createClassLoader(String name, String... packages) throws Exception
    {
       return createClassLoader(name, true, packages);
    }
@@ -252,14 +168,9 @@
     * @return the classloader
     * @throws Exception for any error
     */
-   protected ClassLoader createClassLoader(String name, boolean importAll, String packages) throws Exception
+   protected static ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
    {
-      ClassLoaderSystem system = getClassLoaderSystem();
-      ClassLoaderDomain domain = system.getDomain("TEST");
-      MockClassLoaderPolicy policy = MockClassLoaderHelper.createMockClassLoaderPolicy(name);
-      policy.setImportAll(importAll);
-      policy.setPathsAndPackageNames(packages);
-      return MockClassLoaderHelper.registerMockClassLoader(system, domain, policy);
+      return helper.createClassLoader(name, importAll, packages);
    }
 
    /**
@@ -268,9 +179,8 @@
     * @param classLoader the classloader
     * @throws Exception for any error
     */
-   protected void unregisterClassLoader(ClassLoader classLoader) throws Exception
+   protected static void unregisterClassLoader(ClassLoader classLoader) throws Exception
    {
-      ClassLoaderSystem system = getClassLoaderSystem();
-      system.unregisterClassLoader(classLoader);
+      helper.unregisterClassLoader(classLoader);
    }
 }

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/IsolatedClassLoaderTestHelper.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -0,0 +1,485 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2006, 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.test.support;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junit.extensions.TestSetup;
+import junit.framework.Test;
+
+import org.jboss.classloader.plugins.filter.CombiningClassFilter;
+import org.jboss.classloader.plugins.system.DefaultClassLoaderSystem;
+import org.jboss.classloader.spi.ClassLoaderDomain;
+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.filter.ClassFilter;
+import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
+import org.jboss.classloader.spi.filter.PackageClassFilter;
+import org.jboss.logging.Logger;
+import org.jboss.test.AbstractTestCaseWithSetup;
+import org.jboss.test.logging.LoggingPlugin;
+import org.jboss.test.security.PolicyPlugin;
+
+/**
+ * IsolatedClassLoaderTestHelper.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class IsolatedClassLoaderTestHelper
+{
+   /** The classloader system */
+   private ClassLoaderSystem system;
+   
+   /** The classLoader domain */
+   private ClassLoaderDomain domain;
+   
+   /** The classLoader policy */
+   private ClassLoaderPolicy policy;
+   
+   /**
+    * Get the domain.
+    * 
+    * @return the domain.
+    */
+   public ClassLoaderDomain getDomain()
+   {
+      return domain;
+   }
+
+   /**
+    * Get the system.
+    * 
+    * @return the system.
+    */
+   public ClassLoaderSystem getSystem()
+   {
+      return system;
+   }
+
+   /**
+    * Get the policy.
+    * 
+    * @return the policy.
+    */
+   public ClassLoaderPolicy getPolicy()
+   {
+      return policy;
+   }
+
+   /**
+    * Set the policy.
+    * 
+    * @param policy the policy.
+    */
+   public void setPolicy(ClassLoaderPolicy policy)
+   {
+      this.policy = policy;
+   }
+
+   /**
+    * Get the packages that should not be isolated
+    * (and by transience their dependent classes, e.g. log4j in the classpath)<p>
+    * 
+    * NOTE: The transient packages cannot be used directly by the test
+    * unless explicity mentioned in this list.
+    * 
+    * @return the test support packages
+    */
+   public static Set<String> getParentPackages()
+   {
+      Set<String> result = new HashSet<String>();
+      result.add(Test.class.getPackage().getName());
+      result.add(TestSetup.class.getPackage().getName());
+      result.add(AbstractTestCaseWithSetup.class.getPackage().getName());
+      result.add(Logger.class.getPackage().getName());
+      result.add(LoggingPlugin.class.getPackage().getName());
+      result.add(PolicyPlugin.class.getPackage().getName());
+      result.add(ClassLoaderSystem.class.getPackage().getName());
+      result.add(IsolatedClassLoaderTest.class.getPackage().getName());
+      return result;
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param importAll whether to import all
+    * @param packages the reference classes for the packages
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, boolean importAll, Class<?>... packages)
+   {
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+      Set<Class> classes = new HashSet<Class>();
+      classes.add(clazz);
+      for (Class<?> c : packages)
+         classes.add(c);
+      policy.setImportAll(importAll);
+      policy.setPathsAndPackageNames(classes.toArray(new Class[classes.size()]));
+
+      return initializeClassLoader(clazz, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderPolicy policy)
+   {
+      ClassLoaderSystem system = new DefaultClassLoaderSystem();
+      return initializeClassLoader(clazz, system, policy, getParentPackages());
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassLoaderPolicy policy)
+   {
+      return initializeClassLoader(clazz, system, policy, getParentPackages());
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param policy the policy
+    * @param parentPackages the parentPackages
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassLoaderPolicy policy, Set<String> parentPackages)
+   {
+      String[] parentPkgs = parentPackages.toArray(new String[parentPackages.size()]);
+      return initializeClassLoader(clazz, system, policy, parentPkgs);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param policy the policy
+    * @param parentPackages the parentPackages
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassLoaderPolicy policy, String... parentPackages)
+   {
+      // The parent filter
+      PackageClassFilter filter = new PackageClassFilter(parentPackages);
+      filter.setIncludeJava(true);
+      return initializeClassLoader(clazz, system, filter, ClassFilter.NOTHING, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param parentFilter the parent filter
+    * @param importAll whether to import all
+    * @param packages the reference classes for the packages
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassFilter parentFilter, boolean importAll, Class<?>... packages)
+   {
+      MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+      Set<Class> classes = new HashSet<Class>();
+      classes.add(clazz);
+      for (Class<?> c : packages)
+         classes.add(c);
+      policy.setImportAll(importAll);
+      policy.setPathsAndPackageNames(classes.toArray(new Class[classes.size()]));
+      return initializeClassLoader(clazz, parentFilter, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param parentFilter the parent filter
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassFilter parentFilter, ClassLoaderPolicy policy)
+   {
+      ClassLoaderSystem system = new DefaultClassLoaderSystem();
+      return initializeClassLoader(clazz, system, parentFilter, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param parentFilter the parent filter
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassFilter parentFilter, ClassLoaderPolicy policy)
+   {
+      Set<String> parentPackages = getParentPackages();
+      String[] parentPkgs = parentPackages.toArray(new String[parentPackages.size()]);
+      PackageClassFilter filter = new PackageClassFilter(parentPkgs);
+      filter.setIncludeJava(true);
+      CombiningClassFilter beforeFilter = CombiningClassFilter.create(filter, parentFilter);
+      ParentPolicy parentPolicy = new ParentPolicy(beforeFilter, ClassFilter.NOTHING);
+      return initializeClassLoader(clazz, system, parentPolicy, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param beforeFilter the before filter
+    * @param afterFilter the after filter
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassFilter beforeFilter, ClassFilter afterFilter, ClassLoaderPolicy policy)
+   {
+      ParentPolicy parentPolicy = new ParentPolicy(beforeFilter, afterFilter);
+      return initializeClassLoader(clazz, system, parentPolicy, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param parentPolicy the parent policy
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ParentPolicy parentPolicy, ClassLoaderPolicy policy)
+   {
+      ClassLoaderDomain domain = system.createAndRegisterDomain("TEST", parentPolicy);
+      return initializeClassLoader(clazz, system, domain, policy);
+   }
+
+   /**
+    * Initialize the classloader system
+    * 
+    * @param clazz the original clazz
+    * @param system the system
+    * @param domain the domain
+    * @param policy the policy
+    * @return the clazz loaded from the new classloading system
+    */
+   public Class<?> initializeClassLoader(Class<?> clazz, ClassLoaderSystem system, ClassLoaderDomain domain, ClassLoaderPolicy policy)
+   {
+      // Remember some information
+      this.system = system;
+      this.domain = domain;
+      this.policy = policy;
+      
+      // Create the classloader
+      ClassLoader classLoader = system.registerClassLoaderPolicy(domain, policy);
+
+      // Load the class from the isolated classloader
+      try
+      {
+         clazz = classLoader.loadClass(clazz.getName());
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new RuntimeException("Unable to load test class in isolated classloader " + clazz, e);
+      }
+      
+      return clazz;
+   }
+   
+   /**
+    * Create a classloader
+    * 
+    * It exports everything
+    *
+    * @param name the name
+    * @param importAll whether to import all
+    * @param packages the packages
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   public ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
+   {
+      MockClassLoaderPolicy policy = MockClassLoaderHelper.createMockClassLoaderPolicy(name);
+      policy.setImportAll(importAll);
+      policy.setPathsAndPackageNames(packages);
+      return createClassLoader(policy);
+   }
+   
+   /**
+    * Create a classloader
+    *
+    * @param policy the policy
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   public ClassLoader createClassLoader(MockClassLoaderPolicy policy) throws Exception
+   {
+      ClassLoaderDomain domain = getDomain();
+      return createClassLoader(domain, policy);
+   }
+   
+   /**
+    * Create a classloader
+    *
+    * @param domainName the domainName
+    * @param policy the policy
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   public ClassLoader createClassLoader(String domainName, MockClassLoaderPolicy policy) throws Exception
+   {
+      ClassLoaderSystem system = getSystem();
+      ClassLoaderDomain domain = system.getDomain(domainName);
+      return createClassLoader(domain, policy);
+   }
+   
+   /**
+    * Create a classloader
+    *
+    * @param domain the domain
+    * @param policy the policy
+    * @return the classloader
+    * @throws Exception for any error
+    */
+   public ClassLoader createClassLoader(ClassLoaderDomain domain, MockClassLoaderPolicy policy) throws Exception
+   {
+      ClassLoaderSystem system = getSystem();
+      return MockClassLoaderHelper.registerMockClassLoader(system, domain, policy);
+   }
+
+   /**
+    * Unregister a classloader
+    * 
+    * @param classLoader the classloader
+    * @throws Exception for any error
+    */
+   public void unregisterClassLoader(ClassLoader classLoader) throws Exception
+   {
+      ClassLoaderSystem system = getSystem();
+      system.unregisterClassLoader(classLoader);
+   }
+
+   /**
+    * Create the default delegate loader
+    * 
+    * @return the loaders
+    */
+   public List<? extends DelegateLoader> createDefaultDelegates()
+   {
+      return createDelegates(getPolicy());
+   }
+
+   /**
+    * Create delegate loaders from policies
+    * 
+    * @param policies the policies
+    * @return the loaders
+    */
+   public List<? extends DelegateLoader> createDelegates(ClassLoaderPolicy... policies)
+   {
+      List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
+      for (ClassLoaderPolicy policy : policies)
+         delegates.add(new FilteredDelegateLoader(policy));
+      return delegates;
+   }
+
+   /**
+    * Create a scoped classloader domain using the test domain as parent
+    * using the parent first policy
+    * 
+    * @param name the name
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomainParentFirst(String name)
+   {
+      return createScopedClassLoaderDomain(name, ParentPolicy.BEFORE, getDomain());
+   }
+
+   /**
+    * Create a scoped classloader domain using the test domain as parent
+    * using the parent last policy
+    * 
+    * @param name the name
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomainParentLast(String name)
+   {
+      return createScopedClassLoaderDomain(name, ParentPolicy.AFTER_BUT_JAVA_BEFORE, getDomain());
+   }
+
+   /**
+    * Create a scoped classloader domain using the test domain as parent
+    * 
+    * @param name the name
+    * @param parentPolicy the parent policy
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomain(String name, ParentPolicy parentPolicy)
+   {
+      return createScopedClassLoaderDomain(name, parentPolicy, getDomain());
+   }
+
+   /**
+    * Create a scoped classloader domain
+    * 
+    * @param name the name
+    * @param parentPolicy the parent policy
+    * @param parent the parent
+    * @return the domain
+    */
+   public ClassLoaderDomain createScopedClassLoaderDomain(String name, ParentPolicy parentPolicy, Loader parent)
+   {
+      ClassLoaderSystem system = getSystem();
+      return system.createAndRegisterDomain(name, parentPolicy, parent);
+   }
+
+   /**
+    * Unregister a domain
+    * 
+    * @param name the domain name
+    */
+   public void unregisterDomain(String name)
+   {
+      ClassLoaderSystem system = getSystem();
+      ClassLoaderDomain domain = system.getDomain(name);
+      if (domain == null)
+         throw new IllegalStateException("Domain is not registered: " + name);
+      system.unregisterDomain(domain);
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java	2007-07-25 18:03:47 UTC (rev 64276)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/test/support/MockClassLoaderPolicy.java	2007-07-25 18:10:42 UTC (rev 64277)
@@ -185,7 +185,7 @@
     * 
     * @param paths the paths to expose
     */
-   public void setPaths(String[] paths)
+   public void setPaths(String... paths)
    {
       this.paths = paths;
    }
@@ -215,7 +215,7 @@
     * 
     * @param packageNames the exported packages
     */
-   public void setPackageNames(String[] packageNames)
+   public void setPackageNames(String... packageNames)
    {
       this.packageNames = packageNames;
    }




More information about the jboss-cvs-commits mailing list