Author: tomekr Date: Fri Jan 22 09:44:30 2021 New Revision: 1885779 URL: http://svn.apache.org/viewvc?rev=1885779&view=rev Log: OAK-9326: Provide option to remove target version history from VersionCopier.copyVersionStorage
Patch provided by Guy Pelletier. Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopier.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopyConfiguration.java jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopierTest.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopier.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopier.java?rev=1885779&r1=1885778&r2=1885779&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopier.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopier.java Fri Jan 22 09:44:30 2021 @@ -26,6 +26,7 @@ import org.apache.jackrabbit.oak.plugins import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; +import static org.apache.jackrabbit.oak.plugins.migration.version.VersionHistoryUtil.getVersionHistoryBuilder; import static org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_PATH; import static org.apache.jackrabbit.oak.plugins.migration.version.VersionHistoryUtil.getRelativeVersionHistoryPath; @@ -57,6 +58,9 @@ public class VersionCopier { while (versionStorageIterator.hasNext()) { final NodeState versionHistoryBucket = versionStorageIterator.next(); for (String versionHistory : versionHistoryBucket.getChildNodeNames()) { + if (config.removeTargetVersionHistory()) { + getVersionHistoryBuilder(targetVersionStorage, versionHistory).remove(); + } versionCopier.copyVersionHistory(versionHistory, config.getOrphanedMinDate()); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopyConfiguration.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopyConfiguration.java?rev=1885779&r1=1885778&r2=1885779&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopyConfiguration.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopyConfiguration.java Fri Jan 22 09:44:30 2021 @@ -23,6 +23,9 @@ import java.util.Calendar; */ public class VersionCopyConfiguration { + // Provide option to remove the target version history before it is copied from another source. + private boolean removeTargetVersionHistory = false; + private Calendar copyVersions; private Calendar copyOrphanedVersions; @@ -42,6 +45,10 @@ public class VersionCopyConfiguration { this.copyOrphanedVersions = copyOrphanedVersions; } + public void setRemoveTargetVersionHistory(boolean removeTargetVersionHistory) { + this.removeTargetVersionHistory = removeTargetVersionHistory; + } + public Calendar getVersionsMinDate() { return copyVersions; } @@ -56,6 +63,10 @@ public class VersionCopyConfiguration { } } + public boolean removeTargetVersionHistory() { + return removeTargetVersionHistory; + } + public boolean isCopyVersions() { return copyVersions != null; } Modified: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopierTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopierTest.java?rev=1885779&r1=1885778&r2=1885779&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopierTest.java (original) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/migration/version/VersionCopierTest.java Fri Jan 22 09:44:30 2021 @@ -16,6 +16,7 @@ */ package org.apache.jackrabbit.oak.plugins.migration.version; +import java.util.Iterator; import java.util.UUID; import javax.jcr.RepositoryException; @@ -28,6 +29,7 @@ import org.apache.jackrabbit.oak.commons import org.apache.jackrabbit.oak.core.ImmutableRoot; import org.apache.jackrabbit.oak.namepath.NamePathMapper; import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.plugins.migration.DescendantsIterator; import org.apache.jackrabbit.oak.plugins.migration.NodeStateCopier; import org.apache.jackrabbit.oak.plugins.version.ReadOnlyVersionManager; import org.apache.jackrabbit.oak.plugins.version.ReadWriteVersionManager; @@ -47,6 +49,8 @@ import static org.apache.jackrabbit.JcrC import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT; import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT_FROZEN_NODE_REFERENCEABLE; import static org.apache.jackrabbit.oak.plugins.migration.NodeStateTestUtils.commit; +import static org.apache.jackrabbit.oak.plugins.migration.version.VersionHistoryUtil.getVersionHistoryBuilder; +import static org.apache.jackrabbit.oak.plugins.migration.version.VersionHistoryUtil.getVersionHistoryNodeState; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -98,19 +102,72 @@ public class VersionCopierTest { assertVersionReferenceable(target.getRoot(), path); } + @Test + public void copyVersionSourceRemovingTargetVersionHistory() throws Exception { + String path = "/foo"; + NodeStore source = createVersionFor(path, createStore(false)); + NodeStore target = createVersionFor(path, createStore(false)); + + // Copy source to target as starting point to duplicate. + copyVersionStorage(source, target); + + // Add a test property to the nodes of the target version history. + addVersionHistoryTestProperty(source, target); + + // Copy again, this time setting the remove target version history flag. + copyVersionStorage(source, target, true); + + // Verify the test properties no longer exist in the target version history. + assertVersionHistoryTestPropertyRemoved(source, target); + } + + private void addVersionHistoryTestProperty(NodeStore source, NodeStore target) throws CommitFailedException { + final NodeState sourceVersionStorage = VersionHistoryUtil.getVersionStorage(source.getRoot()); + final NodeBuilder targetRootBuilder = target.getRoot().builder(); + final NodeBuilder targetVersionStorage = VersionHistoryUtil.getVersionStorage(targetRootBuilder); + + final Iterator<NodeState> versionStorageIterator = new DescendantsIterator(sourceVersionStorage, 3); + final NodeState versionHistoryBucket = versionStorageIterator.next(); + for (String versionHistory : versionHistoryBucket.getChildNodeNames()) { + getVersionHistoryBuilder(targetVersionStorage, versionHistory).setProperty("jcr:test", "test"); + } + commit(target, targetRootBuilder); + } + + private void assertVersionHistoryTestPropertyRemoved(NodeStore source, NodeStore target) { + final NodeState sourceVersionStorage = VersionHistoryUtil.getVersionStorage(source.getRoot()); + final NodeState targetVersionStorage = VersionHistoryUtil.getVersionStorage(target.getRoot()); + + final Iterator<NodeState> versionStorageIterator = new DescendantsIterator(sourceVersionStorage, 3); + final NodeState versionHistoryBucket = versionStorageIterator.next(); + for (String versionHistory : versionHistoryBucket.getChildNodeNames()) { + assertFalse(getVersionHistoryNodeState(targetVersionStorage, versionHistory).hasProperty("jcr:test")); + } + } + private void copyContent(NodeStore source, NodeStore target, String path) throws CommitFailedException { NodeStateCopier.builder().include(path).copy(source, target); } private void copyVersionStorage(NodeStore source, NodeStore target) + throws CommitFailedException { + + copyVersionStorage(source, target, false); + } + + private void copyVersionStorage(NodeStore source, NodeStore target, boolean removeTargetVersionHistory) throws CommitFailedException { + + VersionCopyConfiguration config = new VersionCopyConfiguration(); + config.setRemoveTargetVersionHistory(removeTargetVersionHistory); + NodeBuilder targetRootBuilder = target.getRoot().builder(); VersionCopier.copyVersionStorage( targetRootBuilder, VersionHistoryUtil.getVersionStorage(source.getRoot()), VersionHistoryUtil.getVersionStorage(targetRootBuilder), - new VersionCopyConfiguration() + config ); commit(target, targetRootBuilder); }