2011-01-13 6 views
12

Ich habe den folgenden Code, um "rose.gif" in einen roseNode einzufügen. Aber wie kann ich die Datei aus dem Repository abrufen?Datei aus dem JCR-Dateiknoten holen

Node roseNode = session.getRootNode().getNode("wiki:encyclopedia/wiki:entry[1]/"); 

    File file = new File("rose.gif"); 
    MimeTable mt = MimeTable.getDefaultTable(); 
    String mimeType = mt.getContentTypeFor(file.getName()); 
    if (mimeType == null) mimeType = "application/octet-stream"; 

    Node fileNode = roseNode.addNode(file.getName(), "nt:file"); 

    System.out.println(fileNode.getName()); 

    Node resNode = fileNode.addNode("jcr:content", "nt:resource"); 
    resNode.setProperty("jcr:mimeType", mimeType); 
    resNode.setProperty("jcr:encoding", ""); 
    resNode.setProperty("jcr:data", new FileInputStream(file)); 
    Calendar lastModified = Calendar.getInstance(); 
    lastModified.setTimeInMillis(file.lastModified()); 
    resNode.setProperty("jcr:lastModified", lastModified); 

    //retrieve file and output as rose-out.gif 
    File outputFile = new File("rose-out.gif"); 
    FileOutputStream out = new FileOutputStream(outputFile); 

Antwort

16

Das einzige, was Sie wirklich tun müssen, ist, den Namen der Datei aus dem Namen des „zt: Datei“ get-Knoten und den Inhalt für die Datei aus dem „jcr: data“ Eigenschaft auf dem Unterknoten "jcr: content"

JCR 1.0 und 2.0 unterscheiden sich ein wenig darin, wie Sie den Stream für den binären "jcr: data" -Eigenschaftswert erhalten. Wenn Sie mit JCR 1.0, dann würde der Code wie folgt sein:

Node fileNode = // find this somehow 
Node jcrContent = fileNode.getNode("jcr:content"); 
String fileName = fileNode.getName(); 
InputStream content = jcrContent.getProperty("jcr:data").getStream(); 

Wenn Sie mit JCR 2.0, die letzte Zeile ist ein bisschen anders, weil Sie zuerst das Binary-Objekt aus der Eigenschaft erhalten müssen Wert:

InputStream content = jcrContent.getProperty("jcr:data").getBinary().getStream(); 

Sie können dann Standard-Java-Stream-Dienstprogramm verwenden, um die Bytes aus dem 'Inhalt' Stream in die Datei zu schreiben.

Wenn Sie mit dem Binary-Objekt fertig sind, sollten Sie die dispose()-Methode des Binary aufrufen, um zu signalisieren, dass Sie mit Binary fertig sind und dass die Implementierung alle vom Binary-Objekt erworbenen Ressourcen freigeben kann. Sie sollten dies immer tun, auch wenn einige JCR-Implementierungen versuchen, Programmierfehler zu finden, indem Sie einen Stream zurücksenden, der beim Schließen automatisch dispose() für Sie aufruft.

+0

Hallo Randall, was ich will ist ein OutputStream und kein Eingabestream. Ist das möglich? – Steve

+0

Ich habe es herausgefunden. Ich habe den InputStream Byte für Byte in einen outputStream konvertiert. – Steve

+0

Für 2.0, ich denke, Sie müssen Binary.dispose() aufrufen, wenn Sie mit dem Binary-Objekt fertig sind (http://www.day.com/specs/jcr/2.0/5_Reading.html). –

Verwandte Themen