You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2017/03/27 06:30:51 UTC

karaf git commit: [KARAF-4701] Forcing deterministic heuristic of capbillities comparison for Subsystem Resolver

Repository: karaf
Updated Branches:
  refs/heads/karaf-4.0.x 49442c019 -> 12a18ef3b


[KARAF-4701] Forcing deterministic heuristic of capbillities comparison for Subsystem Resolver


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

Branch: refs/heads/karaf-4.0.x
Commit: 12a18ef3b3b8f7993859708f5da9906ef99f925b
Parents: 49442c0
Author: Vladimir Konkov <vk...@citc.ru>
Authored: Fri Mar 24 12:50:23 2017 +0300
Committer: Jean-Baptiste Onofr� <jb...@apache.org>
Committed: Mon Mar 27 08:30:44 2017 +0200

----------------------------------------------------------------------
 .../internal/region/CandidateComparator.java    | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/12a18ef3/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
index a3f6c51..8f53058 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/CandidateComparator.java
@@ -28,6 +28,7 @@ import org.osgi.framework.namespace.IdentityNamespace;
 import org.osgi.framework.namespace.PackageNamespace;
 import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.resource.Capability;
+import org.osgi.resource.Requirement;
 import org.osgi.resource.Resource;
 
 public class CandidateComparator implements Comparator<Capability> {
@@ -79,9 +80,24 @@ public class CandidateComparator implements Comparator<Capability> {
         }
         if (c == 0) {
             // We just want to have a deterministic heuristic
-            String n1 = ResolverUtil.getSymbolicName(cap1.getResource());
-            String n2 = ResolverUtil.getSymbolicName(cap2.getResource());
+            final Resource resource1 = cap1.getResource();
+            final Resource resource2 = cap2.getResource();
+            String n1 = ResolverUtil.getSymbolicName(resource1);
+            String n2 = ResolverUtil.getSymbolicName(resource2);
             c = n1.compareTo(n2);
+            // Resources looks like identical, but it required by different features/subsystems/regions
+            // so use this difference for deterministic heuristic
+            if (c == 0) {
+                final List<Requirement> reqs1 = resource1.getRequirements(IdentityNamespace.IDENTITY_NAMESPACE);
+                final List<Requirement> reqs2 = resource2.getRequirements(IdentityNamespace.IDENTITY_NAMESPACE);
+                if (!reqs1.isEmpty() && !reqs2.isEmpty()) {
+                    Requirement identityReq1 = reqs1.get(0);
+                    Requirement identityReq2 = reqs2.get(0);
+                    Object identity1 = identityReq1.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE);
+                    Object identity2 = identityReq2.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE);
+                    c = String.valueOf(identity1).compareTo(String.valueOf(identity2));
+                }
+            }
         }
         return c;
     }