[jboss-cvs] JBossAS SVN: r62636 - in projects/microcontainer/trunk/classloader: src/main/org/jboss/classloader/plugins and 12 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Apr 30 10:10:17 EDT 2007
Author: adrian at jboss.org
Date: 2007-04-30 10:10:17 -0400 (Mon, 30 Apr 2007)
New Revision: 62636
Added:
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java
Modified:
projects/microcontainer/trunk/classloader/.classpath
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java
projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java
Log:
Fix some todos including made the JDK checking hack partially configurable,
added support for shutting down the classloading and finally
running the testsuite under a security manager (although the security config
is currently broken).
Modified: projects/microcontainer/trunk/classloader/.classpath
===================================================================
--- projects/microcontainer/trunk/classloader/.classpath 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/.classpath 2007-04-30 14:10:17 UTC (rev 62636)
@@ -1,22 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="src" path="src/main"/>
- <classpathentry kind="src" path="src/tests"/>
- <classpathentry kind="output" path="target/eclipse-classes"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA.jar" sourcepath="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/profiler/jvmti/jboss-profiler-jvmti/1.0.0.CR5/jboss-profiler-jvmti-1.0.0.CR5.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
- <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA-sources.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
- <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+ <classpathentry kind="src" path="src/main"/>
+ <classpathentry kind="src" output="target/eclipse-classes-tests" path="src/tests"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-log4j/2.0.2.GA/jboss-logging-log4j-2.0.2.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-logging-spi/2.0.4.GA/jboss-common-logging-spi-2.0.4.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-slide/webdavlib/2.0/webdavlib-2.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14.jar" sourcepath="M2_REPO/log4j/log4j/1.2.14/log4j-1.2.14-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA.jar" sourcepath="M2_REPO/jboss/jboss-test/1.0.3.GA/jboss-test-1.0.3.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar" sourcepath="M2_REPO/junit/junit/3.8.1/junit-3.8.1-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/profiler/jvmti/jboss-profiler-jvmti/1.0.0.CR5/jboss-profiler-jvmti-1.0.0.CR5.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA.jar" sourcepath="M2_REPO/jboss/jboss-logging-spi/2.0.2.GA/jboss-logging-spi-2.0.2.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-xerces/xml-apis/2.7.1/xml-apis-2.7.1.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-junit/1.7.0/ant-junit-1.7.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant/1.7.0/ant-1.7.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.7.0/ant-launcher-1.7.0.jar"/>
+ <classpathentry kind="var" path="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA.jar" sourcepath="M2_REPO/jboss/jboss-common-core/2.0.4.GA/jboss-common-core-2.0.4.GA-sources.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-log4j/log4j/1.2.8/log4j-1.2.8.jar"/>
+ <classpathentry kind="var" path="M2_REPO/apache-httpclient/commons-httpclient/2.0.2/commons-httpclient-2.0.2.jar"/>
+ <classpathentry kind="output" path="target/eclipse-classes"/>
</classpath>
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/ClassLoaderUtils.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -29,10 +29,6 @@
import java.security.PrivilegedAction;
import java.security.ProtectionDomain;
-import org.jboss.classloader.spi.base.BaseClassLoader;
-import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
-import org.jboss.util.UnreachableStatementException;
-
/**
* ClassLoaderUtils.
*
@@ -41,9 +37,6 @@
*/
public class ClassLoaderUtils
{
- /** The hack to the security manager */
- private static final Hack hack = new Hack();
-
/**
* Check the class name makes sense
*
@@ -157,35 +150,6 @@
}
/**
- * Used to check whether the classloading request is from the jdk<p>
- *
- * This is a hack because of broken behaviour by the JDKs where they assume
- * they can load their own classes from any classloader.
- *
- * @return true when it is a JDK request
- */
- public static boolean isRequestFromJDK()
- {
- Class[] context = hack.getClassContext();
- for (Class clazz : context)
- {
- // Review others?
- if (Hack.class.isAssignableFrom(clazz) == false &&
- ClassLoaderUtils.class.isAssignableFrom(clazz) == false &&
- BaseClassLoaderDomain.class.isAssignableFrom(clazz) == false &&
- BaseClassLoader.class.isAssignableFrom(clazz) == false &&
- ClassLoader.class.isAssignableFrom(clazz) == false &&
- Class.class.isAssignableFrom(clazz) == false)
- {
- ClassLoader cl = clazz.getClassLoader();
- // Review: I don't think this true for all JDKs? i.e. JDK classes have no classloader.
- return (cl == null);
- }
- }
- throw new UnreachableStatementException();
- }
-
- /**
* Formats the class as a string
*
* @param clazz the class
@@ -217,7 +181,7 @@
builder.append(clazz);
builder.append('{');
- ClassLoader cl = clazz.getClassLoader();
+ ClassLoader cl = getClassLoader(clazz);
builder.append("cl=").append(cl);
builder.append(" codeSource=");
builder.append(getCodeSource(clazz));
@@ -225,6 +189,27 @@
}
/**
+ * Get the classloader for a class
+ *
+ * @param clazz the class
+ * @return the classloader or null if it doesn't have one
+ */
+ private static final ClassLoader getClassLoader(final Class<?> clazz)
+ {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null)
+ return clazz.getClassLoader();
+
+ return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+ {
+ public ClassLoader run()
+ {
+ return clazz.getClassLoader();
+ }
+ });
+ }
+
+ /**
* Get the protected domain for a class
*
* @param clazz the class
@@ -258,18 +243,4 @@
return null;
return protectionDomain.getCodeSource();
}
-
- /**
- * Extend the security manager so we can get access to the stacktrace
- *
- * TODO move this hack somewhere else?
- */
- private static class Hack extends SecurityManager
- {
- @Override
- public Class[] getClassContext()
- {
- return super.getClassContext();
- }
- }
}
Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/plugins/jdk/AbstractJDKChecker.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,110 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.classloader.plugins.jdk;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+import org.jboss.classloader.spi.base.BaseClassLoader;
+import org.jboss.classloader.spi.base.BaseClassLoaderDomain;
+import org.jboss.classloader.spi.jdk.JDKChecker;
+
+/**
+ * AbstractJDKChecker.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class AbstractJDKChecker implements JDKChecker
+{
+ /** The hack to the security manager */
+ private static final Hack hack;
+
+ static
+ {
+ hack = AccessController.doPrivileged(new PrivilegedAction<Hack>()
+ {
+ public Hack run()
+ {
+ return new Hack();
+ }
+ });
+ }
+
+ public boolean isJDKRequest(String name)
+ {
+ Class<?> requesting = getRequestingClass(hack.getClassContext());
+ return isJDKRequestingClass(name, requesting);
+ }
+
+ /**
+ * Get the requesting class
+ *
+ * @param stack the class stack
+ * @return the requesting class
+ */
+ protected Class<?> getRequestingClass(Class[] stack)
+ {
+ for (Class clazz : stack)
+ {
+ if (Hack.class.isAssignableFrom(clazz) == false &&
+ JDKChecker.class.isAssignableFrom(clazz) == false &&
+ BaseClassLoaderDomain.class.isAssignableFrom(clazz) == false &&
+ ClassLoader.class.isAssignableFrom(clazz) == false &&
+ Class.class.isAssignableFrom(clazz) == false)
+ {
+ return clazz;
+ }
+ }
+ throw new RuntimeException("Should not be here!");
+ }
+
+ /**
+ * Whether the requesting class is from the JDK<p>
+ *
+ * The default implementation returs true if the requesting class is not loaded from
+ * {@link BaseClassLoader}
+ *
+ * @param name the name of the class being loaded
+ * @param requesting the requesting class
+ * @return true it is from the JDK
+ */
+ protected boolean isJDKRequestingClass(String name, Class<?> requesting)
+ {
+ ClassLoader cl = requesting.getClassLoader();
+ if (cl == null)
+ return true;
+ return (cl instanceof BaseClassLoader == false);
+ }
+
+ /**
+ * Extend the security manager so we can get access to the stacktrace
+ */
+ private static class Hack extends SecurityManager
+ {
+ @Override
+ public Class[] getClassContext()
+ {
+ return super.getClassContext();
+ }
+ }
+}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderDomain.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -332,16 +332,6 @@
}
/**
- * Get the parent classloader
- *
- * @return the parent classloader
- */
- protected ClassLoader getParentClassLoader()
- {
- return getClass().getClassLoader();
- }
-
- /**
* Fixup the parent to the our classloader as parent if we don't have an explicit one
*/
private void fixUpParent()
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderPolicy.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -33,6 +33,8 @@
import org.jboss.classloader.plugins.filter.PackageClassFilter;
import org.jboss.classloader.spi.base.BaseClassLoaderPolicy;
import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
+import org.jboss.classloader.spi.jdk.JDKChecker;
+import org.jboss.classloader.spi.jdk.JDKCheckerFactory;
import org.jboss.logging.Logger;
/**
@@ -178,6 +180,22 @@
return null;
}
+ /**
+ * Check whether this a request from the jdk if it is return the relevant classloader<p>
+ *
+ * By default this uses the {@Link JDKCheckerFactory} and returns the system classloader if true.
+ *
+ * @param name the class name
+ * @return the classloader
+ */
+ protected ClassLoader isJDKRequest(String name)
+ {
+ JDKChecker checker = JDKCheckerFactory.getChecker();
+ if (checker.isJDKRequest(name))
+ return ClassLoader.getSystemClassLoader();
+ return null;
+ }
+
@Override
protected void toLongString(StringBuilder builder)
{
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/ClassLoaderSystem.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,10 @@
*/
package org.jboss.classloader.spi;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import org.jboss.classloader.plugins.system.ClassLoaderSystemBuilder;
@@ -51,6 +54,9 @@
/** The registered domains by name */
private Map<String, ClassLoaderDomain> registeredDomains = new HashMap<String, ClassLoaderDomain>();
+
+ /** Whether the system is shutdown */
+ private boolean shutdown = false;
/**
* Get the classloading system instance
@@ -69,6 +75,9 @@
*/
public synchronized ClassLoaderDomain getDefaultDomain()
{
+ if (shutdown)
+ throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+
// Already constructed
if (defaultDomain != null)
return defaultDomain;
@@ -165,6 +174,10 @@
{
if (name == null)
throw new IllegalArgumentException("Null name");
+
+ if (shutdown)
+ throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+
ClassLoaderDomain result = registeredDomains.get(name);
// See whether this is the default domain
@@ -221,8 +234,11 @@
private void internalRegisterDomain(String name, ClassLoaderDomain domain)
{
-
+ if (shutdown)
+ throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+
registeredDomains.put(name, domain);
+ super.registerDomain(domain);
log.debug(this + " registered domain=" + domain.toLongString());
}
@@ -236,11 +252,11 @@
*/
public synchronized void unregisterDomain(ClassLoaderDomain domain)
{
-
if (isDomainRegistered(domain) == false)
throw new IllegalStateException("Domain is not registered " + domain);
registeredDomains.remove(domain.getName());
+ super.unregisterDomain(domain);
log.debug(this + " unregistered domain=" + domain.toLongString());
}
@@ -262,36 +278,6 @@
}
/**
- * Unregister a policy with the default domain<p>
- *
- * Equivalent to {@link #unregisterClassLoaderPolicy(ClassLoaderDomain, ClassLoaderPolicy)} using
- * {@link #getDefaultDomain()} as the ClassLoaderDomain
- *
- * @param policy the policy
- * @throws IllegalArgumentException if a parameter is null
- * @throws IllegalStateException if the policy is not registered with the default domain
- */
- public void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
- {
- unregisterClassLoaderPolicy(getDefaultDomain(), policy);
- }
-
- /**
- * Unregister a classloader with the default domain<p>
- *
- * Equivalent to {@link #unregisterClassLoader(ClassLoaderDomain, ClassLoader)} using
- * {@link #getDefaultDomain()} as the ClassLoaderDomain
- *
- * @param classLoader classLoader
- * @throws IllegalArgumentException if a parameter is null
- * @throws IllegalStateException if the policy is not registered with the default domain
- */
- public void unregisterClassLoader(ClassLoader classLoader)
- {
- unregisterClassLoader(getDefaultDomain(), classLoader);
- }
-
- /**
* Register a policy with a domain
*
* @param domain the domain
@@ -304,36 +290,72 @@
{
if (isDomainRegistered(domain) == false)
throw new IllegalArgumentException("Domain is not registered: " + domain);
+
+ synchronized (this)
+ {
+ if (shutdown)
+ throw new IllegalStateException("The classloader system is shutdown: " + toLongString());
+ }
return super.registerClassLoaderPolicy(domain, policy);
}
/**
- * Unregister a policy with a domain
+ * Unregister a policy from its domain
*
- * @param domain the domain
* @param policy the policy
* @throws IllegalArgumentException if a parameter is null
- * @throws IllegalStateException if the domain is not registered or if the policy is not registered with the domain
+ * @throws IllegalStateException if the policy is not registered with the default domain
*/
- public void unregisterClassLoaderPolicy(ClassLoaderDomain domain, ClassLoaderPolicy policy)
+ public void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
{
- if (isDomainRegistered(domain) == false)
- throw new IllegalArgumentException("Domain is not registered: " + domain);
- super.unregisterClassLoaderPolicy(domain, policy);
+ super.unregisterClassLoaderPolicy(policy);
}
/**
- * Unregister a policy with a domain
+ * Unregister a classloader from its domain
*
- * @param domain the domain
- * @param classLoader the class loader
+ * @param classLoader classLoader
* @throws IllegalArgumentException if a parameter is null
- * @throws IllegalStateException if the policy is not registered with the domain
+ * @throws IllegalStateException if the policy is not registered with the default domain
*/
- public void unregisterClassLoader(ClassLoaderDomain domain, ClassLoader classLoader)
+ public void unregisterClassLoader(ClassLoader classLoader)
{
- if (isDomainRegistered(domain) == false)
- throw new IllegalArgumentException("Domain is not registered: " + domain);
- super.unregisterClassLoader(domain, classLoader);
+ super.unregisterClassLoader(classLoader);
}
+
+ /**
+ * Shutdown the classloader system<p>
+ *
+ * Unregisters all domains by default
+ */
+ public synchronized void shutdown()
+ {
+ if (shutdown)
+ return;
+
+ log.debug(toLongString() + " SHUTDOWN!");
+ shutdown = true;
+
+ while (true)
+ {
+ List<ClassLoaderDomain> domains = new ArrayList<ClassLoaderDomain>(registeredDomains.values());
+ Iterator<ClassLoaderDomain> iterator = domains.iterator();
+ if (iterator.hasNext() == false)
+ break;
+
+ while (iterator.hasNext())
+ {
+ ClassLoaderDomain domain = iterator.next();
+ unregisterDomain(domain);
+ }
+ }
+ }
+
+ @Override
+ protected void toLongString(StringBuilder builder)
+ {
+ if (shutdown)
+ builder.append("SHUTDOWN! ");
+ super.toLongString(builder);
+ }
}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoader.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -411,6 +411,14 @@
}
/**
+ * Shutdown the classloader
+ */
+ protected void shutdownClassLoader()
+ {
+ log.debug(toLongString() + " shutdown!");
+ }
+
+ /**
* For subclasses to add things to the long string
*
* @param builder the builder
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderDomain.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -23,6 +23,8 @@
import java.io.IOException;
import java.net.URL;
+import java.security.ProtectionDomain;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -41,7 +43,6 @@
* This class hides some of the implementation details and allows
* package access to the protected methods.
*
- * TODO add handling of domain shutdown
* TODO add caching (needs to be per classloader when not AllExports policy)
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
@@ -51,6 +52,9 @@
/** The log */
private static final Logger log = Logger.getLogger(BaseClassLoaderDomain.class);
+ /** The classloader system to which we belong */
+ private BaseClassLoaderSystem system;
+
/** The classloaders in the order they were registered */
private List<ClassLoaderInformation> classLoaders = new CopyOnWriteArrayList<ClassLoaderInformation>();
@@ -64,6 +68,71 @@
private int order = 0;
/**
+ * Get the classloader system
+ *
+ * @return the classloader system
+ */
+ synchronized BaseClassLoaderSystem getClassLoaderSystem()
+ {
+ return system;
+ }
+
+ /**
+ * Get the classloader system
+ *
+ * @param system the classloader system
+ */
+ synchronized void setClassLoaderSystem(BaseClassLoaderSystem system)
+ {
+ if (system == null)
+ shutdownDomain();
+ this.system = system;
+ }
+
+ /**
+ * Shutdown the domain<p>
+ *
+ * The default implementation just unregisters all classloaders
+ */
+ protected void shutdownDomain()
+ {
+ log.debug(toLongString() + " shutdown!");
+
+ // Unregister all classloaders
+ while (true)
+ {
+ Iterator<ClassLoaderInformation> iterator = classLoaders.iterator();
+ if (iterator.hasNext() == false)
+ break;
+
+ while (iterator.hasNext())
+ {
+ ClassLoaderInformation info = iterator.next();
+ if (info != null)
+ unregisterClassLoader(info.getClassLoader());
+ }
+ }
+ }
+
+ /**
+ * Transform the byte code<p>
+ *
+ * By default, this delegates to the classloader system
+ *
+ * @param className the class name
+ * @param byteCode the byte code
+ * @param protectionDomain the protection domain
+ * @return the transformed byte code
+ */
+ protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
+ {
+ BaseClassLoaderSystem system = getClassLoaderSystem();
+ if (system != null)
+ system.transform(className, byteCode, protectionDomain);
+ return byteCode;
+ }
+
+ /**
* Invoked before classloading is attempted to allow a preload attempt, e.g. from the parent
*
* @param name the class resource name
@@ -118,6 +187,9 @@
Class<?> loadClass(BaseClassLoader classLoader, String name, boolean allExports) throws ClassNotFoundException
{
boolean trace = log.isTraceEnabled();
+
+ if (getClassLoaderSystem() == null)
+ throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
String path = ClassLoaderUtils.classNameToPath(name);
@@ -187,17 +259,20 @@
loader = findAfterLoader(path, name);
// Finally see whether this is the JDK assuming it can load its classes from any classloader
- if (loader == null && ClassLoaderUtils.isRequestFromJDK())
+ if (loader == null)
{
- ClassLoader hack = getClass().getClassLoader();
- if (trace)
- log.trace(this + " trying to load " + name + " using hack " + hack);
- Class<?> result = hack.loadClass(name);
- if (result != null)
+ ClassLoader hack = policy.isJDKRequest(name);
+ if (hack != null)
{
if (trace)
- log.trace(this + " loaded from hack " + hack + " " + ClassLoaderUtils.classToString(result));
- return result;
+ log.trace(this + " trying to load " + name + " using hack " + hack);
+ Class<?> result = hack.loadClass(name);
+ if (result != null)
+ {
+ if (trace)
+ log.trace(this + " loaded from hack " + hack + " " + ClassLoaderUtils.classToString(result));
+ return result;
+ }
}
}
}
@@ -263,6 +338,9 @@
{
boolean trace = log.isTraceEnabled();
+ if (getClassLoaderSystem() == null)
+ throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
// Try the before attempt
URL result = beforeGetResource(name, resourceName);
if (result != null)
@@ -387,6 +465,9 @@
{
boolean trace = log.isTraceEnabled();
+ if (getClassLoaderSystem() == null)
+ throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
// Try the before attempt
beforeGetResources(name, resourceName, urls);
@@ -517,8 +598,18 @@
{
// nothing
}
-
+
/**
+ * Get the parent classloader
+ *
+ * @return the parent classloader
+ */
+ protected ClassLoader getParentClassLoader()
+ {
+ return getClass().getClassLoader();
+ }
+
+ /**
* Register a classloader
*
* @param classLoader the classloader
@@ -527,6 +618,9 @@
{
log.debug(this + " registerClassLoader " + classLoader.toLongString());
+ if (getClassLoaderSystem() == null)
+ throw new IllegalStateException("Domain is not registered with a classloader system: " + toLongString());
+
try
{
beforeRegisterClassLoader(classLoader, classLoader.getPolicy());
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderPolicy.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,6 +25,7 @@
import java.util.List;
import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.logging.Logger;
/**
* Base ClassLoader policy.<p>
@@ -37,6 +38,9 @@
*/
public abstract class BaseClassLoaderPolicy
{
+ /** The log */
+ private static final Logger log = Logger.getLogger(BaseClassLoaderPolicy.class);
+
/** The classloader for this policy */
private volatile BaseClassLoader classLoader;
@@ -89,8 +93,10 @@
protected abstract ProtectionDomain getProtectionDomain(String className, String path);
/**
- * Transform the byte code
+ * Transform the byte code<p>
*
+ * By default, this delegates to the domain
+ *
* @param className the class name
* @param byteCode the byte code
* @param protectionDomain the protection domain
@@ -98,11 +104,21 @@
*/
protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
{
- // TODO should delegate to the domain by default
+ BaseClassLoaderDomain domain = getClassLoaderDomain();
+ if (domain != null)
+ domain.transform(className, byteCode, protectionDomain);
return byteCode;
}
/**
+ * Check whether this a request from the jdk if it is return the relevant classloader
+ *
+ * @param name the class name
+ * @return the classloader
+ */
+ protected abstract ClassLoader isJDKRequest(String name);
+
+ /**
* A long version of toString()
*
* @return the long string
@@ -174,6 +190,7 @@
{
if (this.domain != domain)
throw new IllegalStateException("Policy is not a part of the domain " + this + " domain=" + domain);
+ shutdownPolicy();
this.domain = null;
}
/**
@@ -181,8 +198,10 @@
*
* @return the classloader
*/
- BaseClassLoader getClassLoader()
+ synchronized BaseClassLoader getClassLoader()
{
+ if (classLoader == null)
+ throw new IllegalStateException("No classloader associated with policy therefore it is no longer registered " + toLongString());
return classLoader;
}
@@ -194,10 +213,23 @@
* @param classLoader the classloader
* @throws IllegalStateException if the classloader is already set
*/
- void setClassLoader(BaseClassLoader classLoader)
+ synchronized void setClassLoader(BaseClassLoader classLoader)
{
if (this.classLoader != null)
throw new IllegalStateException("Policy already has a classloader previous=" + classLoader);
this.classLoader = classLoader;
}
+
+ /**
+ * Shutdown the policy<p>
+ *
+ * The default implementation removes and shutdowns the classloader
+ */
+ synchronized protected void shutdownPolicy()
+ {
+ log.debug(toLongString() + " shutdown!");
+ BaseClassLoader classLoader = this.classLoader;
+ this.classLoader = null;
+ classLoader.shutdownClassLoader();
+ }
}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseClassLoaderSystem.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,8 @@
*/
package org.jboss.classloader.spi.base;
-import org.jboss.classloader.spi.ClassLoaderDomain;
+import java.security.ProtectionDomain;
+
import org.jboss.classloader.spi.ClassLoaderPolicy;
/**
@@ -68,6 +69,32 @@
}
/**
+ * Register a domain
+ *
+ * @param domain the domain to register
+ * @throws IllegalArgumentException for a null domain
+ */
+ protected void registerDomain(BaseClassLoaderDomain domain)
+ {
+ if (domain == null)
+ throw new IllegalArgumentException("Null domain");
+ domain.setClassLoaderSystem(this);
+ }
+
+ /**
+ * Unregister a domain
+ *
+ * @param domain the domain to unregister
+ * @throws IllegalArgumentException for a null domain
+ */
+ protected void unregisterDomain(BaseClassLoaderDomain domain)
+ {
+ if (domain == null)
+ throw new IllegalArgumentException("Null domain");
+ domain.setClassLoaderSystem(null);
+ }
+
+ /**
* Register a policy with a domain
*
* @param domain the domain
@@ -89,15 +116,12 @@
/**
* Unregister a policy with a domain
*
- * @param domain the domain
* @param policy the policy
* @throws IllegalArgumentException if a parameter is null
* @throws IllegalStateException if the policy is not registered with the domain
*/
- protected void unregisterClassLoaderPolicy(BaseClassLoaderDomain domain, ClassLoaderPolicy policy)
+ protected void unregisterClassLoaderPolicy(ClassLoaderPolicy policy)
{
- if (domain == null)
- throw new IllegalArgumentException("Null domain");
if (policy == null)
throw new IllegalArgumentException("Null policy");
@@ -105,21 +129,21 @@
BaseClassLoader classLoader = basePolicy.getClassLoader();
if (classLoader == null)
throw new IllegalStateException("Policy has no associated classloader, it is therefore not registered with a domain. " + policy.toLongString());
+ BaseClassLoaderDomain domain = basePolicy.getClassLoaderDomain();
+ if (domain == null)
+ throw new IllegalStateException("Policy has no domain " + policy.toLongString());
domain.unregisterClassLoader(classLoader);
}
/**
* Unregister a policy with a domain
*
- * @param domain the domain
* @param classLoader the class loader
* @throws IllegalArgumentException if a parameter is null
* @throws IllegalStateException if the policy is not registered with the domain
*/
- protected void unregisterClassLoader(ClassLoaderDomain domain, ClassLoader classLoader)
+ protected void unregisterClassLoader(ClassLoader classLoader)
{
- if (domain == null)
- throw new IllegalArgumentException("Null domain");
if (classLoader == null)
throw new IllegalArgumentException("Null classLoader");
@@ -127,7 +151,7 @@
throw new IllegalStateException("ClassLoader is not the correct type and therefore not registered: " + classLoader);
BaseClassLoader baseClassLoader = (BaseClassLoader) classLoader;
- unregisterClassLoaderPolicy(domain, baseClassLoader.getPolicy());
+ unregisterClassLoaderPolicy(baseClassLoader.getPolicy());
}
/**
@@ -141,4 +165,19 @@
{
return new BaseClassLoader(policy);
}
+
+ /**
+ * Transform the byte code<p>
+ *
+ * By default this does nothing
+ *
+ * @param className the class name
+ * @param byteCode the byte code
+ * @param protectionDomain the protection domain
+ * @return the transformed byte code
+ */
+ protected byte[] transform(String className, byte[] byteCode, ProtectionDomain protectionDomain)
+ {
+ return byteCode;
+ }
}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/base/BaseDelegateLoader.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -26,6 +26,7 @@
import java.util.Set;
import org.jboss.classloader.spi.Loader;
+import org.jboss.logging.Logger;
/**
* Base DelegateLoader.
@@ -35,6 +36,9 @@
*/
public class BaseDelegateLoader implements Loader
{
+ /** The log */
+ private static final Logger log = Logger.getLogger(BaseDelegateLoader.class);
+
/** The delegate loader policy */
private BaseClassLoaderPolicy delegate;
@@ -59,27 +63,33 @@
public Class<?> loadClass(String className)
{
BaseClassLoader classLoader = delegate.getClassLoader();
- // REVIEW: Should probably add some kind of warning here
if (classLoader == null)
+ {
+ log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
return null;
+ }
return classLoader.loadClassLocally(className);
}
public URL getResource(String name, String resourceName)
{
BaseClassLoader classLoader = delegate.getClassLoader();
- // REVIEW: Should probably add some kind of warning here
if (classLoader == null)
+ {
+ log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
return null;
+ }
return classLoader.getResourceLocally(name, resourceName);
}
public void getResources(String name, String resourceName, Set<URL> urls) throws IOException
{
BaseClassLoader classLoader = delegate.getClassLoader();
- // REVIEW: Should probably add some kind of warning here
if (classLoader == null)
+ {
+ log.warn("Not loading from policy that has no classLoader: " + toLongString(), new Throwable("STACKTRACE"));
return;
+ }
classLoader.getResourcesLocally(name, resourceName, urls);
}
Modified: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/filter/FilteredDelegateLoader.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -104,7 +104,7 @@
return super.getResource(name, resourceName);
}
if (trace)
- log.trace(this + " " + name + " NOT match filter=" + filter);
+ log.trace(this + " " + name + " does NOT match filter=" + filter);
return null;
}
@@ -118,7 +118,7 @@
super.getResources(name, resourceName, urls);
}
if (trace)
- log.trace(this + " " + name + " matches does NOT match filter=" + filter);
+ log.trace(this + " " + name + " does NOT match filter=" + filter);
}
@Override
Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKChecker.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.classloader.spi.jdk;
+
+/**
+ * Used to check whether the classloading request is from the jdk<p>
+ *
+ * This is a hack because of broken behaviour by the JDKs where they assume
+ * they can load their own classes from any classloader.
+ */
+public interface JDKChecker
+{
+ /**
+ * Check wether this is a request from the JDK
+ *
+ * @param name the class name
+ * @param stack the stack
+ * @return true when from the JDK
+ */
+ boolean isJDKRequest(String name);
+}
Added: projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java (rev 0)
+++ projects/microcontainer/trunk/classloader/src/main/org/jboss/classloader/spi/jdk/JDKCheckerFactory.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,47 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.classloader.spi.jdk;
+
+import org.jboss.classloader.plugins.jdk.AbstractJDKChecker;
+
+/**
+ * JDKCheckerFactory.
+ *
+ * TODO parameterize this
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class JDKCheckerFactory
+{
+ /** The checker */
+ private static JDKChecker checker = new AbstractJDKChecker();
+
+ /**
+ * Retrieve the checker for the JDK we are running on
+ *
+ * @return the checker
+ */
+ public static JDKChecker getChecker()
+ {
+ return checker;
+ }
+}
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/AbstractClassLoaderTest.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,8 +21,9 @@
*/
package org.jboss.test.classloader;
+import java.security.ProtectionDomain;
+
import junit.framework.AssertionFailedError;
-import junit.framework.TestSuite;
import org.jboss.classloader.plugins.ClassLoaderUtils;
import org.jboss.classloader.plugins.system.DefaultClassLoaderSystem;
@@ -30,7 +31,8 @@
import org.jboss.classloader.spi.ClassLoaderPolicy;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.ParentPolicy;
-import org.jboss.test.BaseTestCase;
+import org.jboss.test.AbstractTestCaseWithSetup;
+import org.jboss.test.AbstractTestDelegate;
import org.jboss.test.classloader.support.MockClassLoaderPolicy;
/**
@@ -39,21 +41,9 @@
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
*/
-public abstract class AbstractClassLoaderTest extends BaseTestCase
+public abstract class AbstractClassLoaderTest extends AbstractTestCaseWithSetup
{
/**
- * Create a new testsuite for the class
- *
- * TODO move to BaseTestCase
- * @param clazz the class
- * @return the suite
- */
- public static TestSuite suite(Class<?> clazz)
- {
- return new TestSuite(clazz);
- }
-
- /**
* Raise an assertion failed error for an error
*
* TODO move to AbstractTestCase
@@ -62,19 +52,51 @@
*/
protected void failure(String reason, Throwable cause)
{
- log.error(reason, cause);
+ getLog().error(reason, cause);
if (cause instanceof AssertionFailedError)
throw (AssertionFailedError) cause;
Error error = new AssertionFailedError(reason);
error.initCause(cause);
throw error;
}
-
+
+ public static AbstractTestDelegate getDelegate(Class<?> clazz)
+ {
+ AbstractTestDelegate delegate = new AbstractTestDelegate(clazz);
+ delegate.enableSecurity = true;
+ return delegate;
+ }
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+ configureLogging();
+ }
+
public AbstractClassLoaderTest(String name)
{
super(name);
}
+ public ProtectionDomain getProtectionDomain(String name)
+ {
+ SecurityManager sm = suspendSecurity();
+ try
+ {
+ Class<?> clazz = getClass().getClassLoader().loadClass(name);
+ return clazz.getProtectionDomain();
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new Error("Class not found " + name, e);
+ }
+ finally
+ {
+ resumeSecurity(sm);
+ }
+ }
+
protected ClassLoaderSystem createClassLoaderSystem()
{
// We always create a new one to avoid things in the default domain leaking across tests
@@ -91,7 +113,7 @@
protected ClassLoader createClassLoaderSystemWithModifiedBootstrapAndMockClassLoader()
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- return createMockClassLoader(system);
+ return createAndRegisterMockClassLoader(system);
}
protected ClassLoader registerPolicyWithDefaultDomain(ClassLoaderPolicy policy, ClassLoaderSystem system)
@@ -99,25 +121,25 @@
return system.registerClassLoaderPolicy(policy);
}
- protected ClassLoader createMockClassLoader(ClassLoaderSystem system)
+ protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system)
{
- return createMockClassLoader(system, "mock");
+ return createAndRegisterMockClassLoader(system, "mock");
}
- protected ClassLoader createMockClassLoader(ClassLoaderSystem system, String name)
+ protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, String name)
{
- MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name, this);
return system.registerClassLoaderPolicy(policy);
}
- protected ClassLoader createMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain)
+ protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain)
{
- return createMockClassLoader(system, domain, "mock");
+ return createAndRegisterMockClassLoader(system, domain, "mock");
}
- protected ClassLoader createMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain, String name)
+ protected ClassLoader createAndRegisterMockClassLoader(ClassLoaderSystem system, ClassLoaderDomain domain, String name)
{
- MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name, this);
return system.registerClassLoaderPolicy(domain, policy);
}
@@ -133,8 +155,18 @@
protected void assertClassLoader(Class<?> clazz, ClassLoader expected)
{
- log.debug("Should be the expected classloader expected=" + expected + " actual=" + clazz.getClassLoader());
- assertEquals("Should be the expected classloader", expected, clazz.getClassLoader());
+ ClassLoader classLoader = null;
+ SecurityManager sm = suspendSecurity();
+ try
+ {
+ classLoader = clazz.getClassLoader();
+ }
+ finally
+ {
+ resumeSecurity(sm);
+ }
+ getLog().debug("Should be the expected classloader expected=" + expected + " actual=" + classLoader);
+ assertEquals("Should be the expected classloader", expected, classLoader);
}
protected Class<?> assertLoadClass(Class<?> reference, ClassLoader start)
@@ -173,7 +205,7 @@
try
{
result = start.loadClass(name);
- log.debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
+ getLog().debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
}
catch (ClassNotFoundException e)
{
@@ -236,7 +268,7 @@
try
{
result = Class.forName(name, true, start);
- log.debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
+ getLog().debug("Got class: " + ClassLoaderUtils.classToString(result) + " for " + name + " from " + start);
}
catch (ClassNotFoundException e)
{
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/bootstrap/test/ModifiedBootstrapUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,7 +25,7 @@
import javax.naming.Context;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -38,7 +38,7 @@
*/
public class ModifiedBootstrapUnitTestCase extends AbstractClassLoaderTest
{
- public static TestSuite suite()
+ public static Test suite()
{
return suite(ModifiedBootstrapUnitTestCase.class);
}
Added: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java (rev 0)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/support/a/TestADelegateClassLoaderDomain.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -0,0 +1,38 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2007, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.classloader.delegate.support.a;
+
+import org.jboss.classloader.spi.ClassLoaderDomain;
+
+/**
+ * TestADelegateClassLoaderDomain.
+ *
+ * @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @version $Revision: 1.1 $
+ */
+public class TestADelegateClassLoaderDomain
+{
+ public static ClassLoaderDomain getSomething()
+ {
+ return null;
+ }
+}
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/delegate/test/DelegateUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -28,14 +28,16 @@
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import junit.framework.TestSuite;
+import junit.framework.Test;
+import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.DelegateLoader;
import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
import org.jboss.test.classloader.AbstractClassLoaderTest;
import org.jboss.test.classloader.TestThread;
import org.jboss.test.classloader.delegate.support.a.TestA1;
+import org.jboss.test.classloader.delegate.support.a.TestADelegateClassLoaderDomain;
import org.jboss.test.classloader.delegate.support.a.TestAbstractFactory;
import org.jboss.test.classloader.delegate.support.a.TestSleep;
import org.jboss.test.classloader.delegate.support.b.TestB1;
@@ -43,14 +45,14 @@
import org.jboss.test.classloader.support.MockClassLoaderPolicy;
/**
- * ModifiedBootstrapUnitTestCase.
+ * DelegateUnitTestCase
*
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
*/
public class DelegateUnitTestCase extends AbstractClassLoaderTest
{
- public static TestSuite suite()
+ public static Test suite()
{
return suite(DelegateUnitTestCase.class);
}
@@ -64,11 +66,11 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
pb.setPaths(TestB1.class);
ClassLoader b = system.registerClassLoaderPolicy(pb);
- MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
pa.setPaths(TestA1.class);
ClassLoader a = system.registerClassLoaderPolicy(pa);
@@ -80,11 +82,11 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
pb.setPaths(TestB1.class);
ClassLoader b = system.registerClassLoaderPolicy(pb);
- MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
pa.setPaths(TestA1.class);
pa.setDelegates(Collections.singletonList(new FilteredDelegateLoader(pb)));
ClassLoader a = system.registerClassLoaderPolicy(pa);
@@ -99,10 +101,10 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
pb.setPaths(TestB1.class);
- MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
pa.setPaths(TestA1.class);
List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
@@ -121,14 +123,48 @@
assertClassEquality(testFactoryImplementationClass, instance.getClass());
}
+ public void testDelegateToAnotherCodeSource() throws Exception
+ {
+ ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
+
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
+ pb.setPaths(ClassLoaderDomain.class);
+ ClassLoader b = system.registerClassLoaderPolicy(pb);
+
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
+ pa.setPaths(TestADelegateClassLoaderDomain.class);
+ pa.setDelegates(Collections.singletonList(new FilteredDelegateLoader(pb)));
+ ClassLoader a = system.registerClassLoaderPolicy(pa);
+
+ Class<?> fromB = assertLoadClass(ClassLoaderDomain.class, b, false);
+ Class<?> delegate = assertLoadClass(TestADelegateClassLoaderDomain.class, a, false);
+
+ SecurityManager sm = suspendSecurity();
+ try
+ {
+ System.out.println(delegate.getProtectionDomain());
+ }
+ finally
+ {
+ resumeSecurity(sm);
+ }
+
+ Method method = delegate.getMethod("getSomething", null);
+ Class<?> fromA = method.getReturnType();
+ assertNotNull(fromA);
+ assertClassLoader(fromA, b);
+
+ assertClassEquality(fromB, fromA);
+ }
+
public void testAbstractFactoryWrongWay() throws Exception
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
pb.setPaths(TestB1.class);
- MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
pa.setPaths(TestA1.class);
List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
@@ -151,13 +187,13 @@
{
for (int i = 0; i < 10; ++i)
{
- log.debug("Attempt: " + i);
+ getLog().debug("Attempt: " + i);
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B");
+ MockClassLoaderPolicy pb = new MockClassLoaderPolicy("B", this);
pb.setPaths(TestB1.class);
- MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A");
+ MockClassLoaderPolicy pa = new MockClassLoaderPolicy("A", this);
pa.setPaths(TestA1.class);
List<DelegateLoader> delegates = new ArrayList<DelegateLoader>();
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularLoadUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -42,7 +42,7 @@
import org.jboss.test.classloader.support.MockClassLoaderPolicy;
/**
- * ClassLoadingSystemUnitTestCase.
+ * CircularLoadUnitTestCase.
*
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @author Simone.Bordet at hp.com
@@ -51,33 +51,33 @@
*/
public class CircularLoadUnitTestCase extends AbstractClassLoaderTest
{
- public static TestSuite suite()
- {
- return suite(CircularLoadUnitTestCase.class);
- }
-
public CircularLoadUnitTestCase(String name)
{
super(name);
}
+
+ public static Test suite()
+ {
+ return suite(CircularLoadUnitTestCase.class);
+ }
public void testLinkageError() throws Exception
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy le0 = new MockClassLoaderPolicy("le0");
+ MockClassLoaderPolicy le0 = new MockClassLoaderPolicy("le0", this);
le0.setPathsAndPackageNames(Base.class);
le0.setImportAll(true);
le0.setIncluded(Base.class, UserOfBase.class);
ClassLoader cl0 = system.registerClassLoaderPolicy(le0);
- MockClassLoaderPolicy le1 = new MockClassLoaderPolicy("le1");
+ MockClassLoaderPolicy le1 = new MockClassLoaderPolicy("le1", this);
le1.setPathsAndPackageNames(Base.class);
le1.setImportAll(true);
le1.setIncluded(Base.class, Support.class);
ClassLoader cl1 = system.registerClassLoaderPolicy(le1);
- MockClassLoaderPolicy all = new MockClassLoaderPolicy("all");
+ MockClassLoaderPolicy all = new MockClassLoaderPolicy("all", this);
all.setPackageNames(Base.class);
all.setImportAll(true);
ClassLoader cl2 = system.registerClassLoaderPolicy(all);
@@ -100,7 +100,7 @@
// Now invoke UserOfBase.testBase(Support)
Class[] sig = { supportClass };
Method testBase = userOfBaseClass.getMethod("testBase", sig);
- log.info(testBase.toString());
+ getLog().info(testBase.toString());
Object[] args = { support };
testBase.invoke(userOfBase, args);
}
@@ -113,12 +113,12 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy mock = new MockClassLoaderPolicy();
+ MockClassLoaderPolicy mock = new MockClassLoaderPolicy(this);
mock.setPathsAndPackageNames(Base.class);
mock.setIncluded(LoginInfo.class, UsrMgr.class, UserOfUsrMgr.class, UserOfLoginInfo.class);
ClassLoader cl = system.registerClassLoaderPolicy(mock);
- log.info("Begin testPackageProtected");
+ getLog().info("Begin testPackageProtected");
try
{
@@ -135,13 +135,13 @@
Constructor ctor1 = c1.getConstructor(ctorsig1);
Object[] args1 = {"jduke", "theduke"};
Object o1 = ctor1.newInstance(args1);
- log.info("UserOfUsrMgr.CS: "+o1.getClass().getProtectionDomain().getCodeSource());
+ getLog().info("UserOfUsrMgr.CS: "+o1.getClass().getProtectionDomain().getCodeSource());
// Now invoke UserOfUsrMgr.changePassword(char[] password)
char[] password = "theduke2".toCharArray();
Class[] sig = {password.getClass()};
Method changePassword = c1.getMethod("changePassword", sig);
- log.info(changePassword.toString());
+ getLog().info(changePassword.toString());
Object[] args = {password};
changePassword.invoke(o1, args);
}
@@ -155,13 +155,13 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy any0 = new MockClassLoaderPolicy("any0");
+ MockClassLoaderPolicy any0 = new MockClassLoaderPolicy("any0", this);
any0.setPathsAndPackageNames(Support.class);
any0.setImportAll(true);
any0.setIncluded(Base.class, Class0.class, Class2.class);
ClassLoader cl0 = system.registerClassLoaderPolicy(any0);
- MockClassLoaderPolicy any1 = new MockClassLoaderPolicy("any1");
+ MockClassLoaderPolicy any1 = new MockClassLoaderPolicy("any1", this);
any1.setPathsAndPackageNames(Support.class);
any1.setImportAll(true);
any1.setIncluded(Class0.class, Class2.class);
@@ -178,13 +178,13 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+ MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
j0.setPathsAndPackageNames(Support.class);
j0.setImportAll(true);
j0.setIncluded(Class0.class);
ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
- MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1");
+ MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1", this);
j1.setPathsAndPackageNames(Support.class);
j1.setImportAll(true);
j1.setIncluded(Class2.class);
@@ -212,13 +212,13 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+ MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
j0.setPathsAndPackageNames(Support.class);
j0.setImportAll(true);
j0.setIncluded(Class0.class);
ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
- MockClassLoaderPolicy j3 = new MockClassLoaderPolicy("j3");
+ MockClassLoaderPolicy j3 = new MockClassLoaderPolicy("j3", this);
j3.setPathsAndPackageNames(Support.class);
j3.setImportAll(true);
j3.setIncluded(Derived.class);
@@ -236,19 +236,19 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0");
+ MockClassLoaderPolicy j0 = new MockClassLoaderPolicy("j0", this);
j0.setPathsAndPackageNames(Support.class);
j0.setImportAll(true);
j0.setIncluded(Class0.class);
ClassLoader cl0 = system.registerClassLoaderPolicy(j0);
- MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1");
+ MockClassLoaderPolicy j1 = new MockClassLoaderPolicy("j1", this);
j1.setPathsAndPackageNames(Support.class);
j1.setImportAll(true);
j1.setIncluded(Class1.class);
ClassLoader cl1 = system.registerClassLoaderPolicy(j1);
- MockClassLoaderPolicy j2 = new MockClassLoaderPolicy("j2");
+ MockClassLoaderPolicy j2 = new MockClassLoaderPolicy("j2", this);
j2.setPathsAndPackageNames(Support.class);
j2.setImportAll(true);
j2.setIncluded(Class2.class);
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/CircularityErrorUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
import java.net.URL;
import java.util.concurrent.CountDownLatch;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.plugins.ClassLoaderUtils;
import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -45,12 +45,12 @@
{
private CountDownLatch waiting = new CountDownLatch(1);
private Throwable sawError;
-
- public static TestSuite suite()
+
+ public static Test suite()
{
return suite(CircularityErrorUnitTestCase.class);
}
-
+
public CircularityErrorUnitTestCase(String name)
{
super(name);
@@ -66,7 +66,7 @@
// Thread1 throws ClassCircularityError
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- final ClassLoader cl = system.registerClassLoaderPolicy(new TestClassLoaderPolicy());
+ final ClassLoader cl = system.registerClassLoaderPolicy(new TestClassLoaderPolicy(this));
Class cls = assertLoadClass(Support.class, cl);
@@ -86,9 +86,9 @@
try
{
- log.debug("Thread " + Thread.currentThread() + " loading...");
+ getLog().debug("Thread " + Thread.currentThread() + " loading...");
assertLoadClass(Derived.class, cl);
- log.debug("Thread " + Thread.currentThread() + " loading done !");
+ getLog().debug("Thread " + Thread.currentThread() + " loading done !");
}
catch (Throwable t)
{
@@ -98,9 +98,9 @@
}, "CircularityErrorThread");
thread1.start();
- log.debug("Thread " + Thread.currentThread() + " waiting...");
+ getLog().debug("Thread " + Thread.currentThread() + " waiting...");
waiting.await();
- log.debug("Thread " + Thread.currentThread() + " woken up !");
+ getLog().debug("Thread " + Thread.currentThread() + " woken up !");
// Ask this thread to trigger a loadClassInternal directly; the thread will be put to sleep
// but the JVM has already registered the fact that
@@ -115,15 +115,16 @@
public class TestClassLoaderPolicy extends MockClassLoaderPolicy
{
- public TestClassLoaderPolicy()
+ public TestClassLoaderPolicy(AbstractClassLoaderTest test)
{
+ super(test);
setPaths(Support.class);
}
@Override
public URL getResource(String name)
{
- log.debug(Thread.currentThread() + " is now asked to load class: " + name);
+ getLog().debug(Thread.currentThread() + " is now asked to load class: " + name);
if (name.equals(ClassLoaderUtils.classNameToPath(Derived.class.getName())))
{
@@ -133,13 +134,13 @@
// Do not release the lock on the classloader
try
{
- log.debug("Loading " + name + ", waiting...");
+ getLog().debug("Loading " + name + ", waiting...");
Thread.sleep(2000);
- log.debug("Loading " + name + " end wait");
+ getLog().debug("Loading " + name + " end wait");
}
catch (InterruptedException x)
{
- log.debug("Sleep was interrupted", x);
+ getLog().debug("Sleep was interrupted", x);
}
}
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/ConcurrentLoaderUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -26,7 +26,7 @@
import java.util.TimerTask;
import java.util.Vector;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -52,8 +52,8 @@
private Timer newInstanceTimer;
private int doneCount;
private ClassLoader cl;
-
- public static TestSuite suite()
+
+ public static Test suite()
{
return suite(ConcurrentLoaderUnitTestCase.class);
}
@@ -67,11 +67,11 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
policy.setPaths(Support.class);
cl = system.registerClassLoaderPolicy(policy);
- log.debug("Creating " + NUMBER_OF_THREADS + " threads...");
+ getLog().debug("Creating " + NUMBER_OF_THREADS + " threads...");
newInstanceTimer = new Timer(true);
newInstanceTimer.scheduleAtFixedRate(new NewInstanceTask(), 0, 100);
doneCount = 0;
@@ -81,15 +81,15 @@
loader.start();
loaders.add(loader);
}
- log.debug("All threads created");
- Thread.sleep(2000);
+ getLog().debug("All threads created");
+ Thread.sleep(1000);
synchronized(lock)
{
- lock.notifyAll ();
+ lock.notifyAll();
}
- log.debug("Unlocked all Loader threads");
+ getLog().debug("Unlocked all Loader threads");
synchronized(lock)
{
@@ -97,9 +97,9 @@
{
lock.wait();
}
- log.debug("Loader doneCount=" + doneCount);
+ getLog().debug("Loader doneCount=" + doneCount);
}
- log.debug("All Loaders are done");
+ getLog().debug("All Loaders are done");
newInstanceTimer.cancel();
for (Loader loader : loaders)
@@ -116,18 +116,18 @@
int size = classes.size();
Class[] theClasses = new Class[size];
classes.toArray(theClasses);
- log.debug("NewInstanceTask, creating " + size + " instances");
+ getLog().trace("NewInstanceTask, creating " + size + " instances");
for (int c = 0; c < theClasses.length; ++c)
{
try
{
Class clazz = theClasses[c];
Object obj = clazz.newInstance();
- log.debug("Created instance=" + obj);
+ getLog().trace("Created instance=" + obj);
}
catch(Throwable t)
{
- log.error("Error instantiating class " + theClasses[c], t);
+ getLog().error("Error instantiating class " + theClasses[c], t);
}
}
}
@@ -153,35 +153,35 @@
{
try
{
- log.debug("Thread ready: " + classid);
- lock.wait ();
+ getLog().debug("Thread ready: " + classid);
+ lock.wait();
}
catch (Exception e)
{
- log.error("Error during wait", e);
+ getLog().error("Error during wait", e);
}
}
- log.debug("loading class... " + className);
+ getLog().trace("loading class... " + className);
for (int i = 0; i < NUMBER_OF_LOADING; ++i)
{
- log.debug("loading class with id " + classid + " for the " + i + "th time");
+ getLog().trace("loading class with id " + classid + " for the " + i + "th time");
try
{
- log.debug("before load...");
- long sleep = (long) (1000 * Math.random());
+ getLog().trace("before load...");
+ long sleep = (long) (500 * Math.random());
Thread.sleep(sleep);
Class clazz = cl.loadClass (className);
classes.add(clazz);
Object obj = clazz.newInstance();
- log.debug("Class " + className + " loaded, obj=" + obj);
+ getLog().trace("Class " + className + " loaded, obj=" + obj);
}
catch (Throwable e)
{
- log.debug("Failed to load class and create instance", e);
+ getLog().debug("Failed to load class and create instance", e);
error = e;
}
}
- log.debug("...Done loading classes. " + classid);
+ getLog().debug("...Done loading classes. " + classid);
synchronized( lock )
{
doneCount++;
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/old/test/LoaderUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -21,7 +21,7 @@
*/
package org.jboss.test.classloader.old.test;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.test.classloader.AbstractClassLoaderTest;
@@ -37,7 +37,7 @@
*/
public class LoaderUnitTestCase extends AbstractClassLoaderTest
{
- public static TestSuite suite()
+ public static Test suite()
{
return suite(LoaderUnitTestCase.class);
}
@@ -51,12 +51,12 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
policy.setPaths(Support.class);
final ClassLoader cl = system.registerClassLoaderPolicy(policy);
// Set our interrupted flag
- log.debug("Setting interrupt flag");
+ getLog().debug("Setting interrupt flag");
Thread.currentThread().interrupt();
try
{
@@ -72,7 +72,7 @@
{
ClassLoaderSystem system = createClassLoaderSystemWithModifiedBootstrap();
- MockClassLoaderPolicy policy = new MockClassLoaderPolicy();
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(this);
policy.setPaths(Support.class);
ClassLoader cl = system.registerClassLoaderPolicy(policy);
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/support/MockClassLoaderPolicy.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -25,12 +25,14 @@
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.Arrays;
+import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import org.jboss.classloader.plugins.ClassLoaderUtils;
import org.jboss.classloader.spi.ClassLoaderPolicy;
import org.jboss.classloader.spi.DelegateLoader;
+import org.jboss.test.classloader.AbstractClassLoaderTest;
/**
* MockClassLoaderPolicy.
@@ -54,16 +56,19 @@
private boolean importAll;
- public MockClassLoaderPolicy()
+ private AbstractClassLoaderTest test;
+
+ public MockClassLoaderPolicy(AbstractClassLoaderTest test)
{
- this(null);
+ this(null, test);
}
- public MockClassLoaderPolicy(String name)
+ public MockClassLoaderPolicy(String name, AbstractClassLoaderTest test)
{
if (name == null)
name = "mock";
this.name = name;
+ this.test = test;
}
@Override
@@ -76,7 +81,7 @@
{
this.delegates = delegates;
}
-
+
public String[] getPaths()
{
return paths;
@@ -204,19 +209,65 @@
}
@Override
- public void getResources(String name, Set<URL> urls) throws IOException
+ public void getResources(String path, Set<URL> urls) throws IOException
{
- // TODO getResources
- throw new org.jboss.util.NotImplementedException("getResources");
+ if (paths == null)
+ return;
+
+ if (excluded != null)
+ {
+ for (String excludedPath : excluded)
+ {
+ if (excludedPath.equals(path))
+ return;
+ }
+ }
+
+ if (included != null)
+ {
+ boolean include = false;
+ for (String includedPath : included)
+ {
+ if (includedPath.equals(path))
+ {
+ include = true;
+ break;
+ }
+ }
+ if (include == false)
+ return;
+ }
+ ClassLoader parent = getClass().getClassLoader();
+ for (int i = 0; i < paths.length; ++i)
+ {
+ if (path.startsWith(paths[i]))
+ {
+ Enumeration<URL> enumeration = parent.getResources(path);
+ while (enumeration.hasMoreElements())
+ urls.add(enumeration.nextElement());
+ }
+ }
}
-
+
@Override
protected ProtectionDomain getProtectionDomain(String className, String path)
{
- return getClass().getProtectionDomain();
+ return test.getProtectionDomain(className);
}
+ /*
+ * Overridden to not load jboss classes
+ * this is so we don't expose classes from the classpath
+ * that we haven't explicitly declared in the policy
+ */
+ protected ClassLoader isJDKRequest(String name)
+ {
+ if (name.startsWith("org.jboss."))
+ return null;
+ return super.isJDKRequest(name);
+ }
+
@Override
public void toLongString(StringBuilder builder)
{
Modified: projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java
===================================================================
--- projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java 2007-04-30 14:08:57 UTC (rev 62635)
+++ projects/microcontainer/trunk/classloader/src/tests/org/jboss/test/classloader/system/test/ClassLoadingSystemUnitTestCase.java 2007-04-30 14:10:17 UTC (rev 62636)
@@ -24,7 +24,7 @@
import java.util.ArrayList;
import java.util.List;
-import junit.framework.TestSuite;
+import junit.framework.Test;
import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.classloader.spi.ClassLoaderSystem;
@@ -40,7 +40,7 @@
*/
public class ClassLoadingSystemUnitTestCase extends AbstractClassLoaderTest
{
- public static TestSuite suite()
+ public static Test suite()
{
return suite(ClassLoadingSystemUnitTestCase.class);
}
@@ -67,7 +67,7 @@
{
MockClassLoaderSystem system = createMockClassLoaderSystem();
MockClassLoaderDomain domain = system.createAndRegisterDomain("mock");
- ClassLoader cl1 = createMockClassLoader(system, domain);
+ ClassLoader cl1 = createAndRegisterMockClassLoader(system, domain);
List<ClassLoader> expected = new ArrayList<ClassLoader>();
expected.add(cl1);
@@ -75,7 +75,7 @@
assertEquals(expected, domain.added);
assertEmpty(domain.removed);
- ClassLoader cl2 = createMockClassLoader(system, domain);
+ ClassLoader cl2 = createAndRegisterMockClassLoader(system, domain);
expected.add(cl2);
assertEquals(expected, domain.added);
@@ -86,7 +86,7 @@
{
MockClassLoaderSystem system = createMockClassLoaderSystem();
MockClassLoaderDomain domain = system.createAndRegisterDomain("mock");
- ClassLoader cl1 = createMockClassLoader(system, domain);
+ ClassLoader cl1 = createAndRegisterMockClassLoader(system, domain);
List<ClassLoader> expected = new ArrayList<ClassLoader>();
expected.add(cl1);
@@ -94,7 +94,7 @@
assertEquals(expected, domain.added);
assertEmpty(domain.removed);
- system.unregisterClassLoader(domain, cl1);
+ system.unregisterClassLoader(cl1);
assertEquals(expected, domain.added);
assertEquals(expected, domain.removed);
More information about the jboss-cvs-commits
mailing list