[jboss-cvs] JBossAS SVN: r104782 - in projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency: policy and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu May 13 18:51:25 EDT 2010


Author: alesj
Date: 2010-05-13 18:51:24 -0400 (Thu, 13 May 2010)
New Revision: 104782

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/policy/WildcardClassLoaderPolicy.java
Log:
Simplify and optimize module matching.

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	2010-05-13 20:54:29 UTC (rev 104781)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/Module.java	2010-05-13 22:51:24 UTC (rev 104782)
@@ -935,6 +935,26 @@
    }
 
    /**
+    * The requirement can be resolved by the module.
+    *
+    * @param requirement the requirement
+    * @return true if the module can resolve requirement
+    */
+   public boolean canResolve(Requirement requirement)
+   {
+      List<Capability> capabilities = getCapabilitiesRaw();
+      if (capabilities != null && capabilities.isEmpty() == false)
+      {
+         for (Capability capability : capabilities)
+         {
+            if (capability.resolves(this, requirement))
+               return true;
+         }
+      }
+      return false;
+   }
+
+   /**
     * Get the capabilities.
     * 
     * @return the capabilities.

Modified: projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/WildcardClassLoaderPolicy.java
===================================================================
--- projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/WildcardClassLoaderPolicy.java	2010-05-13 20:54:29 UTC (rev 104781)
+++ projects/jboss-cl/trunk/classloading/src/main/java/org/jboss/classloading/spi/dependency/policy/WildcardClassLoaderPolicy.java	2010-05-13 22:51:24 UTC (rev 104782)
@@ -23,8 +23,12 @@
 
 import java.io.IOException;
 import java.net.URL;
-import java.util.*;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.jboss.classloader.plugins.ClassLoaderUtils;
 import org.jboss.classloader.spi.ClassLoaderPolicy;
@@ -32,7 +36,10 @@
 import org.jboss.classloader.spi.base.ClassLoadingTask;
 import org.jboss.classloader.spi.filter.ClassFilter;
 import org.jboss.classloading.plugins.metadata.PackageRequirement;
-import org.jboss.classloading.spi.dependency.*;
+import org.jboss.classloading.spi.dependency.ClassLoading;
+import org.jboss.classloading.spi.dependency.Domain;
+import org.jboss.classloading.spi.dependency.Module;
+import org.jboss.classloading.spi.dependency.ModuleRegistry;
 
 /**
  * WildcardClassLoaderPolicy.
@@ -47,12 +54,15 @@
    /** The package requirement */
    private PackageRequirement requirement;
 
-   /** The moduke */
+   /** The module */
    private Module module;
 
    /** The matching imported modules */
-   private volatile List<Module> modules;
+   private List<Module> modules = new CopyOnWriteArrayList<Module>();
 
+   /** The parents before index */
+   private int parentsBefore;
+
    /** The resources cache */
    private Map<String, Module> resourceCache = new ConcurrentHashMap<String, Module>();
 
