diff options
author | Anjum Fatima | 2019-12-17 21:07:59 +0000 |
---|---|---|
committer | Thomas Watson | 2019-12-18 18:56:22 +0000 |
commit | 8120812176770c7d296f56185a4df40581454e9d (patch) | |
tree | 130baaccec9e62421849c11a2e1b88896525c24b | |
parent | 489bba7e9675a0ce4908c229e28efcd5b0bacbca (diff) | |
download | rt.equinox.framework-8120812176770c7d296f56185a4df40581454e9d.tar.gz rt.equinox.framework-8120812176770c7d296f56185a4df40581454e9d.tar.xz rt.equinox.framework-8120812176770c7d296f56185a4df40581454e9d.zip |
Bug 552573 - Use ConnectContent.getHeaders() Map for the
Bundle.getHeaders Dictionary
Change-Id: Ib0ed63c1f21015f14ab719b78759587724f83b7a
Signed-off-by: Anjum Fatima <anjum.eclipse@gmail.com>
3 files changed, 86 insertions, 2 deletions
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ConnectTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ConnectTests.java index 9e1c7d58c..086550c82 100644 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ConnectTests.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ConnectTests.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.osgi.tests.bundles; +import static org.junit.Assert.assertNotEquals; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -24,12 +26,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Dictionary; import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.Queue; import java.util.Set; @@ -75,9 +79,16 @@ public class ConnectTests extends AbstractBundleTests { } void doTestConnect(ConnectFramework connectFactory, Map<String, String> fwkConfig, Consumer<Framework> test) { + doTestConnect(connectFactory, fwkConfig, test, false); + } + + void doTestConnect(ConnectFramework connectFactory, Map<String, String> fwkConfig, Consumer<Framework> test, boolean enableRuntimeVerification) { File config = OSGiTestsActivator.getContext().getDataFile(getName()); config.mkdirs(); fwkConfig.put(Constants.FRAMEWORK_STORAGE, config.getAbsolutePath()); + if (enableRuntimeVerification) { + fwkConfig.put("osgi.signedcontent.support", "runtime"); + } ConnectFrameworkFactory fwkFactory = new EquinoxFactory(); Framework framework = fwkFactory.newFramework(fwkConfig, connectFactory); boolean passed = false; @@ -664,6 +675,56 @@ public class ConnectTests extends AbstractBundleTests { }); } + public void testConnectBundleHeaders() throws IOException { + doTestConnectBundleHeaders(false, false); + doTestConnectBundleHeaders(true, false); + doTestConnectBundleHeaders(false, true); + doTestConnectBundleHeaders(true, true); + } + + void doTestConnectBundleHeaders(boolean withSignedHook, boolean withManifest) throws IOException { + final String NAME1 = "bundle1"; + final String NAME2 = "bundle2"; + TestCountingConnectFramework connectFactory = new TestCountingConnectFramework(); + TestConnectModule m = withManifest ? createSimpleManifestModule(NAME1) : createSimpleHeadersModule(NAME1); + connectFactory.setModule(NAME1, m); + doTestConnect(connectFactory, new HashMap<>(), (f) -> { + try { + f.start(); + Bundle b = f.getBundleContext().installBundle(NAME1); + Dictionary<String, String> headers1 = b.getHeaders(); + assertEquals("Wrong name.", NAME1, b.getSymbolicName()); + if (withManifest) { + assertEquals("Wrong symbolic name header.", NAME1, headers1.get(Constants.BUNDLE_SYMBOLICNAME)); + } else { + checkHeaders(m.getContent().getHeaders().get(), headers1); + } + // set the new content + m.setContent(withManifest ? createSimpleManifestContent(NAME2) : createSimpleHeadersContent(NAME2)); + b.update(); + Dictionary<String, String> headers2 = b.getHeaders(); + assertNotEquals("Headers not updated", headers1, headers2); + assertEquals("Wrong name.", NAME2, b.getSymbolicName()); + if (withManifest) { + assertEquals("Wrong symbolic name header.", NAME2, headers2.get(Constants.BUNDLE_SYMBOLICNAME)); + } else { + checkHeaders(m.getContent().getHeaders().get(), headers2); + } + b.uninstall(); + } catch (Throwable t) { + sneakyThrow(t); + } + }, withSignedHook); + } + + private void checkHeaders(Map<String, String> expected, Dictionary<String, String> actual) { + assertEquals("Headers size not equals", expected.size(), actual.size()); + for (Entry<String, String> entry : expected.entrySet()) { + String key = entry.getKey(); + assertEquals(key + " header value not equal", entry.getValue(), actual.get(key)); + } + } + void checkEntry(ConnectEntry expected, URL actual, Integer id) throws IOException { assertNotNull("No entry found.", actual); assertEquals("Wrong path.", expected.getName(), actual.getPath().substring(1)); @@ -693,6 +754,10 @@ public class ConnectTests extends AbstractBundleTests { } TestConnectModule createSimpleManifestModule(String name) throws IOException { + return new TestConnectModule(createSimpleManifestContent(name)); + } + + TestConnectContent createSimpleManifestContent(String name) throws IOException { Manifest manifest = new Manifest(); Attributes headers = manifest.getMainAttributes(); headers.putValue("Manifest-Version", "1"); @@ -703,7 +768,7 @@ public class ConnectTests extends AbstractBundleTests { manifest.write(manifestBytes); TestConnectContent c = new TestConnectContent(null, null); addEntry("META-INF/MANIFEST.MF", manifestBytes.toByteArray(), c); - return new TestConnectModule(c); + return c; } TestConnectModule createAdvancedModule(Integer id, boolean provideLoader) { diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/connect/ConnectBundleFile.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/connect/ConnectBundleFile.java index a40c235b2..37e38cb17 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/connect/ConnectBundleFile.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/connect/ConnectBundleFile.java @@ -19,6 +19,7 @@ import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; +import java.util.Map; import java.util.Optional; import org.eclipse.osgi.internal.debug.Debug; import org.eclipse.osgi.storage.BundleInfo; @@ -126,6 +127,10 @@ public class ConnectBundleFile extends CloseableBundleFile<ConnectEntry> { return entry.getInputStream(); } + public Map<String, String> getConnectHeaders() { + return content.getHeaders().orElse(null); + } + Optional<ClassLoader> getClassLoader() { return content.getClassLoader(); } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/BundleInfo.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/BundleInfo.java index 61b73c03d..38ca83f00 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/BundleInfo.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/BundleInfo.java @@ -38,6 +38,7 @@ import org.eclipse.osgi.container.ModuleRevisionBuilder; import org.eclipse.osgi.framework.log.FrameworkLogEntry; import org.eclipse.osgi.framework.util.CaseInsensitiveDictionaryMap; import org.eclipse.osgi.framework.util.ThreadInfoReport; +import org.eclipse.osgi.internal.connect.ConnectBundleFile; import org.eclipse.osgi.internal.container.LockSet; import org.eclipse.osgi.internal.debug.Debug; import org.eclipse.osgi.internal.framework.EquinoxConfiguration; @@ -49,6 +50,7 @@ import org.eclipse.osgi.storage.ContentProvider.Type; import org.eclipse.osgi.storage.Storage.StorageException; import org.eclipse.osgi.storage.bundlefile.BundleEntry; import org.eclipse.osgi.storage.bundlefile.BundleFile; +import org.eclipse.osgi.storage.bundlefile.BundleFileWrapperChain; import org.eclipse.osgi.storage.url.BundleResourceHandler; import org.eclipse.osgi.storage.url.bundleentry.Handler; import org.eclipse.osgi.util.ManifestElement; @@ -128,7 +130,19 @@ public final class BundleInfo { Map<String, String> getRawHeaders() { synchronized (genMonitor) { if (rawHeaders == null) { - BundleEntry manifest = getBundleFile().getEntry(OSGI_BUNDLE_MANIFEST); + BundleFile bFile = getBundleFile(); + + if (this.contentType == Type.CONNECT) { + if (bFile instanceof BundleFileWrapperChain) { + bFile = ((BundleFileWrapperChain) bFile).getWrappedType(ConnectBundleFile.class); + } + rawHeaders = ((ConnectBundleFile) bFile).getConnectHeaders(); + if (rawHeaders != null) { + return rawHeaders; + } + } + + BundleEntry manifest = bFile.getEntry(OSGI_BUNDLE_MANIFEST); if (manifest == null) { rawHeaders = Collections.emptyMap(); } else { |