Kyle Giovannetti created SLING-10212:
----------------------------------------

             Summary: Prioritize model with no `resourceType` when no resource 
type matches
                 Key: SLING-10212
                 URL: https://issues.apache.org/jira/browse/SLING-10212
             Project: Sling
          Issue Type: Improvement
          Components: Sling Models
            Reporter: Kyle Giovannetti


I have found that the behaviour of the Model Adapter is not as I would expect 
when no model implementation matches the adaptable objects resources resource 
type. 

 

My analysis is based on stepping through the adapter to debug an issue.
 I would appreciate if someone with a more intimate understanding of Sling 
Models could verify this behaviour. 

 

The issue arises when there are multiple implementations, and one of those 
implementations does not declare a `resourceType`.
 For example:

 
{code:java}
public interface SomeModel {
   // ...
}{code}
 

 

 
{code:java}
@Model(adaptables = SlingHttpServletRequest.class, adapters = SomeModel.class, 
resourceType = "project/A")
public class A_Impl implements SomeModel {
   // ...
}{code}
 

 

 
{code:java}
@Model(adaptables = SlingHttpServletRequest.class, adapters = SomeModel.class, 
resourceType = "project/B") 
public class B_Impl implements SomeModel {
  // ...
}
{code}
 

 

 
{code:java}
@Model(adaptables = SlingHttpServletRequest.class, adapters = SomeModel.class) 
public class C_Impl implements SomeModel {
  // ...
}
{code}

Now, let us assume that we are adapting a request for which the resource type 
is "X". 
Neither `project/A` or `project/B` have a parent resource type of "X".

The adapter will first run through the `ResourceTypeBasedResourcePicker`, which 
will not produce any model implementation suitable for the resource type "X".
The adapter will then fall back on the "FirstImplementationPicker", and now, if 
the implementations are in the order specified above, the implementation 
`A_Impl` will be chosen - despite the fact that the `resourceType` does not 
match.

I would expect that `C_Impl` would be chosen instead.
Although `C_Impl` does not match a `resourceType`, it at least does not have 
the wrong `resourceType`.

A possible solution to implement this is to add another ImplementationPicker 
(e.g. "DefaultImplementationPicker") that is positioned between the 
`ResourceTypeBasedResourcePicker` and the `FirstImplementationPicker`. This new 
implementation picker would only return implementations that do not define any 
`resourceType` at all. 

Thus the order of precedence for model implementation selection would be:


 # The model implementation with the closest matching `resourceType`
 # A model implementation with no `resourceType`
 # The first model implementation

 

 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to