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 re...@apache.org on 2024/01/14 16:52:28 UTC

(jackrabbit-oak) branch 1.22 updated: Issue/oak 9459b (#1183)

This is an automated email from the ASF dual-hosted git repository.

reschke pushed a commit to branch 1.22
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/1.22 by this push:
     new aad42d49e7 Issue/oak 9459b (#1183)
aad42d49e7 is described below

commit aad42d49e770a8ccf86a8666aa7e2b1f1f27b0a2
Author: mbaedke <ma...@gmail.com>
AuthorDate: Fri Oct 27 12:09:21 2023 +0200

    Issue/oak 9459b (#1183)
    
    * OAK-9459: ConstraintViolationException in VersionManagerImplRestore when target node has a property definition unknown by the frozen node
    
    Fixed by retrieving the property definitions before setting the node types.
    
    * OAK-9459: ConstraintViolationException in VersionManagerImplRestore when target node has a property definition unknown by the frozen node
    
    Coding style improvements.
    
    * proposed changes for issue/OAK-9459
    
    ---------
    
    Co-authored-by: Julian Reschke <re...@apache.org>
---
 .../oak/plugins/version/VersionableState.java      | 84 ++++++++++++++--------
 oak-jcr/pom.xml                                    |  1 -
 2 files changed, 54 insertions(+), 31 deletions(-)

diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
index d95fc1a9ee..553a43ed68 100644
--- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
+++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionableState.java
@@ -44,8 +44,10 @@ import static org.apache.jackrabbit.oak.plugins.version.Utils.primaryTypeOf;
 import static org.apache.jackrabbit.oak.plugins.version.Utils.uuidFromNode;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.jcr.RepositoryException;
@@ -285,43 +287,65 @@ class VersionableState {
                                @NotNull NodeBuilder dest,
                                @NotNull VersionSelector selector)
             throws RepositoryException, CommitFailedException {
-        // 15.7.2 Restoring Type and Identifier
-        restoreFrozenTypeAndUUID(frozen, dest);
-        // 15.7.3 Restoring Properties
-        for (PropertyState p : frozen.getProperties()) {
-            if (BASIC_FROZEN_PROPERTIES.contains(p.getName())) {
-                // ignore basic frozen properties we restored earlier
-                continue;
-            }
-            int action = getOPV(dest, p);
-            if (action == COPY || action == VERSION) {
-                dest.setProperty(p);
-            }
+
+        // OAK-9459: if the NodeState is not empty, retrieve OPVs before restoring types to avoid constraint violations
+        boolean frozenTypeRestored = false;
+        if (!dest.hasProperty(JCR_PRIMARYTYPE)) {
+            // empty NodeState
+            // 15.7.2 Restoring Type and Identifier
+            restoreFrozenTypeAndUUID(frozen, dest);
+            frozenTypeRestored = true;
         }
+
+        Map<PropertyState, Integer> opvs = new HashMap<>();
         for (PropertyState p : dest.getProperties()) {
             String propName = p.getName();
-            if (BASIC_PROPERTIES.contains(propName)) {
-                continue;
-            }
-            if (frozen.hasProperty(propName)) {
-                continue;
+            if (!BASIC_PROPERTIES.contains(propName) && !frozen.hasProperty(propName)) {
+                opvs.put(p, getOPV(dest, p));
             }
-            int action = getOPV(dest, p);
-            if (action == COPY || action == VERSION || action == ABORT) {
-                dest.removeProperty(propName);
-            } else if (action == IGNORE) {
-                // no action
-            } else if (action == INITIALIZE) {
-                resetToDefaultValue(dest, p);
-            } else if (action == COMPUTE) {
-                // only COMPUTE property definitions currently are
-                // jcr:primaryType and jcr:mixinTypes
-                // do nothing for now
-                if (!(JCR_PRIMARYTYPE.equals(propName) || JCR_MIXINTYPES.equals(propName))) {
-                    log.warn("OPV.COMPUTE not implemented for restoring property: " + propName);
+        }
+
+        if (!frozenTypeRestored) {
+            // 15.7.2 Restoring Type and Identifier
+            restoreFrozenTypeAndUUID(frozen, dest);
+        }
+
+        // 15.7.3 Restoring Properties
+        for (PropertyState p : frozen.getProperties()) {
+            // ignore basic frozen properties we restored earlier
+            if (!BASIC_FROZEN_PROPERTIES.contains(p.getName())) {
+                int action = getOPV(dest, p);
+                if (action == COPY || action == VERSION) {
+                    dest.setProperty(p);
                 }
             }
         }
+
+        for (Map.Entry<PropertyState, Integer> entry : opvs.entrySet()) {
+            PropertyState p = entry.getKey();
+            String propName = p.getName();
+            switch (entry.getValue()) {
+                case COPY:
+                case VERSION:
+                case ABORT:
+                    dest.removeProperty(propName);
+                    break;
+                case IGNORE:
+                    // no action
+                    break;
+                case INITIALIZE:
+                    resetToDefaultValue(dest, p);
+                    break;
+                case COMPUTE:
+                    // only COMPUTE property definitions currently are
+                    // jcr:primaryType and jcr:mixinTypes
+                    // do nothing for now
+                    if (!(JCR_PRIMARYTYPE.equals(propName) || JCR_MIXINTYPES.equals(propName))) {
+                        log.warn("OPV.COMPUTE not implemented for restoring property: " + propName);
+                    }
+                    break;
+            }
+        }
         restoreChildren(frozen, dest, selector);
     }
 
diff --git a/oak-jcr/pom.xml b/oak-jcr/pom.xml
index 9ac904f3dc..d4dc1bfabb 100644
--- a/oak-jcr/pom.xml
+++ b/oak-jcr/pom.xml
@@ -85,7 +85,6 @@
       org.apache.jackrabbit.test.api.version.VersionHistoryTest#testMerge
       org.apache.jackrabbit.test.api.version.RestoreTest#testRestoreLabel
       org.apache.jackrabbit.test.api.version.RestoreTest#testRestoreLabelJcr2
-      org.apache.jackrabbit.test.api.version.RestoreTest#testRestoreRemovesMixin <!-- OAK-9459 -->
       org.apache.jackrabbit.test.api.version.WorkspaceRestoreTest
       org.apache.jackrabbit.test.api.version.MergeCancelMergeTest
       org.apache.jackrabbit.test.api.version.MergeCheckedoutSubNodeTest