Author: mahrwald
Date: Thu Jan 14 11:57:25 2010
New Revision: 899168
URL: http://svn.apache.org/viewvc?rev=899168&view=rev
Log:
ARIES-116 Sort providers by service ranking as the unit test expects
Modified:
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
Modified:
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
URL:
http://svn.apache.org/viewvc/incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java?rev=899168&r1=899167&r2=899168&view=diff
==============================================================================
---
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
(original)
+++
incubator/aries/trunk/jpa/jpa-container/src/main/java/org/apache/aries/jpa/container/impl/PersistenceBundleManager.java
Thu Jan 14 11:57:25 2010
@@ -45,6 +45,7 @@
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
+import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Version;
import org.osgi.util.tracker.BundleTracker;
@@ -427,7 +428,6 @@
private synchronized ServiceReference getBestProvider(String providerClass,
VersionRange matchingCriteria)
{
if(!!!persistenceProviders.isEmpty()) {
-
List<ServiceReference> refs = new ArrayList<ServiceReference>();
if((providerClass != null && !!!"".equals(providerClass))
@@ -445,24 +445,14 @@
if(!!!refs.isEmpty()) {
//Sort the list in DESCENDING ORDER
- Collections.sort(refs, new Comparator<ServiceReference>() {
-
- //TODO we may wish to use Ranking, then versions for equal ranks
- public int compare(ServiceReference object1, ServiceReference
object2)
- {
- Version v1 = object1.getBundle().getVersion();
- Version v2 = object2.getBundle().getVersion();
- return v2.compareTo(v1);
- }
- });
-
+ Collections.sort(refs, new ProviderServiceComparator());
return refs.get(0);
} else {
//TODO no matching providers for matching criteria
}
} else {
refs.addAll(persistenceProviders);
- Collections.sort(refs);
+ Collections.sort(refs, new ProviderServiceComparator());
return refs.get(0);
}
} else {
@@ -470,4 +460,21 @@
}
return null;
}
+
+ private static class ProviderServiceComparator implements
Comparator<ServiceReference> {
+ public int compare(ServiceReference object1, ServiceReference object2)
+ {
+ Version v1 = object1.getBundle().getVersion();
+ Version v2 = object2.getBundle().getVersion();
+ int res = v2.compareTo(v1);
+ if (res == 0) {
+ Integer rank1 = (Integer)
object1.getProperty(Constants.SERVICE_RANKING);
+ Integer rank2 = (Integer)
object2.getProperty(Constants.SERVICE_RANKING);
+ if (rank1 != null && rank2 != null)
+ res = rank2.compareTo(rank1);
+ }
+
+ return res;
+ }
+ }
}