Author: stefanegli
Date: Thu Mar 31 14:50:04 2016
New Revision: 1737248

URL: http://svn.apache.org/viewvc?rev=1737248&view=rev
Log:
OAK-4153 : fix for compareAgainstBaseState which properly handles deletion of 
last child and adding multiple new children in same go

Modified:
    
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
    
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java

Modified: 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java?rev=1737248&r1=1737247&r2=1737248&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
 Thu Mar 31 14:50:04 2016
@@ -555,9 +555,11 @@ public class SegmentNodeState extends Re
                 }
             }
         } else if (beforeChildName != Template.MANY_CHILD_NODES) {
+            boolean beforeChildStillExists = false;
             for (ChildNodeEntry entry
                     : afterTemplate.getChildNodeEntries(afterId)) {
                 String childName = entry.getName();
+                beforeChildStillExists |= childName.equals(beforeChildName);
                 NodeState afterChild = entry.getNodeState();
                 if (beforeChildName.equals(childName)) {
                     NodeState beforeChild =
@@ -577,6 +579,13 @@ public class SegmentNodeState extends Re
                     return false;
                 }
             }
+            if (!beforeChildStillExists) {
+                NodeState beforeChild =
+                        beforeTemplate.getChildNode(beforeChildName, beforeId);
+                if (!diff.childNodeDeleted(beforeChildName, beforeChild)) {
+                    return false;
+                }
+            }
         } else {
             MapRecord afterMap = afterTemplate.getChildNodeMap(afterId);
             MapRecord beforeMap = beforeTemplate.getChildNodeMap(beforeId);

Modified: 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java?rev=1737248&r1=1737247&r2=1737248&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
 Thu Mar 31 14:50:04 2016
@@ -156,5 +156,22 @@ public class CompareAgainstBaseStateTest
         after.compareAgainstBaseState(before, diff);
         verify(diff);
     }
+    
+    @Test
+    public void testChildNodeDeletedAndMultipleAdded() {
+        NodeState before = builder.getNodeState();
+        builder.getChildNode("baz").remove();
+        builder.child("x");
+        builder.child("y");
+        NodeState after = builder.getNodeState();
+
+        expect(diff.childNodeDeleted("baz", 
before.getChildNode("baz"))).andReturn(true);
+        expect(diff.childNodeAdded("x", 
after.getChildNode("x"))).andReturn(true);
+        expect(diff.childNodeAdded("y", 
after.getChildNode("x"))).andReturn(true);
+        replay(diff);
+
+        after.compareAgainstBaseState(before, diff);
+        verify(diff);
+    }
 
 }


Reply via email to