[jboss-cvs] JBossAS SVN: r70173 - 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 Feb 27 09:15:54 EST 2008


Author: adrian at jboss.org
Date: 2008-02-27 09:15:54 -0500 (Wed, 27 Feb 2008)
New Revision: 70173

Added:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicyFactory.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicyFactory.java
Modified:
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/DelegateLoader.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/BaseDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderInformation.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderManager.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoadingTask.java
   projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicy.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestDelegateLoader.java
   projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/test/ClassLoaderPolicyUnitTestCase.java
Log:
[JBMICROCONT-241] - Add the ability to lazily link policies as delegate imports

Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicyFactory.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicyFactory.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicyFactory.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -0,0 +1,38 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.classloader.spi;
+
+/**
+ * ClassLoaderPolicyFactory.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public interface ClassLoaderPolicyFactory
+{
+   /**
+    * Create a classloader policy
+    * 
+    * @return the classloader policy
+    */
+   ClassLoaderPolicy createClassLoaderPolicy();
+}

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/DelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/DelegateLoader.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/DelegateLoader.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -41,4 +41,15 @@
    {
       super(delegate);
    }
+
+   /**
+    * Create a new DelegateLoader.
+    * 
+    * @param factory the factory
+    * @throws IllegalArgumentException for a null delegate
+    */
+   public DelegateLoader(ClassLoaderPolicyFactory factory)
+   {
+      super(factory);
+   }
 }

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	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -166,7 +166,8 @@
          {
             BaseDelegateLoader baseDelegate = delegate;
             BaseClassLoaderPolicy otherPolicy = baseDelegate.getPolicy();
-            result.add(otherPolicy.getObjectName());
+            if (otherPolicy != null)
+               result.add(otherPolicy.getObjectName());
          }
       }
       return result;

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	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -580,9 +580,9 @@
             
             // See whether the policies allow caching/blacklisting
             BaseClassLoaderPolicy loaderPolicy = exported.getPolicy();
-            if (loaderPolicy.isCacheable() == false)
+            if (loaderPolicy == null || loaderPolicy.isCacheable() == false)
                canCache = false;
-            if (loaderPolicy.isBlackListable() == false)
+            if (loaderPolicy == null || loaderPolicy.isBlackListable() == false)
                canBlackList = false;
 
             if (exported.getResource(name) != null)
@@ -638,9 +638,9 @@
             
             // See whether the policies allow caching/blacklisting
             BaseClassLoaderPolicy loaderPolicy = loader.getPolicy();
-            if (loaderPolicy.isCacheable() == false)
+            if (loaderPolicy == null || loaderPolicy.isCacheable() == false)
                canCache = false;
-            if (loaderPolicy.isBlackListable() == false)
+            if (loaderPolicy == null || loaderPolicy.isBlackListable() == false)
                canBlackList = false;
 
             result = loader.getResource(name);
@@ -1168,17 +1168,22 @@
       if (getClassLoaderSystem() == null)
          throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
       
+      ClassLoaderPolicy policy = classLoader.getPolicy();
+      BaseDelegateLoader exported = policy.getExported();
+      if (exported != null && exported.getPolicy() == null)
+         throw new IllegalStateException("The exported delegate " + exported + " is too lazy for " + policy.toLongString());
+      
       try
       {
-         beforeRegisterClassLoader(classLoader, classLoader.getPolicy());
+         beforeRegisterClassLoader(classLoader, policy);
       }
       catch (Throwable t)
       {
          log.warn("Error in beforeRegisterClassLoader: " + this + " classLoader=" + classLoader.toLongString(), t);
       }
       
