[jboss-dev-forums] [Design of AOP on JBoss (Aspects/JBoss)] - Re: Reimplementing ClassPools for AS
kabir.khan@jboss.com
do-not-reply at jboss.com
Wed Oct 29 11:45:00 EDT 2008
I started off replicating the AS 4 classloaders with my new classpools, and stumbled upon the following inconsistency when trying out how they work. Does anybody have any pointers?
| public void testUndeployParentDomainClassLoader() throws Exception
| {
| ClassLoader globalA = null;
| ClassLoader globalB = null;
| ClassLoader child = null;
| try
| {
| try
| {
| globalA = createGlobalClassLoader(JAR_A_1); //Contains CLASS_A
| assertCannotLoadClass(globalA, CLASS_B);
|
| child = createChildClassLoader(JAR_C_1, true); //Contains CLASS_C
| assertCannotLoadClass(child, CLASS_B);
|
| globalB = createGlobalClassLoader(JAR_B_1); //Contains CLASS_B
| Class<?> bFromChild = child.loadClass(CLASS_B);
| Class<?> bFromA = globalA.loadClass(CLASS_B);
| assertSame(globalB, bFromA.getClassLoader());
| assertSame(bFromA, bFromChild);
| }
| finally
| {
| removeClassLoaderFromRepository(globalB); //This should remove the classloader containing JAR_B_1/CLASS_B
| }
| assertCannotLoadClass(child, CLASS_B); //Fails since we can still find CLASS_B
| }
| finally
| {
| removeClassLoaderFromRepository(globalA);
| }
| }
|
If I try the same from sibling loaders it works as expected
| public void testUndeploySibling() throws Exception
| {
| ClassLoader clA = null;
| ClassLoader clB = null;
| try
| {
| try
| {
| clA = createGlobalClassLoader(JAR_A_1);
| assertCannotLoadClass(clA, CLASS_B);
|
| clB = createGlobalClassLoader(JAR_B_1);
| Class<?> bFromA = clA.loadClass(CLASS_B);
| assertSame(clB, bFromA.getClassLoader());
| }
| finally
| {
| removeClassLoaderFromRepository(clB);
| }
| assertCannotLoadClass(clA, CLASS_B);
| }
| finally
| {
| removeClassLoaderFromRepository(clA);
| }
| }
|
The helper functions are here:
| protected ClassLoader createGlobalClassLoader(URL url) throws Exception
| {
| ClassLoader cl = globalRepository.newClassLoader(url, true); //This is the main repository
| registeredClassLoaders.add(cl);
| return cl;
| }
|
| protected ClassLoader createChildClassLoader(URL url, boolean parentFirst) throws Exception
| {
| HeirarchicalLoaderRepository3 repository = new HeirarchicalLoaderRepository3(getServer(), MAIN_LOADER_REPOSITORY_OBJECT_NAME);
| repository.setUseParentFirst(parentFirst);
| ClassLoader cl = repository.newClassLoader(url, true);
| registeredClassLoaders.add(cl);
| return cl;
| }
|
| protected void removeClassLoaderFromRepository(ClassLoader cl)
| {
| if (cl != null)
| {
| if (cl instanceof RepositoryClassLoader)
| {
| LoaderRepository repository = ((RepositoryClassLoader)cl).getLoaderRepository();
| repository.removeClassLoader(cl);
| }
| }
| }
|
| protected void assertCannotLoadClass(ClassLoader cl, String className)
| {
| try
| {
| cl.loadClass(className);
| fail("Should not have been able to load " + className);
| }
| catch(Exception expected)
| {
| }
| }
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4185459#4185459
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4185459
More information about the jboss-dev-forums
mailing list