You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2013/02/25 11:44:36 UTC
svn commit: r1449653 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak:
plugins/commit/MergingNodeStateDiff.java
plugins/segment/SegmentNodeStoreBranch.java spi/state/RebaseDiff.java
Author: mreutegg
Date: Mon Feb 25 10:44:36 2013
New Revision: 1449653
URL: http://svn.apache.org/r1449653
Log:
OAK-650: Move SegmentNodeStoreBranch.RebaseDiff to utility package
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java?rev=1449653&r1=1449652&r2=1449653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java Mon Feb 25 10:44:36 2013
@@ -33,23 +33,23 @@ import org.apache.jackrabbit.oak.spi.sta
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.ADD_EXISTING_NODE;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.ADD_EXISTING_PROPERTY;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.CHANGE_CHANGED_PROPERTY;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.CHANGE_DELETED_NODE;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.CHANGE_DELETED_PROPERTY;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.CONFLICT;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.DELETE_CHANGED_NODE;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.DELETE_CHANGED_PROPERTY;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.DELETE_DELETED_NODE;
+import static org.apache.jackrabbit.oak.spi.state.RebaseDiff.DELETE_DELETED_PROPERTY;
+
/**
* MergingNodeStateDiff... TODO
*/
public final class MergingNodeStateDiff extends DefaultNodeStateDiff {
private static final Logger LOG = LoggerFactory.getLogger(MergingNodeStateDiff.class);
- public static final String CONFLICT = ":conflict";
- public static final String DELETE_CHANGED_PROPERTY = "deleteChangedProperty";
- public static final String DELETE_CHANGED_NODE = "deleteChangedNode";
- public static final String ADD_EXISTING_PROPERTY = "addExistingProperty";
- public static final String CHANGE_DELETED_PROPERTY = "changeDeletedProperty";
- public static final String CHANGE_CHANGED_PROPERTY = "changeChangedProperty";
- public static final String DELETE_DELETED_PROPERTY = "deleteDeletedProperty";
- public static final String ADD_EXISTING_NODE = "addExistingNode";
- public static final String CHANGE_DELETED_NODE = "changeDeletedNode";
- public static final String DELETE_DELETED_NODE = "deleteDeletedNode";
-
private final NodeState parent;
private final NodeBuilder target;
private final ConflictHandler conflictHandler;
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java?rev=1449653&r1=1449652&r2=1449653&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreBranch.java Mon Feb 25 10:44:36 2013
@@ -16,30 +16,18 @@
*/
package org.apache.jackrabbit.oak.plugins.segment;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.ADD_EXISTING_NODE;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.ADD_EXISTING_PROPERTY;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.CHANGE_CHANGED_PROPERTY;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.CHANGE_DELETED_NODE;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.CHANGE_DELETED_PROPERTY;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.CONFLICT;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.DELETE_CHANGED_NODE;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.DELETE_CHANGED_PROPERTY;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.DELETE_DELETED_NODE;
-import static org.apache.jackrabbit.oak.plugins.commit.MergingNodeStateDiff.DELETE_DELETED_PROPERTY;
-
import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.api.CommitFailedException;
-import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
import org.apache.jackrabbit.oak.spi.state.NodeStoreBranch;
+import org.apache.jackrabbit.oak.spi.state.RebaseDiff;
class SegmentNodeStoreBranch implements NodeStoreBranch {
@@ -80,86 +68,6 @@ class SegmentNodeStoreBranch implements
writer.flush();
}
- // FIXME: Proper rebase needed
- private class RebaseDiff implements NodeStateDiff {
-
- private final NodeBuilder builder;
-
- RebaseDiff(NodeBuilder builder) {
- this.builder = builder;
- }
-
- @Override
- public void propertyAdded(PropertyState after) {
- PropertyState other = builder.getProperty(after.getName());
- if (other == null) {
- builder.setProperty(after);
- } else if (!other.equals(after)) {
- conflictMarker(ADD_EXISTING_PROPERTY).setProperty(after);
- }
- }
-
- @Override
- public void propertyChanged(PropertyState before, PropertyState after) {
- PropertyState other = builder.getProperty(before.getName());
- if (other == null) {
- conflictMarker(CHANGE_DELETED_PROPERTY).setProperty(after);
- } else if (other.equals(before)) {
- builder.setProperty(after);
- } else if (!other.equals(after)) {
- conflictMarker(CHANGE_CHANGED_PROPERTY).setProperty(after);
- }
- }
-
- @Override
- public void propertyDeleted(PropertyState before) {
- PropertyState other = builder.getProperty(before.getName());
- if (other == null) {
- conflictMarker(DELETE_DELETED_PROPERTY).setProperty(before);
- } else if (other.equals(before)) {
- builder.removeProperty(before.getName());
- } else {
- conflictMarker(DELETE_CHANGED_PROPERTY).setProperty(before);
- }
- }
-
- @Override
- public void childNodeAdded(String name, NodeState after) {
- if (builder.hasChildNode(name)) {
- conflictMarker(ADD_EXISTING_NODE).setNode(name, after);
- } else {
- builder.setNode(name, after);
- }
- }
-
- @Override
- public void childNodeChanged(
- String name, NodeState before, NodeState after) {
- if (builder.hasChildNode(name)) {
- after.compareAgainstBaseState(
- before, new RebaseDiff(builder.child(name)));
- } else {
- conflictMarker(CHANGE_DELETED_NODE).setNode(name, after);
- }
- }
-
- @Override
- public void childNodeDeleted(String name, NodeState before) {
- if (!builder.hasChildNode(name)) {
- conflictMarker(DELETE_DELETED_NODE).setNode(name, before);
- } else if (before.equals(builder.child(name).getNodeState())) {
- builder.removeNode(name);
- } else {
- conflictMarker(DELETE_CHANGED_NODE).setNode(name, before);
- }
- }
-
- private NodeBuilder conflictMarker(String name) {
- return builder.child(CONFLICT).child(name);
- }
-
- }
-
@Override
public synchronized void rebase() {
RecordId newBaseId = store.getJournalHead(journal);
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java?rev=1449653&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java Mon Feb 25 10:44:36 2013
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.state;
+
+import org.apache.jackrabbit.mk.api.MicroKernel;
+import org.apache.jackrabbit.oak.api.PropertyState;
+
+/**
+ * <code>RebaseDiff</code> implements a {@link NodeStateDiff}, which performs
+ * the conflict handling as defined in {@link MicroKernel#rebase(String, String)}
+ * on the Oak SPI state level.
+ * <p/>
+ * Intended use of this class is to re-base a branched version of the node state
+ * tree. Given below situation:
+ * <pre>
+ * + head (master)
+ * |
+ * | + branch
+ * |/
+ * + base
+ * |
+ * </pre>
+ * The current state on the master branch is <code>head</code> and a branch
+ * was created at <code>base</code>. The current state on the branch is
+ * <code>branch</code>. Re-basing <code>branch</code> to the current
+ * <code>head</code> works as follows:
+ * <pre>
+ * NodeState head = ...
+ * NodeState branch = ...
+ * NodeState base = ...
+ * NodeBuilder builder = new MemoryNodeBuilder(head);
+ * branch.compareAgainstBaseState(base, new RebaseDiff(builder));
+ * branch = builder.getNodeState();
+ * </pre>
+ * The result is:
+ * <pre>
+ * + branch
+ * /
+ * + head (master)
+ * |
+ * </pre>
+ * <p/>
+ */
+public class RebaseDiff implements NodeStateDiff {
+
+ public static final String CONFLICT = ":conflict";
+ public static final String DELETE_CHANGED_PROPERTY = "deleteChangedProperty";
+ public static final String DELETE_CHANGED_NODE = "deleteChangedNode";
+ public static final String ADD_EXISTING_PROPERTY = "addExistingProperty";
+ public static final String CHANGE_DELETED_PROPERTY = "changeDeletedProperty";
+ public static final String CHANGE_CHANGED_PROPERTY = "changeChangedProperty";
+ public static final String DELETE_DELETED_PROPERTY = "deleteDeletedProperty";
+ public static final String ADD_EXISTING_NODE = "addExistingNode";
+ public static final String CHANGE_DELETED_NODE = "changeDeletedNode";
+ public static final String DELETE_DELETED_NODE = "deleteDeletedNode";
+
+ private final NodeBuilder builder;
+
+ public RebaseDiff(NodeBuilder builder) {
+ this.builder = builder;
+ }
+
+ @Override
+ public void propertyAdded(PropertyState after) {
+ PropertyState other = builder.getProperty(after.getName());
+ if (other == null) {
+ builder.setProperty(after);
+ } else if (!other.equals(after)) {
+ conflictMarker(ADD_EXISTING_PROPERTY).setProperty(after);
+ }
+ }
+
+ @Override
+ public void propertyChanged(PropertyState before, PropertyState after) {
+ PropertyState other = builder.getProperty(before.getName());
+ if (other == null) {
+ conflictMarker(CHANGE_DELETED_PROPERTY).setProperty(after);
+ } else if (other.equals(before)) {
+ builder.setProperty(after);
+ } else if (!other.equals(after)) {
+ conflictMarker(CHANGE_CHANGED_PROPERTY).setProperty(after);
+ }
+ }
+
+ @Override
+ public void propertyDeleted(PropertyState before) {
+ PropertyState other = builder.getProperty(before.getName());
+ if (other == null) {
+ conflictMarker(DELETE_DELETED_PROPERTY).setProperty(before);
+ } else if (other.equals(before)) {
+ builder.removeProperty(before.getName());
+ } else {
+ conflictMarker(DELETE_CHANGED_PROPERTY).setProperty(before);
+ }
+ }
+
+ @Override
+ public void childNodeAdded(String name, NodeState after) {
+ if (builder.hasChildNode(name)) {
+ conflictMarker(ADD_EXISTING_NODE).setNode(name, after);
+ } else {
+ builder.setNode(name, after);
+ }
+ }
+
+ @Override
+ public void childNodeChanged(
+ String name, NodeState before, NodeState after) {
+ if (builder.hasChildNode(name)) {
+ after.compareAgainstBaseState(
+ before, new RebaseDiff(builder.child(name)));
+ } else {
+ conflictMarker(CHANGE_DELETED_NODE).setNode(name, after);
+ }
+ }
+
+ @Override
+ public void childNodeDeleted(String name, NodeState before) {
+ if (!builder.hasChildNode(name)) {
+ conflictMarker(DELETE_DELETED_NODE).setNode(name, before);
+ } else if (before.equals(builder.child(name).getNodeState())) {
+ builder.removeNode(name);
+ } else {
+ conflictMarker(DELETE_CHANGED_NODE).setNode(name, before);
+ }
+ }
+
+ private NodeBuilder conflictMarker(String name) {
+ return builder.child(CONFLICT).child(name);
+ }
+
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/RebaseDiff.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL