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"));