Merging of fragment import package and required bundle declarations
into the host bundle was faulty and could result in a class cast
exception. The code was using a map to merge the dependencies, but
was using values of an incorrect type. (FELIX-1197)


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@783402 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java b/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
index c2aff03..88894d7 100644
--- a/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
+++ b/framework/src/main/java/org/apache/felix/framework/FelixResolverState.java
@@ -195,15 +195,15 @@
                     new Object[] { host, reqs[reqIdx] });
             }
         }
-        // Loop through all fragments verifying they do no conflict,
-        // adding those packages that do not conflict and removing
-        // the fragment if it does conflict.
+        // Loop through each fragment verifying it does no conflict,
+        // adding its package and bundle dependencies if they do not
+        // conflict and removing the fragment if it does conflict.
         for (Iterator it = fragmentList.iterator(); it.hasNext(); )
         {
             IModule fragment = (IModule) it.next();
             reqs = fragment.getRequirements();
-            List ipFragment = new ArrayList();
-            List rbFragment = new ArrayList();
+            Map ipFragment = new HashMap();
+            Map rbFragment = new HashMap();
             boolean conflicting = false;
             for (int reqIdx = 0;
                 !conflicting && (reqs != null) && (reqIdx < reqs.length);
@@ -215,12 +215,12 @@
                     String targetName = ((Requirement) reqs[reqIdx]).getTargetName();
                     Map mergedReqMap = (reqs[reqIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
                         ? ipMerged : rbMerged;
-                    List fragmentReqList = (reqs[reqIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
+                    Map fragmentReqMap = (reqs[reqIdx].getNamespace().equals(ICapability.PACKAGE_NAMESPACE))
                         ? ipFragment : rbFragment;
                     Object[] existing = (Object[]) mergedReqMap.get(targetName);
                     if (existing == null)
                     {
-                        fragmentReqList.add(targetName);
+                        fragmentReqMap.put(targetName, new Object[] { fragment, reqs[reqIdx] });
                     }
                     else if (isRequirementConflicting(
                         (Requirement) existing[REQ_IDX], (Requirement) reqs[reqIdx]))
@@ -248,13 +248,15 @@
             // Merge non-conflicting requirements into overall set
             // of requirements and continue checking for conflicts
             // with the next fragment.
-            for (int pkgIdx = 0; pkgIdx < ipFragment.size(); pkgIdx++)
+            for (Iterator it2 = ipFragment.entrySet().iterator(); it2.hasNext(); )
             {
-                ipMerged.put(ipFragment.get(pkgIdx), fragment);
+                Map.Entry entry = (Map.Entry) it2.next();
+                ipMerged.put(entry.getKey(), entry.getValue());
             }
-            for (int pkgIdx = 0; pkgIdx < rbFragment.size(); pkgIdx++)
+            for (Iterator it2 = rbFragment.entrySet().iterator(); it2.hasNext(); )
             {
-                rbMerged.put(rbFragment.get(pkgIdx), fragment);
+                Map.Entry entry = (Map.Entry) it2.next();
+                rbMerged.put(entry.getKey(), entry.getValue());
             }
         }
     }