Hi Justin

Thank you for the clarification! So, in summary, when /something is resolved
for /something.html, the question is not whether something.html is a child
of /something, but whether .html I an extension of the sibling resource
/something. That's where I got it wrong.

Kind regards,
Olaf
-----Original Message-----
From: justinedel...@gmail.com [mailto:justinedel...@gmail.com] On Behalf Of
Justin Edelson
Sent: Freitag, 17. Januar 2014 14:57
To: users@sling.apache.org
Subject: Re: ResourceProvider not invoked when provider root path is called
with HTML extension

Hi Olaf,
Sorry, I don't know how to explain this any better than what I said earlier
in the week. There is no inconsistency.

For a request like /root/child.html, Sling will try *first* for the full
resource path /root/child.html. Since your resource provider is rooted at
/root, it is asked for the reosurce at /root/child.html. If no resource can
be found at this path, Sling *next* tries to get the resource /root/child.
Since your resource provider is rooted at /root, it is asked for this
resource as well.

Sling will behave differently depending on which call returns a non-null
value.

getResource("/root/child.html") - Sling will try to serve the resource
directly to the client, usually by adapting it to an InputStream

getResource("/root/child") - Sling will then try to execute the "html"
or default script for this resource type.

You wrote this in your JIRA issue which I think identifies the problem:
> In essence, a ResourceProvider can not utilize any selectors or extensions
to parametrize the resolution of its root resource.

A ResourceProvider should *never* do this, whether on the root resource or
any other resource. Selectors and extensions are not meant to parameterize
resource resolution.

Justin


