Thanks Vlad, Julian, Paul, for your input. @Julian - yes, that was my interpretation of the situation, confirmed by the fact that adaptation of such adaptables works when the SlingModelsUseProvider has been shut down.
Paul's implementation looks good to me - I hope it'll be included in Sling shortly. Liam On Wed, 12 Jun 2019 at 21:15, Paul Bjorkstrand <[email protected]> wrote: > > Reading this thread (and looking at the code) I agree with Julian - it is > surprising that it does not work with the SlingModelsUseProvider, since it > used to work with the JavaUseProvider. This piqued my interest, so I created > a minimal implementation of this in [1]. > > [1] > https://github.com/apache/sling-org-apache-sling-scripting-sightly-models-provider/pull/1 > > Paul Bjorkstrand > > > On Wed, Jun 12, 2019 at 3:09 AM Julian Sedding <[email protected]> wrote: >> >> Hi Liam >> >> Based on the fact that the @Self injection should provide a Resource >> object, I assume your model is adaptable from a Resource (it would >> help to provide the class including its @Model annotation). >> >> The way this feature is implemented, I assume that it does not work >> for adapting Resource objects. The reason is that the >> SlingModelsUseProvider can handle the adaption before the >> JavaUseProvider, but the implementation is only in the >> JavaUseProvider. >> >> The tests for SLING-6504 implement an adapter factory by hand (i.e. >> don't use @Model), which is (I assume) why the SlingModelsUseProvider >> doesn't handle it and the JavaUseProvider get's a chance. >> >> Therefore, a workaround would be to implement an adapter factory by >> hand. I agree that that kind of defies the point of Sling Models. >> Another workaround might be to restrict your Sling Model to a specific >> resource type. >> >> I suggets you open a JIRA ticket and maybe you can provide a PR to >> enhance the SlingModelsUseProvider to support the "adaptable" argument >> as well. >> >> @Vlad: I'm not sure that the feature is "not designed" to work with >> Sling Models (after all Sling Models is just a convenient way to >> register an adapter factory). I would be of the opinion that this is a >> bug (or at least a limitation/oversight in the implementation). It >> clearly is a violation of the principle of least surprise, which I >> believe should be avoided. >> >> Regards >> Julian >> >> On Wed, Jun 12, 2019 at 8:44 AM Vlad Bailescu <[email protected]> wrote: >> > >> > Hi Liam, >> > >> > AFAIK, the mentioned pattern is not designed to work with Sling Models. It >> > simply uses the adaptTo pattern to transform the adaptable to the given >> > class. >> > >> > Best, >> > Vlad >> > >> > >> > On Tue, Jun 11, 2019 at 9:00 PM Liam C <[email protected]> wrote: >> > >> > > Hello, >> > > >> > > Is anyone able to replicate this, or to confirm that they have been >> > > able to get something similar to { 'com.example.ModelClass' @ >> > > adaptable=item} working in their projects, please? >> > > >> > > Failing this, is there some workaround that could be used within >> > > Sightly/HTL to adapt a specified resource to a Model class? Although >> > > it is possible to access resource properties (e.g. item.myProperty), >> > > some business logic is contained within models that requires access >> > > via getters rather than via the resource properties. >> > > >> > > Thanks for any guidance. >> > > >> > > Liam >> > > >> > > On 2019/04/01 12:13:43, Liam C <[email protected]> wrote: >> > > > Hello everyone, >> > > > >> > > > In SLING-6504 (https://issues.apache.org/jira/browse/SLING-6504), >> > > > functionality was added to allow adapting a resource that is different >> > > > to the underlying page resource. Feike Visser's example >> > > > ( >> > > https://github.com/heervisscher/htl-examples/commit/93666b5eebdeb36c25adf2e310f55049ec3767ce >> > > ) >> > > > suggests that it is possible and simple, but I haven't managed to >> > > > succesfully implement it. In my experience so far, the adaptable is >> > > > ignored. >> > > > >> > > > If I use the following code in my Sling Model: >> > > > >> > > > @Self >> > > > Resource adaptable; >> > > > public Resource getAdaptableSelf() >> > > > { >> > > > return adaptable; >> > > > } >> > > > >> > > > ...it reveals that the adaptable that reaches the model is null. >> > > > >> > > > I wondered if this might have to do with the fact that the code in >> > > > SLING-6504 modified the JavaUseProvider, but the >> > > > SlingModelsUseProvider handles the instantiation before the >> > > > JavaUseProvider can be reached. >> > > > >> > > > Can anyone confirm whether this option is still working in Sling 11? >> > > > >> > > > Thanks, >> > > > >> > > > Liam >> > > > >> > >
