Optimize resolver to not re-calculate "uses" constraints for already
resolved modules. (FELIX-2737)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1051936 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java b/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
index d0d3481..ecfe761 100644
--- a/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
@@ -542,6 +542,7 @@
// the module is resolved or not.
List<Requirement> reqs = new ArrayList();
List<Capability> caps = new ArrayList();
+ boolean isDynamicImport = false;
if (module.isResolved())
{
// Use wires to get actual requirements and satisfying capabilities.
@@ -567,6 +568,7 @@
Capability cap = candCaps.iterator().next();
reqs.add(req);
caps.add(cap);
+ isDynamicImport = true;
// Can only dynamically import one at a time, so break
// out of the loop after the first.
break;
@@ -614,12 +616,38 @@
// Fourth, if the target module is unresolved or is dynamically importing,
// then add all the uses constraints implied by its imported and required
// packages to its package space.
- for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
+ // NOTE: We do not need to do this for resolved modules because their
+ // package space is consistent by definition and these uses constraints
+ // are only needed to verify the consistency of a resolving module. The
+ // only exception is if a resolve module is dynamically importing, then
+ // we need to calculate its uses constraints again to make sure the new
+ // import is consistent with the existing package space.
+ if (!module.isResolved() || isDynamicImport)
{
- for (Blame blame : entry.getValue())
+ for (Entry<String, List<Blame>> entry : modulePkgs.m_importedPkgs.entrySet())
{
- // Ignore modules that import from themselves.
- if (!blame.m_cap.getModule().equals(module))
+ for (Blame blame : entry.getValue())
+ {
+ // Ignore modules that import from themselves.
+ if (!blame.m_cap.getModule().equals(module))
+ {
+ List<Requirement> blameReqs = new ArrayList();
+ blameReqs.add(blame.m_reqs.get(0));
+
+ mergeUses(
+ module,
+ modulePkgs,
+ blame.m_cap,
+ blameReqs,
+ modulePkgMap,
+ candidateMap,
+ usesCycleMap);
+ }
+ }
+ }
+ for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
+ {
+ for (Blame blame : entry.getValue())
{
List<Requirement> blameReqs = new ArrayList();
blameReqs.add(blame.m_reqs.get(0));
@@ -635,23 +663,6 @@
}
}
}
- for (Entry<String, List<Blame>> entry : modulePkgs.m_requiredPkgs.entrySet())
- {
- for (Blame blame : entry.getValue())
- {
- List<Requirement> blameReqs = new ArrayList();
- blameReqs.add(blame.m_reqs.get(0));
-
- mergeUses(
- module,
- modulePkgs,
- blame.m_cap,
- blameReqs,
- modulePkgMap,
- candidateMap,
- usesCycleMap);
- }
- }
}
private void mergeCandidatePackages(