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