On Fri, Jan 17, 2014 at 3:38 AM, Olaf Otto <o...@x100.de> wrote:
> Hello Justin
>
> I believe we have a misunderstanding: You are absolutely right - but I 
> have no intention to alter the described behavior. What I mean is that 
> the behavior of the resource resolution using a resolved provider is 
> inconsistent as it differs between the root path and (potential) child 
> paths of a ResourceProvider. Let me elaborate:
>
> Let /root be the root of the resource provider. When I resolve 
> /root/child.html, the resource provider is looked up in the fashion 
> you described below, and is subsequently asked to resolve the entire 
> request path, i.e. /root/child.html. When /root.html is called, and 
> there is no specific provider for /root.html, the provider is looked 
> up in the fashion you described, and is subsequently called - and this 
> is the important difference - with the *lookup path* for the provider  -
i.e. /root.
>
> It is clear that /root.html is not a child of /root *by default*. 
> However, when no specific provider for /root.html exists, the provider 
> of /root becomes responsible for the resolution of the path, i.e. 
> /root.html is then treated as a child of /root. Consequently, the 
> provider should be asked to provide the *entire* path, i.e. including 
> and extensions / selectors etc, just like for any other child resource it
is responsible for.
>
> The patch I attached to SLING-3319 does not alter the behavior you 
> described below (that would indeed be very nasty) but simply provides 
> the full path to be resolved to the provider responsible.
>
> This behavior would be consistent with the behavior for
JcrResourceProvider:
> As this provider has the root path "/", it will always be asked to 
> resolve the entire resource path (including extensions and selectors) 
> as "/.selectors.extensions" is usually not resolved, i.e. it is always 
> asked to resolve a child.
>
> Kind regards,
> Olaf
>
> -----Original Message-----
> From: justinedel...@gmail.com [mailto:justinedel...@gmail.com] On 
> Behalf Of Justin Edelson
> Sent: Dienstag, 14. Januar 2014 19:22
> To: users@sling.apache.org
> Subject: Re: ResourceProvider not invoked when provider root path is 
> called with HTML extension
>
> Hi,
> IIUC, this is *entirely* expected.
>
> Your ResourceProvider's root is /content/child1/child2. When the 
> request comes in for /content/child1/child2.html, Sling will first try 
> to resolve that full path. Your provider will *not* be consulted at 
> this point because /content/child1/child2.html is not a child of
> /content/child1/child2 (it is a sibling). When the full path cannot be 
> resolved, Sling then does its path decomposition thing and tries to 
> resolve /content/child1/child2, which succeeds via your ResourceProvider.
>
> When a request comes in for /content/child1/child2/child3.html, the 
> same thing happens. First, Sling tries to resolve the full path and 
> does consult your resource provider (because 
> /content/child1/child2/child3.html is a descendant of 
> /content/child1/child2). At this point, if your provider returns null 
> (and no other provider returns a non-null result), the Sling engine will
THEN ask your provider for /content/child1/child2/child3.
>
> HTH,
> Justin
>
> On Tue, Jan 14, 2014 at 12:53 PM, Felix Meschberger 
> <fmesc...@adobe.com>
> wrote:
>> Hi
>>
>> Well, this gets really tricky, because as has been said, this is not
> expected.
>>
>> The only advice I can give here is to do some (remote) debugging with 
>> a
> debugger and step through the process from the SlingMainServlet 
> (actually probably RequestData.initResource).
>>
>> Regards
>> Felix
>>
>> Am 14.01.2014 um 00:56 schrieb Olaf Otto <o...@x100.de>:
>>
>>> Hello
>>>
>>> Apparently, the behavior that the root path with .html extension was 
>>> not resolved at all was due to some persistent invalid internal 
>>> state of the resource resolver. After modifying an arbitrary 
>>> resolver setting, the root resource is now resolved (I re-installed 
>>> Sling and the entire application to make sure this remains the case).
>>>
>>> However, there still is an important difference:
>>>
>>> When requesting "/content/child1/child2/child3.html", the path 
>>> passed to the resource provider is 
>>> "/content/child1/child2/child3.html",
>>> i.e. includes the extension. When requesting 
>>> /content/child1/child2.html, the resolver only sees the path 
>>> "/content/child1/child2". Since I am doing a subsequent resource 
>>> resolution, this results in a missing resolutionPathInfo=".html" of 
>>> the
> resolved resource.
>>>
>>> Thus, the remaining question is: Why are extensions not passed to 
>>> the provider in case the root path is requested?
>>>
>>> Kind regards,
>>> Olaf
>>>
>>> -----Original Message-----
>>> From: Olaf Otto [mailto:o...@x100.de]
>>> Sent: Dienstag, 14. Januar 2014 07:29
>>> To: users@sling.apache.org
>>> Subject: RE: ResourceProvider not invoked when provider root path is 
>>> called with HTML extension
>>>
>>> Hello,
>>>
>>> Thank you for the quick replies! The /child2 path is exclusively 
>>> provided by the custom resource provider. Would anyone know a hint 
>>> why this just happens in case of a .html extension? There must be 
>>> some other actor influencing this behavior.
>>>
>>> Kind regards,
>>> Olaf
>>>
>>> -----Original Message-----
>>> From: Felix Meschberger [mailto:fmesc...@adobe.com]
>>> Sent: Montag, 13. Januar 2014 23:38
>>> To: users@sling.apache.org
>>> Subject: Re: ResourceProvider not invoked when provider root path is 
>>> called with HTML extension
>>>
>>> Hi
>>>
>>> As Alex said, this is not expected, but .
>>>
>>> Do you happen to have a node /content/child1/child2.html in the
> repository ?
>>> If so, this would overwrite the ResourceProvider because it has a 
>>> full path match as opposed to just ./child2.
>>>
>>> Regards
>>> Felix
>>>
>>> Am 13.01.2014 um 14:09 schrieb Olaf Otto <o...@x100.de>:
>>>
>>>> Hi all,
>>>>
>>>>
>>>>
>>>> I have created a resource provider adding content as children into 
>>>> a tree of existing JCR content, like this:
>>>>
>>>>
>>>>
>>>> /content/child1  ß JCR content
>>>>
>>>> /content/child1/child2 ß Provided by ResourceProvider
>>>>
>>>>
>>>>
>>>> This works as expected: child2 is returned as a child of child1, 
>>>> and invoking /content/child1/child2 yields the provided resource.
>>>> However, when calling /content/child1/child2.html, the resource 
>>>> provider is never asked for a resource. Instead, the default get 
>>>> servlet returns a synthetic resource, causing a redirect to 
>>>> /content/child1/child2.html/, resulting in a 404. Using a different 
>>>> extension works - when I call /content/child1/child2.json, the 
>>>> provider is called. Children of the root path however work with a 
>>>> .html extension: A request to /content/child1/child2/child3.html is 
>>>> mapped
>>> to the resource provider.
>>>>
>>>>
>>>>
>>>> I have played with the resource provider's properties, trying both
>>>> /content/child1/child2 and /content/child1/child2/ as root and 
>>>> setting owns root to true. This had no effect - the provider is 
>>>> only called if /content/child1/child2.html is added as a root path. 
>>>> This, however, is not an acceptable solution as child1 features 
>>>> both
>>>> child2 and child2.html as children afterwards.
>>>>
>>>>
>>>>
>>>> In summary, this looks like a bug to me - am I right or am I 
>>>> missing a piece of the puzzle?
>>>>
>>>>
>>>>
>>>> Kind regards,
>>>>
>>>> Olaf
>>>>
>>>
>>>
>>>
>>
>

Reply via email to