ANTOINE CHEVERT , PASCAL LAMY COCOON ANTOINE CHEVERT , PASCAL LAMY
PLAN Présentation Les intérêts de cocoon Fonctionnement de Cocoon Historique Introduction Installation Les intérêts de cocoon Fonctionnement de Cocoon Base de donnée
Historique Cocoon 1 Cocoon 2 Initié en Janvier 1999 par Stefano Mazzocchi Associé au groupe Apache Basé sur l’API d’accès XML : DOM Cocoon 2 Sorti en Novembre 2001 Accès XML avec l’API SAX Centralisation des fonctions de management Supporte la pré compilation et la mise en cache
Introduction Framework de publication Web Interaction avec de nombreuses sources de données (systèmes de fichier, bases de données relationnelles, LDAP, bases de données XML, etc.) Génération à partir de documents XML via le déclenchement d'évènements SAX, des contenus sous des formats variés (HTML, WML, PDF, SVG ,RTF). Permet de séparer : La gestion Le contenu La logique La présentation
Installation Fonctionne sous Windows/Linux JDK pré-installé et JAVA_HOME déclarée COCOON est couramment associé au serveur d’application Apache TomCat ou Jetty 2.0.X avec Tomcat et jdk >= 1.2.2 Copie du fichier COCOON.WAR (Web Archive) Déploiement dans TomCat par simple copie. 2.1.4 avec le jdk >= 1.3 Version contenant d’origine le serveur d’application Jetty. Compilation avec ant
Les Intérêts de cocoon Génération de différents formats de sortie Le modèle « pyramidal des contrats Web» Le langage XSP Un exemple
Format d’Entrée - Format de sortie Word/EXCEL (Projet POI) XML JPG/ PNG RTF/TXT PDF/PS/PCL SGBD WML HTML APPLICATION SERVEUR XML LDAP
Le modèle « pyramidal contrats Web » Concept de séparation des taches Facilite la réutilisation du code
Le langage XSP XSP : eXtensible Server Page XSP est un document XML avec du code java imbriqué Le document XSP est compilé et exécuté avant de retourner le résultat Ce qui donne un document XML intermédiaire dans lequel les instructions java ont été remplacées par leur résultat,au format XML. Ce document XML intermédiaire est soumis a nouveau à un processus de Transformation,avec un programme XSLT, afin que le résultat produit(HTML,WML,PDF…)soit transmis au programme client.
Un exemple <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> <document> <xsp:logic> SimpleDateFormat format = new SimpleDateFormat("EEE, MMM d, yyyy"); String timestamp = format.format( java.util.Calendar.getInstance().getTime()); </xsp:logic> <time><xsp:expr>timestamp</xsp:expr></time> <!-- additional elements --> </document> </xsp:page>
Fonctionnement de Cocoon Architecture client serveur Mécanisme de Production Qu’est ce qu’un Pipeline Exemple de Pipeline Définition du fichier d’annuaire : sitemap.xmap Sitemap de l’application web Composant Cocoon Exemple d’application web
Architecture client-serveur TOMCAT / JETTY HTTP 8080 COCOON Données Sérialisation Transformation Génération
Mécanisme de Production 1 CLIENT TOMCAT 2 6 COCOON DOC XML 5 3a DOC HTML DOC WML DOC PDF 4 INTERPRETEUR XSP INTERPRETEUR XSLT 3b INTERPRETEUR FOP 4
« PIPELINE » Fichier XSLT XSLT Processor Fichier HTML Fichier XML Sérialisation Transformation Génération
Exemple de pipeline <map:match pattern= "hello "> Requête ( matcheur ) <map:match pattern= "hello "> <map:generate src="source.xml"/> <map:transform src="transform.xsl"/> <map:serialize type="HTML"/> </map:match> Génération Transformation (feuille de style) Sérialisation (Format de sortie)
SITEMAP.XMAP Annuaire des applications web Les sitemap Cocoon peuvent servir à plusieurs choses, en particulier la définition de composantes et une partie de la logique applicative. Les sitemap servent à déterminer, en fonction de l'URL d'appel, quel producteur, quel transformateur et quel sérialiseur utiliser. Matcher : extrait de l’URL les requêtes Generator : emplacement de la donnée source (fichier, requête) Transformer : règles de transformation (xslt) Serializer : format de sortie (html, pdf, xml… Ces informations sont spécifiées à l'aide de pipelines .
SITEMAP.XMAP suite Il est possible de référencer une application web autrement que par le sitemap principal. Il s’agit de créer un fichier sitemap.xmap dans le répertoire de l’application. Il suffit de relier ensuite le sitemap principal au sitemap de l’application.
Composant Cocoon A l'heure actuelle, plus de 70 à 80 composants sont présents dans la version cocoon 2.1. GeneratorDirectoryGenerator : convertit la liste des fichiers d'un répertoire en format XML duquel sont produits des événements SAXGenerator FileGenerator: Parse un fichier ou une URI et produit des événements SAXGenerator JSPGenerator : génère du XML et des événements SAX à partir d'une page JSPGenerator ServerPagesGenerator génère du XML et des événements SAX à partir d'une page XSP Transformer XSLTransformer Transforme des évènements SAX d'après une définition XSLTSerializer HTMLSerializer Produit de l'HTML d'après du SAXSerializer PDFSerializer Produit du PDF d'après du SAX (utilisant Apache Formatting Output Processor (FOP)) Serializer SVG2JPGSerializer Produit un JPEG d'après des évènements SVG SAX events (utilisant Apache Batik)
Exemple d’application web Fichier XML:toto.xml Fichier XSLT:toto.xsl Fichier sitemap.xmap Le fichier toto.xml sera transformé en fichier HTML
Fichier toto.xml <?xml version="1.0"?> <page> <titre>Comment tu vas mon canard!</titre> <para>premiere application web</para> </page>
Fichier toto.xsl Récupération de la valeur titre du document toto.xml <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="page"> <html> <head> <title> <xsl:value-of select="titre"/> </title> </head> <body bgcolor="white"> <xsl:apply-templates select="para" /> </body> </html> </xsl:template> <xsl:template match="para"> <H1><xsl:apply-templates/></H1> </xsl:stylesheet> Récupération de la valeur titre du document toto.xml Application de la règle para Récupération de la valeur para du document toto.xml
Sitemap de l’application web <?xml version="1.0"?> <map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0"> <map:pipelines> <map:pipeline> <map:match pattern="toto"> <map:generate src="toto.xml"/> <map:transform src="toto.xsl"/> <map:serialize type="html"/> </map:match> </map:pipeline> </map:pipelines> </map:sitemap>
Base de donnée Fichier de configuration Cocoon.xconf Comment configurer une base de donnée Comment accéder à une base de donnée avec XSLT avec XSP
COCOON.XCONF C’est le fichier de configuration de cocoon Il gère Les paramètres de cache Paramètre de rechargement sitemap Paramètre de base de données Extension utilisée pour xsp Gestion des Threads Etc …
Pour accéder à une base de données Copier le driver dans la librairie de cocoon et le déclarer simplement dans web.xml Déclarer la base de données dans cocoon.xconf comme suit :
Exemple de déclaration d’une base de données dans cocoon.xconf <jdbc name=« monPool »> <pool-controller min=« 5 » max=« 10 »/> <dburl>jdbc:mysql://localhost/maBase</dburl> <user>root</user> <password></password> </jdbc>
Exemple d’application web en xslt avec connexion à la base de données Fichier XML:sqlexemple.xml Fichier XSLT:sqlexemple.xsl Pipeline correspondant au sitemap.xmap
Fichier sqlexemple.xml Affichage des titres des colonnes <?xml version="1.0"?> <document> <col1>ressources</col1> <col2>descriptif</col2> <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> <sql:use-connection>pool1</sql:use-connection> <sql:query> select nom,descriptif from session </sql:query> </sql:execute-query> </document> Appel de la bibliothèque sql Sélection du pool de connexions défini dans cocoon.xconf
Fichier sqlexemple.xsl <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sql="http://apache.org/cocoon/SQL/2.0"> <xsl:template match="document"> <html> <body bgcolor="#FFFFFF"> <center><table width="75%" border="0"> <tr> <td bgcolor="#CC0033" align="center"><font color="#FFFFFF"><xsl:value-of select="col1"/></font></td> <td bgcolor="#CC0033" align="center"><font color="#FFFFFF"><xsl:value-of select="col2"/></font></td> </tr> <xsl:apply-templates select="sql:rowset/sql:row"/> </table> </center> </body> </html> </xsl:template> <xsl:template match="sql:row"> <tr><xsl:apply-templates/></tr> <xsl:template match="sql:nom|sql:descriptif"> <td bgcolor="#0066CC"><font color="#FFFFFF"> <xsl:value-of select="."/></font> </td> </xsl:stylesheet> Règle sql:row qui passe à la ligne suivante Règle sql:rowset qui affiche le résultat de la requête SQL
Pipeline défini dans le sitemap.xmap <map:pipeline> <map:match pattern="requete"> <map:generate src="sqlexemple.xml"/> <map:transform type="sql"> <map:parameter name="use-connection" value="Pool1"/> </map:transform> <map:transform src="sqlexemple.xsl"/> <map:serialize/> </map:match> </map:pipeline> Définition du pool de connexion référencé dans le cocoon.xconf
XSP 1 Solution concurrente au serveur page mais version xml Se place AVANT les transformations en html ou pdf, au niveau des fichiers xml dans le pipe
XSP 2 Les balises à préfixe xsp ne seront pas visibles dans le code xml généré Le code java est inclus dans le xml sous forme de logicsheet que l’on doit déclarer dans l’entête de la page
Exemple valid.xsp Déclaration des logicsheets utilisées Pool utilisé <?xml version="1.0" encoding="ISO-8859-1"?> <xsp:page language="java" xmlns:xsp="http://apache.org/xsp" xmlns:esql="http://apache.org/cocoon/SQL/v2" xmlns:xsp-request="http://apache.org/xsp/request/2.0> <page><esql:connection><esql:pool>monPool</esql:pool> <esql:query>select nom_prenom from copain where '<xsp-request:get-parameter name="idlogin"/>' = nom_prenom and '<xsp-request:get-parameter name="idpassword"/>' = description</esql:query> <esql:results>vous existez bien dans la base</esql:results> <esql:no-results>vous n'etes pas identifiés dans la base !!!</esql:no-results> <esql:error-results>error</esql:error-results> </esql:execute-query> </esql:connection> </page> </xsp:page> Déclaration des logicsheets utilisées Pool utilisé Requête & paramètre Affichage des résultats
Utilisation balise <esql:../> valid.xsp <?xml version="1.0" encoding="ISO-8859-1"?> <xsp:page language="java" xmlns:xsp="http://apache.org/xsp" xmlns:esql="http://apache.org/cocoon/SQL/v2" xmlns:xsp-request="http://apache.org/xsp/request/2.0" > <page><esql:connection><esql:pool>monPool</esql:pool> <esql:query>select nom_prenom from copain where '<xsp-request:get-parameter name="idlogin"/>' = nom_prenom and '<xsp-request:get-parameter name="idpassword"/>' = description</esql:query> <esql:results>vous existez bien dans la base</esql:results> <esql:no-results>vous n'etes pas identifiés dans la base !!!</esql:no-results> <esql:error-results>error</esql:error-results> </esql:execute-query> </esql:connection> </page> </xsp:page> Déclaration des logicsheet utilisées Pool utilisé Requête ¶mètre Affichage des résultats
Utilisation d'un code java <xsp:page language="java" xmlns:xsp="http://apache.org/xsp"> <elements> <xsp:logic> { for (int i=1; i<11; i++) { <element><xsp:expr>i</xsp:expr></element> } } </xsp:logic> </elements> </xsp:page>
Les Actions Utilisés au niveau du SITEMAP.XMAP Notion de dérivation du Pipe Code livré avec COCOON, fiable et natif Plusieures formes d'action prises en charge par cocoon : ActionDatabase ActionForm(dérivé de Struts) Action redirect-to Etc...
Code source minimale d'action public abstract class AbstractAction extendsAbstractLogEnabled implements Action { protected static final Map EMPTY_MAP = Collections.unmodifiableMap(new TreeMap()); }
Que supporte Cocoon? Toutes les bases de données du moment qu’il y a un driver en java Java, JavaScript, jsp, ejb, Perl Technologie Struts pré installé en 2.1 pour se mettre en accord avec le w3c pour la validation des formulaires html Possibilité d’étendre les fonctionnalités de cocoon en ajoutant des briques d’Avalon
Difficultés rencontrées Aucune éditeur graphique Compréhension des actions Documentations insuffisantes ou obsolètes en anglais DEBUG Syntaxe Compilation 2.1.X sous linux
Conclusion Outil de publication puissant Connaissance du monde XML indispensable Intéressant pour des sites multi-plateformes
En savoir plus Cocoon : Building XML Application Éditeur : New Riders Cocoon 2 Programming Éditeur: Sybex http://cocoon.apache.org/ http://www.planetxml.com http://Wiki.cocoon.dev.org http://cortes.cnam.fr:8080
LE PROJET
Architecture du Projet NET SGBD Cocoon Agent de capture
Réalisation du Projet Agent de capture réalisé en Perl Base de données Mysql JDK 1.3 Serveur Tomcat 3.02 Cocoon 2.0