2012-03-22 61 views
1

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

的JCR 2.0医生说使用Workspace.createWorkspace(字符串名称)

如何让我的资料库,这部分使用的代码在这篇文章底部得到?

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

感谢

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(); 
    } 
} 
+0

振形支持使用标准的API,以获得从RepositoryFactory存储库,并登录到存储库来获取会话。所以大多数客户可以/应该只使用标准接口。但标准的JCR API没有指定一个存储库是否有名称,因此不提供获取存储库名称列表的方式。 ModeShape确实将存储库与名称相关联,因此提供了上面显示的ModeShape特定的接口。 – 2012-03-22 12:04:57

回答

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的一个子类)。

为了得到工作区的名单,得到会议的工作区对象,并调用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); 
+0

完美 - 谢谢 – user1016765 2012-03-23 14:08:30