You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by tj...@apache.org on 2017/02/09 17:44:03 UTC

svn commit: r1782373 - in /felix/trunk/resolver/src: main/java/org/apache/felix/resolver/ test/java/org/apache/felix/resolver/test/ test/java/org/apache/felix/resolver/test/util/

Author: tjwatson
Date: Thu Feb  9 17:44:03 2017
New Revision: 1782373

URL: http://svn.apache.org/viewvc?rev=1782373&view=rev
Log:
[FELIX-5514] Issues with substituted exports with require bundle

Modify solution to avoid adding API to wiring implementations

Removed:
    felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixWiring.java
Modified:
    felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixResolveContext.java
    felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
    felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/ResolverTest.java
    felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/util/ResolveContextImpl.java

Modified: felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixResolveContext.java
URL: http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixResolveContext.java?rev=1782373&r1=1782372&r2=1782373&view=diff
==============================================================================
--- felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixResolveContext.java (original)
+++ felix/trunk/resolver/src/main/java/org/apache/felix/resolver/FelixResolveContext.java Thu Feb  9 17:44:03 2017
@@ -18,7 +18,11 @@
  */package org.apache.felix.resolver;
 
 import java.util.Collection;
+
+import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Resource;
+import org.osgi.resource.Wire;
+import org.osgi.resource.Wiring;
 
 public interface FelixResolveContext
 {
@@ -41,4 +45,19 @@ public interface FelixResolveContext
      * resources. The returned collection may be unmodifiable.
      */
     public Collection<Resource> getOndemandResources(Resource host);
+
+    /**
+     * Returns the subset of {@link Wiring#getRequiredResourceWires(String) require wires}
+     * that provide wires to {@link Capability capabilities} which substitute capabilities
+     * of the given 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 hosted by a different wiring then the package capability is
+     * considered to be substituted.
+     *
+     * @param wiring the wiring to get the substitution wires from
+     * @return A collection containing a snapshot of the substitution {@link Wire}s
+     * for the {@link Requirement requirements} of this wiring, or an empty list
+     * if this wiring has no substitution wires.
+     */
+    public Collection<Wire> getSubstitutionWires(Wiring wiring);
 }

