Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTodor Boev2017-06-06 10:43:16 +0000
committerAlexander Kurtakov2017-08-23 13:38:11 +0000
commit70c366fd4d0475ed1fd826cbf2283f8ed3b3ebec (patch)
tree4104556d9f3f6f92d1dfefb7ca17b076fe690ee9
parent8db0333eaa018182202cf457c55bc99dc855697f (diff)
downloadrt.equinox.p2-70c366fd4d0475ed1fd826cbf2283f8ed3b3ebec.tar.gz
rt.equinox.p2-70c366fd4d0475ed1fd826cbf2283f8ed3b3ebec.tar.xz
rt.equinox.p2-70c366fd4d0475ed1fd826cbf2283f8ed3b3ebec.zip
Generalize to include attributes. Change-Id: I1135b89842185ed0e3197bfbcf4625a0f4f73510 Signed-off-by: Todor Boev <rinsvind@gmail.com>
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/ProvidedCapability.java100
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IProvidedCapability.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java11
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/SPIMetadataRepositoryTest.java20
4 files changed, 110 insertions, 36 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/ProvidedCapability.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/ProvidedCapability.java
index 8a324a203..be7aea670 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/ProvidedCapability.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/ProvidedCapability.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2011 IBM Corporation and others.
+ * Copyright (c) 2007, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -12,6 +12,9 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.metadata;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
import org.eclipse.core.runtime.Assert;
import org.eclipse.equinox.p2.metadata.IProvidedCapability;
import org.eclipse.equinox.p2.metadata.Version;
@@ -26,33 +29,71 @@ public class ProvidedCapability implements IProvidedCapability, IMemberProvider
public static final String MEMBER_VERSION = "version"; //$NON-NLS-1$
public static final String MEMBER_NAMESPACE = "namespace"; //$NON-NLS-1$
- private final String name;
private final String namespace;
- private final Version version;
+ private final Map<String, Object> attributes;
+
+ public ProvidedCapability(String namespace, Map<String, Object> attrs) {
+ Assert.isNotNull(namespace, NLS.bind(Messages.provided_capability_namespace_not_defined, null));
+ this.namespace = namespace;
+
+ Assert.isNotNull(attrs);
+ Assert.isTrue(!attrs.isEmpty());
+ Assert.isTrue(!attrs.containsKey(MEMBER_NAMESPACE));
+ this.attributes = new HashMap<>(attrs);
+
+ if (!attributes.containsKey(MEMBER_NAME)) {
+ // It is common for a capability to have a main attribute under a key
+ // with value the same as the capability namespace. Use as "name" if present.
+ Assert.isTrue(attributes.containsKey(namespace));
+ attributes.put(MEMBER_NAME, attributes.get(namespace));
+ }
+
+ Object version = attributes.get(MEMBER_VERSION);
+ if (version == null) {
+ attributes.put(MEMBER_VERSION, Version.emptyVersion);
+ } else if (version instanceof org.osgi.framework.Version) {
+ org.osgi.framework.Version osgiVer = (org.osgi.framework.Version) version;
+ attributes.put(
+ MEMBER_VERSION,
+ Version.createOSGi(osgiVer.getMajor(), osgiVer.getMinor(), osgiVer.getMicro(), osgiVer.getQualifier()));
+ } else {
+ Assert.isTrue(version instanceof Version);
+ }
+ }
public ProvidedCapability(String namespace, String name, Version version) {
Assert.isNotNull(namespace, NLS.bind(Messages.provided_capability_namespace_not_defined, null));
Assert.isNotNull(name, NLS.bind(Messages.provided_capability_name_not_defined, namespace));
this.namespace = namespace;
- this.name = name;
- this.version = version == null ? Version.emptyVersion : version;
+ this.attributes = new HashMap<>();
+ attributes.put(MEMBER_NAME, name);
+ attributes.put(MEMBER_VERSION, version == null ? Version.emptyVersion : version);
}
public boolean equals(Object other) {
- if (other == null)
+ if (other == null) {
return false;
- if (!(other instanceof IProvidedCapability))
+ }
+
+ if (!(other instanceof IProvidedCapability)) {
return false;
+ }
+
IProvidedCapability otherCapability = (IProvidedCapability) other;
- if (!(namespace.equals(otherCapability.getNamespace())))
+
+ if (!(namespace.equals(otherCapability.getNamespace()))) {
return false;
- if (!(name.equals(otherCapability.getName())))
+ }
+
+ if (!(attributes.equals(otherCapability.getAttributes()))) {
return false;
- return version.equals(otherCapability.getVersion());
+ }
+
+ return true;
}
public String getName() {
- return name;
+ return (String) attributes.get(MEMBER_NAME);
}
public String getNamespace() {
@@ -60,28 +101,37 @@ public class ProvidedCapability implements IProvidedCapability, IMemberProvider
}
public Version getVersion() {
- return version;
+ return (Version) attributes.get(MEMBER_VERSION);
+ }
+
+ public Map<String, Object> getAttributes() {
+ return attributes;
}
public int hashCode() {
- return namespace.hashCode() * name.hashCode() * version.hashCode();
+ return namespace.hashCode() * attributes.hashCode();
}
public String toString() {
- return namespace + '/' + name + '/' + version;
+ StringBuilder str = new StringBuilder();
+ str.append(namespace);
+
+ for (Entry<String, Object> attr : attributes.entrySet()) {
+ String key = attr.getKey();
+ Object val = attr.getValue();
+ String type = val.getClass().getSimpleName();
+
+ str.append("; ").append(key).append(":").append(type).append("=").append(val); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ return str.toString();
}
public Object getMember(String memberName) {
- // It is OK to use identity comparisons here since
- // a) All constant valued strings are always interned
- // b) The Member constructor always interns the name
- //
- if (MEMBER_NAME == memberName)
- return name;
- if (MEMBER_VERSION == memberName)
- return version;
- if (MEMBER_NAMESPACE == memberName)
- return namespace;
- throw new IllegalArgumentException("No such member: " + memberName); //$NON-NLS-1$
+ Object res = memberName.equals(MEMBER_NAMESPACE) ? namespace : attributes.get(memberName);
+ if (res == null) {
+ throw new IllegalArgumentException("No such member: " + memberName); //$NON-NLS-1$
+ }
+ return res;
}
}
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IProvidedCapability.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IProvidedCapability.java
index 7848c2dc0..e895d5bc2 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IProvidedCapability.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/IProvidedCapability.java
@@ -10,6 +10,8 @@
******************************************************************************/
package org.eclipse.equinox.p2.metadata;
+import java.util.Map;
+
/**
* Describes a capability that is exposed by an installable unit. These capabilities
* can satisfy the dependencies of other installable units, causing the unit
@@ -29,26 +31,33 @@ public interface IProvidedCapability {
/**
*
- * @return String
+ * @return String the special "name" attribute of this capability.
* @noreference This method is not intended to be referenced by clients.
*/
public String getName();
/**
*
- * @return String
+ * @return String the namespace of this capability.
* @noreference This method is not intended to be referenced by clients.
*/
public String getNamespace();
/**
*
- * @return String
+ * @return String the special "version" attribute of this capability.
* @noreference This method is not intended to be referenced by clients.
*/
public Version getVersion();
/**
+ *
+ * @return A full description of this capability
+ * @noreference This method is not intended to be referenced by clients.
+ */
+ public Map<String, Object> getAttributes();
+
+ /**
* Returns whether this provided capability is equal to the given object.
*
* This method returns <i>true</i> if:
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java
index 4cbaffb30..061fd118a 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/MetadataFactory.java
@@ -430,6 +430,17 @@ public final class MetadataFactory {
}
/**
+ * Returns a {@link IProvidedCapability} with the given values.
+ *
+ * @param namespace The capability namespace
+ * @param attributes The description of the capability
+ * @since 2.4
+ */
+ public static IProvidedCapability createProvidedCapability(String namespace, Map<String, Object> attributes) {
+ return new ProvidedCapability(namespace, attributes);
+ }
+
+ /**
* Returns a {@link IRequirement} with the given values.
*
* @param namespace The capability namespace
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/SPIMetadataRepositoryTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/SPIMetadataRepositoryTest.java
index f715a450b..e743c47bb 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/SPIMetadataRepositoryTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/SPIMetadataRepositoryTest.java
@@ -177,14 +177,15 @@ public class SPIMetadataRepositoryTest extends AbstractProvisioningTest {
class SPIProvidedCapability implements IProvidedCapability {
- String namespace = null;
- String name = null;
- Version version = null;
+ String namespace;
+ Map<String, Object> attributes;
public SPIProvidedCapability(String namespace, String name, Version version) {
this.namespace = namespace;
- this.name = name;
- this.version = version;
+
+ this.attributes = new HashMap<String, Object>();
+ attributes.put(ProvidedCapability.MEMBER_NAME, name);
+ attributes.put(ProvidedCapability.MEMBER_VERSION, version);
}
@Override
@@ -196,14 +197,14 @@ public class SPIMetadataRepositoryTest extends AbstractProvisioningTest {
IProvidedCapability otherCapability = (IProvidedCapability) other;
if (!(namespace.equals(otherCapability.getNamespace())))
return false;
- if (!(name.equals(otherCapability.getName())))
+ if (!(attributes.equals(otherCapability.getAttributes())))
return false;
return true;
}
@Override
public String getName() {
- return this.name;
+ return (String) attributes.get(ProvidedCapability.MEMBER_NAME);
}
@Override
@@ -213,13 +214,16 @@ public class SPIMetadataRepositoryTest extends AbstractProvisioningTest {
@Override
public Version getVersion() {
- return this.version;
+ return (Version) attributes.get(ProvidedCapability.MEMBER_VERSION);
}
public boolean satisfies(IRequirement candidate) {
return false;
}
+ public Map<String, Object> getAttributes() {
+ return attributes;
+ }
}
class SPIInstallableUnit implements IInstallableUnit {

Back to the top