2011-01-13 14 views
12

Ho il seguente codice per inserire "rose.gif" in un roseNode. Ma come posso recuperare il file dal repository?Recupera file dal nodo file JCR

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); 

risposta

16

L'unica cosa che si ha realmente bisogno di fare è ottenere il nome del file dal nome del "nt: file" nodo e il contenuto per il file dalla "JCR: i dati" proprietà sul nodo figlio "jcr: content".

JCR 1.0 e 2.0 differiscono un po 'nel modo in cui si ottiene il flusso per il valore di proprietà "jcr: data" binario. Se stai usando JCR 1.0, allora il codice sarebbe stato così:

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

Se stai usando JCR 2.0, l'ultima riga è un po 'diverso, perché è necessario prima di ottenere l'oggetto Binary dalla proprietà valore:

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

È quindi possibile utilizzare utilità standard flusso di Java per scrivere i byte dal flusso di 'contenuto' nel file.

Quando hai finito con l'oggetto binario, assicurati di chiamare il metodo dispose() di Binary per dire che hai finito con il binario e che l'implementazione può rilasciare tutte le risorse acquisite dall'oggetto binario. Dovresti sempre farlo, anche se alcune implementazioni JCR cercano di intercettare errori di programmazione restituendo uno stream che, una volta chiuso, chiamerà automaticamente dispose() per te.

+0

Hi Randall, quello che voglio è un OutputStream e non un flusso di input. È possibile? – Steve

+0

L'ho capito. Ho appena convertito l'inputStream in un outputStream byte per byte. – Steve

+0

Per 2.0, penso che devi chiamare Binary.dispose() quando hai finito con l'oggetto binario (http://www.day.com/specs/jcr/2.0/5_Reading.html). –