Bug 438904 - Global buddy class loading is not working for packages in a
fragment
- fix by checking for fragment wiring and using host wirings instead
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 46d941b..04d5733 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 @@
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));
+ }
}
}
}