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;
     }