-      BaseClassLoaderPolicy policy = classLoader.getPolicy();
-      policy.setClassLoaderDomain(this);
+      BaseClassLoaderPolicy basePolicy = classLoader.getPolicy();
+      basePolicy.setClassLoaderDomain(this);
 
       synchronized (classLoaders)
       {

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	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -25,6 +25,7 @@
 import java.net.URL;
 import java.util.Set;
 
+import org.jboss.classloader.spi.ClassLoaderPolicyFactory;
 import org.jboss.classloader.spi.Loader;
 import org.jboss.logging.Logger;
 
@@ -40,8 +41,11 @@
    private static final Logger log = Logger.getLogger(BaseDelegateLoader.class);
    
    /** The delegate loader policy */
-   private BaseClassLoaderPolicy delegate;
+   private volatile BaseClassLoaderPolicy delegate;
 
+   /** The policy factory */
+   private ClassLoaderPolicyFactory factory;
+   
    /**
     * Create a new BaseDelegateLoader.
     * 
@@ -55,69 +59,75 @@
       this.delegate = delegate;
    }
    
+   /**
+    * Create a new BaseDelegateLoader.
+    * 
+    * @param factory the factory
+    * @throws IllegalArgumentException for a null factory
+    */
+   public BaseDelegateLoader(ClassLoaderPolicyFactory factory)
+   {
+      if (factory == null)
+         throw new IllegalArgumentException("Null factory");
+      this.factory = factory;
+   }
+   
    BaseClassLoaderPolicy getPolicy()
    {
+      BaseClassLoaderPolicy delegate = this.delegate;
+      if (delegate == null)
+         delegate = factory.createClassLoaderPolicy();
+      if (delegate == null)
+         log.trace("Factory did not create a delegate: " + factory);
       return delegate;
    }
-   
-   public Class<?> loadClass(String className)
+
+   BaseClassLoader getBaseClassLoader(String context)
    {
-      BaseClassLoader classLoader;
+      BaseClassLoader result = null;
       try
       {
-         classLoader = delegate.getClassLoader();
+         BaseClassLoaderPolicy policy = getPolicy();
+         if (policy != null)
+            result = policy.getClassLoader();
       }
-      catch (IllegalStateException e)
+      catch (IllegalStateException ignored)
       {
-         log.warn("Not loading from policy that has no classLoader: " + toLongString());
-         return null;
       }
-      return classLoader.loadClassLocally(className);
+      if (result == null)
+         log.warn("Not " + context + " from policy that has no classLoader: " + toLongString());
+      return result;
    }
    
+   public Class<?> loadClass(String className)
+   {
+      BaseClassLoader classLoader = getBaseClassLoader("loading class " + className);
+      if (classLoader != null)
+         return classLoader.loadClassLocally(className);
+      return null;
+   }
+   
    public URL getResource(String name)
    {
-      BaseClassLoader classLoader;
-      try
-      {
-         classLoader = delegate.getClassLoader();
-      }
-      catch (IllegalStateException e)
-      {
-         log.warn("Not loading from policy that has no classLoader: " + toLongString());
-         return null;
-      }
-      return classLoader.getResourceLocally(name);
+      BaseClassLoader classLoader = getBaseClassLoader("getting resource " + name);
+      if (classLoader != null)
+         return classLoader.getResourceLocally(name);
+      return null;
    }
 
    public void getResources(String name, Set<URL> urls) throws IOException
    {
-      BaseClassLoader classLoader;
-      try
-      {
-         classLoader = delegate.getClassLoader();
-      }
-      catch (IllegalStateException e)
-      {
-         log.warn("Not loading from policy that has no classLoader: " + toLongString());
-         return;
-      }
-      classLoader.getResourcesLocally(name, urls);
+      BaseClassLoader classLoader = getBaseClassLoader("getting resources " + name);
+      if (classLoader != null)
+         classLoader.getResourcesLocally(name, urls);
    }
 
    public Package getPackage(String name)
    {
-      BaseClassLoader classLoader;
-      try
-      {
-         classLoader = delegate.getClassLoader();
-      }
-      catch (IllegalStateException e)
-      {
-         log.warn("Not getting package from policy that has no classLoader: " + toLongString());
-         return null;
-      }
-      return classLoader.getPackageLocally(name);
+      BaseClassLoader classLoader = getBaseClassLoader("getting package " + name);
+      if (classLoader != null)
+         return classLoader.getPackageLocally(name);
+      return null;
    }
 
    public void getPackages(Set<Package> packages)
@@ -145,7 +155,10 @@
       StringBuilder builder = new StringBuilder();
       builder.append(getClass().getSimpleName());
       builder.append("@").append(Integer.toHexString(System.identityHashCode(this)));
-      builder.append("{delegate=").append(delegate.toLongString());
+      if (delegate != null)
+         builder.append("{delegate=").append(delegate.toLongString());
+      else
+         builder.append("{factory=").append(factory);
       toLongString(builder);
       builder.append('}');
       return builder.toString();
@@ -166,7 +179,10 @@
       StringBuilder builder = new StringBuilder();
       builder.append(getClass().getSimpleName());
       builder.append("@").append(Integer.toHexString(System.identityHashCode(this)));
-      builder.append("{delegate=").append(delegate);
+      if (delegate != null)
+         builder.append("{delegate=").append(delegate);
+      else
+         builder.append("{factory=").append(factory);
       builder.append('}');
       return builder.toString();
    }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderInformation.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderInformation.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -96,9 +96,9 @@
                throw new IllegalStateException(policy + " null delegate in " + delegates);
             BaseDelegateLoader baseDelegate = delegate;
             BaseClassLoaderPolicy delegatePolicy = baseDelegate.getPolicy();
