amap-gestor-documental

Última modificación por Administrator el 2019/07/08 11:46

AMAPGestorDocumental-2.1.1-RELEASE 2019/07/08

  • Al obtener un fichero, comprueba el contenido y tamaño del fichero, si no se puede leer lanza una excepción al usuario.

AMAPGestorDocumental-2.1.0-RELEASE 2018/10/19

  • Permite valores de repositorio vacios para usuarios que tienes acceso a varios repositorios

AMAPGestorDocumental-2.0.17-RELEASE 2018/05/21

  • Permite asociar metadatos  cuya metadatos sólo sean aspectos

AMAPGestorDocumental-2.0.16-RELEASE 2018/05/21

  • Se añade al método getFicheros argumentos opcionales:  
       - Recursivo: Indica si se genera el archivo de forma que agrege los ficheros de las carpetas hijas. Por defecto false.
       - Nivel: Indica el nivel de recursividad en las carpetas. Por defecto 0.
       - NombreConRuta: Indica si el nombre de los ficheros agregados en el comprimido sea su nombre más la ruta donde se encuentra. Por defecto false.

AMAPGestorDocumental-2.0.15-RELEASE 2017/12/04

  • Fixes menores

AMAPGestorDocumental-2.0.14-RELEASE 2017/11/07

  • Fixes menores

AMAPGestorDocumental-2.0.13-RELEASE 2017/09/13

  • Fixes menores

AMAPGestorDocumental-2.0.12-RELEASE 2017/05/22

  • Añadido timeout por defecto de 120 segundos.
  • Fixes menores

AMAPGestorDocumental-2.0.11-RELEASE 2017/05/17

  • Optimización del metodo de clonado.
  • Deprecado metodo getFicheroFiltrado(Carpeta carpeta,String tipoDocumental, List<Metadato> listaMetadatos) en pos de
    getFicheroFiltrado(Carpeta carpeta, List<Metadato> listaMetadatos, String tipoDocumental)

AMAPGestorDocumental-2.0.10-RELEASE 2017/03/03

  • Clonado de un Documento en una carpeta diferente.

AMAPGestorDocumental-2.0.8-RELEASE 2016/02/15

  • Acceso a los Aspectos de cada documento.
  • Añadir Metadatos tipo Aspectos

AMAPGestorDocumental-2.0.7-RELEASE 2015/5/04

  • Corrección de trazas y mejoras de flexibilidad de configuración

AMAPGestorDocumental-2.0.6-RELEASE 2015/5/04

  • Modificada la gestión de excepciones para representar mejor los problemas que pudieran presentarse.

AMAPGestorDocumental-2.0.5-RELEASE 2015/3/16

  • Correccion de bugs menores y relacionados con el empaquetado de carpetas.

AMAPGestorDocumental-2.0.4-RELEASE 2015/1/13

  • Correccion de bugs menores y relacionados con metadatos.

AMAPGestorDocumental-2.0.2-RELEASE 2014/12/10

  • Se utiliza añade la implementación cmis para las operaciones.
  • Correccion de bugs menores.
  • Se cambian la paquetería de "gestorDocumental" a "gestordocumental" por no cumplir el estandar AMAP.

AMAPGestorDocumental-0.0.7-RELEASE 2013/04/02

  • Se amplia el timeout a 3 minutos.
  • Correccion de bugs menores.

AMAPGestorDocumental-0.0.4-SNAPSHOT 2011/06/04

  • Se añade nueva implementación del servicio: MockServicioGestorDocumental.
<dependency>
<groupId>es.gobcantabria.amap.integracion</groupId>
<artifactId>amap-gestor-documental</artifactId>
<version>2.1.1</version>
</dependency>

Es necesario de disponer de los datos:

  • Usuario del Proxy de Servicios
  • Usuario de Alfresco.

Sin recursos disponibles.

Configuración

Configuración de la factoría de servicios

Para la utilización del componente AMAPGestorDocumental basta con añadir el jar y sus correspondientes dependencias al classpath de la aplicación y crear un servicio del siguiente modo:

Usuario usuario = new Usuario(nombre, clave, usuarioAuditoria, usuarioProxyWS);
ServicioGestorDocumental miservicio = ServicioGestorDocumental.getServicio(usuario, repositorio, urlServicio, 
    implementacion, urlServicioAuditoria, implementacionAuditoria);

El servicio concreto a usar se definirá a partir de un fichero de properties junto con el resto de los parámetros:

