[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