Author: stefanegli
Date: Fri Apr  1 12:54:16 2016
New Revision: 1737368

URL: http://svn.apache.org/viewvc?rev=1737368&view=rev
Log:
OAK-4153 : fix for compareAgainstBaseState when removing last child while 
adding more than 1 new child - merged from trunk/OAK-4153-3.patch

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

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java?rev=1737368&r1=1737367&r2=1737368&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
 Fri Apr  1 12:54:16 2016
@@ -555,28 +555,29 @@ public class SegmentNodeState extends Re
                 }
             }
         } else if (beforeChildName != Template.MANY_CHILD_NODES) {
+            boolean beforeChildRemoved = true;
+            NodeState beforeChild =
+                    beforeTemplate.getChildNode(beforeChildName, beforeId);
             for (ChildNodeEntry entry
                     : afterTemplate.getChildNodeEntries(afterId)) {
                 String childName = entry.getName();
                 NodeState afterChild = entry.getNodeState();
                 if (beforeChildName.equals(childName)) {
-                    NodeState beforeChild =
-                            beforeTemplate.getChildNode(beforeChildName, 
beforeId);
-                    if (beforeChild.exists()) {
-                        if (!fastEquals(afterChild, beforeChild)
-                                && !diff.childNodeChanged(
-                                        childName, beforeChild, afterChild)) {
-                            return false;
-                        }
-                    } else {
-                        if (!diff.childNodeAdded(childName, afterChild)) {
-                            return false;
-                        }
+                    beforeChildRemoved = false;
+                    if (!fastEquals(afterChild, beforeChild)
+                            && !diff.childNodeChanged(
+                                    childName, beforeChild, afterChild)) {
+                        return false;
                     }
                 } else if (!diff.childNodeAdded(childName, afterChild)) {
                     return false;
                 }
             }
+            if (beforeChildRemoved) {
+                if (!diff.childNodeDeleted(beforeChildName, beforeChild)) {
+                    return false;
+                }
+            }
         } else {
             MapRecord afterMap = afterTemplate.getChildNodeMap(afterId);
             MapRecord beforeMap = beforeTemplate.getChildNodeMap(beforeId);

Modified: 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java?rev=1737368&r1=1737367&r2=1737368&view=diff
==============================================================================
--- 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
 (original)
+++ 
jackrabbit/oak/branches/1.2/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/segment/CompareAgainstBaseStateTest.java
 Fri Apr  1 12:54:16 2016
@@ -152,4 +152,20 @@ public class CompareAgainstBaseStateTest
         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