El sistema de publicación en web Cocoon

Las XSPs permiten, al igual que las JSPs asociar c�digo con una etiqueta xml. Por ejemplo, podr�a asociarse: <myPreffix:getDate format="yy/MM/dd hh:mm:ss aa"/> con el c�digo para obtener una fecha, de forma que cuando se genere el fuente de la XSP aparezca �ste en el lugar donde estaba la etiqueta.

Estas etiquetas pueden ser agrupadas formando librer�as de etiquetas. A estas librer�as las llamaremos taglibs.

En las XSP las taglibs se definen como hojas de transformaci�n XSL.

.�Ventajas del uso de taglibs

  • Potencian la reutilizaci�n de c�digo usado frecuentemente.
  • Permiten limpiar de c�digo las XSP sustituyendo la mayor�a del c�digo embebido por etiquetas. Esto mejora el mantenimiento y la legibilidad de las p�ginas.
  • Permiten separar m�s los papeles en el desarrollo de XSP. V�ase el apartado Workflow con XSP. Esto permite un mayor paralelismo en el trabajo.
  • Cuando ya se disponga de una buena biblioteca de taglibs se acelerar� el desarrollo de p�ginas.
  • Debido a que est�n basadas en XSL permiten, adem�s de simplemente a�adir c�digo a la p�gina, transformarla con gran potencia. Un ejemplo de las ventajas de que proporciona el hecho de que sean hojas de transformaci�n XSL es que podemos definir etiquetas para invocar de forma sencilla m�todos con signaturas complejas. Si preparamos valores por defecto para cada argumento podemos comprobar que atributos se nos pasan en la etiqueta y para los que falten colocar el valor por defecto.

    As�, para un m�todo longMethod(a1, a2, a3, a4, a5, a6, a7, a8) donde la mayor�a de sus argumentos son usado habitualmente con los mismos argumentos podemos preparar una etiqueta que admita todos los argumentos en forma de atributos pero que si falta alguno ponga un valor t�pico:

    En la XSP se escribir�:

    MyClass myVar = <myPreffix:longMethod a1=a1Value a6=this /> ;

    Con la taglib adecuada, en el c�digo fuente aparecer�:

    MyClass myVar = longMethod( a1Value,
                                null,
                                System.currentTimeMillis(),
                                "",
                                -1,
                                this,
                                null,
                                null);
      

    Si quisi�semos dar una facilidad semejante desde Java tendr�amos que definir una signatura por cada combinaci�n de argumentos.

    Otro ejemplo de potencia es que una etiqueta se puede sustituir por m�s etiquetas de otra taglib, o incluso eliminar contenido XML.

.�C�mo funcionan las taglibs

En Cocoon existe un mapeo entre espacios de nombres XML y hojas de transformaci�n XSL.

Cuando se invoca una XSP por primera vez esta tiene que ser compilada a un productor de XML (actualmente una clase Java que extiende XSPPage.). Es durante este proceso cuando se usan las taglibs.

La primera fase es generar el c�digo fuente. Para ello se le aplican transformaciones XSL. Si en la XSP aparecen etiquetas con espacios de nombres se comprueba si est�n mapeados con una hoja de transformaci�n XSL ( taglib ). Si es as� se le aplica esta transformaci�n, si no se considera que es contenido est�tico de la p�gina y se conserva tal cual.

Cuando todos los espacios de nombres est�n procesados se realiza la �ltima transformaci�n que traduce el XML al c�digo Java encargado de generarlo (si se ha especificado Java como lenguaje en la cabecera de la XSP).

.�C�mo usar taglibs ya instaladas

Para ver las librer�as instaladas podemos examinar el fichero de configuraci�n de Cocoon cocoon.properties. En su secci�n referente al XSP Processor se pueden ver l�neas de este estilo:

processor.xsp.logicsheet.util.java =
resource://org/apache/cocoon/processor/xsp/library/java/util.xsl

