You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by dp...@apache.org on 2005/04/14 15:24:30 UTC
svn commit: r161276 -
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
Author: dpfister
Date: Thu Apr 14 06:24:30 2005
New Revision: 161276
URL: http://svn.apache.org/viewcvs?view=rev&rev=161276
Log:
JCR-108
- Reload shared states from persistent storage, if PersistenceManager#store operation fails
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?view=diff&r1=161275&r2=161276
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java Thu Apr 14 06:24:30 2005
@@ -390,6 +390,21 @@
}
/**
+ * Load item state from persistent storage.
+ * @param id item id
+ * @return item state
+ */
+ private ItemState loadItemState(ItemId id)
+ throws NoSuchItemStateException, ItemStateException {
+
+ if (id.denotesNode()) {
+ return persistMgr.load((NodeId) id);
+ } else {
+ return persistMgr.load((PropertyId) id);
+ }
+ }
+
+ /**
* Store modifications registered in a <code>ChangeLog</code>. The items
* contained in the <tt>ChangeLog</tt> are not states returned by this
* item state manager but rather must be reconnected to items provided
@@ -493,11 +508,36 @@
} finally {
/**
- * If some store operation was unsuccessful, we have to restore
- * the original state of all items in the local change log.
+ * If some store operation was unsuccessful, we have to reload
+ * the state of modified and deleted items from persistent
+ * storage.
*/
if (!succeeded) {
local.disconnect();
+
+ iter = shared.modifiedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ try {
+ state.copy(loadItemState(state.getId()));
+ } catch (ItemStateException e) {
+ state.discard();
+ }
+ }
+ iter = shared.deletedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ try {
+ state.copy(loadItemState(state.getId()));
+ } catch (ItemStateException e) {
+ state.discard();
+ }
+ }
+ iter = shared.addedStates();
+ while (iter.hasNext()) {
+ ItemState state = (ItemState) iter.next();
+ state.discard();
+ }
}
}