List<BundleRevision> unselectedFragments = new ArrayList<BundleRevision>();
for (Entry<BundleCapability, Map<String, Map<Version, List<BundleRequirement>>>>
hostEntry : m_hostFragments.entrySet())
{
// Step 1
BundleCapability hostCap = hostEntry.getKey();
Map<String, Map<Version, List<BundleRequirement>>> fragments
= hostEntry.getValue();
List<BundleRevision> selectedFragments = new ArrayList<BundleRevision>();
for (Entry<String, Map<Version, List<BundleRequirement>>> fragEntry
: fragments.entrySet())
{
boolean isFirst = true;
for (Entry<Version, List<BundleRequirement>> versionEntry
: fragEntry.getValue().entrySet())
{
for (BundleRequirement hostReq : versionEntry.getValue())
{
// Select the highest version of the fragment that
// is not removal pending.
if (isFirst
) // TODO: karl - is this correct? && !((BundleRevisionImpl) hostReq.getRevision()).isRemovalPending())
{
selectedFragments.add(hostReq.getRevision());
isFirst = false;
}
// For any fragment that wasn't selected, remove the
// current host as a potential host for it and remove it
// as a dependent on the host. If there are no more
// potential hosts for the fragment, then mark it as
// unselected for later removal.
else
{
m_dependentMap.get(hostCap).remove(hostReq);
SortedSet<BundleCapability> hosts = m_candidateMap.get(hostReq);
hosts.remove(hostCap);
if (hosts.isEmpty())
{
unselectedFragments.add(hostReq.getRevision());
}
}
}
}
}
// Step 2
HostBundleRevision wrappedHost =
new HostBundleRevision(hostCap.getRevision(), selectedFragments);
hostRevisions.add(wrappedHost);
m_allWrappedHosts.put(hostCap.getRevision(), wrappedHost);
}
// Step 3
for (BundleRevision br : unselectedFragments)
{
removeRevision(br,
new ResolveException(
"Fragment was not selected for attachment.", br, null));
}
// Step 4
for (HostBundleRevision hostRevision : hostRevisions)
{
// Replaces capabilities from fragments with the capabilities
// from the merged host.
for (BundleCapability c : hostRevision.getDeclaredCapabilities(null))
{
// Don't replace the host capability, since the fragment will
// really be attached to the original host, not the wrapper.
if (!c.getNamespace().equals(BundleRevision.HOST_NAMESPACE))
{
BundleCapability origCap =
((HostedCapability) c).getOriginalCapability();
// Note that you might think we could remove the original cap
// from the dependent map, but you can't since it may come from
// a fragment that is attached to multiple hosts, so each host
// will need to make their own copy.