2011-01-13 24 views
12

Tengo el siguiente código para insertar "rose.gif" en un roseNode. Pero, ¿cómo recupero el archivo del repositorio?Obtener archivo del archivo JCR Nodo

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

Respuesta

16

La única cosa que realmente necesita hacer es obtener el nombre del archivo desde el nombre de la "nt: archivo" nodo, y el contenido del archivo del "JCR: datos" propiedad de la nodo hijo "jcr: content".

JCR 1.0 y 2.0 difieren un poco en cómo obtiene la secuencia para el valor binario de la propiedad "jcr: data". Si utiliza JCR 1.0, a continuación, el código sería así:

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

Si utiliza JCR 2.0, la última línea es un poco diferente, porque primero tiene que obtener el objeto binario de la propiedad valor:

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

a continuación, puede utilizar la utilidad de corriente estándar de Java para escribir los bytes de la corriente de 'contenido' en el archivo.

Cuando haya terminado con el objeto Binario, asegúrese de llamar al método dispose() del Binario para decirle a la señal que ha terminado con el Binario y que la implementación puede liberar todos los recursos adquiridos por el objeto Binario. Siempre debe hacer esto, aunque algunas implementaciones de JCR intentan detectar errores de programación al devolver una secuencia que, cuando se cierra, automáticamente llamará al dispose().

+0

Hola Randall, lo que quiero es un OutputStream y no un flujo de entrada. es posible? – Steve

+0

Lo descubrí. Simplemente convertí el inputStream en un byte de flujo de salida por byte. – Steve

+0

Para 2.0, creo que debe llamar a Binary.dispose() cuando haya terminado con el objeto binario (http://www.day.com/specs/jcr/2.0/5_Reading.html). –

Cuestiones relacionadas