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 2017/10/10 17:21:55 UTC

[1/2] karaf git commit: [KARAF-5395] Various minor improvements

Repository: karaf
Updated Branches:
  refs/heads/master 4188ef858 -> 28415d0a2


[KARAF-5395] Various minor improvements


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

Branch: refs/heads/master
Commit: 495fbd3cb2d01eba87752cc2ec2a1f51a02d05fb
Parents: 4188ef8
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Oct 10 19:21:03 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Oct 10 19:21:03 2017 +0200

----------------------------------------------------------------------
 .../karaf/features/internal/model/Bundle.java   |  5 ++
 .../features/internal/region/Subsystem.java     | 75 ++++++++++++++++----
 .../region/SubsystemResolveContext.java         |  2 +-
 .../internal/resolver/ResourceImpl.java         | 19 ++---
 .../features/internal/util/StringArrayMap.java  | 47 ++++++++++++
 .../org/apache/karaf/tooling/VerifyMojo.java    |  2 +-
 6 files changed, 126 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java b/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
index 9749da1..8afa5ff 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/model/Bundle.java
@@ -178,4 +178,9 @@ public class Bundle implements BundleInfo {
         result = 31 * result + (isDependency() ? 1 : 0);
         return result;
     }
+
+    @Override
+    public String toString() {
+        return value;
+    }
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/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 33b9dae..e55e60d 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
@@ -56,6 +56,7 @@ import org.apache.karaf.features.internal.resolver.ResourceImpl;
 import org.apache.karaf.features.internal.resolver.ResourceUtils;
 import org.apache.karaf.features.internal.resolver.SimpleFilter;
 import org.apache.karaf.features.internal.service.Overrides;
+import org.apache.karaf.features.internal.util.StringArrayMap;
 import org.osgi.framework.BundleException;
 import org.osgi.framework.Version;
 import org.osgi.resource.Capability;
@@ -445,14 +446,15 @@ public class Subsystem extends ResourceImpl {
                 final Conditional cond = entry.getValue();
                 ResourceImpl res = bundles.get(loc);
                 int sl = bi.getStartLevel() <= 0 ? feature.getStartLevel() : bi.getStartLevel();
-                if (bi.isDependency()) {
-                    addDependency(res, false, bi.isStart(), sl);
-                } else {
-                    doAddDependency(res, cond == null, bi.isStart(), sl);
-                }
                 if (cond != null) {
                     addIdentityRequirement(res, resConds.get(cond), true);
                 }
+                boolean mandatory = !bi.isDependency() && cond == null;
+                if (bi.isDependency()) {
+                    addDependency(res, mandatory, bi.isStart(), sl);
+                } else {
+                    doAddDependency(res, mandatory, bi.isStart(), sl);
+                }
             }
             for (Library library : feature.getLibraries()) {
                 if (library.isExport()) {
@@ -497,7 +499,7 @@ public class Subsystem extends ResourceImpl {
         ResourceImpl res = new ResourceImpl();
         for (Capability cap : resource.getCapabilities(null)) {
             res.addCapability(new CapabilityImpl(res, cap.getNamespace(),
-                    new HashMap<>(cap.getDirectives()), new HashMap<>(cap.getAttributes())));
+                    new StringArrayMap<>(cap.getDirectives()), new StringArrayMap<>(cap.getAttributes())));
         }
         for (Requirement req : resource.getRequirements(null)) {
             SimpleFilter sf;
@@ -509,7 +511,7 @@ public class Subsystem extends ResourceImpl {
                 sf = SimpleFilter.convert(req.getAttributes());
             }
             res.addRequirement(new RequirementImpl(res, req.getNamespace(),
-                    new HashMap<>(req.getDirectives()), new HashMap<>(req.getAttributes()), sf));
+                    new StringArrayMap<>(req.getDirectives()), new StringArrayMap<>(req.getAttributes()), sf));
         }
         return res;
     }
