Am 10.10.14 um 16:48 schrieb Sandro Boehme:
> Am 09.10.14 06:23, schrieb Carsten Ziegeler:
>> Am 08.10.14 um 21:36 schrieb Sandro Boehme:
>>> It doesn't work as the wrapper uses the original resource metadata
>>> object.
>>> I could create a wrapper for the resource metadata as well and remove
>>> the lock check. This way I would need to dublicate all resource metadata
>>> methods in the resource metadata wrapper for the delegation. But every
>>> signature change in the evolution of the ResourceMetadata class would
>>> have to be synchronized with its wrapper. This seems to be a very tight
>>> dependency. Is this really the way to go?
>>>
>>
>> Usually you create a new metadata object for the resource wrapper. I see
>> that maybe our wrapper implementation should do this by default.
>> So I think, the right way is to create a new metadata object for the
>> wrapper and copy the metadata you want to keep from the original
>> resource.
>>
>> Carsten
>>
> 
> The original resource could have a 'ResourceMetadata' or a
> 'JcrNodeResourceMetadata' object. I didn't find any other types but as a
> user of the resource API I would like to create a new metadata object
> not matter what type it is. For example if new metadata types are added
> I would not like to handle them seperately, right? The only way I know
> to do that would be to clone the metadata object like that:
> 
> Resource newResource = new ResourceWrapper(originalResource) {
>     @Override
>     public ResourceMetadata getResourceMetadata() {
>         ResourceMetadata metadata = (ResourceMetadata)    
>         getResource().getResourceMetadata().clone();
>         return metadata;
>     }
> 
> };
> 
> 
> But in this case I would clone the status of the isReadOnly variable as
> well. If it would be 'true' because it has been returned from the
> ResourceResolver it would stay true and lead to the exception in the
> subject. To avoid that one could reset the isReadOnly to false in the
> clone method of 'ResourceMetadata' to make the method look like that:
>     @Override
>     public Object clone() {
>         ResourceMetadata result = (ResourceMetadata) super.clone();
>         result.lockedEntrySet = null;
>         result.lockedKeySet = null;
>         result.lockedValues = null;
>         result.isReadOnly=false;
>         return result;
>     }
> But that be the right thing to do?
> 
> Or is there an other way to create a new metadata object that I overlooked?
>

Metadata is an extension of Map/HashMap, so creating a new Map object
and doing a putAll() should do the trick

Carsten
-- 
Carsten Ziegeler
Adobe Research Switzerland
cziege...@apache.org

Reply via email to