KeyDescripciónEjemplo
sistemas.app.amap.alfresco.passwordPassword necesaria para autenticarse en el gestor documental*
sistemas.app.amap.alfresco.usuarioAuditoriaUsuario necesario para realizar la auditoría de el gestor documental. Puramente informativo. La gestión de este usuario se realiza desde la aplicación consumidora del serviciosidgdit
sistemas.app.proxy.idaplicacionUsuario del Proxy de servicios corporativo. De no informar de este usuario no se realizará la autorización (Basic Authorization)sidgdit
sistemas.app.amap.alfresco.usuarioUsuario necesario para autenticarse en el gestor documentalg_sidgdit
sistemas.app.amap.alfresco.repositorioRepositorio del gestor documental con el que se va a trabajarsidgdit
sistemas.global.amap.alfresco.cmis.urlEndpoint del servicio web.http://*****/alfresco
sistemas.app.amap.alfresco.implementacionImplementación del gestor documental a usar. Existen tres: cmis, alfresco y mock, el uso de la implementación "alfresco" está obsoleta y no debe utilizarse.cmis
sistemas.global.amap.auditoria.urlEndpoint del servicio web de auditoria. Necesaria cuando se emplee la implementación de CMIS.http://******/proxyws/services/AuditoriaWS
sistemas.app.amap.auditoria.implementacionImplementación del servicio web de auditoria. Al igual que ocurre con el parámetro "urlServicioAuditoria", necesaria cuando se emplee la implementación de CMIS.httpclient
sistemas.app.amap.alfresco.readtimeoutmilisengudos de timeout que tendrá el cliente de gestor documental en su espera a una operación contra Alfresco. Por defecto si no se indica se usara el valor 120000.120000

Los valores de las propieades aquí mostrados son meramente ilustrativos. En los entornos de desarrollo / preproducción y producción los valores de las variables han de ser externalizados tal y como se especifica en el documento Definición de acceso a propiedades de sistema

Ejemplo de contenido del fichero de propiedades:

sistemas.app.amap.alfresco.password=*****
sistemas.app.amap.alfresco.usuarioAuditoria=PROXYWS
#Necesario en caso de entrar por ProxyWS
sistemas.app.proxy.idaplicacion=sidgdit
sistemas.app.amap.alfresco.usuario=g_sidgdit
sistemas.app.amap.alfresco.repositorio=sidgdit
sistemas.global.amap.alfresco.cmis.url=http://*****/alfresco
sistemas.app.amap.alfresco.implementacion=cmis
sistemas.global.amap.auditoria.url=http://*****/proxyws/services/AuditoriaWS
sistemas.app.amap.auditoria.implementacion=httpclient
|sistemas.app.amap.alfresco.readtimeout=120000

Migración a la versión 2.x

Para actualizar el componente a las versiones 2.x es necesario seguir los siguientes pasos:

1.- Actualizar la librería a versión 2.x
2.- Cambiar la paquetería de "gestorDocumental" a "gestordocumental" (la antigua no cumple el estandar de codificación AMAP).
3.- Cambiar el tipo de implementación de "alfresco" a "cmis".
4.- Reemplazar la propiedad "sistemas.global.amap.alfresco.url" por "sistemas.global.amap.alfresco.cmis.url".
5.- Solicitar el acceso a los servicios de auditoria del proxyws para la aplicación, en concreto para las operaciones AUDITORIA.insertAuditoria y AUDITORIA.insertAuditoriaError.
6.- Revisar el uso del método "addFichero", ya que en la versión 1.x  la carpeta en la que se almacenará el fichero se indicaba en el atributo "ruta" del objeto documento, mientras que en la nueva versión se indica a través del argumento "carpetaDestino" de dicho método. Si no se indica este parámetro en la versiones 2.x el documento se localizará en la carpeta principal (raiz del repositorio).

Fichero

Concepto abstracto que hace referencia a cualquier tipo de fichero que puede ser tanto carpeta como documento

Documento

Extiende la clase abstracta fichero. Representa ficheros con contenido: binarios, documentos de texto... No puede contener otros documentos.

Carpeta

Elemento que contiene un conjunto de ficheros los cuales pueden ser otras carpetas o documentos sencillos

Metadato

Información adicional a los datos propios de un fichero.

TipoMetadato

Propiedades de los metadatos.

Repositorio

Ubicación en la que el gestor de contenidos almacena un conjunto de ficheros ya sean carpetas o documentos. Todo repositorio tiene un identificador.

Categoría

Elementos para organizar el contenido del gestor . Se organizan de forma jerárquica y un fichero concreto puede pertenecer a varias categorías incluso sino se encuentran dentro de la misma jerarquía.

Relación

Objetos que representan las relaciones entre documentos dentro del gestor.

UML Gestor documental

