You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2015/06/22 22:22:34 UTC

[2/4] karaf git commit: Fix for pax-web / webconsole problem

Fix for pax-web / webconsole problem

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/944bad9e
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/944bad9e
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/944bad9e

Branch: refs/heads/master
Commit: 944bad9ec4dc01b8f254b508617dc452d35fea23
Parents: 4c3370c
Author: Guillaume Nodet <gn...@Guillaumes-MacBook-Pro.local>
Authored: Mon Jun 22 22:19:06 2015 +0200
Committer: Guillaume Nodet <gn...@Guillaumes-MacBook-Pro.local>
Committed: Mon Jun 22 22:19:06 2015 +0200

----------------------------------------------------------------------
 .../features/internal/region/Subsystem.java     | 19 +++---
 .../region/SubsystemResolveContext.java         | 61 +++++++++++++++++---
 2 files changed, 65 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/944bad9e/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
index 71a22d3..75e497a 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/Subsystem.java
@@ -32,6 +32,7 @@ import java.util.jar.Manifest;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import org.apache.felix.resolver.Util;
 import org.apache.felix.utils.manifest.Clause;
 import org.apache.felix.utils.manifest.Parser;
 import org.apache.felix.utils.version.VersionRange;
@@ -95,6 +96,7 @@ public class Subsystem extends ResourceImpl {
     private final boolean acceptDependencies;
     private final Subsystem parent;
     private final Feature feature;
+    private final boolean mandatory;
     private final List<Subsystem> children = new ArrayList<>();
     private final Map<String, Set<String>> importPolicy;
     private final Map<String, Set<String>> exportPolicy;
@@ -112,14 +114,16 @@ public class Subsystem extends ResourceImpl {
         this.feature = null;
         this.importPolicy = SHARE_NONE_POLICY;
         this.exportPolicy = SHARE_NONE_POLICY;
+        this.mandatory = true;
     }
 
-    public Subsystem(String name, Feature feature, Subsystem parent) {
+    public Subsystem(String name, Feature feature, Subsystem parent, boolean mandatory) {
         super(name, TYPE_SUBSYSTEM, Version.emptyVersion);
         this.name = name;
         this.parent = parent;
         this.acceptDependencies = feature.getScoping() != null && feature.getScoping().acceptDependencies();
         this.feature = feature;
+        this.mandatory = mandatory;
         if (feature.getScoping() != null) {
             this.importPolicy = createPolicy(feature.getScoping().getImports());
             this.importPolicy.put(IDENTITY_NAMESPACE, Collections.singleton(SUBSYSTEM_OR_FEATURE_FILTER));
@@ -136,12 +140,13 @@ public class Subsystem extends ResourceImpl {
                 new VersionRange(VersionTable.getVersion(feature.getVersion()), true));
     }
 
-    public Subsystem(String name, Subsystem parent, boolean acceptDependencies) {
+    public Subsystem(String name, Subsystem parent, boolean acceptDependencies, boolean mandatory) {
         super(name, TYPE_SUBSYSTEM, Version.emptyVersion);
         this.name = name;
         this.parent = parent;
         this.acceptDependencies = acceptDependencies;
         this.feature = null;
+        this.mandatory = mandatory;
         this.importPolicy = SHARE_ALL_POLICY;
         this.exportPolicy = SHARE_NONE_POLICY;
     }
@@ -193,7 +198,7 @@ public class Subsystem extends ResourceImpl {
         }
         // Create subsystem
         String childName = getName() + "/" + name;
-        Subsystem as = new Subsystem(childName, this, acceptDependencies);
+        Subsystem as = new Subsystem(childName, this, acceptDependencies, true);
         children.add(as);
         // Add a requirement to force its resolution
         ResourceUtils.addIdentityRequirement(this, childName, TYPE_SUBSYSTEM, (VersionRange) null);
@@ -211,7 +216,7 @@ public class Subsystem extends ResourceImpl {
             ResourceUtils.addIdentityRequirement(this, name, TYPE_FEATURE, range);
         } else {
             ResourceImpl res = new ResourceImpl();
-            ResourceUtils.addIdentityRequirement(res, name, TYPE_FEATURE, range);
+            ResourceUtils.addIdentityRequirement(res, name, TYPE_FEATURE, range, false);
             dependentFeatures.addAll(res.getRequirements(null));
         }
     }
@@ -272,14 +277,14 @@ public class Subsystem extends ResourceImpl {
                 while (!ss.isAcceptDependencies()) {
                     ss = ss.getParent();
                 }
-                ss.requireFeature(dep.getName(), dep.getVersion(), mandatory && !dep.isDependency());
+                ss.requireFeature(dep.getName(), dep.getVersion(), this.mandatory && (mandatory && !dep.isDependency()));
             }
             for (Conditional cond : feature.getConditional()) {
                 Feature fcond = cond.asFeature();
                 String ssName = this.name + "#" + (fcond.hasVersion() ? fcond.getName() + "-" + fcond.getVersion() : fcond.getName());
                 Subsystem fs = getChild(ssName);
                 if (fs == null) {
-                    fs = new Subsystem(ssName, fcond, this);
+                    fs = new Subsystem(ssName, fcond, this, true);
                     fs.doBuild(features, false);
                     installable.add(fs);
                     children.add(fs);
@@ -306,7 +311,7 @@ public class Subsystem extends ResourceImpl {
                                 String ssName = this.name + "#" + (feature.hasVersion() ? feature.getName() + "-" + feature.getVersion() : feature.getName());
                                 Subsystem fs = getChild(ssName);
                                 if (fs == null) {
-                                    fs = new Subsystem(ssName, feature, this);
+                                    fs = new Subsystem(ssName, feature, this, mandatory && !SubsystemResolveContext.isOptional(requirement));
                                     fs.build(features);
                                     installable.add(fs);
                                     children.add(fs);

http://git-wip-us.apache.org/repos/asf/karaf/blob/944bad9e/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
index 104fb24..1ed9ef5 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
@@ -86,7 +86,7 @@ public class SubsystemResolveContext extends ResolveContext {
         // Add a heuristic to sort capabilities :
         //  if a capability comes from a resource which needs to be installed,
         //  prefer that one over any capabilities from other resources
-        findMandatory(root);
+        findMandatory();
     }
     
     public static void setIgnoreServiceReqs(boolean ignoreServiceReqs) {
@@ -101,18 +101,63 @@ public class SubsystemResolveContext extends ResolveContext {
         return globalRepository;
     }
 
-    void findMandatory(Resource res) {
-        if (mandatory.add(res)) {
-            for (Requirement req : res.getRequirements(null)) {
-                String resolution = req.getDirectives().get(REQUIREMENT_RESOLUTION_DIRECTIVE);
-                if (!RESOLUTION_OPTIONAL.equals(resolution)) {
+    void findMandatory() {
+        mandatory.add(root);
+        int nbMandatory;
+        // Iterate while we find more mandatory resources
+        do {
+            nbMandatory = mandatory.size();
+            for (Resource res : new ArrayList<>(mandatory)) {
+                // Check mandatory requirements of mandatory resources
+                for (Requirement req : res.getRequirements(null)) {
+                    if (isOptional(req)) {
+                        continue;
+                    }
                     List<Capability> caps = findProviders(req);
+                    // If there's a single provider for any kind of mandatory requirement,
+                    // this means the resource is also mandatory
                     if (caps.size() == 1) {
-                        findMandatory(caps.get(0).getResource());
+                        mandatory.add(caps.get(0).getResource());
+                    } else {
+                        // In case there are multiple providers
+                        // check if there is a single provider which has
+                        // a mandatory identity requirement on a mandatory
+                        // resource, in which case we also assume this one
+                        // is mandatory
+                        Set<Resource> mand = new HashSet<>();
+                        for (Capability cap : caps) {
+                            Resource r = cap.getResource();
+                            if (mandatory.contains(r)) {
+                                mand.add(r);
+                            } else {
+                                for (Requirement req2 : r.getRequirements(null)) {
+                                    if (!IDENTITY_NAMESPACE.equals(req2.getNamespace()) || !isOptional(req2)) {
+                                        continue;
+                                    }
+                                    List<Capability> caps2 = findProviders(req2);
+                                    if (caps2.size() == 1) {
+                                        Resource r2 =  caps2.get(0).getResource();
+                                        if (mandatory.contains(r2)) {
+                                            mand.add(r);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        if (mand.size() == 1) {
+                            mandatory.add(mand.iterator().next());
+                        } else {
+                            mand.clear();
+                        }
                     }
                 }
             }
-        }
+        } while (mandatory.size() != nbMandatory);
+    }
+
+    static boolean isOptional(Requirement req) {
+        String resolution = req.getDirectives().get(REQUIREMENT_RESOLUTION_DIRECTIVE);
+        return RESOLUTION_OPTIONAL.equalsIgnoreCase(resolution);
     }
 
     void prepare(Subsystem subsystem) {