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.