Hi Roy,
That's not the reason :) this is an implementation detail of the way the
wrapping is done, so it belongs in the wrapper.

Here's a bit more detail on the problem which I hope helps explain where
the issue lies.

When you call resource.adaptTo(Class) on a ResourceWrapper, it is actually
returning the result of adaptTo(Class) on the wrapped resource, i.e. when
you call

SelfModel selfModel = resource.adaptTo(SelfModel.class);

What is actually happening is

SelfModel selfModel = resource.getResource().adaptTo(SelfModel.class);

This is documented in the JavaDoc:
http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java?view=markup#l174
<http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceWrapper.java?revision=1751431&view=markup#l174>

If your wrapper needs to behave differently, then it stands to reason it
would need to implement its own adaptTo() method. I've updated the test to
use this technique. See
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestResourceDecorator.java?view=markup

That said, I agree that this is a bit intrusive. One idea could be to
change the implementation in ResourceWrapper to do what I'm describing all
the time.

Regards,
Justin




On Mon, Jun 12, 2017 at 3:40 PM Roy Teeuwen <r...@teeuwen.be> wrote:

> Hey Justin,
>
> The reason why it is odd to me is that it should be agnostic to being
> wrapped or not.
>
> You use the resourceresolver to get the resource and then do an adapt, all
> not knowing anything about being wrapped or not, seeing as the resource
> resolver also does the wrapping internally, why wouldn't the adaptTo do it?
>
> Resource resource = resourceResolver.getResource("/my/path");
> SelfModel selfModel = resource.adaptTo(SelfModel.class);
>
> Greets,
> Roy
>
> > On 12 Jun 2017, at 21:32, Justin Edelson <jus...@justinedelson.com>
> wrote:
> >
> > Hi Roy,
> > OK. That makes sense (and I'm sorry I missed that part in your original
> > email). The problem is that if you use WrappedResource, it delegates the
> > adaptTo() call to the wrapped resource, i.e. the wrapper is lost at that
> > point and the AdapterFactory (i.e. Sling Models) doesn't have access to
> it
> > anymore. I'm not sure how this can be best be handled. One approach would
> > be in your wrapper class to implement the adaptTo method. Something like:
> >
> > class Wrapper extends ResourceWrapper {
> >        private Wrapper(Resource r) {
> >            super(r);
> >        }
> >
> >        @Override
> >        public <AdapterType> AdapterType adaptTo(Class<AdapterType> type)
> {
> >            AdapterType adapter = adapterManager.getAdapter(this, type);
> >            if (adapter != null) {
> >                return adapter;
> >            } else {
> >                return super.adaptTo(type);
> >            }
> >        }
> >    }
> >
> > But this looks a bit odd to me, although I can't quite put my finger on
> why.
> >
> > Regards,
> > Justin
> >
> > On Mon, Jun 12, 2017 at 3:21 PM Roy Teeuwen <r...@teeuwen.be> wrote:
> >
> >> Hey Justin,
> >>
> >> Cool, thanks for the integration test!
> >> Just change the modelFactory.createModel to
> >> resource.adaptTo(SelfModel.class) and you will see that the test fails
> :)
> >>
> >> Greets,
> >> Roy
> >>> On 12 Jun 2017, at 18:52, Justin Edelson <jus...@justinedelson.com>
> >> wrote:
> >>>
> >>> FWIW, I committed an integration test at
> >>> http://svn.apache.org/viewvc?view=revision&revision=1798489 checking
> >> that
> >>> the wrapped resource is injected via the @Self annotation. Would be
> >>> interesting to see how this differs from what you are doing.
> >>>
> >>> Regards,
> >>> Justin
> >>>
> >>> On Mon, Jun 12, 2017 at 12:23 PM Justin Edelson <
> >> jus...@justinedelson.com>
> >>> wrote:
> >>>
> >>>> Hi Roy,
> >>>> This sounds like unexpected behavior. Please create a JIRA for this,
> >>>> ideally with a test case, if you have not already.
> >>>>
> >>>> Thanks,
> >>>> Justin
> >>>>
> >>>> On Mon, Jun 12, 2017 at 4:38 AM Roy Teeuwen <r...@teeuwen.be> wrote:
> >>>>
> >>>>> Hey Jason, Guys,
> >>>>>
> >>>>> No one can give me an answer if this is a bug or something wanted? I
> >> can
> >>>>> always register a Jira ticket for and put it on the dev list of
> course
> >>>>>
> >>>>> Greets,
> >>>>> Roy
> >>>>>> On 6 Jun 2017, at 21:50, Roy Teeuwen <r...@teeuwen.be> wrote:
> >>>>>>
> >>>>>> Hey Jason,
> >>>>>>
> >>>>>> No to both assumptions
> >>>>>>
> >>>>>> - I used @Inject public Resource resource. Just tried the @Self,
> same
> >>>>> result
> >>>>>> - I have @Model(adaptables = Resource.class). I don't want to bind
> my
> >>>>> model to a custom Resource class, that would be the same as saying I
> >> have
> >>>>> to do @Model(adaptables = JcrNodeResource.class), the decorator just
> >>>>> decorates your resource implementation class, has nothing to do with
> >> your
> >>>>> Resource interface you are coming from.
> >>>>>>
> >>>>>> Greets,
> >>>>>> Roy
> >>>>>>> On 6 Jun 2017, at 21:41, Jason Bailey <jason.bai...@sas.com>
> wrote:
> >>>>>>>
> >>>>>>> Hey Roy,
> >>>>>>>
> >>>>>>> Couple of Assumptions:
> >>>>>>>
> >>>>>>> For the Self resource you have it defined as:
> >>>>>>>
> >>>>>>> @Self
> >>>>>>> public Resource resource;
> >>>>>>>
> >>>>>>> and for the @Model you have something like
> >>>>>>> @Model(adaptables = RoysCustomDecorator.class)
> >>>>>>>
> >>>>>>> Am I close?
> >>>>>>>
> >>>>>>> -Jason
> >>>>>>>
> >>>>>>> -----Original Message-----
> >>>>>>> From: Roy Teeuwen [mailto:r...@teeuwen.be]
> >>>>>>> Sent: Tuesday, June 06, 2017 10:08 AM
> >>>>>>> To: users@sling.apache.org
> >>>>>>> Subject: Sling models - Resource decorator
> >>>>>>>
> >>>>>>> Hey all,
> >>>>>>>
> >>>>>>> I am using sling models version 1.2.2, and I have the following
> >> logic:
> >>>>>>>
> >>>>>>> - I find some resources with the resource resolver
> >>>>> (resourceResolver.findResources)
> >>>>>>> - The returned resources are the correct resources which are
> >> decorated
> >>>>> by my custom resource decorator
> >>>>>>> - I iterate the list to cast them to the sling model I want them to
> >>>>> be, using a resource.adaptTo
> >>>>>>> - The sling model itself has a field Resource resource, to inject
> >>>>> itself
> >>>>>>>
> >>>>>>> What I notice now is that the injected resource is a
> JcrNodeResource
> >>>>> and not my decorated resource class anymore. I guess this is a bug in
> >> the
> >>>>> sling models implementation? Am I doing something wrong here or is
> >> this an
> >>>>> actual bug in the sling models implementation? Is this maybe already
> >> fixed
> >>>>> in any of the future versions?
> >>>>>>>
> >>>>>>> Greets,
> >>>>>>> Roy
> >>>>>>
> >>>>>
> >>>>>
> >>
> >>
>
>

Reply via email to