Apache Cocoon 2.1
Accueil
Origine de ce site
Au cours de la 3e année de formation au sein de l'école Ingénieurs 2000, la réalisation d'un exposé présentant un sujet lié au domaine informatique (outil, méthode, langage, réseaux, ... ) est demandée aux apprentis.
Cet exposé se déroule en deux parties :
- Une présentation orale de 30 minutes devant l'ensemble des apprentis de la promotion. Celle-ci est récupérable dans la partie Références
- Un site web documentant le sujet étudié
Auteur
Cet exposé a été réalisé par Lény Leszko en Novembre 2004.
Sujet abordé
Le but de mon exposé est de présenter un outil qui permet aux sites web d'être hautement structurés et bien construits, réduisant les efforts de duplication et les coûts de gestion.
Le sujet que j'aborderais au cours de cette présentation sera Apache Cocoon.
Apache Cocoon est un framework de publication écrit en java qui repose sur les technologies du W3C (telles que XML, et XSL) pour fournir du contenu web.
Apache Cocoon permet une meilleure gestion des ressources humaines en fournissant à chaque individu son travail et en réduisant au minimum les discussions croisées entre différents contextes de travail.
Introduction
Framework de développement Web
Apache Cocoon est un framework de publication écrit en java qui repose sur les technologies du W3C (telles que XML, et XSL) pour fournir du contenu web.
S'insert dans un serveur d'applications
Apache Cocoon est une servlet 100% pur Java basée sur JavaSoft Servlet API platform, pour cette raison il devrait fonctionner sur n'importe quel moteur de servlet qui est conforme au moins avec la version 2.0 de la spécification.
Basé sur XML, XSLT, XSL/FO, XSP
- eXtensible Markup Language (XML) peut être considéré comme un métalangage permettant de définir d'autres langages, c'est-à-dire définir de nouvelles balises permettant de décrire la présentation d'un texte.Il va permettre de structurer, poser le vocabulaire et la syntaxe des données qu'il va contenir. Les balises XML décrivent le contenu plutôt que la présentation. Ainsi, XML permet de séparer le contenu de la présentation. XML a été mis au point par le XML Working Group sous l'égide du W3C dès 1996. XML est un sous ensemble de SGML (Standard Generalized Markup Language), défini par le standard ISO8879 en 1986, utilisé dans le milieu de la Gestion Electronique Documentaire (GED). XML reprend la majeure partie des fonctionnalités de SGML, il s'agit donc d'une simplification de SGML afin de le rendre utilisable sur le web !
- eXtensible Stylesheet Transformation (XSLT) permet de transformer la structure des éléments XML. Un document XML peut être représenté comme une structure arborescente. Ainsi XSLT permet de transformer les documents XML à l'aide de feuilles de style contenant des règles appelées template rules.
- XSL Formatting Objects (XSL/FO), Un langage permettant de définir la mise en page (affichage de texte ou de graphiques) de ce qui a été crée par XSLT. Une fois l'arbre source créé, XSL/FO permet de formater le résultat, c'est-à-dire d'interpréter l'arbre résultat, ou plus exactement les objets de flux le composant en leur appliquant des objets de mise en forme afin d'en faire une représentation visuelle (papier, écran, ...).
- eXtensible Server Pages (XSP). La communauté Cocoon a reconnu depuis longtemps le besoin de capacité de génération de contenu dynamique. En réponse à ce besoin, le projet Cocoon a proposé XSP. XSP défini une nouvelle DTD XML et un espace de nommage qui adresse une région complète de publication web, celui basé-sur-la-logique, génération de contenu dynamique. XSP est un composant clé des versions futures de Cocoon.
Utilisation du MVC
Le projet Cocoon a pour but de changer la manière dont l'information web est créée, générée et distribuée. Ce nouveau paradigme est basé sur le fait que les contenu, style et logique de documents sont souvent crées par différents individus ou groupes de travail. Cocoon vise à une séparation complète des trois couches, leur permettant d'être conçues, crées et gérées indépendamment, réduisant la charge de la gestion, augmentant la réutilisation du travail et réduisant le temps de mise sur le marché.
Notion de «pipeline»
Cocoon implémente la notion de pipeline, c'est-à-dire le traitement des requêtes de manière "Lego". On ajoute les traitements que l'on désire effectuer sur une requête, ces transformations seront effectuées à la suite les unes des autres par le moteur de Cocoon qui générera le résultat escompté.
Différents formats de sortie
Même si la principale utilisation de Cocoon est la création automatique de code HTML au travers du traitement de fichiers XML générés statiquement ou dynamiquement, Cocoon est aussi capable de réaliser des formatages plus compliqués, comme le rendu XSL:FO sur du PDF, des transformations dépendant du client comme le formatage WML pour les périphériques WAP ou le service XML direct pour des clients XML ou XSL, ou bien alors des formats de type JPEG, ZIP, SWF ...
Nombreuses sources de données
La publication Web est très limitée sans la possibilité de créer du contenu dynamique. Pour le XML dynamique nous nous référons au contenu qui est créé comme une fonction de paramètres requis ou d'état de la source requise . Pour cette raison, beaucoup de travail et de conception ont été réalisés dans Cocoon pour permettre à du contenu XML dynamique d'être généré. Ici les besoins courants implémentés dans Cocoon:
- Le processeur XSLT applique des transformations XSLT au document en entrée.
- Le processeur DCP évalue les instructions de traitement XML avec une logique multi-langage (Java et EcmaScript). Ce processeur vous permet de réaliser des substitutions et inclusions programmées en éliminant le recours à une logique de traitement complexe.
- Le processeur SQL évalue des balises simples décrivant les requêtes SQL aux drivers JDBC et qui formate leur ensemble-résultat en XML, selon les paramètres donnés.
Historique
Origines
Débuté en 1998 par un étudiant Italien Stefano Mazzocchi membre du groupe Apache dans le but de séparer le contenu du style lors de la production de pages web. Cocoon n'était à l'origine que quelque centaines de lignes de code pour transformer du XML.
Pourquoi Le nom Cocoon ?
La réponse de Stefano Mazzochi : "J'ai passé mes vacances 1998 de Noël dans la petite maison des Alpes de ma petite amie. Une nuit je ne pouvais dormir, je suis allé regarder la télévision en finissant de lire la documentation de XSL que j'avais apportée avec moi. Étant un aficionado de science-fiction, j'ai vu que le film de Ron Howard "Cocoon" était à la télévision et j'ai commencé à le regarder. (...) Tout en le regardant, je commençais à coder sur le papier. A la fin du film le framework était conçu. Le nom "Cocoon" me semblait parfait pour la chose, signifiant une manière d'apporter une nouvelle vie à de vieilles idées aussi bien que créer des cocons pour que de telles nouvelles idées deviennent de beaux papillons : -)"
Aujourd'hui
Cocoon est actuellement un des plus importants projets du groupe Apache.
Depuis que le but de Cocoon est la possibilité de traiter simultanément plusieurs documents de 100 Mo dans JVM avec quelques Mo de tas, l'utilisation soigneuse de mémoire et l'accord de composant interne est une étape clef.
L'utilisation de l'API SAX (Simple API for XML Parsing) pour accéder aux données XML permet de travailler avec de gros fichiers XML sans pénaliser les performances (en théorie il n'y pas de limite précise de taille)
Parmis les améliorations techniques il faut particulièrement retenir les fonctions de pré-compilation et de mises en caches qui ont été introduites dans cette version.
Cocoon permet aussi maintenant la création de makefiles de site qui scannera automatiquement le site web et les sources des documents et fournira un moyen de régénérer la partie statique d'un site web (images et tableaux inclus!) fondé sur le même modèle XML utilisé pour les opérations dynamique.
Technologies
Entièrement basé sur XML
* XML
Le XML (eXtended Markup Language) est un sous-ensemble du SGML. Le SGML est le père de tous les langages à balises et c'est un standard ISO pour créer des langages. Il est âgé de 15 ans. Le XML est une version plus légère du SGML.
La première chose à comprendre : le XML n'est PAS un langage (comme le HTML), mais une syntaxe. Exactement comme le ASCII qui défini une méthode standard de mapper les caractères aux octets, et non pas un tas de chaînes de caractères.
Le XML est d'habitude référencé comme "donnée portative" dans le sens que son parcours est "indépendant de l'application" et qu'un parseur XML peut lire n'importe quel document XML, l'un décrivant votre compte en banque, un autre décrivant votre plat Italien favori, etc. C'est, comme vous le savez tous, impossible avec d'autres formats de fichiers qui sont basés sur du texte ou du binaire. Une sorte d'équivalent d'autrefois sont les fichiers CSV (comma separated values) qui emploient une syntaxe très simple (utilisant une virgule pour séparer les valeurs et la première ligne pour souligner le contenu des colonnes) et sont portables vers n'importe quelle implémentation. Le XML, au contraire du CSV, est beaucoup plus flexible et structuré même s'il est beaucoup plus simple que le SGML.
Un langage XML particulier est défini par sa Document Type Definition (DTD) qui est décrite dans la spécification XML. Un document XML peut être validé selon une DTD (si présente) et si la validation est un succès le document est dit "conforme XML basée sur la DTD particulière", si la DTD n'est pas présente et que le parseur ne rencontre pas d'erreurs de syntaxe en parsant le fichier, le document XML est dit "bien-formé". Si des erreurs sont trouvées, le document n'est pas conforme XML.
Ainsi, tout document XML bien-formé et un document XML valide pour une DTD particulière n'est pas nécessairement valide pour une autre DTD.
Par exemple, HTML n'est pas un langage XML car la balise <br>
n'est pas conforme XML. XHTML (où <br>
est remplacé par <br/>
) est conforme XML. Alors que les pages HTML ne sont pas toujours des documents XML (quelques pages peuvent l'être), les pages XHTML sont toujours bien-formées et valides si reconnues par la DTD XHTML.
* XSLT
Le XSLT (eXtensible Stylesheet Transformation)est un langage pour transformer un document XML bien-formé en un autre. Cela signifie que vous pouvez aller d'une DTD vers une autre d'une manière procédurale qui est définie dans votre document XSLT. Même si le nom semble indiquer le contraire, ce langage peut être utilisé aussi bien pour appliquer un style à un document que pour beaucoup d'autres transformations : en fait, des transformations peuvent être appliquées à une DTD XML particulière et venir avec une "description graphique" du contenu original. Ceci est appelé "application de style", mais, comme vous pouvez le voir, c'est juste l'un des emplois possibles de cette technologie.
Normalement, les feuilles de transformations fonctionnent d'une DTD à une autre et pour cette raison elles peuvent être utilisées en chaîne : transformA va de la DTD1 à la DTD2 et transformB de la DTD2 à la DTD3, ce qui graphiquement donne
DTD1 --- (transformA) --> DTD2 --- (transformB) ---> DTD3Nous appellerons la DTD1 la DTD originale, la DTD2 une DTD intermédiaire, la DTD3 la DTD finale. On peut démontrer qu'on peut créer une transformation qui va directement de la DTD1 à la DTD3, mais cela peut être plus compliqué et moins lisible/facile à gérer pour un humain.
* XSL/FO
XSLFO (XSL Formatting Objects)est un langage (une DTD XML) pour décrire des graphiques 2D de texte à la fois sur média imprimé et digital. Je ne me focaliserai pas sur les capacités graphiques que les formatting objects vous donnent, mais plutôt sur le fait qu'ils sont la plupart du temps utilisé comme "DTD finale", ce qui veut dire qu'une transformation est utilisée pour générer une description de formatting objects pour un document en partant d'un fichier XML général.
* XSP
Le langage XSP (eXtensible Server Pages) défini une DTD XML pour séparer le contenu de la logique pour les pages serveur compilées.
Le XSP (eXtensible Server Pages) est, comme le XSLFO, supposé être une "DTD finale" dans le sens qu'il est le résultat d'une ou plus étapes de transformations et doit être rendu par un formateur en du code source pur qui peut ensuite être compilé en code binaire.
Dans toute page dynamique, on peut trouver un mélange de contenu statique et de logique qui travaillent ensemble pour créer le résultat final, normalement en utilisant des inputs à l'exécution ou dépendantes du temps. Dans les technologies de génération de contenu dynamique, le contenu et la logique sont mélangés dans la même page. Le XSP ne fait pas exception puisqu'il définit une syntaxe pour mélanger du contenu statique et de la logique programmable d'une manière indépendante du langage de programmation utilisé et des résultats binaires que le générateur-de-source final fournit.
Mais il faut comprendre que le XSP est juste une partie de la structure : exactement comme les formatting objects mélangent style et contenu, le XSP mélange logique et contenu. D'un autre côté, étant à la fois des DTDs XML, le XSLT peut être utilisé pour évoluer d'un contenu pur vers ces DTDs finales, en plaçant le style et la logique sur la couche de transformation et en garantissant une complète séparation et une maintenance plus aisée.
Séparation des taches
Séparation des taches
Le modèle Cocoon permet aux sites web d'être hautement structurés et bien construits, réduisant les efforts de duplication et les coûts de gestion de sites en permettant différentes présentations de la même donnée selon la requête du client.
Cocoon permet une meilleure gestion des ressources humaines, en fournissant à chaque individu son travail et en réduisant au minimum les discussions croisées entre différents contextes de travail.
Le modèle que Cocoon2 adopte est le modèle pyramidal des contrats web (SoC – Separation of Concerns) lequel est représenté par l'image ci-dessous
Il est composé de quatre contextes de travail différent :
- Management (gestion) - personnes qui décident du contenu du site, de son comportement, et de son apparence.
- Content (contenu) - personnes responsables d'écrire, posséder et gérer le contenu du site. Ce contexte est susceptible de contenir de nombreux sous contextes, un pour chaque langage utilisé pour exprimer le contenu des pages.
- Logic (logique) - personnes responsables de l'intégration avec les technologies de génération de contenu dynamique et les systèmes de base de données.
- Style (style) - personnes responsables de la présentation de l'information, aspect et apparence, graphique du site et sa maintenance.
Sitemap
Fichier «sitemap.xmap»
Le SiteMap contient toute la logique du site, il permet de centraliser les règles de traitements en fonctions des URL demandées par l'utilisateur. C'est donc dans le SiteMap que l'on doit définir les différents pipelines et les règles d'accès en fonction des URL.
Le fichier de SiteMap est un simple fichier XML respectant la DTD définis pour les SiteMaps. Il est ainsi très simple d'éditer ce fichier pour y ajouter de nouveaux éléments. Ce fichier XML est tout de même compilé pour gagner en performances.
Définit les composants du site
Le fichier Sitemap définit une liste exhaustive de tous les composants que comportera le site.
Contient les pipelines
Cocoon est basé sur le modèle de pipeline : un document de XML est envoyé dans un pipeline, dans lequel existe plusieurs étapes de transformation de votre document. Chaque pipeline commence par un generator, continue avec zéro ou plus transformers, et finit avec un serializer. Ceci peut être comparé au concept de "servlet-chaining" d'un moteur de servlet. J'expliquerais les composants du pipeline plus en détail dans le paragraphe suivant.
Composants du sitemap
- Matcher, les Matchers permettent de faire l'association entre une URI "virtuelle" et une série d'instructions définis dans le SiteMap de Cocoon.
- Generator, le Generator est le point d'entrée d'un pipeline XML. Il génère du contenu XML en tant qu'évènements SAX et initialise le traitement du pipeline.
- Serializer, le Serializer est la dernière étape d'un pipeline XML. Il transforme les événements SAX en flux de données binaires ou de caractères pour le rendu final au client.
- Transformer, le transformer est le point central d'un pipeline, il accepte en entrée des événements SAX et génère en sortie d'autres événements SAX. Ce type d'architecture permet de faire tout type de modifications et surtout de faire se succéder plusieurs Transformers pour arriver au résultat désiré.
- Selector, le selector a un rôle semblable aux Matchers mais il permet une plus grande flexibilité.
- Action, les actions permettent de manipuler des paramètres.
- Reader, le Reader est à la fois le point d'entrée et la sortie d'un pipeline. Il remplace les actions effectuées par le Generator, le Transformer et le Serializer (les trois composants de bases d'un pipeline).
Vous pouvez accéder à une liste des composants présents dans Cocoon.
Mais vous pouvez aussi très bien développer vos propres composants.
Un pipeline "minimal" doit contenir au minimum 3 composants : un Matcher, un Generator et un Serializer.
Pipeline
Principe
Le pipeline est le tube dans lequel voter fichier xml passera pour être transformé dans le format de sortie que vous avez défini.
Le fonctionnement d'un pipeline est décrit par le schéma ci dessous.
- Dans un premier temps la requête client est dirigée vers le bon pipeline du sitemap en fonction des Matchers définis.
- Ensuite Cocoon exécute toutes las briques (les composants) présentent dans le pipeline pour transformer le fichier xml.
- Et Cocoon finit par retourner le résultat de la requête via un Serializer défini lui aussi dans le pipeline du sitemap.
Exemple Hello World
Fichier hello.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<page>
<title>Hello world exemple</title>
<s1 title="Hello">
<p>Hello World</p>
</s1>
</page>
Fichier sitemap.xmap
<?xml version="1.0" encoding="iso-8859-1"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
<map:components>
<map:serializer name="text"
src="org.apache.cocoon.serialization.TextSerializer"
mime-type="text/plain"
logger="sitemap.serializer.text"
/>
<map:serializer name="vrml"
src="org.apache.cocoon.serialization.TextSerializer"
mime-type="text/plain"
logger="sitemap.serializer.text"
/>
<map:serializer name="xhtml"
src="org.apache.cocoon.serialization.XMLSerializer"
mime-type="text/html"
logger="sitemap.serializer.xhtml"
pool-grow="2" pool-max="64" pool-min="2"
>
<doctype-public>-//W3C//DTD XHTML 1.0 Strict//EN</doctype-public>
<doctype-system>http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd</doctype-system>
<encoding>UTF-8</encoding>
</map:serializer>
</map:components>
<map:pipelines>
<map:pipeline>
<map:match pattern="*.html">
<map:generate src="{1}.xml"/>
<map:transform src="doc2html.xsl"/>
<map:serialize type="html"/>
</map:match>
<map:match pattern="*.pdf">
<map:generate src="{1}.xml"/>
<map:transform src="doc2pdf.xsl"/>
<map:serialize type="fo2pdf"/>
</map:match>
<map:match pattern="*.txt">
<map:generate type="file" src="{1}.xml"/>
<map:serialize type="text"/>
</map:match>
<map:match pattern="*.vrml">
<map:generate type="file" src="{1}.xml"/>
<map:serialize type="vrml"/>
</map:match>
<map:match pattern="*.xhtml">
<map:generate type="file" src="{1}.xml"/>
<map:serialize type="xhtml"/>
</map:match>
</map:pipeline>
</map:pipelines>
</map:sitemap>
Fichier doc2html.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<head>
<title><xsl:apply-templates select="page/title"/></title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="p|story">
<p><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="s1">
<h1><xsl:apply-templates select="@title"/></h1>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
Fichier doc2pdf.xsl
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
>
<xsl:template match="/">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="page"
page-height="29.7cm"
page-width="21cm"
margin-top="1cm"
margin-bottom="2cm"
margin-left="2.5cm"
margin-right="2.5cm"
>
<fo:region-before extent="3cm"/>
<fo:region-body margin-top="3cm"/>
<fo:region-after extent="1.5cm"/>
</fo:simple-page-master>
<fo:page-sequence-master master-name="all">
<fo:repeatable-page-master-alternatives>
<fo:conditional-page-master-reference
master-reference="page" page-position="first"/>
</fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="all">
<fo:flow flow-name="xsl-region-body">
<fo:block><xsl:apply-templates/></fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="p">
<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="s1">
<fo:block font-size="24pt" color="red" font-weight="bold">
<xsl:apply-templates select="@title"/>
</fo:block>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
Fichiers résultats
Apache Cocoon
Référence
Le site web officiel d'Apache Cocoon qui contient toutes les informations qui m'ont étés nécessaires pour la réalisation de mon exposé et de ce site.