OAK-9343 : Missing NotNull annotations with implementations of ThreeWayConflictHandler

git-svn-id: https://svn.apache.org/repos/asf/jackrabbit/oak/trunk@1886192 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/AnnotatingConflictHandler.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/AnnotatingConflictHandler.java
index df14e1c..aebf207 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/AnnotatingConflictHandler.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/AnnotatingConflictHandler.java
@@ -41,6 +41,7 @@
 import org.apache.jackrabbit.oak.spi.state.ConflictType;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.jetbrains.annotations.NotNull;
 
 /**
  * This {@link ThreeWayConflictHandler} implementation resolves conflicts to
@@ -61,71 +62,80 @@
  */
 public class AnnotatingConflictHandler implements ThreeWayConflictHandler {
 
+    @NotNull
     @Override
-    public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+    public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, ADD_EXISTING_PROPERTY).setProperty(ours);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+    public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, CHANGE_DELETED_PROPERTY).setProperty(ours);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-            PropertyState base) {
+    public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                            @NotNull PropertyState base) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, CHANGE_CHANGED_PROPERTY).setProperty(ours);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+    public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, DELETE_CHANGED_PROPERTY).setProperty(theirs);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+    public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, DELETE_DELETED_PROPERTY).setProperty(base);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution addExistingNode(NodeBuilder parent, String name, NodeState ours, NodeState theirs) {
+    public Resolution addExistingNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState theirs) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, ADD_EXISTING_NODE).setChildNode(name, ours);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+    public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
         NodeBuilder marker = addConflictMarker(parent);
         createChild(marker, CHANGE_DELETED_NODE).setChildNode(name, ours);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+    public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
         NodeBuilder marker = addConflictMarker(parent);
         markChild(createChild(marker, DELETE_CHANGED_NODE), name);
         return Resolution.THEIRS;
     }
 
+    @NotNull
     @Override
-    public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+    public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
         NodeBuilder marker = addConflictMarker(parent);
         markChild(createChild(marker, DELETE_DELETED_NODE), name);
         return Resolution.THEIRS;
     }
 
