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();
¿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
@jzd: No estoy familiarizado con JCR y Jackrabbit y no puedo encontrar ninguna referencia sobre cómo se maneja esto. – lisak
Los documentos se cargan en mi aplicación, en cada documento cargado se procesa y persiste el documento – lisak