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 an...@apache.org on 2012/07/19 17:25:18 UTC
svn commit: r1363383 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core:
MergingNodeStateDiff.java RootImpl.java
Author: angela
Date: Thu Jul 19 15:25:17 2012
New Revision: 1363383
URL: http://svn.apache.org/viewvc?rev=1363383&view=rev
Log:
OAK-198: Refactor RootImpl#merge
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java?rev=1363383&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java Thu Jul 19 15:25:17 2012
@@ -0,0 +1,224 @@
+/*
+ * 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.core;
+
+import org.apache.jackrabbit.oak.api.ConflictHandler;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.jackrabbit.oak.api.ConflictHandler.Resolution.MERGED;
+import static org.apache.jackrabbit.oak.api.ConflictHandler.Resolution.OURS;
+
+/**
+ * MergingNodeStateDiff... TODO
+ */
+class MergingNodeStateDiff implements NodeStateDiff {
+
+ /**
+ * logger instance
+ */
+ private static final Logger log = LoggerFactory.getLogger(MergingNodeStateDiff.class);
+
+ private final TreeImpl target;
+ private final ConflictHandler conflictHandler;
+
+ private MergingNodeStateDiff(TreeImpl target, ConflictHandler conflictHandler) {
+ this.target = target;
+ this.conflictHandler = conflictHandler;
+ }
+
+ static void merge(NodeState fromState, NodeState toState, final TreeImpl target,
+ final ConflictHandler conflictHandler) {
+
+ assert target != null;
+
+ toState.compareAgainstBaseState(fromState, new MergingNodeStateDiff(target, conflictHandler));
+ }
+
+ //------------------------------------------------------< NodeStateDiff >---
+ @Override
+ public void propertyAdded(PropertyState after) {
+ ConflictHandler.Resolution resolution;
+ PropertyState p = target.getProperty(after.getName());
+
+ if (p == null) {
+ resolution = OURS;
+ }
+ else {
+ resolution = conflictHandler.addExistingProperty(target, after, p);
+ }
+
+ switch (resolution) {
+ case OURS:
+ setProperty(target, after);
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ @Override
+ public void propertyChanged(PropertyState before, PropertyState after) {
+ assert before.getName().equals(after.getName());
+
+ ConflictHandler.Resolution resolution;
+ PropertyState p = target.getProperty(after.getName());
+
+ if (p == null) {
+ resolution = conflictHandler.changeDeletedProperty(target, after);
+ }
+ else if (before.equals(p)) {
+ resolution = OURS;
+ }
+ else {
+ resolution = conflictHandler.changeChangedProperty(target, after, p);
+ }
+
+ switch (resolution) {
+ case OURS:
+ setProperty(target, after);
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ @Override
+ public void propertyDeleted(PropertyState before) {
+ ConflictHandler.Resolution resolution;
+ PropertyState p = target.getProperty(before.getName());
+
+ if (before.equals(p)) {
+ resolution = OURS;
+ }
+ else if (p == null) {
+ resolution = conflictHandler.deleteDeletedProperty(target, before);
+ }
+ else {
+ resolution = conflictHandler.deleteChangedProperty(target, p);
+ }
+
+ switch (resolution) {
+ case OURS:
+ target.removeProperty(before.getName());
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ @Override
+ public void childNodeAdded(String name, NodeState after) {
+ ConflictHandler.Resolution resolution;
+ TreeImpl n = target.getChild(name);
+
+ if (n == null) {
+ resolution = OURS;
+ }
+ else {
+ resolution = conflictHandler.addExistingNode(target, name, after, n.getNodeState());
+ }
+
+ switch (resolution) {
+ case OURS:
+ addChild(target, name, after);
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ @Override
+ public void childNodeChanged(String name, NodeState before, NodeState after) {
+ ConflictHandler.Resolution resolution;
+ TreeImpl n = target.getChild(name);
+
+ if (n == null) {
+ resolution = conflictHandler.changeDeletedNode(target, name, after);
+ }
+ else {
+ merge(before, after, n, conflictHandler);
+ resolution = MERGED;
+ }
+
+ switch (resolution) {
+ case OURS:
+ addChild(target, name, after);
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ @Override
+ public void childNodeDeleted(String name, NodeState before) {
+ ConflictHandler.Resolution resolution;
+ TreeImpl n = target.getChild(name);
+
+ if (n == null) {
+ resolution = conflictHandler.deleteDeletedNode(target, name);
+ }
+ else if (before.equals(n.getNodeState())) {
+ resolution = OURS;
+ }
+ else {
+ resolution = conflictHandler.deleteChangedNode(target, name, n.getNodeState());
+ }
+
+ switch (resolution) {
+ case OURS:
+ if (n != null) {
+ n.remove();
+ }
+ break;
+ case THEIRS:
+ case MERGED:
+ break;
+ }
+ }
+
+ //-------------------------------------------------------------<private >---
+
+ private void addChild(Tree target, String name, NodeState state) {
+ Tree child = target.addChild(name);
+ for (PropertyState property : state.getProperties()) {
+ setProperty(child, property);
+ }
+ for (ChildNodeEntry entry : state.getChildNodeEntries()) {
+ addChild(child, entry.getName(), entry.getNodeState());
+ }
+ }
+
+ private void setProperty(Tree target, PropertyState property) {
+ if (property.isArray()) {
+ target.setProperty(property.getName(), property.getValues());
+ } else {
+ target.setProperty(property.getName(), property.getValue());
+ }
+ }
+
+}
\ No newline at end of file
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java?rev=1363383&r1=1363382&r2=1363383&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java Thu Jul 19 15:25:17 2012
@@ -21,17 +21,13 @@ package org.apache.jackrabbit.oak.core;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
-
import javax.annotation.Nonnull;
import org.apache.jackrabbit.oak.api.ChangeExtractor;
import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.ConflictHandler;
-import org.apache.jackrabbit.oak.api.ConflictHandler.Resolution;
-import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.api.Tree;
-import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStateBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
@@ -40,8 +36,6 @@ import org.apache.jackrabbit.oak.spi.sta
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static org.apache.jackrabbit.oak.api.ConflictHandler.Resolution.MERGED;
-import static org.apache.jackrabbit.oak.api.ConflictHandler.Resolution.OURS;
import static org.apache.jackrabbit.oak.commons.PathUtils.elements;
import static org.apache.jackrabbit.oak.commons.PathUtils.getName;
import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
@@ -148,7 +142,7 @@ public class RootImpl implements Root {
NodeState base = getBaseState();
NodeState head = root.getNodeState();
refresh();
- merge(base, head, root, conflictHandler);
+ MergingNodeStateDiff.merge(base, head, root, conflictHandler);
}
}
@@ -261,178 +255,4 @@ public class RootImpl implements Root {
}
return child;
}
-
- private static void merge(NodeState fromState, NodeState toState, final TreeImpl target,
- final ConflictHandler conflictHandler) {
-
- assert target != null;
-
- toState.compareAgainstBaseState(fromState, new NodeStateDiff() {
- @Override
- public void propertyAdded(PropertyState after) {
- Resolution resolution;
- PropertyState p = target.getProperty(after.getName());
-
- if (p == null) {
- resolution = OURS;
- }
- else {
- resolution = conflictHandler.addExistingProperty(target, after, p);
- }
-
- switch (resolution) {
- case OURS:
- setProperty(target, after);
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- @Override
- public void propertyChanged(PropertyState before, PropertyState after) {
- assert before.getName().equals(after.getName());
-
- Resolution resolution;
- PropertyState p = target.getProperty(after.getName());
-
- if (p == null) {
- resolution = conflictHandler.changeDeletedProperty(target, after);
- }
- else if (before.equals(p)) {
- resolution = OURS;
- }
- else {
- resolution = conflictHandler.changeChangedProperty(target, after, p);
- }
-
- switch (resolution) {
- case OURS:
- setProperty(target, after);
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- @Override
- public void propertyDeleted(PropertyState before) {
- Resolution resolution;
- PropertyState p = target.getProperty(before.getName());
-
- if (before.equals(p)) {
- resolution = OURS;
- }
- else if (p == null) {
- resolution = conflictHandler.deleteDeletedProperty(target, before);
- }
- else {
- resolution = conflictHandler.deleteChangedProperty(target, p);
- }
-
- switch (resolution) {
- case OURS:
- target.removeProperty(before.getName());
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- @Override
- public void childNodeAdded(String name, NodeState after) {
- Resolution resolution;
- TreeImpl n = target.getChild(name);
-
- if (n == null) {
- resolution = OURS;
- }
- else {
- resolution = conflictHandler.addExistingNode(target, name, after, n.getNodeState());
- }
-
- switch (resolution) {
- case OURS:
- addChild(target, name, after);
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- @Override
- public void childNodeChanged(String name, NodeState before, NodeState after) {
- Resolution resolution;
- TreeImpl n = target.getChild(name);
-
- if (n == null) {
- resolution = conflictHandler.changeDeletedNode(target, name, after);
- }
- else {
- merge(before, after, n, conflictHandler);
- resolution = MERGED;
- }
-
- switch (resolution) {
- case OURS:
- addChild(target, name, after);
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- @Override
- public void childNodeDeleted(String name, NodeState before) {
- Resolution resolution;
- TreeImpl n = target.getChild(name);
-
- if (n == null) {
- resolution = conflictHandler.deleteDeletedNode(target, name);
- }
- else if (before.equals(n.getNodeState())) {
- resolution = OURS;
- }
- else {
- resolution = conflictHandler.deleteChangedNode(target, name, n.getNodeState());
- }
-
- switch (resolution) {
- case OURS:
- if (n != null) {
- n.remove();
- }
- break;
- case THEIRS:
- case MERGED:
- break;
- }
- }
-
- private void addChild(Tree target, String name, NodeState state) {
- Tree child = target.addChild(name);
- for (PropertyState property : state.getProperties()) {
- setProperty(child, property);
- }
- for (ChildNodeEntry entry : state.getChildNodeEntries()) {
- addChild(child, entry.getName(), entry.getNodeState());
- }
- }
-
- private void setProperty(Tree target, PropertyState property) {
- if (property.isArray()) {
- target.setProperty(property.getName(), property.getValues());
- } else {
- target.setProperty(property.getName(), property.getValue());
- }
- }
-
- });
- }
-
}