Calculating aggregate module requirements incorrectly. Was not handling different
types of requirements separately, which lead to targets with the same name to over
write each other (e.g., a bundle symbolic name could overwrite a package of the
same name). (FELIX-2067)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@909252 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
index 190e835..25768e5 100644
--- a/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
+++ b/framework/src/main/java/org/apache/felix/framework/ModuleImpl.java
@@ -305,13 +305,30 @@
{
if (m_cachedRequirements == null)
{
- Map reqMap = new HashMap();
+ List allReqs = new ArrayList();
+ Map pkgMap = new HashMap();
+ Map rbMap = new HashMap();
for (int i = 0; (m_requirements != null) && i < m_requirements.length; i++)
{
- reqMap.put(((Requirement) m_requirements[i]).getTargetName(), m_requirements[i]);
+ if (m_requirements[i].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+ {
+ pkgMap.put(
+ ((Requirement) m_requirements[i]).getTargetName(),
+ m_requirements[i]);
+ }
+ else if (m_requirements[i].getNamespace().equals(ICapability.MODULE_NAMESPACE))
+ {
+ rbMap.put(
+ ((Requirement) m_requirements[i]).getTargetName(),
+ m_requirements[i]);
+ }
+ else
+ {
+ allReqs.add(m_requirements[i]);
+ }
}
- // Aggregate host and fragment requirements.
+ // Aggregate host and fragment bundle and package requirements.
for (int fragIdx = 0;
(m_fragments != null) && (fragIdx < m_fragments.length);
fragIdx++)
@@ -321,12 +338,11 @@
(reqs != null) && (reqIdx < reqs.length);
reqIdx++)
{
- if (reqs[reqIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE)
- || reqs[reqIdx].getNamespace().equals(ICapability.MODULE_NAMESPACE))
+ if (reqs[reqIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
{
// If the current fragment requirement overlaps a previously
// added requirement, then calculate a new intersecting requirement.
- Requirement req = (Requirement) reqMap.get(
+ Requirement req = (Requirement) pkgMap.get(
((Requirement) reqs[reqIdx]).getTargetName());
if (req != null)
{
@@ -337,12 +353,31 @@
{
req = (Requirement) reqs[reqIdx];
}
- reqMap.put(req.getTargetName(), req);
+ pkgMap.put(req.getTargetName(), req);
+ }
+ else if (reqs[reqIdx].getNamespace().equals(ICapability.MODULE_NAMESPACE))
+ {
+ // If the current fragment requirement overlaps a previously
+ // added requirement, then calculate a new intersecting requirement.
+ Requirement req = (Requirement) pkgMap.get(
+ ((Requirement) reqs[reqIdx]).getTargetName());
+ if (req != null)
+ {
+ req = FelixResolverState.calculateVersionIntersection(
+ req, (Requirement) reqs[reqIdx]);
+ }
+ else
+ {
+ req = (Requirement) reqs[reqIdx];
+ }
+ rbMap.put(req.getTargetName(), req);
}
}
}
+ allReqs.addAll(pkgMap.values());
+ allReqs.addAll(rbMap.values());
m_cachedRequirements = (IRequirement[])
- reqMap.values().toArray(new IRequirement[reqMap.size()]);
+ allReqs.toArray(new IRequirement[allReqs.size()]);
}
return m_cachedRequirements;
}