2

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

JCR 2.0 文档说要使用 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();
    }
}
4

1 回答 1

6

javax.jcr.Repository界面允许您获取存储库的描述符并登录以建立与存储库中工作区的会话。但是所有其他操作都需要身份验证和授权,这意味着它们可以使用 ajavax.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);
于 2012-03-22T11:55:26.360 回答