创建新工作区

时间:2012-03-22 10:25:25

标签: jcr modeshape

Modeshape文档的第7.1.6节说“您的应用程序现在可以使用标准JCR 2.0 API创建和删除工作区。”

JCR 2.0 doc说使用Workspace.createWorkspace(String name)

如何使用此帖子底部的代码获取我的存储库的这一部分?

另外,如何获取存储库中已有的工作区列表?

由于

for (RepositoryFactory factory : ServiceLoader.load(RepositoryFactory.class)) {

    if (factory instanceof org.modeshape.jcr.api.RepositoryFactory) {
        org.modeshape.jcr.api.RepositoryFactory modeshapeRepositoryFactory = (org.modeshape.jcr.api.RepositoryFactory) factory;

        final Repositories repositories = modeshapeRepositoryFactory.getRepositories(JCR_CONFIG_FILE_URL);

        if (repositories != null) {

            Set<String> repositoryNames = repositories.getRepositoryNames();
            if (repositoryNames != null) {
                for (String repoName : repositoryNames) {
                    log.info(repoName);
                }
            }
        }
        else {
            System.out.println("repositories reference was null");
        }
    }

    try {

        repository = factory.getRepository(parameters);
        if (repository != null) {
            printRepoDetails(repository, parameters, factory);
            repositoryFactory = factory; // Keep reference to allow clean shutdown.  Not part of JCR 2.0
            break;
        }
    }
    catch (RepositoryException e) {
        log.error("Error getting repository: \n" + e.toString());
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:4)

javax.jcr.Repository接口允许您获取存储库的描述符并登录以建立与存储库中工作空间的会话。但是所有其他操作都需要身份验证和授权,这意味着可以使用javax.jcr.Session或通过其他特定于会话的接口(例如javax.jcr.Workspace)执行这些操作。

以下所示的所有示例均使用标准JCR API。

要获得会话,只需登录存储库:

javax.jcr.Repository repository = ...
javax.jcr.Session session = repository.login();

请注意,此调用不提供任何凭据,并导致使用默认工作区的“匿名”会话。匿名会话可能没有多少权限,因此您可能需要使用login方法的其他重载形式之一,以允许您提供凭据和/或工作空间名称的各种组合。 (ModeShape配置允许您指定默认工作空间的名称,控制是否允许匿名会话,以及指定匿名会话允许的角色。)如果指定工作空间名称且该工作空间不存在,则方法将抛出一个javax.jcr.NoSuchWorkspaceException异常(这是javax.jcr.RepositoryException的子类)。

要获取工作空间列表,请获取会话的Workspace对象并调用getAccessibleWorkspaceNames()方法:

javax.jcr.Workspace workspace = session.getWorkspace();
String[] workspaceNames = workspace.getAccessibleWorkspaceNames();

然后,您可以使用工作区名称执行某些操作,例如检查您所需的工作区是否已存在。

要创建新的 工作区,只需使用Workspace对象:

String newWorkspaceName = ...
workspace.createWorkspace(newWorkspaceName);

或者,您可以创建一个新工作区,该工作区是现有工作区的 副本

String newWorkspaceName = ...
String originalWorkspaceName = ...
workspace.createWorkspace(newWorkspaceName,originalWorkspaceName);

请注意,mix:referenceable节点在原始工作空间和新工作空间中都具有相同的标识符。这是JCR工作空间的一个重要特征,通常是使用单独工作空间(而不是单个工作空间的单独区域)的一个重要原因。有关更多详细信息,请参阅JSR-283规范。

最后,您也可以销毁现有的工作区:

String existingWorkspaceName
workspace.deleteWorkspace(existingWorkspaceName);