2017-04-05 6 views
0

Alfrescoに保存されているドキュメント(またはスペース)のNodeRefを取得したい。Alfresco NodeRefをパスで取得する(リアルタイム、競合状態に安全)

私のコードはAlfresco(AMPなど)で動作するJavaで書かれています。

私のコードは競合状態に対して安全でなければなりません。たとえば、前に作成されたノードを見つける必要があります。この場合、usual methods(検索ベース)は使用できません。

どのようにすればいいですか?

答えて

1

those APIs are only Eventually Consistent

は、具体的には、あなたがcanned queriesに基づいているAPIを必要としてあなたは、SOLRに触れる何かを避けるために必要があります。あなたのユースケースの主なものはNodeService.getChildAssocsNodeService.getChildByNameです。 FileFolderServiceのうちのいくつかはすぐにも機能します

あなたの最善の策は、パスをコンポーネントに分割してから、それを介して再帰/ループの降下を行うことです。あなたが(連想に基づく)名(cm:name)またはQNameのことで、それをしたい場合に応じて、次の2つの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; 
1

このメソッドは、会社のホーム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. 
    } 
} 

公開ドメイン、

+0

'FileFolderService.resolveNamePath'は' searchSimple() 'メソッドを呼び出し、これは' nodeService.getChildByName() 'を呼び出します。ですから、 'FileService.resolveNamePath()'メソッドを呼び出す代わりに 'nodeService.getChildByName()'を直接呼び出すことをお勧めします。 –

+0

チップをありがとう!私の目標は、ホイールを再発明しないことでした。したがって、自分でループを実装するのではなく、1つの呼び出しを行います。しかし、再利用でパフォーマンスを重視するプロジェクトでは、Gagravarrのソリューションを実際に使用する必要があります:-) –

0

トランザクショナルクエリは、少なくともある程度は、サポートされています:-)編集し、改善して自由に感じます。 http://docs.alfresco.com/5.2/concepts/intrans-metadata-overview.html

+0

異なるノードが同じノードを同時に変更する別のWebスクリプトを呼び出すときに役立つと説明してください。ありがとうございました! :-) –