-            if (delegatePolicy.isCacheable() == false)
+            if (delegatePolicy == null || delegatePolicy.isCacheable() == false)
                canCache = false;
-            if (delegatePolicy.isBlackListable() == false)
+            if (delegatePolicy == null || delegatePolicy.isBlackListable() == false)
                canBlackList = false;
          }
       }

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderManager.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderManager.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoaderManager.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -329,6 +329,8 @@
       {
          BaseDelegateLoader delegateLoader = (BaseDelegateLoader) loader;
          BaseClassLoaderPolicy policy = delegateLoader.getPolicy();
+         if (policy == null)
+            throw new IllegalStateException("Null policy for " + delegateLoader);
          classLoader = policy.getClassLoader();
       }
       

Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoadingTask.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoadingTask.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/ClassLoadingTask.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -402,7 +402,10 @@
          if (loader instanceof BaseDelegateLoader)
          {
             BaseDelegateLoader delegateLoader = (BaseDelegateLoader) loader;
-            return delegateLoader.getPolicy().getClassLoader();
+            BaseClassLoaderPolicy policy = delegateLoader.getPolicy();
+            if (policy == null)
+               throw new IllegalStateException("Null classloader policy for " + loader);
+            return policy.getClassLoader();
          }
          return null;
       }

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	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -27,6 +27,7 @@
 import java.util.Set;
 
 import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderPolicyFactory;
 import org.jboss.classloader.spi.DelegateLoader;
 import org.jboss.logging.Logger;
 
