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