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 ju...@apache.org on 2014/04/11 15:48:37 UTC

svn commit: r1586655 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/ oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/ oak-core/src/mai...

Author: jukka
Date: Fri Apr 11 13:48:37 2014
New Revision: 1586655

URL: http://svn.apache.org/r1586655
Log:
OAK-1719: Missing commit hooks in upgrade

Map security configuration and include all initializers and hooks from the security provider
Also removed unused arguments from WorkspaceInitializer.initialize()

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeWorkspaceInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/WorkspaceInitializer.java
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositoryUpgrade.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java Fri Apr 11 13:48:37 2014
@@ -531,9 +531,8 @@ public class Oak {
                                 return sc.getWorkspaceInitializer();
                             }
                         });
-        OakInitializer.initialize(workspaceInitializers, store,
-                defaultWorkspaceName, indexEditors, queryEngineSettings, indexProvider,
-                CompositeHook.compose(initHooks));
+        OakInitializer.initialize(
+                workspaceInitializers, store, defaultWorkspaceName, indexEditors);
 
         // add index hooks later to prevent the OakInitializer to do excessive indexing
         with(new IndexUpdateProvider(indexEditors));

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authorization/AuthorizationInitializer.java Fri Apr 11 13:48:37 2014
@@ -20,11 +20,8 @@ import com.google.common.collect.Immutab
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
-import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 import org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionConstants;
-import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
-import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
@@ -44,10 +41,7 @@ import static org.apache.jackrabbit.JcrC
 class AuthorizationInitializer implements WorkspaceInitializer, AccessControlConstants, PermissionConstants {
 
     @Override
-    public void initialize(
-            NodeBuilder builder, String workspaceName,
-            QueryEngineSettings queryEngineSettings,
-            QueryIndexProvider indexProvider, CommitHook commitHook) {
+    public void initialize(NodeBuilder builder, String workspaceName) {
         // property index for rep:principalName stored in ACEs
         NodeBuilder index = IndexUtils.getOrCreateOakIndex(builder);
         if (!index.hasChildNode("acPrincipalName")) {

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserInitializer.java Fri Apr 11 13:48:37 2014
@@ -30,9 +30,9 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.index.IndexUtils;
 import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore;
 import org.apache.jackrabbit.oak.query.QueryEngineSettings;
-import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.lifecycle.WorkspaceInitializer;
-import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
+import org.apache.jackrabbit.oak.spi.query.CompositeQueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
@@ -86,14 +86,13 @@ class UserInitializer implements Workspa
     //-----------------------------------------------< WorkspaceInitializer >---
 
     @Override
-    public void initialize(
-            NodeBuilder builder, String workspaceName,
-            QueryEngineSettings queryEngineSettings,
-            QueryIndexProvider indexProvider, CommitHook commitHook) {
+    public void initialize(NodeBuilder builder, String workspaceName) {
         NodeState base = builder.getNodeState();
         MemoryNodeStore store = new MemoryNodeStore(base);
 
-        Root root = new SystemRoot(store, commitHook, workspaceName, securityProvider, queryEngineSettings, indexProvider);
+        Root root = new SystemRoot(
+                store, EmptyHook.INSTANCE, workspaceName, securityProvider,
+                new QueryEngineSettings(), new CompositeQueryIndexProvider());
 
         UserConfiguration userConfiguration = securityProvider.getConfiguration(UserConfiguration.class);
         UserManager userManager = userConfiguration.getUserManager(root, NamePathMapper.DEFAULT);

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeInitializer.java Fri Apr 11 13:48:37 2014
@@ -24,7 +24,6 @@ import java.util.Collection;
 import javax.annotation.Nonnull;
 
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 /**
  * Composite repository initializer that delegates the

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeWorkspaceInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeWorkspaceInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeWorkspaceInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/CompositeWorkspaceInitializer.java Fri Apr 11 13:48:37 2014
@@ -20,19 +20,15 @@ package org.apache.jackrabbit.oak.spi.li
 
 import java.util.Arrays;
 import java.util.Collection;
+
 import javax.annotation.Nonnull;
 
-import org.apache.jackrabbit.oak.query.QueryEngineSettings;
-import org.apache.jackrabbit.oak.spi.commit.CommitHook;
-import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
 /**
  * Composite repository initializer that delegates the
- * {@link #initialize(org.apache.jackrabbit.oak.spi.state.NodeBuilder, String,
- * org.apache.jackrabbit.oak.spi.query.QueryIndexProvider,
- * org.apache.jackrabbit.oak.spi.commit.CommitHook)} calls in sequence to all the
- * component initializers.
+ * {@link #initialize(org.apache.jackrabbit.oak.spi.state.NodeBuilder, String)}
+ * calls in sequence to all the component initializers.
  */
 public class CompositeWorkspaceInitializer implements WorkspaceInitializer {
 
@@ -47,9 +43,9 @@ public class CompositeWorkspaceInitializ
     }
 
     @Override
-    public void initialize(NodeBuilder builder, String workspaceName, QueryEngineSettings queryEngineSettings, QueryIndexProvider indexProvider, CommitHook commitHook) {
+    public void initialize(NodeBuilder builder, String workspaceName) {
         for (WorkspaceInitializer tracker : initializers) {
-            tracker.initialize(builder, workspaceName, queryEngineSettings, indexProvider, commitHook);
+            tracker.initialize(builder, workspaceName);
         }
 
     }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/OakInitializer.java Fri Apr 11 13:48:37 2014
@@ -23,11 +23,9 @@ import javax.annotation.Nonnull;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider;
 import org.apache.jackrabbit.oak.plugins.index.IndexUpdateProvider;
-import org.apache.jackrabbit.oak.query.QueryEngineSettings;
 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.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
@@ -53,13 +51,10 @@ public final class OakInitializer {
     public static void initialize(@Nonnull Iterable<WorkspaceInitializer> initializer,
                                   @Nonnull NodeStore store,
                                   @Nonnull String workspaceName,
-                                  @Nonnull IndexEditorProvider indexEditor,
-                                  QueryEngineSettings queryEngineSettings,
-                                  @Nonnull QueryIndexProvider indexProvider,
-                                  @Nonnull CommitHook commitHook) {
+                                  @Nonnull IndexEditorProvider indexEditor) {
         NodeBuilder builder = store.getRoot().builder();
         for (WorkspaceInitializer wspInit : initializer) {
-            wspInit.initialize(builder, workspaceName, queryEngineSettings, indexProvider, commitHook);
+            wspInit.initialize(builder, workspaceName);
         }
         try {
             CommitHook hook = new EditorHook(new IndexUpdateProvider(indexEditor));

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/WorkspaceInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/WorkspaceInitializer.java?rev=1586655&r1=1586654&r2=1586655&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/WorkspaceInitializer.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/lifecycle/WorkspaceInitializer.java Fri Apr 11 13:48:37 2014
@@ -16,9 +16,6 @@
  */
 package org.apache.jackrabbit.oak.spi.lifecycle;
 
-import org.apache.jackrabbit.oak.query.QueryEngineSettings;
-import org.apache.jackrabbit.oak.spi.commit.CommitHook;
-import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 
 /**
@@ -32,10 +29,7 @@ public interface WorkspaceInitializer {
 
     WorkspaceInitializer DEFAULT = new WorkspaceInitializer() {
         @Override
-        public void initialize(
-                NodeBuilder builder, String workspaceName,
-                QueryEngineSettings queryEngineSettings, 
-                QueryIndexProvider indexProvider, CommitHook commitHook) {
+        public void initialize(NodeBuilder builder, String workspaceName) {
         }
     };
 
@@ -45,12 +39,6 @@ public interface WorkspaceInitializer {
      *
      * @param builder       builder for accessing and modifying the workspace
      * @param workspaceName The name of the workspace that is being initialized.
-     * @param indexProvider The query index provider used within this workspace.
-     * @param commitHook    The commit hook(s) defined for this workspace.
      */
-    void initialize(NodeBuilder builder, 
-                         String workspaceName,
-                         QueryEngineSettings queryEngineSettings,
-                         QueryIndexProvider indexProvider,
-                         CommitHook commitHook);
+    void initialize(NodeBuilder builder, String workspaceName);
 }

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=1586655&r1=1586654&r2=1586655&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 Fri Apr 11 13:48:37 2014
@@ -22,14 +22,17 @@ import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+
 import javax.jcr.NamespaceException;
 import javax.jcr.RepositoryException;
 import javax.jcr.security.Privilege;
 import javax.jcr.version.OnParentVersionAction;
 
 import org.apache.jackrabbit.core.RepositoryContext;
+import org.apache.jackrabbit.core.config.BeanConfig;
+import org.apache.jackrabbit.core.config.LoginModuleConfig;
 import org.apache.jackrabbit.core.config.RepositoryConfig;
-import org.apache.jackrabbit.core.config.UserManagerConfig;
+import org.apache.jackrabbit.core.config.SecurityConfig;
 import org.apache.jackrabbit.core.fs.FileSystem;
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
@@ -46,12 +49,16 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.plugins.name.Namespaces;
 import org.apache.jackrabbit.oak.plugins.nodetype.TypeEditorProvider;
 import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
+import org.apache.jackrabbit.oak.security.SecurityProviderImpl;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.CompositeEditorProvider;
 import org.apache.jackrabbit.oak.spi.commit.CompositeHook;
 import org.apache.jackrabbit.oak.spi.commit.EditorHook;
+import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
+import org.apache.jackrabbit.oak.spi.security.SecurityConfiguration;
 import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeBits;
+import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -68,7 +75,10 @@ import org.apache.jackrabbit.spi.QValueC
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+
 import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Lists.newArrayListWithCapacity;
 import static com.google.common.collect.Maps.newHashMap;
 import static java.util.Arrays.asList;
@@ -211,8 +221,16 @@ public class RepositoryUpgrade {
         try {
             NodeBuilder builder = target.getRoot().builder();
 
+            String workspace =
+                    source.getRepositoryConfig().getDefaultWorkspaceName();
+            SecurityProviderImpl security = new SecurityProviderImpl(
+                    mapSecurityConfig(config.getSecurityConfig()));
+
             // init target repository first
             new InitialContent().initialize(builder);
+            for (SecurityConfiguration sc : security.getConfigurations()) {
+                sc.getWorkspaceInitializer().initialize(builder, workspace);
+            }
 
             Map<String, String> uriToPrefix = newHashMap();
             Map<Integer, String> idxToPrefix = newHashMap();
@@ -222,30 +240,67 @@ public class RepositoryUpgrade {
 
             NodeState root = builder.getNodeState();
             copyVersionStore(builder, root, uriToPrefix, idxToPrefix);
-            copyWorkspaces(builder, root, uriToPrefix, idxToPrefix);
+            copyWorkspace(builder, root, workspace, uriToPrefix, idxToPrefix);
 
             logger.info("Applying default commit hooks");
-            String groupsPath;
-            UserManagerConfig userConfig = config.getSecurityConfig().getSecurityManagerConfig().getUserManagerConfig();
-            if (userConfig != null) {
-                groupsPath = userConfig.getParameters().getProperty(UserManagerImpl.PARAM_GROUPS_PATH, UserConstants.DEFAULT_GROUP_PATH);
-            } else {
-                groupsPath = UserConstants.DEFAULT_GROUP_PATH;
-            }
             // TODO: default hooks?
-            CommitHook hook = new CompositeHook(
-                    new EditorHook(new GroupEditorProvider(groupsPath)),
-                    new EditorHook(new CompositeEditorProvider(
+            List<CommitHook> hooks = newArrayList();
+
+            UserConfiguration userConf =
+                    security.getConfiguration(UserConfiguration.class);
+            String groupsPath = userConf.getParameters().getConfigValue(
+                    UserConstants.PARAM_GROUP_PATH,
+                    UserConstants.DEFAULT_GROUP_PATH);
+            hooks.add(new EditorHook(new GroupEditorProvider(groupsPath)));
+            hooks.add(new EditorHook(new CompositeEditorProvider(
+                            new GroupEditorProvider(groupsPath),
                             new TypeEditorProvider(false),
                             new IndexUpdateProvider(new CompositeIndexEditorProvider(
                                     new ReferenceEditorProvider(),
                                     new PropertyIndexEditorProvider())))));
-            target.merge(builder, hook, CommitInfo.EMPTY);
+
+            for (SecurityConfiguration sc : security.getConfigurations()) {
+                hooks.addAll(sc.getCommitHooks(workspace));
+            }
+
+            target.merge(builder, CompositeHook.compose(hooks), CommitInfo.EMPTY);
         } catch (Exception e) {
             throw new RepositoryException("Failed to copy content", e);
         }
     }
 
+    private ConfigurationParameters mapSecurityConfig(SecurityConfig config) {
+        ConfigurationParameters loginConfig = mapConfigurationParameters(
+                config.getLoginModuleConfig(),
+                LoginModuleConfig.PARAM_ADMIN_ID, UserConstants.PARAM_ADMIN_ID,
+                LoginModuleConfig.PARAM_ANONYMOUS_ID, UserConstants.PARAM_ANONYMOUS_ID);
+        ConfigurationParameters userConfig = mapConfigurationParameters(
+                config.getSecurityManagerConfig().getUserManagerConfig(),
+                UserManagerImpl.PARAM_USERS_PATH, UserConstants.PARAM_USER_PATH,
+                UserManagerImpl.PARAM_GROUPS_PATH, UserConstants.PARAM_GROUP_PATH,
+                UserManagerImpl.PARAM_DEFAULT_DEPTH, UserConstants.PARAM_DEFAULT_DEPTH,
+                UserManagerImpl.PARAM_PASSWORD_HASH_ALGORITHM, UserConstants.PARAM_PASSWORD_HASH_ALGORITHM,
+                UserManagerImpl.PARAM_PASSWORD_HASH_ITERATIONS, UserConstants.PARAM_PASSWORD_HASH_ITERATIONS);
+        return ConfigurationParameters.of(ImmutableMap.of(
+                UserConfiguration.NAME,
+                ConfigurationParameters.of(loginConfig, userConfig)));
+    }
+
+    private ConfigurationParameters mapConfigurationParameters(
+            BeanConfig config, String... mapping) {
+        Map<String, String> map = newHashMap();
+        if (config != null) {
+            Properties properties = config.getParameters();
+            for (int i = 0; i + 1 < mapping.length; i += 2) {
+                String value = properties.getProperty(mapping[i]);
+                if (value != null) {
+                    map.put(mapping[i + 1], value);
+                }
+            }
+        }
+        return ConfigurationParameters.of(map);
+    }
+
     private String getOakName(Name name) throws NamespaceException {
         String uri = name.getNamespaceURI();
         String local = name.getLocalName();
@@ -557,15 +612,11 @@ public class RepositoryUpgrade {
                 "/jcr:system/jcr:activities", copyBinariesByReference));
     }   
 
-    private void copyWorkspaces(
-            NodeBuilder builder, NodeState root,
+    private String copyWorkspace(
+            NodeBuilder builder, NodeState root, String name,
             Map<String, String> uriToPrefix, Map<Integer, String> idxToPrefix)
             throws RepositoryException, IOException {
-        logger.info("Copying default workspace");
-
-        // Copy all the default workspace content
-        RepositoryConfig config = source.getRepositoryConfig();
-        String name = config.getDefaultWorkspaceName();
+        logger.info("Copying workspace {}", name);
 
         PersistenceManager pm =
                 source.getWorkspaceInfo(name).getPersistenceManager();
@@ -582,7 +633,7 @@ public class RepositoryUpgrade {
             }
         }
 
-        // TODO: Copy all the active open-scoped locks
+        return name;
     }