Proceso de eliminado de documentos en Alfresco, Kill ‘Em All
Un tema recursivo que sale en todas las conversaciones que tenemos con los usuarios y administradores a los que les implantamos Alfresco es sobre el proceso de borrado de los documentos en el gestor documental. La pregunta siempre es la misma: “¿ Pero Alfresco no borra nunca los documentos ?“.
En este diagrama explicamos el ciclo de vida de un documento.
El vaciado de la papelera de reciclaje se puede hacer manualmente o con el modulo Alfresco Trashcan Cleaner disponible en la forja de Alfresco.
Sin embargo, este sistema en nuestros clientes no nos funcionaba pues la papelera de reciclaje tenía alrededor de 10.000 elementos y la versión de Alfresco que teniamos daba un Java Heap, con lo que hemos realizado un módulo que se encarga de eliminar elementos de la papelera de reciclaje en función de la fecha del documento y por ejemplo permite eliminar documentos que lleven en la papelera mas de 5 meses. El módulo se llama Kill ‘Em All y lo colgaremos en la forja en cuanto lo tengamos depurado y si a alguien le interesa.
Referencias:
El artículo de Blyx.com me ha recordado que tenía este otro en el tintero desde hacía varios meses
Alfresco Multi-Tenant
Si os muestro esta imagen
muchos diréis que no es ninguna novedad, que es lógico pensar que aunque todos acedemos a internet y nuestros datos viajan por un mismo cable cada red particular puede compartir sus documentos sin que el vecino de abajo sepa cuales son. Pues esto mismo podemos hacer con Alfresco, gracias a la característica “Multi-Tenant” (a partir de aquí llamada MT).
Para qué sirve esta característica?
Podríamos definirla como la posibilidad de crear alfrescos independientes usando una única instancia de Alfresco. Nuestros clientes usarán un único Alfresco, un único war, sin embargo gracias al MT podremos generar nuevos repositorios para que cada organización tenga su propio repositorio físico pero todos usen un único método de entrada.
Activación del Multi-Tenant (Para este ejemplo hemos usado Alfresco Enterprise 3.2.1.2)
Cuando instalamos un nuevo Alfresco no disponemos de la característica MT activada por defecto. Para poder activarla es necesario modificar una serie de documentos. Si hemos descargado la versión de Alfresco que incluye el tomcat, debemos ir al directorio /tomcat/shared/classes/alfresco/extension/mt.
Observaremos que existen 3 archivos con extensión .sample (esta extensión es usada para que no se tenga en cuenta la configuración que contiene el archivo) que deberemos renombrar eliminando el .sample para que en el siguiente arranque de alfresco se tomen en cuenta. Los archivos a renombrar son:
- mt-context.xml.sample -> mt-context.xml
- mt-admin-context.xml.sample -> mt-admin-context.xml
- mt-contentstore-context.xml.sample -> mt-contentstore-context.xml
Una vez hechos los cambios, procederemos a reiniciar/arrancar Alfresco, fijándonos que en los logs aparecerán unos mensajes que nos indican que el MT está activado:
12:24:42,449 User:System INFO [repo.tenant.MultiTAdminServiceImpl] Alfresco Multi-Tenant startup - 0 enabled tenants, 0 disabled tenants
12:24:55,127 INFO [service.descriptor.DescriptorService] Alfresco license: Enterprise - v3.2 granted to Queres Technologias (does not expire)
12:24:55,128 INFO [service.descriptor.DescriptorService] Alfresco started (Enterprise - Multi-Tenant): Current version 3.2.1 (.2 3) schema 3501 - Originally installed version 3.2.1 (.2 3) schema 3501
Gestión de los Tenants
Para poder acceder a la URL de administración de MT debemos autenticarnos como administradores en Alfresco Explorer (por defecto admin/admin) y luego ir a la URL:
http://localhost:8080/alfresco/faces/jsp/admin/tenantadmin-console.jsp
Al igual que ocurre en la URL de administración de workflows lo primero que veremos será un input text para introducir los comandos y debajo una sección de ayuda con todos los comandos disponibles y una breve explicación de cada uno.
Creación de un Tenant
Para crear un tenant existe el comando create, al que debemos pasar una serie de parámetros:
- dominio del tenant (p.e. queres.com)
- contraseña para el usuario admin@queres.com
- directorio del alf_data para el nuevo tenant
el comando final quedaría similar a:
create queres.com password /opt/alfresco/alf_data_queres
Si vemos los logs del catalina.out podremos seguir el proceso de creación. Cuando aparezca un mensaje en la admin consola similar a “created tenant: queres.com” el proceso ha terminado.
Una vez creado el tenant podremos acceder al repositorio usando el explorador con la misma url de siempre:
http://localhost:8080/alfresco
Como usuario deberemos introducir admin@queres.com y la contraseña que indicamos al crear el tenant. Al acceder veremos un repositorio limpio como la primera vez que instalamos nuestro Alfresco y sin ninguna referencia al repositorio inicial (usuarios, grupos, nodos, etc).
Desactivar un Tenant
Para impedir el acceso a un tenant basta con ejecutar la orden “disable “. Haciendo esto no borramos el repositorio pero si un usuario del tenant trata de hacer login obtendrá un error de acceso.
Habilitar un Tenant
Si queremos dar acceso nuevamente a un tenant desactivado basta con ejecutar la orden “enable “. Los usuarios del tenant podrán acceder de nuevo a él.
Eliminar un Tenant
Para eliminar un tenant debemos ejecutar la orden “delete “. Esta acción requiere que reiniciemos el servidor para que se borren los indices. Además es necesario borrar el directorio del los indices manualmente (el alf_data del tenant se especifica cuando se crea).
El resto de órdenes se pueden ver escribiendo el comando “help“, pero me pareció interesante detallar las órdenes de creación, borrado y habilitación/in-habilitación.
Referencias:
http://wiki.alfresco.com/wiki/MT
http://blyx.com/2010/02/08/multitenancy-en-alfresco/
Nueva documentación online de Alfresco
A través de network.alfresco.com veo que han implementado un nuevo sistema de documentación y ayuda.
Las webs de ayuda disponibles son:
1. Administering an Alfresco ECM Production Environment
2. FreeMarker Template API
3. JavaScript API
4. RESTful API
5. Surf Platform API
Después de haber probado el sistema, la verdad es que resulta más cómodo que la wiki. Aporta una información más clara y agrupada y personalmente me resulta más navegable.
Junto con la traducción realizada por MADEJA de la wiki de Alfresco, se han convertido en mis marcadores más usados
Que os parece este nuevo sistema?
Gestión de Proyectos con Alfresco Share, integración con Redmine
Aplicando el principio de dogfooding, empezamos a emplear Alfresco para la gestión de proyectos hace mucho tiempo, ahora damos un salto mas con la gestión de los mismos desde el propio Share.
Alfresco Share nos permite tener en un único espacio de trabajo toda la documentación asociada al proyecto, las tareas de desarrollo (mediante el módulo de integración con Redmine que hemos desarrollado) de cada usuario y el calendario del proyecto.
De este modo cubrimos las siguientes necesidades de una manera efectiva:
- Múltiples Proyectos (Sites), Estos se crean automaticamente con una plantilla de proyecto que genera estructura y documentación base.
- Potenciar la colaboración entre equipos, principalmente gracias al wiki y a los foros
- Integración con el correo electrónico, viene out of the box con Alfresco, pero aún así hemos mejorado esta funcionalidad para ajustarse mas a nuestras necesidades.
- Integración con nuestras herramientas de desarrollo Redmine.
- Integración con nuestra herramienta de Soporte (Request Tracker),
- Planificación, Hitos y Calendario, empleamos el calendario del Site para la gestión de las fechas de entrega, vacaciones del equipo, etc …
- Entregables a clientes, gracias a la habilidad de poder invitar a determinadas partes del Site a nuestros clientes, el intercambio de documentación entre ellos y nosotros se ha hecho mucho mas ágil.
Con todo esto creemos que la integración con Redmine ha sido fundamental para dar el salto a Alfresco Share.
Nota: La extensión de Redmine la tenemos disponible de manera gratuita a todos nuestros clientes de A^3S (Alfresco As A Service).Yakuake – nostalgía de la terminal del Quake?
Yakuake (Yet another Kuake, antes llamado YaKuake) es un emulador de terminal para KDE inspirado en el terminal del videojuego Quake: cuando pulsas una tecla (por defecto F12, pero se puede cambiar) la consola aparece en la pantalla deslizándose desde la parte superior del escritorio, y cuando la vuelves a pulsar desaparece.
La ventaja de esta terminal radica en la velocidad de carga. Al estar siempre cargada en memoria tarda mucho menos en arrancar que las demás, algo muy útil para la gente que utiliza de forma continuada la consola.
A pesar de ser una aplicación para KDE, es posible instalarla en Gnome, con la instrucción:
sudo apt-get install yakuake
Otra opción para los que usamos Gnome es Guake. Tiene la misma funcionalidad que Yakuake pero realizado esplícitamente para Gnome, por lo que la integración con el escritorio y los efectos serán más fluídos.
Para instalarla:
sudo apt-get install guake
Después de probar ambas en Ubuntu 9.10 me quedo con Guake, ya que su integración con el escritorio de Gnome es más fluida, aunque ambas aplicaciones ofrecen las mismas prestaciones.
i18n y L10n de Alfresco
La documentación acerca de la i18n no es suficientemente clara al respecto y es frecuente encontrarse con que las cosas no funcionan a pesar de haber seguido las instrucciones. El presente artículo pretende explicar por qué es tan confuso el tema y como se debe hacer para salir airoso de la situacion.
1.- i18n de Alfresco en versiones anteriores a 3.0
Alfresco proporciona dos métodos para obtener mensajes localizados :
org.alfresco.web.app.Application#getMessage(FacesContext context, String msg)
org.alfresco.i18n.I18NUtil#getMessage(String messageKey, Locale locale)
Una diferencia fundamental entre ambos es que Application.getMessage delega en org.alfresco.web.app.ResoruceBundleWrapper, mientras que I18NUtil.getMessage delega directamente en java.util.ResourceBundle. ResoruceBundleWrapper no es más que una extensión de ResourceBundle para que, si no se encuentra una deternminada clave en el properties se muestre al usuario como $$key.value$$ en el web-client.
Otra diferencia es que Application.getMessage emplea exclusivamente como properties el webclient.properties, mientras que I18NUtil se nutre de todos los properties indicados mediante beans de spring del estilo :
1 <bean id="actionResourceBundles" class="org.alfresco.i18n.ResourceBundleBootstrapComponent"> 2 <property name="resourceBundles"> 3 <list> 4 <value>alfresco.messages.action-config</value> 5 </list> 6 </property> 7 </bean> 1.2.- Problemas derivados de la existencia de dos métodos de recuperación de mensajesUna consecuencia desagradable de lo expuesto es que es difícil saber en qué properties se deben poner las claves ya que dependiendo del método que la clase de Alfresco en cuestión emplee para recuperar el mensaje ( Application#getMessage o I18NUtil#getMessage ) se debe poner en el webclient.properties o bien en otro properties inyectable mediante Spring.
Y otra consecuencia es que todos los mensajes que se recuperen a través del Application#getMessage deben ir en el webclient.properties, lo que puede ser molesto si el proyecto se compone de módulos independientes y se quisiera que cada módulo gestionase su propia i18n.
2.- i18n de Alfresco en versiones posteriores a 3.0
2.1.- Alfresco > 3.0 no está limitado a un único webclient.propertiesLos problemas derivados de que todos los mensajes tengan que ir en un único webclient.properties se ha resuelto a partir de la versión 3.0 ya que se permite indicar varios properties para ser usados con Application#getMessage y que se definen a través de org.alfresco.i18n.ResourceBundleBootstrapComponent; por ejemplo :
1 <bean id="resourceBundlesWebApp" class="org.alfresco.web.app.ResourceBundleBootstrap"> 2 <property name="resourceBundles"> 3 <list> 4 <value>alfresco.extension.custom-webclient</value> 5 </list> 6 </property> 7 </bean> 8 2.2.- ¿Cómo saber qué clase (Application ó I18NUtil) emplea Alfresco para la recuperación de mensajes?Como se ha explicado con anterioridad el hecho de que existan dos métodos para recuperar los mensajes lleva a confusión ya que obliga a saber qué clase (Application ó I18NUtil) emplea Alfresco para la recuperación de mensajes. Y por tanto esto conlleva a tener dudas de en qué archivo poner el properties y si debe ser inyectado mediante org.alfresco.web.app.ResourceBundleBootstrap ó org.alfresco.i18n.ResourceBundleBootstrapComponent. La regla en este caso es :
Los mensajes usados por el webclient1 se recuperan mediante Application#getMessage(FacesContext context, String msg) y por tanto deben ser configurados mediante org.alfresco.web.app.ResourceBundleBootstrap. Por otro lado, los mensajes usados por el repositorio2 y sus servicios emplean I18NUtil#getMessage(String messageKey, Locale locale) y por tanto deben ser configurados mediante org.alfresco.i18n.ResourceBundleBootstrapComponent.
La idea es que cuando sea necesario que se muestre un mensaje alternativo, si no se encuentra el valor de clave correspondiente en el .properties, se delegue en el ResoruceBundleWrapper para mostrar algo del estilo $$actio.create_space$$. Por esta razón las clases que no requieran de tal mensaje alternativo (de tal wrapper) emplean el I18NUtil y el resto emplean Application#getMessage
3.- Recursos
- http://wiki.alfresco.com/wiki/Adding_Custom_I18N_Strings
- http://www.juntadeandalucia.es/xwiki/bin/view/MADEJA/AlfAccionesPersonalizadas
- http://wiki.alfresco.com/wiki/I18N
[1] Las clases del webclient se encuentran en el alfresco-web-client-XXX.jar (código de alfresco-web-client-XXX.jar) y se corresponden con paquetes del estilo org.alfresco.web
[2] Las clases que implementan el repositorio de Alfresco se encuentran en alfresco-repository-XXX.jar (código de alfresco-repository-XXX.jar).
Extendiendo Alfresco Share para la Gestión de eNóminas
Share es una excelente herramienta colaborativa que emplea Alfresco como repositorio documental y Surf como framework de desarrollo. Este nuevo método de acceder a Alfresco extiende las capacidades colaborativas del reporitorio con características como foros, blogs, Calendarios y Wikis.
Cada usuario tiene acceso a la pagina principal del portal, común a todos los usuarios y completamente personalizable. Además cada usuario tiene acceso a una serie de “Sitios” con finalidades espécificas, por ejemplo en Queres usamos un Sitio para Marketing, otro Sitio para Proyectos, etc …
Cada Sitio está formado por pequeñas aplicaciones llamadas Dashlets que proporcionan la funcionalidad necesaria.
ProblemaPuesto que Alfresco Share es una excelente herramienta colaborativa, hemos detectado que en lugar de enviar las nóminas por email cada mes o de imprimirlas y entregarlas en mano, deberíamos aprovechar Alfresco Share para proporcionar las nóminas a los usuarios.
SoluciónPara ello hemos desarrollado un pequeño Dashlet que muestra los documentos de tipo nómina de cada usuario en el Sitio destinado a información general de Queres. El aspecto no es fantástico, pero la funcionalidad es la necesaria, además el dashlet permite filtrar por años. El desarrollo de dicho dashlet se ha hecho en 2 días y consta de webscripts en Alfresco para obtener las nóminas y webscripts en Share para comunicarse con Alfresco y para mostrar la interface gráfica.
Capturas ReferenciasAlfresco como sistema de clasificación bibliográfica
En este post se hace una pequeña introducción a los sistemas de clasificación bibliográfica y cómo podrían implementarse en Alfresco para la gestión de bibliotecas digitales.
Los sistemas de clasificación bibliográfica
Todas las bibliotecas tienen libros (obvio); y los libros están en estanterías (obvio todavía); lo que tal vez resulte más extraño al profano es saber que los libros no se disponen en las estanterías al azar. Todas las bibliotecas, medianamente decentes, se organizan según un sistema de clasificación bibliográfica :
Las clasificaciones bibliográficas son lenguajes documentales controlados y precoordinados, que tratan de establecer una división lógica y sistemática del conocimiento, que permita representar el contenido de un documento de manera sintética.
(Wikipedia – clasificación bibliográfica)
Es decir, que si estas buscando un libro que te enseñe como hacer una deliciosa Vichysoisse (léase vichisuá) lo que haces es :
- Averiguar cómo está organizada la biblioteca. Algunas tienen posters con el sistema empleado.
- Encontrar el apartado Vichysoisses en el poster. (A veces no vale afinar tanto y hay que aproximar, por ejemplo por el apartado de cocina).
- Ahora solo tienes que encontrar la estantería que aloja los libros de dicho apartado. Esta suele ser la parte más difícil
- Tras dar varias vueltas hasta encontrar la estantería ya solo te queda coger el libro que más te guste. (¡Anda!, si en el lomo del libro hay una pegatina con un código … ¡Cómo se aburren estos bibliotecarios!)
- NOTA : No es que hayas hecho mal la Vichysoisse, es que la esencia es el puerro : es imposible que sepa bien.
La biblioteca central de Seatle con el código Dewey para localizar las estanterías
Ahora que más o menos me ha quedado claro como funciona una biblioteca en la vida real, me pregunto cómo puedo adaptar dicho sistema a la cantidad de libros, documentales, audio-libros, … que tengo en formato digital. La primera y evidente solución es adaptar el paradigma mencionado en el apartado anterior a la estructura de espacios/carpetas de Alfresco, de modo que se puede crear un espacio/carpeta por cada apartado del sistema de clasificación bibliográfico empleado y meter en dicha carpeta los documentos, libros, etc … . Así que para probar dicha solución he creado dos modelos de espacio (estructuras de carpetas) con un par de sistemas de clasificación significativos. Cómo se usan dichos sistemas escapa al propósito de este post, pero su funcionamiento básico es bastante intuitivo.
El sistema de clasificación decimal de DeweyEl sistema de clasificación decimal de Dewey es un sistema de propósito general ampliamente extendido y usado. Para tener una idea de la cantidad de temas que abarca a continuación reproduzco los códigos del primer nivel.
* 000 – Computer science, information & general works
* 100 – Philosophy and psychology
* 200 – Religion
* 300 – Social sciences
* 400 – Language
* 500 – Science (including mathematics)
* 600 – Technology
* 700 – Arts and recreation
* 800 – Literature
* 900 – History, geography, and biography
La tabla de contenidos completa se puede consultar en el siguiente enlace : Tabla de contenidos del sistema de clasificación Dewey (en inglés)
A continuación las carpetas correspondientes comprimidas en formato .zip y que pueden ser importadas en Alfresco como si fuera un acp : DDC_Summary.zip
ACM Computing Classification SystemEl siguiente sistema de clasificación ha sido elaborado por la prestigiosa Association for Computing Machinery es más específico y está dedicado exclusivamente a las ciencias de la computación. A continuación, como muestra, el primer nivel :
acmccs98 - ACMCCS98
|-- A. - General Literature
|-- B. - Hardware
|-- C. - Computer Systems Organization
|-- D. - Software
|-- E. - Data
|-- F. - Theory of Computation
|-- G. - Mathematics of Computing
|-- H. - Information Systems
|-- I. - Computing Methodologies
|-- J. - Computer Applications
`-- K. - Computing Milieux
La tabla de contenidos completa se puede consultar en el siguiente enlace : ACM Computing Classification System TOC
A continuación las carpetas correspondientes comprimidas en formato .zip y que pueden ser importadas en Alfresco como si fuera un acp : acmccs98 – ACMCCS98.zip
Cómo clasificar documentos que tratan varias temáticasUno de los principales problemas con los que se encuentran los sistemas tradicionales es el de clasificar un libro que trata de varias temáticas. Y es que el libro hay que colocarlo en una sola estantería y hay que elegir. ¿Dónde se pondría un libro como Sabor a hiel ? Sí, ya sé que muchos lo pondrían en la papelera, pero es que el bibliotecario con el sistema Dewey tiene que decidir entre : 862-Spanish drama, 863-Spanish fiction, 864-Spanish essays (No ha código para la papelera). Algunos sistemas tienen parches para resolver esta situación; aunque por lo que yo sé, con mi limitado conocimiento del tema, ninguna solución eficaz y definitiva. Para este caso Alfresco proporciona varias soluciones, pero probablemente la más eficaz sea emplear las categorías. Al igual que se puede crear una estructura de espacios que refleje el sistema de clasificación empleado, también se puede replicar dicho esquema mediante categorías y asignarlas posteriormente a los documentos a modo de etiquetas.
Alfresco como solución integral a la gestión de bibliotecasCatálogo analógico
La mayoría de las bibliotecas tienen su catálogo informatizado (en otras todavía hay que rebuscar en el cajón de las fichas) y permiten realizar varios tipos de búsquedas : por autor, temática, título, etc … La gran noticia es que Alfresco no solo se puede emplear como almacen de archivos digitales, si no que además permitiría tambien gestionar el catálogo de la biblioteca. Incluso sería eficaz gestionando los flujos de trabajo derivados de la recepción de nuevas obras, gestión de préstamos, gestión de usuarios, buzón de sugerencias, ….
Como sistema de gestión documental que es, y líder en su área, Alfresco encaja mejor que cualquier otra solución informática en la resolución de los problemas/necesidades típicas de gestión de una biblioteca.
Cómo configurar una conexión PPP contra una VPN en Linux
Pila OSI para TCP/IPfuente:wikipedia
En este post se describe cómo conectar un cliente a una red privada
virtual (VPN) usando el protocolo de enlace PPP.
Tecnologías implicadas
PPP (Point to Point Protocol) es un protocolo englobado en el nivel de enlace dentro de la pila de protocolos OSI para TCP/IP. Encapsulando a PPP se pueden emplear PPtP (Point to Point tunneling Protocol), PPPoE (PPP over Ethernet) , PPPoA (PPP over ATM), … Dependiendo de cómo esté configurada la VPN habrá que usar uno u otro.
Configuración del cliente en ubuntuEn ubuntu hay que usar el demonio pppd y en este caso concreto usaremos pptp. Todo esto está en los
repositorios oficiales, por lo que se pueden instalar con el apt-get.
Una vez instalados configuraremos el perfil del peer, para lo cual crearemos un archivo con nombre descriptivo
en /etc/ppp/peers dónde definiremos las opciones de la conexión :
Por último queda invocar la conexión :
# pppd call mypeerSi todo está bien debería haber una interfaz conectada con la red :
# ifconfig ppp0 Link encap:Point-to-Point Protocol inet addr:172.16.XXX.XXX P-t-P:172.16.XXX.XXX Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1024 Metric:1 RX packets:7 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:121 (121.0 B) TX bytes:104 (104.0 B) Problemas conocidos- No se puden alcanzar host de la vpn
- Posiblemente sea un problema de entutamiento. Hay que añadir la red a la tabla de rutas.
$ route add -net $VPN_NET dev $PPP_IFACE
Si no queremos hacer esto manualmente se puede inluir en un archivo en /etc/ppp/ip-up.d/ :
# ---------------------- /etc/ppp/ip-up.d/update_routing_table ------------------ #!/bin/bash NET="172.16.0.0/16" IFACE="ppp0" route add -net ${NET} dev ${IFACE} # ---------------------- /etc/ppp/ip-up.d/update_routing_table ------------------Creo que hay una opción de pppd que sirve para lo mismo, pero no lo he probado (you know : “if works don’t touch” ).
- scp no funciona correctamente o la conexión se cuelga
- Durante la conexión se negocia el mtu de la red; pero en ocasiones esto no es suficiente por lo que hay que ajustarlo a mano. Por ejemplo: $ pppd call mypeer mtu 1024
Cómo simular una estructura if else con JasperReports e iReports
JasperReports es una librería de java que permite generar informes a partir de plantillas xml.
Como está pensado para presentar datos exclusivamente estructuras de programación del estilo if-else no se pueden usar. Sin embargo en ocasiones puede ser necesario y es posible simularlo como se muestra a continuación.
En este caso nuestro modelo de datos tiene un estado para las facturas que es de tipo numérico. Sin embargo a los usuarios se les debe mostrar un texto que tenga más significado para ellos de acuerdo con su modelo de negocio. Para hacer esta traducción se debe modificar la plantilla .jrxml de la siguiente manera :
<!---------------------------------------- plantilla.jrxml ------------------------------------------> <textFieldExpression class="java.lang.String"> <![CDATA[($F{[fact.model]estadoFactura}.intValue() == -1 ? "Sin registrar" : ($F{[fact.model]estadoFactura}.intValue() == -2 ? "Sin pedido" : ( $F{[fact.model]estadoFactura}.intValue() == -4 ? "Sin recepcion" : ( $F{[fact.model]estadoFactura}.intValue() == 0 ? "Registrada" : ( $F{[fact.model]estadoFactura}.intValue() == 1 ? "Pdte. aprobar" : ( $F{[fact.model]estadoFactura}.intValue() == 2 ? "Aprobada" : ( $F{[fact.model]estadoFactura}.intValue() == 3 ? "Pdte. revisar" : ( $F{[fact.model]estadoFactura}.intValue() == 4 ? "Rechazada" : "" ) ) ) ) ) ) ) ) ]]> </textFieldExpression> <!---------------------------------------- plantilla.jrxml ------------------------------------------>Como trabajar directamente con las plantillas xml puede ser muy engorroso existe un editor gráfico llamado iReports que facilita la tarea. Si usamos iReports para reproducir el comportamiento deseado debemos abrir el editor de expresiones …
e introducir el if-else
Balsamiq Mockups y Alfresco ;)
Herramientas para realizar Mockups (Bocetos en español) hay unas cuantas, la mayoría de una calidad media-baja.
Habitualmente para realziar prototipos de aplicaciones se emplean herramientas como MS Visio o OmniGraffle o incluso el propio IDE (Eclipse ó NetBeans). Todas estas altrernativas tienen sus ventajas y sus grandes desventajas:
- Visio solo funciona en Windows y es la tipica aplicación que vale para todo y no hace nada bien en concreto
- OmniGraffle es unicamente para Mac OS y se centra en diagramas aunque hay gente que ha puesto a disposición de todo el mundo paletas con componentes de aplicaciones.
- Tanto Netbeans como Eclipse generan buenos mockups pero demasiado reales con lo que corres el riesgo de transmitir que la aplicación ya está terminada cuando solo has realizado uans capturas.
En este sentido la última herramienta que he probado y me ha convencido hasta el punto de comprarla es Balsamiq Mockups.
Está desarrollada en AIR y funciona incrustada en el navegador y también como aplicacion de escritorio. Su principal ventaja es que puedes generar Bocetos muy rapidamente y tienen un aspecto de aplicaciones no finalizadas. Este ejemplo lo he hecho a partir de la interface de Alfresco, ha llevado aproximadamente 1 hora y es el que empezamos a usar internamente para los módulos que desarrollamos
En definitiva Balsamiq Mockups es una herramienta excelente y de las pocas sino la única que aún siendo comercial me gustaría recomendar.
Nuevas características en la instalación de Alfresco 3.0
Como hemos visto en el Intensive Alfresco Training Course, la base de datos por defecto ya no es HSQL, sino Derby. Pero a mayores de eso, la instalación de Alfresco 3.0 provee de nuevas peculiaridades.
- La librería de mysql, mysql-connector-java-5.0.3-bin.jar, que en anteriores versiones ya venía con la versión bundle de Alfresco, no aparece en esta última. Tendremos que descargarla y copiarla en el directorio /opt/alfresco/tomcat/lib
- A la hora de instalar la licencia, nos habremos percatado de que la carpeta license no existe (y tampoco el fichero howInstallLicense.txt que contenía. Simple pero útil). De modo que tendremos que situarnos en el directorio /opt/alfresco/tomcat/shared/classes/alfresco/extension, crear allí una carpeta llamada license y dentro de ella copiar la licencia apropiada para esta versión de Alfresco. Pararemos el servidor y lo arrancaremos de nuevo. Si vamos a la carpeta license de nuevo, veremos que la extensión de la licencia (antes .lic) a cambiado por .installed
- Esta nueva versión de Alfresco trae también una aplicación web añadida, share (situado en el directorio de webapps), que implementa un portal.
Do you know where is Barbican station?
Do you know where is Barbican station?
Querido diario …
Hemos coincido en el desayuno con todos los japoneses, lo que nos ha retrasado los planes. Sin embargo hoy, habilmente, he dejado la fruta para tiempos más propicios y me he echado sobre el bacon como un león. Dedicado como estaba a mi tarea de deborar, y despreocupado de todo lo mundano, me se acerca una tipa vestida de negro y me dice "algo". "Sorry?" me vuelvo a ella indignado por osar interrumpirme. Y la tipa repite la misma ininteligible cantinela. What de cockney are you taking to me?, pienso; aunque le respondo educadamente "I don’t understand you. Are you really speaking in english?". A lo que la Srta. repite tras un suspiro algo como : "ud yu lik om ofiti". Y en un golde de inspiración divina mi mente traduce como Would you like some cofee or tee? Ah, era eso, pués explícate carallo! Y es que aquí no todo el mundo sabe hablar inglés. Hay indios, pakistaníes, chinos, japoneses, americanos, australianos, neocelandeses … ingleses de newcastle, del sur y del lejano norte … total, que cada uno habla a su manera, con su acento, su cadencia y sus palabrillas extrañas. Por lo que uno tiene que armarse de paciencia y tratar de entenderlos. Pobrecillos, no todos han podido aprender inglés con Muzzy.
El curso de Alfresco ha sido mucho más interesante que el de ayer : freemarker, webservices … Por cierto Iago, la extensión para enviar correos con adjuntos que está en la forja la ha hecho el trainner que tenemos. Te suena de algo esa extensión? Y uno de los chicos tiene el libro de Potts firmado. Si es que esto es un pañuelo.
En el plano turístico ha tocado London Tower, con su London Bridge y Saint Paul’s Cathedral. La primera es la de la leyenda de los beefeaters, los cuervos y demás. A mí magustao mucho más que el Big Ben. La segunda es el edificio que salía en las series de la BBC reflejado en el Támesis, ya sabes después de Benny Hill, Mr. Bean, La superabuela … (esta última la ha visto poca gente).
Una cosa de la que uno se da cuenta enseguida es de que los semaforos están padornar. Porque, ¿a qué viene que se ponga en rojo pa los coches y pa los peatones (que aquí se llaman pedestrian) a la vez? Pués no tiene sentido. Además todos los semáforos tienen un botoncillo para solicitar que se ponga verde; que en realidad es un contador de tontos : tu le das, se enciende una luz que pone wait y no pasa nada más. El del coche parado y tú parado. Así que acabas haciendo lo que todo el mundo : cruzar en rojo. Ah, y si no hay semáforo lo primero no es mirar a la derecha, ni a la izquierda tampoco;lo primero es mirar al suelo porque en todos lados te pone padonde mirar. En unos casos look right y en otros look left. El caso es que no te fías y miras pa los dos. Y curiosamente la próxima vez que cruzas haces lo mismo, y yo me pregunto ¿paqué mirar pabajo si luego vas a mirar pa los dos lados? (Donde nunca miras más es al semáforo).
Hoy hemos sido infieles al Dixy. En su lugar hemos ido a un sitio que se llama tesco. Tenían fruta pelada y cortada ¡y los donuts de Homer! (el rosita este mítico).
Y parece que ya nos estamos mimetizando, porque mesacercao un tipo y ma dicho Do you know where is Barbican station? A lo que le he respondido : Sure! Follow that street (pointing with the finger to the street in cuestion) an go all straight; then you’ll find on your right. Todavía lo están buscando.
Intensive Alfresco Training for Development (Queres goes to London). Part II
In the previous post I dindn’t mention about a new feature of Alfresco Enterprise 3.0, which was told to us. This is about the Dynamic Models.
In others versions of Alfresco (2.1.*) -and in this one too- when we modify a domain model we have to include the model’s files in /opt/alfresco/tomcat/shared/classes/alfresco/extension and restart the Alfresco server; but in Alfresco 3.0, you add the model into Company Home>Data dictionary>Models, close the current session, open a new one, and the model is already loaded.
Today, the second day of the course, we saw the following points:
1. Web Client language properties
In the other day, we have modified the web-client-custom-config.xml file to see the new metadata in Alfresco Web Client. Alfresco has many languages packages suchas Spanish, Dutch, French and so on; but these ones dont’t have translated the new metadata we have been created, so, in show-property tag, we specify the display-label-id attribute. Later, we create two files: webclient.properties and another web client file for a specific locale -in this case Spanish-, webclient_es_ES.properties.
In the first file we write the metadata’s display label id in English (language by default) and in the second one the same proccess: metadata’s display label id in Spanish.
After restart Alfresco and select Spanish as language, we can see our new metadatas translated in the web client.
2. Writing templates
A template is a document than can be applied to an object or objects to produce another document. Its engine is Freemarker.
Basically, template + data model = output. The data model consists of objects which are available to the template (such as repository objects -companyhome, userhome, person, document, space…- or XML documents).
A special servlet is provided that allows the output of a template+model to be returned directly on the response. There are two ways to use it:
a) In the node browser go to: http://localhost:8080/alfresco/template/workspace/SpaceStore/insert-here-node’s-noderef/insert-here-template’s-noderef
b) Or go to: http://localhost:8080/alfresco/templatePath=/Company Home/Data Dictionary/Prestentation Templates/mytemplate.ftl&contextPath=/Company Home/mydocument.doc (in this case the order doesn’t matter)
3. Scripting in Alfresco
An Alfresco script can create, copy, move or remove nodes. Also can read/write text based content or properties. It can be executed by a run action, a content rule or an URL.
4. Web Scripts
Web Scripts follows a MCV framework: the Alfresco repository is the model, the javascript is the controller, and the Freemarker file, the view. Web Scripts can be used like dashlets, or applied to portals for instance. But is better to say that they follow the Web-Oriented REST Style Architecture. They also have two methods: get or post.
5. Mount a CIFS unit
We saw the same that I wrote in this post -in superuser mode, this way ports weren’t changed-; in Windows the process is mounting a network driver.
See you tomorrow for more contents!
… Batman stuff
Alfreso Training – Day 1.
… Batman stuff
Querido diario …
El desayuno inglés está bien si distinges lo que es cada cosa. Porque lo que parecía piña era una cosa amarga y lo que parecía pera resultó ser piñá. El zumo de naranja que parecía de cartón, era de cartón. Por lo menos el yogourt que se sirve a cucharones de un cuenco sabe a yogourt. Sabido lo que sé seguro que hubiera prestado más atención a los huevos fritos y demás. Pero no adelantemos acontecimientos …
Por suerte el portero guasón (ver post anterior) no estaba hoy a la mañana y la señorita que había en su lugar nos caló a la primera. Que en una torre con más de veinte plantas en la que deben trabajar cienes de personas la recepcionista sepa dónde vas con un golpe de vista es cuanto menos inquietante. Ah por cierto, "pull" es tirar, así como "push" es empujar; pero permitidme que no recuerde como aprendí esta dura lección.
El sitio del curso está guapísisimo. Y menos mal que el trainner es italiano así que su inglés se entiende bien. El menú de hoy : installing Alfresco, Custom content modeling, configuring the web-client. Pa tapar algunos agujerillos de conocimiento; el resto bastante conocido todo.
La comida es a las 12. Yo pensé : "no te hinches ahora con esto, que luego no comes". Efectivamente, luego no comes. ¡Cuántas veces me he acordado a lo largo del día del Dixie Chicken! Y todo esto es un poco raro porque si desayunas "a lo ingleś" a las 8 y cuatro horas después comes (sandwiches vegetales y cosas así), y luego hasta las 17 no sales de currar ¿No queda un poco desbalanceado? Es más, si la gente cena sobre las 18 ¿Qué hace abierto el Dixie Chicken a las 21? Esto me recuerda cuando Quijote le dice a Sancho : "Come amigo cuanto puedas, pues no sabes cuándo has de volver a comer".
La anecdota que da título al post de hoy ocurrió precisamente en un break. Noelia, que tenía curiosidad por ver una tienda de comics, preguntó si alguién la conocía. El chico holandés preguntá a su vez que de qué trataba. Y el cachondo de Manchester le dice : "Ah, Batman stuff" Yo mantuve a duras penas la compostura y la cara de poker, pero la tarea se tornó casi imposible cuando el manchesteriano se vuelve a Noelia y le pregunta directamente Do you like Batman?
Después reunimos el valor suficiente para meternos en el metro (tube). Es carísimo, pero no es tan caótico como dicen si tienes un buen mapa. Visita de rigor al Big-Ben, London Eye y tras algunas vueltas (mea culpa) llegamos a Buckingham Palace. No nos dejaron entrar. De hecho ni siquiera nos la pasaron al telefonillo cuando exigimos hablar con la Sra de la casa.
Y se hizo tarde por lo que volvimos al hotel. Eso sí, como expertos londinenses, elegimos el camino bueno sin titubear. Si es que estos pueblos… enseguida te haces con ellos.
Are you comming for the english course?
Querido diario …
Tras incidentes sin importancia relevante en el control de seguridad pudimos coger el avión a Londres. El aeropuerto estaba congestionado así que nos tuvieron 15 minutos dando vueltas por encima de Londres: así pudimos ver todo desde más arriba aun que la London Eye.
En el hotel pudimos comprobar que los informáticos de UK son iguales que los de España : "Sorry the system is down" dice la recepcionista con un fajo de papeles en la mano. Donde se supone que estaban nuestros nombres. Efectivamente estaban, pero solo uno. "So, one individual room …" Por suerte tienen la antiecológica costumbre de imprimir todos los mails (o es que ya se conocen a sus informáticos); así que encontraron el de nuestra reserva y todo arreglado.Por cierto, hay una excursión de japoneses del cole, y las niñas hacen como en los mangas : cuchichean, se están riendo siempre … y asta aquí llegan las similitudes que ¡a saber que tipos de mangas léeis !
Luego fuimos a hacer el simulacro para ver si éramos capaces llegar al sitio del curso, y cuando llegamos al sitio le preguntamos al portero por el curso; y nos responde "Are you comming for the english course?" Umm, puñalada trapera a nuestro nivel de inglés. Así que solo pudimos averiguar que (1) hablamos mal ingleś, (2) el tio era un guasón.
Por cierto, un domingo a las 8 pm Moorgate es el "wrong place" había que estar en Covent Garden nos dijeron después. Pues allí debía estar todo el mundo porque por las calles ni un alma. Bueno sí, un tío raro con una herida extraña en un brazo que nos pidió pasta. Yo creo que la herida era de pega y nosotros tenemos mucha pinta de extranjeros, el caso es que "sorry we don’t understand" le hizo al tipo perder la paciencia y olvidarse de nosotros.
De vuelta al hotel pasamos oportunamente por un badulaque a comprar víveres. No había máquina de fresy-suisse (o como se diga). Pero más adelante encontramos el gran Dixie Chicken : restaurante de 5 tenedores, atendido por dos amables indios (o pakistaníes) y que tiene las salsas en botes de litro. No había coka ligth, solo diet pepsi. Pero bueno, teniendo en cuenta que la comida se prepara sacando una "masa informe de algo" de un congelador y tirándola dentro de una cuba de otro "algo" que parece muy caliente qué se puede esperar …
Londres tiene eso: que es la juerga padre; y a las 9.30 estás en cama, escuchando el "hablar por hablar" de la radio (sabe Dios cuál).Pero estuvo bastante bien; es que el presentador es un cachondo nada imparcial que se metía con la gente que llamaba. Pues resulta que el Domingo era el día de reconocimiento de la mujer o algo así; así que todas las llamadas eran monotemáticas. El tipo no hacía más que pinchar y venga mujeres a llamar. ¡Ni el mismísimo Jorge contando uno de sus famosos chistes!
Ala, see you.
Intensive Alfresco Training for Development (Queres goes to London). Part I
During this week, we will attend to Intensive Alfresco Training Course, which trainer is Ugo Cei (his company Sourcesense is also an Alfresco partner).
Today, the first day of the course, we learned (or maybe revised) the following points:
1. Alfresco’s architecture
Alfresco has many parts: storage of content, storage of metadata, storage of lucene indexes and web client application. Actually, content’s storage is not in Alfresco database; the files are stored in the file system (Alfresco never delete a file), because if we storaged a great number of binarie files, we could have problems with Alfresco database. Lucene’s indexes also are stored in file system, separated of content data. The metadata is stored in Alfresco database (in this case, a mysql database).
The files related to web client (Spring configuration, JSP pages, and so on) are in /alfresco/tomcat/webapps/alfresco directory.
2. Installing and setting up Alfresco
We installed a Tomcat Bundle Alfresco Enterprise (version 3.0), with JDK 1.5/1.6 and mysql. At first setup of Alfresco, we have seen that there is a Derby database instead of HSQL database, but there aren’t important differences. Derby database is also not recommended to production.
We created an Alfresco database in mysql, change Derby database for mysql database (modifying files custom-hibernate-dialect.properties and custom-repository.properties) and deleted alf_data directory (it had indexes and content of Derby database, we could have problems at restart of Alfresco if alf_data directory wasn’t deleted).
3. Content, spaces and more topics.
Our trainer talked us about characteristics of Alfresco content, spaces, Custom Views (developed in freemarker language) and so on.
4. Content rules, Check In, Check Out, Spaces Templates…
We revised concepts like permissions (inherence of them too), content rules (actions that are triggered when an event -introduce/update/move/delete a file- occours) attached to an specific spaces; and at this point I have to say that in a spaces which has more than one content rule, the order of execution (if they are triggered with the same event) is the same order displayed in content rule wizard. Check In (the original document is read only, and a working copy appears) and Check Out (the original document is updated with working copy changes and it is available again).
The Spaces Templates ar useful in the case that we want to replicate the same structure of spaces (with documents and/or content rules) many times. We create the metioned structure in Company Home>Data Dictionary>Space Templates and we use it creating a space with de Advanced Space Wizard.
5. Content Modeling: Domain models.
We saw the damain models which already have been with Alfresco and their features.
6. Content Modeling: Modifying the Domain model.
We did a simple exercise of modifying the Domain model with namespaces, types, aspects, types’ properties, aspects’ properties, contraints, etc.
iReports : columnas y filas en blanco en informes de excel
La manera de evitar que jasperreports introduzca filas y columnas en blanco en los informes de excel es no dejar espacios en blanco entre los campos de la banda "details band".
Usando iReports podemos seleccionar todos los elementos y pulsar el icono "enlarge to band height" y así evitamos que introduzca filas en blanco. Si se pegan los elementos sin dejar espacio se evitan las columnas en blanco.
Si además queremos evitar que imprima las cabeceras de las columnas varias veces en las propiedades del report podemos indicar que ignore la paginación. Y podemos poner el margen izquierdo a cero para que no ponga una primera columna en blanco.
Como eliminar la Cabecera y Pie de la primera pagina en OpenOffice
En Queres tecnologías empleamos a diario la herramienta OpenOffice Writer para escribir todo tipo de documentos y frecuentemente me encuentro con los mismos problemas, otros ya están documentados en este weblog o en el mío personal, por eso me gustaría postear la solución a uno de ellos.
Cuando escribimos documentación corporativa, habitualmente tenemos una Cabecera y un Pie de página comunes a todas las páginas del documento salvo a la Primera página, esta página contiene una plantilla de presentación que la hace atractiva y que no necesita ni Cabecera ni Pie de página.
Para habilitar la Cabecera y el Pie de página, hacemos Insert->Header->Default e Insert->Footer->Default. Entonces generamos el contenido que queramos para dichas secciones. A partir de este momento tenemos Cabecera y Pié de página para todas las páginas del documento.
Para eliminar Cabecera y Pie de la primera página nos situamos en ella, abrimos la ventana de estilos: Format->Styles and formatting y hacemos doble click en el estilo que pone: First Page. Con esta acción hacemos que desaparezcan la Cabecera y el Pie de página de la primera página.
Así de fácil
Enviar correos electrónicos en liferay
Una de las peticiones más comunes a la hora de realizar un flujo de acciones es el envío de un correo electrónico al comenzar un flujo o durante el transcurso del mismo. En liferay tenemos la posibilidad de configurar el envío de correos desde el servidor que usemos (Tomcat, Jboss, etc) y luego usarlo desde los controladores.
El primer paso es configurar el servidor de correo para que liferay lo use para todos los mails que salgan del portal (esto sirve que se envíe un mail al crear una cuenta, para los envíos de mail en los formularios que trae el propio liferay, etc). El archivo de configuración está en $tomcat_home\conf\Catalina\localhost\ROOT.xml (en mi caso usando Tomcat), y hay que buscar el recurso ‘mail/MailSession’ y configurarlo a nuestra medida, por ejemplo:
<Resource
name="mail/MailSession"
auth="Container"
type="javax.mail.Session"
mail.imap.host="localhost"
mail.pop.host="localhost"
mail.store.protocol="imap"
mail.transport.protocol="smtp"
mail.smtp.host="smtp.gmail.com"
mail.smtp.port="465"
mail.smtp.auth="true"
mail.smtp.starttls.enable="true"
mail.smtp.user="mail_usuario"
password="contraseña"
mail.smtp.socketFactory.class="javax.net.ssl.SSLSocketFactory"
/>
Una vez echo esto podemos probar que funciona simplemente creando una nueva cuenta en liferay y comprobando que se envía un mail al correo del nuevo usuario, o usando un formulario personalizado que envíe un mail.
Con lo que respecta al controlador de nuestro portlet, podemos implementar el envío de mail de la siguiente manera:
String from = "sender@host.com";
String to = "recipient@host.com";
String subject="This is email title";
String body="Hello World, this is my first email";
MailEngine.send(from, to, subject, body);
Para usar MailEngine debemos importar la clase com.liferay.util.mail.MailEngine que se encuentra en el jar util-java.jar
El método send tiene múltiples variables, y permite entre otras, enviar un documento adjunto, añadir Cc y usar templates en html.




