Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnjum Fatima2019-12-17 21:07:59 +0000
committerThomas Watson2019-12-18 18:56:22 +0000
commit8120812176770c7d296f56185a4df40581454e9d (patch)
tree130baaccec9e62421849c11a2e1b88896525c24b
parent489bba7e9675a0ce4908c229e28efcd5b0bacbca (diff)
downloadrt.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>
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/ConnectTests.java67
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/connect/ConnectBundleFile.java5
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/BundleInfo.java16
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 {

Back to the top