This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.commons.osgi-2.0.6
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-osgi.git

commit 01b2201aaf2cc33c7c63e8295dc4e3a706ed0fa6
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Tue Mar 9 18:00:50 2010 +0000

    SLING-1431 : Utility method to get the service ranking
    
    git-svn-id: 
https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/osgi@921017 
13f79535-47bb-0310-9956-ffa450edef68
---
 .../org/apache/sling/commons/osgi/OsgiUtil.java    | 72 +++++++++++++++-------
 .../apache/sling/commons/osgi/OsgiUtilTest.java    | 24 ++++++--
 2 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/src/main/java/org/apache/sling/commons/osgi/OsgiUtil.java 
b/src/main/java/org/apache/sling/commons/osgi/OsgiUtil.java
index d95c82f..0216457 100644
--- a/src/main/java/org/apache/sling/commons/osgi/OsgiUtil.java
+++ b/src/main/java/org/apache/sling/commons/osgi/OsgiUtil.java
@@ -292,30 +292,58 @@ public class OsgiUtil {
     }
 
     /**
-     * Return the service ranking
-     * @param props A property map
-     * @return The service ranking.
+     * Create a comparable object out of the service properties. With the 
result
+     * it is possible to compare service properties based on the service 
ranking
+     * of a service. Therefore this object acts like {@link 
ServiceReference#compareTo(Object)}.
+     * @param props The service properties.
+     * @return A comparable for the ranking of the service
      * @since 2.0.6
      */
-    public static int getServiceRanking(final Map<String, Object> props) {
-        int ranking = 0;
-        if ( props != null && props.get(Constants.SERVICE_RANKING) instanceof 
Integer) {
-            ranking = (Integer)props.get(Constants.SERVICE_RANKING);
-        }
-        return ranking;
-    }
+    public static Comparable<Object> getComparableForServiceRanking(final 
Map<String, Object> props) {
 
-    /**
-     * Return the service ranking
-     * @param ref The service reference.
-     * @return The service ranking.
-     * @since 2.0.6
-     */
-    public static int getServiceRanking(final ServiceReference ref) {
-        int ranking = 0;
-        if ( ref.getProperty(Constants.SERVICE_RANKING) instanceof Integer) {
-            ranking = (Integer)ref.getProperty(Constants.SERVICE_RANKING);
-        }
-        return ranking;
+        return new Comparable<Object>() {
+
+            @SuppressWarnings("unchecked")
+            public int compareTo(Object reference) {
+                final Long otherId;
+                Object otherRankObj;
+                if ( reference instanceof ServiceReference ) {
+                    final ServiceReference other = (ServiceReference) 
reference;
+                    otherId = (Long) other.getProperty(Constants.SERVICE_ID);
+                    otherRankObj = 
other.getProperty(Constants.SERVICE_RANKING);
+                } else {
+                    final Map<String, Object> otherProps = (Map<String, 
Object>)reference;
+                    otherId = (Long) otherProps.get(Constants.SERVICE_ID);
+                    otherRankObj = otherProps.get(Constants.SERVICE_RANKING);
+                }
+                final Long id = (Long) props.get(Constants.SERVICE_ID);
+                if (id.equals(otherId)) {
+                    return 0; // same service
+                }
+
+                Object rankObj = props.get(Constants.SERVICE_RANKING);
+
+                // If no rank, then spec says it defaults to zero.
+                rankObj = (rankObj == null) ? new Integer(0) : rankObj;
+                otherRankObj = (otherRankObj == null) ? new Integer(0) : 
otherRankObj;
+
+                // If rank is not Integer, then spec says it defaults to zero.
+                Integer rank = (rankObj instanceof Integer)
+                    ? (Integer) rankObj : new Integer(0);
+                Integer otherRank = (otherRankObj instanceof Integer)
+                    ? (Integer) otherRankObj : new Integer(0);
+
+                // Sort by rank in ascending order.
+                if (rank.compareTo(otherRank) < 0) {
+                    return -1; // lower rank
+                } else if (rank.compareTo(otherRank) > 0) {
+                    return 1; // higher rank
+                }
+
+                // If ranks are equal, then sort by service id in descending 
order.
+                return (id.compareTo(otherId) < 0) ? 1 : -1;
+            }
+        };
     }
+
 }
diff --git a/src/test/java/org/apache/sling/commons/osgi/OsgiUtilTest.java 
b/src/test/java/org/apache/sling/commons/osgi/OsgiUtilTest.java
index d1aa341..464b3ba 100644
--- a/src/test/java/org/apache/sling/commons/osgi/OsgiUtilTest.java
+++ b/src/test/java/org/apache/sling/commons/osgi/OsgiUtilTest.java
@@ -19,7 +19,6 @@
 package org.apache.sling.commons.osgi;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -134,10 +133,23 @@ public class OsgiUtilTest extends TestCase {
     }
 
     public void testRanking() {
-        assertEquals(0, OsgiUtil.getServiceRanking((Map<String, Object>)null));
-        final Map<String, Object> stringMap = 
Collections.singletonMap(Constants.SERVICE_RANKING, (Object)"1");
-        assertEquals(0, OsgiUtil.getServiceRanking(stringMap));
-        final Map<String, Object> intMap = 
Collections.singletonMap(Constants.SERVICE_RANKING, (Object)1);
-        assertEquals(1, OsgiUtil.getServiceRanking(intMap));
+        final Map<String, Object> map1 = new HashMap<String, Object>();
+        map1.put(Constants.SERVICE_ID, 1L);
+        map1.put(Constants.SERVICE_RANKING, 7);
+
+        final Map<String, Object> map2 = new HashMap<String, Object>();
+        map2.put(Constants.SERVICE_ID, 1L);
+        map2.put(Constants.SERVICE_RANKING, 5);
+
+        assertEquals(0, 
OsgiUtil.getComparableForServiceRanking(map1).compareTo(map2));
+        assertEquals(0, 
OsgiUtil.getComparableForServiceRanking(map1).compareTo(map1));
+        assertEquals(0, 
OsgiUtil.getComparableForServiceRanking(map2).compareTo(map2));
+        map2.put(Constants.SERVICE_ID, 2L);
+        assertEquals(1, 
OsgiUtil.getComparableForServiceRanking(map1).compareTo(map2));
+        assertEquals(-1, 
OsgiUtil.getComparableForServiceRanking(map2).compareTo(map1));
+
+        map1.put(Constants.SERVICE_RANKING, "hello");
+        assertEquals(-1, 
OsgiUtil.getComparableForServiceRanking(map1).compareTo(map2));
+        assertEquals(1, 
OsgiUtil.getComparableForServiceRanking(map2).compareTo(map1));
     }
 }

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to