Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Watson2020-02-12 22:29:23 +0000
committerThomas Watson2020-02-12 22:29:23 +0000
commit854a5af441c11a2ba91cad2d45915f114a126fdd (patch)
treef2a231581c4aea361901ce92bbc89d21273ffbba
parent5beb53f68349d191433725fc28426cc83af1cff0 (diff)
downloadrt.equinox.framework-854a5af441c11a2ba91cad2d45915f114a126fdd.tar.gz
rt.equinox.framework-854a5af441c11a2ba91cad2d45915f114a126fdd.tar.xz
rt.equinox.framework-854a5af441c11a2ba91cad2d45915f114a126fdd.zip
packages Change-Id: Ieb07bfa4d7ba17cc22859f1ed4f12889e23efbfe Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/AbstractTest.java7
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/TestModuleContainer.java87
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/dummys/DummyContainerAdaptor.java3
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleResolver.java3
4 files changed, 86 insertions, 14 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/AbstractTest.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/AbstractTest.java
index 1835dd104..b26b2f2bb 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/AbstractTest.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/AbstractTest.java
@@ -15,7 +15,6 @@ package org.eclipse.osgi.tests.container;
import java.io.IOException;
import java.net.URL;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -58,15 +57,15 @@ public abstract class AbstractTest {
}
protected DummyContainerAdaptor createDummyAdaptor() {
- return new DummyContainerAdaptor(new DummyCollisionHook(false), Collections.<String, String> emptyMap());
+ return new DummyContainerAdaptor(new DummyCollisionHook(false), null);
}
protected DummyContainerAdaptor createDummyAdaptor(ResolverHook hook) {
- return new DummyContainerAdaptor(new DummyCollisionHook(false), Collections.<String, String> emptyMap(), new DummyResolverHookFactory(hook));
+ return new DummyContainerAdaptor(new DummyCollisionHook(false), null, new DummyResolverHookFactory(hook));
}
protected DummyContainerAdaptor createDummyAdaptor(DebugOptions debugOptions) {
- return new DummyContainerAdaptor(new DummyCollisionHook(false), Collections.<String, String> emptyMap(), new DummyResolverHookFactory(), debugOptions);
+ return new DummyContainerAdaptor(new DummyCollisionHook(false), null, new DummyResolverHookFactory(), debugOptions);
}
protected Bundle getBundle() {
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/TestModuleContainer.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/TestModuleContainer.java
index 1d2739c90..b6f7cac9a 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/TestModuleContainer.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/TestModuleContainer.java
@@ -2343,6 +2343,67 @@ public class TestModuleContainer extends AbstractTest {
}
@Test
+ public void testSubstitutableExportBatch() throws BundleException, IOException {
+ DummyContainerAdaptor adaptor = new DummyContainerAdaptor(new DummyCollisionHook(false), Collections.singletonMap(EquinoxConfiguration.PROP_RESOLVER_REVISION_BATCH_SIZE, Integer.toString(1)));
+ ModuleContainer container = adaptor.getContainer();
+
+ // install the system.bundle
+ Module systemBundle = installDummyModule("system.bundle.MF", Constants.SYSTEM_BUNDLE_LOCATION, Constants.SYSTEM_BUNDLE_SYMBOLICNAME, null, null, container);
+ ResolutionReport report = container.resolve(Arrays.asList(systemBundle), true);
+ Assert.assertNull("Failed to resolve system.bundle.", report.getResolutionException());
+
+ Map<String, String> manifest = new HashMap<>();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "substitutableExporter");
+ manifest.put(Constants.EXPORT_PACKAGE, "exporter; uses:=usedPkg; version=1.1, usedPkg");
+ manifest.put(Constants.IMPORT_PACKAGE, "exporter; pickme=true");
+
+ Module moduleSubsExport = installDummyModule(manifest, "substitutableExporter", container);
+
+ manifest = new HashMap<>();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "exporter");
+ manifest.put(Constants.EXPORT_PACKAGE, "exporter; version=1.0; pickme=true");
+ Module moduleExport = installDummyModule(manifest, "exporter", container);
+
+ manifest = new HashMap<>();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "importer1");
+ manifest.put(Constants.IMPORT_PACKAGE, "exporter, usedPkg");
+ Module moduleImporter1 = installDummyModule(manifest, "importer1", container);
+
+ manifest = new HashMap<>();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "importer2");
+ manifest.put(Constants.EXPORT_PACKAGE, "pkgUser; uses:=exporter");
+ manifest.put(Constants.IMPORT_PACKAGE, "exporter, usedPkg");
+ Module moduleImporter2 = installDummyModule(manifest, "importer2", container);
+
+ manifest = new HashMap<>();
+ manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ manifest.put(Constants.BUNDLE_SYMBOLICNAME, "importer3");
+ manifest.put(Constants.IMPORT_PACKAGE, "pkgUser, exporter");
+ Module moduleImporter3 = installDummyModule(manifest, "importer3", container);
+
+ report = container.resolve(Arrays.asList(moduleExport, moduleSubsExport, moduleImporter1, moduleImporter2, moduleImporter3), true);
+ Assert.assertNull("Failed to resolve", report.getResolutionException());
+
+ ModuleWiring subsExportWiring = moduleSubsExport.getCurrentRevision().getWiring();
+ Collection<String> substituteNames = subsExportWiring.getSubstitutedNames();
+ Assert.assertEquals("Wrong number of exports: " + substituteNames, 1, substituteNames.size());
+ List<ModuleWire> providedWires = moduleSubsExport.getCurrentRevision().getWiring().getProvidedModuleWires(PackageNamespace.PACKAGE_NAMESPACE);
+ assertEquals("Wrong number of wires.", 2, providedWires.size());
+
+ ModuleWiring importer3Wiring = moduleImporter3.getCurrentRevision().getWiring();
+ for (ModuleWire wire : importer3Wiring.getRequiredModuleWires(PackageNamespace.PACKAGE_NAMESPACE)) {
+ if ("exporter".equals(wire.getCapability().getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE))) {
+ assertEquals("wrong provider", moduleExport.getCurrentRevision(), wire.getProvider());
+ }
+
+ }
+ }
+
+ @Test
public void testR3() throws BundleException, IOException {
DummyContainerAdaptor adaptor = createDummyAdaptor();
ModuleContainer container = adaptor.getContainer();
@@ -3581,22 +3642,32 @@ public class TestModuleContainer extends AbstractTest {
ResolutionReport report = container.resolve(Arrays.asList(systemBundle), true);
Assert.assertNull("Failed to resolve system.bundle.", report.getResolutionException());
+ // install and resolve used.pkg exporter to force substitution
+ Map<String, String> usedPkgExportManifest = new HashMap<>();
+ usedPkgExportManifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
+ usedPkgExportManifest.put(Constants.BUNDLE_SYMBOLICNAME, "used.pkg");
+ usedPkgExportManifest.put(Constants.EXPORT_PACKAGE, "used.pkg");
+ Module moduleUsedPkg = installDummyModule(usedPkgExportManifest, "usedPkg", container);
+ report = container.resolve(Arrays.asList(moduleUsedPkg), true);
+ Assert.assertNull("Failed to resolve usedPkg.", report.getResolutionException());
+
// install part 1 (ui.workbench)
- Map<String, String> split1Manifest = new HashMap<String, String>();
+ Map<String, String> split1Manifest = new HashMap<>();
split1Manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
split1Manifest.put(Constants.BUNDLE_SYMBOLICNAME, "split1");
- split1Manifest.put(Constants.EXPORT_PACKAGE, "split.pkg");
+ split1Manifest.put(Constants.EXPORT_PACKAGE, "split.pkg; uses:=used.pkg, used.pkg");
+ split1Manifest.put(Constants.IMPORT_PACKAGE, "used.pkg");
Module moduleSplit1 = installDummyModule(split1Manifest, "split1", container);
// install part 2 (e4.ui.ide)
- Map<String, String> split2Manifest = new HashMap<String, String>();
+ Map<String, String> split2Manifest = new HashMap<>();
split2Manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
split2Manifest.put(Constants.BUNDLE_SYMBOLICNAME, "split2");
split2Manifest.put(Constants.EXPORT_PACKAGE, "split.pkg");
Module moduleSplit2 = installDummyModule(split2Manifest, "split2", container);
// install part 3 which requires part 1 and 2, reexports 1 and 2 (ui.ide)
- Map<String, String> split3Manifest = new HashMap<String, String>();
+ Map<String, String> split3Manifest = new HashMap<>();
split3Manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
split3Manifest.put(Constants.BUNDLE_SYMBOLICNAME, "split3");
split3Manifest.put(Constants.EXPORT_PACKAGE, "split.pkg");
@@ -3605,21 +3676,21 @@ public class TestModuleContainer extends AbstractTest {
Module moduleSplit3 = installDummyModule(split3Manifest, "split3", container);
// install reexporter of part1 (ui)
- Map<String, String> reexporterPart1Manifest = new HashMap<String, String>();
+ Map<String, String> reexporterPart1Manifest = new HashMap<>();
reexporterPart1Manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
reexporterPart1Manifest.put(Constants.BUNDLE_SYMBOLICNAME, "reexport1");
reexporterPart1Manifest.put(Constants.REQUIRE_BUNDLE, "split1; visibility:=reexport");
Module moduleReexport1 = installDummyModule(reexporterPart1Manifest, "reexport1", container);
// install reexporter of split3
- Map<String, String> reexporterSplit3Manifest = new HashMap<String, String>();
+ Map<String, String> reexporterSplit3Manifest = new HashMap<>();
reexporterSplit3Manifest.put(Constants.BUNDLE_MANIFESTVERSION, "2");
reexporterSplit3Manifest.put(Constants.BUNDLE_SYMBOLICNAME, "reexportSplit3");
reexporterSplit3Manifest.put(Constants.REQUIRE_BUNDLE, "split3; visibility:=reexport");
Module moduleReexportSplit3 = installDummyModule(reexporterSplit3Manifest, "reexportSplit3", container);
// install test export that requires reexportSplit3 (should get access to all 3 parts)
- Map<String, String> testExporterUses = new HashMap<String, String>();
+ Map<String, String> testExporterUses = new HashMap<>();
testExporterUses.put(Constants.BUNDLE_MANIFESTVERSION, "2");
testExporterUses.put(Constants.BUNDLE_SYMBOLICNAME, "test.exporter");
testExporterUses.put(Constants.REQUIRE_BUNDLE, "reexportSplit3");
@@ -3628,7 +3699,7 @@ public class TestModuleContainer extends AbstractTest {
// install test requirer that requires the exporter and reexport1 (should get access to only part 1)
// part 1 is a subset of what the exporter has access to so it should resolve
- Map<String, String> testRequireUses = new HashMap<String, String>();
+ Map<String, String> testRequireUses = new HashMap<>();
testRequireUses.put(Constants.BUNDLE_MANIFESTVERSION, "2");
testRequireUses.put(Constants.BUNDLE_SYMBOLICNAME, "test.requirer");
testRequireUses.put(Constants.REQUIRE_BUNDLE, "test.exporter, reexport1");
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/dummys/DummyContainerAdaptor.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/dummys/DummyContainerAdaptor.java
index e51114a07..bf93063a8 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/dummys/DummyContainerAdaptor.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/container/dummys/DummyContainerAdaptor.java
@@ -14,6 +14,7 @@
package org.eclipse.osgi.tests.container.dummys;
import java.util.EnumSet;
+import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
@@ -56,7 +57,7 @@ public class DummyContainerAdaptor extends ModuleContainerAdaptor {
public DummyContainerAdaptor(ModuleCollisionHook collisionHook, Map<String, String> configuration, ResolverHookFactory resolverHookFactory, DebugOptions debugOptions) {
this.collisionHook = collisionHook;
- this.configuration = configuration;
+ this.configuration = configuration == null ? new HashMap<String, String>() : configuration;
this.resolverHookFactory = resolverHookFactory;
this.moduleDatabase = new DummyModuleDatabase(this);
this.debugOptions = debugOptions;
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleResolver.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleResolver.java
index cf8318a79..a9464d429 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleResolver.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleResolver.java
@@ -481,7 +481,8 @@ final class ModuleResolver {
addRequiredWires(requiredWires, existingRequiredWires, existingRequirements);
InternalUtils.filterCapabilityPermissions(existingCapabilities);
- return new ModuleWiring(revision, existingCapabilities, existingRequirements, existingProvidedWires, existingRequiredWires, Collections.EMPTY_LIST);
+ return new ModuleWiring(revision, existingCapabilities, existingRequirements, existingProvidedWires,
+ existingRequiredWires, existingWiring.getSubstitutedNames());
}
static boolean isSingleton(ModuleRevision revision) {

Back to the top