|
|
Présentation du site Cours Erlang Articles Projets Autour d'Erlang-fr Liens English Area Miroir: Documentation Erlang Miroir: Archives Erlang/OTP Recherche ![]()
|
Publication de documents XML sur le Web avec Erlang et le Sablotronpar Mickaël Rémond
Version anglaise: En cours de traduction. Pré-requisUn environnement Erlang complet et fonctionnel doit être installé sur votre machine. Réferez-vous au cours sur l'installation d'Erlang, si vous n'êtes pas déjà passé par cette étape: Installation de l'environnement de développement Erlang Vous devez également disposer des bibliothèques suivantes sur votre machine:
Le Sablotron pour ErlangVous devez télécharger la bibliothèque Sablotron pour Erlang de Victor M. Gulias: Sablotron-1.0 pour pouvoir utiliser le sablotron depuis Erlang. Décompresser ensuite l'archive avec la commande: > tar -xcvf Modification du MakefileJe propose quelques modifications du fichier Makefile pour faciliter la compilation et l'install de la bibliothèque Sablotron. Pour appliquer ces modifications, télécharger le patch. Copier ce patch dans le répertoire racine de l'archive du Sablotron Erlang (Sablotron-1.0). Pour appliquer le patch, placez-vous dans ce répertoire et appliquer la commande: > patch -p1 < sablotron-1.0.patch Les modifications effectuées sont mineures. Elles consistent dans la correction de la directive de compilation. La ligne : gcc -o bin/sablotron_adapter src/sablotron_adapter.c -lsablotdevient : gcc -o bin/sablotron_adapter src/sablotron_adapter.c -lsablot -lexpatcar expat doit être lié avec le fichier binaire en plus de la bibliothèque du sablotron. La deuxième modification concerne l'ajout d'une directive d'installation:
install:
install -d /usr/local/lib/erlang
install -d /usr/local/lib/erlang/lib
install -d /usr/local/lib/erlang/lib/sablotron-1.0
cp bin/sablotron_adapter /usr/local/lib/erlang/lib/sablotron-1.0/
cp ebin/*.beam /usr/local/lib/erlang/lib/sablotron-1.0/
Compilation et installation du module Sablotron-1.0 pour ErlangLorsque les bibliothèques requises sont installées et que le Makefile a été modifié, l'installation se passe sans encombre. Les commandes suivantes doivent être exécutée en tant que root: > make > make test > make installLa commande make test est optionnelle mais permet de s'assurer que le moteur de transformation XSLT fonctionne correctement. Une fois toutes ces opérations effectuées, nous pouvons passer à la partie réellement intéressante: La création d'une application de publication Web basé sur Erlang et le Sablotron Une application de publication de News sur le WebNous allons prendre un exemple classique pour illustrer notre développement: Il s'agit de développement un outil de publication de News s'appuyant sur XML. Configuration du serveur HTTP Erlang (Bibliothèque Inets)Erlang offre un grand nombre de programme et bibliothèque en standard dans son environnement. Parmi ces programmes un serveur Web est fournit permettant de construire des applications dynamiques développées en Erlang. C'est ce serveur Web que nous allons d'abord mettre en place. Le fonctionnement est très simple. Créer d'abord un répertoire qui servira à héberger votre application (Par exemple news. Nous avons ensuite besoin des sous-répertoires suivants:
Nous allons nous concentrer maintenant sur le contenu du répertoire conf. Il contient les fichiers suivants:
Le contenu du fichier httpd.conf ressemble beaucoup à la manière dont est structuré un fichier de configuration Apache. Il contient les informations suivantes:
# Port Number used for the Web server:
Port 8080
# Mandatory:
ServerName xml.erlang-fr.org
ServerAdmin mickael.remond@erlang-fr.org
# Modules to use. We are using almost all of them: This can be reduced.
SocketType ip_comm
Modules mod_alias mod_auth mod_esi mod_actions mod_cgi mod_include
mod_dir mod_get mod_head mod_log mod_disk_log
# Directory structure
ServerRoot ./
DocumentRoot ./htdocs
DirectoryIndex index.html
# Logging Setup
ErrorLog logs/error_log
TransferLog logs/access_log
SecurityLog logs/security_log
ErrorDiskLog logs/error_disk_log
ErrorDiskLogSize 200000 10
TransferDiskLog logs/access_disk_log
TransferDiskLogSize 200000 10
SecurityDiskLog logs/security_disk_log
SecurityDiskLogSize 200000 10
# Various settings
MaxClients 50
DefaultType text/plain
Alias /icons/ ./icons/
Alias /pics/ ./icons/
# Setting up the Erlang scripting facilities
ErlScriptAlias /erl news
Parmi les éléments les plus importants du fichier de configuration on notera:
Le fichier de configuration est volontairement minimaliste et n'illustre qu'une infime partie des fonctionnalités du serveur Web Erlang. La structure élémentaire de répertoire peut-être téléchargée: mickael_remond_001-01.tar.gz. Nous allons pouvoir maintenant tester que le serveur Web fonctionne. Pour cela, placez vous dans la racine de votre répertoire de travail (par exemple news). Lancez d'abord le shell Erlang: > erlSaisissez ensuite la commande Erlang suivante:
Erlang (BEAM) emulator version 5.0.1.1 [source]
Eshell V5.0.1.1 (abort with ^G)
1> httpd:start("conf/httpd.conf").
{ok,<0.30.0>}
2>
Pour vérifier que le serveur fonctionne, ouvrez ensuite un navigateur Web et connectez-vous sur l'adresse suivante: http://localhost:8080/Cette commande suppose que votre serveur Inets est bien sur la même machine que le navigateur et que votre serveur utilise le port 8080. Vous devriez voir apparaître le fichier index.html du répertoire ./htdocs en guise d'accueil. Création d'un fichier de news au format XMLPour publier un document XML sur le Web, nous devons avant tout définir le format du fichier XML et en fournir un exemplaire pour pouvoir travailler. Notre grammaire XML va être extrêmement simple. Un élément d'information à publier sera de la forme:
<item id="1">
<date>2001-02-25</date>
<author>
<name>Nom</name>
<email>adresse@mail.com</email>
</author>
<title>Titre de la dépêche</title>
<body>Texte complet de la dépêche.</body>
</item>
L'ensemble des éléments de dépêche (chaque item) est encadré par une
balise de type <news>
Notre fichier de dépêche nous servant d'exemple ressemble au suivant:
<?xml version="1.0" encoding="ISO-8859-1"?>
<news>
<item id="2">
<date>2001-02-28</date>
<author>
<name>Mickaël Rémond</name>
<email>mickael.remond@erlang-fr.org</email>
</author>
<title>Nouvel article: Publication de documents XML sur le
Web avec Erlang et le Sablotron</title>
<body>Un tutorial sur la publication de documents XML sur le
Web en utilisant Erlang est sorti.</body>
</item>
<item id="1">
<date>2001-02-24</date>
<author>
<name>Mickaël Rémond</name>
<email>mickael.remond@erlang-fr.org</email>
</author>
<title>Le module de publication de News passe en phase de test</title>
<body>Le module de publication de dépêche est désormais opérationnel et
passe en phase de test. Merci de signaler tout problème durant cette période
à Mickaël Rémond.</body>
</item>
</news>
Création des feuilles de style (XSL)Notre application se décompose en deux écrans. Un écran listant toutes les dépéches et un écran permettant d'avoir le contenu d'une dépêche donnée. Nous allons donc créer deux feuilles de style applicable sur notre fichier de dépêche: la première servira à générer la page Web constituant l'écran général (news_all.xsl); la seconde permettra de générer l'écran de détail permettant de prendre connaissance du contenu d'une dépêche (news_one.xsl). Dans notre exemple, le fichier news_all.xsl est le suivant:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1"/>
<xsl:template match="news">
<html>
<head>
<title>News</title>
</head>
<body>
<h1>News</h1>
<table width="100%">
<xsl:for-each select="item">
<tr>
<xsl:apply-templates select="date"/>
<xsl:apply-templates select="title"/>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="date">
<td width="100">
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="title">
<td>
<xsl:text disable-output-escaping="yes">
<a href="/erl/news/one?id=</xsl:text>
<xsl:value-of select="../@id"/>
<xsl:text disable-output-escaping="yes">"></xsl:text>
<xsl:value-of select="."/>
<xsl:text disable-output-escaping="yes"></a></xsl:text>
</td>
</xsl:template>
</xsl:stylesheet>
Le fichier news_one.xsl est le suivant:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1"/>
<xsl:template match="news">
<html>
<head>
<title>News</title>
</head>
<body>
<h1>News</h1>
<table width="100%" border="0" cellspacing="0">
<xsl:apply-templates select="item[@id='@ID@']"/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<tr bgcolor="#AA0000">
<td width="100">
<font color="#FFFFFF">
<xsl:value-of select="date"/>
</font>
</td>
<td>
<font color="#FFFFFF">
<xsl:value-of select="title"/>
</font>
</td>
</tr>
<xsl:apply-templates select="author"/>
<xsl:apply-templates select="body"/>
</xsl:template>
<xsl:template match="author">
<tr>
<td colspan="2">
<p><b>
by <xsl:text disable-output-escaping="yes"><a href="mailto:</xsl:text>
<xsl:value-of select="email"/>
<xsl:text disable-output-escaping="yes">"></xsl:text>
<xsl:value-of select="name"/>
<xsl:text disable-output-escaping="yes"></a></xsl:text>
</b></p>
</td>
</tr>
</xsl:template>
<xsl:template match="body">
<tr>
<td colspan="2">
<p>
<hr/>
<xsl:value-of select="."/>
</p>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Vous trouverez ces fichiers dans l'archive mickael_remond_001-02.tar.gz Pour tester le processus de transformation, je recommande d'utiliser le sablotron en ligne de commande: > sabcmd news_all.xsl news.xml > sabcmd news_one.xsl news.xml Développement du module ErlangLe développement du module Erlang est extrêmement simple. Il consiste dans la réalisation de deux fonctions (news_all et news_one) dont le rôle est d'appliquer la feuille de style à au fichier XML de dépêches. Ces fonctions doivent accepter deux paramétres pour être utilisables par le serveur Web: le premier paramètre rassemble l'ensemble des variables d'environnement; le second présente les paramètres passer dans l'URL à la fonction. Le module news.erl est finalement très simple:
-module(news).
-export([all/2, one/2]).
all(Env, Input) ->
{ok, Sab} = sablotron:start("/usr/local/lib/erlang/lib/sablotron-1.0/sablotron_adapter"),
Base = list_to_binary("./"),
{ok, XSL} = file:read_file("./news_all.xsl"),
{ok, XML} = file:read_file("./news.xml"),
{ok, HTML} = sablotron:process_strings_with_base(Sab, XSL, XML, Base),
sablotron:stop(Sab),
["text/html\n\n", HTML].
one(Env, Input) ->
{ok, Sab} = sablotron:start("/usr/local/lib/erlang/lib/sablotron-1.0/sablotron_adapter"),
Parsed_input = httpd:parse_query(Input),
[{"id", Id}] = Parsed_input,
Base = list_to_binary("./"),
{ok, XSL} = file:read_file("./news_one.xsl"),
{ok, XSL_with_param, 1} = regexp:sub(binary_to_list(XSL), "@ID@", Id),
{ok, XML} = file:read_file("./news.xml"),
{ok, HTML} = sablotron:process_strings_with_base(Sab, list_to_binary(XSL_with_param), XML, Base),
sablotron:stop(Sab),
["text/html\n\n", HTML].
Le programme se trouve également dans l'archive mickael_remond_001-02.tar.gz. Placer ce programme dans votre répertoire de travail (par exemple news). Compilez-le grâce à la commande: > erlc news.erlLancez ensuite le shell Erlang en spécifiant les chemins d'accès aux modules du Sablotron: > erl -pa "/usr/local/lib/erlang/lib/sablotron-1.0"Lancer enfin le serveur Web:
Erlang (BEAM) emulator version 5.0.1.1 [source]
Eshell V5.0.1.1 (abort with ^G)
1> httpd:start("conf/httpd.conf").
{ok,<0.30.0>}
2>
Pointez ensuite votre navigateur vers l'URL suivante: http://localhost:8080/erl/news/allVous accèdez alors à l'écran principal de visualisation des dépêches. Un clic sur le titre d'une dépêche permet alors d'accèder à son contenu. Votre application est désormais normalement fonctionnelle et vous pouvez maintenant la personnaliser et la modifier pour l'améliorer. Si vous faites des extensions intéressantes ou des développements grâce à l'approche proposée par cet article, merci me prévenir par un mail envoyé à l'adresse suivante: mickael.remond@erlang-fr.org. ConclusionComme nous venons de le voir, il est très simple en Erlang de développer une application Web s'appuyant sur XML. Le serveur Web est fournit avec l'environnement de développement, le développement d'un tel application ne nécessite pas de se lancer dans la mise en place d'un environnement de développement Java + Apache par exemple. Mots-clésXML, XSLT, Erlang, Inets, HTTP, Sablotron TODO
Historique du documentVersion 1.0 - 2001-02-28 - Mickaël Rémond. |
Pour tout commentaire: erlang@erlang-fr.org
Dernière modification: 2005-11-11 18:48:0