When calculating resolved requirements, we must special case
fragments since they can have multiple wires for the same host
requirement, so we must avoid duplicates. (FELIX-2950)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1149732 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
index fd508a4..f17cfbc 100644
--- a/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/BundleWiringImpl.java
@@ -193,11 +193,17 @@
// First add resolved requirements from wires.
for (BundleWire bw : wires)
{
- reqList.add(bw.getRequirement());
- if (bw.getRequirement().getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE))
+ // Fragments may have multiple wires for the same requirement, so we
+ // need to check for and avoid duplicates in that case.
+ if (!bw.getRequirement().getNamespace().equals(BundleRevision.HOST_NAMESPACE)
+ || !reqList.contains(bw.getRequirement()))
{
- imports.add((String)
- bw.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE));
+ reqList.add(bw.getRequirement());
+ if (bw.getRequirement().getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE))
+ {
+ imports.add((String)
+ bw.getCapability().getAttributes().get(BundleRevision.PACKAGE_NAMESPACE));
+ }
}
}
// Next add dynamic requirements from host.
@@ -287,7 +293,6 @@
}
m_resolvedCaps = Collections.unmodifiableList(capList);
-
List<R4Library> libList = (m_revision.getDeclaredNativeLibraries() == null)
? new ArrayList<R4Library>()
: new ArrayList<R4Library>(m_revision.getDeclaredNativeLibraries());