On Thu, Feb 11, 2010 at 8:40 PM, Carsten Ziegeler <cziege...@apache.org> wrote:
> Vidar Ramdal wrote:
>> JcrModifiablePropertyMap works by storing all changes in an internal
>> cache. Upon save() the cached changes are written to the
>> javax.jcr.Node, and the node is save()d.
>>
>> This makes sequences such as this impossible:
>> try {
>>   // Modify a property through PersistableValueMap
>>   PersistableValueMap props = resource.adaptTo(PersistableValueMap.class);
>>   props.put("prop", value);
>>   props.save();
>>   // Do some other, unrelated changes
>>   Node sibling = resource.adaptTo(Node.class).getParent().addNode("child");
>>   sibling.doSomeChange(); // This may throw an exception
>>   session.save();
>> } catch(Exception e) {
>>   session.refresh(false); // Cancel the pending changes of this session
>> }
>>
>> The idea is to save all changes to the repository in one single
>> session.save(). If anything fails, the session is reverted.
>> This doesn't work because the properties of PersistableValueMap is not
>> written to the node until PersistableValueMap.save(), and by then, it
>> is too late to revert the session, as the changes of
>> PersistableValueMap are already persisted.
>>
>> We could make such operations easier by introducing a new method
>> PersistableValueMap.write() (in lack of a better name).
>> In case of JcrModifiablePropertyMap, most of save() would be moved to
>> write(), leaving out node.save().
>>
>> So that JcrModifiablePropertyMap.save() would be:
>> public void save() throws PersistenceException {
>>    this.write();
>>   node.save();
>> }
>>
>> In the code example above, replacing props.save() with props.write()
>> should give the desired functionality.
>>
> I see the problem but I'm not sure what the best way of doing things is.
> I think the property map uses the cache for an easy revert - if we would
> do the revert differently (like caching the previous values) we could
> directly set the properties on a modification and therefore a session
> save would save these changes as well.
> However if you call session save the property map is not aware of this
> and does not get updated correctly.

Exactly.

> So I think as soon as you mix the two worlds - the sling resource api
> with value maps - and the jcr api - direct access to nodes and the
> session - you sooner or later get into problems.

I was hoping for a little later :)

> Therefore I would suggest to use one or the other.

Yes, but then the problem is that the resource API (which I prefer for
a lot of tasks) does not have the notion of a session, so atomic
operations as in the code above is not possible using resources.

Could we have some kind of ResourceModificationSession? Hmmm ...

-- 
Vidar S. Ramdal <vi...@idium.no> - http://www.idium.no
Sommerrogata 13-15, N-0255 Oslo, Norway
+ 47 22 00 84 00 / +47 21 531941, ext 2070

Reply via email to