You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/08/19 10:40:25 UTC

svn commit: r805702 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/observation/ main/java/org/apache/jackrabbit/core/state/ test/java/org/apache/jackrabbit/core/

Author: mreutegg
Date: Wed Aug 19 08:40:24 2009
New Revision: 805702

URL: http://svn.apache.org/viewvc?rev=805702&view=rev
Log:
JCR-2257: Removal of a node with shared subnodes fails

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ShareableNodeTest.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java?rev=805702&r1=805701&r2=805702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/observation/EventStateCollection.java Wed Aug 19 08:40:24 2009
@@ -562,7 +562,13 @@
                 if (n.getParentId().equals(parentId)) {
                     continue;
                 }
-                NodeState parent = (NodeState) changes.get(parentId);
+                NodeState parent = null;
+                try {
+                    parent = (NodeState) changes.get(parentId);
+                } catch (NoSuchItemStateException e) {
+                    // parent has been removed as well
+                    // ignore and retrieve from stateMgr
+                }
                 if (parent == null) {
                     // happens when mix:shareable is removed from an existing
                     // node. Usually the parent node state is in the change log

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java?rev=805702&r1=805701&r2=805702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java Wed Aug 19 08:40:24 2009
@@ -413,13 +413,14 @@
         // the depth is used as array index
         List[] la = new List[10];
         try {
+            HierarchyManager atticAware = getAtticAwareHierarchyMgr();
             Iterator iter = transientStore.values().iterator();
             while (iter.hasNext()) {
                 ItemState state = (ItemState) iter.next();
                 // determine relative depth: > 0 means it's a descendant
                 int depth;
                 try {
-                    depth = hierMgr.getShareRelativeDepth(parentId, state.getId());
+                    depth = atticAware.getShareRelativeDepth(parentId, state.getId());
                 } catch (ItemNotFoundException infe) {
                     /**
                      * one of the parents of the specified item has been

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ShareableNodeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ShareableNodeTest.java?rev=805702&r1=805701&r2=805702&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ShareableNodeTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ShareableNodeTest.java Wed Aug 19 08:40:24 2009
@@ -18,6 +18,9 @@
 
 import javax.jcr.Node;
 import javax.jcr.Workspace;
+import javax.jcr.NodeIterator;
+import javax.jcr.query.QueryManager;
+import javax.jcr.query.Query;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.ObservationManager;
@@ -119,4 +122,32 @@
         superuser.getWorkspace().getObservationManager().removeEventListener(el);
         assertEquals(1, el.getEventCount());
     }
+
+    /**
+     * Verify that a shared node is removed when the ancestor is removed.
+     * See also JCR-2257.
+     */
+    public void testRemoveAncestorOfSharedNode() throws Exception {
+        Node a1 = testRootNode.addNode("a1");
+        Node a2 = a1.addNode("a2");
+        Node b1 = a1.addNode("b1");
+        ensureMixinType(b1, mixShareable);
+        testRootNode.save();
+        //now we have a shareable node N with path a1/b1
+
+        Workspace workspace = testRootNode.getSession().getWorkspace();
+        String path = a2.getPath() + "/b2";
+        workspace.clone(workspace.getName(), b1.getPath(), path, false);
+        testRootNode.save();
+        //now we have another shareable node N' in the same shared set as N with path a1/a2/b2
+
+        a2.remove();
+        testRootNode.save();
+
+        // assert b2 is removed from index
+        QueryManager qm = superuser.getWorkspace().getQueryManager();
+        String stmt = testPath + "//b2";
+        NodeIterator it = qm.createQuery(stmt, Query.XPATH).execute().getNodes();
+        assertFalse(it.hasNext());
+    }
 }