Nombreamap-gestor-documental
Identificadoramap-gestor-documental
Grupoes.gobcantabria.amap.integracion
Versión2.1.1
Licencia
DesarrolladorGobierno de Cantabria
Descripción

Componente de integración con el Gestor Documental corporativo.

Documentaciónamap-gestor-documental (JavaDoc)
Binarioamap-gestor-documental (Jar)
Dependenciasamap-gestor-documental (Librerías)

No utilizar la implementación "alfresco", utilizar "cmis" en su lugar.

Nota Importante:

Se recomienda mantener el contenido almacenado en las carpetas lo más balanceado posible, es decir, organizado en carpetas con numero de ficheros similares, evitando almacenar más de 1000/2000 ficheros en la misma carpeta .

Para conseguir este objetivo se recomienda almacenar la información basada en la creación de contenido, de forma que se utilizaría una carpeta con el año, una subcarpeta con el mes y dentro los ficheros creados por la aplicación durante dicho mes (si es necesario se puede incorporar otra con el día, hora, etc.).

Ejemplos de uso

Tipo documental:

Los tipos documentales específicos, es decir, que no sean ni "cmis:folder" ni "cmis:document",  tendrán que ir definidos por los prefijos "D:" para documentos o "F:" para carpetas, a excepción del método de "búsqueda por cadena" que sigue las normas de queries CMIS.

Examinar estructura del repositorio

 

El método tree de la clase Carpeta muestra visualmente toda su estructura jerárquica en árbol. Para ver todo el contenido de un repositorio se debe invocar al método tree desde la carpeta raíz.

Carpeta carpetaRaiz = new Carpeta();  
carpetaRaiz.setRuta("/");

carpetaRaiz = (Carpeta)  miservicio.getFichero(carpetaRaiz);

System.out.print(carpetaRaiz.tree());

Obtendremos de este modo un árbol en modo texto con los ficheros contenidos. En el caso del ejemplo podemos ver que el directorio raíz esta vacío y que su nombre es sidgdit.

sidgdit

Crear ficheros

El proceso de crear o añadir ficheros en un repositorio es un proceso muy simple por medio de la invocación al método addFichero que se usará tanto en la creación de un fichero de tipo carpeta como en el de un fichero de tipo Documento. 

Crear una carpeta

El siguiente snippet crea una nueva carpeta llamada Carpeta_TEST dentro de la carpeta destino correspondiente al directorio raíz.

  
Carpeta carpetaDestino = new Carpeta();
carpetaDestino.setRuta("/"); //Directorio Raiz - Opción por defecto siempre

Carpeta carpetaNueva = new Carpeta();
carpetaNueva.setNombre("Carpeta_TEST");

carpetaNueva = (Carpeta) miservicio.addFichero(carpetaNueva, carpetaDestino);
  

La nueva estructura quedará así.

sidgdit
|     +--Carpeta_TEST

Crear un documento

El proceso es el mismo que el usado en la creación de una carpeta pero en este caso el fichero a crear será de tipo Documento. 

En el ejemplo mostrado a continuación se crea un documento llamado documentoNuevo.txt que contiene los datos obtenidos a partir de un fichero local (/tmp/gestorDocumental/prueba.txt) dicho documento se creará dentro de la carpeta destino, la carpeta nueva: Carpeta_TEST creada en el apartado anterior. El contenido de este fichero se creará mediante el campo contenido.

Siempre por defecto el tipo documental de un documento es cmis:document.


Carpeta carpetaDestino= new Carpeta();
carpetaDestino.setRuta("/carpeta_TEST");

byte[] contenido= "Contenido fichero".getBytes();

Documento documentoNuevo = new Documento();
documentoNuevo.setNombre("documentoNuevoPrueba.txt");
documentoNuevo.setTipoDocumental("cmis:document");
documentoNuevo.setContenido(contenido);

nuevoDocumento = (Documento) miservicio.addFichero(nuevoDocumento, carpetaDestino);

En el ejemplo mostrado a continuación se crea un documento llamado documentoNuevo.txt que contiene los datos obtenidos a partir de un fichero local (/tmp/gestorDocumental/prueba.txt) dicho documento se creará dentro de la carpeta destino, la carpeta nueva: Carpeta_TEST creada en el apartado anterior. El contenido de este fichero se creará mediante el campo contenidoStream, mejora el rendimiento y permite crear documentos de gran tamaño.

Siempre por defecto el tipo documental de un documento es cmis:document.


Carpeta carpetaDestino= new Carpeta();
carpetaDestino.setRuta("/carpeta_TEST");

File file = new File("fichero.pdf"); 
InputStream is = FileUtils.openInputStream(file);

