[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