Author: rickhall
Date: Mon Mar  4 21:28:55 2013
New Revision: 1452535

URL: http://svn.apache.org/r1452535
Log:
Apply patch (FELIX-3934) to special case fragment identity requirements
wires.

Modified:
    
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
    
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/IdentityCapability.java
    felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/Main.java
    
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/ResourceImpl.java

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=1452535&r1=1452534&r2=1452535&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 
Mon Mar  4 21:28:55 2013
@@ -29,9 +29,11 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.StringTokenizer;
+
 import org.osgi.framework.namespace.BundleNamespace;
 import org.osgi.framework.namespace.ExecutionEnvironmentNamespace;
 import org.osgi.framework.namespace.HostNamespace;
+import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Namespace;
@@ -1725,11 +1727,28 @@ public class ResolverImpl implements Res
                         if (!cand.getNamespace().startsWith("osgi.wiring.")
                             || !resource.equals(cand.getResource()))
                         {
+                            // If we don't already have wires for the 
candidate,
+                            // then recursively populate them.
                             if 
(!rc.getWirings().containsKey(cand.getResource()))
                             {
-                                populateWireMap(rc, cand.getResource(),
+                                // Need to special case the candidate for 
identity
+                                // capabilities since it may be from a 
fragment and
+                                // we don't want to populate wires for the 
fragment,
+                                // but rather the host to which it is attached.
+                                Resource targetCand = cand.getResource();
+                                if 
(IdentityNamespace.IDENTITY_NAMESPACE.equals(cand.getNamespace())
+                                    && Util.isFragment(targetCand))
+                                {
+                                    targetCand = allCandidates.getCandidates(
+                                        
targetCand.getRequirements(HostNamespace.HOST_NAMESPACE).get(0))
+                                            .iterator().next().getResource();
+                                    targetCand = 
allCandidates.getWrappedHost(targetCand);
+                                }
+
+                                populateWireMap(rc, targetCand,
                                     resourcePkgMap, wireMap, allCandidates);
                             }
+
                             Wire wire = new WireImpl(
                                 unwrappedResource,
                                 getDeclaredRequirement(req),

Modified: 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/IdentityCapability.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/IdentityCapability.java?rev=1452535&r1=1452534&r2=1452535&view=diff
==============================================================================
--- 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/IdentityCapability.java
 (original)
+++ 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/IdentityCapability.java
 Mon Mar  4 21:28:55 2013
@@ -20,6 +20,7 @@ package org.apache.felix.resolver.test;
 
 import java.util.HashMap;
 import java.util.Map;
+
 import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Resource;
@@ -30,12 +31,13 @@ class IdentityCapability implements Capa
     private final Map<String, String> m_dirs;
     private final Map<String, Object> m_attrs;
 
-    public IdentityCapability(Resource resource, String name)
+    public IdentityCapability(Resource resource, String name, String type)
     {
         m_resource = resource;
         m_dirs = new HashMap<String, String>();
         m_attrs = new HashMap<String, Object>();
         m_attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, name);
+        m_attrs.put(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE, type);
     }
 
     public String getNamespace()

Modified: 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/Main.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/Main.java?rev=1452535&r1=1452534&r2=1452535&view=diff
==============================================================================
--- felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/Main.java 
(original)
+++ felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/Main.java 
Mon Mar  4 21:28:55 2013
@@ -24,9 +24,12 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.felix.resolver.Logger;
 import org.apache.felix.resolver.ResolverImpl;
 import org.osgi.framework.namespace.BundleNamespace;
+import org.osgi.framework.namespace.HostNamespace;
+import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.resource.Capability;
 import org.osgi.resource.Namespace;
@@ -45,11 +48,14 @@ public class Main
 
         Map<Resource, Wiring> wirings = new HashMap<Resource, Wiring>();
         Map<Requirement, List<Capability>> candMap = new HashMap<Requirement, 
List<Capability>>();
+        List<Resource> mandatory;
+        ResolveContextImpl rci;
+        Map<Resource, List<Wire>> wireMap;
 
         System.out.println("\nSCENARIO 1\n");
-        List<Resource> mandatory = populateScenario1(wirings, candMap);
-        ResolveContextImpl rci = new ResolveContextImpl(wirings, candMap, 
mandatory, Collections.EMPTY_LIST);
-        Map<Resource, List<Wire>> wireMap = resolver.resolve(rci);
+        mandatory = populateScenario1(wirings, candMap);
+        rci = new ResolveContextImpl(wirings, candMap, mandatory, 
Collections.EMPTY_LIST);
+        wireMap = resolver.resolve(rci);
         System.out.println("RESULT " + wireMap);
 
         System.out.println("\nSCENARIO 2\n");
@@ -98,6 +104,11 @@ public class Main
         wireMap = resolver.resolve(rci);
         System.out.println("RESULT " + wireMap);
 
+        System.out.println("\nSCENARIO 7\n");
+        mandatory = populateScenario7(wirings, candMap);
+        rci = new ResolveContextImpl(wirings, candMap, mandatory, 
Collections.EMPTY_LIST);
+        wireMap = resolver.resolve(rci);
+        System.out.println("RESULT " + wireMap);
     }
 
     private static List<Resource> populateScenario1(
@@ -399,4 +410,47 @@ public class Main
         resources.add(a2);
         return resources;
     }
+
+    private static List<Resource> populateScenario7(
+            Map<Resource, Wiring> wirings, Map<Requirement, List<Capability>> 
candMap)
+    {
+        wirings.clear();
+        candMap.clear();
+
+        ResourceImpl a1 = new ResourceImpl("A");
+        GenericCapability a1_hostCap = new GenericCapability(a1, 
HostNamespace.HOST_NAMESPACE);
+        a1_hostCap.addAttribute(HostNamespace.HOST_NAMESPACE, "A");
+        a1.addCapability(a1_hostCap);
+
+        ResourceImpl f1 = new ResourceImpl("F1", 
IdentityNamespace.TYPE_FRAGMENT);
+        GenericRequirement f1_hostReq = new GenericRequirement(f1, 
HostNamespace.HOST_NAMESPACE);
+        f1_hostReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(" + 
HostNamespace.HOST_NAMESPACE + "=A)");
+        f1.addRequirement(f1_hostReq);
+
+        ResourceImpl f2 = new ResourceImpl("F2", 
IdentityNamespace.TYPE_FRAGMENT);
+        GenericRequirement f2_hostReq = new GenericRequirement(f2, 
HostNamespace.HOST_NAMESPACE);
+        f2_hostReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, "(" + 
HostNamespace.HOST_NAMESPACE + "=A)");
+        f2.addRequirement(f2_hostReq);
+
+        ResourceImpl b1 = new ResourceImpl("B");
+        GenericRequirement b1_identityReq = new GenericRequirement(f2, 
IdentityNamespace.IDENTITY_NAMESPACE);
+        b1_identityReq.addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, 
"(" + IdentityNamespace.IDENTITY_NAMESPACE + "=F2)");
+        b1.addRequirement(b1_identityReq);
+
+        candMap.put(
+            f1.getRequirements(null).get(0),
+            a1.getCapabilities(HostNamespace.HOST_NAMESPACE));
+        candMap.put(
+            f2.getRequirements(null).get(0),
+            a1.getCapabilities(HostNamespace.HOST_NAMESPACE));
+        candMap.put(
+            b1.getRequirements(null).get(0),
+            f2.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE));
+        List<Resource> resources = new ArrayList<Resource>();
+        resources.add(a1);
+        resources.add(f1);
+        resources.add(f2);
+        resources.add(b1);
+        return resources;
+    }
 }
\ No newline at end of file

Modified: 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/ResourceImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/ResourceImpl.java?rev=1452535&r1=1452534&r2=1452535&view=diff
==============================================================================
--- 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/ResourceImpl.java
 (original)
+++ 
felix/trunk/resolver/src/main/java/org/apache/felix/resolver/test/ResourceImpl.java
 Mon Mar  4 21:28:55 2013
@@ -30,10 +30,13 @@ public class ResourceImpl implements Res
     private final List<Capability> m_caps;
     private final List<Requirement> m_reqs;
 
-    public ResourceImpl(String name)
+    public ResourceImpl(String name) {
+        this(name, IdentityNamespace.TYPE_BUNDLE);
+    }
+    public ResourceImpl(String name, String type)
     {
         m_caps = new ArrayList<Capability>();
-        m_caps.add(0, new IdentityCapability(this, name));
+        m_caps.add(0, new IdentityCapability(this, name, type));
         m_reqs = new ArrayList<Requirement>();
     }
 


Reply via email to