[jboss-cvs] JBossAS SVN: r80654 - in projects/aop/trunk/asintegration-mc/src: main/org/jboss/aop/classpool/jbosscl and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Nov 7 08:22:11 EST 2008
Author: kabir.khan at jboss.com
Date: 2008-11-07 08:22:11 -0500 (Fri, 07 Nov 2008)
New Revision: 80654
Modified:
projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java
projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java
projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java
projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java
projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
Log:
[JBAOP-666]
*Make the test framework create the Modules containing the classloading metadata and register them in the DomainRegistry. This would normally be done by the deployers in AS.
*Rework the access to the ClassLoaderSystem since the IsolatedClassLoaderTestHelper has its own copy.
Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/AOPClassLoaderInitializer.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -105,7 +105,7 @@
{
if (!module.getDeterminedDomainName().equals(ClassLoaderSystem.DEFAULT_DOMAIN_NAME))
{
- ClassLoaderSystem system = ClassLoaderSystem.getInstance();
+ ClassLoaderSystem system = registry.getSystem();
String domainName = module.getDeterminedDomainName();
ClassLoaderDomain domain = system.getDomain(domainName);
Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/DomainRegistry.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -23,6 +23,7 @@
import org.jboss.aop.Domain;
import org.jboss.classloader.spi.ClassLoaderDomain;
+import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloading.spi.dependency.Module;
/**
@@ -32,6 +33,8 @@
*/
public interface DomainRegistry
{
+ ClassLoaderSystem getSystem();
+
boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader);
void cleanupLoader(ClassLoader loader);
Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/JBoss5ClassPoolFactory.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -64,7 +64,7 @@
if (module != null && module.getDeterminedParentDomainName() != null)
{
//It is scoped
- ClassLoaderSystem sys = ClassLoaderSystem.getInstance();
+ ClassLoaderSystem sys = registry.getSystem();
ClassLoaderDomain domain = sys.getDomain(module.getDeterminedDomainName());
boolean parentFirst = module.isJ2seClassLoadingCompliance();
ClassPool parentDomainPool = getParentUnitClassPool(cl);
Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/asintegration/jboss5/VFSClassLoaderDomainRegistry.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -39,6 +39,8 @@
{
final static ClassLoaderDomain domain = new ClassLoaderDomain("NOT_USED_PLACEHOLDER");
+ ClassLoaderSystem system;
+
/** classloader domains by their classloaders */
private Map<ClassLoader, WeakReference<ClassLoaderDomain>> classLoaderDomainsByLoader = new WeakHashMap<ClassLoader, WeakReference<ClassLoaderDomain>>();
@@ -51,7 +53,25 @@
/** Modules by classloader */
private Map<ClassLoader, WeakReference<Module>> classLoaderModules = new WeakHashMap<ClassLoader, WeakReference<Module>>();
- private Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
+ private Map<ClassLoaderDomain, Integer> classLoaderDomainReferenceCounts = new WeakHashMap<ClassLoaderDomain, Integer>();
+
+ /**
+ * Needed for the tests, not expected to be needed in production
+ */
+ @Deprecated
+ public void setSystem(ClassLoaderSystem system)
+ {
+ this.system = system;
+ }
+
+ public synchronized ClassLoaderSystem getSystem()
+ {
+ if (system == null)
+ {
+ system = ClassLoaderSystem.getInstance();
+ }
+ return system;
+ }
public synchronized boolean initMapsForLoader(ClassLoader loader, Module module, ScopedVFSClassLoaderDomain domain, ClassLoader parentUnitLoader)
{
@@ -59,7 +79,7 @@
{
throw new IllegalArgumentException("initMapsForLoader() should only be called if parentUnitLoader is different from loader");
}
- ClassLoaderSystem system = ClassLoaderSystem.getInstance();
+ ClassLoaderSystem system = getSystem();
String domainName = module.getDeterminedDomainName();
ClassLoaderDomain clDomain = system.getDomain(domainName);
Modified: projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/main/org/jboss/aop/classpool/jbosscl/JBossClClassPoolFactory.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -70,7 +70,7 @@
private ClassPoolDomain getDomain(Module module, ClassLoader cl)
{
ClassLoaderDomain domain = null;
- ClassLoaderSystem sys = ClassLoaderSystem.getInstance();
+ ClassLoaderSystem sys = registry.getSystem();
if (module != null && module.getDeterminedParentDomainName() != null)
{
//It is scoped
Modified: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/ClassLoaderWithRepositorySanityTestCase.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -51,7 +51,9 @@
try
{
clA = createClassLoader("A", true, PACKAGE_A);
+ assertModule(clA);
clB = createClassLoader("B", true, PACKAGE_B);
+ assertModule(clB);
try
{
Class<?> aFromA = clA.loadClass(CLASS_A);
@@ -90,8 +92,11 @@
try
{
clA = createClassLoader("A", true, PACKAGE_A);
+ assertModule(clA);
clB = createClassLoader("B", true, PACKAGE_B);
+ assertModule(clB);
clC = createChildDomainParentFirstClassLoader("C", "CHILD", true, PACKAGE_C);
+ assertModule(clC);
childDomain = getChildDomainForLoader(clC);
assertNotNull(childDomain);
@@ -135,8 +140,10 @@
try
{
clA = createChildDomainParentFirstClassLoader("A", "ChildA", true, PACKAGE_A);
+ assertModule(clA);
clB = createChildDomainParentLastClassLoader("B", "ChildB", true, PACKAGE_B);
-
+ assertModule(clB);
+
domainA = getChildDomainForLoader(clA);
assertNotNull(domainA);
assertSame(helper.getDomain(), domainA.getParent());
@@ -168,9 +175,13 @@
try
{
clScoped = createChildDomainParentFirstClassLoader("SCOPED", "SCOPED", true, PACKAGE_B);
+ assertModule(clScoped);
assertCannotLoadClass(clScoped, CLASS_A);
clGlobal = createClassLoader("GLOBAL", true, PACKAGE_A);
+ assertModule(clScoped);
+ assertModule(clGlobal);
+
Class<?> aFromChild = clScoped.loadClass(CLASS_A);
assertNotNull(aFromChild);
Class<?> aFromParent = clGlobal.loadClass(CLASS_A);
Modified: projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java
===================================================================
--- projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java 2008-11-07 13:19:31 UTC (rev 80653)
+++ projects/aop/trunk/asintegration-mc/src/tests/org/jboss/test/aop/classpool/jbosscl/test/JBossClClassPoolTest.java 2008-11-07 13:22:11 UTC (rev 80654)
@@ -23,27 +23,32 @@
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.WeakHashMap;
import javassist.ClassPool;
import junit.framework.Test;
import org.jboss.aop.AspectManager;
-import org.jboss.aop.asintegration.jboss5.DomainRegistry;
import org.jboss.aop.asintegration.jboss5.VFSClassLoaderDomainRegistry;
import org.jboss.aop.classpool.jbosscl.JBossClClassPoolFactory;
import org.jboss.classloader.plugins.filter.PatternClassFilter;
import org.jboss.classloader.spi.ClassLoaderDomain;
import org.jboss.classloader.spi.ClassLoaderPolicy;
+import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.DelegateLoader;
import org.jboss.classloader.spi.filter.ClassFilter;
import org.jboss.classloader.test.support.IsolatedClassLoaderTestHelper;
-import org.jboss.classloader.test.support.MockClassLoaderHelper;
import org.jboss.classloader.test.support.MockClassLoaderPolicy;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoaderPolicyModule;
+import org.jboss.classloading.spi.dependency.policy.mock.MockClassLoadingMetaData;
import org.jboss.test.AbstractTestCaseWithSetup;
import org.jboss.test.AbstractTestDelegate;
+import org.jboss.test.aop.classpool.jbosscl.support.TestMockClassLoaderPolicyModule;
/**
* Base class for testing the new JBoss classloaders
@@ -70,15 +75,14 @@
public final static String CLASS_B = PACKAGE_B + ".B";
public final static String CLASS_C = PACKAGE_C + ".C";
- //I don't think this is needed with the way the classloading system works, it maintains the hard references?
- //Keep a strong reference to the classloaders so that they are not garbage collected
- //final static Set<ClassLoader> registeredClassLoaders = new HashSet<ClassLoader>();
+ //Keep strong references to the Modules since the domainRegistry only has weak references
+ private Set<Module> modules = new HashSet<Module>();
private Map<ClassLoader, ClassLoaderDomain> scopedChildDomainsByLoader = new WeakHashMap<ClassLoader, ClassLoaderDomain>();
/** The classloader helper */
protected static IsolatedClassLoaderTestHelper helper;
- protected static DomainRegistry domainRegistry;
+ protected static VFSClassLoaderDomainRegistry domainRegistry;
static
{
@@ -160,10 +164,21 @@
domain = createScopedClassLoaderDomainParentLast(domainName);
}
}
- MockClassLoaderPolicy policy = MockClassLoaderHelper.createMockClassLoaderPolicy("A");
+ MockClassLoadingMetaData metaData = createClassLoadingMetaData(name);
+ metaData.setDomain(domainName);
+ metaData.setParentDomain(domain.getParentDomainName());
+ metaData.setJ2seClassLoadingCompliance(parentFirst);
+ metaData.setImportAll(importAll);
+ metaData.setPathsAndPackageNames(packages);
+ MockClassLoaderPolicyModule module = new MockClassLoaderPolicyModule(metaData, name);
+
+ MockClassLoaderPolicy policy = new MockClassLoaderPolicy(name);
+ policy.setImportAll(importAll);
policy.setPathsAndPackageNames(packages);
ClassLoader classLoader = createClassLoader(domain, policy);
+
scopedChildDomainsByLoader.put(classLoader, domain);
+ registerModule(classLoader, module);
return classLoader;
}
@@ -222,8 +237,72 @@
}
}
- /////////////////////////////////////////////////////////
- // These are lifted from AOPIntegrationTest
+ protected MockClassLoadingMetaData createClassLoadingMetaData(String name)
+ {
+ MockClassLoadingMetaData metaData = new MockClassLoadingMetaData(name);
+ //These should always be set
+ metaData.setBlackListable(true);
+ metaData.setCacheable(true);
+ //Default to the test domain
+ metaData.setDomain(helper.getDomain().getName());
+ metaData.setParentDomain(helper.getDomain().getParentDomainName());
+ return metaData;
+ }
+
+ protected MockClassLoadingMetaData createClassLoadingMetaDataFromPolicy(MockClassLoaderPolicy policy)
+ {
+ MockClassLoadingMetaData metaData = createClassLoadingMetaData(policy.getName());
+ metaData.setImportAll(policy.isImportAll());
+ metaData.setPathsAndPackageNames(policy.getPackageNames());
+ //TODO should set more OSGi stuff in metaData here
+ return metaData;
+ }
+
+ protected void registerModule(ClassLoader loader, MockClassLoaderPolicyModule module)
+ {
+ if (helper.getSystem() != domainRegistry.getSystem())
+ {
+ domainRegistry.setSystem(helper.getSystem());
+ }
+ //Add the hard reference to the Module since the registry's reference is weak
+ //In the real workd this would be maintained by the deployers
+ modules.add(module);
+ //TODO I have just hacked the domain and the parentUnitLoader here so this might cause problems
+ //with the tests if we try to do weaving. However, it should be fine while just testing pools
+ //and loaders
+ domainRegistry.initMapsForLoader(loader, module, null, null);
+ }
+
+ protected void unregisterModule(ClassLoader loader)
+ {
+ //Remove the hard reference to the Module
+ modules.remove(domainRegistry.getModule(loader));
+
+ domainRegistry.cleanupLoader(loader);
+ }
+
+ protected void assertModule(ClassLoader loader)
+ {
+ ClassLoaderSystem system = helper.getSystem();
+ ClassLoaderDomain domainForLoader = scopedChildDomainsByLoader.get(loader);
+ if (domainForLoader == null)
+ {
+ domainForLoader = helper.getDomain();
+ }
+ assertNotNull(domainForLoader);
+
+ ClassLoaderDomain domainForModule = domainRegistry.getClassLoaderDomainForLoader(loader);
+ assertNotNull(domainForModule);
+ assertSame(domainForLoader, domainForModule);
+
+ Module module = domainRegistry.getModule(loader);
+ assertNotNull(module);
+ assertEquals(domainForModule.getName(), module.getDomainName());
+ assertEquals(domainForModule.getParentDomainName(), module.getParentDomainName());
+ }
+
+ ////////////////////////////////////////////////////////////////////////
+ // These are lifted from AOPIntegrationTest, but have some modifications
/**
* Create a classloader
*
@@ -235,9 +314,18 @@
* @return the classloader
* @throws Exception for any error
*/
- protected static ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
+ protected ClassLoader createClassLoader(String name, boolean importAll, String... packages) throws Exception
{
- return helper.createClassLoader(name, importAll, packages);
+ MockClassLoadingMetaData metaData = createClassLoadingMetaData(name);
+ metaData.setImportAll(importAll);
+ metaData.setPathsAndPackageNames(packages);
+ metaData.setDomain(helper.getDomain().getName());
+ TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, name);
+
+ ClassLoader loader = helper.createClassLoader(name, importAll, packages);
+ registerModule(loader, module);
+
+ return loader;
}
/**
@@ -251,9 +339,14 @@
* @return the classloader
* @throws Exception for any error
*/
- protected static ClassLoader createClassLoaderInDomain(MockClassLoaderPolicy policy) throws Exception
+ protected ClassLoader createClassLoader(MockClassLoaderPolicy policy) throws Exception
{
- return helper.createClassLoader(policy);
+ MockClassLoadingMetaData metaData = createClassLoadingMetaDataFromPolicy(policy);
+ TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, policy.getName());
+
+ ClassLoader loader = helper.createClassLoader(policy);
+ registerModule(loader, module);
+ return loader;
}
/**
@@ -290,7 +383,14 @@
*/
public ClassLoader createClassLoader(ClassLoaderDomain domain, MockClassLoaderPolicy policy) throws Exception
{
- return helper.createClassLoader(domain, policy);
+ MockClassLoadingMetaData metaData = createClassLoadingMetaDataFromPolicy(policy);
+ metaData.setDomain(domain.getName());
+ metaData.setParentDomain(domain.getParentDomainName());
+ TestMockClassLoaderPolicyModule module = new TestMockClassLoaderPolicyModule(metaData, policy.getName());
+
+ ClassLoader loader = helper.createClassLoader(domain, policy);
+ registerModule(loader, module);
+ return loader;
}
/**
@@ -299,8 +399,9 @@
* @param classLoader the classloader
* @throws Exception for any error
*/
- protected static void unregisterClassLoader(ClassLoader classLoader) throws Exception
+ protected void unregisterClassLoader(ClassLoader classLoader) throws Exception
{
+ unregisterModule(classLoader);
helper.unregisterClassLoader(classLoader);
}
More information about the jboss-cvs-commits
mailing list