[jboss-cvs] JBossAS SVN: r93736 - in projects/jboss-cl/trunk: classloader/src/main/java/org/jboss/classloader/spi/base and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Sep 18 10:40:05 EDT 2009
Author: thomas.diesler at jboss.com
Date: 2009-09-18 10:40:05 -0400 (Fri, 18 Sep 2009)
New Revision: 93736
Modified:
projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/DelegateLoader.java
projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseDelegateLoader.java
projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
Log:
[JBCL-115] Module adds invalid delegates
Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/DelegateLoader.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/DelegateLoader.java 2009-09-18 14:37:30 UTC (rev 93735)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/DelegateLoader.java 2009-09-18 14:40:05 UTC (rev 93736)
@@ -52,4 +52,13 @@
{
super(factory);
}
+
+ /**
+ * Get the ClassLoaderPolicy associated with this DelegateLoader
+ * @return the class loader policy
+ */
+ public ClassLoaderPolicy getPolicy()
+ {
+ return (ClassLoaderPolicy)super.getPolicy();
+ }
}
Modified: projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseDelegateLoader.java
===================================================================
--- projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseDelegateLoader.java 2009-09-18 14:37:30 UTC (rev 93735)
+++ projects/jboss-cl/trunk/classloader/src/main/java/org/jboss/classloader/spi/base/BaseDelegateLoader.java 2009-09-18 14:40:05 UTC (rev 93736)
@@ -73,7 +73,7 @@
this.factory = factory;
}
- BaseClassLoaderPolicy getPolicy()
+ protected BaseClassLoaderPolicy getPolicy()
{
BaseClassLoaderPolicy delegate = this.delegate;
if (delegate == null)
Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-09-18 14:37:30 UTC (rev 93735)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java 2009-09-18 14:40:05 UTC (rev 93736)
@@ -29,17 +29,23 @@
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import org.jboss.classloader.spi.ClassLoaderPolicy;
import org.jboss.classloader.spi.ClassLoaderSystem;
import org.jboss.classloader.spi.DelegateLoader;
import org.jboss.classloader.spi.ParentPolicy;
import org.jboss.classloader.spi.filter.ClassFilter;
+import org.jboss.classloader.spi.filter.FilteredDelegateLoader;
+import org.jboss.classloader.spi.filter.PackageClassFilter;
import org.jboss.classloading.plugins.metadata.PackageCapability;
+import org.jboss.classloading.plugins.metadata.PackageRequirement;
import org.jboss.classloading.spi.helpers.NameAndVersionSupport;
import org.jboss.classloading.spi.metadata.Capability;
import org.jboss.classloading.spi.metadata.ClassLoadingMetaDataFactory;
@@ -364,7 +370,7 @@
* @return the module or null if the classloader does not correspond to a registered module classloader
* @throws SecurityException if the caller doesn't have <code>new RuntimePermision("getClassLoader")</code>
*/
- static Module getModuleForClassLoader(ClassLoader cl)
+ public static Module getModuleForClassLoader(ClassLoader cl)
{
SecurityManager sm = System.getSecurityManager();
if (sm != null)
@@ -569,12 +575,16 @@
// Check whether we already did this module
if (visited.contains(module))
return;
+
visited.add(module);
List<RequirementDependencyItem> dependencies = module.getRequirementDependencyItems();
if (dependencies == null || dependencies.isEmpty())
return;
+ // Maps the ClassLoaderPolicy that we get from the iDependOnModule to the list of package names that we are importing
+ Map<ClassLoaderPolicy, List<String>> delegateToRequiredPackages = new LinkedHashMap<ClassLoaderPolicy, List<String>>();
+
for (RequirementDependencyItem item : dependencies)
{
Requirement requirement = item.getRequirement();
@@ -603,23 +613,51 @@
// Something has gone wrong
throw new IllegalStateException("No iDependOn for item: " + item);
}
+
Module iDependOnModule = checkDomain().getModule(name);
if (iDependOnModule == null)
throw new IllegalStateException("Module not found with name: " + name);
// Determine the delegate loader for the module
- Module other = item.getModule();
- DelegateLoader delegate = iDependOnModule.getDelegateLoader(other, requirement);
+ DelegateLoader delegate = iDependOnModule.getDelegateLoader(module, requirement);
+ if (delegate == null)
+ throw new IllegalStateException("Cannot obtain delegate for: " + requirement);
// Check for re-export by the module
if (requirement.wantReExports())
addDelegates(iDependOnModule, delegates, dynamic, visited, true);
- // We want a module's re-exports (i.e. part of its imports) before the module itself
- if (delegate != null)
- delegates.add(delegate);
+ // Only add a the delegate if this is not a self-dependency
+ if (iDependOnModule != module)
+ {
+ // If we are connecting to another module we collect the imported package names per delegate
+ if (requirement instanceof PackageRequirement)
+ {
+ ClassLoaderPolicy policy = delegate.getPolicy();
+ List<String> packageNames = delegateToRequiredPackages.get(policy);
+ if (packageNames == null)
+ {
+ packageNames = new ArrayList<String>();
+ delegateToRequiredPackages.put(policy, packageNames);
+ }
+
+ PackageRequirement packageRequirement = (PackageRequirement)requirement;
+ packageNames.add(packageRequirement.getName());
+ }
+ else
+ {
+ delegates.add(delegate);
+ }
+ }
}
}
+
+ // Add FilteredDelegateLoaders for all collected package requirements
+ for (Entry<ClassLoaderPolicy, List<String>> entry : delegateToRequiredPackages.entrySet())
+ {
+ PackageClassFilter filter = PackageClassFilter.createPackageClassFilter(entry.getValue());
+ delegates.add(new FilteredDelegateLoader(entry.getKey(), filter));
+ }
}
/**
Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java 2009-09-18 14:37:30 UTC (rev 93735)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/ClassLoaderPolicyModule.java 2009-09-18 14:40:05 UTC (rev 93736)
@@ -49,7 +49,7 @@
* @author <a href="adrian at jboss.com">Adrian Brock</a>
* @version $Revision: 1.1 $
*/
-public abstract class ClassLoaderPolicyModule extends ClassLoadingMetaDataModule
+public abstract class ClassLoaderPolicyModule extends ClassLoadingMetaDataModule implements ClassLoaderPolicyFactory
{
/** The serialVersionUID */
private static final long serialVersionUID = -3357427104777457717L;
@@ -62,6 +62,9 @@
/** The classloader */
private ClassLoader classLoader;
+
+ /** An optional classloader policy factory */
+ private ClassLoaderPolicyFactory policyFactory;
/**
* Create a new ClassLoaderPolicyModule.
@@ -74,6 +77,15 @@
super(classLoadingMetaData, contextName);
}
+ /**
+ * Set the classloader policy factory
+ * @param policyFactory the classloader policy factory
+ */
+ public void setPolicyFactory(ClassLoaderPolicyFactory policyFactory)
+ {
+ this.policyFactory = policyFactory;
+ }
+
@Override
protected ClassLoader getClassLoaderForClass(final String className) throws ClassNotFoundException
{
@@ -193,7 +205,11 @@
{
if (policy != null)
return policy;
- policy = determinePolicy();
+
+ if (policyFactory == null)
+ policyFactory = this;
+
+ policy = policyFactory.createClassLoaderPolicy();
return policy;
}
@@ -209,6 +225,14 @@
}
/**
+ * Default implementation of class loader policy factory
+ */
+ public ClassLoaderPolicy createClassLoaderPolicy()
+ {
+ return determinePolicy();
+ }
+
+ /**
* Determine the classloader policy
*
* @return the policy
More information about the jboss-cvs-commits
mailing list