Browse » Home » Archives for 2009
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:
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.
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:
- Un demonio o proceso ejecutándose en segundo plano y que mantiene sincronizados los calendarios de Google y Rainlendar2
- 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:
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.
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:
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.
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
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.
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:
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.
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 WAR:
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.
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:
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.
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.
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:
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.
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.
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.
Suscribirse a:
Entradas (Atom)