Cómo crear un archivo XML de configuración para módulos de OpenCms?

Fri Sep 18 16:30:00 CEST 2009       Technology For Solutions       Administración, OpenCms, Manuales y tutoriales

Al crear un módulo en OpenCms es probable que tengamos parámetros configurables. Por lo general, estas configuraciones son almacenadas a nivel de cada módulo en archivos de propiedades. Por cada módulo tendremos dentro del mismo configuraciones específicas.

Este artículo explica como generar un archivo XML de configuración centralizado que nos permitirá acelerar los tiempos de desarrollo y tener un LOG de eventos consolidado. OpenCms tiene un mecanismo interno para cargar la configuración de sus módulos que podemos aprovechar reduciendo la cantidad de trabajo.

A efectos prácticos, utilizaremos como ejemplo durante todo el artículo un MODULO DE COMENTARIOS. A nivel configuración, este módulo podría tener un parámetro para definir si debe estar activo o inactivo y otro parámetro para la cantidad de entradas que tiene que mostrar por página.


Qué necesitamos saber?

* Formato XML: conjunto de reglas para codificar documentos
* Definición de DTD: formato que define la descripción de estructura y sintaxis de un documento XML
* Digester de Apache Commons: componente que permite definir un conjunto de reglas para procesar un archivo XML


Construcción de archivo de configuración

Cada vez que se inicia OpenCms se configuran las clases propias y de sus módulos utilizando información almacenada en archivos XML. Cuando creamos un módulo con clases que requieren cierta configuración, podemos aprovechar este comportamiento extendiendo ciertas clases provistas por OpenCms.

La construcción de la carga de configuración de un módulo se puede dividir en 3 partes:


1. Creación de archivo con la configuración

Los archivos de configuración de OpenCms se guardan dentro de la carpeta ‘/WEB-INF/config’ de la carpeta raíz de la aplicación. Al ver su contenido, notaremos que son simples archivos XML. Por ejemplo: opencms-modules.xml, opencms-search.xml, etc.

Utilizando nuestro ejemplo del MODULO DE COMENTARIOS, asignamos el parámetro de configuración ESTADO y otro parámetro NUMERO a un archivo de configuración comentariosConfiguration.XML y lo almacenamos en la carpeta config con un formato similar al detallado a continuación.

- ESTADO : un valor booleano que determina si se deberá permitir ingresar o no comentarios a un recurso.

- NÚMERO: un entero que determina cuantos comentarios por vez se mostrarán en cada página.

<?xml version=”1.0″ encoding=”UTF-8″?>

<opencms>

<comentarios>

<estado>true</estado>

<numero>20</numero>

</comentarios>

</opencms>


2. Creación de clase de carga de configuración.

El siguiente paso es crear la estructura necesaria para que se cargue la configuración. Por un lado necesitamos un DTD, comentariosConfig.DTD, que defina la organizacion del XML:

<!– # The root configuration node is called <opencms> for all OpenCms configurations. –>

<!ELEMENT opencms (comentarios)>

<!ELEMENT comentarios ( estado, numero )>

<!ELEMENT estado (#PCDATA)>

<!ELEMENT numero (#PCDATA)>

Luego, crearemos la clase que leerá el archivo de configuracion. Para eso utilizaremos una herencia de la clase org.opencms.configuration.A_CmsXmlConfiguration. Dentro del mismo, definimos que archivo XML leeremos, el DTD con la estructura y el conjunto de reglas a ejecutar al leer la configuración.

Esta deberá ser creada dentro de un paquete, incluyendo el DTD en la misma ubicación.

package org.opencms.configuration;

public class ComentariosConfiguration extends A_CmsXmlConfiguration {

public static final String CONFIGURATION_DTD_NAME = “comentariosConfiguration.dtd”;

public static final String DEFAULT_XML_FILE_NAME = “comentariosConfiguration.xml”;

public ComentariosConfiguration() {

// Retornamos que dtd se usa para controlar el xml.

setXmlFileName(DEFAULT_XML_FILE_NAME);

}

// Configuramos las reglas a utilizar al leer el xml.

public void addXmlDigesterRules(Digester digester) {

 

// Agregamos una regla que al encontrar el tag estado, llame al metodo “setEstado” pasandole por parámetro el contenido del mismo.

digester.addCallMethod(”*/comentarios/estado”, “setEstado”, 1);

digester.addCallParam(”*/comentarios/estado”, 0);

// Agregamos una regla que al encontrar el tag numero, llame al metodo “setNumero” pasandole por parámetro el contenido del mismo.

digester.addCallMethod(”*/comentarios/numero”, “setNumero”, 1);

digester.addCallParam(”*/comentarios/numero”, 0);

}

public String getDtdFilename() {

return CONFIGURATION_DTD_NAME;

}

// Metodo llamado al parsear el xml que supone que existe una clase singleton “valorConfiguracion” a la que se le pasa la configuración leida.

public void setEstado(String value) {

String valueLower = value.toLowerCase();

if (valueLower.equals(”yes”) || valueLower.equals(”true”))

valorConfiguracion.getInstance().setEstado(Boolean.TRUE);

else

valorConfiguracion.getInstance().setEstado(Boolean.FALSE);

}

// Metodo llamado al parsear el xml que supone que existe una clase singleton “valorConfiguracion” a la que se le pasa la configuración leida.

public void setNumero(String value) {

int numero = Integer.parseInt(value);

valorConfiguracion.getInstance().setNumero(numero);

}

}

Para utilizar este mecanismo, tendremos que definir en la misma carpeta que la clase anterior la clase “MessagesComentarios” que hereda de “A_CmsMessageBundle” y defina los mensajes a mostar en el opencms.log. También deberemos crear la clase properties con el texto de los mensajes a mostrar.


3. Agregado de la nueva configuración

Una vez que tengamos definidas las clases y los archivos de configuración deberemos indicar al OpenCms que al iniciar debe ejecutar nuestra clase y tomar la configuración. Esto se realiza agregando una nueva entrada al archivo opencms.xml ubicado en el directorio /WEB-INF/config.

<config class=”org.opencms.configuration.ComentariosConfiguration”/>

Finalizado este paso, en el próximo inicio del sistema se levantará la configuración del archivo XML y la misma podrá ser utilizada por nuestras clases y aplicaciones.