Documento documentoNuevo = new Documento();
documentoNuevo.setNombre("documentoNuevoPrueba.txt");
documentoNuevo.setTipoDocumental("cmis:document");
documentoNuevo.setContenidoStream(is);

nuevoDocumento = (Documento) miservicio.addFichero(nuevoDocumento, carpetaDestino);

La nueva estructura quedará así.

sidgdit
|     +--Carpeta_TEST[Carpeta_TEST]  
|      |     +--documentoNuevoPrueba.txt[Carpeta_TEST/documentoNuevoPrueba.txt]  

Es importante pasar siempre al final como parámetro la carpeta contenedora destino correctamente (con su ruta correspondiente) para evitar errores, puesto que la ruta en el documento no se tiene en cuenta. 

Crear un fichero con metadatos


Carpeta carpetaDestino= new Carpeta();
carpetaDestino.setRuta("/carpeta_TEST");
  
byte[] contenido= "Contenido fichero".getBytes();
     
Documento documentoNuevo = new Documento();
documentoNuevo .setNombre("documentoNuevo.txt");
documentoNuevo .setContenido(contenido);

TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
   
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("documentoNuevoConMetadatosPrueba.txt");
     
List<Metadato> metadatos = new ArrayList<Metadato>();
metadatos.add(metadato);  

documentoNuevo .setMetadatos(metadatos);
documentoNuevo = (Documento) miservicio.addFichero(documentoNuevo , carpetaDestino); 

Esta es la estructura actualizada.

sidgdit
|     +--Carpeta_TEST[Carpeta_TEST]  
|      |     +--documentoNuevoPrueba.txt[Carpeta_TEST/documentoNuevoPrueba.txt]  
|      |     +--documentoNuevoConMetadatosPrueba.txt[/documentoNuevoConMetadatosPrueba.txt] 

Crear una estructura de directorios

En caso de querer crear-añadir una carpeta-padre con sus respectivos elementos-hijos se creará toda una estructura de directorios en el repositorio. El siguiente ejemplo crea-añade una subcarpeta Subcarpeta_TEST dentro de la carpeta Carpeta_TEST. Esta subcarpeta contiene a su vez otro documento txt.

Esta operación se puede realizar de un sólo paso indicando la ruta del fichero a añadir en una carpeta de destino. 

  Carpeta carpetaDestino= new Carpeta();
  carpetaDestino.setRuta("/Carpeta_TEST/SubCarpeta_TEST");

  byte[] contenido= "Contenido fichero".getBytes();
     
  Documento documentoNuevo = new Documento();
  documentoNuevo .setNombre("documentoNuevoEnSubcarpetaPrueba.txt");
  documentoNuevo .setContenido(contenido);

  documentoNuevo = (Documento) miservicio.addFichero(documentoNuevo, carpetaDestino );

El árbol tendrá ahora la siguiente estructura.

Carpeta_TEST
|     +--SubCarpeta_TEST[/Carpeta_TEST/SubCarpeta_TEST]  
|      |     +--documentoNuevoEnSubcarpetaPrueba.txt[/Carpeta_TEST/SubCarpeta_TEST/documentoNuevoEnSubcarpetaPrueba.txt] 

Consultar ficheros

El proceso de consultar ficheros es un proceso muy simple por medio de la invocación al método getFichero que se usará tanto en la consulta - obtención de información de un fichero de tipo carpeta como en el de un fichero de tipo Documento. 

Destacan dos posibles formas de consultar los ficheros, por ruta o por id. Ambos son únicos para un fichero

En caso de consultar por el id y la ruta a la vez, el servicio buscará por id. (Prioridad al id sobre la ruta que se omite y no se tendría en cuenta)

Consultar por ruta

Cada fichero tiene una ruta única. Para consultar por ruta se ha de crear una instancia del objeto Fichero, fijar su ruta con la del fichero a consultar y pasar la instancia al método getFichero del servicio. Si la ruta existe en el repositorio, el servicio devolverá el objeto completo.

Fichero fichero = new Documento();        
fichero.setRuta("/Carpeta_TEST/SubCarpeta_TEST/documentoNuevoEnSubcarpetaPrueba.txt");
         
fichero = miservicio.getFichero(fichero);

Consultar por id

Al igual que pasa con la ruta que para un fichero es única, todo fichero tiene un identificador UUDI único. Para buscar por "id" basta con pasar como parámetro una instancia de Fichero con el "id" cuyo fichero queramos obtener al método getFichero del servicio.

Fichero fichero = new Documento();        
fichero.setId("075335e4-a2a5-440b-bff9-1c68b37db877");
         
fichero = miservicio.getFichero(fichero);

Modificar ficheros

Para modificar los datos de un fichero se debe llamar al método updateDocumento del servicio pasándole como parámetros al documento los campos modificados.

