2011-03-01 19 views
7

¿alguien puede explicarme cómo proceder en la siguiente situación?Almacenar metadatos en el repositorio de Jackrabbit

  1. recepción de documentos (docs MS, ODS, PDF)

  2. Dublic extracción núcleo de metadatos a través de la extracción de contenido Apache Tika + a través de Jackrabbit de contenido-centrifugadoras

  3. utilizando Jackrabbit para almacenar documentos (contenido) en el repositorio junto con sus metadatos?

  4. recuperación de documentos de metadatos +

Estoy interesado en los puntos 3 y 4 ...

DETALLES: La aplicación está procesando documentos de forma interactiva (algunos análisis - detección de idioma, conteo de palabras, etc. + recopilar tantos detalles como sea posible - Dublín core + analizar el manejo de contenido/eventos) para que el usuario registre los resultados del procesamiento y luego el contenido extraído y los metadatos (metadatos de usuarios extraídos y personalizados) se guarden en el repositorio de JCR

agradecería cualquier ayuda, gracias

+0

¿Puede dar un poco más de contexto? ¿Puedes ser más específico en cuanto a tu pregunta? ¿De dónde vino esta lista de artículos? – jzd

+0

@jzd: No estoy familiarizado con JCR y Jackrabbit y no puedo encontrar ninguna referencia sobre cómo se maneja esto. – lisak

+0

Los documentos se cargan en mi aplicación, en cada documento cargado se procesa y persiste el documento – lisak

Respuesta

26

La carga de archivos es básicamente la misma para JCR 2.0 que para JCR 1.0. Sin embargo, JCR 2.0 agrega algunas definiciones adicionales de propiedad incorporadas que son útiles.

El "nt: archivo" tipo de nodo está destinado a representar un archivo y tiene dos incorporado en definiciones de propiedades en JCR 2,0 (ambos de los cuales son auto-creada por el repositorio cuando se crean nodos):

  • JCR: creada (FECHA)
  • JCR: CreatedBy (CADENA)

y define un único hijo llamado "JCR: contenido". Este nodo "jcr: content" puede ser de cualquier tipo de nodo, pero en general toda la información perteneciente al contenido se almacena en este nodo secundario.El estándar de facto es utilizar el "nt: recurso" tipo de nodo, que tiene estas propiedades definidas:

  • JCR: datos (binario) obligatoria
  • JCR: lastModified (FECHA) autocreated
  • JCR: lastModifiedBy (STRING) autocreated
  • jcr: mimeType (STRING) protected?
  • jcr: ¿codificación (STRING) protegida?

Tenga en cuenta que "jcr: mimeType" y "jcr: encoding" se agregaron en JCR 2.0.

En particular, el propósito de la propiedad "jcr: mimeType" era hacer exactamente lo que está pidiendo: capturar el "tipo" del contenido. Sin embargo, las definiciones de propiedades "jcr: mimeType" y "jcr: encoding" se pueden definir (mediante la implementación de JCR) como protegidas (es decir, la implementación de JCR las establece automáticamente); si este es el caso, no se le podría permitir establecer estas propiedades. Creo que Jackrabbit y ModeShape no los tratan como protegidos.

Aquí hay un código que muestra cómo cargar un archivo en un repositorio JCR 2.0 el uso de estos tipos de nodos integrados:

// Get an input stream for the file ... 
File file = ... 
InputStream stream = new BufferedInputStream(new FileInputStream(file)); 

Node folder = session.getNode("/absolute/path/to/folder/node"); 
Node file = folder.addNode("Article.pdf","nt:file"); 
Node content = file.addNode("jcr:content","nt:resource"); 
Binary binary = session.getValueFactory().createBinary(stream); 
content.setProperty("jcr:data",binary); 

Y si la implementación JCR no trata el "JCR: mimeType" propiedad como protegidos (es decir, liebre y ModeShape), habría que establecer esta propiedad manualmente:

content.setProperty("jcr:mimeType","application/pdf"); 

los metadatos pueden ser fácilmente almacenado en el "NT: archivo" y "JCR: contenido de" nodos, pero fuera Los tipos de nodo "nt: file" y "nt: resource" de la caja no permiten propiedades adicionales. Entonces, antes de que pueda agregar otras propiedades, primero necesita agregar una mezcla (o varias mezclas) que tengan definiciones de propiedades para los tipos de propiedades que desea almacenar. Incluso puede definir un mixin que permita cualquier propiedad. Aquí está un archivo CND definiendo un mixin como:

