Author: mduerig
Date: Sun Mar 23 20:11:02 2014
New Revision: 1580589

URL: http://svn.apache.org/r1580589
Log:
OAK-1574: AbstractRebaseDiff: Implement refined conflict resolution for 
addExistingNode conflicts
Implementation of new contract specified in OAK-1553

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiff.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiffTest.java
    
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiff.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiff.java?rev=1580589&r1=1580588&r2=1580589&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiff.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiff.java
 Sun Mar 23 20:11:02 2014
@@ -19,6 +19,8 @@
 
 package org.apache.jackrabbit.oak.spi.state;
 
+import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+
 import org.apache.jackrabbit.oak.api.PropertyState;
 
 /**
@@ -204,10 +206,7 @@ public abstract class AbstractRebaseDiff
     @Override
     public boolean childNodeAdded(String name, NodeState after) {
         if (builder.hasChildNode(name)) {
-            NodeState other = builder.child(name).getNodeState();
-            if (!other.equals(after)) {
-                addExistingNode(builder, name, other, after);
-            }
+            after.compareAgainstBaseState(EMPTY_NODE, createDiff(builder, 
name));
         } else {
             builder.setChildNode(name, after);
         }
@@ -215,8 +214,7 @@ public abstract class AbstractRebaseDiff
     }
 
     @Override
-    public boolean childNodeChanged(
-            String name, NodeState before, NodeState after) {
+    public boolean childNodeChanged(String name, NodeState before, NodeState 
after) {
         if (builder.hasChildNode(name)) {
             after.compareAgainstBaseState(before, createDiff(builder, name));
         } else if (after.equals(before)) {

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiffTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiffTest.java?rev=1580589&r1=1580588&r2=1580589&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiffTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/spi/state/AbstractRebaseDiffTest.java
 Sun Mar 23 20:11:02 2014
@@ -155,21 +155,93 @@ public class AbstractRebaseDiffTest {
     public void addExistingNode() {
         NodeBuilder headBuilder = base.builder();
         headBuilder.setChildNode("n");
-        headBuilder.setChildNode("m");
+        headBuilder.setChildNode("m").setChildNode("m1");
+        headBuilder.getChildNode("m").setProperty("a", 1);
+        headBuilder.getChildNode("m").setProperty("p", 1);
+        headBuilder.getChildNode("m").setChildNode("mm").setChildNode("mm1");
         NodeState head = headBuilder.getNodeState();
 
         NodeBuilder branchBuilder = base.builder();
         branchBuilder.setChildNode("n");
-        branchBuilder.setChildNode("m").setChildNode("mm");
+        branchBuilder.setChildNode("m").setChildNode("m2");
+        branchBuilder.getChildNode("m").setProperty("a", 1);
+        branchBuilder.getChildNode("m").setProperty("q", 1);
+        branchBuilder.getChildNode("m").setChildNode("mm").setChildNode("mm2");
         NodeState branch = branchBuilder.getNodeState();
 
-        RebaseDiff rebaseDiff = new RebaseDiff(head.builder()) {
+        NodeBuilder builder = head.builder();
+        RebaseDiff rebaseDiff = new RebaseDiff(builder);
+        branch.compareAgainstBaseState(base, rebaseDiff);
+
+        NodeBuilder expectedBuilder = base.builder();
+        expectedBuilder.setChildNode("n");
+        expectedBuilder.setChildNode("n");
+        expectedBuilder.setChildNode("m").setChildNode("m1");
+        expectedBuilder.getChildNode("m").setChildNode("m2");
+        expectedBuilder.getChildNode("m").setProperty("a", 1);
+        expectedBuilder.getChildNode("m").setProperty("p", 1);
+        expectedBuilder.getChildNode("m").setProperty("q", 1);
+        
expectedBuilder.getChildNode("m").setChildNode("mm").setChildNode("mm1");
+        
expectedBuilder.getChildNode("m").getChildNode("mm").setChildNode("mm2");
+
+        assertEquals(expectedBuilder.getNodeState(), builder.getNodeState());
+    }
+
+    @Test
+    public void addExistingNodeWithConflict() {
+        NodeBuilder headBuilder = base.builder();
+        headBuilder.setChildNode("n");
+        headBuilder.setChildNode("m").setChildNode("m1");
+        headBuilder.getChildNode("m").setProperty("p", 1);
+        
headBuilder.getChildNode("m").setChildNode("mm").setChildNode("mmm").setProperty("pp",
 1);
+        NodeState head = headBuilder.getNodeState();
+
+        NodeBuilder branchBuilder = base.builder();
+        branchBuilder.setChildNode("n");
+        branchBuilder.setChildNode("m").setChildNode("m2");
+        branchBuilder.getChildNode("m").setProperty("q", 1);
+        
branchBuilder.getChildNode("m").setChildNode("mm").setChildNode("mmm").setProperty("pp",
 2);
+        NodeState branch = branchBuilder.getNodeState();
+
+        NodeBuilder builder = head.builder();
+
+        class ConflictResolver extends RebaseDiff {
+            private final ConflictResolver parent;
+
+            private ConflictResolver(NodeBuilder builder) {
+                this(null, builder);
+            }
+
+            public ConflictResolver(ConflictResolver parent, NodeBuilder 
builder) {
+                super(builder);
+                this.parent = parent;
+            }
+
             @Override
-            protected void addExistingNode(NodeBuilder builder, String name, 
NodeState before, NodeState after) {
-                assertEquals("m", name);
+            protected void resolve() {
+                if (parent == null) {
+                    super.resolve();
+                } else {
+                    parent.resolve();
+                }
+            }
+
+            @Override
+            protected AbstractRebaseDiff createDiff(NodeBuilder builder, 
String name) {
+                return new ConflictResolver(
+                        this, builder.getChildNode(name));
+            }
+
+            @Override
+            protected void addExistingProperty(NodeBuilder builder,
+                    PropertyState before, PropertyState after) {
+                assertEquals(createProperty("pp", 1), before);
+                assertEquals(createProperty("pp", 2), after);
                 resolve();
             }
-        };
+        }
+
+        RebaseDiff rebaseDiff = new ConflictResolver(builder);
         branch.compareAgainstBaseState(base, rebaseDiff);
         assertTrue(rebaseDiff.isResolved());
     }
@@ -256,7 +328,7 @@ public class AbstractRebaseDiffTest {
 
         @Override
         protected AbstractRebaseDiff createDiff(NodeBuilder builder, String 
name) {
-            return this;
+            return new RebaseDiff(builder.getChildNode(name));
         }
 
         @Override

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1580589&r1=1580588&r2=1580589&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
 Sun Mar 23 20:11:02 2014
@@ -1602,8 +1602,8 @@ public class RepositoryTest extends Abst
         Session session1 = createAdminSession();
         Session session2 = createAdminSession();
         try {
-            session1.getRootNode().addNode("node");
-            session2.getRootNode().addNode("node").setProperty("p", "v");
+            session1.getRootNode().addNode("node").setProperty("p", "v1");
+            session2.getRootNode().addNode("node").setProperty("p", "v2");
             assertTrue(session1.getRootNode().hasNode("node"));
             assertTrue(session2.getRootNode().hasNode("node"));
 


Reply via email to