我想获取存储在Alfresco中的文档(或空间)的NodeRef。
我的代码是Java,在Alfresco中运行(例如在AMP中)。
我的代码需要对竞争条件安全,例如它必须找到之前创建的节点。在此上下文中,不能使用example jsfiddle(基于搜索)。
怎么办?
答案 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.getChildAssocs和NodeService.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