[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