NOTA: Dicho fichero ha de existir previamente, sino daría error.


Documento documentoAModificar= new Documento();
documentoAModificar.setRuta("/Carpeta_TEST/documentoNuevoPrueba.txt");

List<Metadato> listaMetadatos = new ArrayList<Metadato>();

//Modificamos el campo nombre
  
TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
  
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("documentoNuevoModificadoPrueba.txt");

listaMetadatos.add(metadato);

documentoAModificar.setMetadatos(listaMetadatos);

documentoAModificar= miservicio.updateDocumento(documentoAModificar);

Modificar carpetas

Para modificar los datos de una carpetase debe llamar al método updateCarpeta del servicio pasándole como parámetros a la carpeta los campos modificados.

NOTA: Dicho directorio ha de existir previamente, sino daría error.


Carpeta carpeta = new Carpeta();
carpeta.setRuta("/Carpeta_TEST/carpeta");

List<Metadato> listaMetadatos = new ArrayList<Metadato>();

//Modificamos el campo nombre
TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
  
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("CarpetaModificadaPrueba");

listaMetadatos.add(metadato);

carpeta.setMetadatos(listaMetadatos);

carpeta= miservicio.updateCarpeta(carpeta);

Eliminar ficheros

Para eliminar-borrar un fichero basta con  la invocación al método deleteFichero mediante su ruta o su id. 

El siguiente código elimina la carpeta Carpeta_TEST que cuelga del directorio raíz y todo su contenido:

Carpeta carpetaAEliminar = new Carpeta();
carpetaAEliminar.setRuta("/Carpeta_TEST");

miservicio.deleteFichero(carpetaAEliminar);

La Carpeta_TEST desaparece así por completo de la estructura del repositorio.

ADVERTENCIA IMPORTANTE: El borrado de un fichero de tipo carpeta es en cascada, es decir eliminar una carpeta implica borrar todo su contenido, incluido subcarpetas y demás ficheros contenidos.

El siguiente código elimina un fichero por su id:

Fichero ficheroAEliminar = new Documento();       
ficheroAEliminar.setId("2402006d-5671-4430-b512-0efdf49f75a1");
             
miservicio.deleteFichero(ficheroAEliminar);

Asociar metadatos ficheros

La API permite asociar y por tanto gestionar-manejar los metadatos de los ficheros, de tipoCarpeta y/o de tipo Documento, ya existentes; mediante el método asociarMetadatos


Fichero fichero = new Carpeta();
fichero.setRuta("/Carpeta_TEST");
  
List<Metadato> listaMetadatos = new ArrayList<Metadato>();
  
TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
 
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("Carpeta_TEST2");
    
listaMetadatos.add(metadato);
    
miservicio.asociarMetadatos(fichero,  listaMetadatos);

NOTA: al ejecutar el codigo anterior se procederá a renombrar el fichero de tipo carpeta de "Carpeta_TEST" a "Carpeta_TEST2" al asociar-gestionar el metadato "cmis:name"

Si se obtiene un mensaje de error como el siguiente: "Property 'cmis:title' is not valid for this type or one of the secondary types!" se trata de que dicha propiedad se ha de gestionar con aspectos

Asociar metadatos ficheros en cascada

Para asociar metadatos en cascada, esto es que los metadatos se asocien-transfieran a todos los ficheros que estén contenidos dentro de una carpeta, tan solo hay que usar el método asociarMetadatos fijando el ultimo parámetro que se corresponde con el flag de cascada a true.


Fichero fichero = new Carpeta();
fichero.setRuta("/Carpeta_TEST/SubCarpeta_TEST");
    
List<Metadato> listaMetadatos = new ArrayList<Metadato>();
  
TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
  
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("SubCarpeta_TESTeHijosEnCascada");
    
listaMetadatos.add(metadato);
  
miservicio.asociarMetadatos(fichero,  listaMetadatos, true );

NOTA: al ejecutar el codigo anterior se procederá a renombrar el fichero de tipo carpeta de "SubCarpeta_TEST" y todos sus elementos hijo a "SubCarpeta_TESTeHijosEnCascada" al asociar-gestionar en cascada (esto es con el flag pasado como ultimo parametro a true) el metadato "cmis:name"

Verificar la existencia de un fichero

Para verificar la existencia de un fichero se usará el método existeFichero que devuelve true si el fichero cuyo path se indica en la propiedad ruta existe.


Carpeta carpetaTEST = new Carpeta();
carpetaTEST.setRuta("/Carpeta_TEST");
 
System.out.println(miservicio.existeFichero(carpetaTEST)?"Existe el fichero":"NO existe el fichero");

