Cambiar el contenido de ficheros de texto con Maven

En esta entrada veremos cómo configurar Maven para que, en función de los perfiles activados, se modifiquen ciertos ficheros de texto. Un ejemplo claro de uso es cuando estamos usando log4j y queremos que el fichero de log se genere en sitios distintos en función del entorno en el que se ejecute.

Sincronización de Rainlendar con Google Calendar en Ubuntu

Hace tiempo que quedé impresionado por la calidad del calendario Rainlendar. Rainlendar2 es un calendario multiplataforma que se integra perfectamente en el escritorio.







Puedes descargar la versión para tu plataforma en la página de descargas:

La única pega es que yo usaba Google Calendar y Rainlendar2 sólo soporta la integración con Google Calendar en la versión de pago. De todas formas esto ya ha cambiado gracias a GCALDaemon. GCALDaemon es un proyecto de software libre implementado en Java que implementa una sincronización de Rainlendar2 con Google Calendar. Este programa proporciona dos modos de trabajo:
  1. Un demonio o proceso ejecutándose en segundo plano y que mantiene sincronizados los calendarios de Google y Rainlendar2
  2. Un script que al ejecutarlo sincroniza los calendarios

En la página oficial se dan las instrucciones para configurar el modo 1. En esta entrada voy a explicar una solución basada en la segunda opción, en concreto vamos a configurar GCALDaemon para que sincronice los calendarios al entrar en Ubuntu y al salir o reiniciar.

Navegar a un enlace interno tras un action en JSF

En este post voy a dar una solución a un problema común que consiste en navegar a un enlace interno tras pulsar en un botón o en un enlace que ejecuta una acción en el servidor.

Si simplemente quisiéramos navegar a un enlace interno sin ejecutar nada en el servidor podríamos hacerlo con un outputLink:

<h:outputLink value="pagina.jsf#ancla" ><h:outputText value="Ir a la página"/> </h:outputLink>

Sin embargo, puede que lo que necesitemos es ejecutar un método en el servidor y luego navegar hacia un ancla. Esto podemos hacerlo con un método actionListener al que enviaremos el nombre del ancla y que se encargará de redireccionar al usuario al ancla especificada tras hacer su trabajo.

Automatización de Pruebas Web con Selenium RC y Ant

En este post vamos a ver cómo realizar pruebas sobre páginas web de una forma sencilla y rápida. En primer lugar vamos a explicar qué es Selenium:
Selenium es un framework de pruebas portable para aplicaciones web. Las pruebas pueden ser escritas directamente en tablas HTML o codificadas en un gran número de lenguajes de programación (PHP, Ruby, Java, JavaScript, etc.) y se ejecutan directamente sobre el navegador (soporta Firefox, IE, Opera, Safari y algunos más). Además podemos desplegar Selenium en distintos sistemas operativos.
Selenium está formado por varios proyectos:
  • Selenium Core: Es el sistema de pruebas original basado en JavaScript. Actualmente es usado por Selenium Remote Control aunque puede utilziarse como un sistema de pruebas JavaScript/HTML
  • Selenium IDE: Es un plugin de Firefox que facilita la tarea de grabar y ejecutar pruebas HTML. Podemos incluso exportar dichos test HTML a los distintos lenguajes de programación.
  • Selenium Remote Control: Es un sistema cliente/servidor que nor permite controlar los navegadores web localmente o sobre otros ordenadores usando un lenguaje de programación y el framework de pruebas.
  • Selenium Grid: Permite la ejecución de pruebas en varios servidores de una forma distribuida
  • Otros proyectos: Selenium on Rails, Selenium on Ruby y CubiText (Eclipse)

Como puede verse, disponemos de muchas herramientas para hacer pruebas dentro de Selenium. En el siguiente blog se muestra un tutorial sobre cómo hacer pruebas mediante Selenium IDE:

En este tema mostraré cómo crear un proyecto Ant que ejecute las pruebas de forma automática. Para ello ejecutaremos una prueba simple sobre la página DZone.

Componentes Redimensionables en Swing

Hace unos días descubrí un post en el que se explicaba cómo crear elementos redimensionables con Swing de una manera sencilla y rápida. La entrada está explicada bastante bien y puedes consultarla aquí. Las principales características de la solución aportada por Santhosh Kumar T son:
  • Se trabaja con una clase JResizer que contiene el elemento redimensionable
  • Podemos redimensionar cualquier componente
  • Los bordes y los puntos de agarre son totalmente configurables
En esta entrada veremos cómo aplicar esta solución y un aporte realizado por mí.

Tooltips en celdas de JTable

Hace poco, trabajando con el proyecto discography-generator me encontré el problema de hacer que las celdas de un javax.swing.JTable mostraran un tooltip o "mensaje emergente" cuando el ratón estuviera encima.

Lo único que estaba buscando era que se mostrara el contenido de la celda, algo muy simple a priori pero que, como ocurre casi siempre en Swing, acaba siendo algo rebuscado. La solución la encontré en la documentación oficial de SUN:
En este post veremos el código necesario para implementar este comportamiento.

Sistema de plantillas en menos de 50 líneas

En este post presentaré una solución cómoda y rápida (que no tiene porqué ser la mejor) para crear un sistema de plantillas basado en Java. En primer lugar voy a aclarar a qué quiero referirme cuando hablo de "sistema de plantillas". La idea es la siguiente, partiendo de un texto como el siguiente:
Hola ${usuario}, hoy es ${fecha}

