Alfrescoに保存されているドキュメント(またはスペース)のNodeRefを取得したい。Alfresco NodeRefをパスで取得する(リアルタイム、競合状態に安全)
私のコードはAlfresco(AMPなど)で動作するJavaで書かれています。
私のコードは競合状態に対して安全でなければなりません。たとえば、前に作成されたノードを見つける必要があります。この場合、usual methods(検索ベース)は使用できません。
どのようにすればいいですか?
Alfrescoに保存されているドキュメント(またはスペース)のNodeRefを取得したい。Alfresco NodeRefをパスで取得する(リアルタイム、競合状態に安全)
私のコードはAlfresco(AMPなど)で動作するJavaで書かれています。
私のコードは競合状態に対して安全でなければなりません。たとえば、前に作成されたノードを見つける必要があります。この場合、usual methods(検索ベース)は使用できません。
どのようにすればいいですか?
those APIs are only Eventually Consistent
は、具体的には、あなたがcanned queriesに基づいているAPIを必要としてあなたは、SOLRに触れる何かを避けるために必要があります。あなたのユースケースの主なものはNodeService.getChildAssocsとNodeService.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;
このメソッドは、会社のホーム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.
}
}
公開ドメイン、
トランザクショナルクエリは、少なくともある程度は、サポートされています:-)編集し、改善して自由に感じます。 http://docs.alfresco.com/5.2/concepts/intrans-metadata-overview.html
異なるノードが同じノードを同時に変更する別のWebスクリプトを呼び出すときに役立つと説明してください。ありがとうございました! :-) –
'FileFolderService.resolveNamePath'は' searchSimple() 'メソッドを呼び出し、これは' nodeService.getChildByName() 'を呼び出します。ですから、 'FileService.resolveNamePath()'メソッドを呼び出す代わりに 'nodeService.getChildByName()'を直接呼び出すことをお勧めします。 –
チップをありがとう!私の目標は、ホイールを再発明しないことでした。したがって、自分でループを実装するのではなく、1つの呼び出しを行います。しかし、再利用でパフォーマンスを重視するプロジェクトでは、Gagravarrのソリューションを実際に使用する必要があります:-) –