jueves, agosto 13, 2015

Errores de red con Windows 10 y Alfresco

Con la actualización de Windows 10 pueden volver algunos errores que en otras versiones y sistemas operativos ya estaban solucionadas.

Estos errores vienen derivados principalmente de las nuevas configuraciones de red implementadas en Windows, a partir de la versión 7 en realidad, y que en su versión 10 han sufrido un gran cambio.


Por ejemplo, una vez instalado Alfresco puede presentarse el siguiente error:

--- log ---
ERROR [sf.ehcache.Cache] [main] Unable to set localhost. This prevents creation of a GUID. Cause was: Mordor: Mordor
 java.net.UnknownHostException: Mordor: Mordor
at java.net.InetAddress.getLocalHost(Unknown Source)
at net.sf.ehcache.Cache.<clinit>(Cache.java:155)
[...]
--- log ---

Si se realiza una investigación sobre este error se encuentran muchas páginas donde la solución es introducir la dirección IP 127.0.0.1 y el nombre del host o "hostname" en el fichero hosts, tanto en Linux, Windows y Mac OSX, pero esta solución ya no funciona en Windows, debido principalmente a dos cuestiones:

1. El uso de DNSSEC 
2. El uso de IPv6 sobre IPv4

Por lo tanto, para solucionarlo, no basta con poner nada en el fichero %SystemRoot%\system32\Drivers\etc\hosts, de hecho, no hace falta.

La solución es más sencilla que esto, hay que usar IPv4. Se puede hacer (tocando el registro de Windows) que la versión 4 tenga prevalencia sobre la versión 6 del TCP/IP, pero también, y creo que esto es mejor, se puede arrancar la máquina virtual de Java para que use la versión de TCP/IP que se necesita. El parámetro es: 

-Djava.net.preferIPv4Stack=true

Con este parámetro se solucionan los posibles errores de detección del host que es necesario para el arranque de Alfresco.

Además, hay que incluirlo también en otros sitios donde se utilicen descargas o llamadas a direcciones de Internet, como el caso de maven, eclipse, etc.

Por ejemplo, mi variable MAVEN_OPTS es la siguiente:

-Xms256m -Xmx1024m -XX:PermSize=320m -Xss1024k -Djava.net.preferIPv4Stack=true

Y que es la misma que tengo en la configuración de eclipse (Servers) para cada servidor de Tomcat y para cada llamada de maven.

Evidentemente hay que usar este parámetro también en el fichero eclipse.ini si se necesitan instalar plugins.

domingo, junio 14, 2015

Nueva revisión de Alfviral (Alfresco Virus Alert)

Hace unos días, recibí un correo electrónico donde se me avisaba de un error de Alfviral cuando se intentaba actualizar un documento desde Share en la versión 4.2.

Al parecer, en esta versión se usa un nuevo sistema de actualización asíncrona y cuando se actualiza un documento se produce un borrado de nodo para crear otro que es el actualizado. El sistema de eventos salta con cada paso por lo que hay que verificar antes de nada que el nodo sigue todavía "vivo" y no ha sido borrado por el propio sistema de actualización. Esto, curiosamente no pasa en el contexto del Explorer (Alfresco).

En resumen, he re-factorizado algo más el código, he arreglado el problema y he reorganizado el proyecto tipo all-in-one como dos submódulos de repositorio y otro para share, así creo que está más claro y es más sencillo de instalar.

La nueva revisión se puede descargar desde: https://github.com/fegorama/alfviral/releases/tag/v1.3.2-SNAPSHOT


miércoles, febrero 25, 2015

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&