Author: jwross
Date: Tue Apr 26 14:56:14 2016
New Revision: 1741050

URL: http://svn.apache.org/viewvc?rev=1741050&view=rev
Log:
[ARIES-1538] Never fail a subsystem resolution because an already resolved 
resource has a missing dependency.

When processing substitutable exports, the resource capabilities of host 
bundles must be inspected when the requirement resource is a fragment.

Modified:
    
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java

Modified: 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
URL: 
http://svn.apache.org/viewvc/aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java?rev=1741050&r1=1741049&r2=1741050&view=diff
==============================================================================
--- 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
 (original)
+++ 
aries/trunk/subsystem/subsystem-core/src/main/java/org/apache/aries/subsystem/core/internal/ResolveContext.java
 Tue Apr 26 14:56:14 2016
@@ -154,26 +154,44 @@ public class ResolveContext extends org.
                processWires(wires, requirement, capabilities);
        }
        
-       private void processAsSubstitutableExport(Requirement requirement, 
List<Capability> capabilities) {
+       private void processAsSubstitutableExport(boolean isFragment, 
Requirement requirement, List<Capability> capabilities) {
                String namespace = requirement.getNamespace();
                if (!PackageNamespace.PACKAGE_NAMESPACE.equals(namespace)) {
                        return;
                }
                Resource resource = requirement.getResource();
                Wiring wiring = wirings.get(resource);
-               List<Capability> resourceCapabilities = 
wiring.getResourceCapabilities(namespace);
-               processResourceCapabilities(resourceCapabilities, requirement, 
capabilities);
+               if (isFragment) {
+                       List<Wire> fragmentWires = 
wiring.getRequiredResourceWires(HostNamespace.HOST_NAMESPACE);
+                       for (Wire fragmentWire : fragmentWires) {
+                               Resource host = fragmentWire.getProvider();
+                               processResourceCapabilities(
+                                               
wirings.get(host).getResourceCapabilities(namespace),
+                                               requirement,
+                                               capabilities);
+                       }
+               }
+               else {
+                       List<Capability> resourceCapabilities = 
wiring.getResourceCapabilities(namespace);
+                       processResourceCapabilities(resourceCapabilities, 
requirement, capabilities);
+               }
        }
        
        private void processAlreadyResolvedResource(Resource resource, 
Requirement requirement, List<Capability> capabilities) {
-               if (isProcessableAsFragment(requirement)) {
+               boolean isFragment = isProcessableAsFragment(requirement);
+               if (isFragment) {
                        processAsFragment(requirement, capabilities);
                }
                else {
                        processAsBundle(requirement, capabilities);
                }
                if (capabilities.isEmpty() && Utils.isMandatory(requirement)) {
-                       processAsSubstitutableExport(requirement, capabilities);
+                       processAsSubstitutableExport(isFragment, requirement, 
capabilities);
+                       if (capabilities.isEmpty()) {
+                               // ARIES-1538. Do not fail subsystem resolution 
if an already
+                               // resolved resource has a missing dependency.
+                               capabilities.add(new 
MissingCapability(requirement));
+                       }
                }
        }
        


Reply via email to