Modified: felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java?rev=1782373&r1=1782372&r2=1782373&view=diff
==============================================================================
--- felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java (original)
+++ felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java Thu Feb  9 17:44:03 2017
@@ -1608,9 +1608,10 @@ public class ResolverImpl implements Res
         if (wiring != null)
         {
             Collection<Wire> substitutionWires;
-            if (wiring instanceof FelixWiring)
+            if (session.getContext() instanceof FelixResolveContext)
             {
-                substitutionWires = ((FelixWiring) wiring).getSubstitutionWires();
+                substitutionWires = ((FelixResolveContext) session.getContext()).getSubstitutionWires(
+                    wiring);
             }
             else
             {

Modified: felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/ResolverTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/ResolverTest.java?rev=1782373&r1=1782372&r2=1782373&view=diff
==============================================================================
--- felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/ResolverTest.java (original)
+++ felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/ResolverTest.java Thu Feb  9 17:44:03 2017
@@ -33,7 +33,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.felix.resolver.FelixWiring;
 import org.apache.felix.resolver.Logger;
 import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.resolver.test.util.BundleCapability;
@@ -59,6 +58,7 @@ import org.osgi.resource.Resource;
 import org.osgi.resource.Wire;
 import org.osgi.resource.Wiring;
 import org.osgi.service.resolver.ResolutionException;
+import org.osgi.service.resolver.ResolveContext;
 import org.osgi.service.resolver.Resolver;
 
 public class ResolverTest
@@ -860,101 +860,56 @@ public class ResolverTest
     @Test
     public void testScenario17_1() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(false, false, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(false, false, false);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(
-            Collections.<Resource, Wiring> emptyMap(), candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
     @Test
     public void testScenario17_2() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(false, false, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(false, false, true);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(wirings, candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
     @Test
     public void testScenario17_3() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(true, false, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(true, false, false);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(
-            Collections.<Resource, Wiring> emptyMap(), candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
     @Test
     public void testScenario17_4() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(true, false, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(true, false, true);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(wirings, candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
     @Test
     public void testScenario17_5() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(false, true, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(false, true, true);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(wirings, candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
     @Test
     public void testScenario17_6() throws Exception
     {
-        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
-        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
-        Map<String, Resource> resources = new HashMap<String, Resource>();
-        populateScenario17(true, true, wirings, candMap, resources);
+        ResolveContext rci = populateScenario17(true, true, true);
         ResolverImpl resolver = new ResolverImpl(new Logger(Logger.LOG_DEBUG), 1);
-        ResolveContextImpl rci = new ResolveContextImpl(wirings, candMap,
-            Collections.singletonList((Resource) resources.get("requiresMisc")),
-            Collections.<Resource> emptyList());
-
         resolver.resolve(rci);
     }
 
-    private void populateScenario17(boolean realSubstitute, boolean felixWiring,
-        Map<Resource, Wiring> wirings,
-        Map<Requirement, List<Capability>> candMap, Map<String, Resource> resources)
+    private ResolveContext populateScenario17(boolean realSubstitute,
+        boolean felixResolveContext, boolean existingWirings)
     {
+        Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, List<Capability>>();
         ResourceImpl core = new ResourceImpl("core");
-        resources.put("core", core);
         Capability core_pkgCap = addCap(core, PackageNamespace.PACKAGE_NAMESPACE, "pkg1");
         Capability core_bundleCap = addCap(core, BundleNamespace.BUNDLE_NAMESPACE,
             "core");
@@ -962,7 +917,6 @@ public class ResolverTest
             "pkg1");
 
         ResourceImpl misc = new ResourceImpl("misc");
-        resources.put("misc", misc);
         Capability misc_pkgCap = addCap(misc, PackageNamespace.PACKAGE_NAMESPACE, "pkg1");
         Capability misc_bundleCap = addCap(misc, BundleNamespace.BUNDLE_NAMESPACE,
             "misc");
@@ -970,21 +924,18 @@ public class ResolverTest
             "core");
 
         ResourceImpl importsCore = new ResourceImpl("importsCore");
-        resources.put("ImportsCore", importsCore);
         Capability importsCore_pkgCap = addCap(importsCore,
             PackageNamespace.PACKAGE_NAMESPACE, "pkg2", "pkg1");
         Requirement importsCore_pkgReq = addReq(importsCore,
             PackageNamespace.PACKAGE_NAMESPACE, "pkg1");
 
         ResourceImpl requiresMisc = new ResourceImpl("requiresMisc");
-        resources.put("requiresMisc", requiresMisc);
         Requirement requiresMisc_pkgReq = addReq(requiresMisc,
             PackageNamespace.PACKAGE_NAMESPACE, "pkg2");
         Requirement requiresMisc_bundleReq = addReq(requiresMisc,
             BundleNamespace.BUNDLE_NAMESPACE, "misc");
 
         ResourceImpl substitutesCore = new ResourceImpl("substitutesCore");
-        resources.put("substitutesCore", substitutesCore);
         Capability substitutesCore_pkgCap = addCap(substitutesCore,
             PackageNamespace.PACKAGE_NAMESPACE, "pkg1");
 
@@ -1006,46 +957,46 @@ public class ResolverTest
         wires.put(misc, new ArrayList<Wire>());
         wires.get(misc).add(new SimpleWire(misc_bundleReq, core_bundleCap));
 
-        Map<Resource, List<Wire>> invertedWires = new HashMap<Resource, List<Wire>>();
-        invertedWires.put(substitutesCore, new ArrayList<Wire>());
-        if (realSubstitute)
-        {
-            invertedWires.get(substitutesCore).add(
-                new SimpleWire(core_pkgReq, substitutesCore_pkgCap));
-        }
-        invertedWires.put(core, new ArrayList<Wire>());
-        invertedWires.get(core).add(new SimpleWire(misc_bundleReq, core_bundleCap));
-        invertedWires.put(misc, new ArrayList<Wire>());
-
-        wirings.put(substitutesCore, new SimpleWiring(substitutesCore,
-            Arrays.asList(substitutesCore_pkgCap), wires, invertedWires));
-
-        Wiring coreWiring;
-        if (felixWiring)
+        Wiring coreWiring = null;
+        Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
+        if (existingWirings)
         {
+            Map<Resource, List<Wire>> invertedWires = new HashMap<Resource, List<Wire>>();
+            invertedWires.put(substitutesCore, new ArrayList<Wire>());
             if (realSubstitute)
             {
-                coreWiring = new SimpleFelixWiring(core,
-                    Arrays.asList(core_bundleCap, core_pkgCap), wires, invertedWires,
-                    Arrays.<Wire> asList(
-                        new SimpleWire(core_pkgReq, substitutesCore_pkgCap)));
+                invertedWires.get(substitutesCore).add(
+                    new SimpleWire(core_pkgReq, substitutesCore_pkgCap));
             }
-            else
+            invertedWires.put(core, new ArrayList<Wire>());
+            invertedWires.get(core).add(new SimpleWire(misc_bundleReq, core_bundleCap));
+            invertedWires.put(misc, new ArrayList<Wire>());
+
+            wirings.put(substitutesCore, new SimpleWiring(substitutesCore,
+                Arrays.asList(substitutesCore_pkgCap), wires, invertedWires));
+
+            coreWiring = new SimpleWiring(core,
+                Arrays.asList(core_bundleCap, core_pkgCap), wires, invertedWires);
+            wirings.put(core, coreWiring);
+            wirings.put(misc, new SimpleWiring(misc,
+                Arrays.asList(misc_bundleCap, misc_pkgCap), wires, invertedWires));
+        }
+        Collection<Resource> mandatory = Collections.<Resource> singletonList(requiresMisc);
+        if (felixResolveContext) {
+            Map<Wiring, Collection<Wire>> substitutions = new HashMap<Wiring, Collection<Wire>>();
+            if (realSubstitute && coreWiring != null)
             {
-                coreWiring = new SimpleFelixWiring(core,
-                    Arrays.asList(core_bundleCap, core_pkgCap), wires, invertedWires,
-                    Collections.<Wire> emptyList());
+                substitutions.put(coreWiring, Arrays.<Wire> asList(
+                    new SimpleWire(core_pkgReq, substitutesCore_pkgCap)));
             }
+            return new ResolveContextImpl.FelixResolveContextImpl(wirings, candMap,
+                mandatory, Collections.<Resource> emptyList(), substitutions);
         }
         else
         {
-            coreWiring = new SimpleWiring(core,
-                Arrays.asList(core_bundleCap, core_pkgCap), wires, invertedWires);
+            return new ResolveContextImpl(wirings, candMap, mandatory,
+                Collections.<Resource> emptyList());
         }
-
-        wirings.put(core, coreWiring);
-        wirings.put(misc, new SimpleWiring(misc,
-            Arrays.asList(misc_bundleCap, misc_pkgCap), wires, invertedWires));
     }
 
     private static String getResourceName(Resource r)
@@ -1482,23 +1433,6 @@ public class ResolverTest
         }
     }
 
-    private static class SimpleFelixWiring extends SimpleWiring implements FelixWiring
-    {
-        final Collection<Wire> substitutionWires;
-
-        public SimpleFelixWiring(Resource resource, List<Capability> resourceCapabilities, Map<Resource, List<Wire>> wires, Map<Resource, List<Wire>> invertedWires, Collection<Wire> substitutionWires)
-        {
-            super(resource, resourceCapabilities, wires, invertedWires);
-            this.substitutionWires = substitutionWires;
-        }
-
-        public Collection<Wire> getSubstitutionWires()
-        {
-            return substitutionWires;
-        }
-
-    }
-
     private static class SimpleWiring implements Wiring {
         final Resource resource;
         final Map<Resource, List<Wire>> wires;

Modified: felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/util/ResolveContextImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/util/ResolveContextImpl.java?rev=1782373&r1=1782372&r2=1782373&view=diff
==============================================================================
--- felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/util/ResolveContextImpl.java (original)
+++ felix/trunk/resolver/src/test/java/org/apache/felix/resolver/test/util/ResolveContextImpl.java Thu Feb  9 17:44:03 2017
@@ -20,11 +20,15 @@ package org.apache.felix.resolver.test.u
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+
+import org.apache.felix.resolver.FelixResolveContext;
 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;
@@ -88,4 +92,27 @@ public class ResolveContextImpl extends
     {
         return m_wirings;
     }
+
+    public static class FelixResolveContextImpl extends ResolveContextImpl implements FelixResolveContext
+    {
+        private final Map<Wiring, Collection<Wire>> m_substitutions;
+
+        public FelixResolveContextImpl(Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> candMap, Collection<Resource> mandatory, Collection<Resource> optional, Map<Wiring, Collection<Wire>> substitutions)
+        {
+            super(wirings, candMap, mandatory, optional);
+            this.m_substitutions = substitutions;
+        }
+
+        public Collection<Resource> getOndemandResources(Resource host)
+        {
+            return Collections.emptyList();
+        }
+
+        public Collection<Wire> getSubstitutionWires(Wiring wiring)
+        {
+            Collection<Wire> result = m_substitutions.get(wiring);
+            return result == null ? Collections.<Wire> emptyList() : result;
+        }
+
+    }
 }
\ No newline at end of file