Obtener ficheros comprimidos

Para obtener una serie (lista) de ficheros comprimidos se usará el método getFicherosComprimidos.
Este método está sobrecargado con tres argumentos opcionales:  
 - Recursivo: Indica si se genera el archivo de forma que agrege los ficheros de las carpetas hijas. Por defecto false.
 - Nivel: Indica el nivel de recursividad en las carpetas. Por defecto 0.
 - NombreConRuta: Indica si el nombre de los ficheros agregados en el comprimido sea su nombre más la ruta donde se encuentra. Por defecto false.

El siguiente ejemplo obtiene un OutputStream con la lista de ficheros comprimidos, que se habrían pasado como parámetro.

Si alguno de los ficheros se trata de una carpeta, se incluye en el fichero comprimido todos los ficheros contenidos en la carpeta.


String uuid1 = "5aa57d08-0532-4aef-8585-88096d191ea3";
String uuid2 = "9a76a011-9a75-4df4-87f1-90b9ce2a0e32";
  
List<Fichero> ficheros = new ArrayList<Fichero>();
Fichero fichero = new Documento();
fichero.setId(uuid1); 
ficheros.add(fichero);
fichero = new Documento();
fichero.setId(uuid2); 
ficheros.add(fichero);

FileOutputStream fos = new FileOutputStream("target/prueba.zip");
miservicio.getFicherosComprimidos(ficheros, fos);    

El siguiente ejemplo obtiene un OutputStream con la lista de ficheros comprimidos, con recursivo, nivel de recursividad 3 y nombreConRuta, que se habrían pasado como parámetro.

Si alguno de los ficheros se trata de una carpeta, se incluye en el fichero comprimido todos los ficheros contenidos en la carpeta (recursivamente, según el nivel indicado).


String uuid1 = "5aa57d08-0532-4aef-8585-88096d191ea3";
String uuid2 = "9a76a011-9a75-4df4-87f1-90b9ce2a0e32";
  
List<Fichero> ficheros = new ArrayList<Fichero>();
Fichero fichero = new Documento();
fichero.setId(uuid1); 
ficheros.add(fichero);
fichero = new Documento();
fichero.setId(uuid2); 
ficheros.add(fichero);

FileOutputStream fos = new FileOutputStream("target/prueba.zip");
miservicio.getFicherosComprimidos(ficheros, fos, 4, true, true);    

Obtener metadatos ficheros

Obtener tipos de metadatos de un tipo documental

Para obtener los tipos de metadatos asociados a un determinado tipo documental se usará el método getTipoMetadatos

El siguiente ejemplo imprime los tipos de metadatos correspondientes al tipo documental cmis:folder.


List<TipoMetadato> listaTipoMetadatos = miservicio.getTipoMetadatos("cmis:folder");
System.out.println(listaTipoMetadatos);

 

Obtener metadatos de un fichero

Para obtener los metadatos asociados a un determinado fichero se usará el método getMetadatos

A continuación se muestra como extraer los metadatos asociados a un fichero de tipo Documento.


Fichero fichero = new Documento();
fichero.setRuta("/Carpeta_TEST/documentoNuevoPruebaConMetadatos.txt");
  
List<Metadato> listaMetadatos = miservicio.getMetadatos(fichero);  
System.out.println(listaMetadatos);

El resultado de la ejecución es el siguiente:


[ 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=isLatestMajorVersion, aspecto=false, obligatorio=false], valor=true], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=contentStreamLength, aspecto=false, obligatorio=false], valor=28], 
...
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=changeToken, aspecto=false, obligatorio=false], valor=null], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=versionLabel, aspecto=false, obligatorio=false], valor=1.0], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=isLatestVersion, aspecto=false, obligatorio=false], valor=true], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=isVersionSeriesCheckedOut, aspecto=false, obligatorio=false], valor=false], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=lastModifiedBy, aspecto=false, obligatorio=false], valor=g_sidgdit], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=createdBy, aspecto=false, obligatorio=false], valor=g_sidgdit], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=checkinComment, aspecto=false, obligatorio=false], valor=Initial Version], 
  Metadato [tipoMetadato=TipoMetadato [prefijo=cmis, nombre=baseTypeId, aspecto=false, obligatorio=false], valor=cmis:document], 
...
]

Búsqueda de ficheros

Para la búsqueda de ficheros filtrando por unas determinadas condiciones usaremos el método getFicheroFiltrado

Distinguiendo dos posibles formas de buscar ficheros filtrados: por metadatos o por cadena

