You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/05/14 15:45:58 UTC

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

Author: jukka
Date: Fri May 14 13:45:58 2010
New Revision: 944258

URL: http://svn.apache.org/viewvc?rev=944258&view=rev
Log:
JCR-2503: inconsistent session and persistent state after ReferentialIntegrityException

Patch by Stephan Huttenhuis

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

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=944258&r1=944257&r2=944258&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java Fri May 14 13:45:58 2010
@@ -690,15 +690,14 @@ public abstract class ItemImpl implement
                         itemState.setStatus(ItemState.STATUS_NEW);
                     }
                 }
-                if (!item.isTransient()) {
-                    // re-apply 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);
-                    }
+                // re-apply transient changes
+                // for persistent nodes 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);
                 }
             } catch (RepositoryException re) {
                 // something went wrong, log exception and carry on

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=944258&r1=944257&r2=944258&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Fri May 14 13:45:58 2010
@@ -826,15 +826,35 @@ public class NodeImpl extends ItemImpl i
 
     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);
+        NodeState thisState = null;
+
+        if (!isTransient()) {
+            thisState = (NodeState) getOrCreateTransientItemState();
+            if (transientState.getStatus() == ItemState.STATUS_NEW
+                    && thisState.getStatus() != ItemState.STATUS_NEW) {
+                thisState.setStatus(ItemState.STATUS_NEW);
+                stateMgr.disconnectTransientItemState(thisState);
+            }
+            thisState.setParentId(transientState.getParentId());
+            thisState.setNodeTypeName(transientState.getNodeTypeName());
+        } else {
+            // JCR-2503: Re-create transient state in the state manager,
+            // because it was removed
+            synchronized (data) {
+                try {
+                    thisState = stateMgr.createTransientNodeState(
+                            (NodeId) transientState.getId(),
+                            transientState.getNodeTypeName(),
+                            transientState.getParentId(),
+                            NodeState.STATUS_NEW);
+                    data.setState(thisState);
+                } catch (ItemStateException e) {
+                    throw new RepositoryException(e);
+                }
+            }
         }
+
         // re-apply transient changes
-        thisState.setParentId(transientState.getParentId());
-        thisState.setNodeTypeName(transientState.getNodeTypeName());
         thisState.setMixinTypeNames(transientState.getMixinTypeNames());
         thisState.setChildNodeEntries(transientState.getChildNodeEntries());
         thisState.setPropertyNames(transientState.getPropertyNames());

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java?rev=944258&r1=944257&r2=944258&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/PropertyImpl.java Fri May 14 13:45:58 2010
@@ -154,12 +154,31 @@ public class PropertyImpl extends ItemIm
 
     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);
+        PropertyState thisState = null;
+
+        if (!isTransient()) {
+            thisState = (PropertyState) getOrCreateTransientItemState();
+            if (transientState.getStatus() == ItemState.STATUS_NEW
+                    && thisState.getStatus() != ItemState.STATUS_NEW) {
+                thisState.setStatus(ItemState.STATUS_NEW);
+                stateMgr.disconnectTransientItemState(thisState);
+            }
+        } else {
+            // JCR-2503: Re-create transient state in the state manager,
+            // because it was removed
+            synchronized (data) {
+                try {
+                    thisState = stateMgr.createTransientPropertyState(
+                            transientState.getParentId(),
+                            transientState.getName(),
+                            PropertyState.STATUS_NEW);
+                    data.setState(thisState);
+                } catch (ItemStateException e) {
+                    throw new RepositoryException(e);
+                }
+            }
         }
+
         // reapply transient changes
         thisState.setType(transientState.getType());
         thisState.setMultiValued(transientState.isMultiValued());