if (null == versions) {
versions = new TreeMap();
allExports.put(pkgName, versions);
}
SortedSet exporters = (SortedSet) versions.get(pkgVersion);
if (null == exporters) {
exporters = new TreeSet();
versions.put(pkgVersion, exporters);
}
exporters.add(ba);
}
}
// For each bundle build the pkgProvidersMap
for (Iterator itBa = allBundleArchives.iterator(); itBa.hasNext();) {
final BundleArchive ba = (BundleArchive) itBa.next();
final Iterator itIe = ba.pkgImportMap.entrySet().iterator();
while (itIe.hasNext()) {
final Map.Entry iE = (Map.Entry) itIe.next();
final String pkgName = (String) iE.getKey();
final VersionRange range = (VersionRange) iE.getValue();
SortedMap versions = (SortedMap) allExports.get(pkgName);
if (null != versions) {
final Iterator itV = versions.entrySet().iterator();
while (itV.hasNext()) {
final Map.Entry vE = (Map.Entry) itV.next();
final Version pkgVersion = (Version) vE.getKey();
if (range.contains(pkgVersion)) {
final SortedSet providers = (SortedSet) vE.getValue();
final Iterator itP = providers.iterator();
while (itP.hasNext()) {
final BundleArchive provider = (BundleArchive) itP.next();
// The package pkgName may be imported by ba from provider,
// update ba's providers map
SortedSet pkgNames = (SortedSet) ba.pkgProvidersMap
.get(provider);
if (null == pkgNames) {
pkgNames = new TreeSet();
ba.pkgProvidersMap.put(provider, pkgNames);
}
pkgNames.add(pkgName);
// Non self exported package, add to pkgCtProvidersMap
if (!ba.pkgExportMap.containsKey(pkgName)) {
SortedSet pkgNamesCt = (SortedSet) ba.pkgCtProvidersMap
.get(provider);
if (null == pkgNamesCt) {
pkgNamesCt = new TreeSet();
ba.pkgCtProvidersMap.put(provider, pkgNamesCt);
}
pkgNamesCt.add(pkgName);
}
// The package pkgName is provided (exported) by
// provider to ba, update provider.pkgProvidedMap to
// reflect this.
SortedSet pkgNamesProvidedToBa = (SortedSet) provider.pkgProvidedMap
.get(ba);
if (null == pkgNamesProvidedToBa) {
pkgNamesProvidedToBa = new TreeSet();
provider.pkgProvidedMap.put(ba, pkgNamesProvidedToBa);
}
pkgNamesProvidedToBa.add(pkgName);
}
}
}
} else {
ba.pkgUnprovidedMap.put(pkgName, range);