Vamos a diseñar un sistema que reciba este texto (en forma de String o InputStream) y un mapa de propiedades, de forma que sustituya todo lo que encuentre del tipo ${clave} por el valor correspondiente en el mapa.

Estructura de directorios de Maven

En esta breve entrada se expondrá la estructura estándar de directorios de Maven. Se expondrán la estructura para cada tipo de proyecto.

Proyecto J2SE (JAR):

proyecto
|-src
|_|-main
|_|_|-java
|_|_|_|-<paquetes-java>
|_|_|-resources
|_|_|_|-<ficheros-recursos>
|_|-test
|_|_|-java
|_|_|_|-<paquetes-java>
|_|_|-resources
|_|_|_|-<ficheros-recursos>
|-target


Proyecto WAR:

proyecto
|-src
|_|-main
|_|_|-java
|_|_|_|-<paquetes-java>
|_|_|-resources
|_|_|_|-<ficheros-recursos>
|_|_|-webapp
|_|_|_|-<contenido-web>
|_|_|_|-WEB-INF
|_|_|_|-META-INF
|_|-test
|_|_|-java
|_|_|_|-<paquetes-java>
|_|_|-resources
|_|_|_|-<ficheros-recursos>
|-target

Cargar un fichero de propiedades en Java

En esta entrada voy a explicar cómo cargar un fichero de propiedades de Java. Esta operación aunque sencilla puede ayudarnos mucho en la separación de responsabilidades entre las distintas partes de nuestro sistema.

Por ejemplo, si tenemos que mostrar una serie de mensajes por pantalla. En lugar de embeber los mensajes dentro del código Java escribiremos dichos mensajes en un fichero .properties asociados cada uno a una clave. Si en un futuro queremos cambiar los mensajes, podemos simplemente cambiar el fichero de propiedades sin tener la necesidad de cambiar el código fuente y volver a compilar la clase donde estuvieran.

Proyectos en los que participo

El motivo de esta entrada es que conozcáis los proyectos en los que estoy involucrado y soy propietario.

En primer lugar el proyecto rolemaster. Este proyecto es un asistente para RMSS (Rolemaster Standard System). RMSS es un juego de rol ya descatalogado pero que seguimos practicando mis amigos y yo. Decidimos crear esta aplicación con el objetivo de facilitar la dirección del juego de forma que no se perdiera tanto tiempo consultando las reglas una y otra vez. Cabe mencionar que la principal característica de este juego con respecto a otros similares es que existe una tabla y una regla para todo, lo que provoca que muchas veces todo vaya muy lento. El proyecto está alojado en Google Code en la siguiente URL:
El proyecto está elaborado en JSF y JPA (se ha elegido Hibernate como implementación) y precisa de una Base de Datos MySQL. Las mejoras que se están barajando son:
  • Hacer que la BBDD sea una SQLite o alguna similar para que pueda estar empotrada en el proyecto.
  • Actualmente el asistente sólo controla la experienciaspor lo que se está pensando en ampliar el asistente al combate y otras situaciones.
El otro proyecto en el que estoy involucrado es discography-generator. Este proyecto consiste en generar una aplicación HTML a partir de carpetas con MP3 de forma que podamos navegar por las páginas web e ir escuchando las canciones. Está pensado para gestionar discografías de forma que tengas una aplicación web por cada discografía y puedas ir navegando este los distintos discos, escuchándo las canciones.

Nota: No incluye ni descaga MP3 alguno, debes tenerlos en el disco duro.

Este proyecto también está alojado en Google Code:
Está elaborado en Swing y precisa de Java 1.6. Actualmente genera la aplicación web, pero se encuentra en una fase de desarrollo muy temprana y precisa de muchas mejoras que puedes consultar en la lista de Issues.

Configurar el MANIFEST con Maven para añadir librerías al classpath

En una de las anteriores entradas de este blog (http://tutorialexception.blogspot.com/2009/03/copiar-dependencias-al-directorio.html) se vio como copiar las dependencias de un proyecto al directorio 'target/lib'. En este blog voy a explicar cómo configurar Maven para que al empaquetar nuestro proyecto JAR y copiar las dependencias al directorio 'target/lib' podamos ejecutarlo con un simple "java -jar proyecto.jar".

Para poder alcanzar este objetivo, lo que tenemos que conseguir es que el fichero MANIFEST configure el classpath indicando las librerías de las que depende. Esto se consigue configurando el plugin maven-jar-plugin:

Hacer que Maven ignore ciertos recursos al empaquetar el proyecto

Seguimos con la configuración de Maven. En este caso vamos a hacer que Maven ignore algunos recursos cuando empaquete nuestra aplicación JAR.

En mi caso, tengo un proyecto JAR realizado en Maven que depende de algunas librerías que no se encuentran en ningún repositorio de Maven. Esto es un pequeño problema, puesto que Maven las intentará descargar la primera vez al realizar cualquier acción sobre el proyecto y generará un error avisando que no puede encontrar dichas dependencias.

Copiar dependencias al directorio target en Maven

Cuando desarrollamos un proyecto J2SE en Maven2, a menudo queremos que al empaquetar nuestro proyecto, las librerías de las que dependen se copien las dependencias del proyecto al directorio target/lib.

Este comportamiento, sencillo a primera vista, se convirtió para mí en una pequeña odisea que finalmente solucioné gracias al siguiente enlace:
En él se hace la misma pregunta y los comentarios dan la solución. A continuación expongo mi adaptación a mi proyecto.

Bienvenido

Os doy la bienvenida a mi blog sobre programación. La mayor parte de las entradas estarán relacionadas con el lenguaje de programación de SUN. Espero que lo disfrutéis.