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 md...@apache.org on 2013/02/01 15:51:54 UTC
svn commit: r1441467 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/
oak-core/src/main/java/org/apache/jackrabbit/oak/core/
oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/
oak-core/src/main/java/org/apache/jackrab...
Author: mduerig
Date: Fri Feb 1 14:51:53 2013
New Revision: 1441467
URL: http://svn.apache.org/viewvc?rev=1441467&view=rev
Log:
OAK-603: Use Microkernel.rebase in oak-core instead of reimplementing it
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java (with props)
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java (with props)
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java (with props)
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java (with props)
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerOursTest.java
- copied, changed from r1441466, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java (contents, props changed)
- copied, changed from r1441466, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/MergingNodeStateDiff.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/ConflictHandlerProvider.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/RootImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStoreBranch.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/ContentSessionTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/RootTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/TreeTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootImplTest.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/old/QueryTest.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Fri Feb 1 14:51:53 2013
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.core.ContentRepositoryImpl;
import org.apache.jackrabbit.oak.kernel.KernelNodeStore;
+import org.apache.jackrabbit.oak.plugins.commit.ConflictHook;
import org.apache.jackrabbit.oak.plugins.index.CompositeIndexHookProvider;
import org.apache.jackrabbit.oak.plugins.index.IndexHookManager;
import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
@@ -78,8 +79,6 @@ public class Oak {
// TODO: review if we really want to have the OpenSecurityProvider as default.
private SecurityProvider securityProvider = new OpenSecurityProvider();
- private ConflictHandler conflictHandler;
-
private String defaultWorkspaceName;
public Oak(MicroKernel kernel) {
@@ -226,7 +225,8 @@ public class Oak {
*/
@Nonnull
public Oak with(@Nonnull ConflictHandler conflictHandler) {
- this.conflictHandler = conflictHandler;
+ withValidatorHook();
+ commitHooks.add(new ConflictHook(conflictHandler));
return this;
}
@@ -247,7 +247,6 @@ public class Oak {
return new ContentRepositoryImpl(
store,
defaultWorkspaceName,
- conflictHandler,
CompositeQueryIndexProvider.compose(queryIndexProviders),
securityProvider);
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentRepositoryImpl.java Fri Feb 1 14:51:53 2013
@@ -23,7 +23,6 @@ import javax.security.auth.login.LoginEx
import org.apache.jackrabbit.oak.api.ContentRepository;
import org.apache.jackrabbit.oak.api.ContentSession;
-import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
@@ -44,7 +43,6 @@ public class ContentRepositoryImpl imple
private final SecurityProvider securityProvider;
private final QueryIndexProvider indexProvider;
private final NodeStore nodeStore;
- private final ConflictHandler conflictHandler;
/**
* Creates an content repository instance based on the given, already
@@ -52,19 +50,16 @@ public class ContentRepositoryImpl imple
*
* @param nodeStore the node store this repository is based upon.
* @param defaultWorkspaceName the default workspace name;
- * @param conflictHandler The conflict handler.
* @param indexProvider index provider
* @param securityProvider The configured security provider or {@code null} if
* default implementations should be used.
*/
public ContentRepositoryImpl(NodeStore nodeStore,
String defaultWorkspaceName,
- ConflictHandler conflictHandler,
QueryIndexProvider indexProvider,
SecurityProvider securityProvider) {
this.nodeStore = nodeStore;
this.defaultWorkspaceName = (defaultWorkspaceName == null) ? DEFAULT_WORKSPACE_NAME : defaultWorkspaceName;
- this.conflictHandler = conflictHandler;
this.indexProvider = indexProvider != null ? indexProvider : new CompositeQueryIndexProvider();
this.securityProvider = securityProvider;
}
@@ -88,7 +83,7 @@ public class ContentRepositoryImpl imple
AccessControlConfiguration acConfiguration = securityProvider.getAccessControlConfiguration();
return new ContentSessionImpl(loginContext, acConfiguration, workspaceName,
- nodeStore, conflictHandler, indexProvider);
+ nodeStore, indexProvider);
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/ContentSessionImpl.java Fri Feb 1 14:51:53 2013
@@ -18,13 +18,13 @@ package org.apache.jackrabbit.oak.core;
import java.io.IOException;
import java.util.Set;
+
import javax.annotation.Nonnull;
import javax.security.auth.login.LoginException;
import org.apache.jackrabbit.oak.api.AuthInfo;
import org.apache.jackrabbit.oak.api.ContentSession;
import org.apache.jackrabbit.oak.api.Root;
-import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
import org.apache.jackrabbit.oak.spi.security.authentication.LoginContext;
import org.apache.jackrabbit.oak.spi.security.authorization.AccessControlConfiguration;
@@ -45,20 +45,17 @@ class ContentSessionImpl implements Cont
private final AccessControlConfiguration accConfiguration;
private final String workspaceName;
private final NodeStore store;
- private final ConflictHandler conflictHandler;
private final QueryIndexProvider indexProvider;
private volatile boolean live = true;
public ContentSessionImpl(LoginContext loginContext,
AccessControlConfiguration accConfiguration, String workspaceName,
- NodeStore store, ConflictHandler conflictHandler,
- QueryIndexProvider indexProvider) {
+ NodeStore store, QueryIndexProvider indexProvider) {
this.loginContext = loginContext;
this.accConfiguration = accConfiguration;
this.workspaceName = workspaceName;
this.store = store;
- this.conflictHandler = conflictHandler;
this.indexProvider = indexProvider;
}
@@ -94,9 +91,6 @@ class ContentSessionImpl implements Cont
ContentSessionImpl.this.checkLive();
}
};
- if (conflictHandler != null) {
- root.setConflictHandler(conflictHandler);
- }
return root;
}
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=1441467&r1=1441466&r2=1441467&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 Fri Feb 1 14:51:53 2013
@@ -32,10 +32,8 @@ import org.apache.jackrabbit.oak.api.Com
import org.apache.jackrabbit.oak.api.QueryEngine;
import org.apache.jackrabbit.oak.api.Root;
import org.apache.jackrabbit.oak.api.TreeLocation;
-import org.apache.jackrabbit.oak.plugins.commit.DefaultConflictHandler;
import org.apache.jackrabbit.oak.plugins.index.diffindex.UUIDDiffIndexProviderWrapper;
import org.apache.jackrabbit.oak.query.QueryEngineImpl;
-import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
import org.apache.jackrabbit.oak.spi.observation.ChangeExtractor;
import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
@@ -89,8 +87,6 @@ public class RootImpl implements Root {
*/
private int modCount;
- private volatile ConflictHandler conflictHandler = DefaultConflictHandler.OURS;
-
private final QueryIndexProvider indexProvider;
/**
@@ -139,16 +135,9 @@ public class RootImpl implements Root {
RootImpl.this.checkLive();
}
};
- if (conflictHandler != null) {
- root.setConflictHandler(conflictHandler);
- }
return root;
}
- void setConflictHandler(ConflictHandler conflictHandler) {
- this.conflictHandler = conflictHandler;
- }
-
/**
* Called whenever a method on this instance or on any {@code Tree} instance
* obtained from this {@code Root} is called. This default implementation
@@ -219,10 +208,8 @@ public class RootImpl implements Root {
checkLive();
if (!store.getRoot().equals(rootTree.getBaseState())) {
purgePendingChanges();
- NodeState base = getBaseState();
- NodeState head = rootTree.getNodeState();
- refresh();
- MergingNodeStateDiff.merge(base, head, rootTree.getNodeBuilder(), conflictHandler);
+ branch.rebase();
+ rootTree = TreeImpl.createRoot(this);
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/TreeImpl.java Fri Feb 1 14:51:53 2013
@@ -51,7 +51,7 @@ public class TreeImpl implements Tree {
/**
* Internal and hidden property that contains the child order
*/
- static final String OAK_CHILD_ORDER = ":childOrder";
+ public static final String OAK_CHILD_ORDER = ":childOrder";
/**
* Underlying {@code Root} of this {@code Tree} instance
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/kernel/KernelNodeStoreBranch.java Fri Feb 1 14:51:53 2013
@@ -40,10 +40,10 @@ class KernelNodeStoreBranch implements N
private final KernelNodeStore store;
/** Root state of the base revision of this branch */
- private final NodeState base;
+ private NodeState base;
/** Revision of the base state of this branch*/
- private final String baseRevision;
+ private String baseRevision;
/** Root state of the head revision of this branch*/
private NodeState head;
@@ -149,6 +149,23 @@ class KernelNodeStoreBranch implements N
}
}
+ @Override
+ public void rebase() {
+ KernelNodeState root = store.getRoot();
+ if (headRevision == null) {
+ // Nothing was written to this branch: set new base revision
+ head = root;
+ base = root;
+ baseRevision = root.getRevision();
+ }
+ else {
+ headRevision = store.getKernel().rebase(headRevision, root.getRevision());
+ head = store.getRootState(headRevision);
+ base = root;
+ baseRevision = root.getRevision();
+ }
+ }
+
//------------------------------------------------------------< private >---
private void checkNotMerged() {
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java?rev=1441467&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java Fri Feb 1 14:51:53 2013
@@ -0,0 +1,112 @@
+package org.apache.jackrabbit.oak.plugins.commit;
+
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.core.TreeImpl;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryPropertyBuilder;
+import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.PropertyBuilder;
+
+/**
+ * This conflict handler instance takes care of properly merging conflicts
+ * occurring by concurrent reorder operations.
+ *
+ * @see TreeImpl#OAK_CHILD_ORDER
+ */
+public class ChildOrderConflictHandler extends ConflictHandlerWrapper {
+
+ public ChildOrderConflictHandler(ConflictHandler handler) {
+ super(handler);
+ }
+
+ @Override
+ public Resolution addExistingProperty(NodeBuilder parent,
+ PropertyState ours,
+ PropertyState theirs) {
+ if (isChildOrderProperty(ours)) {
+ // two sessions concurrently called orderBefore() on a Tree
+ // that was previously unordered.
+ return Resolution.THEIRS;
+ } else {
+ return handler.addExistingProperty(parent, ours, theirs);
+ }
+ }
+
+ @Override
+ public Resolution changeDeletedProperty(NodeBuilder parent,
+ PropertyState ours) {
+ if (isChildOrderProperty(ours)) {
+ // orderBefore() on trees that were deleted
+ return Resolution.THEIRS;
+ } else {
+ return handler.changeDeletedProperty(parent, ours);
+ }
+ }
+
+ @Override
+ public Resolution changeChangedProperty(NodeBuilder parent,
+ PropertyState ours,
+ PropertyState theirs) {
+ if (isChildOrderProperty(ours)) {
+ merge(parent, ours, theirs);
+ return Resolution.MERGED;
+ } else {
+ return handler.changeChangedProperty(parent, ours, theirs);
+ }
+ }
+
+ private static void merge(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+ Set<String> theirOrder = Sets.newHashSet(theirs.getValue(Type.STRINGS));
+ PropertyBuilder<String> merged = MemoryPropertyBuilder.array(Type.STRING)
+ .assignFrom(theirs);
+
+ // Append child node names from ours that are not in theirs
+ for (String ourChild : ours.getValue(Type.STRINGS)) {
+ if (!theirOrder.contains(ourChild)) {
+ merged.addValue(ourChild);
+ }
+ }
+
+ // Remove child node names of nodes that have been removed
+ for (String child : merged.getValues()) {
+ if (!parent.hasChildNode(child)) {
+ merged.removeValue(child);
+ }
+ }
+
+ parent.setProperty(merged.getPropertyState());
+ }
+
+ @Override
+ public Resolution deleteDeletedProperty(NodeBuilder parent,
+ PropertyState ours) {
+ if (isChildOrderProperty(ours)) {
+ // concurrent remove of ordered trees
+ return Resolution.THEIRS;
+ } else {
+ return handler.deleteDeletedProperty(parent, ours);
+ }
+ }
+
+ @Override
+ public Resolution deleteChangedProperty(NodeBuilder parent,
+ PropertyState theirs) {
+ if (isChildOrderProperty(theirs)) {
+ // remove trees that were reordered by another session
+ return Resolution.THEIRS;
+ } else {
+ return handler.deleteChangedProperty(parent, theirs);
+ }
+ }
+
+ //----------------------------< internal >----------------------------------
+
+ private static boolean isChildOrderProperty(PropertyState p) {
+ return TreeImpl.OAK_CHILD_ORDER.equals(p.getName());
+ }
+}
+
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ChildOrderConflictHandler.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java?rev=1441467&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java Fri Feb 1 14:51:53 2013
@@ -0,0 +1,36 @@
+package org.apache.jackrabbit.oak.plugins.commit;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+
+/**
+ * This commit hook implementation is responsible for resolving
+ * conflicts. It does so by detecting the presence of conflict
+ * markers added by the Microkernel and delegating to a
+ * {@link org.apache.jackrabbit.oak.spi.commit.ConflictHandler}
+ * for resolving the conflicts.
+ *
+ * @see org.apache.jackrabbit.mk.api.MicroKernel#rebase(String, String)
+ */
+public class ConflictHook implements CommitHook {
+ private final ConflictHandler conflictHandler;
+
+ /**
+ * Create a new instance of the conflict hook using the
+ * passed conflict handler for resolving conflicts.
+ * @param conflictHandler a conflict handler
+ */
+ public ConflictHook(ConflictHandler conflictHandler) {
+ this.conflictHandler = conflictHandler;
+ }
+
+ @Nonnull
+ @Override
+ public NodeState processCommit(NodeState before, NodeState after) throws CommitFailedException {
+ return MergingNodeStateDiff.merge(before, after, conflictHandler);
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/ConflictHook.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java?rev=1441467&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java Fri Feb 1 14:51:53 2013
@@ -0,0 +1,37 @@
+/*
+ * 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.plugins.commit;
+
+import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
+
+/**
+ * Utility class providing conflict handlers used for JCR.
+ */
+public class JcrConflictHandler {
+
+ /**
+ * The conflict handler is a composite of {@link ChildOrderConflictHandler}
+ * and {@link AnnotatingConflictHandler}.
+ */
+ public static final ConflictHandler JCR_CONFLICT_HANDLER =
+ new ChildOrderConflictHandler(new AnnotatingConflictHandler());
+
+ private JcrConflictHandler() {
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrConflictHandler.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: 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=1441467&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java Fri Feb 1 14:51:53 2013
@@ -0,0 +1,253 @@
+/*
+ * 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.plugins.commit;
+
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.core.TreeImpl;
+import org.apache.jackrabbit.oak.plugins.memory.MemoryPropertyBuilder;
+import org.apache.jackrabbit.oak.spi.commit.ConflictHandler;
+import org.apache.jackrabbit.oak.spi.commit.ConflictHandler.Resolution;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
+import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.PropertyBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * MergingNodeStateDiff... TODO
+ */
+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;
+
+ private MergingNodeStateDiff(NodeState parent, NodeBuilder target, ConflictHandler conflictHandler) {
+ this.parent = parent;
+ this.target = target;
+ this.conflictHandler = conflictHandler;
+ }
+
+ static NodeState merge(NodeState fromState, NodeState toState, ConflictHandler conflictHandler) {
+ return merge(fromState, toState, toState.builder(), conflictHandler);
+ }
+
+ private static NodeState merge(NodeState fromState, NodeState toState, NodeBuilder target,
+ ConflictHandler conflictHandler) {
+ toState.compareAgainstBaseState(fromState,
+ new MergingNodeStateDiff(toState, target, conflictHandler));
+
+ return target.getNodeState();
+ }
+
+ //------------------------------------------------------< NodeStateDiff >---
+
+ @Override
+ public void childNodeAdded(String name, NodeState after) {
+ if (CONFLICT.equals(name)) {
+ for (ChildNodeEntry conflict : after.getChildNodeEntries()) {
+ resolveConflict(conflict.getName(), conflict.getNodeState());
+ }
+
+ target.removeNode(CONFLICT);
+ }
+ }
+
+ @Override
+ public void childNodeChanged(String name, NodeState before, NodeState after) {
+ merge(before, after, target.child(name), conflictHandler);
+ }
+
+ //------------------------------------------------------------< private >---
+
+ private void resolveConflict(String conflictName, NodeState conflictInfo) {
+ PropertyConflictHandler propertyConflictHandler = propertyConflictHandlers.get(conflictName);
+ if (propertyConflictHandler != null) {
+ for (PropertyState ours : conflictInfo.getProperties()) {
+ PropertyState theirs = parent.getProperty(ours.getName());
+ Resolution resolution = propertyConflictHandler.resolve(ours, theirs);
+ applyResolution(resolution, conflictName, ours);
+ }
+ }
+ else {
+ NodeConflictHandler nodeConflictHandler = nodeConflictHandlers.get(conflictName);
+ if (nodeConflictHandler != null) {
+ for (ChildNodeEntry oursCNE : conflictInfo.getChildNodeEntries()) {
+ String name = oursCNE.getName();
+ NodeState ours = oursCNE.getNodeState();
+ NodeState theirs = parent.getChildNode(name);
+ Resolution resolution = nodeConflictHandler.resolve(name, ours, theirs);
+ applyResolution(resolution, conflictName, name, ours);
+ }
+ }
+ else {
+ LOG.warn("Ignoring unknown conflict '" + conflictName + '\'');
+ }
+ }
+
+ NodeBuilder conflictMarker = getConflictMarker(conflictName);
+ if (conflictMarker != null) {
+ assert conflictMarker.getChildNodeCount() == 0;
+ }
+ }
+
+ private void applyResolution(Resolution resolution, String conflictName, PropertyState ours) {
+ String name = ours.getName();
+ NodeBuilder conflictMarker = getConflictMarker(conflictName);
+ if (resolution == Resolution.OURS) {
+ if (DELETE_CHANGED_PROPERTY.equals(conflictName)) {
+ target.removeProperty(name);
+ }
+ else {
+ target.setProperty(ours);
+ }
+
+ }
+ conflictMarker.removeProperty(name);
+ }
+
+ private void applyResolution(Resolution resolution, String conflictName, String name, NodeState ours) {
+ NodeBuilder conflictMarker = getConflictMarker(conflictName);
+ if (resolution == Resolution.OURS) {
+ if (DELETE_CHANGED_NODE.equals(conflictName)) {
+ removeChild(target, name);
+ }
+ else {
+ addChild(target, name, ours);
+ }
+ }
+ conflictMarker.removeNode(name);
+ }
+
+ private NodeBuilder getConflictMarker(String conflictName) {
+ if (target.hasChildNode(CONFLICT)) {
+ NodeBuilder conflict = target.child(CONFLICT);
+ if (conflict.hasChildNode(conflictName)) {
+ return conflict.child(conflictName);
+ }
+ }
+
+ return null;
+ }
+
+ private interface PropertyConflictHandler {
+ Resolution resolve(PropertyState ours, PropertyState theirs);
+ }
+
+ private interface NodeConflictHandler {
+ Resolution resolve(String name, NodeState ours, NodeState theirs);
+ }
+
+ private final Map<String, PropertyConflictHandler> propertyConflictHandlers = ImmutableMap.of(
+ ADD_EXISTING_PROPERTY, new PropertyConflictHandler() {
+ @Override
+ public Resolution resolve(PropertyState ours, PropertyState theirs) {
+ return conflictHandler.addExistingProperty(target, ours, theirs);
+ }
+ },
+ CHANGE_DELETED_PROPERTY, new PropertyConflictHandler() {
+ @Override
+ public Resolution resolve(PropertyState ours, PropertyState theirs) {
+ return conflictHandler.changeDeletedProperty(target, ours);
+ }
+ },
+ CHANGE_CHANGED_PROPERTY, new PropertyConflictHandler() {
+ @Override
+ public Resolution resolve(PropertyState ours, PropertyState theirs) {
+ return conflictHandler.changeChangedProperty(target, ours, theirs);
+ }
+ },
+ DELETE_DELETED_PROPERTY, new PropertyConflictHandler() {
+ @Override
+ public Resolution resolve(PropertyState ours, PropertyState theirs) {
+ return conflictHandler.deleteDeletedProperty(target, ours);
+ }
+ },
+ DELETE_CHANGED_PROPERTY, new PropertyConflictHandler() {
+ @Override
+ public Resolution resolve(PropertyState ours, PropertyState theirs) {
+ return conflictHandler.deleteChangedProperty(target, theirs);
+ }
+ }
+ );
+
+ private final Map<String, NodeConflictHandler> nodeConflictHandlers = ImmutableMap.of(
+ ADD_EXISTING_NODE, new NodeConflictHandler() {
+ @Override
+ public Resolution resolve(String name, NodeState ours, NodeState theirs) {
+ return conflictHandler.addExistingNode(target, name, ours, theirs);
+ }
+ },
+ CHANGE_DELETED_NODE, new NodeConflictHandler() {
+ @Override
+ public Resolution resolve(String name, NodeState ours, NodeState theirs) {
+ return conflictHandler.changeDeletedNode(target, name, ours);
+ }
+ },
+ DELETE_CHANGED_NODE, new NodeConflictHandler() {
+ @Override
+ public Resolution resolve(String name, NodeState ours, NodeState theirs) {
+ return conflictHandler.deleteChangedNode(target, name, theirs);
+ }
+ },
+ DELETE_DELETED_NODE, new NodeConflictHandler() {
+ @Override
+ public Resolution resolve(String name, NodeState ours, NodeState theirs) {
+ return conflictHandler.deleteDeletedNode(target, name);
+ }
+ }
+ );
+
+ private static void addChild(NodeBuilder target, String name, NodeState state) {
+ target.setNode(name, state);
+ PropertyState childOrder = target.getProperty(TreeImpl.OAK_CHILD_ORDER);
+ if (childOrder != null) {
+ PropertyBuilder<String> builder = MemoryPropertyBuilder.copy(Type.STRING, childOrder);
+ builder.addValue(name);
+ target.setProperty(builder.getPropertyState());
+ }
+ }
+
+ private static void removeChild(NodeBuilder target, String name) {
+ target.removeNode(name);
+ PropertyState childOrder = target.getProperty(TreeImpl.OAK_CHILD_ORDER);
+ if (childOrder != null) {
+ PropertyBuilder<String> builder = MemoryPropertyBuilder.copy(Type.STRING, childOrder);
+ builder.removeValue(name);
+ target.setProperty(builder.getPropertyState());
+ }
+ }
+
+}
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/MergingNodeStateDiff.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/MemoryNodeStore.java Fri Feb 1 14:51:53 2013
@@ -103,6 +103,10 @@ public class MemoryNodeStore implements
throw new UnsupportedOperationException();
}
+ @Override
+ public void rebase() {
+ throw new UnsupportedOperationException();
+ }
}
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStoreBranch.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStoreBranch.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStoreBranch.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStoreBranch.java Fri Feb 1 14:51:53 2013
@@ -82,5 +82,11 @@ public interface NodeStoreBranch {
@Nonnull
NodeState merge() throws CommitFailedException;
+ /**
+ * Rebase the changes from this branch on top of the current
+ * root.
+ */
+ void rebase();
+
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/ContentSessionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/ContentSessionTest.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/ContentSessionTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/ContentSessionTest.java Fri Feb 1 14:51:53 2013
@@ -24,8 +24,6 @@ import javax.jcr.NoSuchWorkspaceExceptio
import javax.security.auth.login.LoginException;
import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.plugins.commit.AnnotatingConflictHandler;
-import org.apache.jackrabbit.oak.plugins.commit.ConflictValidator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -36,10 +34,7 @@ public class ContentSessionTest {
@Before
public void setUp() {
- repository = new Oak()
- .with(new ConflictValidator())
- .with(new AnnotatingConflictHandler())
- .createContentRepository();
+ repository = new Oak().createContentRepository();
}
@After
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/RootTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/RootTest.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/RootTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/RootTest.java Fri Feb 1 14:51:53 2013
@@ -19,8 +19,8 @@
package org.apache.jackrabbit.oak.api;
import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.plugins.commit.AnnotatingConflictHandler;
import org.apache.jackrabbit.oak.plugins.commit.ConflictValidator;
+import org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -37,8 +37,8 @@ public class RootTest {
@Before
public void setUp() {
repository = new Oak()
+ .with(JcrConflictHandler.JCR_CONFLICT_HANDLER)
.with(new ConflictValidator())
- .with(new AnnotatingConflictHandler())
.createContentRepository();
}
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/TreeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/TreeTest.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/TreeTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/api/TreeTest.java Fri Feb 1 14:51:53 2013
@@ -20,8 +20,10 @@ package org.apache.jackrabbit.oak.api;
import java.util.Set;
+import com.google.common.collect.Sets;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.plugins.commit.AnnotatingConflictHandler;
+import org.apache.jackrabbit.oak.plugins.commit.ChildOrderConflictHandler;
import org.apache.jackrabbit.oak.plugins.commit.ConflictValidator;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -29,8 +31,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import com.google.common.collect.Sets;
-
import static org.apache.jackrabbit.oak.OakAssert.assertSequence;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -46,8 +46,7 @@ public class TreeTest {
@Before
public void setUp() {
repository = new Oak()
- .with(new ConflictValidator())
- .with(new AnnotatingConflictHandler() {
+ .with(new ChildOrderConflictHandler(new AnnotatingConflictHandler()) {
/**
* Allow deleting changed node.
@@ -55,11 +54,12 @@ public class TreeTest {
*/
@Override
public Resolution deleteChangedNode(NodeBuilder parent,
- String name,
- NodeState theirs) {
+ String name,
+ NodeState theirs) {
return Resolution.OURS;
}
})
+ .with(new ConflictValidator())
.createContentRepository();
}
Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerOursTest.java (from r1441466, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerOursTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerOursTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java&r1=1441466&r2=1441467&rev=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerOursTest.java Fri Feb 1 14:51:53 2013
@@ -34,17 +34,19 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-public class DefaultConflictHandlerTest {
+public class DefaultConflictHandlerOursTest {
- private static final String OUR_VALUE = "foo";
- private static final String THEIR_VALUE = "bar";
+ private static final String OUR_VALUE = "our value";
+ private static final String THEIR_VALUE = "their value";
private RootImpl ourRoot;
private Root theirRoot;
@Before
public void setUp() throws CommitFailedException {
- ContentSession session = new Oak().createContentSession();
+ ContentSession session = new Oak()
+ .with(DefaultConflictHandler.OURS)
+ .createContentSession();
// Add test content
Root root = session.getLatestRoot();
@@ -68,9 +70,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testAddExistingPropertyOurs() throws CommitFailedException {
+ public void testAddExistingProperties() throws CommitFailedException {
theirRoot.getTree("/").setProperty("p", THEIR_VALUE);
+ theirRoot.getTree("/").setProperty("q", THEIR_VALUE);
ourRoot.getTree("/").setProperty("p", OUR_VALUE);
+ ourRoot.getTree("/").setProperty("q", OUR_VALUE);
theirRoot.commit();
ourRoot.commit();
@@ -78,10 +82,14 @@ public class DefaultConflictHandlerTest
PropertyState p = ourRoot.getTree("/").getProperty("p");
assertNotNull(p);
assertEquals(OUR_VALUE, p.getValue(STRING));
+
+ PropertyState q = ourRoot.getTree("/").getProperty("q");
+ assertNotNull(q);
+ assertEquals(OUR_VALUE, p.getValue(STRING));
}
@Test
- public void testChangeDeletedPropertyOurs() throws CommitFailedException {
+ public void testChangeDeletedProperty() throws CommitFailedException {
theirRoot.getTree("/").removeProperty("a");
ourRoot.getTree("/").setProperty("a", OUR_VALUE);
@@ -94,7 +102,7 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testChangeChangedPropertyOurs() throws CommitFailedException {
+ public void testChangeChangedProperty() throws CommitFailedException {
theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
ourRoot.getTree("/").setProperty("a", OUR_VALUE);
@@ -107,7 +115,7 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testDeleteChangedPropertyOurs() throws CommitFailedException {
+ public void testDeleteChangedProperty() throws CommitFailedException {
theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
ourRoot.getTree("/").removeProperty("a");
@@ -119,7 +127,7 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testAddExistingNodeOurs() throws CommitFailedException {
+ public void testAddExistingNode() throws CommitFailedException {
theirRoot.getTree("/").addChild("n").setProperty("p", THEIR_VALUE);
ourRoot.getTree("/").addChild("n").setProperty("p", OUR_VALUE);
@@ -132,7 +140,7 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testChangeDeletedNodeOurs() throws CommitFailedException {
+ public void testChangeDeletedNode() throws CommitFailedException {
theirRoot.getTree("/x").remove();
ourRoot.getTree("/x").setProperty("p", OUR_VALUE);
@@ -145,7 +153,7 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testDeleteChangedNodeOurs() throws CommitFailedException {
+ public void testDeleteChangedNode() throws CommitFailedException {
theirRoot.getTree("/x").setProperty("p", THEIR_VALUE);
ourRoot.getTree("/x").remove();
@@ -156,100 +164,4 @@ public class DefaultConflictHandlerTest
assertNull(n);
}
- @Test
- public void testAddExistingPropertyTheirs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("p");
- assertNotNull(p);
- assertEquals(THEIR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testChangeDeletedPropertyTheirs() throws CommitFailedException {
- theirRoot.getTree("/").removeProperty("a");
- ourRoot.getTree("/").setProperty("a", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNull(p);
- }
-
- @Test
- public void testChangeChangedPropertyTheirs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
- ourRoot.getTree("/").setProperty("a", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNotNull(p);
- assertEquals(THEIR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testDeleteChangedPropertyTheirs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
- ourRoot.getTree("/").removeProperty("a");
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNotNull(p);
- assertEquals(THEIR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testAddExistingNodeTheirs() throws CommitFailedException {
- theirRoot.getTree("/").addChild("n").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/").addChild("n").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/n");
- assertNotNull(n);
- assertEquals(THEIR_VALUE, n.getProperty("p").getValue(STRING));
- }
-
- @Test
- public void testChangeDeletedNodeTheirs() throws CommitFailedException {
- theirRoot.getTree("/x").remove();
- ourRoot.getTree("/x").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/x");
- assertNull(n);
- }
-
- @Test
- public void testDeleteChangedNodeTheirs() throws CommitFailedException {
- theirRoot.getTree("/x").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/x").remove();
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/x");
- assertNotNull(n);
- assertEquals(THEIR_VALUE, n.getProperty("p").getValue(STRING));
- }
-
}
Copied: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java (from r1441466, jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java?p2=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java&p1=jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java&r1=1441466&r2=1441467&rev=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java Fri Feb 1 14:51:53 2013
@@ -34,17 +34,19 @@ import static org.junit.Assert.assertEqu
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-public class DefaultConflictHandlerTest {
+public class DefaultConflictHandlerTheirsTest {
- private static final String OUR_VALUE = "foo";
- private static final String THEIR_VALUE = "bar";
+ private static final String OUR_VALUE = "our value";
+ private static final String THEIR_VALUE = "their value";
private RootImpl ourRoot;
private Root theirRoot;
@Before
public void setUp() throws CommitFailedException {
- ContentSession session = new Oak().createContentSession();
+ ContentSession session = new Oak()
+ .with(DefaultConflictHandler.THEIRS)
+ .createContentSession();
// Add test content
Root root = session.getLatestRoot();
@@ -68,115 +70,30 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testAddExistingPropertyOurs() throws CommitFailedException {
+ public void testAddExistingProperties() throws CommitFailedException {
theirRoot.getTree("/").setProperty("p", THEIR_VALUE);
+ theirRoot.getTree("/").setProperty("q", THEIR_VALUE);
ourRoot.getTree("/").setProperty("p", OUR_VALUE);
+ ourRoot.getTree("/").setProperty("q", OUR_VALUE);
theirRoot.commit();
ourRoot.commit();
PropertyState p = ourRoot.getTree("/").getProperty("p");
assertNotNull(p);
- assertEquals(OUR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testChangeDeletedPropertyOurs() throws CommitFailedException {
- theirRoot.getTree("/").removeProperty("a");
- ourRoot.getTree("/").setProperty("a", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNotNull(p);
- assertEquals(OUR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testChangeChangedPropertyOurs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
- ourRoot.getTree("/").setProperty("a", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNotNull(p);
- assertEquals(OUR_VALUE, p.getValue(STRING));
- }
-
- @Test
- public void testDeleteChangedPropertyOurs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
- ourRoot.getTree("/").removeProperty("a");
-
- theirRoot.commit();
- ourRoot.commit();
-
- PropertyState p = ourRoot.getTree("/").getProperty("a");
- assertNull(p);
- }
-
- @Test
- public void testAddExistingNodeOurs() throws CommitFailedException {
- theirRoot.getTree("/").addChild("n").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/").addChild("n").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/n");
- assertNotNull(n);
- assertEquals(OUR_VALUE, n.getProperty("p").getValue(STRING));
- }
-
- @Test
- public void testChangeDeletedNodeOurs() throws CommitFailedException {
- theirRoot.getTree("/x").remove();
- ourRoot.getTree("/x").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/x");
- assertNotNull(n);
- assertEquals(OUR_VALUE, n.getProperty("p").getValue(STRING));
- }
-
- @Test
- public void testDeleteChangedNodeOurs() throws CommitFailedException {
- theirRoot.getTree("/x").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/x").remove();
-
- theirRoot.commit();
- ourRoot.commit();
-
- Tree n = ourRoot.getTree("/x");
- assertNull(n);
- }
-
- @Test
- public void testAddExistingPropertyTheirs() throws CommitFailedException {
- theirRoot.getTree("/").setProperty("p", THEIR_VALUE);
- ourRoot.getTree("/").setProperty("p", OUR_VALUE);
-
- theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
- ourRoot.commit();
+ assertEquals(THEIR_VALUE, p.getValue(STRING));
- PropertyState p = ourRoot.getTree("/").getProperty("p");
- assertNotNull(p);
+ PropertyState q = ourRoot.getTree("/").getProperty("q");
+ assertNotNull(q);
assertEquals(THEIR_VALUE, p.getValue(STRING));
}
@Test
- public void testChangeDeletedPropertyTheirs() throws CommitFailedException {
+ public void testChangeDeletedProperty() throws CommitFailedException {
theirRoot.getTree("/").removeProperty("a");
ourRoot.getTree("/").setProperty("a", OUR_VALUE);
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
PropertyState p = ourRoot.getTree("/").getProperty("a");
@@ -184,12 +101,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testChangeChangedPropertyTheirs() throws CommitFailedException {
+ public void testChangeChangedProperty() throws CommitFailedException {
theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
ourRoot.getTree("/").setProperty("a", OUR_VALUE);
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
PropertyState p = ourRoot.getTree("/").getProperty("a");
@@ -198,12 +114,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testDeleteChangedPropertyTheirs() throws CommitFailedException {
+ public void testDeleteChangedProperty() throws CommitFailedException {
theirRoot.getTree("/").setProperty("a", THEIR_VALUE);
ourRoot.getTree("/").removeProperty("a");
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
PropertyState p = ourRoot.getTree("/").getProperty("a");
@@ -212,12 +127,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testAddExistingNodeTheirs() throws CommitFailedException {
+ public void testAddExistingNode() throws CommitFailedException {
theirRoot.getTree("/").addChild("n").setProperty("p", THEIR_VALUE);
ourRoot.getTree("/").addChild("n").setProperty("p", OUR_VALUE);
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
Tree n = ourRoot.getTree("/n");
@@ -226,12 +140,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testChangeDeletedNodeTheirs() throws CommitFailedException {
+ public void testChangeDeletedNode() throws CommitFailedException {
theirRoot.getTree("/x").remove();
ourRoot.getTree("/x").setProperty("p", OUR_VALUE);
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
Tree n = ourRoot.getTree("/x");
@@ -239,12 +152,11 @@ public class DefaultConflictHandlerTest
}
@Test
- public void testDeleteChangedNodeTheirs() throws CommitFailedException {
+ public void testDeleteChangedNode() throws CommitFailedException {
theirRoot.getTree("/x").setProperty("p", THEIR_VALUE);
ourRoot.getTree("/x").remove();
theirRoot.commit();
- ourRoot.setConflictHandler(DefaultConflictHandler.THEIRS);
ourRoot.commit();
Tree n = ourRoot.getTree("/x");
Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/DefaultConflictHandlerTheirsTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootImplTest.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootImplTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/core/RootImplTest.java Fri Feb 1 14:51:53 2013
@@ -221,6 +221,132 @@ public class RootImplTest {
}
@Test
+ public void rebaseWithAddNode() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.getTree("/").addChild("child");
+ root1.rebase();
+
+ root2.getTree("/").addChild("child");
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithRemoveNode() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.getTree("/").getChild("x").remove();
+ root1.rebase();
+
+ root2.getTree("/").getChild("x").remove();
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithAddProperty() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.getTree("/").setProperty("new", 42);
+ root1.rebase();
+
+ root2.getTree("/").setProperty("new", 42);
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithRemoveProperty() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.getTree("/").removeProperty("a");
+ root1.rebase();
+
+ root2.getTree("/").removeProperty("a");
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithSetProperty() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.getTree("/").setProperty("a", 42);
+ root1.rebase();
+
+ root2.getTree("/").setProperty("a", 42);
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithMove() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.move("/x", "/y/x-moved");
+ root1.rebase();
+
+ root2.move("/x", "/y/x-moved");
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
+ public void rebaseWithCopy() throws CommitFailedException {
+ Root root1 = session.getLatestRoot();
+ Root root2 = session.getLatestRoot();
+
+ checkEqual(root1.getTree("/"), root2.getTree("/"));
+
+ root2.getTree("/").addChild("one").addChild("two").addChild("three")
+ .setProperty("p1", "V1");
+ root2.commit();
+
+ root1.copy("/x", "/y/x-copied");
+ root1.rebase();
+
+ root2.copy("/x", "/y/x-copied");
+ checkEqual(root1.getTree("/"), (root2.getTree("/")));
+ }
+
+ @Test
public void testGetLatest() throws Exception {
RootImpl root = (RootImpl) session.getLatestRoot();
Root root2 = root.getLatest();
Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/old/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/old/QueryTest.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/old/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/index/old/QueryTest.java Fri Feb 1 14:51:53 2013
@@ -13,8 +13,6 @@
*/
package org.apache.jackrabbit.oak.plugins.index.old;
-import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
-
import org.apache.jackrabbit.mk.core.MicroKernelImpl;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.api.ContentRepository;
@@ -23,8 +21,11 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.query.AbstractQueryTest;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
+import org.junit.Ignore;
import org.junit.Test;
+import static org.apache.jackrabbit.oak.plugins.index.IndexConstants.INDEX_DEFINITIONS_NAME;
+
/**
* Test the query feature.
*/
@@ -46,6 +47,7 @@ public class QueryTest extends AbstractQ
}
@Test
+ @Ignore // TODO not implemented IndexWrapper.rebase
public void sql2Explain() throws Exception {
test("sql2_explain.txt");
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/Jcr.java Fri Feb 1 14:51:53 2013
@@ -18,13 +18,14 @@ package org.apache.jackrabbit.oak.jcr;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
+
import javax.annotation.Nonnull;
import javax.jcr.Repository;
import org.apache.jackrabbit.mk.api.MicroKernel;
import org.apache.jackrabbit.oak.Oak;
-import org.apache.jackrabbit.oak.plugins.commit.AnnotatingConflictHandler;
import org.apache.jackrabbit.oak.plugins.commit.ConflictValidatorProvider;
+import org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler;
import org.apache.jackrabbit.oak.plugins.index.IndexHookProvider;
import org.apache.jackrabbit.oak.plugins.index.nodetype.NodeTypeIndexProvider;
import org.apache.jackrabbit.oak.plugins.index.p2.Property2IndexHookProvider;
@@ -61,6 +62,7 @@ public class Jcr {
with(new InitialContent());
+ with(JcrConflictHandler.JCR_CONFLICT_HANDLER);
with(new DefaultTypeEditor());
with(new VersionHook());
@@ -73,7 +75,6 @@ public class Jcr {
with(new ConflictValidatorProvider());
with(new Property2IndexHookProvider());
- with(new AnnotatingConflictHandler());
with(new Property2IndexProvider());
with(new NodeTypeIndexProvider());
Modified: jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java?rev=1441467&r1=1441466&r2=1441467&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java (original)
+++ jackrabbit/oak/trunk/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Main.java Fri Feb 1 14:51:53 2013
@@ -29,6 +29,7 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.http.OakServlet;
import org.apache.jackrabbit.oak.jcr.RepositoryImpl;
import org.apache.jackrabbit.oak.plugins.commit.ConflictValidatorProvider;
+import org.apache.jackrabbit.oak.plugins.commit.JcrConflictHandler;
import org.apache.jackrabbit.oak.plugins.index.CompositeIndexHookProvider;
import org.apache.jackrabbit.oak.plugins.index.IndexHookManager;
import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexHookProvider;
@@ -159,6 +160,7 @@ public class Main {
// TODO: review usage of opensecurity provider (using default will cause BasicServerTest to fail. usage of a:a credentials)
SecurityProvider securityProvider = new OpenSecurityProvider();
ContentRepository repository = new Oak(kernel)
+ .with(JcrConflictHandler.JCR_CONFLICT_HANDLER)
.with(buildDefaultCommitHook())
.with(securityProvider)
.createContentRepository();
@@ -213,11 +215,11 @@ public class Main {
private static ValidatorProvider createDefaultValidatorProvider() {
return new CompositeValidatorProvider(
+ new ConflictValidatorProvider(),
new NameValidatorProvider(),
new NamespaceValidatorProvider(),
new TypeValidatorProvider(),
- new RegistrationValidatorProvider(),
- new ConflictValidatorProvider());
+ new RegistrationValidatorProvider());
}
}