Consejos de Instalación Cocoon 2 para Principiantes

Una vez que has intalado Cocoon querr�s empezar a hacer algo que valga la pena con el sistema. El primer encuentro con Cocoon tendr� lugar en el sitemap de Cocoon, que resulta que es un fichero situado justo en el directorio ra�z ($cocoon_root) de la aplicaci�n web Cocoon: sitemap.xmap.

Como leeras en cualquier lugar, el fichero sitemap.xmap es el coraz�n de Cocoon y, para poder conseguir que Cocoon haga algo para nosotros, primero tendremos que modificar este fichero. Luego vamos y al abrir el fichero y nos encontramos con una estructura XML realmente compleja! Hay una clara necesidad de mantener esto tan inalterable como sea posible. No s�lo querr�s dejar intacta y operativa la infraestructura de Cocoon, sino que tambi�n tendr�s el sentimiento de mantener tu trabajo claramente separado de la distribuci�n de Cocoon.

.�La Soluci�n: Separar tu Trabajo mediante el uso de subsitemaps

Como Cocoon se ha dise�ado para un alta escalabilidad, hay un concepto de "divide y vencer�s" dentro del concepto de sitemap.

Los puntos de montaje nos permiten colocar sitemaps en cascada y paralelizar la carga de trabajo del sistema. Esto crear� un �rbol de sitemaps con el sitemap como la ra�z y posiblemente varios sub-sitemaps como nodos y hojas.

Los sub-sitemaps sirven a dos prop�sitos principales: escalabilidad y simplificaci�n del mantenimiento. Los diferentes sub-sitemaps son independientes y no se afectan los unos a los otros.

.�Parte I; Usar las Posibilidades Existentes

Te voy a ense�ar un detalle justo en el medio del fichero $cocoon_root/sitemap.xmap de la distribuci�n original (cerca de la l�nea 860): Ah� podr�s encontrar el siguiente fragmento de c�digo (hemos eliminado los comentarios):


<map:pipeline>
  <map:match pattern="mount/*/**">
    <map:mount check-reload="yes" src="mount/{1}/" uri-prefix="mount/{1}"/>
  </map:match>
</map:pipeline>

Esta peque�a parte del sitemap nos permite separar limpiamente nuestro trabajo del resto de cocoon. �Qu� hace esto? Mira la definici�n pattern="mount/*/**" de la segunda l�nea. Este patr�n de correspondencia es interpretado por cocoon de esta forma:

  • a - Cualquier URL que apunte a la aplicaci�n web Cocoon.
  • b - seguida por un 'mount/'
  • c - seguida por un nombre de carpeta arbitrario (el primer "*" del patr�n)
  • d - seguido por una '/' (la "/" del patr�n)
  • e - seguida por un path de profundidad arbitraria ("**" en el patr�n).

Cuando el int�rprete encuentra el caracter comod�n "*" o la secuencia "**" en el patr�n, actualmente resuelve el valor real en par�metros locales del sitemap, donde el primer caracter comod�n se coloca en el par�metro {1}, el segundo caracter comod�n se sit�a en el par�metro {2}, ...

Se aplican las siguientes reglas:

  • Un �nico "*" se resuelve en cualquier secuencia de caracteres entre dos caracteres '/'.
  • Un doble "**" se resuelve en cualquier secuencia de caracteres delimitada por una '/*' en el lado derecho, o una '*/' en el lado izquierdo.

Estas reglas abstractas se pueden entender mejor con el siguiente ejemplo. En �l aplicamos la URL (dada en la primera l�nea) al patr�n de correspondencia (en la segunda l�nea):


http://localhost:8080/cocoon/ mount/ work/index.xml   <-- URL
~~~~~~~~~~~a~~~~~~~~~~~~~~~~~ ~~b~~~ ~~c~d~e~~~~~~~ 
                              mount/   * / **         <-- patr�n
                                      {1}  {2}        <-- par�metros-del-sitemap

Aqu� Cocoon asocia el string "work" al par�metro {1} y el string "index.xml" al par�metro {2}. Estos par�metros se pueden utilizar libremente dentro de un pipeline, como hemos visto arriba. En ese caso s�lo hemos utilizado el {1} dento de la etiqueta <map:mount>.

Cocoon intentar� abrir un subsitemap dentro de la carpeta indicada por el atributo src de la etiqueta <map:mount>. En este ejemplo ser�a $cocoon_root/mount/{1}/ que se resuelve $cocoon_root/mount/work/ seg�n lo que hemos aprendido arriba.

