Archivos de etiquetas: Lucene

Alfresco y aplicaciones de los DataList

— Entorno —

Sistema: GNU/Linux Mint 17.1 Rebbeca (x86_64)
Versión Alfresco: 4.2.2 Enterprise
Base de datos: MySQL 5
Cliente Web: Google Chrome 40.0.2214.115 (64-bit)
Indexador: Apache-Lucene

Las pruebas se han realizado con Apache-Lucene así pues en Solr podrían ser distintas.

— Introducción —

Los DataList en Alfresco son un sistema de mantener «tablas» de datos para ser usadas de forma básica. Estas «tablas» tienen en el repositorio una estructura donde una carpeta representa el DataList y como «hijos» contiene cada uno de los «items» u opciones que vamos añadiendo. A mi parecer no es un sistema muy eficiente en lo que respecta a la forma de gestionarlo posteriormente ya que seguramente usando como persistencia tablas de la base de datos que se use en la instancia de Alfresco seguramente serían más rápidas y estables, pensemos en alguna DataList que necesitemos con 5000 registros (items). Dicho esto, es al menos una nueva forma con la que podemos contar para gestionar datos tabulados en Alfresco.

— Aplicaciones —

Las aplicaciones van en principio por la creación de DataList que hay ya preconfigurados como la lista de contactos, eventos, agenda, etc. pero también podemos crearnos nuestra propia DataList que permita ayudarnos en la posterior gestión o en tareas como carga dinámica de nuevos controles. La creación de un nuevo tipo de DataList es muy sencillo, basta con crear un tipo que herede de «dl:dataListItem» y añadir las propiedades que necesitamos guardar.

Hasta aquí bien, de hecho es muy fácil crearnos tipos nuevos muy sencillos con uno o dos propiedades y que nos sirvan para guardar información de «datos maestros» como provincias, municipios, temperaturas, cantidades, etc.

Aquí es donde viene una posible aplicación, cuando necesitamos recoger datos de fuentes externas en muchas ocasiones estas fuentes van a ser sustituidas por Alfresco o bien solo se necesitan en determinadas ocasiones por lo que tenerlas como fuente de datos desde Alfresco es un posible problema por si se eliminan, paran o cambian. Aquí se puede recoger esa información y crear DataList con ella de forma que luego podamos usarla simplemente haciendo una serie de consultas y recorridos por la propia DataList.

— Problema —

Bien, ¿sencillo verdad?, en realidad si, pero hay algunos problemas que solventar, el primero es que al crear nuestro tipo de datos y al heredar de «dl:dataListItem», cuando creamos un DataList de nuestro propio tipo, el nombre junto con el prefijo quedan en una propiedad llamada «dl:dataListItemType» de la siguiente forma:

Efectivamente su valor es «dh:listasClara», pero ¿que pasa entonces?, ¿todo bien, verdad?, bueno, no del todo, ya que resulta que cuando queremos buscar por este término para poder acotar solamente la búsqueda a este tipo de DataList nos encontramos con un problema, no se encuentra…

¿Por que?

Esto es debido al tipo de indexación que tiene por defecto esta propiedad, podemos verlo mejor si usamos la herramienta LukeAll:

Como podemos ver, los valores tomados por la propiedad están divididos, de forma que realizando una búsqueda directamente como @dl:dataListItemType:»dh:listasClara» no obtendremos ningún resultado, también podemos verlo realizando la búsqueda en la propia utilidad:

Aquí se encuentran los registros porque LukeAll parte el valor como «dh» y «listasClara», de forma que en Alfresco si usamos una consulta que solo busque «dh» la encontraremos:

Pero claro, esto ni es elegante ni fiable ya que no estamos buscando por todo el término completo. Esto nos interesa para, como digo, encontrar un tipo solamente de DataList, ya que buscando como tipo dataList encontraría todas las DataList de todos los sites.

¿Como se soluciona?

En concreto esto podemos solucionarlo pero hay que modificar el propio modelo de datos de Alfresco de la siguiente forma:

Donde se ha incluido la indexación desactivando la capacidad «tokenised», de esta forma cuando volvemos a reindexar todo y comprobamos obtenemos:

Que es el resultado correcto y por tanto se puede buscar:

Pero esto implica, si, que tenemos que modificar el fichero original o sobrecargarlo para que funcione correctamente. Esto además es para todos los tipos, incluidos los que ya vienen predefinidos en Alfresco así que cuidado.

Bien, solucionado ¿no?, pues no, resulta que además para poder posicionarnos en el propio DataList que necesitamos (es un «folder») debemos buscar por algo más, en principio podría ser por el nombre, pero Alfresco no nos deja que pongamos cualquier nombre, le pone uno de forma automática y poco descriptivo:

Lo que nos dificulta la búsqueda. Podemos cambiarlo, si, pero seguimos con el mismo problema que teníamos con el tipo «dl:dataListItemType». Bueno, pues como si nos deja poner un título por ahí, igual, seguimos en las mismas…

— Solución —

La solución sencilla que he encontrado a esto es crear un aspecto nuevo y que lo asignemos a los DataList que necesitamos, por ejemplo:

De esta forma asignamos el aspecto y en «dh:nameOfDataList» podemos incluir cualquier nombre que buscará como tal, como cadena de texto.

Por ejemplo, si creando la siguiente DataList:

Y ahora buscando su «folder» en el repositorio:

Podemos asignarle directamente el aspecto:

Y el valor del campo que necesitamos:

Recomiendo un nombre bastante descriptivo como dl + site + nombre, por ejemplo para un site llamado Personal y una lista de Oficinas podría ser «dlPersonalOficinas». Ahora ya solo nos queda comprobar que se indexa correctamente:

Y que se encuentra en Alfresco de forma correcta:

Con lo que ya tendríamos el «folder» del DataList y solo tendríamos que recorrer los «hijos» para cargar por ejemplo un control personalizado para rellenar alguna propiedad que nos interese.

Esta solución es viable para, como he comentado, usar tablas de datos maestros que se quieran tener directamente almacenadas en Alfresco (repositorio) y no tener que leerlas de fuentes externas como bases de datos o ficheros.

Además proporciona una ventaja adicional sobre la solución de leer datos de documentos que podemos tener también en Alfresco y es la facilidad que ya nos ofrece de crear nuevos «items» del DataList, modificarlos y borrarlos.

— Enlaces de interés —

https://code.google.com/p/luke/downloads/detail?name=lukeall-3.5.0.jar&