[FELIX-4942] Introduce a WireCandidate class instead of using parallel lists
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1690725 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
index ab1546b..a36974a 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
@@ -618,12 +618,9 @@
}
}
- // Create parallel lists for requirement and proposed candidate
+ // Create a list for requirement and proposed candidate
// capability or actual capability if resource is resolved or not.
- // We use parallel lists so we can calculate the packages spaces for
- // resolved and unresolved resources in an identical fashion.
- List<Requirement> reqs = new ArrayList<Requirement>();
- List<Capability> caps = new ArrayList<Capability>();
+ List<WireCandidate> wireCandidates = new ArrayList<WireCandidate>();
boolean isDynamicImporting = false;
Wiring wiring = session.getContext().getWirings().get(resource);
if (wiring != null)
@@ -649,8 +646,7 @@
{
c = new WrappedCapability(wire.getProvider(), c);
}
- reqs.add(r);
- caps.add(c);
+ wireCandidates.add(new WireCandidate(r, c));
}
// Since the resource is resolved, it could be dynamically importing,
@@ -658,7 +654,7 @@
// imports.
//
// NOTE: If the resource is dynamically importing, the fact that
- // the dynamic import is added here last to the parallel reqs/caps
+ // the dynamic import is added here last to the
// list is used later when checking to see if the package being
// dynamically imported shadows an existing provider.
for (Requirement req : wiring.getResourceRequirements(null))
@@ -674,8 +670,7 @@
{
continue;
}
- reqs.add(req);
- caps.add(cap);
+ wireCandidates.add(new WireCandidate(req, cap));
isDynamicImporting = true;
// Can only dynamically import one at a time, so break
// out of the loop after the first.
@@ -703,16 +698,14 @@
// Use the same requirement, but list each capability separately
for (Capability cap : candCaps)
{
- reqs.add(req);
- caps.add(cap);
+ wireCandidates.add(new WireCandidate(req, cap));
}
}
// Grab first (i.e., highest priority) candidate
else
{
Capability cap = candCaps.get(0);
- reqs.add(req);
- caps.add(cap);
+ wireCandidates.add(new WireCandidate(req, cap));
}
}
}
@@ -723,10 +716,11 @@
resourcePkgs = resourcePkgMap.get(resource);
// Second, add all imported packages to the target resource's package space.
- for (int i = 0; i < reqs.size(); i++)
+ for (int i = 0; i < wireCandidates.size(); i++)
{
- Requirement req = reqs.get(i);
- Capability cap = caps.get(i);
+ WireCandidate wireCandidate = wireCandidates.get(i);
+ Requirement req = wireCandidate.requirement;
+ Capability cap = wireCandidate.capability;
calculateExportedPackages(
session.getContext(), cap.getResource(), allCandidates, resourcePkgMap);
@@ -735,7 +729,7 @@
// parallel lists above. For the dynamically imported package, make
// sure that the resource doesn't already have a provider for that
// package, which would be illegal and shouldn't be allowed.
- if (isDynamicImporting && ((i + 1) == reqs.size()))
+ if (isDynamicImporting && ((i + 1) == wireCandidates.size()))
{
String pkgName = (String) cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE);
if (resourcePkgs.m_exportedPkgs.containsKey(pkgName)
@@ -757,8 +751,9 @@
}
// Third, have all candidates to calculate their package spaces.
- for (Capability cap : caps)
+ for (WireCandidate w : wireCandidates)
{
+ Capability cap = w.capability;
calculatePackageSpaces(
session, cap.getResource(), allCandidates, resourcePkgMap,
usesCycleMap, cycle);
@@ -776,10 +771,10 @@
if ((wiring == null) || isDynamicImporting)
{
// Merge uses constraints from required capabilities.
- for (int i = 0; i < reqs.size(); i++)
+ for (WireCandidate w : wireCandidates)
{
- Requirement req = reqs.get(i);
- Capability cap = caps.get(i);
+ Requirement req = w.requirement;
+ Capability cap = w.capability;
// Ignore bundle/package requirements, since they are
// considered below.
if (!req.getNamespace().equals(BundleNamespace.BUNDLE_NAMESPACE)
@@ -1887,6 +1882,18 @@
}
}
+ private static final class WireCandidate
+ {
+ public final Requirement requirement;
+ public final Capability capability;
+
+ public WireCandidate(Requirement requirement, Capability capability)
+ {
+ this.requirement = requirement;
+ this.capability = capability;
+ }
+ }
+
private static class Packages
{
public final OpenHashMap<String, Blame> m_exportedPkgs;