En esta l�nea se especifica que para el lenguaje Java, la hoja de transformaci�n asociada al espacio de nombres "util" es //org/apache/cocoon/processor/xsp/library/java/util.xsl.

Si queremos usar alguna etiqueta definida en esta taglib deberemos declarar en el elemento ra�z de la xsp el espacio de nombres util. Lo podemos copiar de la declaraci�n de espacios de nombres de la taglib. En este caso del archivo util.xsl.

<xsp:page language="java"
xmlns:xsp="http://www.apache.org/1999/XSP/Core"
xmlns:util="http://www.apache.org/1999/XSP/Util >

Una vez hecho esto ya se puede usar cualquiera de las etiquetas definidas en la taglib. Por ejemplo vamos a incluir una fecha en nuestra p�gina:

Esta es la definici�n de lo que se hace con la etiqueta en la taglib.

<xsl:template match="util:time">
  <xsl:variable name="format">
    <xsl:choose>
      <xsl:when test="@format">"<xsl:value-of select="@format"/>"</xsl:when>
      <xsl:when test="util:format">
        <xsl:call-template name="get-nested-content">
          <xsl:with-param name="content" select="util:format"/>
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
  </xsl:variable>
  <xsp:expr>
    XSPUtil.formatDate(
      new Date(),
      String.valueOf(<xsl:copy-of select="$format"/>).trim()
    )
  </xsp:expr>
</xsl:template>

En la XSP escribiremos:

<util:time format=yy/MM/dd hh:mm:ss aa/>

O en este caso si analizamos el c�digo xsl vemos que tambi�n admite el par�metro como elemento en lugar de s�lo como atributo:

<util:time>
<util:format>yy/MM/dd hh:mm:ss aa</util:format>
</util:time>

.�C�mo definir una nueva etiqueta

Por un lado debemos construir la XSL para tratar la etiqueta. Debe estar dise�ada cuidadosamente para que respete el contenido de la p�gina y s�lo afecte a las etiquetas adecuadas, o de lo contrario se podr�a modificar contenido que en principio no tiene relaci�n con la etiqueta. Este es, bajo mi punto de vista, el principal problema que plantean las taglibs definidas como hojas de transformaci�n. A veces tanta potencia puede convertirse en un arma de doble filo.

Para ello podemos fijarnos en la estructura de cualquiera de las XSL que incluye Cocoon.

En esta XSL debemos declarar el espacio de nombres de las etiquetas que vayamos a tratar.

Conviene definir un xsl:template por cada etiqueta para que sea m�s f�cil de leer para otros desarrolladores que la quieran usar. Y documentar al principio para que sirve y que par�metros se le pueden pasar y c�mo.

Si nuestra etiqueta admite par�metros debemos pensar en el tipo de informaci�n que va a contener el par�metro. Lo m�s c�modo es recibir los par�metros en un atributo de la etiqueta, pero si por ejemplo va a ser un texto extenso o va a incluir caracteres tales como comillas conviene recibirlo en otra etiqueta interna. En el ejemplo del apartado anterior, la etiqueta <util:time> admite el formato de fecha especificado dentro de un atributo format o dentro de un elemento interno <util:format>.

Una vez hayamos concluido la xsl, tenemos que instalarla en Cocoon. Para ello debemos colocarla en alg�n lugar del classpath donde se est� ejecutando Cocoon y a�adir otra l�nea al cocoon.properties de la siguiente forma:

processor.xsp.logicsheet.myNewPreffix.java =
resource:path_to_my_taglib/my_new_taglib.xsl

Reiniciamos Cocoon y ya est� lista para ser usada.

Si realizamos alg�n cambio futuro en la XSL, posiblemente tengamos que eliminar los archivos .java generados a partir de las XSP que la usen para forzar una recompilaci�n. En las versiones actual (v1.82) y anteriores no se detectan los cambios en las taglibs y debemos hacer este peque�o "truco" para usar los nuevos cambios.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO