Hey Justin,

Aha ok I get what you are saying. Then the problem indeed lies with the 
ResourceWrapper for not using the AdapterFactory. Thanks!

I guess I can change this in my own code to override the method in my resource 
wrapper, although it still feels like something I wouldn't expect, definitely 
because I'm using @Self.
Changing the ResourceWrapper implementation itself though would probably take 
it a lot further and have some side effects on dependent bundles :/.

Greets,
Roy
> On 12 Jun 2017, at 21:55, Justin Edelson <jus...@justinedelson.com> wrote:
> 
> 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
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>> 
>>>> 
>> 
>> 

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to