@@ -84,7 +94,7 @@
       ClassFilter filter = requirement.toClassFilter();
       if (filter.matchesResourcePath(resource))
       {
-         for (Module m : getModules())
+         for (Module m : modules)
          {
             URL url = m.getResource(resource);
             if (url != null)
@@ -106,7 +116,7 @@
       ClassFilter filter = requirement.toClassFilter();
       if (filter.matchesResourcePath(path))
       {
-         for (Module m : getModules())
+         for (Module m : modules)
          {
             URL url = m.getResource(path);
             if (url != null)
@@ -124,7 +134,7 @@
       ClassFilter filter = requirement.toClassFilter();
       if (filter.matchesResourcePath(name))
       {
-         for (Module m : getModules())
+         for (Module m : modules)
          {
             Enumeration<URL> eu = m.getResources(name);
             while (eu.hasMoreElements())
@@ -139,96 +149,88 @@
       return false; // don't cache
    }
 
-   protected void reset(Module module)
+   /**
+    * Get module's domain if it's connected to ours, null otherwise.
+    *
+    * @param module the module
+    * @return module's domain if we're connected, null otherwise
+    */
+   protected Domain getDomain(Module module)
    {
       String domainName = module.getDeterminedDomainName();
       Domain current = domain;
       while (current != null && domainName.equals(domain.getName()) == false)
          current = current.getParentDomain();
 
-      // We have a domain match, do reset
-      if (current != null)
-      {
-         modules = null;
-         resourceCache.clear();
-      }
+      return current;
    }
 
-   public void addModule(Module module)
+   /**
+    * Clear this policy.
+    */
+   protected void reset()
    {
-      reset(module);
+      resourceCache.clear();
    }
 
-   public void removeModule(Module module)
+   public void addModule(Module module)
    {
-      reset(module);
+      Domain md = getDomain(module);
+      if (md != null && module.canResolve(requirement))
+      {
+         boolean isAncestor = (domain != md); // not the same domain, so it must be ancestor
+         boolean isParentFirst = domain.isParentFirst();
+         synchronized (this)
+         {
+            if (isAncestor)
+            {
+               if (isParentFirst)
+               {
+                  modules.add(0, module);
+                  parentsBefore++;
+               }
+               else
+                  modules.add(module);
+            }
+            else
+               modules.add(parentsBefore, module);
+         }
 
-      // Unregister this policy as module listener
-      if (module == this.module)
-      {
-         ClassLoading classLoading = domain.getClassLoading();
-         classLoading.removeModuleRegistry(this);
-         this.module = null;
+         reset();
       }
    }
 
-   /**
-    * Lazy get modules.
-    *
-    * @return the matching modules
-    */
-   private List<Module> getModules()
+   public void removeModule(Module module)
    {
-      if (modules == null)
+      boolean sameModule = (this.module == module);
+
+      if (sameModule == false)
       {
-         List<Module> tmp = new ArrayList<Module>();
-         List<ExportPackage> eps = getExportedPackages();
-         for (ExportPackage ep : eps)
+         synchronized (this)
          {
-            Module m = ep.getModule();
-            if (m != module) // sanity check
-               tmp.add(m);
+            if (modules.remove(module))
+            {
+               Domain md = getDomain(module);
+               boolean isAncestor = (domain != md);
+               boolean isParentFirst = domain.isParentFirst();
+               if (isAncestor && isParentFirst)
+                  parentsBefore--;
+
+               reset();
+            }
          }
-         modules = tmp;
       }
-      return modules;
-   }
 
-   /**
-    * Get matching imported modules.
-    *
-    * @return the matching import modules
-    */
-   private List<ExportPackage> getExportedPackages()
-   {
-      List<ExportPackage> modules = new ArrayList<ExportPackage>();
-      fillModules(domain, modules);
-      return modules;
+      // Unregister this policy as module listener
+      if (sameModule)
+      {
+         ClassLoading classLoading = domain.getClassLoading();
+         classLoading.removeModuleRegistry(this);
+         this.module = null;
+      }
    }
 
    /**
-    * Fill modules according to domain rules.
-    *
-    * @param domain  the current domain
-    * @param modules the modules to fill
-    */
-   private void fillModules(Domain domain, List<ExportPackage> modules)
-   {
-      Domain parent = domain.getParentDomain();
-      boolean parentFirst = domain.isParentFirst();
-
-      if (parent != null && parentFirst)
-         fillModules(parent, modules);
-
-      Collection<ExportPackage> eps = domain.getExportedPackages(requirement.getName(), requirement.getVersionRange());
-      if (eps != null && eps.isEmpty() == false)
-         modules.addAll(eps);
-
-      if (parent != null && parentFirst == false)
-         fillModules(parent, modules);
-   }
-
-   /**
     * Get BaseClassLoader from module.
     *
     * @param context the context




More information about the jboss-cvs-commits mailing list