diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java index 3cec09a..361208a 100755 --- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java +++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java @@ -16,38 +16,102 @@ */ package org.apache.jackrabbit.oak.upgrade; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Set; + +import javax.annotation.Nonnull; import javax.jcr.RepositoryException; -import com.google.common.base.Charsets; +import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.api.CommitFailedException; -import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent; -import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeBuilder; +import org.apache.jackrabbit.oak.spi.commit.CommitHook; import org.apache.jackrabbit.oak.spi.commit.CommitInfo; +import org.apache.jackrabbit.oak.spi.commit.EditorHook; import org.apache.jackrabbit.oak.spi.commit.EmptyHook; -import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; +import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.spi.state.NodeStore; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.LoggingCompositeHook; +import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier; +import org.apache.jackrabbit.oak.upgrade.version.VersionCopyConfiguration; +import org.apache.jackrabbit.oak.upgrade.version.VersionableEditor; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.ImmutableSet.copyOf; +import static com.google.common.collect.ImmutableSet.of; +import static com.google.common.collect.Sets.union; +import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_EXCLUDE_PATHS; +import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_INCLUDE_PATHS; +import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_MERGE_PATHS; +import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.calculateEffectiveIncludePaths; +import static org.apache.jackrabbit.oak.upgrade.version.VersionCopier.copyVersionStorage; public class RepositorySidegrade { /** - * Logger instance - */ - private static final Logger logger = - LoggerFactory.getLogger(RepositorySidegrade.class); - - /** * Target node store. */ private final NodeStore target; private final NodeStore source; - private boolean copyBinariesByReference = false; + /** + * Paths to include during the copy process. Defaults to the root path "/". + */ + private Set includePaths = DEFAULT_INCLUDE_PATHS; + + /** + * Paths to exclude during the copy process. Empty by default. + */ + private Set excludePaths = DEFAULT_EXCLUDE_PATHS; + + /** + * Paths to merge during the copy process. Empty by default. + */ + private Set mergePaths = DEFAULT_MERGE_PATHS; + + private List customCommitHooks = null; + + VersionCopyConfiguration versionCopyConfiguration = new VersionCopyConfiguration(); + + /** + * Configures the version storage copy. Be default all versions are copied. + * One may disable it completely by setting {@code null} here or limit it to + * a selected date range: {@code }. + * + * @param minDate + * minimum date of the versions to copy or {@code null} to + * disable the storage version copying completely. Default value: + * {@code 1970-01-01 00:00:00}. + */ + public void setCopyVersions(Calendar minDate) { + versionCopyConfiguration.setCopyVersions(minDate); + } + + /** + * Configures copying of the orphaned version histories (eg. ones that are + * not referenced by the existing nodes). By default all orphaned version + * histories are copied. One may disable it completely by setting + * {@code null} here or limit it to a selected date range: + * {@code }.
+ *
+ * Please notice, that this option is overriden by the + * {@link #setCopyVersions(Calendar)}. You can't copy orphaned versions + * older than set in {@link #setCopyVersions(Calendar)} and if you set + * {@code null} there, this option will be ignored. + * + * @param minDate + * minimum date of the orphaned versions to copy or {@code null} + * to not copy them at all. Default value: + * {@code 1970-01-01 00:00:00}. + */ + public void setCopyOrphanedVersions(Calendar minDate) { + versionCopyConfiguration.setCopyOrphanedVersions(minDate); + } /** * Creates a tool for copying the full contents of the source repository @@ -62,12 +126,62 @@ public class RepositorySidegrade { this.target = target; } - public boolean isCopyBinariesByReference() { - return copyBinariesByReference; + /** + * Returns the list of custom CommitHooks to be applied before the final + * type validation, reference and indexing hooks. + * + * @return the list of custom CommitHooks + */ + public List getCustomCommitHooks() { + return customCommitHooks; + } + + /** + * Sets the list of custom CommitHooks to be applied before the final + * type validation, reference and indexing hooks. + * + * @param customCommitHooks the list of custom CommitHooks + */ + public void setCustomCommitHooks(List customCommitHooks) { + this.customCommitHooks = customCommitHooks; + } + + /** + * Sets the paths that should be included when the source repository + * is copied to the target repository. + * + * @param includes Paths to be included in the copy. + */ + public void setIncludes(@Nonnull String... includes) { + this.includePaths = copyOf(checkNotNull(includes)); + } + + /** + * Sets the paths that should be excluded when the source repository + * is copied to the target repository. + * + * @param excludes Paths to be excluded from the copy. + */ + public void setExcludes(@Nonnull String... excludes) { + this.excludePaths = copyOf(checkNotNull(excludes)); } - public void setCopyBinariesByReference(boolean copyBinariesByReference) { - this.copyBinariesByReference = copyBinariesByReference; + + /** + * Sets the paths that should be merged when the source repository + * is copied to the target repository. + * + * @param merges Paths to be merged during copy. + */ + public void setMerges(@Nonnull String... merges) { + this.mergePaths = copyOf(checkNotNull(merges)); + } + + /** + * Same as {@link #copy(RepositoryInitializer)}, but with no custom initializer. + */ + public void copy() throws RepositoryException { + copy(null); } /** @@ -79,60 +193,60 @@ public class RepositorySidegrade { * Note that both the source and the target repository must be closed * during the copy operation as this method requires exclusive access * to the repositories. + * + * @param initializer optional extra repository initializer to use * * @throws RepositoryException if the copy operation fails */ - public void copy() throws RepositoryException { + public void copy(RepositoryInitializer initializer) throws RepositoryException { try { NodeState root = source.getRoot(); NodeBuilder builder = target.getRoot().builder(); new InitialContent().initialize(builder); - + if (initializer != null) { + initializer.initialize(builder); + } copyState(builder, root); - // removing references to the checkpoints, - // which don't exist in the new repository - builder.setChildNode(":async"); - - target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + cleanCheckpoints(builder); } catch (Exception e) { throw new RepositoryException("Failed to copy content", e); } } + private void cleanCheckpoints(NodeBuilder builder) throws CommitFailedException { + // removing references to the checkpoints, + // which don't exist in the new repository + builder.setChildNode(":async"); + target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + } + private void copyState(NodeBuilder parent, NodeState state) throws CommitFailedException { - boolean isSegmentNodeBuilder = parent instanceof SegmentNodeBuilder; - for (PropertyState property : state.getProperties()) { - parent.setProperty(property); + copyWorkspace(state, parent); + if (!versionCopyConfiguration.skipOrphanedVersionsCopy()) { + copyVersionStorage(state, parent, versionCopyConfiguration); } - for (ChildNodeEntry entry : state.getChildNodeEntries()) { - if (isSegmentNodeBuilder) { - parent.setChildNode(entry.getName(), entry.getNodeState()); - } else { - setChildNode(parent, entry.getName(), entry.getNodeState()); - } + + final List hooks = new ArrayList(); + hooks.add(new EditorHook( + new VersionableEditor.Provider(state, Oak.DEFAULT_WORKSPACE_NAME, versionCopyConfiguration))); + + if (customCommitHooks != null) { + hooks.addAll(customCommitHooks); } - target.merge(parent, EmptyHook.INSTANCE, CommitInfo.EMPTY); + target.merge(parent, new LoggingCompositeHook(hooks, null, false), CommitInfo.EMPTY); } - /** - * NodeState are copied by value by recursing down the complete tree - * This is a temporary approach for OAK-1760 for 1.0 branch. - */ - private void setChildNode(NodeBuilder parent, String name, NodeState state) { - // OAK-1589: maximum supported length of name for DocumentNodeStore - // is 150 bytes. Skip the sub tree if the the name is too long - if (name.length() > 37 && name.getBytes(Charsets.UTF_8).length > 150) { - logger.warn("Node name too long. Skipping {}", state); - return; - } - NodeBuilder builder = parent.setChildNode(name); - for (PropertyState property : state.getProperties()) { - builder.setProperty(property); - } - for (ChildNodeEntry child : state.getChildNodeEntries()) { - setChildNode(builder, child.getName(), child.getNodeState()); - } + private void copyWorkspace(NodeState state, NodeBuilder parent) { + final Set includes = calculateEffectiveIncludePaths(includePaths, state); + final Set excludes = union(copyOf(this.excludePaths), of("/jcr:system/jcr:versionStorage")); + final Set merges = union(copyOf(this.mergePaths), of("/jcr:system")); + + NodeStateCopier.builder() + .include(includes) + .exclude(excludes) + .merge(merges) + .copy(state, parent); } -} +} \ No newline at end of file diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java index 68da77c..e3ed52f 100644 --- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java +++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java @@ -26,7 +26,6 @@ import static com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.Sets.newHashSet; import static com.google.common.collect.Sets.union; import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM; -import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE; import static org.apache.jackrabbit.oak.plugins.name.Namespaces.addCustomMapping; import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH; import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants.JCR_ALL; @@ -112,7 +111,6 @@ import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier; import org.apache.jackrabbit.oak.upgrade.security.GroupEditorProvider; import org.apache.jackrabbit.oak.upgrade.security.RestrictionEditorProvider; -import org.apache.jackrabbit.oak.upgrade.version.VersionCopier; import org.apache.jackrabbit.oak.upgrade.version.VersionCopyConfiguration; import org.apache.jackrabbit.oak.upgrade.version.VersionableEditor; import org.apache.jackrabbit.spi.Name; @@ -127,6 +125,8 @@ import org.apache.jackrabbit.spi.commons.value.ValueFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.jackrabbit.oak.upgrade.version.VersionCopier.copyVersionStorage; + public class RepositoryUpgrade { private static final Logger logger = LoggerFactory.getLogger(RepositoryUpgrade.class); @@ -173,7 +173,7 @@ public class RepositoryUpgrade { private List customCommitHooks = null; - private VersionCopyConfiguration versionCopyConfiguration = new VersionCopyConfiguration(); + VersionCopyConfiguration versionCopyConfiguration = new VersionCopyConfiguration(); /** * Copies the contents of the repository in the given source directory @@ -421,7 +421,7 @@ public class RepositoryUpgrade { if (!versionCopyConfiguration.skipOrphanedVersionsCopy()) { logger.info("Copying version storage"); watch.reset().start(); - copyVersionStorage(sourceState, builder); + copyVersionStorage(sourceState, builder, versionCopyConfiguration); builder.getNodeState(); // on TarMK this does call triggers the actual copy logger.info("Version storage copied in {}s ({})", watch.elapsed(TimeUnit.SECONDS), watch); } else { @@ -818,7 +818,7 @@ public class RepositoryUpgrade { private String copyWorkspace(NodeState sourceState, NodeBuilder builder, String workspaceName) throws RepositoryException { - final Set includes = calculateEffectiveIncludePaths(sourceState); + final Set includes = calculateEffectiveIncludePaths(includePaths, sourceState); final Set excludes = union(copyOf(this.excludePaths), of("/jcr:system/jcr:versionStorage")); final Set merges = union(copyOf(this.mergePaths), of("/jcr:system")); @@ -833,23 +833,9 @@ public class RepositoryUpgrade { return workspaceName; } - private void copyVersionStorage(NodeState sourceState, NodeBuilder builder) - throws RepositoryException { - final NodeState versionStorage = sourceState.getChildNode(JCR_SYSTEM).getChildNode(JCR_VERSIONSTORAGE); - final Iterator versionStorageIterator = new DescendantsIterator(versionStorage, 3); - final VersionCopier versionCopier = new VersionCopier(sourceState, builder); - - while (versionStorageIterator.hasNext()) { - final NodeState versionHistoryBucket = versionStorageIterator.next(); - for (String versionHistory : versionHistoryBucket.getChildNodeNames()) { - versionCopier.copyVersionHistory(versionHistory, versionCopyConfiguration.getOrphanedMinDate()); - } - } - } - - private Set calculateEffectiveIncludePaths(NodeState state) { - if (!this.includePaths.contains("/")) { - return copyOf(this.includePaths); + static Set calculateEffectiveIncludePaths(Set includePaths, NodeState state) { + if (!includePaths.contains("/")) { + return copyOf(includePaths); } // include child nodes from source individually to avoid deleting other initialized content @@ -860,12 +846,16 @@ public class RepositoryUpgrade { return includes; } - private static class LoggingCompositeHook implements CommitHook { + static class LoggingCompositeHook implements CommitHook { private final Collection hooks; private boolean started = false; private final boolean earlyShutdown; private final RepositoryContext source; + public LoggingCompositeHook(Collection hooks) { + this(hooks, null, false); + } + public LoggingCompositeHook(Collection hooks, RepositoryContext source, boolean earlyShutdown) { this.hooks = hooks; @@ -878,7 +868,7 @@ public class RepositoryUpgrade { public NodeState processCommit(NodeState before, NodeState after, CommitInfo info) throws CommitFailedException { NodeState newState = after; Stopwatch watch = Stopwatch.createStarted(); - if (earlyShutdown && !started) { + if (earlyShutdown && source != null && !started) { logger.info("Shutting down source repository."); source.getRepository().shutdown(); started = true; diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java index 4be0a3b..db8461c 100644 --- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java +++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java @@ -17,15 +17,19 @@ package org.apache.jackrabbit.oak.upgrade.version; import static org.apache.jackrabbit.JcrConstants.JCR_CREATED; +import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM; +import static org.apache.jackrabbit.JcrConstants.JCR_VERSIONSTORAGE; import static org.apache.jackrabbit.JcrConstants.NT_VERSION; import java.util.Calendar; +import java.util.Iterator; import org.apache.jackrabbit.oak.api.Type; import org.apache.jackrabbit.oak.plugins.nodetype.TypePredicate; import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; +import org.apache.jackrabbit.oak.upgrade.DescendantsIterator; import org.apache.jackrabbit.oak.upgrade.nodestate.NodeStateCopier; import org.apache.jackrabbit.util.ISO8601; @@ -52,6 +56,19 @@ public class VersionCopier { this.rootBuilder = rootBuilder; } + public static void copyVersionStorage(NodeState sourceState, NodeBuilder builder, VersionCopyConfiguration config) { + final NodeState versionStorage = sourceState.getChildNode(JCR_SYSTEM).getChildNode(JCR_VERSIONSTORAGE); + final Iterator versionStorageIterator = new DescendantsIterator(versionStorage, 3); + final VersionCopier versionCopier = new VersionCopier(sourceState, builder); + + while (versionStorageIterator.hasNext()) { + final NodeState versionHistoryBucket = versionStorageIterator.next(); + for (String versionHistory : versionHistoryBucket.getChildNodeNames()) { + versionCopier.copyVersionHistory(versionHistory, config.getOrphanedMinDate()); + } + } + } + /** * Copy history filtering versions using passed date and returns @{code * true} if at least one version has been copied. diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java index 820988b..94411f6 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java @@ -49,7 +49,7 @@ public abstract class AbstractRepositoryUpgradeTest { public static final Credentials CREDENTIALS = new SimpleCredentials("admin", "admin".toCharArray()); - private static NodeStore targetNodeStore; + protected static NodeStore targetNodeStore; private static File testDirectory; @@ -77,9 +77,12 @@ public abstract class AbstractRepositoryUpgradeTest { File source = new File(directory, "source"); source.mkdirs(); RepositoryImpl repository = createSourceRepository(source); + Session session = repository.login(CREDENTIALS); try { - createSourceContent(repository); + createSourceContent(session); } finally { + session.save(); + session.logout(); repository.shutdown(); } final NodeStore target = getTargetNodeStore(); @@ -115,7 +118,7 @@ public abstract class AbstractRepositoryUpgradeTest { } - protected void doUpgradeRepository(File source, NodeStore target)throws RepositoryException{ + protected void doUpgradeRepository(File source, NodeStore target)throws RepositoryException, IOException{ RepositoryUpgrade.copy(source, target); } @@ -131,7 +134,7 @@ public abstract class AbstractRepositoryUpgradeTest { return(JackrabbitSession)getTargetRepository().login(CREDENTIALS); } - protected abstract void createSourceContent(Repository repository) throws Exception; + protected abstract void createSourceContent(Session session) throws Exception; protected void assertExisting(final String... paths) throws RepositoryException { final Session session = createAdminSession(); diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java index 4935ee4..50f6139 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java @@ -18,12 +18,8 @@ package org.apache.jackrabbit.oak.upgrade; import org.apache.jackrabbit.api.JackrabbitSession; import org.apache.jackrabbit.commons.cnd.CndImporter; -import org.apache.jackrabbit.commons.cnd.CompactNodeTypeDefReader; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeDefinition; @@ -32,15 +28,13 @@ import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.PropertyDefinition; import java.io.InputStreamReader; import java.io.Reader; -import java.io.StringReader; import static org.junit.Assert.assertEquals; public class CopyNodeTypesUpgradeTest extends AbstractRepositoryUpgradeTest { @Override - protected void createSourceContent(Repository repository) throws Exception { - final Session session = repository.login(CREDENTIALS); + protected void createSourceContent(Session session) throws Exception { final Reader cnd = new InputStreamReader(getClass().getResourceAsStream("/test-nodetypes.cnd")); CndImporter.registerNodeTypes(cnd, session); } diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java new file mode 100644 index 0000000..50b9930 --- /dev/null +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistorySidegradeTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.jackrabbit.oak.upgrade; + +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.apache.jackrabbit.oak.upgrade.util.VersionCopyTestUtils.VersionCopySetup; +import org.junit.Before; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import java.io.IOException; + +public class CopyVersionHistorySidegradeTest extends CopyVersionHistoryTest { + + private static NodeStore sourceNodeStore; + + @Before + @Override + public void upgradeRepository() throws Exception { + if (sourceNodeStore == null) { + sourceNodeStore = new MemoryNodeStore(); + RepositoryImpl repository = (RepositoryImpl) new Jcr(new Oak(sourceNodeStore)).createRepository(); + Session session = repository.login(CREDENTIALS); + try { + createSourceContent(session); + } finally { + repository.shutdown(); + } + } + } + + @Override + protected Session performCopy(VersionCopySetup setup) throws RepositoryException, IOException { + final NodeStore targetNodeStore = new MemoryNodeStore(); + final RepositorySidegrade sidegrade = new RepositorySidegrade(sourceNodeStore, targetNodeStore); + setup.setup(sidegrade.versionCopyConfiguration); + sidegrade.copy(null); + + repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); + return repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); + } +} diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java index 6b8066d..8103327 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java @@ -20,21 +20,24 @@ import org.apache.jackrabbit.core.RepositoryContext; import org.apache.jackrabbit.core.config.RepositoryConfig; import org.apache.jackrabbit.oak.Oak; import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; import org.apache.jackrabbit.oak.spi.state.NodeStore; -import org.apache.jackrabbit.oak.upgrade.util.VersionCopyTestUtils.RepositoryUpgradeSetup; +import org.apache.jackrabbit.oak.upgrade.util.VersionCopyTestUtils.VersionCopySetup; +import org.apache.jackrabbit.oak.upgrade.version.VersionCopyConfiguration; +import org.junit.After; import org.junit.AfterClass; import org.junit.Test; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.PropertyType; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.version.VersionManager; import java.io.File; +import java.io.IOException; import java.util.Calendar; import static org.junit.Assert.assertEquals; @@ -54,6 +57,8 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { private static final String VERSIONABLES_YOUNG_ORPHANED = "/versionables/youngOrphaned"; + protected RepositoryImpl repository; + private static Calendar betweenHistories; /** @@ -67,9 +72,7 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { private static String youngHistory; @Override - protected void createSourceContent(Repository repository) throws Exception { - final Session session = repository.login(CREDENTIALS); - + protected void createSourceContent(Session session) throws Exception { oldHistory = createVersionableNode(session, VERSIONABLES_OLD); oldOrphanedHistory = createVersionableNode(session, VERSIONABLES_OLD_ORPHANED); Thread.sleep(10); @@ -95,12 +98,10 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void copyAllVersions() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void copyAllVersions() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { + public void setup(VersionCopyConfiguration config) { // copying all versions is enabled by default } }); @@ -111,13 +112,11 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void referencedSinceDate() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void referencedSinceDate() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyVersions(betweenHistories); + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(betweenHistories); } }); @@ -129,13 +128,11 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void referencedOlderThanOrphaned() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void referencedOlderThanOrphaned() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyOrphanedVersions(betweenHistories); + public void setup(VersionCopyConfiguration config) { + config.setCopyOrphanedVersions(betweenHistories); } }); @@ -147,13 +144,11 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void onlyReferenced() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void onlyReferenced() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyOrphanedVersions(null); + public void setup(VersionCopyConfiguration config) { + config.setCopyOrphanedVersions(null); } }); assertTrue(isVersionable(session, VERSIONABLES_OLD)); @@ -164,14 +159,12 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void onlyReferencedAfterDate() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void onlyReferencedAfterDate() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyVersions(betweenHistories); - upgrade.setCopyOrphanedVersions(null); + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(betweenHistories); + config.setCopyOrphanedVersions(null); } }); assertFalse(isVersionable(session, VERSIONABLES_OLD)); @@ -182,13 +175,11 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void onlyOrphaned() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void onlyOrphaned() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyVersions(null); + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(null); } }); @@ -198,14 +189,12 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void onlyOrphanedAfterDate() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void onlyOrphanedAfterDate() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyVersions(null); - upgrade.setCopyOrphanedVersions(betweenHistories); + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(null); + config.setCopyOrphanedVersions(betweenHistories); } }); @@ -215,14 +204,12 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { } @Test - public void dontCopyVersionHistory() throws RepositoryException { - assert source != null; - - Session session = performCopy(source, new RepositoryUpgradeSetup() { + public void dontCopyVersionHistory() throws RepositoryException, IOException { + Session session = performCopy(new VersionCopySetup() { @Override - public void setup(RepositoryUpgrade upgrade) { - upgrade.setCopyVersions(null); - upgrade.setCopyOrphanedVersions(null); + public void setup(VersionCopyConfiguration config) { + config.setCopyVersions(null); + config.setCopyOrphanedVersions(null); } }); @@ -231,22 +218,27 @@ public class CopyVersionHistoryTest extends AbstractRepositoryUpgradeTest { assertMissing(session, oldHistory, youngHistory, oldOrphanedHistory, youngOrphanedHistory); } - public Session performCopy(File source, RepositoryUpgradeSetup setup) throws RepositoryException { + protected Session performCopy(VersionCopySetup setup) throws RepositoryException, IOException { final RepositoryConfig sourceConfig = RepositoryConfig.create(source); final RepositoryContext sourceContext = RepositoryContext.create(sourceConfig); final NodeStore targetNodeStore = new MemoryNodeStore(); try { final RepositoryUpgrade upgrade = new RepositoryUpgrade(sourceContext, targetNodeStore); - setup.setup(upgrade); + setup.setup(upgrade.versionCopyConfiguration); upgrade.copy(null); } finally { sourceContext.getRepository().shutdown(); } - final Repository repository = new Jcr(new Oak(targetNodeStore)).createRepository(); + repository = (RepositoryImpl) new Jcr(new Oak(targetNodeStore)).createRepository(); return repository.login(AbstractRepositoryUpgradeTest.CREDENTIALS); } + @After + public void closeRepository() { + repository.shutdown(); + } + private static void assertExisting(final Session session, final String... paths) throws RepositoryException { for (final String path : paths) { final String relPath = path.substring(1); diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java new file mode 100644 index 0000000..5a9dc62 --- /dev/null +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeSidegradeTest.java @@ -0,0 +1,64 @@ +package org.apache.jackrabbit.oak.upgrade; + +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; +import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore; +import org.apache.jackrabbit.oak.plugins.segment.file.FileStore; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.junit.Before; + +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import java.io.File; +import java.io.IOException; + +public class IncludeExcludeSidegradeTest extends IncludeExcludeUpgradeTest { + + @Before + public synchronized void upgradeRepository() throws Exception { + if (targetNodeStore == null) { + File directory = getTestDirectory(); + File source = new File(directory, "source"); + source.mkdirs(); + FileStore fileStore = FileStore.newFileStore(source).create(); + SegmentNodeStore segmentNodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create(); + RepositoryImpl repository = (RepositoryImpl) new Jcr(new Oak(segmentNodeStore)).createRepository(); + Session session = repository.login(CREDENTIALS); + try { + createSourceContent(session); + } finally { + session.save(); + session.logout(); + repository.shutdown(); + fileStore.close(); + } + final NodeStore target = getTargetNodeStore(); + doUpgradeRepository(source, target); + targetNodeStore = target; + } + } + + @Override + protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException, IOException { + FileStore fileStore = FileStore.newFileStore(source).create(); + SegmentNodeStore segmentNodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create(); + try { + final RepositorySidegrade sidegrade = new RepositorySidegrade(segmentNodeStore, target); + sidegrade.setIncludes( + "/content/foo/en", + "/content/assets/foo" + ); + sidegrade.setExcludes( + "/content/assets/foo/2013", + "/content/assets/foo/2012", + "/content/assets/foo/2011", + "/content/assets/foo/2010" + ); + sidegrade.copy(); + } finally { + fileStore.close(); + } + } +} diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java index 4396edc..ce70576 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java @@ -26,12 +26,12 @@ import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.io.File; +import java.io.IOException; public class IncludeExcludeUpgradeTest extends AbstractRepositoryUpgradeTest { @Override - protected void createSourceContent(Repository repository) throws Exception { - final Session session = repository.login(CREDENTIALS); + protected void createSourceContent(Session session) throws Exception { JcrUtils.getOrCreateByPath("/content/foo/de", "nt:folder", session); JcrUtils.getOrCreateByPath("/content/foo/en", "nt:folder", session); JcrUtils.getOrCreateByPath("/content/foo/fr", "nt:folder", session); @@ -51,7 +51,7 @@ public class IncludeExcludeUpgradeTest extends AbstractRepositoryUpgradeTest { } @Override - protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException { + protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException, IOException { final RepositoryConfig config = RepositoryConfig.create(source); final RepositoryContext context = RepositoryContext.create(config); try { diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java index 93a1ee8..6121c09 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java @@ -24,7 +24,6 @@ import java.util.Map; import java.util.Set; import javax.jcr.NamespaceRegistry; import javax.jcr.Node; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.security.Privilege; @@ -76,26 +75,18 @@ import static org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstant public class PrivilegeUpgradeTest extends AbstractRepositoryUpgradeTest { @Override - @SuppressWarnings("unchecked") - protected void createSourceContent(Repository repository) throws Exception { - Session session = repository.login(CREDENTIALS); - try { - JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace(); - - NamespaceRegistry registry = workspace.getNamespaceRegistry(); - registry.registerNamespace("test", "http://www.example.org/"); + protected void createSourceContent(Session session) throws Exception { + JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace(); - PrivilegeManager privilegeManager = workspace.getPrivilegeManager(); - privilegeManager.registerPrivilege("test:privilege", false, null); - privilegeManager.registerPrivilege( - "test:aggregate", false, new String[] { "jcr:read", "test:privilege" }); - privilegeManager.registerPrivilege("test:privilege2", true, null); - privilegeManager.registerPrivilege( - "test:aggregate2", true, new String[] { "test:aggregate", "test:privilege2" }); + NamespaceRegistry registry = workspace.getNamespaceRegistry(); + registry.registerNamespace("test", "http://www.example.org/"); - } finally { - session.logout(); - } + PrivilegeManager privilegeManager = workspace.getPrivilegeManager(); + privilegeManager.registerPrivilege("test:privilege", false, null); + privilegeManager.registerPrivilege("test:aggregate", false, new String[] { "jcr:read", "test:privilege" }); + privilegeManager.registerPrivilege("test:privilege2", true, null); + privilegeManager.registerPrivilege("test:aggregate2", true, + new String[] { "test:aggregate", "test:privilege2" }); } @Test diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java new file mode 100644 index 0000000..232ffa7 --- /dev/null +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositorySidegradeTest.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.jackrabbit.oak.upgrade; + +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.jcr.Jcr; +import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl; +import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore; +import org.apache.jackrabbit.oak.plugins.segment.file.FileStore; +import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; +import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.junit.Before; + +import javax.annotation.Nonnull; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import java.io.File; +import java.io.IOException; + +public class RepeatedRepositorySidegradeTest extends RepeatedRepositoryUpgradeTest { + + @Before + public synchronized void upgradeRepository() throws Exception { + if (!upgradeComplete) { + final File sourceDir = new File(getTestDirectory(), "jackrabbit2"); + + sourceDir.mkdirs(); + + FileStore fileStore = FileStore.newFileStore(sourceDir).create(); + SegmentNodeStore segmentNodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create(); + RepositoryImpl repository = (RepositoryImpl) new Jcr(new Oak(segmentNodeStore)).createRepository(); + Session session = repository.login(CREDENTIALS); + try { + createSourceContent(session); + } finally { + session.save(); + session.logout(); + repository.shutdown(); + fileStore.close(); + } + + final NodeStore target = getTargetNodeStore(); + doUpgradeRepository(sourceDir, target); + fileStore.flush(); + + fileStore = FileStore.newFileStore(sourceDir).create(); + segmentNodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create(); + repository = (RepositoryImpl) new Jcr(new Oak(segmentNodeStore)).createRepository(); + session = repository.login(CREDENTIALS); + try { + modifySourceContent(session); + } finally { + session.save(); + session.logout(); + repository.shutdown(); + fileStore.close(); + } + + doUpgradeRepository(sourceDir, target); + fileStore.flush(); + + upgradeComplete = true; + } + } + + @Override + protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException, IOException { + FileStore fileStore = FileStore.newFileStore(source).create(); + SegmentNodeStore segmentNodeStore = SegmentNodeStore.newSegmentNodeStore(fileStore).create(); + try { + final RepositorySidegrade repositoryUpgrade = new RepositorySidegrade(segmentNodeStore, target); + repositoryUpgrade.copy(new RepositoryInitializer() { + @Override + public void initialize(@Nonnull NodeBuilder builder) { + builder.child("foo").child("bar"); + } + }); + } finally { + fileStore.close(); + } + } +} \ No newline at end of file diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java index b259828..6cb8aee 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java @@ -54,7 +54,7 @@ import java.io.IOException; */ public class RepeatedRepositoryUpgradeTest extends AbstractRepositoryUpgradeTest { - private static boolean upgradeComplete; + protected static boolean upgradeComplete; private static FileStore fileStore; @Override @@ -88,10 +88,12 @@ public class RepeatedRepositoryUpgradeTest extends AbstractRepositoryUpgradeTest sourceDir.mkdirs(); RepositoryImpl source = createSourceRepository(sourceDir); - + Session session = source.login(CREDENTIALS); try { - createSourceContent(source); + createSourceContent(session); } finally { + session.save(); + session.logout(); source.shutdown(); } @@ -101,9 +103,12 @@ public class RepeatedRepositoryUpgradeTest extends AbstractRepositoryUpgradeTest // re-create source repo source = createSourceRepository(sourceDir); + session = source.login(CREDENTIALS); try { - modifySourceContent(source); + modifySourceContent(session); } finally { + session.save(); + session.logout(); source.shutdown(); } @@ -115,7 +120,7 @@ public class RepeatedRepositoryUpgradeTest extends AbstractRepositoryUpgradeTest } @Override - protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException { + protected void doUpgradeRepository(File source, NodeStore target) throws RepositoryException, IOException { final RepositoryConfig config = RepositoryConfig.create(source); final RepositoryContext context = RepositoryContext.create(config); try { @@ -132,44 +137,26 @@ public class RepeatedRepositoryUpgradeTest extends AbstractRepositoryUpgradeTest } @Override - protected void createSourceContent(Repository repository) throws RepositoryException { - Session session = null; - try { - session = repository.login(CREDENTIALS); + protected void createSourceContent(Session session) throws RepositoryException { + registerCustomPrivileges(session); - registerCustomPrivileges(session); + JcrUtils.getOrCreateByPath("/content/child1/grandchild1", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/content/child1/grandchild2", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/content/child1/grandchild3", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/content/child2/grandchild1", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/content/child2/grandchild2", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child1/grandchild1", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child1/grandchild2", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child1/grandchild3", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child2/grandchild1", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child2/grandchild2", "nt:unstructured", session); - - session.save(); - } finally { - if (session != null && session.isLive()) { - session.logout(); - } - } + session.save(); } - private void modifySourceContent(Repository repository) throws RepositoryException { - Session session = null; - try { - session = repository.login(CREDENTIALS); - - JcrUtils.getOrCreateByPath("/content/child2/grandchild3", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/content/child3", "nt:unstructured", session); + protected void modifySourceContent(Session session) throws RepositoryException { + JcrUtils.getOrCreateByPath("/content/child2/grandchild3", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/content/child3", "nt:unstructured", session); - final Node child1 = JcrUtils.getOrCreateByPath("/content/child1", "nt:unstructured", session); - child1.remove(); + final Node child1 = JcrUtils.getOrCreateByPath("/content/child1", "nt:unstructured", session); + child1.remove(); - session.save(); - } finally { - if (session != null && session.isLive()) { - session.logout(); - } - } + session.save(); } private void registerCustomPrivileges(Session session) throws RepositoryException { diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java index a1636af..38ed4e7 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java @@ -24,7 +24,7 @@ import java.util.Iterator; import java.util.Set; import javax.jcr.Node; -import javax.jcr.Repository; +import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import org.apache.jackrabbit.api.JackrabbitSession; @@ -59,27 +59,23 @@ public class RepositoryGroupMemberUpgradeTest extends AbstractRepositoryUpgradeT return 2; } - protected void createSourceContent(Repository repository) throws Exception { - JackrabbitSession session = (JackrabbitSession) repository.login(CREDENTIALS); - try { - UserManager userMgr = session.getUserManager(); - userMgr.autoSave(false); - User users[] = new User[getNumUsers()]; - for (int i = 0; i < users.length; i++) { - String userId = TEST_USER_PREFIX + i; - users[i] = userMgr.createUser(userId, userId); - } + @Override + protected void createSourceContent(Session session) throws Exception { + UserManager userMgr = ((JackrabbitSession) session).getUserManager(); + userMgr.autoSave(false); + User users[] = new User[getNumUsers()]; + for (int i = 0; i < users.length; i++) { + String userId = TEST_USER_PREFIX + i; + users[i] = userMgr.createUser(userId, userId); + } - for (int i = 0; i < getNumGroups(); i++) { - Group g = userMgr.createGroup(TEST_GROUP_PREFIX + i); - for (User user : users) { - g.addMember(user); - } + for (int i = 0; i < getNumGroups(); i++) { + Group g = userMgr.createGroup(TEST_GROUP_PREFIX + i); + for (User user : users) { + g.addMember(user); } - session.save(); - } finally { - session.logout(); } + session.save(); } @Test diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java index c3028f8..d284b32 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java @@ -31,7 +31,6 @@ import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.PropertyIterator; import javax.jcr.PropertyType; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Value; @@ -73,97 +72,89 @@ public class RepositoryUpgradeTest extends AbstractRepositoryUpgradeTest { @Override @SuppressWarnings("unchecked") - protected void createSourceContent(Repository repository) throws Exception { - Session session = repository.login(CREDENTIALS); + protected void createSourceContent(Session session) throws Exception { + JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace(); + + NamespaceRegistry registry = workspace.getNamespaceRegistry(); + registry.registerNamespace("test", "http://www.example.org/"); + + NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager(); + NodeTypeTemplate template = nodeTypeManager.createNodeTypeTemplate(); + template.setName("test:unstructured"); + template.setDeclaredSuperTypeNames(new String[] { "nt:unstructured" }); + PropertyDefinitionTemplate pDef1 = nodeTypeManager.createPropertyDefinitionTemplate(); + pDef1.setName("defaultString"); + pDef1.setRequiredType(PropertyType.STRING); + Value stringValue = session.getValueFactory().createValue("stringValue"); + pDef1.setDefaultValues(new Value[] { stringValue }); + template.getPropertyDefinitionTemplates().add(pDef1); + + PropertyDefinitionTemplate pDef2 = nodeTypeManager.createPropertyDefinitionTemplate(); + pDef2.setName("defaultPath"); + pDef2.setRequiredType(PropertyType.PATH); + Value pathValue = session.getValueFactory().createValue("/jcr:path/nt:value", PropertyType.PATH); + pDef2.setDefaultValues(new Value[] { pathValue }); + template.getPropertyDefinitionTemplates().add(pDef2); + + nodeTypeManager.registerNodeType(template, false); + + template = nodeTypeManager.createNodeTypeTemplate(); + template.setName("test:referenceable"); + template.setDeclaredSuperTypeNames(new String[] { "nt:unstructured", "mix:referenceable" }); + nodeTypeManager.registerNodeType(template, false); + + Node root = session.getRootNode(); + + Node referenceable = root.addNode("referenceable", "test:unstructured"); + referenceable.addMixin(NodeType.MIX_REFERENCEABLE); + Node versionable = root.addNode("versionable", NT_UNSTRUCTURED); + versionable.addMixin(MIX_VERSIONABLE); + Node child = versionable.addNode("child", "test:referenceable"); + child.addNode("child2", NT_UNSTRUCTURED); + session.save(); + + Node sns = root.addNode("sns"); + sns.addNode("sibling"); + sns.addNode("sibling"); + sns.addNode("sibling"); + + session.getWorkspace().getVersionManager().checkin("/versionable"); + + Node properties = root.addNode("properties", "test:unstructured"); + properties.setProperty("boolean", true); + Binary binary = session.getValueFactory().createBinary(new ByteArrayInputStream(BINARY)); try { - JackrabbitWorkspace workspace = - (JackrabbitWorkspace) session.getWorkspace(); - - NamespaceRegistry registry = workspace.getNamespaceRegistry(); - registry.registerNamespace("test", "http://www.example.org/"); - - NodeTypeManager nodeTypeManager = workspace.getNodeTypeManager(); - NodeTypeTemplate template = nodeTypeManager.createNodeTypeTemplate(); - template.setName("test:unstructured"); - template.setDeclaredSuperTypeNames( - new String[] {"nt:unstructured"}); - PropertyDefinitionTemplate pDef1 = nodeTypeManager.createPropertyDefinitionTemplate(); - pDef1.setName("defaultString"); - pDef1.setRequiredType(PropertyType.STRING); - Value stringValue = session.getValueFactory().createValue("stringValue"); - pDef1.setDefaultValues(new Value[] {stringValue}); - template.getPropertyDefinitionTemplates().add(pDef1); - - PropertyDefinitionTemplate pDef2 = nodeTypeManager.createPropertyDefinitionTemplate(); - pDef2.setName("defaultPath"); - pDef2.setRequiredType(PropertyType.PATH); - Value pathValue = session.getValueFactory().createValue("/jcr:path/nt:value", PropertyType.PATH); - pDef2.setDefaultValues(new Value[] {pathValue}); - template.getPropertyDefinitionTemplates().add(pDef2); - - nodeTypeManager.registerNodeType(template, false); - - template = nodeTypeManager.createNodeTypeTemplate(); - template.setName("test:referenceable"); - template.setDeclaredSuperTypeNames( - new String[] {"nt:unstructured", "mix:referenceable"}); - nodeTypeManager.registerNodeType(template, false); - - Node root = session.getRootNode(); - - Node referenceable = - root.addNode("referenceable", "test:unstructured"); - referenceable.addMixin(NodeType.MIX_REFERENCEABLE); - Node versionable = root.addNode("versionable", NT_UNSTRUCTURED); - versionable.addMixin(MIX_VERSIONABLE); - Node child = versionable.addNode("child", "test:referenceable"); - child.addNode("child2", NT_UNSTRUCTURED); - session.save(); - - Node sns = root.addNode("sns"); - sns.addNode("sibling"); - sns.addNode("sibling"); - sns.addNode("sibling"); - - session.getWorkspace().getVersionManager().checkin("/versionable"); - - Node properties = root.addNode("properties", "test:unstructured"); - properties.setProperty("boolean", true); - Binary binary = session.getValueFactory().createBinary( - new ByteArrayInputStream(BINARY)); - try { - properties.setProperty("binary", binary); - } finally { - binary.dispose(); - } - properties.setProperty("date", DATE); - properties.setProperty("decimal", new BigDecimal(123)); - properties.setProperty("double", Math.PI); - properties.setProperty("long", 9876543210L); - properties.setProperty("reference", referenceable); - properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true)); - properties.setProperty("mv_reference", new Value[]{session.getValueFactory().createValue(versionable, false)}); - properties.setProperty("mv_weak_reference", new Value[]{session.getValueFactory().createValue(versionable, true)}); - properties.setProperty("string", "test"); - properties.setProperty("multiple", "a,b,c".split(",")); - session.save(); - - binary = properties.getProperty("binary").getBinary(); + properties.setProperty("binary", binary); + } finally { + binary.dispose(); + } + properties.setProperty("date", DATE); + properties.setProperty("decimal", new BigDecimal(123)); + properties.setProperty("double", Math.PI); + properties.setProperty("long", 9876543210L); + properties.setProperty("reference", referenceable); + properties.setProperty("weak_reference", session.getValueFactory().createValue(referenceable, true)); + properties.setProperty("mv_reference", + new Value[] { session.getValueFactory().createValue(versionable, false) }); + properties.setProperty("mv_weak_reference", + new Value[] { session.getValueFactory().createValue(versionable, true) }); + properties.setProperty("string", "test"); + properties.setProperty("multiple", "a,b,c".split(",")); + session.save(); + + binary = properties.getProperty("binary").getBinary(); + try { + InputStream stream = binary.getStream(); try { - InputStream stream = binary.getStream(); - try { - for (byte aBINARY : BINARY) { - assertEquals(aBINARY, (byte) stream.read()); - } - assertEquals(-1, stream.read()); - } finally { - stream.close(); + for (byte aBINARY : BINARY) { + assertEquals(aBINARY, (byte) stream.read()); } + assertEquals(-1, stream.read()); } finally { - binary.dispose(); + stream.close(); } } finally { - session.logout(); + binary.dispose(); } } diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java index 652df45..2449dea 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java @@ -28,7 +28,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.io.File; @@ -77,11 +76,16 @@ public class UpgradeFromTwoSourcesTest extends AbstractRepositoryUpgradeTest { final RepositoryImpl source1 = createSourceRepository(sourceDir1); final RepositoryImpl source2 = createSourceRepository(sourceDir2); - + final Session session1 = source1.login(CREDENTIALS); + final Session session2 = source2.login(CREDENTIALS); try { - createSourceContent(source1); - createSourceContent2(source2); + createSourceContent(session1); + createSourceContent2(session2); } finally { + session1.save(); + session2.save(); + session1.logout(); + session2.logout(); source1.shutdown(); source2.shutdown(); } @@ -107,42 +111,24 @@ public class UpgradeFromTwoSourcesTest extends AbstractRepositoryUpgradeTest { } @Override - protected void createSourceContent(Repository repository) throws RepositoryException { - Session session = null; - try { - session = repository.login(CREDENTIALS); - - JcrUtils.getOrCreateByPath("/left/child1/grandchild1", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child1/grandchild2", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child1/grandchild3", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child2/grandchild1", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session); - - session.save(); - } finally { - if (session != null && session.isLive()) { - session.logout(); - } - } + protected void createSourceContent(Session session) throws RepositoryException { + JcrUtils.getOrCreateByPath("/left/child1/grandchild1", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child1/grandchild2", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child1/grandchild3", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child2/grandchild1", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session); + + session.save(); } - protected void createSourceContent2(Repository repository) throws RepositoryException { - Session session = null; - try { - session = repository.login(CREDENTIALS); - - JcrUtils.getOrCreateByPath("/left/child2/grandchild3", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/left/child3", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/right/child1/grandchild1", "nt:unstructured", session); - JcrUtils.getOrCreateByPath("/right/child1/grandchild2", "nt:unstructured", session); + protected void createSourceContent2(Session session) throws RepositoryException { + JcrUtils.getOrCreateByPath("/left/child2/grandchild3", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child2/grandchild2", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/left/child3", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/right/child1/grandchild1", "nt:unstructured", session); + JcrUtils.getOrCreateByPath("/right/child1/grandchild2", "nt:unstructured", session); - session.save(); - } finally { - if (session != null && session.isLive()) { - session.logout(); - } - } + session.save(); } @Test diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java index 3234068..51d4cbf 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java @@ -16,16 +16,10 @@ */ package org.apache.jackrabbit.oak.upgrade.util; -import static org.apache.jackrabbit.oak.plugins.version.VersionConstants.MIX_REP_VERSIONABLE_PATHS; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - import java.util.ArrayList; import java.util.List; import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.version.Version; @@ -34,7 +28,7 @@ import javax.jcr.version.VersionManager; import org.apache.jackrabbit.JcrConstants; import org.apache.jackrabbit.commons.JcrUtils; -import org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade; +import org.apache.jackrabbit.oak.upgrade.version.VersionCopyConfiguration; public class VersionCopyTestUtils { @@ -67,7 +61,7 @@ public class VersionCopyTestUtils { return session.getNode(path).isNodeType(JcrConstants.MIX_VERSIONABLE); } - public interface RepositoryUpgradeSetup { - void setup(RepositoryUpgrade upgrade); + public interface VersionCopySetup { + void setup(VersionCopyConfiguration config); } }