Author: pauls
Date: Tue Feb 14 16:15:26 2017
New Revision: 1782981

URL: http://svn.apache.org/viewvc?rev=1782981&view=rev
Log:
Implement FelixResolveContext.getSubstitutionWires(Wiring) (FELIX-5547).

Modified:
    
felix/trunk/framework/src/main/java/org/apache/felix/framework/ResolveContextImpl.java

Modified: 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ResolveContextImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ResolveContextImpl.java?rev=1782981&r1=1782980&r2=1782981&view=diff
==============================================================================
--- 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ResolveContextImpl.java
 (original)
+++ 
felix/trunk/framework/src/main/java/org/apache/felix/framework/ResolveContextImpl.java
 Tue Feb 14 16:15:26 2017
@@ -21,25 +21,30 @@ package org.apache.felix.framework;
 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 org.apache.felix.framework.StatefulResolver.ResolverHookRecord;
 import org.apache.felix.framework.resolver.CandidateComparator;
 import org.apache.felix.resolver.FelixResolveContext;
+import org.apache.felix.resolver.ResolverImpl;
+import org.osgi.framework.namespace.HostNamespace;
+import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleRequirement;
 import org.osgi.framework.wiring.BundleRevision;
 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;
 import org.osgi.service.resolver.HostedCapability;
 import org.osgi.service.resolver.ResolveContext;
 
 /**
- *
- * @author rickhall
+ * 
  */
 public class ResolveContextImpl extends ResolveContext implements 
FelixResolveContext
 {
@@ -90,7 +95,7 @@ public class ResolveContextImpl extends
             m_resolverHookrecord, br, true, true);
 
         // Casting the result to a List of Capability.
-        // TODO Can we do this without the strang double-cast?
+        // TODO Can we do this without the strange double-cast?
         @SuppressWarnings("unchecked")
         List<Capability> caps =
             (List<Capability>) (List<? extends Capability>) result;
@@ -120,4 +125,50 @@ public class ResolveContextImpl extends
     {
         return m_wirings;
     }
+
+       @Override
+       public Collection<Wire> getSubstitutionWires(Wiring wiring) {
+               // TODO: this is calculating information that probably has been 
calculated 
+               // already or at least could be calculated quicker taking into 
account the
+               // current state. We need to revisit this.
+               Set<String> exportNames = new HashSet<String>();
+        for (Capability cap : wiring.getResource().getCapabilities(null))
+        {
+            if (PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace()))
+            {
+                exportNames.add(
+                    (String) 
cap.getAttributes().get(PackageNamespace.PACKAGE_NAMESPACE));
+            }
+        }
+        // Add fragment exports
+        for (Wire wire : wiring.getProvidedResourceWires(null))
+        {
+            if 
(HostNamespace.HOST_NAMESPACE.equals(wire.getCapability().getNamespace()))
+            {
+                for (Capability cap : 
wire.getRequirement().getResource().getCapabilities(
+                    null))
+                {
+                    if 
(PackageNamespace.PACKAGE_NAMESPACE.equals(cap.getNamespace()))
+                    {
+                        exportNames.add((String) cap.getAttributes().get(
+                            PackageNamespace.PACKAGE_NAMESPACE));
+                    }
+                }
+            }
+        }
+        Collection<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;
+       }
 }
\ No newline at end of file


Reply via email to