You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gn...@apache.org on 2009/04/29 13:57:43 UTC

svn commit: r769763 - /geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java

Author: gnodet
Date: Wed Apr 29 11:57:42 2009
New Revision: 769763

URL: http://svn.apache.org/viewvc?rev=769763&view=rev
Log:
Fix reference tracking to be able to run correctly on equinox

Modified:
    geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java

Modified: geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java
URL: http://svn.apache.org/viewvc/geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java?rev=769763&r1=769762&r2=769763&view=diff
==============================================================================
--- geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java (original)
+++ geronimo/sandbox/blueprint/blueprint-core/src/main/java/org/apache/geronimo/blueprint/context/UnaryServiceReferenceRecipe.java Wed Apr 29 11:57:42 2009
@@ -31,6 +31,7 @@
 import org.apache.xbean.recipe.Recipe;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.Constants;
 import org.osgi.service.blueprint.context.BlueprintContext;
 import org.osgi.service.blueprint.context.ServiceUnavailableException;
 import org.osgi.service.blueprint.reflect.ReferenceMetadata;
@@ -102,35 +103,63 @@
     }
 
     private ServiceReference getBestServiceReference(ServiceReference[] references) {
-        if (references == null || references.length == 0) {
+        int length = (references == null) ? 0 : references.length;
+        if (length == 0) { /* if no service is being tracked */
             return null;
         }
-        return Collections.max(Arrays.asList(references));
+        int index = 0;
+        if (length > 1) { /* if more than one service, select highest ranking */
+            int rankings[] = new int[length];
+            int count = 0;
+            int maxRanking = Integer.MIN_VALUE;
+            for (int i = 0; i < length; i++) {
+                Object property = references[i].getProperty(Constants.SERVICE_RANKING);
+                int ranking = (property instanceof Integer) ? ((Integer) property).intValue() : 0;
+                rankings[i] = ranking;
+                if (ranking > maxRanking) {
+                    index = i;
+                    maxRanking = ranking;
+                    count = 1;
+                } else {
+                    if (ranking == maxRanking) {
+                        count++;
+                    }
+                }
+            }
+            if (count > 1) { /* if still more than one service, select lowest id */
+                long minId = Long.MAX_VALUE;
+                for (int i = 0; i < length; i++) {
+                    if (rankings[i] == maxRanking) {
+                        long id = ((Long) (references[i].getProperty(Constants.SERVICE_ID))).longValue();
+                        if (id < minId) {
+                            index = i;
+                            minId = id;
+                        }
+                    }
+                }
+            }
+        }
+        return references[index];
     }
 
     private void retrack() {
-        try {
-            ServiceReference[] refs = blueprintContext.getBundleContext().getServiceReferences(null, getOsgiFilter());
-            ServiceReference ref = getBestServiceReference(refs);
-            if (ref != null) {
-                bind(ref);
-            } else {
-                unbind();
+        synchronized (monitor) {
+            try {
+                ServiceReference[] refs = blueprintContext.getBundleContext().getServiceReferences(null, getOsgiFilter());
+                ServiceReference ref = getBestServiceReference(refs);
+                if (ref != null) {
+                    bind(ref);
+                } else {
+                    unbind();
+                }
+            } catch (InvalidSyntaxException e) {
+                // Ignore, should never happen
             }
-        } catch (InvalidSyntaxException e) {
-            // Ignore, should never happen
         }
     }
 
     protected void track(ServiceReference ref) {
-        if (trackedServiceReference == null) {
-            bind(ref);
-        } else {
-            if (trackedServiceReference.compareTo(ref) > 0) {
-                return;
-            }
-            bind(ref);
-        }
+        retrack();
     }
 
     protected void untrack(ServiceReference ref) {