@@ -543,15 +545,43 @@ public class Subsystem extends ResourceImpl {
 
     private void doAddDependency(ResourceImpl resource, boolean mandatory, boolean start, int startLevel) {
         String id = ResolverUtil.getSymbolicName(resource) + "|" + ResolverUtil.getVersion(resource);
-        DependencyInfo info = dependencies.computeIfAbsent(id, k -> new DependencyInfo());
-        info.resource = resource;
-        info.mandatory |= mandatory;
-        info.start |= start;
-        if (info.startLevel > 0 && startLevel > 0) {
-            info.startLevel = Math.min(info.startLevel, startLevel);
+        DependencyInfo info = new DependencyInfo(resource, mandatory, start, startLevel);
+        dependencies.merge(id, info, this::merge);
+    }
+
+    private DependencyInfo merge(DependencyInfo di1, DependencyInfo di2) {
+        DependencyInfo info = new DependencyInfo();
+        if (di1.resource != di2.resource) {
+            Requirement r1 = getFirstIdentityReq(di1.resource);
+            Requirement r2 = getFirstIdentityReq(di2.resource);
+            if (r1 == null) {
+                info.resource = di1.resource;
+            } else if (r2 == null) {
+                info.resource = di2.resource;
+            } else {
+                String id = ResolverUtil.getSymbolicName(di1.resource) + "/" + ResolverUtil.getVersion(di1.resource);
+                throw new IllegalStateException("Resource " + id + " is duplicated on subsystem " + this.toString() + ". First resource requires " + (r1 != null ? r1 : "nothing") + " while the second requires " + (r2 != null ? r2 : "nothing"));
+            }
+        } else {
+            info.resource = di1.resource;
+        }
+        info.mandatory = di1.mandatory | di2.mandatory;
+        info.start = di1.start | di2.start;
+        if (di1.startLevel > 0 && di2.startLevel > 0) {
+            info.startLevel = Math.min(di1.startLevel, di2.startLevel);
         } else {
-            info.startLevel = Math.max(info.startLevel, startLevel);
+            info.startLevel = Math.max(di1.startLevel, di2.startLevel);
         }
+        return info;
+    }
+
+    private RequirementImpl getFirstIdentityReq(ResourceImpl resource) {
+        for (Requirement r : resource.getRequirements(null)) {
+            if (IDENTITY_NAMESPACE.equals(r.getNamespace())) {
+                return (RequirementImpl) r;
+            }
+        }
+        return null;
     }
 
     class DependencyInfo implements BundleInfo {
@@ -560,6 +590,16 @@ public class Subsystem extends ResourceImpl {
         boolean start;
         int startLevel;
 
+        public DependencyInfo() {
+        }
+
+        public DependencyInfo(ResourceImpl resource, boolean mandatory, boolean start, int startLevel) {
+            this.resource = resource;
+            this.mandatory = mandatory;
+            this.start = start;
+            this.startLevel = startLevel;
+        }
+
         @Override
         public boolean isStart() {
             return start;
@@ -579,6 +619,13 @@ public class Subsystem extends ResourceImpl {
         public boolean isDependency() {
             return !mandatory;
         }
+
+        @Override
+        public String toString() {
+            return "DependencyInfo{" +
+                    "resource=" + resource +
+                    '}';
+        }
     }
 
     Map<String, Set<String>> createPolicy(List<? extends ScopeFilter> filters) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/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 59e334c..c162b81 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
@@ -247,7 +247,7 @@ public class SubsystemResolveContext extends ResolveContext {
                 caps.removeIf(cap -> !providers.contains(cap.getResource()));
             }
             // Sort caps
-            if (distance != null) {
+            if (distance != null && caps.size() > 1) {
                 caps.sort(candidateComparator);
             }
         }

http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
index 0d85843..892cfc7 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceImpl.java
@@ -17,6 +17,7 @@
 package org.apache.karaf.features.internal.resolver;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
@@ -39,12 +40,12 @@ public class ResourceImpl implements Resource {
      * has the required identity capability
      */
     public ResourceImpl() {
-        caps = new ArrayList<>();
-        reqs = new ArrayList<>();
+        caps = new ArrayList<>(0);
+        reqs = new ArrayList<>(0);
     }
 
     public ResourceImpl(String name, String type, Version version) {
-        caps = new ArrayList<>();
+        caps = new ArrayList<>(1);
         Map<String, String> dirs = new StringArrayMap<>(0);
         Map<String, Object> attrs = new StringArrayMap<>(3);
         attrs.put(IdentityNamespace.IDENTITY_NAMESPACE, name);
@@ -52,7 +53,7 @@ public class ResourceImpl implements Resource {
         attrs.put(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE, version);
         CapabilityImpl identity = new CapabilityImpl(this, IdentityNamespace.IDENTITY_NAMESPACE, dirs, attrs);
         caps.add(identity);
-        reqs = new ArrayList<>();
+        reqs = new ArrayList<>(0);
     }
 
     public void addCapability(Capability capability) {
@@ -60,10 +61,11 @@ public class ResourceImpl implements Resource {
         caps.add(capability);
     }
 
-    public void addCapabilities(Iterable<? extends Capability> capabilities) {
+    public void addCapabilities(Collection<? extends Capability> capabilities) {
         for (Capability cap : capabilities) {
-            addCapability(cap);
+            assert cap.getResource() == this;
         }
+        caps.addAll(capabilities);
     }
 
     public void addRequirement(Requirement requirement) {
@@ -71,10 +73,11 @@ public class ResourceImpl implements Resource {
         reqs.add(requirement);
     }
 
-    public void addRequirements(Iterable<? extends Requirement> requirements) {
+    public void addRequirements(Collection<? extends Requirement> requirements) {
         for (Requirement req : requirements) {
-            addRequirement(req);
+            assert req.getResource() == this;
         }
+        reqs.addAll(requirements);
     }
 
     public List<Capability> getCapabilities(String namespace) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java b/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
index d05b7a2..e343bc4 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/util/StringArrayMap.java
@@ -279,4 +279,51 @@ public class StringArrayMap<V> implements Map<String, V> {
         Arrays.fill(table, null);
     }
 
+    public int hashCode() {
+        return Objects.hash(table, size);
+    }
+
+    public boolean equals(Object o) {
+        if (o == this)
+            return true;
+        if (!(o instanceof Map))
+            return false;
+        Map<?,?> m = (Map<?,?>) o;
+        if (m.size() != size())
+            return false;
+        try {
+            for (int i = 0, l = size * 2; i < l; i += 2) {
+                Object key = table[i];
+                Object value = table[i+1];
+                if (value == null) {
+                    if (!(m.get(key)==null && m.containsKey(key)))
+                        return false;
+                } else {
+                    if (!value.equals(m.get(key)))
+                        return false;
+                }
+            }
+        } catch (ClassCastException | NullPointerException unused) {
+            return false;
+        }
+        return true;
+    }
+
+    public String toString() {
+        if (size == 0)
+            return "{}";
+
+        StringBuilder sb = new StringBuilder();
+        sb.append('{');
+        for (int i = 0, l = size * 2; i < l; i += 2) {
+            if (i > 0) {
+                sb.append(',').append(' ');
+            }
+            sb.append(table[i]);
+            sb.append('=');
+            sb.append(table[i+1] == this ? "(this Map)" : table[i+1]);
+        }
+        return sb.append('}').toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/495fbd3c/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
----------------------------------------------------------------------
diff --git a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
index 3d008c9..2ff0a53 100644
--- a/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
+++ b/tooling/karaf-maven-plugin/src/main/java/org/apache/karaf/tooling/VerifyMojo.java
@@ -496,7 +496,7 @@ public class VerifyMojo extends MojoSupport {
                 // TODO: find unused resources ?
             } catch (Exception e) {
                 throw new MojoExecutionException("Feature resolution failed for " + features
-                        + "\nMessage: " + e.getMessage()
+                        + "\nMessage: " + (e instanceof ResolutionException ? e.getMessage() : e.toString())
                         + "\nRepositories: " + toString(new TreeSet<>(repositories.keySet()))
                         + "\nResources: " + toString(new TreeSet<>(manager.getProviders().keySet())), e);
             }


[2/2] karaf git commit: [KARAF-5371] Use a defaut region to avoid having bundles not included in any region

Posted by gn...@apache.org.
[KARAF-5371] Use a defaut region to avoid having bundles not included in any region


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

Branch: refs/heads/master
Commit: 28415d0a2e10e6823ba0cef020277d712d7cb5b1
Parents: 495fbd3
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Oct 10 19:21:42 2017 +0200
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Oct 10 19:21:42 2017 +0200

----------------------------------------------------------------------
 .../org/apache/karaf/features/internal/region/DigraphHelper.java    | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/28415d0a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
index 265fb94..5897415 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/DigraphHelper.java
@@ -176,6 +176,7 @@ public final class DigraphHelper {
         if (defaultRegion == null) {
             defaultRegion = dg.createRegion(FeaturesServiceImpl.ROOT_REGION);
         }
+        dg.setDefaultRegion(defaultRegion);
         // Add all unknown bundle to default region
         Set<Long> ids = new HashSet<>();
         for (Bundle bundle : bundleContext.getBundles()) {