通过路径获取Alfresco NodeRef(实时,竞争条件安全)

时间:2017-04-05 08:11:17

标签: java alfresco

我想获取存储在Alfresco中的文档(或空间)的NodeRef。

我的代码是Java,在Alfresco中运行(例如在AMP中)。

我的代码需要对竞争条件安全,例如它必须找到之前创建的节点。在此上下文中,不能使用example jsfiddle(基于搜索)。

怎么办?

3 个答案:

答案 0 :(得分:2)

此方法获取公司主页NodeRef,它始终可用(至少从基于Alfresco的应用程序的角度来看),然后使用不基于搜索的FileFolderService.resolveNamePath

预期路径的语法示例:/Company Home/Shared/My Folder/123.txt

public NodeRef getNode(String path) {

    // Get company home NodeRef. No race condition because it is always exists.
    NodeRef companyHomeNode = nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);

    // Get NodeRef for the path using path elements and resolveNamePath.
    List<String> pathElements = new LinkedList<>(Arrays.asList(path.split("/")));
    pathElements.remove(0); // Remove leading empty element before first slash
    pathElements.remove(0); // Remove Company Home element
    try {
        FileInfo fileInfo = fileFolderService.resolveNamePath(
                companyHomeNode, pathElements);
        return fileInfo.getNodeRef();
    } catch (FileNotFoundException e) {
        return null; // No node with such a path.
    }
}

公共领域,随时可以编辑和改进: - )

答案 1 :(得分:1)

你需要避免任何触及SOLR的事情,如those APIs are only Eventually Consistent

具体而言,您需要一个基于canned queries的API。您的用例的主要内容是NodeService.getChildAssocsNodeService.getChildByName。部分FileFolderService也会立即生效

您最好的选择是将路径拆分为组件,然后通过它进行递归/循环下降。根据您是否需要名称(cm:name)或QName(基于关联),您可以使用两种NodeService方法中的一种

例如(未完全测试......)

String[] parts = path.split("\\/");
NodeRef nodeRef = nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE);
for (String name : parts) {
   NodeRef child = nodeService.getChildByName(nodeRef, ContentModel.ASSOC_CONTAINS, name);
   if (child == null) 
      throw new Exception("Path part not found "+name+" in "+path+" at "+nodeRef);
   nodeRef = child;
}
return nodeRef;

答案 2 :(得分:0)

至少在某种程度上支持事务性查询。 http://docs.alfresco.com/5.2/concepts/intrans-metadata-overview.html