[
https://issues.apache.org/jira/browse/SLING-4656?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14510554#comment-14510554
]
Carsten Ziegeler commented on SLING-4656:
-----------------------------------------
I think we should fix compareTo - I think it's a copy of the
ServiceReference.compareTo method
Adding these tests shows the problem
{noformat}
@Test public void testOrderingWithoutRanking() {
final Map<String, Object> props1 = new HashMap<String, Object>();
props1.put(Constants.SERVICE_ID, 1L);
final ProviderHandler ph1 = new MyProviderHandler(props1);
assertEquals(0, ph1.compareTo(ph1));
final Map<String, Object> props2 = new HashMap<String, Object>();
props2.put(Constants.SERVICE_ID, 2L);
final ProviderHandler ph2 = new MyProviderHandler(props2);
assertEquals(-1, ph1.compareTo(ph2));
assertEquals(1, ph2.compareTo(ph1));
}
@Test public void testOrderingWithRanking() {
final Map<String, Object> props1 = new HashMap<String, Object>();
props1.put(Constants.SERVICE_ID, 1L);
props1.put(Constants.SERVICE_RANKING, 50);
final ProviderHandler ph1 = new MyProviderHandler(props1);
final Map<String, Object> props2 = new HashMap<String, Object>();
props2.put(Constants.SERVICE_ID, 2L);
props2.put(Constants.SERVICE_RANKING, 150);
final ProviderHandler ph2 = new MyProviderHandler(props2);
assertEquals(1, ph1.compareTo(ph2));
assertEquals(-1, ph2.compareTo(ph1));
}
{noformat}
> ProviderHandler implements compareTo incorreclty
> ------------------------------------------------
>
> Key: SLING-4656
> URL: https://issues.apache.org/jira/browse/SLING-4656
> Project: Sling
> Issue Type: Bug
> Components: ResourceResolver
> Affects Versions: Resource Resolver 1.2.4
> Reporter: Felix Meschberger
> Fix For: Resource Resolver 1.2.6
>
>
> The implementation of the ResourceResolver's compareTo method is wrong as it
> favors services registered later over services registered earlier, while
> older services should actually be preferred (assuming there sevice.ranking
> values are equal). In essence it implements natural ServiceReference ordering
> instead of ranking order which is the inverse.
> Two options to fix:
> * Fix ProviderHandler.compareTo to implement service ranking and thus revers
> of natural ordering
> * Fix ResourceProviderEntry.conditionalSort to use a reverse comparator
> While at it, the extraction of the service.ranking property is overly complex
> since it first checks for null and then for the correct type. This can be
> simplified by just checking for the correct type as a null value never
> matches any type.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)