@@ -71,6 +72,32 @@
    }
 
    /**
+    * Create a new FilteredDelegateLoader that does not filter
+    * 
+    * @param factory the factory
+    * @throws IllegalArgumentException for a null parameter
+    */
+   public FilteredDelegateLoader(ClassLoaderPolicyFactory factory)
+   {
+      this(factory, ClassFilter.EVERYTHING);
+   }
+
+   /**
+    * Create a new FilteredDelegateLoader.
+    * 
+    * @param factory the factory
+    * @param filter the filter
+    * @throws IllegalArgumentException for a null parameter
+    */
+   public FilteredDelegateLoader(ClassLoaderPolicyFactory factory, ClassFilter filter)
+   {
+      super(factory);
+      if (filter == null)
+         throw new IllegalArgumentException("Null filter");
+      this.filter = filter;
+   }
+
+   /**
     * Get the filter.
     * 
     * @return the filter.

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicy.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicy.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -79,6 +79,11 @@
    {
       return delegates;
    }
+   
+   public void setDelegates(List<? extends DelegateLoader> delegates)
+   {
+      this.delegates = delegates;
+   }
 
    @Override
    public String[] getPackageNames()

Added: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicyFactory.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicyFactory.java	                        (rev 0)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestClassLoaderPolicyFactory.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -0,0 +1,56 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, 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.test.classloader.policy.support;
+
+import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderPolicyFactory;
+
+/**
+ * TestClassLoaderPolicyFactory.
+ * 
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class TestClassLoaderPolicyFactory implements ClassLoaderPolicyFactory
+{
+   private ClassLoaderPolicy policy;
+   
+   private boolean canCreate;
+   
+   public TestClassLoaderPolicyFactory(ClassLoaderPolicy policy, boolean canCreate)
+   {
+      this.policy = policy;
+      this.canCreate = canCreate;
+   }
+
+   public void setCanCreate(boolean canCreate)
+   {
+      this.canCreate = canCreate;
+   }
+
+   public ClassLoaderPolicy createClassLoaderPolicy()
+   {
+      if (canCreate)
+         return policy;
+      return null;
+   }
+}

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestDelegateLoader.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/support/TestDelegateLoader.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -24,6 +24,7 @@
 import java.net.URL;
 
 import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderPolicyFactory;
 import org.jboss.classloader.spi.DelegateLoader;
 
 /**
@@ -41,6 +42,11 @@
    {
       super(delegate);
    }
+   
+   public TestDelegateLoader(ClassLoaderPolicyFactory factory)
+   {
+      super(factory);
+   }
 
    @Override
    public Class<?> loadClass(String className)

Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/test/ClassLoaderPolicyUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/test/ClassLoaderPolicyUnitTestCase.java	2008-02-27 12:08:59 UTC (rev 70172)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/policy/test/ClassLoaderPolicyUnitTestCase.java	2008-02-27 14:15:54 UTC (rev 70173)
@@ -42,6 +42,7 @@
 import org.jboss.test.classloader.AbstractClassLoaderTest;
 import org.jboss.test.classloader.policy.support.TestClass;
 import org.jboss.test.classloader.policy.support.TestClassLoaderPolicy;
+import org.jboss.test.classloader.policy.support.TestClassLoaderPolicyFactory;
 import org.jboss.test.classloader.policy.support.TestDelegateLoader;
 
 /**
@@ -258,4 +259,141 @@
       assertNotNull("Should have tried to the export delegate to load the class ", exported.loadClassInvoked);
       assertNull("Should NOT have tried to load through us ", policy.getResourceInvoked);
    }
+   
+   public void testFactoryInvoked() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      TestClassLoaderPolicy policy1 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicy policy2 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory2 = new TestClassLoaderPolicyFactory(policy2, true);
+      policy1.delegates = Collections.singletonList(new FilteredDelegateLoader(factory2));
+      ClassLoader classLoader = system.registerClassLoaderPolicy(policy1);
+      system.registerClassLoaderPolicy(policy2);
+      
+      assertLoadClassFail(ClassLoaderDomain.class, classLoader);
+      assertNotNull("Should have tried policy1 ", policy1.getResourceInvoked);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+   }
+   
+   public void testFactoryInvokedSuccessfully() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      TestClassLoaderPolicy policy1 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicy policy2 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory2 = new TestClassLoaderPolicyFactory(policy2, true);
+      policy1.delegates = Collections.singletonList(new FilteredDelegateLoader(factory2));
+      ClassLoader classLoader1 = system.registerClassLoaderPolicy(policy1);
+      ClassLoader classLoader2 = system.registerClassLoaderPolicy(policy2);
+      
+      assertLoadClass(TestClass.class, classLoader1, classLoader2);
+      assertNull("Should NOT have tried policy1 ", policy1.getResourceInvoked);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+   }
+   
+   public void testLazyFactoryInvoked() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      TestClassLoaderPolicy policy1 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicy policy2 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory2 = new TestClassLoaderPolicyFactory(policy2, false);
+      policy1.delegates = Collections.singletonList(new FilteredDelegateLoader(factory2));
+      ClassLoader classLoader = system.registerClassLoaderPolicy(policy1);
+      system.registerClassLoaderPolicy(policy2);
+      
+      assertLoadClassFail(ClassLoaderDomain.class, classLoader);
+      assertNotNull("Should have tried policy1 ", policy1.getResourceInvoked);
+      assertNull("Should have tried policy2 ", policy2.getResourceInvoked);
+
+      factory2.setCanCreate(true);
+      policy1.getResourceInvoked = null;
+      assertLoadClassFail(ClassLoaderDomain.class, classLoader);
+      assertNull("Should NOT have tried policy1 ", policy1.getResourceInvoked);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+   }
+   
+   public void testLazyFactoryInvokedSuccessfully() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      MockClassLoaderPolicy policy1 = createMockClassLoaderPolicy();
+      TestClassLoaderPolicy policy2 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory2 = new TestClassLoaderPolicyFactory(policy2, false);
+      policy1.setDelegates(Collections.singletonList(new FilteredDelegateLoader(factory2)));
+      ClassLoader classLoader1 = system.registerClassLoaderPolicy(policy1);
+      ClassLoader classLoader2 = system.registerClassLoaderPolicy(policy2);
+
+      assertLoadClassFail(TestClass.class, classLoader1);
+      assertNull("Should NOT have tried policy2 ", policy2.getResourceInvoked);
+      
+      factory2.setCanCreate(true);
+      assertLoadClass(TestClass.class, classLoader1, classLoader2);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+   }
+   
+   public void testExportFactoryInvoked() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      MockClassLoaderPolicy mock = createMockClassLoaderPolicy();
+      mock.setImportAll(true);
+      ClassLoader mockClassLoader = system.registerClassLoaderPolicy(mock);
+
+      TestClassLoaderPolicy policy = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory = new TestClassLoaderPolicyFactory(policy, true);
+      policy.packageNames = new String[] { ClassLoaderUtils.getClassPackageName(ClassLoaderDomain.class.getName())};
+      TestDelegateLoader exported = new TestDelegateLoader(factory);
+      policy.exported = exported;
+      system.registerClassLoaderPolicy(policy);
+      
+      assertLoadClassFail(ClassLoaderDomain.class, mockClassLoader);
+      assertNotNull("Should have tried to the export delegate ", exported.getResourceInvoked);
+      assertNotNull("Should have tried to the export delegate to load the class ", exported.loadClassInvoked);
+      assertNull("Should NOT have tried to load through us ", policy.getResourceInvoked);
+   }
+   
+   public void testLazyExportNotAllowed() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      TestClassLoaderPolicy policy = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory = new TestClassLoaderPolicyFactory(policy, false);
+      policy.packageNames = new String[] { ClassLoaderUtils.getClassPackageName(ClassLoaderDomain.class.getName())};
+      TestDelegateLoader exported = new TestDelegateLoader(factory);
+      policy.exported = exported;
+      try
+      {
+         system.registerClassLoaderPolicy(policy);
+         fail("Should not be here!");
+      }
+      catch (Throwable t)
+      {
+         checkThrowable(IllegalStateException.class, t);
+      }
+   }
+   
+   public void testCircularFactoryInDelegates() throws Exception
+   {
+      ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+      TestClassLoaderPolicy policy1 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicy policy2 = new TestClassLoaderPolicy();
+      TestClassLoaderPolicyFactory factory1 = new TestClassLoaderPolicyFactory(policy1, true);
+      TestClassLoaderPolicyFactory factory2 = new TestClassLoaderPolicyFactory(policy2, true);
+      policy1.setDelegates(Collections.singletonList(new FilteredDelegateLoader(factory2)));
+      policy2.setDelegates(Collections.singletonList(new FilteredDelegateLoader(factory1)));
+      ClassLoader classLoader1 = system.registerClassLoaderPolicy(policy1);
+      ClassLoader classLoader2 = system.registerClassLoaderPolicy(policy2);
+
+      assertLoadClass(TestClass.class, classLoader1, classLoader2);
+      assertNull("Should NOT have tried policy1 ", policy1.getResourceInvoked);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+
+      policy1.getResourceInvoked = null;
+      assertLoadClass(TestClass.class, classLoader2);
+      assertNull("Should NOT have tried policy1 ", policy1.getResourceInvoked);
+      assertNotNull("Should have tried policy2 ", policy2.getResourceInvoked);
+   }
 }




More information about the jboss-cvs-commits mailing list