diff options
-rw-r--r-- | bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/legacy/PackageAdminImpl.java | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/legacy/PackageAdminImpl.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/legacy/PackageAdminImpl.java index 46d941b98..04d573372 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/legacy/PackageAdminImpl.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/framework/legacy/PackageAdminImpl.java @@ -115,8 +115,27 @@ public class PackageAdminImpl implements PackageAdmin { for (BundleCapability capability : packageCaps) { ModuleWiring wiring = (ModuleWiring) capability.getRevision().getWiring(); if (wiring != null) { - if (!wiring.getSubstitutedNames().contains(capability.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE))) { - result.add(new ExportedPackageImpl((ModuleCapability) capability, wiring)); + Collection<ModuleWiring> wirings = Collections.emptyList(); + if ((capability.getRevision().getTypes() & BundleRevision.TYPE_FRAGMENT) != 0) { + // This is a fragment, just get all the host wirings + List<ModuleWire> hostWires = wiring.getRequiredModuleWires(HostNamespace.HOST_NAMESPACE); + if (hostWires != null && !hostWires.isEmpty()) { + wirings = new ArrayList<ModuleWiring>(hostWires.size()); + for (ModuleWire hostWire : hostWires) { + ModuleWiring hostWiring = hostWire.getProviderWiring(); + if (hostWiring != null) { + wirings.add(hostWiring); + } + } + } + } else { + // just a single host wiring + wirings = Collections.singletonList(wiring); + } + for (ModuleWiring moduleWiring : wirings) { + if (!moduleWiring.getSubstitutedNames().contains(capability.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE))) { + result.add(new ExportedPackageImpl((ModuleCapability) capability, moduleWiring)); + } } } } |