Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java10
-rw-r--r--bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java17
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevision.java19
-rw-r--r--bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevisionBuilder.java23
4 files changed, 51 insertions, 18 deletions
diff --git a/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java b/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java
index fc9d094cb..f211bb9e0 100644
--- a/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java
+++ b/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java
@@ -31,6 +31,7 @@ import java.util.jar.Manifest;
import org.eclipse.osgi.container.Module;
import org.eclipse.osgi.container.ModuleContainerAdaptor.ModuleEvent;
import org.eclipse.osgi.container.ModuleRevisionBuilder;
+import org.eclipse.osgi.container.ModuleRevisionBuilder.GenericInfo;
import org.eclipse.osgi.internal.hookregistry.ActivatorHookFactory;
import org.eclipse.osgi.internal.hookregistry.HookConfigurator;
import org.eclipse.osgi.internal.hookregistry.HookRegistry;
@@ -105,6 +106,14 @@ public class TestHookConfigurator implements HookConfigurator {
attrs.put("test.origin", origin.getLocation());
builder.addCapability("test.file.path", dirs, attrs);
}
+ if (TestHookConfigurator.adaptCapabilityAttribute) {
+ for (GenericInfo c : builder.getCapabilities()) {
+ if (BundleNamespace.BUNDLE_NAMESPACE.equals(c.getNamespace())) {
+ c.getAttributes().put("matching.attribute", "testAttribute");
+ c.getDirectives().put("matching.directive", "testDirective");
+ }
+ }
+ }
return builder;
}
}
@@ -163,6 +172,7 @@ public class TestHookConfigurator implements HookConfigurator {
public static volatile boolean validateCalled;
public static volatile boolean deletingGenerationCalled;
public static volatile boolean adaptManifest;
+ public static volatile boolean adaptCapabilityAttribute;
public static volatile boolean replaceModuleBuilder;
public static volatile boolean handleContentConnection;
public static volatile boolean returnNullStorageHook;
diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java
index 9e8c2d63d..b776cfb76 100644
--- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java
+++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java
@@ -29,6 +29,8 @@ import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.osgi.framework.launch.Framework;
+import org.osgi.framework.namespace.BundleNamespace;
+import org.osgi.framework.wiring.BundleCapability;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.resource.Capability;
import org.osgi.service.packageadmin.PackageAdmin;
@@ -44,6 +46,7 @@ public class StorageHookTests extends AbstractFrameworkHookTests {
private static final String HOOK_CONFIGURATOR_FIELD_VALIDATE_CALLED = "validateCalled";
private static final String HOOK_CONFIGURATOR_FIELD_DELETING_CALLED = "deletingGenerationCalled";
private static final String HOOK_CONFIGURATOR_FIELD_ADAPT_MANIFEST = "adaptManifest";
+ private static final String HOOK_CONFIGURATOR_FIELD_ADAPT_CAPABILITY_ATTRIBUTE = "adaptCapabilityAttribute";
private static final String HOOK_CONFIGURATOR_FIELD_REPLACE_BUILDER = "replaceModuleBuilder";
private static final String HOOK_CONFIGURATOR_FIELD_HANDLE_CONTENT = "handleContentConnection";
private static final String HOOK_CONFIGURATOR_FIELD_NULL_STORAGE_HOOK = "returnNullStorageHook";
@@ -223,6 +226,15 @@ public class StorageHookTests extends AbstractFrameworkHookTests {
assertEquals("Wrong BSN.", "replace", b.getSymbolicName());
testCaps = b.adapt(BundleRevision.class).getCapabilities("replace");
assertEquals("Wrong number of capabilities.", 1, testCaps.size());
+
+ setFactoryClassReplaceBuilder(false);
+ setFactoryClassAdaptCapabilityAttribute(true);
+ b.uninstall();
+ installBundle();
+ b = framework.getBundleContext().getBundle(location);
+ BundleCapability bundleCap = b.adapt(BundleRevision.class).getDeclaredCapabilities(BundleNamespace.BUNDLE_NAMESPACE).iterator().next();
+ assertEquals("Wrong attribute value", "testAttribute", bundleCap.getAttributes().get("matching.attribute"));
+ assertEquals("Wrong attribute value", "testDirective", bundleCap.getDirectives().get("matching.directive"));
}
@SuppressWarnings("deprecation")
@@ -390,6 +402,11 @@ public class StorageHookTests extends AbstractFrameworkHookTests {
clazz.getField(HOOK_CONFIGURATOR_FIELD_ADAPT_MANIFEST).set(null, value);
}
+ private void setFactoryClassAdaptCapabilityAttribute(boolean value) throws Exception {
+ Class<?> clazz = classLoader.loadClass(HOOK_CONFIGURATOR_CLASS);
+ clazz.getField(HOOK_CONFIGURATOR_FIELD_ADAPT_CAPABILITY_ATTRIBUTE).set(null, value);
+ }
+
private void setFactoryClassReplaceBuilder(boolean value) throws Exception {
Class<?> clazz = classLoader.loadClass(HOOK_CONFIGURATOR_CLASS);
clazz.getField(HOOK_CONFIGURATOR_FIELD_REPLACE_BUILDER).set(null, value);
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevision.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevision.java
index 801b08549..223990823 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevision.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevision.java
@@ -15,6 +15,7 @@ package org.eclipse.osgi.container;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -60,11 +61,27 @@ public final class ModuleRevision implements BundleRevision {
return Collections.emptyList();
List<ModuleCapability> result = new ArrayList<>(capabilityInfos.size());
for (GenericInfo info : capabilityInfos) {
- result.add(new ModuleCapability(info.namespace, info.directives, info.attributes, this));
+ if (info.mutable) {
+ result.add(new ModuleCapability(info.namespace, copyUnmodifiableMap(info.directives), copyUnmodifiableMap(info.attributes), this));
+ } else {
+ result.add(new ModuleCapability(info.namespace, info.directives, info.attributes, this));
+ }
}
return result;
}
+ private static <K, V> Map<K, V> copyUnmodifiableMap(Map<K, V> map) {
+ int size = map.size();
+ if (size == 0) {
+ return Collections.emptyMap();
+ }
+ if (size == 1) {
+ Map.Entry<K, V> entry = map.entrySet().iterator().next();
+ return Collections.singletonMap(entry.getKey(), entry.getValue());
+ }
+ return Collections.unmodifiableMap(new HashMap<>(map));
+ }
+
private List<ModuleRequirement> createRequirements(List<GenericInfo> requirementInfos) {
if (requirementInfos == null || requirementInfos.isEmpty())
return Collections.emptyList();
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevisionBuilder.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevisionBuilder.java
index 5cc6ac0f8..a3b5e4b75 100644
--- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevisionBuilder.java
+++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/container/ModuleRevisionBuilder.java
@@ -18,7 +18,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.osgi.internal.framework.FilterImpl;
@@ -53,11 +52,13 @@ public final class ModuleRevisionBuilder {
final String namespace;
final Map<String, String> directives;
final Map<String, Object> attributes;
+ final boolean mutable;
- GenericInfo(String namespace, Map<String, String> directives, Map<String, Object> attributes) {
+ GenericInfo(String namespace, Map<String, String> directives, Map<String, Object> attributes, boolean mutable) {
this.namespace = namespace;
this.directives = directives;
this.attributes = attributes;
+ this.mutable = mutable;
}
/**
@@ -295,23 +296,11 @@ public final class ModuleRevisionBuilder {
}
}
- private static void addGenericInfo(List<GenericInfo> infos, String namespace, Map<String, String> directives, Map<String, Object> attributes) {
+ private void addGenericInfo(List<GenericInfo> infos, String namespace, Map<String, String> directives, Map<String, Object> attributes) {
if (infos == null) {
infos = new ArrayList<>();
}
- infos.add(new GenericInfo(namespace, copyUnmodifiableMap(directives), copyUnmodifiableMap(attributes)));
- }
-
- private static <K, V> Map<K, V> copyUnmodifiableMap(Map<K, V> map) {
- int size = map.size();
- if (size == 0) {
- return Collections.emptyMap();
- }
- if (size == 1) {
- Map.Entry<K, V> entry = map.entrySet().iterator().next();
- return Collections.singletonMap(entry.getKey(), entry.getValue());
- }
- return Collections.unmodifiableMap(new HashMap<>(map));
+ infos.add(new GenericInfo(namespace, directives, attributes, true));
}
void basicAddCapability(String namespace, Map<String, String> directives, Map<String, Object> attributes) {
@@ -323,7 +312,7 @@ public final class ModuleRevisionBuilder {
}
private static void basicAddGenericInfo(List<GenericInfo> infos, String namespace, Map<String, String> directives, Map<String, Object> attributes) {
- infos.add(new GenericInfo(namespace, unmodifiableMap(directives), unmodifiableMap(attributes)));
+ infos.add(new GenericInfo(namespace, unmodifiableMap(directives), unmodifiableMap(attributes), false));
}
@SuppressWarnings("unchecked")

Back to the top