Author: angela
Date: Thu May  9 12:30:07 2019
New Revision: 1858994

URL: http://svn.apache.org/viewvc?rev=1858994&view=rev
Log:
OAK-8304 : VersionablePathHook: Diff.setVersionablePath never results in 
CommitFailedException

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java?rev=1858994&r1=1858993&r2=1858994&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/ReadWriteVersionManager.java
 Thu May  9 12:30:07 2019
@@ -123,8 +123,7 @@ public class ReadWriteVersionManager ext
      *                                  {@code jcr:uuid} property.
      */
     @NotNull
-    public NodeBuilder getOrCreateVersionHistory(@NotNull NodeBuilder 
versionable, @NotNull Map<String, Object> infoMap)
-            throws CommitFailedException {
+    public NodeBuilder getOrCreateVersionHistory(@NotNull NodeBuilder 
versionable, @NotNull Map<String, Object> infoMap) {
         checkNotNull(versionable);
         String vUUID = uuidFromNode(versionable);
         String relPath = getVersionHistoryPath(vUUID);
@@ -161,7 +160,7 @@ public class ReadWriteVersionManager ext
             vLabels.setProperty(JCR_PRIMARYTYPE, NT_VERSIONLABELS, Type.NAME);
 
             // jcr:rootVersion child node
-            createVersion(node, versionable);
+            createRootVersion(node, versionable);
         } else if (!versionable.hasProperty(JCR_VERSIONHISTORY)) {
             // connect versionable node with existing history
             connectHistory(node.getChildNode(JCR_ROOTVERSION),
@@ -343,6 +342,34 @@ public class ReadWriteVersionManager ext
     }
 
     /**
+     * Creates the root version in the given version history.
+     *
+     * @param vHistory the version history node.
+     * @param versionable the versionable node.
+     */
+    private void createRootVersion(@NotNull NodeBuilder vHistory,
+                                   @NotNull NodeBuilder versionable) {
+        String versionUUID = UUIDUtils.generateUUID();
+        NodeBuilder version = vHistory.child(JCR_ROOTVERSION);
+        version.setProperty(JCR_UUID, versionUUID, Type.STRING);
+        version.setProperty(JCR_PRIMARYTYPE, NT_VERSION, Type.NAME);
+        version.setProperty(JCR_CREATED, 
ISO8601.format(Calendar.getInstance()), Type.DATE);
+        version.setProperty(JCR_PREDECESSORS, Collections.emptyList(), 
Type.REFERENCES);
+        version.setProperty(JCR_SUCCESSORS, Collections.emptyList(), 
Type.REFERENCES);
+
+        // incomplete frozen node on root-version (don't call create on 
versionable-state)
+        VersionableState.fromVersion(version, vHistory, versionable, this, 
getNodeTypeManager());
+
+        // set jcr:isCheckedOut, jcr:versionHistory, jcr:baseVersion and
+        // jcr:predecessors on versionable node
+        versionable.setProperty(JCR_ISCHECKEDOUT, true, Type.BOOLEAN);
+        versionable.setProperty(JCR_VERSIONHISTORY, uuidFromNode(vHistory), 
Type.REFERENCE);
+        versionable.setProperty(JCR_BASEVERSION, versionUUID, Type.REFERENCE);
+        // set predecessors to base version for the root version
+        versionable.setProperty(JCR_PREDECESSORS, 
Collections.singletonList(versionUUID), Type.REFERENCES);
+    }
+
+    /**
      * Creates a version in the given version history. If the given version
      * history does not yet have a version, then a root version is created and
      * the versionable node is in a checked out state. Otherwise a version is
@@ -350,28 +377,22 @@ public class ReadWriteVersionManager ext
      *
      * @param vHistory the version history node.
      * @param versionable the versionable node.
-     * @return the created version (nt:version) node.
      * @throws CommitFailedException if creating the version fails. E.g. 
because
      * the versionable node contains a OPV item with ABORT.
      */
-    private NodeBuilder createVersion(@NotNull NodeBuilder vHistory,
+    private void createVersion(@NotNull NodeBuilder vHistory,
                                       @NotNull NodeBuilder versionable)
             throws IllegalArgumentException, CommitFailedException {
-        List<String> predecessors;
-        NodeBuilder version;
-        boolean isRootVersion;
         if (!vHistory.hasChildNode(JCR_ROOTVERSION)) {
-            // create root version
-            isRootVersion = true;
-            predecessors = Collections.emptyList();
-            version = vHistory.child(JCR_ROOTVERSION);
-        } else {
-            isRootVersion = false;
-            checkState(versionable.hasProperty(JCR_PREDECESSORS));
-            PropertyState state = versionable.getProperty(JCR_PREDECESSORS);
-            predecessors = 
ImmutableList.copyOf(state.getValue(Type.REFERENCES));
-            version = vHistory.child(calculateVersion(vHistory, versionable));
+            createRootVersion(vHistory, versionable);
+            return;
         }
+
+        checkState(versionable.hasProperty(JCR_PREDECESSORS));
+        PropertyState state = versionable.getProperty(JCR_PREDECESSORS);
+        List<String> predecessors = 
ImmutableList.copyOf(state.getValue(Type.REFERENCES));
+        NodeBuilder version = vHistory.child(calculateVersion(vHistory, 
versionable));
+
         String versionUUID = UUIDUtils.generateUUID();
         version.setProperty(JCR_UUID, versionUUID, Type.STRING);
         version.setProperty(JCR_PRIMARYTYPE, NT_VERSION, Type.NAME);
@@ -383,7 +404,7 @@ public class ReadWriteVersionManager ext
         for (String id : predecessors) {
             String name = 
PathUtils.getName(getIdentifierManager().getPath(id));
             NodeBuilder predecessor = vHistory.getChildNode(name);
-            PropertyState state = predecessor.getProperty(JCR_SUCCESSORS);
+            state = predecessor.getProperty(JCR_SUCCESSORS);
             if (state == null) {
                 throw new IllegalStateException("Missing " + JCR_SUCCESSORS +
                         " property on " + predecessor);
@@ -394,27 +415,16 @@ public class ReadWriteVersionManager ext
         }
 
         // jcr:frozenNode of created version
-        VersionableState versionableState = VersionableState.fromVersion(
-                version, vHistory, versionable, this, getNodeTypeManager());
-        if (!isRootVersion) {
-            versionableState.create();
-        }
+        VersionableState versionableState = 
VersionableState.fromVersion(version, vHistory, versionable, this, 
getNodeTypeManager());
+        versionableState.create();
 
         // set jcr:isCheckedOut, jcr:versionHistory, jcr:baseVersion and
         // jcr:predecessors on versionable node
-        versionable.setProperty(JCR_ISCHECKEDOUT, isRootVersion, Type.BOOLEAN);
-        versionable.setProperty(JCR_VERSIONHISTORY,
-                uuidFromNode(vHistory), Type.REFERENCE);
+        versionable.setProperty(JCR_ISCHECKEDOUT, false, Type.BOOLEAN);
+        versionable.setProperty(JCR_VERSIONHISTORY, uuidFromNode(vHistory), 
Type.REFERENCE);
         versionable.setProperty(JCR_BASEVERSION, versionUUID, Type.REFERENCE);
-        if (isRootVersion) {
-            // set predecessors to base version if this is the root version
-            predecessors = Collections.singletonList(versionUUID);
-        } else {
-            // otherwise clear predecessors for check-in
-            predecessors = Collections.emptyList();
-        }
-        versionable.setProperty(JCR_PREDECESSORS, predecessors, 
Type.REFERENCES);
-        return version;
+        // clear predecessors for check-in
+        versionable.setProperty(JCR_PREDECESSORS, Collections.emptyList(), 
Type.REFERENCES);
     }
 
     /**

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java?rev=1858994&r1=1858993&r2=1858994&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/permission/VersionablePathHook.java
 Thu May  9 12:30:07 2019
@@ -16,9 +16,6 @@
  */
 package org.apache.jackrabbit.oak.security.authorization.permission;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import com.google.common.collect.ImmutableSet;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -40,6 +37,8 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.version.VersionConstants;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Collections;
+
 import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
 
 /**
@@ -69,12 +68,7 @@ public class VersionablePathHook impleme
         ReadWriteVersionManager vMgr = new ReadWriteVersionManager(vsRoot, 
rootBuilder);
         ReadOnlyNodeTypeManager ntMgr = 
ReadOnlyNodeTypeManager.getInstance(providerCtx.getRootProvider().createReadOnlyRoot(rootBuilder.getNodeState()),
 NamePathMapper.DEFAULT);
 
-        List<CommitFailedException> exceptions = new ArrayList<>();
-        after.compareAgainstBaseState(before,
-                new Diff(vMgr, ntMgr, new Node(rootBuilder), exceptions));
-        if (!exceptions.isEmpty()) {
-            throw exceptions.get(0);
-        }
+        after.compareAgainstBaseState(before, new Diff(vMgr, ntMgr, new 
Node(rootBuilder)));
         return rootBuilder.getNodeState();
     }
 
@@ -88,16 +82,13 @@ public class VersionablePathHook impleme
         private final ReadWriteVersionManager versionManager;
         private final ReadOnlyNodeTypeManager ntMgr;
         private final Node nodeAfter;
-        private final List<CommitFailedException> exceptions;
 
         private Diff(@NotNull ReadWriteVersionManager versionManager,
                      @NotNull ReadOnlyNodeTypeManager ntMgr,
-                     @NotNull Node node,
-                     @NotNull List<CommitFailedException> exceptions) {
+                     @NotNull Node node) {
             this.versionManager = versionManager;
             this.ntMgr = ntMgr;
             this.nodeAfter = node;
-            this.exceptions = exceptions;
         }
 
         @Override
@@ -124,21 +115,12 @@ public class VersionablePathHook impleme
             }
             Node node = new Node(nodeAfter, name);
             return after.compareAgainstBaseState(
-                    before, new Diff(versionManager, ntMgr, node, exceptions));
+                    before, new Diff(versionManager, ntMgr, node));
         }
 
         private boolean setVersionablePath(@NotNull PropertyState after) {
             if (JcrConstants.JCR_VERSIONHISTORY.equals(after.getName()) && 
nodeAfter.isVersionable(ntMgr)) {
-                NodeBuilder vhBuilder;
-                try {
-                    vhBuilder = versionManager.getOrCreateVersionHistory(
-                            nodeAfter.builder, Collections.<String, 
Object>emptyMap());
-                } catch (CommitFailedException e) {
-                    exceptions.add(e);
-                    // stop further comparison
-                    return false;
-                }
-
+                NodeBuilder vhBuilder = 
versionManager.getOrCreateVersionHistory(nodeAfter.builder, 
Collections.emptyMap());
                 if (!vhBuilder.hasProperty(JcrConstants.JCR_MIXINTYPES)) {
                     vhBuilder.setProperty(
                             JcrConstants.JCR_MIXINTYPES,


Reply via email to