2017-04-05 3 views
0

Ich möchte die NodeRef eines Dokuments (oder Speicherplatz) in Alfresco gespeichert werden.Get Alfresco NodeRef nach Pfad (Echtzeit, Race-Bedingung sicher)

Mein Code ist in Java, läuft in Alfresco (zum Beispiel in einem AMP).

Mein Code muss sicher vor Wettlaufbedingungen sein, zum Beispiel muss er Knoten finden, die eine Sekunde vorher erstellt wurden. In diesem Zusammenhang kann die usual methods (search-based) nicht verwendet werden.

Wie vorgehen?

Antwort

1

Sie müssen alles vermeiden, was SOLR berührt, wie those APIs are only Eventually Consistent

Insbesondere müssen Sie eine API, die auf canned queries basiert. Die wichtigsten für Ihren Anwendungsfall sind NodeService.getChildAssocs und NodeService.getChildByName. Einige von FileFolderService funktionieren sofort auch

Ihre beste Wette wäre, einen Pfad in Komponenten aufzuteilen, dann einen rekursiven/Looping-Abstieg durch sie durchzuführen. Je nachdem, ob Sie es nach Namen wollen (cm:name) oder QName (bezogen auf das Assoc), dann würden Sie eine der beiden Methoden verwenden NodeService

zB (nicht vollständig getestet ...)

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

Diese Methode ruft die Firma Home NodeRef ab, die immer verfügbar ist (zumindest aus Sicht der Alfresco-basierten Anwendung) und dann FileFolderService.resolveNamePath verwendet, die nicht auf der Suche basiert.

Syntax Beispiel der erwarteten Pfad: /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. 
    } 
} 

Public domain, fühlen Sie sich frei :-) zu bearbeiten und verbessern

+0

'FileFolderService.resolveNamePath' ruft' searchSimple() 'Methode auf und ruft' nodeService.getChildByName() 'auf. Daher würde ich empfehlen, 'nodeService.getChildByName()' direkt aufzurufen, anstatt 'FileFolderService.resolveNamePath()' Methode aufzurufen. –

+0

Danke für den Tipp! Mein Ziel war es, das Rad nicht neu zu erfinden, und daher einen Anruf zu machen, anstatt die Schleife selbst zu implementieren. Aber Projekte, die Leistung über Wiederverwendung wertschätzen, sollten in der Tat die Lösung von Gagravarr verwenden :-) –

Verwandte Themen