diff --git a/magnolia-core/src/main/java/info/magnolia/repository/DefaultRepositoryManager.java b/magnolia-core/src/main/java/info/magnolia/repository/DefaultRepositoryManager.java index e91a561..cdfa55f 100644 --- a/magnolia-core/src/main/java/info/magnolia/repository/DefaultRepositoryManager.java +++ b/magnolia-core/src/main/java/info/magnolia/repository/DefaultRepositoryManager.java @@ -64,6 +64,7 @@ import javax.jcr.Node; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.Workspace; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; @@ -176,6 +177,22 @@ public final class DefaultRepositoryManager implements RepositoryManager { for (WorkspaceMappingDefinition workspaceMapping : mapping.getWorkspaceMappings()) { this.workspaceMapping.addWorkspaceMappingDefinition(workspaceMapping); } + + // some workspaces might exist even if they are not mapped ... provider knows about them so we should not exclude them. + for (RepositoryDefinition repoDefinition : workspaceMapping.getRepositoryDefinitions()) { + String repoName = repoDefinition.getName(); + Provider provider = workspaceMapping.getRepositoryProvider(repoName); + Session session = provider.getSystemSession("default"); + try { + for (String wksName : session.getWorkspace().getAccessibleWorkspaceNames()) { + if (!hasWorkspace(wksName)) { + loadWorkspace(repoName, wksName); + } + } + } finally { + session.logout(); + } + } } @Override @@ -242,6 +259,18 @@ public final class DefaultRepositoryManager implements RepositoryManager { return wrapSession(provider.getSystemSession(mapping.getPhysicalWorkspaceName()), logicalWorkspaceName); } + public void createWorkspace(String repository, String logicalWorkspaceName) throws RepositoryException { + for (WorkspaceMappingDefinition mapping : workspaceMapping.getWorkspaceMappings()) { + if (mapping.getRepositoryName().equals(repository)) { + Workspace workspace = getSystemSession(mapping.getLogicalWorkspaceName()).getWorkspace(); + workspace.createWorkspace(logicalWorkspaceName); + workspaceMapping.addWorkspaceMapping(new WorkspaceMappingDefinition(logicalWorkspaceName, repository, logicalWorkspaceName)); + return; + } + } + throw new RepositoryException("Repository [" + repository + "] doesn't exist."); + } + private Session wrapSession(Session session, String logicalWorkspaceName) { session = new TrackingSessionWrapper(session, JCRStats.getInstance()); if ("imaging".equals(logicalWorkspaceName) || "Expressions".equals(logicalWorkspaceName) || "Store".equals(logicalWorkspaceName) || "mgnlSystem".equals(logicalWorkspaceName)) { diff --git a/magnolia-core/src/main/java/info/magnolia/repository/RepositoryManager.java b/magnolia-core/src/main/java/info/magnolia/repository/RepositoryManager.java index 4928b47..77a110a 100644 --- a/magnolia-core/src/main/java/info/magnolia/repository/RepositoryManager.java +++ b/magnolia-core/src/main/java/info/magnolia/repository/RepositoryManager.java @@ -141,4 +141,13 @@ public interface RepositoryManager { * @return repository names */ Collection getWorkspaceNames(); + + /** + * Registers permanently new workspace and makes it available in Magnolia. + * + * @param repository Repository name. + * @param logicalWorkspaceName Workspace name. + */ + void createWorkspace(String repository, String logicalWorkspaceName) throws RepositoryException; + }