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 mr...@apache.org on 2015/08/25 13:53:08 UTC

svn commit: r1697655 - in /jackrabbit/oak/trunk/oak-upgrade/src: main/java/org/apache/jackrabbit/oak/upgrade/ main/java/org/apache/jackrabbit/oak/upgrade/version/ test/java/org/apache/jackrabbit/oak/upgrade/ test/java/org/apache/jackrabbit/oak/upgrade/...

Author: mreutegg
Date: Tue Aug 25 11:53:08 2015
New Revision: 1697655

URL: http://svn.apache.org/r1697655
Log:
OAK-3239: Port RepositoryUpgrade features to the RepositorySidegrade

Apply patch provided by Tomek Rękawek

Modified:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java
    jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java Tue Aug 25 11:53:08 2015
@@ -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<String> includePaths = DEFAULT_INCLUDE_PATHS;
+
+    /**
+     * Paths to exclude during the copy process. Empty by default.
+     */
+    private Set<String> excludePaths = DEFAULT_EXCLUDE_PATHS;
+
+    /**
+     * Paths to merge during the copy process. Empty by default.
+     */
+    private Set<String> mergePaths = DEFAULT_MERGE_PATHS;
+
+    private List<CommitHook> 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 <minDate, now()>}.
+     * 
+     * @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 <minDate, now()>}. <br/>
+     * <br/>
+     * 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<CommitHook> 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<CommitHook> 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<CommitHook> hooks = new ArrayList<CommitHook>();
+        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<String> includes = calculateEffectiveIncludePaths(includePaths, state);
+        final Set<String> excludes = union(copyOf(this.excludePaths), of("/jcr:system/jcr:versionStorage"));
+        final Set<String> 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

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java Tue Aug 25 11:53:08 2015
@@ -26,7 +26,6 @@ import static com.google.common.collect.
 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.sta
 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
 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<CommitHook> 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<String> includes = calculateEffectiveIncludePaths(sourceState);
+        final Set<String> includes = calculateEffectiveIncludePaths(includePaths, sourceState);
         final Set<String> excludes = union(copyOf(this.excludePaths), of("/jcr:system/jcr:versionStorage"));
         final Set<String> 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<NodeState> 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<String> calculateEffectiveIncludePaths(NodeState state) {
-        if (!this.includePaths.contains("/")) {
-            return copyOf(this.includePaths);
+    static Set<String> calculateEffectiveIncludePaths(Set<String> 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<CommitHook> hooks;
         private boolean started = false;
         private final boolean earlyShutdown;
         private final RepositoryContext source;
 
+        public LoggingCompositeHook(Collection<CommitHook> hooks) {
+          this(hooks, null, false);
+      }
+
         public LoggingCompositeHook(Collection<CommitHook> 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;

Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/version/VersionCopier.java Tue Aug 25 11:53:08 2015
@@ -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<NodeState> 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.

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/AbstractRepositoryUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -49,7 +49,7 @@ public abstract class AbstractRepository
 
     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 AbstractRepository
             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 AbstractRepository
     }
 
 
-    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 AbstractRepository
         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();

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyNodeTypesUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -18,12 +18,8 @@ package org.apache.jackrabbit.oak.upgrad
 
 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.NodeTypeManage
 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);
     }

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/CopyVersionHistoryTest.java Tue Aug 25 11:53:08 2015
@@ -20,21 +20,24 @@ import org.apache.jackrabbit.core.Reposi
 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 exte
 
     private static final String VERSIONABLES_YOUNG_ORPHANED = "/versionables/youngOrphaned";
 
+    protected RepositoryImpl repository;
+
     private static Calendar betweenHistories;
 
     /**
@@ -67,9 +72,7 @@ public class CopyVersionHistoryTest exte
     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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
     }
 
     @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 exte
         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);

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/IncludeExcludeUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -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 e
     }
 
     @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 {

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/PrivilegeUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -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.
 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/");
-
-            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" });
-
-        } finally {
-            session.logout();
-        }
+    protected void createSourceContent(Session session) throws Exception {
+        JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace();
+
+        NamespaceRegistry registry = workspace.getNamespaceRegistry();
+        registry.registerNamespace("test", "http://www.example.org/");
+
+        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

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepeatedRepositoryUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -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 RepeatedRepositoryUpgradeTe
             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 RepeatedRepositoryUpgradeTe
 
             // 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 RepeatedRepositoryUpgradeTe
     }
 
     @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 RepeatedRepositoryUpgradeTe
     }
 
     @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 {

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryGroupMemberUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -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 RepositoryGroupMemberUpgrad
         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

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgradeTest.java Tue Aug 25 11:53:08 2015
@@ -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 exten
 
     @Override
     @SuppressWarnings("unchecked")
-    protected void createSourceContent(Repository repository) throws Exception {
-        Session session = repository.login(CREDENTIALS);
-        try {
-            JackrabbitWorkspace workspace =
-                    (JackrabbitWorkspace) session.getWorkspace();
+    protected void createSourceContent(Session session) throws Exception {
+        JackrabbitWorkspace workspace = (JackrabbitWorkspace) session.getWorkspace();
 
-            NamespaceRegistry registry = workspace.getNamespaceRegistry();
-            registry.registerNamespace("test", "http://www.example.org/");
+        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();
+        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();
+        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();
         }
     }
 

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeFromTwoSourcesTest.java Tue Aug 25 11:53:08 2015
@@ -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 e
 
             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 e
     }
 
     @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 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 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(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

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java?rev=1697655&r1=1697654&r2=1697655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/util/VersionCopyTestUtils.java Tue Aug 25 11:53:08 2015
@@ -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);
     }
 }