felix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From tjwat...@apache.org
Subject svn commit: r1783278 - /felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
Date Thu, 16 Feb 2017 20:12:06 GMT
Author: tjwatson
Date: Thu Feb 16 20:12:06 2017
New Revision: 1783278

URL: http://svn.apache.org/viewvc?rev=1783278&view=rev
Log:
Update OSGi Resolver API (git commit fad1307 in OSGi repo)

Modified:
    felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
  (contents, props changed)

Modified: felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java?rev=1783278&r1=1783277&r2=1783278&view=diff
==============================================================================
--- felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
(original)
+++ felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
Thu Feb 16 20:12:06 2017
@@ -16,16 +16,23 @@
 
 package org.osgi.service.resolver;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CancellationException;
 
 import org.osgi.annotation.versioning.ConsumerType;
+import org.osgi.framework.namespace.BundleNamespace;
+import org.osgi.framework.namespace.HostNamespace;
+import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
+import org.osgi.resource.Wire;
 import org.osgi.resource.Wiring;
 
 /**
@@ -59,7 +66,7 @@ import org.osgi.resource.Wiring;
  * capabilities, wires and effective requirements.
  * 
  * @ThreadSafe
- * @author $Id: f70c6ec70d096ff04b9b4610add6bc25591f9a38 $
+ * @author $Id: 887cb785c112f51b400164044b822c291d081bdb $
  */
 @ConsumerType
 public abstract class ResolveContext {
@@ -237,11 +244,89 @@ public abstract class ResolveContext {
 	 * of resources which may allow the resolve operation to complete normally.
 	 * 
 	 * @param callback the callback to execute in order to cancel the resolve
-	 *            operation
+	 *            operation. Must not be {@code null}.
 	 * @throws IllegalStateException if the resolver attempts to register more
 	 *             than one callback for a resolve operation
+	 * @since 1.1
 	 */
 	public void onCancel(Runnable callback) {
 		// do nothing by default
 	}
+
+	/**
+	 * Returns the subset of {@link Wiring#getRequiredResourceWires(String)
+	 * required} wires that provide wires to {@link Capability capabilities}
+	 * which substitute capabilities of the wiring. For example, when a
+	 * {@link PackageNamespace package} name is both provided and required by
+	 * the same resource. If the package requirement is resolved to a capability
+	 * provided by a different wiring then the package capability is considered
+	 * to be substituted.
+	 * <p>
+	 * The resolver asks the resolve context to return substitution wires for
+	 * each wiring that {@link Wiring#getResourceCapabilities(String) provides}
+	 * a {@link BundleNamespace bundle} namespace capability that is used to
+	 * resolve one or more bundle requirements.
+	 * <p>
+	 * Note that this method searches all the {@link PackageNamespace package}
+	 * capabilities declared as {@link Resource#getCapabilities(String)
+	 * provided} by the resource associated with the wiring and fragment
+	 * resources wired to the wiring with the {@link HostNamespace host}
+	 * namespace. The provided package names are compared against the
+	 * {@link Wiring#getRequiredResourceWires(String) required} package wires to
+	 * determine which wires are substitution wires. Subclasses of
+	 * <code>ResolveContext</code> should provide a more efficient
+	 * implementation of this method.
+	 *
+	 * @param wiring the wiring to get the substitution wires for. Must not be
+	 *            {@code null}.
+	 * @return A list containing a snapshot of the substitution {@link Wire}s
+	 *         for the {@link Requirement requirements} of the wiring, or an
+	 *         empty list if the wiring has no substitution wires. The list
+	 *         contains the wires in the order they are found in the
+	 *         {@link Wiring#getRequiredResourceWires(String) required} wires of
+	 *         the wiring.
+	 * @since 1.1
+	 */
+	public List<Wire> getSubstitutionWires(Wiring wiring) {
+		// Keep track of the declared capability package names
+		Set<String> exportNames = new HashSet<String>();
+
+		// Add packages declared as provided by the wiring host
+		for (Capability cap : wiring.getResource().getCapabilities(null)) {
+			if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace())) {
+				exportNames.add((String) cap.getAttributes()
+						.get(PackageNamespace.PACKAGE_NAMESPACE));
+			}
+		}
+
+		// Add packages declared as provided by the attached fragments
+		for (Wire wire : wiring.getProvidedResourceWires(null)) {
+			if (HostNamespace.HOST_NAMESPACE
+					.equals(wire.getCapability().getNamespace())) {
+				Resource fragment = wire.getRequirement().getResource();
+				for (Capability cap : fragment.getCapabilities(null)) {
+					if (PackageNamespace.PACKAGE_NAMESPACE
+							.equals(cap.getNamespace())) {
+						exportNames.add((String) cap.getAttributes()
+								.get(PackageNamespace.PACKAGE_NAMESPACE));
+					}
+				}
+			}
+		}
+
+		// collect the package wires that substitute one of the declared
+		// export package names
+		List<Wire> substitutionWires = new ArrayList<Wire>();
+		for (Wire wire : wiring.getRequiredResourceWires(null)) {
+			if (PackageNamespace.PACKAGE_NAMESPACE
+					.equals(wire.getCapability().getNamespace())) {
+				if (exportNames
+						.contains(wire.getCapability().getAttributes().get(
+								PackageNamespace.PACKAGE_NAMESPACE))) {
+					substitutionWires.add(wire);
+				}
+			}
+		}
+		return substitutionWires;
+	}
 }

Propchange: felix/trunk/osgi-r7/resolver/src/main/java/org/osgi/service/resolver/ResolveContext.java
------------------------------------------------------------------------------
    svn:executable = *



Mime
View raw message