El resultado de toda búsqueda siempre sera un único fichero de tipo carpeta; una carpeta filtrada que contendrá los ficheros que cumplan las condiciones especificadas en el filtro de búsqueda.
Cuando dichas condiciones no se cumplan, cuando dicho filtrado especificado no tenga ningún resultado, se devolverá siempre la siguiente estructura:

null
|

Para explicar cada una de las dos posibles búsquedas o filtrados vamos a partir de una estructura de directorios como la que sigue:


Carpeta_TEST
|     +--SubCarpeta_TEST[/Carpeta_TEST/SubCarpeta_TEST]  
|      |     +--documentoNuevoEnSubCarpetaTestPrueba.txt[/Carpeta_TEST/SubCarpeta_TEST/documentoNuevoEnSubCarpetaTestPrueba.txt]  
|      |     +--f_hijo_subcarpeta_test_1.txt[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_1.txt]  
|      |     +--f_hijo_subcarpeta_test_2.txt[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_2.txt]  
|      |     +--f_hijo_subcarpeta_test_3[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_3]  
|     +--documentoNuevoEnCarpetaTestPrueba.txt[/Carpeta_TEST/documentoNuevoEnCarpetaTestPrueba.txt]  
|     +--f_hijo_carpeta_test_1.txt[/Carpeta_TEST/f_hijo_carpeta_test_1.txt]  
|     +--f_hijo_carpeta_test_2.txt[/Carpeta_TEST/f_hijo_carpeta_test_2.txt]  
|     +--f_hijo_carpeta_test_3[/Carpeta_TEST/f_hijo_carpeta_test_3]  

Búsqueda por metadatos

Es posible realizar búsquedas por metadatos (asociados implicitamente a los Tipos de Metadatos de un determinado tipoDocumental). 

El siguiente ejemplo realiza una consulta usando metadatos como parámetro de entrada en la busqueda filtrada de ficheros.


String tipoDocumental = "cmis:document";

List<Metadato> listaMetadatos = new ArrayList<Metadato>();
    
TipoMetadato tipoMetadato = new TipoMetadato();
tipoMetadato.setPrefijo("cmis");
tipoMetadato.setNombre("name");
tipoMetadato.setAspecto(false);
tipoMetadato.setObligatorio(false);
  
Metadato metadato = new Metadato();
metadato.setTipoMetadato(tipoMetadato);
metadato.setValor("documentoNuevoEnCarpetaTestPrueba.txt");
    
listaMetadatos.add(metadato);
  
Carpeta carpetaResultadoFiltroBusqueda = new Carpeta();
carpetaResultadoFiltroBusqueda .setRuta("/Carpeta_TEST");
    
carpetaResultadoFiltroBusqueda = (Carpeta)miservicio.getFicheroFiltrado(carpetaResultadoFiltroBusqueda ,tipoDocumental, listaMetadatos);
    
System.out.println(carpetaResultadoFiltroBusqueda .tree());

El resultado será:

null
|     +--documentoNuevoEnCarpetaTestPrueba.txt[/Carpeta_TEST/documentoNuevoEnCarpetaTestPrueba.txt]  

Búsqueda por cadena

Los gestores documentales permiten mediante expresiones nativas el filtrado de ficheros mediante cadenas de busquedas comunmente llamadas "queries" o consultas.
Este método es mas potente y flexible que el método anterior de búsqueda por metadatos

Puede consultarse la documentación específica sobre búsquedas en la parte "where" de las consultas dentro de  ALFRESCO en el siguiente enlace: https://wiki.alfresco.com/wiki/CMIS_Query_Language

En el ejemplo siguiente se muestra como obtener una carpeta filtrada con el fichero que cumpla lo pasado en la cadena query con el filtro de busqueda definido.
En este caso tal y como se definió en el anterior método de búsqueda por metadatos se trataría de buscar el fichero cuyo nombre coincida con un valor concreto.


String tipoDocumental = "cmis:document";

String query = "a.cmis:name = 'documentoNuevoEnCarpetaTestPrueba.txt' ";
  
Carpeta carpetaResultadoFiltro = new Carpeta();
carpetaFiltrada.setRuta("/Carpeta_TEST");
  
carpetaFiltrada = (Carpeta)miservicio.getFicheroFiltrado(carpetaFiltrada, query);

System.out.println(carpetaFiltrada.tree()); 

Cuyo resultado será:

null
|     +--documentoNuevoEnCarpetaTestPrueba.txt[/Carpeta_TEST/documentoNuevoEnCarpetaTestPrueba.txt]  

Exactamente igual que con el metodo de busqueda por metadatos del punto-apartado anterior.

Pero como se ha comentado este metodo de busqueda por cadena es mas potente y versatil que el de busqeda por metadatos y con el ejemplo siguiente se muestra  dicha potencia y versatilidad:


