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 > >>>>>> > >>>>> > >>>>> > >> > >> > >