-    private static NodeBuilder addConflictMarker(NodeBuilder parent) {
+    private static NodeBuilder addConflictMarker(@NotNull NodeBuilder parent) {
         List<String> mixins = newArrayList(parent.getNames(JCR_MIXINTYPES));
         if (mixins.add(MIX_REP_MERGE_CONFLICT)) {
             parent.setProperty(JCR_MIXINTYPES, mixins, NAMES);
@@ -135,11 +145,12 @@
         return repOurs;
     }
 
-    private static NodeBuilder createChild(NodeBuilder parent, ConflictType ct) {
+    @NotNull
+    private static NodeBuilder createChild(@NotNull NodeBuilder parent, @NotNull ConflictType ct) {
         return parent.child(ct.getName());
     }
 
-    private static void markChild(NodeBuilder parent, String name) {
+    private static void markChild(@NotNull NodeBuilder parent, @NotNull String name) {
         parent.child(name);
     }
 
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/DefaultThreeWayConflictHandler.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/DefaultThreeWayConflictHandler.java
index 4a0db3c..bd88dfd 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/DefaultThreeWayConflictHandler.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/DefaultThreeWayConflictHandler.java
@@ -60,56 +60,56 @@
 
     @NotNull
     @Override
-    public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+    public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+    public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-            PropertyState base) {
+    public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                            @NotNull PropertyState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+    public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+    public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution addExistingNode(NodeBuilder parent, String name, NodeState ours, NodeState theirs) {
+    public Resolution addExistingNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState theirs) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+    public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+    public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
         return resolution;
     }
 
     @NotNull
     @Override
-    public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+    public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
         return resolution;
     }
 
diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrLastModifiedConflictHandler.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrLastModifiedConflictHandler.java
index 78f2275..1bba8f5 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrLastModifiedConflictHandler.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/commit/JcrLastModifiedConflictHandler.java
@@ -29,6 +29,7 @@
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Conflict Handler that merges concurrent updates to
@@ -45,7 +46,7 @@
 
     @NotNull
     @Override
-    public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+    public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
         if (isModifiedOrCreated(ours.getName())) {
             merge(parent, ours, theirs);
             return Resolution.MERGED;
@@ -55,8 +56,8 @@
 
     @NotNull
     @Override
-    public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-            PropertyState base) {
+    public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                            @NotNull PropertyState base) {
         if (isModifiedOrCreated(ours.getName())) {
             merge(parent, ours, theirs);
             return Resolution.MERGED;
@@ -64,7 +65,7 @@
         return Resolution.IGNORED;
     }
 
-    private static void merge(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+    private static void merge(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
         Calendar o = parse(ours.getValue(Type.DATE));
         Calendar t = parse(theirs.getValue(Type.DATE));
         if (JCR_CREATED.equals(ours.getName())) {
@@ -82,7 +83,7 @@
         }
     }
 
-    private static boolean isModifiedOrCreated(String name) {
+    private static boolean isModifiedOrCreated(@NotNull String name) {
         return JCR_LASTMODIFIED.equals(name) || JCR_CREATED.equals(name);
     }
 }
diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/commit/ThreeWayConflictHandlerTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/commit/ThreeWayConflictHandlerTest.java
index 2a1f1bf..71492b9 100644
--- a/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/commit/ThreeWayConflictHandlerTest.java
+++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/commit/ThreeWayConflictHandlerTest.java
@@ -37,6 +37,7 @@
 import org.apache.jackrabbit.oak.spi.state.ConflictAnnotatingRebaseDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.jetbrains.annotations.NotNull;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -47,8 +48,9 @@
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
 
+            @NotNull
             @Override
-            public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+            public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
                 called.set(true);
                 assertEquals("ours", ours.getValue(STRING));
                 assertEquals("theirs", theirs.getValue(STRING));
@@ -77,8 +79,9 @@
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
 
+            @NotNull
             @Override
-            public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+            public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
                 called.set(true);
                 assertEquals("ours", ours.getValue(STRING));
                 assertEquals("base", base.getValue(STRING));
@@ -106,10 +109,10 @@
     public void changeChangedProperty() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-                    PropertyState base) {
+            public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                                    @NotNull PropertyState base) {
                 called.set(true);
                 assertEquals("ours", ours.getValue(STRING));
                 assertEquals("theirs", theirs.getValue(STRING));
@@ -138,9 +141,9 @@
     public void deleteDeletedProperty() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+            public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
                 called.set(true);
                 assertEquals("base", base.getValue(STRING));
                 return Resolution.IGNORED;
@@ -167,9 +170,9 @@
     public void deleteChangedProperty() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+            public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
                 called.set(true);
                 assertEquals("theirs", theirs.getValue(STRING));
                 assertEquals("base", base.getValue(STRING));
@@ -197,9 +200,9 @@
     public void changeDeletedNode() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+            public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
                 called.set(true);
                 assertTrue(ours.hasProperty("p"));
                 assertTrue(base.hasProperty("p"));
@@ -229,9 +232,9 @@
     public void deleteChangedNode() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+            public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
                 called.set(true);
                 assertTrue(theirs.hasProperty("p"));
                 assertTrue(base.hasProperty("p"));
@@ -261,9 +264,9 @@
     public void deleteDeletedNode() throws Exception {
         AtomicBoolean called = new AtomicBoolean(false);
         ThreeWayConflictHandler handler = new ErrorThreeWayConflictHandler() {
-
+            @NotNull
             @Override
-            public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+            public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
                 called.set(true);
                 assertTrue(base.hasProperty("p"));
                 assertEquals("base", base.getProperty("p").getValue(STRING));
@@ -338,57 +341,66 @@
 
     private static class ErrorThreeWayConflictHandler implements ThreeWayConflictHandler {
 
+        @NotNull
         @Override
-        public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+        public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+        public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-                PropertyState base) {
+        public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                                @NotNull PropertyState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+        public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+        public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution addExistingNode(NodeBuilder parent, String name, NodeState ours, NodeState theirs) {
+        public Resolution addExistingNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState theirs) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+        public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+        public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
 
+        @NotNull
         @Override
-        public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+        public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
             Assert.fail("method should not be called");
             return Resolution.IGNORED;
         }
diff --git a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeConflictHandler.java b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeConflictHandler.java
index b3503af..518d4b0 100644
--- a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeConflictHandler.java
+++ b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/CompositeConflictHandler.java
@@ -74,13 +74,14 @@
      * @param handler
      * @return this
      */
-    public CompositeConflictHandler addHandler(ThreeWayConflictHandler handler) {
+    public CompositeConflictHandler addHandler(@NotNull ThreeWayConflictHandler handler) {
         handlers.addFirst(handler);
         return this;
     }
 
+    @NotNull
     @Override
-    public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+    public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.addExistingProperty(parent, ours, theirs);
             if (resolution != IGNORED) {
@@ -91,8 +92,9 @@
                 ADD_EXISTING_PROPERTY + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+    public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.changeDeletedProperty(parent, ours, base);
             if (resolution != IGNORED) {
@@ -103,9 +105,10 @@
                 CHANGE_DELETED_PROPERTY + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-            PropertyState base) {
+    public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                            @NotNull PropertyState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.changeChangedProperty(parent, ours, theirs, base);
             if (resolution != IGNORED) {
@@ -116,8 +119,9 @@
                 CHANGE_CHANGED_PROPERTY + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+    public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.deleteDeletedProperty(parent, base);
             if (resolution != IGNORED) {
@@ -128,8 +132,9 @@
                 DELETE_DELETED_PROPERTY + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+    public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.deleteChangedProperty(parent, theirs, base);
             if (resolution != IGNORED) {
@@ -140,8 +145,9 @@
                 DELETE_CHANGED_PROPERTY + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution addExistingNode(NodeBuilder parent, String name, NodeState ours, NodeState theirs) {
+    public Resolution addExistingNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState theirs) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.addExistingNode(parent, name, ours, theirs);
             if (resolution != IGNORED) {
@@ -152,8 +158,9 @@
                 ADD_EXISTING_NODE + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+    public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.changeDeletedNode(parent, name, ours, base);
             if (resolution != IGNORED) {
@@ -164,8 +171,9 @@
                 CHANGE_DELETED_NODE + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+    public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.deleteChangedNode(parent, name, theirs, base);
             if (resolution != IGNORED) {
@@ -176,8 +184,9 @@
                 DELETE_CHANGED_NODE + " conflict");
     }
 
+    @NotNull
     @Override
-    public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+    public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
         for (ThreeWayConflictHandler handler : handlers) {
             Resolution resolution = handler.deleteDeletedNode(parent, name, base);
             if (resolution != IGNORED) {
diff --git a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/ConflictHandlers.java b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/ConflictHandlers.java
index acb0f40..f5a55e2 100644
--- a/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/ConflictHandlers.java
+++ b/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/ConflictHandlers.java
@@ -20,6 +20,8 @@
 import org.apache.jackrabbit.oak.spi.commit.ThreeWayConflictHandler.Resolution;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ConflictHandlers {
 
@@ -27,12 +29,14 @@
     }
 
     @SuppressWarnings("deprecation")
-    public static ThreeWayConflictHandler wrap(PartialConflictHandler handler) {
+    @NotNull
+    public static ThreeWayConflictHandler wrap(@NotNull PartialConflictHandler handler) {
         return new ThreeWayConflictHandlerWrapper(handler);
     }
 
     @SuppressWarnings("deprecation")
-    private static Resolution wrap(org.apache.jackrabbit.oak.spi.commit.PartialConflictHandler.Resolution r) {
+    @NotNull
+    private static Resolution wrap(@Nullable org.apache.jackrabbit.oak.spi.commit.PartialConflictHandler.Resolution r) {
         if (r == null) {
             return Resolution.IGNORED;
         }
@@ -51,53 +55,62 @@
     private static class ThreeWayConflictHandlerWrapper implements ThreeWayConflictHandler {
         private final PartialConflictHandler handler;
 
-        public ThreeWayConflictHandlerWrapper(PartialConflictHandler handler) {
+        public ThreeWayConflictHandlerWrapper(@NotNull PartialConflictHandler handler) {
             this.handler = handler;
         }
 
+        @NotNull
         @Override
-        public Resolution addExistingProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs) {
+        public Resolution addExistingProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs) {
             return wrap(handler.addExistingProperty(parent, ours, theirs));
         }
 
+        @NotNull
         @Override
-        public Resolution changeDeletedProperty(NodeBuilder parent, PropertyState ours, PropertyState base) {
+        public Resolution changeDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState base) {
             return wrap(handler.changeDeletedProperty(parent, ours));
         }
 
+        @NotNull
         @Override
-        public Resolution changeChangedProperty(NodeBuilder parent, PropertyState ours, PropertyState theirs,
-                PropertyState base) {
+        public Resolution changeChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState ours, @NotNull PropertyState theirs,
+                                                @NotNull PropertyState base) {
             return wrap(handler.changeChangedProperty(parent, ours, theirs));
         }
 
+        @NotNull
         @Override
-        public Resolution deleteDeletedProperty(NodeBuilder parent, PropertyState base) {
+        public Resolution deleteDeletedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState base) {
             return wrap(handler.deleteDeletedProperty(parent, base));
         }
 
+        @NotNull
         @Override
-        public Resolution deleteChangedProperty(NodeBuilder parent, PropertyState theirs, PropertyState base) {
+        public Resolution deleteChangedProperty(@NotNull NodeBuilder parent, @NotNull PropertyState theirs, @NotNull PropertyState base) {
             return wrap(handler.deleteChangedProperty(parent, theirs));
         }
 
+        @NotNull
         @Override
-        public Resolution addExistingNode(NodeBuilder parent, String name, NodeState ours, NodeState theirs) {
+        public Resolution addExistingNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState theirs) {
             return wrap(handler.addExistingNode(parent, name, ours, theirs));
         }
 
+        @NotNull
         @Override
-        public Resolution changeDeletedNode(NodeBuilder parent, String name, NodeState ours, NodeState base) {
+        public Resolution changeDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState ours, @NotNull NodeState base) {
             return wrap(handler.changeDeletedNode(parent, name, ours));
         }
 
+        @NotNull
         @Override
-        public Resolution deleteChangedNode(NodeBuilder parent, String name, NodeState theirs, NodeState base) {
+        public Resolution deleteChangedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState theirs, @NotNull NodeState base) {
             return wrap(handler.deleteChangedNode(parent, name, theirs));
         }
 
+        @NotNull
         @Override
-        public Resolution deleteDeletedNode(NodeBuilder parent, String name, NodeState base) {
+        public Resolution deleteDeletedNode(@NotNull NodeBuilder parent, @NotNull String name, @NotNull NodeState base) {
             return wrap(handler.deleteDeletedNode(parent, name));
         }
     }