Logo
  Erlang-fr.org  

Présentation du site
Cours Erlang
Articles
Projets
Autour d'Erlang-fr
Liens
 
English Area
Miroir: Documentation Erlang
Miroir: Archives Erlang/OTP
 
Recherche

Logo Process-one
Erlang

Publication de documents XML sur le Web avec Erlang et le Sablotron

par Mickaël Rémond

Version anglaise: En cours de traduction.
English Version: being translated.

Pré-requis

Un 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:

  • Expat (Version 1.95.1)
  • sablotron (Version 0.51)

Le Sablotron pour Erlang

Vous 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 Makefile

Je 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 -lsablot
devient :
    gcc -o bin/sablotron_adapter src/sablotron_adapter.c -lsablot -lexpat
car 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 Erlang

Lorsque 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 install
 
 
La 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 Web

Nous 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:

  • conf: Sert à héberger les fichiers de configuration du serveur Web
  • htdocs: Accueille vos pages Web statiques
  • icons: Accueille les icônes utilisées dans l'accès à une arborescence via le navigateur
  • logs: Destiné à héberger les fichiers de logs du serveur Web

Nous allons nous concentrer maintenant sur le contenu du répertoire conf. Il contient les fichiers suivants:

  • httpd.conf: Fichier de configuration du serveur Web.
  • mime.types: Fichier de configuration des types mime utilisé par le serveur Web. Ce fichier est standard.

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 port 8080 est affecté au serveur Web. S'il est déjà utilisé sur votre machine, vous pouvez changer le port utilisé dans le fichier de configuration.
  • Les possibilités d'utiliser des scripts en Erlang ont été activées (mod_esi). Un alias est mis en place (ErlScriptAlias pour que toutes les adresse du serveur commençant par /erl déclenchent l'appel de fonctions Erlang. Ici le seul module Erlang autorisé est news, qui correspond à un module news.erl que nous allons étudier plus loin.

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:

   > erl
Saisissez 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 XML

Pour 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 Erlang

Le 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.erl
Lancez 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/all
Vous 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.

Conclusion

Comme 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és

XML, XSLT, Erlang, Inets, HTTP, Sablotron

TODO

  • Relire attentivement l'ensemble du document; trouver un beta testeur pour valider le caractère reproductible de l'application à partir des informations présentes dans l'article.
  • Revoir la mise en page, qui n'est pas très satisfaisante.
  • Ajoutez des captures d'écran de l'application Web.

Historique du document

Version 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