Si echamos un vistazo al directorio $cocoon_root veremos que ya existe una carpeta llamada mount. Todo lo que tenemos que hacer ahora es crear una carpeta con el mismo nombre que el par�metro {1} ("work" en el ejemplo de arriba) dentro de la carpeta mount y empezar a trabajar dentro de ella. Ya est�mos listos para conectar nuestra carpeta work con cocoon:

.�Parte II: Conectar nuestra Carpeta "work" con Cocoon

Cada vez que se accede a Cocoon con una URL de la forma http://localhost:8080/cocoon/mount/{tu_carpeta}/{path_de_profundidad_arbitraria}, buscar� dentro de la carpeta $cocoon_root/mount/{tu_carpeta} un fichero sitemap.xmap. Dentro del fichero $cocoon_root/mount/{tu_carpeta}/sitemap.xmap definiremos los componentes espec�ficos de nuestro proyecto, por ejemplo pipelines. Al principio de nuestro desarrollo este fichero ser� muy peque�o.

Asumamos que queremos servir un contenido XML que es serializado como salida HTML usando una transformaci�n XSL. Creo que este es el "caso de utilizaci�n" m�s sencillo para Cocoon. Asumimos que la transformaci�n XSLT est� en el fichero mytransform.xsl y que todos los ficheros que queremos servir terminan en .xml. La configuraci�n es bastante sencilla:

  • Entra en tu carpeta de trabajo (work).
  • Crea en ella un fichero sitemap.xmap con el siguiente contenido:
    
    <?xml version="1.0"?>
    <map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
    
      <map:components>
        <map:generators   default="file"/>
        <map:transformers default="xslt"/>
        <map:readers      default="resource"/>
        <map:serializers  default="html"/>
        <map:matchers default="wildcard"/>
      </map:components>
    
      <map:pipelines>
        <map:pipeline>
          <!-- xml files -->
          <map:match pattern="*.html">
            <map:generate src="{1}.xml"/>
            <map:transform src="mytransform.xsl"/>
            <map:serialize type="html"/>
          </map:match>
        </map:pipeline>
      </map:pipelines>
    </map:sitemap>
    
    

.��Qu� hemos Conseguido?

Primero le hemos dicho a Cocoon que empiece una transformaci�n XSLT siempre que intentemos recuperar un fichero HTML desde la carpeta work, por ejemplo con la siguiene URL:

 
http://localhost:8080/cocoon/mount/work/index.html

conseguimos que Cocoon busque un fichero llamado index.xml dentro de la carpeta work. Luego ese fichero se transforma utilizando la transformaci�n XSLT almacenada en mytransform.xsl. Finalmente se serializa el resultado utilizando el serializador HTML. El resultado final es que se env�a al navegador un fichero HTML est�ndar.

Nota:
No hay ning�n fichero llamado index.html en cualquier lugar de tu carpeta. Es s�lo el patr�n, que dispara el procesamiento del fichero index.xml y que eventualmente env�a de vuelta conntenido HTML al navegador!
Por supuesto que podr�as querer llamar de otra forma a tu transformaci�n xsl, o podr�as elegir no utilizar el patr�n *.html para disparar esta pipeline. A partir de aqu� tu decides como quieres proceder.

Por favor, recuerda s�lo un punto importante: los patrones de correspondencia est�n totalmente separados de los nombres reales de los ficheros en tu carpeta. Por ejemplo, podr�amos elegir el patr�n *.xml en lugar *.html y dejar el resto del pipeline como est�. Con esto Cocoon enviar� de vuelta nuestro resultado en HTML, si encuentra la URL:

http://localhost:8080/cocoon/mount/work/index.xml

(como ves aqu�: aunque solicitamos el fichero index.xml, obtenemos un resultado en HTML!)

.�Ap�ndice: ficheros de ejemplo

Un fichero index.xml que puedes poner en tu carpeta work:


<?xml version="1.0"?>
    <page>
      <title>Basic XML/XSL Transformation Example </title>
      <greeting>Hello World</greeting>
    </page>

Una hoja de estilo XSL que puedes utilizar como mytransform.xsl:


<?xml version="1.0"?>
   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="page">
     <html>
      <head>
       <title><xsl:value-of select="title"/></title>
      </head>
      <body>
       <h1><xsl:value-of select="title"/></h1>
       <p><xsl:value-of select="greeting"/></p>
      </body>
     </html>
    </xsl:template>

   </xsl:stylesheet>

Nota:
Asegurate de que la primera instrucci�n de procesamiento (<?xml version="1.0"?>) en el documento XML no tiene ning�n espacio delante, esto resultar�a en un error interno del servidor.

COMPARTE ESTE ARTÍCULO

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