String tipoDocumental = "cmis:document";

String query = "a.cmis:name LIKE '%Prueba.txt' ";
  
Carpeta carpetaResultadoFiltro = new Carpeta();
carpetaResultadoFiltro .setRuta("/Carpeta_TEST");
  
carpetaResultadoFiltro = (Carpeta)miservicio.getFicheroFiltrado(carpetaResultadoFiltro , tipoDocumental, query);

System.out.println(carpetaResultadoFiltro .tree()); 

En este caso la carpeta contendrá todos aquellos elementos que coincidan con el filtrado indicado en la query, que se trata de todos aquellos elementos de tipo documento y cuyo nombre termine en "Prueba.txt"


null
|     +--documentoNuevoEnCarpetaTestPrueba.txt[/Carpeta_TEST/documentoNuevoEnCarpetaTestPrueba.txt]  
|     +--documentoNuevoEnSubCarpetaTestPrueba.txt[/Carpeta_TEST/SubCarpeta_TEST/documentoNuevoEnSubCarpetaTestPrueba.txt]  

NOTAS IMPORTANTES A TENER EN CUENTA:

star En la wiki de Affresco (en el enlace que hemos indicado al principio) se puede obtener toda la información necesaria para componer las queries.
Tambien existe una herramienta en alfresco para construir-componer las queries: http://<host:port>/alfresco/service/cmis-browser-app/federatedquery

starEs importante resaltar el uso del alias de tabla "a." de la siguiente manera a.cmis:<propiedad> para que funcione la query correctamente

star Existen diferencias entre
       query1 = "a.cmis:name LIKE '%SubCarpeta%' ";
       query2 = "a.cmis:name LIKE '%subcarpeta%' ";
El resultado que se obtendrá es diferente el uno del otro, ya que se distingue entre mayusculas-minusculas

Resultado de la query1:


null
|     +--documentoNuevoSubCarpetaPrueba.txt[/Carpeta_TEST/SubCarpeta_TEST/documentoNuevoSubCarpetaPrueba.txt]  

Resultado de la query2:


null
|     +--f_hijo_subcarpeta_test_1.txt[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_1.txt]  
|     +--f_hijo_subcarpeta_test_2.txt[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_2.txt]  
|     +--f_hijo_subcarpeta_test_3[/Carpeta_TEST/SubCarpeta_TEST/f_hijo_subcarpeta_test_3]  

Clonar documento

El proceso de clonar documentos en un repositorio es un proceso muy simple por medio de la invocación al método clonarFichero que se usará unicamente para el clonado de un Documento. 

El siguiente snippet clonara un Documento con Uuid 5aa57d08-0532-4aef-8585-88096d191ea3 dentro de la carpeta destino /clone.

  
String uuid = "5aa57d08-0532-4aef-8585-88096d191ea3";

Documento ficheroOrigen = new Documento();
ficheroOrigen.setId(uuid);
 
Carpeta carpetaDestino = new Carpeta();
carpetaDestino.setRuta("/clone");
 
miservicio.clonarFichero(ficheroOrigen, null, carpetaDestino);
  

se puede indicar el nombre con el que se quiere guardar el fichero copiado indicando el nombre en el  segundo argumento, fichero de destino.


Documento ficheroDestino = new Documento();
ficheroDestino.setNombre("XXXXXX");

miservicio.clonarFichero(ficheroOrigen, ficheroDestino, carpetaDestino);
  

Consultar relaciones de un documento

Es posible consultar las posibles relaciones de un documento llamando al método getRelaciones, esto nos devolverá una lista una con todas las relaciones de ese fichero.
De cada relación se puede consultar los dos ficheros que la componen y el nombre de esa relación.
El fichero ha de contener obligatoriamente id o ruta.


Documento nuevoDocumento1 = new Documento();
nuevoDocumento1.setId("XXXXXX");   

List<Relacion> relaciones = miservicio.getRelaciones(nuevoDocumento1);

Relacionar documentos

El proceso de relacionar dos documentos en un repositorio es un proceso muy simple por medio de la invocación al método relacionarFicheros que se usará únicamente para la relación de dos documentos. 

Nota Importante: Es importante comprobar antes de crear la relación que esta no existe, si no, lanzara una excepción.

Documento nuevoDocumento1 = new Documento();
Documento nuevoDocumento2 = new Documento(); 
nuevoDocumento1.setId("XXXXXX");   
nuevoDocumento2.setId("XXXXXX");

miservicio.relacionarFicheros(nuevoDocumento1, nuevoDocumento2, "R:cm:basis");
© 2014 GOBIERNO DE CANTABRIA - AVISO LEGAL Y PROTECCIÓN DE DATOS