[ 
https://issues.apache.org/jira/browse/SLING-5035?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14803164#comment-14803164
 ] 

Felix Meschberger commented on SLING-5035:
------------------------------------------

Quoting the OSGi Core Specification R6 :

{panel}
*5.2.6 Service Ranking Order*

When registering a service object, a bundle may optionally specify a 
SERVICE_RANKING service property of type Integer. This number specifies a 
ranking order between services. The highest num- ber has the highest ranking 
and the lowest number (including negative numbers) has the lowest ranking. If 
no service.ranking service property is specified or its type is not Integer 
then a ranking of 0 must be used.

The ranking order is defined as follows:

* Sorted on descending ranking number (highest first)
* If the ranking numbers are equal, sorted on ascending service.id property 
(oldest first).

This ordering is complete because service ids are never reused and handed out 
in order of their reg- istration time. That is, a service that is registered 
later will have a higher service id. Therefore, the ranking order is in 
descending service.ranking numeric order where ties give a preference to the 
ear- lier registrant.

The ranking order is the reverse of the natural ordering of a ServiceReference 
object. The purpose of the ranking order is to allow:

* Selection - When a single service must be chosen but multiple services 
qualify then the service with the highest ranking must be selected.
* Ordering - When multiple services must be used in a specified order.
{panel}

So essentially the ranking is from high value to low value, the service 
reference order as per {{compareTo}} is from low value to high value.

What you want here is the ranking order, that is checking the services with the 
higher ranking before the services with lower values.

I think the implementation is wrong and needs to be fixed. At the same time, I 
suggest to negate the service.ranking values for the default injectors and 
third to update the documentation.

Yes, that might give unexpected results for current implementations which 
expect the wrong behaviour -- if such implementations exist I would actually 
expect them to have stumbled upon this wrong behaviour and have broken 
service.ranking values to work around it.

> Sling Models Injectors should be queried in the reverse order of their 
> service ranking value
> --------------------------------------------------------------------------------------------
>
>                 Key: SLING-5035
>                 URL: https://issues.apache.org/jira/browse/SLING-5035
>             Project: Sling
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: Sling Models Impl 1.2.2
>            Reporter: Radu Cotescu
>             Fix For: Sling Models Impl 1.2.4
>
>
> The current version of the {{ModelAdaptorFactory}} \[0\] queries the 
> Injectors in the ascending order of their service ranking value. However they 
> should be queried in the descending order of the service ranking, to use the 
> same logic as the {{BundleContext#getServiceReference(String)}} method \[1\].
> \[0\] - 
> https://github.com/apache/sling/blob/f56b444b765beb1c31eed01b4c09fbda4013a580/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L411
> \[1\] - 
> https://osgi.org/javadoc/r4v42/org/osgi/framework/BundleContext.html#getServiceReference(java.lang.String)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to