<custom = 'http://example.com/mydomain'> 
[custom:extensible] mixin 
- * (undefined) multiple 
- * (undefined) 

Después de registrar esta definición de tipo de nodo, a continuación, puede utilizar esto en sus nodos:

content.addMixin("custom:extensible"); 
content.setProperty("anyProp","some value"); 
content.setProperty("custom:otherProp","some other value"); 

También puede definir y utilizar un mixin que permitió para cualquier Dublin Core element:

Todas estas propiedades son opcionales, y esto no permite mixin para las propiedades de cualquier nombre o tipo. Tampoco he abordado realmente con esta mezcla de 'dc: metadata' el hecho de que algunos de estos ya están representados con las propiedades integradas (por ejemplo, "jcr: createBy", "jcr: lastModifiedBy", "jcr: created" , "jcr: lastModified", "jcr: mimeType") y que algunos de ellos pueden estar más relacionados con el contenido, mientras que otros están más relacionados con el archivo.

Por supuesto, podría definir otras mezclas que se ajusten mejor a sus necesidades de metadatos, utilizando la herencia cuando sea necesario. Pero tenga cuidado al usar la herencia con mixins, ya que JCR permite un nodo a múltiples mixins, a menudo es mejor diseñar sus mixins para que sean estrechamente orientadas y orientadas a facetas (por ejemplo, "ex: taggable", "ej .: descripable", etc.) y luego simplemente aplica las mezclas apropiadas a un nodo según sea necesario.

(Incluso es posible, aunque mucho más complicado, definir una mezcla que permita más hijos en los nodos "nt: file", y almacenar allí algunos metadatos.)

Mixins son fantásticos y le dan una gran cantidad de flexibilidad y potencia a su contenido JCR.

Ah, y cuando se haya creado todos los nodos que desea, asegúrese de guardar la sesión:

session.save(); 
+0

muchas gracias por la brillante explicación. Ahora tengo una idea general de cómo implementar mi aplicación. Por cierto, ¿cómo lidiar con el caso de uso, cuando los documentos SIEMPRE están en pares? Por ejemplo, si fue para una empresa de traducción: archivo de origen x archivo de destino (francés> inglés). ¿Creo un nodo padre "Files" que sería una carpeta y dos nodos secundarios "sourceFile" y "targetFile"? – lisak

+0

El soporte de traducciones y múltiples idiomas es difícil. Puedo pensar en varias formas de manejarlo: 1) Use archivos separados, y de alguna manera los vincule. Su sugerencia de 'fuente' y 'objetivo' es forma; otro podría ser tener 'translateFrom' como una propiedad PATH o (WEAK) REFERENCE. 2) Trate los archivos como iguales y, por lo tanto, tenga un nodo "nt: file", pero con múltiples nodos de tipo "jcr: content" (por ejemplo, tal vez "jcr: content" para el idioma predeterminado y "ex: content -fr "y" ex: content-en "). También hay otras posibilidades. –

+0

Tuve que posponer esto hasta ahora, porque necesitaba que también fuera compatible con CMIS. Las asociaciones CMIS y jcr de OpenCMIS no se ocupan de los "tipos secundarios" hasta http://tools.oasis-open.org/issues/browse/CMIS-713 ... Pero va a necesitar algo más de tiempo. Ahora, opencmis funciona con carpeta, archivo y mezcla: simpleVersionable ... Así que finalmente tengo una sola opción: carpeta> [carpetaFuente, carpetaDiamante]> archivos ... – lisak

1

estoy un poco oxidado con JCR y nunca he utilizado 2.0 pero esto debe empezar.

Ver esto link. Querrá abrir el segundo comentario.

Simplemente almacena el archivo en un nodo y agrega metadatos adicionales al nodo. Aquí es cómo almacenar el archivo:

Node folder = session.getRootNode().getNode("path/to/file/uploads"); 
Node file = folder.addNode(fileName, "nt:file"); 
Node fileContent = file.addNode("jcr:content"); 
fileContent.setProperty("jcr:data", fileStream); 
// Add other metadata 
session.save(); 

Cómo usted almacena los metadatos depende de usted. Una forma sencilla es simplemente almacenar pares de valores clave:

