Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/resolver/SubstitutableExportsTest.java78
-rw-r--r--bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java10
2 files changed, 85 insertions, 3 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/resolver/SubstitutableExportsTest.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/resolver/SubstitutableExportsTest.java
index afb55cb6f..627cc327c 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/resolver/SubstitutableExportsTest.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/services/resolver/SubstitutableExportsTest.java
@@ -101,7 +101,7 @@ public class SubstitutableExportsTest extends AbstractStateTest {
manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2"); //$NON-NLS-1$
manifest.put(Constants.BUNDLE_SYMBOLICNAME, "Z"); //$NON-NLS-1$
manifest.put(Constants.BUNDLE_VERSION, "1.0.0"); //$NON-NLS-1$
- manifest.put(Constants.EXPORT_PACKAGE, "x; version=0.5; bundle=Z"); //$NON-NLS-1$
+ manifest.put(Constants.EXPORT_PACKAGE, "x; version=0.5; bundle=Z, z; uses:=x; version=1.0"); //$NON-NLS-1$
BundleDescription z = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME) + (String) manifest.get(Constants.BUNDLE_VERSION), bundleID++);
manifest.clear();
@@ -2782,4 +2782,80 @@ public class SubstitutableExportsTest extends AbstractStateTest {
assertEquals("Should not have any unresolvable constraints", 0, unsatisfied.length);
}
+ public void testSubstitutableExports025() throws BundleException {
+ State state = getSubstituteUsesState();
+ BundleDescription a = state.getBundle(1);
+ BundleDescription b = state.getBundle(2);
+ BundleDescription c = state.getBundle(3);
+ BundleDescription d = state.getBundle(4);
+ BundleDescription e = state.getBundle(5);
+ BundleDescription f = state.getBundle(6);
+ BundleDescription g = state.getBundle(7);
+
+ Hashtable manifest = new Hashtable();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2"); //$NON-NLS-1$
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "H"); //$NON-NLS-1$
+ manifest.put(Constants.BUNDLE_VERSION, "1.0.0"); //$NON-NLS-1$
+ manifest.put(Constants.REQUIRE_BUNDLE, "C"); //$NON-NLS-1$
+ manifest.put(Constants.EXPORT_PACKAGE, "z; version=0.5"); //$NON-NLS-1$
+ manifest.put(Constants.IMPORT_PACKAGE, "z"); //$NON-NLS-1$
+ BundleDescription h = state.getFactory().createBundleDescription(state, manifest, (String) manifest.get(Constants.BUNDLE_SYMBOLICNAME) + (String) manifest.get(Constants.BUNDLE_VERSION), g.getBundleId() + 1);
+ state.addBundle(h);
+
+ state.resolve();
+
+ assertTrue("1.0", a.isResolved()); //$NON-NLS-1$
+ assertTrue("1.1", b.isResolved()); //$NON-NLS-1$
+ assertTrue("1.2", c.isResolved()); //$NON-NLS-1$
+ assertTrue("1.3", d.isResolved()); //$NON-NLS-1$
+ assertTrue("1.4", e.isResolved()); //$NON-NLS-1$
+ assertTrue("1.5", f.isResolved()); //$NON-NLS-1$
+ assertFalse("1.6", g.isResolved()); //$NON-NLS-1$
+ assertTrue("1.7", h.isResolved()); //$NON-NLS-1$
+
+ ExportPackageDescription[] aVisible = state.getStateHelper().getVisiblePackages(a);
+ ExportPackageDescription[] bVisible = state.getStateHelper().getVisiblePackages(b);
+ ExportPackageDescription[] cVisible = state.getStateHelper().getVisiblePackages(c);
+ ExportPackageDescription[] dVisible = state.getStateHelper().getVisiblePackages(d);
+ ExportPackageDescription[] eVisible = state.getStateHelper().getVisiblePackages(e);
+ ExportPackageDescription[] fVisible = state.getStateHelper().getVisiblePackages(f);
+ ExportPackageDescription[] gVisible = state.getStateHelper().getVisiblePackages(g);
+ ExportPackageDescription[] hVisible = state.getStateHelper().getVisiblePackages(h);
+
+ assertNotNull("aVisible is null", aVisible); //$NON-NLS-1$
+ assertNotNull("bVisible is null", bVisible); //$NON-NLS-1$
+ assertNotNull("cVisible is null", cVisible); //$NON-NLS-1$
+ assertNotNull("dVisible is null", dVisible); //$NON-NLS-1$
+ assertNotNull("eVisible is null", eVisible); //$NON-NLS-1$
+ assertNotNull("fVisible is null", fVisible); //$NON-NLS-1$
+ assertNotNull("gVisible is null", gVisible); //$NON-NLS-1$
+ assertNotNull("hVisible is null", hVisible); //$NON-NLS-1$
+
+ assertEquals("aVisible wrong number", 0, aVisible.length); //$NON-NLS-1$
+ assertEquals("bVisible wrong number", 2, bVisible.length); //$NON-NLS-1$
+ assertEquals("cVisible wrong number", 2, cVisible.length); //$NON-NLS-1$
+ assertEquals("dVisible wrong number", 2, dVisible.length); //$NON-NLS-1$
+ assertEquals("eVisible wrong number", 2, eVisible.length); //$NON-NLS-1$
+ assertEquals("fVisible wrong number", 2, fVisible.length); //$NON-NLS-1$
+ assertEquals("gVisible wrong number", 0, gVisible.length); //$NON-NLS-1$
+ assertEquals("hVisible wrong number", 2, hVisible.length); //$NON-NLS-1$
+
+ ExportPackageDescription[] aExports = a.getSelectedExports();
+ assertEquals("aVisible not correct", aExports, a.getExportPackages()); //$NON-NLS-1$
+ assertEquals("bVisible not correct", aExports, bVisible); //$NON-NLS-1$
+ assertEquals("cVisible not correct", aExports, cVisible); //$NON-NLS-1$
+ assertEquals("dVisible not correct", aExports, dVisible); //$NON-NLS-1$
+ assertEquals("eVisible not correct", aExports, eVisible); //$NON-NLS-1$
+ assertEquals("fVisible not correct", aExports, fVisible); //$NON-NLS-1$
+ assertEquals("hVisible not correct", aExports, hVisible); //$NON-NLS-1$
+
+ ExportPackageDescription[] hExported = h.getSelectedExports();
+ assertEquals("Expected one export", 1, hExported.length);
+ ExportPackageDescription[] hSubstituted = h.getSubstitutedExports();
+ assertEquals("Expected no substitutions", 0, hSubstituted.length);
+
+ ImportPackageSpecification[] hImports = h.getImportPackages();
+ assertEquals("Expected one import", 1, hImports.length);
+ assertEquals("Wrong supplier", hExported[0], hImports[0].getSupplier());
+ }
}
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
index 6f83a8fd4..6f393d795 100644
--- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
+++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java
@@ -846,8 +846,14 @@ public class ResolverImpl implements Resolver {
printCombination(bestCombination);
}
for (int i = 0; i < bestCombination.length; i++) {
- for (int j = 0; j < multipleSuppliers[i].length; j++)
- multipleSuppliers[i][j].setSelectedSupplier(bestCombination[i]);
+ for (int j = 0; j < multipleSuppliers[i].length; j++) {
+ ResolverConstraint constraint = multipleSuppliers[i][j];
+ constraint.setSelectedSupplier(bestCombination[i]);
+ // sanity check to make sure we did not just get wired to our own dropped export
+ VersionSupplier selectedSupplier = constraint.getSelectedSupplier();
+ if (selectedSupplier != null)
+ selectedSupplier.setSubstitute(null);
+ }
}
// do not need to keep uses data in memory

Back to the top