You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2008/11/04 19:03:59 UTC
svn commit: r711332 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework:
BundleContextImpl.java ServiceReferenceImpl.java
Author: rickhall
Date: Tue Nov 4 10:03:59 2008
New Revision: 711332
URL: http://svn.apache.org/viewvc?rev=711332&view=rev
Log:
Applied patch (FELIX-799) to implement ServiceReference.compareTo() method.
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceReferenceImpl.java
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java?rev=711332&r1=711331&r2=711332&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/BundleContextImpl.java Tue Nov 4 10:03:59 2008
@@ -282,70 +282,12 @@
// Loop through all service references and return
// the "best" one according to its rank and ID.
- ServiceReference bestRef = null;
- Integer bestRank = null;
- Long bestId = null;
- for (int i = 0; i < refs.length; i++)
+ ServiceReference bestRef = refs[0];
+ for (int i = 1; i < refs.length; i++)
{
- ServiceReference ref = refs[i];
-
- // The first time through the loop just
- // assume that the first reference is best.
- if (bestRef == null)
- {
- bestRef = ref;
- bestRank = (Integer) bestRef.getProperty("service.ranking");
- // The spec says no ranking defaults to zero.
- if (bestRank == null)
- {
- bestRank = new Integer(0);
- }
- bestId = (Long) bestRef.getProperty("service.id");
- }
-
- // Compare current and best references to see if
- // the current reference is a better choice.
- Integer rank = (Integer) ref.getProperty("service.ranking");
-
- // The spec says no ranking defaults to zero.
- if (rank == null)
- {
- rank = new Integer(0);
- }
-
- // If the current reference ranking is greater than the
- // best ranking, then keep the current reference.
- if (bestRank.compareTo(rank) < 0)
- {
- bestRef = ref;
- bestRank = rank;
- bestId = (Long) bestRef.getProperty("service.id");
- }
- // If rankings are equal, then compare IDs and
- // keep the smallest.
- else if (bestRank.compareTo(rank) == 0)
+ if (bestRef.compareTo(refs[i]) < 0)
{
- Long id = (Long) ref.getProperty("service.id");
- // If either reference has a null ID, then keep
- // the one with a non-null ID.
- if ((bestId == null) || (id == null))
- {
- bestRef = (bestId == null) ? ref : bestRef;
- // bestRank = bestRank; // No need to update since they are equal.
- bestId = (Long) bestRef.getProperty("service.id");
- }
- // Otherwise compare IDs.
- else
- {
- // If the current reference ID is less than the
- // best ID, then keep the current reference.
- if (bestId.compareTo(id) > 0)
- {
- bestRef = ref;
- // bestRank = bestRank; // No need to update since they are equal.
- bestId = (Long) bestRef.getProperty("service.id");
- }
- }
+ bestRef = refs[i];
}
}
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceReferenceImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceReferenceImpl.java?rev=711332&r1=711331&r2=711332&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceReferenceImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceReferenceImpl.java Tue Nov 4 10:03:59 2008
@@ -22,6 +22,7 @@
import org.apache.felix.moduleloader.IModule;
import org.apache.felix.moduleloader.IWire;
import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
class ServiceReferenceImpl implements ServiceReference
@@ -195,6 +196,34 @@
public int compareTo(Object reference)
{
- throw new UnsupportedOperationException("This feature has not yet been implemented.");
+ ServiceReference other = (ServiceReference) reference;
+
+ Long id = (Long) getProperty(Constants.SERVICE_ID);
+ Long otherId = (Long) other.getProperty(Constants.SERVICE_ID);
+
+ if (id.equals(otherId))
+ {
+ return 0; // same service
+ }
+
+ Integer rank = (Integer) getProperty(Constants.SERVICE_RANKING);
+ Integer otherRank = (Integer) other.getProperty(Constants.SERVICE_RANKING);
+
+ // If no rank, then spec says it defaults to zero.
+ rank = (rank == null) ? new Integer(0) : rank;
+ otherRank = (otherRank == null) ? new Integer(0) : otherRank;
+
+ // 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;
}
}
\ No newline at end of file