fileContent.setProperty(key, value, PropertyType.STRING); 

para leer los datos que acaba de llamar getProperty().

fileStream = fileContent.getProperty("jcr:data"); 
value = fileContent.getProperty(key); 
+0

Gracias. El problema de este caso de uso es que los documentos son totalmente diferentes en cuanto al tipo de metadatos. De modo que si el árbol de nodos tiene una estructura de "grupo/usuario/categoría/documento" o "categoría/grupo/usuario/documento" (no estoy seguro de qué es mejor), cada documento debería tener una propiedad " escriba "si es pdf/doc/odt/ppt etc., y tendría que probar esto cada vez – lisak

+0

Me sorprendería que la línea 3 en el fragmento de código anterior realmente funciona, porque según la especificación JCR (Sección 3.7) .11.2 de JCR 2.0 y Sección 6.7.22.6 de JCR 1.0) el nodo "jcr: content" es obligatorio pero no se crea automáticamente. –

1

Soy nuevo en Jackrabbit, trabajando en 2.4.2. En cuanto a su solución, puede verificar el tipo utilizando una lógica Java básica y colocar casos que definan cualquier variación en su acción.

No tendrá que preocuparse por problemas con el almacenamiento de contenidos de .txt o .pdf diferentes ya que su contenido se convierte en binario y se guarda. Aquí hay una pequeña muestra en la que cargué y descargué un archivo pdf en/desde el repositorio de Jackrabbit.

// Import the pdf file unless already imported 
      // This program is for sample purpose only so everything is hard coded. 
     if (!root.hasNode("Alfresco_E0_Training.pdf")) 
     { 
      System.out.print("Importing PDF... "); 

      // Create an unstructured node under which to import the XML 
      //Node node = root.addNode("importxml", "nt:unstructured"); 
      Node file = root.addNode("Alfresco_E0_Training.pdf","nt:file"); 

      // Import the file "Alfresco_E0_Training.pdf" under the created node 
      FileInputStream stream = new FileInputStream("<path of file>\\Alfresco_E0_Training.pdf"); 
      Node content = file.addNode("jcr:content","nt:resource"); 
      Binary binary = session.getValueFactory().createBinary(stream); 
      content.setProperty("jcr:data",binary); 
      stream.close(); 
      session.save(); 
      //System.out.println("done."); 
      System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::"); 
      System.out.println("File Node Name : "+file.getName()); 
      System.out.println("File Node Identifier : "+file.getIdentifier()); 
      System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION); 
      System.out.println("Content Node Name : "+content.getName()); 
      System.out.println("Content Node Identifier : "+content.getIdentifier()); 
      System.out.println("Content Node Content : "+content.getProperty("jcr:data")); 
      System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"); 

     }else 
     { 
      session.save(); 
      Node file = root.getNode("Alfresco_E0_Training.pdf"); 
      Node content = file.getNode("jcr:content"); 
      String path = content.getPath(); 
      Binary bin = session.getNode(path).getProperty("jcr:data").getBinary(); 
      InputStream stream = bin.getStream(); 
      File f=new File("C:<path of the output file>\\Alfresco_E0_Training.pdf"); 

       OutputStream out=new FileOutputStream(f); 
       byte buf[]=new byte[1024]; 
       int len; 
       while((len=stream.read(buf))>0) 
       out.write(buf,0,len); 
       out.close(); 
       stream.close(); 
       System.out.println("\nFile is created..................................."); 


      System.out.println("done."); 
      System.out.println("::::::::::::::::::::Checking content of the node:::::::::::::::::::::::::"); 
      System.out.println("File Node Name : "+file.getName()); 
      System.out.println("File Node Identifier : "+file.getIdentifier()); 
      //System.out.println("File Node child : "+file.JCR_CHILD_NODE_DEFINITION); 
      System.out.println("Content Node Name : "+content.getName()); 
      System.out.println("Content Node Identifier : "+content.getIdentifier()); 
      System.out.println("Content Node Content : "+content.getProperty("jcr:data")); 
      System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"); 
     } 

     //output the repository content 
     } 
    catch (IOException e){ 
     System.out.println("Exception: "+e); 
    } 
    finally { 
     session.logout(); 
     } 
     } 
} 

Esperanza esto ayuda

Cuestiones relacionadas