You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/12/09 15:57:19 UTC

svn commit: r355510 - in /incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core: ItemImpl.java NodeImpl.java PropertyImpl.java

Author: stefan
Date: Fri Dec  9 06:57:15 2005
New Revision: 355510

URL: http://svn.apache.org/viewcvs?rev=355510&view=rev
Log:
JCR-288: inconsistent session state after Item/Session.save() throwing ReferentialIntegrityException

Modified:
    incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
    incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
    incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java

Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=355510&r1=355509&r2=355510&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Fri Dec  9 06:57:15 2005
@@ -682,6 +682,26 @@
         }
     }
 
+    private void restoreTransientItems(Iterator iter)
+            throws RepositoryException {
+
+        // walk through list of transient states and reapply transient changes
+        while (iter.hasNext()) {
+            ItemState itemState = (ItemState) iter.next();
+            ItemImpl item = itemMgr.getItem(itemState.getId());
+            if (!item.isTransient()) {
+                // reapply transient changes (i.e. undo effect of item.makePersistent())
+                if (item.isNode()) {
+                    NodeImpl node = (NodeImpl) item;
+                    node.restoreTransient((NodeState) itemState);
+                } else {
+                    PropertyImpl prop = (PropertyImpl) item;
+                    prop.restoreTransient((PropertyState) itemState);
+                }
+            }
+        }
+    }
+
     /**
      * Initializes the version history of all new nodes of node type
      * <code>mix:versionable</code>.
@@ -1163,6 +1183,13 @@
                 if (!succeeded) {
                     // update operation failed, cancel all modifications
                     stateMgr.cancel();
+
+                    // JCR-288: if an exception has been thrown during
+                    // update() the transient changes have already been
+                    // applied by persistTransientItems() and we need to
+                    // restore transient state, i.e. undo the effect of
+                    // persistTransientItems()
+                    restoreTransientItems(dirty.iterator());
                 }
             }
 

Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=355510&r1=355509&r2=355510&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri Dec  9 06:57:15 2005
@@ -936,6 +936,22 @@
         status = STATUS_NORMAL;
     }
 
+    protected void restoreTransient(NodeState transientState)
+            throws RepositoryException {
+        NodeState thisState = (NodeState) getOrCreateTransientItemState();
+        if (transientState.getStatus() == ItemState.STATUS_NEW
+                && thisState.getStatus() != ItemState.STATUS_NEW) {
+            thisState.setStatus(ItemState.STATUS_NEW);
+            stateMgr.disconnectTransientItemState(thisState);
+        }
+        // reapply transient changes
+        thisState.setParentUUID(transientState.getParentUUID());
+        thisState.setMixinTypeNames(transientState.getMixinTypeNames());
+        thisState.setDefinitionId(transientState.getDefinitionId());
+        thisState.setChildNodeEntries(transientState.getChildNodeEntries());
+        thisState.setPropertyNames(transientState.getPropertyNames());
+    }
+
     /**
      * Same as {@link Node#addMixin(String)} except that it takes a
      * <code>QName</code> instead of a <code>String</code>.

Modified: incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=355510&r1=355509&r2=355510&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ incubator/jackrabbit/trunk/jackrabbit/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Fri Dec  9 06:57:15 2005
@@ -141,6 +141,21 @@
         status = STATUS_NORMAL;
     }
 
+    protected void restoreTransient(PropertyState transientState)
+            throws RepositoryException {
+        PropertyState thisState = (PropertyState) getOrCreateTransientItemState();
+        if (transientState.getStatus() == ItemState.STATUS_NEW
+                && thisState.getStatus() != ItemState.STATUS_NEW) {
+            thisState.setStatus(ItemState.STATUS_NEW);
+            stateMgr.disconnectTransientItemState(thisState);
+        }
+        // reapply transient changes
+        thisState.setDefinitionId(transientState.getDefinitionId());
+        thisState.setType(transientState.getType());
+        thisState.setMultiValued(transientState.isMultiValued());
+        thisState.setValues(transientState.getValues());
+    }
+
     /**
      * Determines the length of the given value.
      *