Make JcrModifiablePropertyMap write changes directly
----------------------------------------------------

                 Key: SLING-1391
                 URL: https://issues.apache.org/jira/browse/SLING-1391
             Project: Sling
          Issue Type: Improvement
          Components: JCR
    Affects Versions: JCR Resource 2.0.6
            Reporter: Vidar S. Ramdal
             Fix For: JCR Resource 2.0.8


As discussed on http://markmail.org/thread/io2dnkykjnayydwz, the current 
JcrModifiablePropertyMap implementation of the PersistableValueMap interface 
uses a cached map to store changed values. The cached values are not written to 
the underlying node until a PVM.save() is called - at which point JMPM calles 
Node.save() to persist the changes. Thus, reverting changes made in a session 
is impossible.

This makes atomic operations such as this difficult to implement:
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
} 

Felix suggests (http://markmail.org/message/5fae3cwsshbnemrf):

* Enable the PersistableValueMap to write through to the JCR
   transient space on put().

 * Write-through is configurable on a global level (in the
   JcrResourceResolver providing the PersistableValueMap
   instances upon adapt()). By default it is switched off
   (backwards compatiblity).

 * Write-through can also be switched on/off on a per-instance
   level of the PersistableValueMap object (setWriteThrough(boolean))

 * PersistableValueMap.save() first writes back local changes
   not already stored using write-through and then calls node.save()

 * PersistableValueMap.reset() drops local changes not already stored
   using write-through and then calls node.refresh(false)

 * When we finally do full CRUD in the ResourceResolver, we should
   add save/reset methods, which would call Session.save() or
   refresh(false), resp. For now the Session methods must be called
   directly.

This task is about implementing Felix' suggestions.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to