I think calling resolve() for traversal is totally unexpected. Now looking at this, I'm really wondering if it was a good idea to implement getParent on NonExistingResource. Let the client deal with it instead of adding complex special cases.
Carsten Konrad Windszus wrote > There is one related problem with mapping: > > Consider the case you have a resource resolver mapping from "/content/" to > "/". In the underlying repository you have a resource in > "/content/existingParent". > > Now it might happen that a NonExistingResource is resolved for path > "/existingParent/nonExistingResource". Since this is pointing towards a > non-existing resource the mapping is not active (i.e. the path will not > contain "/content"). So you end up with a NonExistingResource with path > "/existingParent/nonExistingResource". > Now you call getParent() on this resource. > > You would expect to end up with an existing resource in > "/content/existingParent" (because that path does exist in the repository). > Unfortunately due to the logic in AbstractResource.getParent() this just > calls ResourceResolver.getParent() which will not use > ResourceResolver.resolve(...) but rather ResourceResolver.getResource(...) > internally. So the mapping is not considered here. Therefore no resource is > found at "/existingParent", although it does exist at > "/content/existingParent". > > This is unexpected and wrong in my opinion. So the NonExistingResource should > not rely on AbstractResource.getParent() at all, but rather use its own > implementation relying on ResourceResolver.resolve(...). WDYT? > > Thanks, > Konrad > > >> On 02 Jun 2016, at 14:48, Konrad Windszus <[email protected]> wrote: >> >> Thanks for the input. >> I created https://issues.apache.org/jira/browse/SLING-5757 for tracking that >> and I am going to propose a patch in there. >> >> What about SyntheticResources which are not NonExistingResources? If we >> would follow the same approach as for NonExistingResources the question is, >> with which resource type the non-existing parent resource should be created? >> Or should a SyntheticResource (which is not a NonExistingResource) return a >> NonExistingResource for getParent() instead in that case? >> >> Konrad >> >> >>> On 02 Jun 2016, at 13:47, Daniel Klco <[email protected]> wrote: >>> >>> I would imagine that the only thing this would change is to make a small >>> number of null checks irrelevant. >>> >>> +1 for making the behavior more consistent, however, the JavaDocs and >>> release notes should be explicit about this change. >>> >>> On Thu, Jun 2, 2016 at 4:45 AM, Georg Henzler <[email protected]> wrote: >>> >>>> Hi Konrad, >>>> >>>> +1 for making the behaviour of NonExistingResource more consistent - I >>>> personally can't think of any places this would break existing code. >>>> >>>> Regards >>>> Georg >>>> >>>> >>>> >>>> On 2016-06-01 15:09, Konrad Windszus wrote: >>>> >>>>> Hi Robert, >>>>> thanks for your input. >>>>> >>>>> >>>>>> I am not sure whether this would confuse existing clients though... >>>>>> >>>>> >>>>> I am also a bit worried about that but the only example I could think >>>>> of is a code trying to create the parent nodes or collecting the >>>>> non-existing ones by checking getParent() for null. >>>>> >>>>> This would be pretty bad style IMHO therefore I would deliberately be >>>>> willing to break that code. I wonder what do others think about >>>>> changing the semantics of getParent() for NonExistingResource and >>>>> probably also SyntheticResource. >>>>> Konrad >>>>> >>>> >>>> >> > > -- Carsten Ziegeler Adobe Research Switzerland [email protected]
