[ https://issues.apache.org/jira/browse/SLING-1391?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Justin Edelson updated SLING-1391: ---------------------------------- Fix Version/s: (was: JCR Resource 2.0.8) descheduling from current release > 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 > > 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.