jackrabbit-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ju...@apache.org
Subject svn commit: r948488 - in /jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core: ItemImpl.java observation/EventStateCollection.java state/SharedItemStateManager.java
Date Wed, 26 May 2010 16:18:43 GMT
Author: jukka
Date: Wed May 26 16:18:43 2010
New Revision: 948488

URL: http://svn.apache.org/viewvc?rev=948488&view=rev
Log:
1.6: Commit the JCR-2456 fix backported by Bart van der Schans

Modified:
    jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
    jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
    jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java?rev=948488&r1=948487&r2=948488&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemImpl.java
Wed May 26 16:18:43 2010
@@ -67,6 +67,7 @@ import javax.jcr.nodetype.NodeType;
 import javax.jcr.version.VersionException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.ConcurrentModificationException;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -935,12 +936,21 @@ public abstract class ItemImpl implement
              * build list of transient (i.e. new & modified) states that
              * should be persisted
              */
-            Collection dirty = getTransientStates();
+            
+            Collection dirty;
+            try {
+                dirty = getTransientStates();
+            } catch (ConcurrentModificationException e) {
+                String msg = "Concurrent modification; session is closed";
+                log.error(msg, e);
+                session.logout();
+                throw e;
+            }
+            
             if (dirty.size() == 0) {
                 // no transient items, nothing to do here
                 return;
             }
-
             /**
              * build list of transient descendants in the attic
              * (i.e. those marked as 'removed')

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java?rev=948488&r1=948487&r2=948488&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
Wed May 26 16:18:43 2010
@@ -403,6 +403,11 @@ public final class EventStateCollection 
                 NodeId parentId = n.getParentId();
                 // the parent of an added item is always modified or new
                 NodeState parent = (NodeState) changes.get(parentId);
+                if (parent == null) {
+                    String msg = "Parent " + parentId + " must be changed as well.";
+                    log.error(msg);
+                    throw new ItemStateException(msg);
+                }
                 NodeTypeImpl nodeType = getNodeType(parent, session);
                 Set mixins = parent.getMixinTypeNames();
                 Path path = getPath(n.getNodeId(), hmgr);
@@ -419,6 +424,11 @@ public final class EventStateCollection 
             } else {
                 // property created / set
                 NodeState n = (NodeState) changes.get(state.getParentId());
+                if (n == null) {
+                    String msg = "Node " + state.getParentId() + " must be changed as well.";
+                    log.error(msg);
+                    throw new ItemStateException(msg);
+                }
                 NodeTypeImpl nodeType = getNodeType(n, session);
                 Set mixins = n.getMixinTypeNames();
                 Path path = getPath(state.getId(), hmgr);
@@ -611,7 +621,12 @@ public final class EventStateCollection 
         } catch (Exception e) {
             // also catch eventual runtime exceptions here
             // should never happen actually
-            String msg = "Item " + node.getNodeId() + " has unknown node type: " + node.getNodeTypeName();
+            String msg;
+            if (node == null) {
+                msg = "Node state is null";
+            } else {
+                msg = "Item " + node.getNodeId() + " has unknown node type: " + node.getNodeTypeName();
+            }
             log.error(msg);
             throw new ItemStateException(msg, e);
         }

Modified: jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java?rev=948488&r1=948487&r2=948488&view=diff
==============================================================================
--- jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
(original)
+++ jackrabbit/branches/1.6/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SharedItemStateManager.java
Wed May 26 16:18:43 2010
@@ -577,6 +577,8 @@ public class SharedItemStateManager
                     checkReferentialIntegrity();
                 }
 
+                checkAddedChildNodes();
+
                 /**
                  * prepare the events. this needs to be after the referential
                  * integrity check, since another transaction could have modified
@@ -738,8 +740,8 @@ public class SharedItemStateManager
                 long t0 = System.currentTimeMillis();
                 persistMgr.store(shared);
                 succeeded = true;
-                long t1 = System.currentTimeMillis();
                 if (log.isDebugEnabled()) {
+                    long t1 = System.currentTimeMillis();
                     log.debug("persisting change log " + shared + " took " + (t1 - t0) +
"ms");
                 }
             } finally {
@@ -982,6 +984,39 @@ public class SharedItemStateManager
         }
 
         /**
+         * Verify the added child nodes of the added or modified states exist.
+         * If they don't exist, most likely the problem is that the same session
+         * is used concurrently.
+         */
+        private void checkAddedChildNodes() throws ItemStateException {
+            for (Iterator iter = local.addedStates(); iter.hasNext();) {
+                ItemState state = (ItemState) iter.next();
+                checkAddedChildNode(state);
+            }
+            for (Iterator iter = local.modifiedStates(); iter.hasNext();) {
+                ItemState state = (ItemState) iter.next();
+                checkAddedChildNode(state);
+            }
+        }
+
+        private void checkAddedChildNode(ItemState state) throws ItemStateException {
+            if (state.isNode()) {
+                NodeState nodeState = (NodeState) state;
+                for (Iterator cneIt = nodeState.getAddedChildNodeEntries().iterator(); cneIt.hasNext();)
{
+                    ChildNodeEntry cne = (ChildNodeEntry) cneIt.next();
+                    NodeId id = cne.getId();
+                    if (local.get(id) == null && !id.equals(RepositoryImpl.VERSION_STORAGE_NODE_ID)
+                            && !id.equals(RepositoryImpl.NODETYPES_NODE_ID) &&
!cache.isCached(id)
+                            && !persistMgr.exists(id)) {
+                        String msg = "Trying to add a non-existing child node: " + id;
+                        log.debug(msg);
+                        throw new ItemStateException(msg);
+                    }
+                }
+            }
+        }
+
+        /**
          * Verifies that
          * <ul>
          * <li>no referenceable nodes are deleted if they are still being referenced</li>



Mime
View raw message