Un premier générateur


Dans ce tutorial nous abordons la réalisation d'un module de génération. Un module est un ensemble de templates permettant de générer un texte à partir d'un modèle UML par exemple. Nous allons présenter dans un premier temps les outils permettant la mise au point d'un module à travers la génération d'un fichier XHTML documentant le modèle.

Principe

Le principe de fonctionnement d'Acceleo est, de manière assez basique, le suivant: Acceleo utilise un template pour générer du code à partir d'un modèle. La réalisation d'un nouveau module de génération passe donc par la création de templates.
Acceleo - principe général
Acceleo - principe général

Dans ce tutorial nous allons créer un template générant du HTML à partir d'un modèle UML2.

Projet de génération

Il est tout d'abord conseillé de basculer en perspective Acceleo.

Dans un premier temps il faut créer un projet de génération via le menu New->Generator Project.

Nouveau projet de génération
Nouveau projet de génération

Le projet dispose d'un décorateur spécifique indiquant qu'il s'agit d'un projet de génération (les flèches vertes).

Projet de génération vide
Projet de génération vide

Afin de mettre au point notre template de génération nous avons besoin d'un modèle de test.

Création d'un modèle

Pour créer un nouveau modèle vous pouvez utiliser de nombreux logiciels, Acceleo dispose d'une très bonne compatibilité avec les modeleurs du marchés. Il est donc possible d'utiliser ArgoUML, Poseidon, Umbrello, ou encore Rational Rose. Pour une liste détaillée des modeleurs compatibles reportés vous à la page de compatibilités.
Nous utilisons ici le modeleur du projet TopCased. Il supporte UML2 et est intégré à Eclipse. Le modèle UML2 de ce tutorial est disponible en téléchargement : WebLog_fr.uml
Si votre modèle est conforme à UML 1.3 ou UML 1.4, vous devez dans un premier temps le convertir à EMF via l'action Acceleo->Convert Xmi accessible via un clic-droit sur le modèle.
Modèle UML2 de WebLog
Modèle UML2 de WebLog

Ce modèle est placé dans un repertoire model du projet.

Premier template

Nous avons crée un modèle, nous allons maintenant créer notre premier template de génération.

Cliquez sur New puis Empty Generator.

Nouveau template de génération
Nouveau template de génération

Ici il s'agit d'un générateur pour UML2, il faut donc choisir l'URI correspondante dans la boite de dialogue. La liste déroulante Types values permet d'indiquer sur quel type d'objet on souhaite générer un fichier.

Ici on souhaite générer un fichier par classe présente dans le modèle, il s'agit donc du type uml.Class.

Nouveau template de génération pour UML2
Nouveau template de génération pour UML2

L'assistant crée alors un template de génération vide.

Template vide pour UML2
Template vide pour UML2

Déclaration des dépendances des services

Afin de réaliser des services en Java manipulant des entités d'un méta-modèle (UML2 ou autre), il convient dans un premier temps de déclarer la dépendance du module de génération vers ce dernier.

Ceci est possible en éditant le fichier Manifest.mf que l'on trouve dans le repertoire META-INF du projet de génération.

Dans le cas d'uml2 il est nécessaire de spécifier org.eclipse.uml2.uml dans les dépendances du projet.

Déclaration de la dépendance vers UML2
Import de UML2 dans le projet de génération

L'éditeur réflectif Acceleo

Le modèle créé précédemment va être utilisé pour mettre au point le template de génération. Ceci est rendu beaucoup plus simple grâce à l'éditeur réflectif. Ce dernier est capable de charger tout modèle et offre une prévisualisation dynamique du code généré.

Pour ouvrir l'éditeur réflectif il faut cliquer avec le bouton droit sur un modèle puis choisir Open with->Acceleo Reflective Editor.

Ouverture de l'éditeur réflectif
Ouverture de l'éditeur réflectif

L'éditeur réflectif est associé aux fichiers d'extension "xmi", "ecore", "uml" et "uml2". Dans le cas où votre modèle utilise une autre extension vous pouvez l'ouvrir avec l'éditeur réflectif en utilisant le menu "Open As -> Acceleo".

Le modèle est alors représenté sous une forme arborescente.

Éditeur réflectif Acceleo
Éditeur réflectif Acceleo

Prévisualisation de la génération

Une fois le modèle ouvert dans l'éditeur réflectif il faut lui associer le template créé précédemment. Cliquez sur Acceleo -> Select Template dans l'éditeur réflectif et choisissez le template de génération depuis UML2 vers XHTML.

Sélection d'un template de génération
Sélection d'un template de génération

Une fois le template sélectionné des marqueurs apparaissent dans la vue Outline de l'éditeur réflectif.

Marqueurs de génération
Marqueurs de génération

Ces marqueurs signifient que le template peut génèrer des fichiers pour chacun des objets marqués. Il s'agit maintenant de remplir le template afin de générer du texte.

La figure suivante montre un template générant pour chacune des classes une description composée des commentaires et de ses attributs.

Template de génération vers XHTML
Template de génération vers XHTML

Vous pouvez télécharger le template d'exemple UML2 vers XHTML.
Pour plus d'informations sur la syntaxe des générateurs reportez-vous à la documentation de référence et aux modules d'exemple.

Une fois ce template complété et sauvé vous pouvez mettre à jour la prévisualisation via un clic droit dans l'éditeur réflectif, Acceleo -> Reload Template.

Rechargement d'un template
Rechargement d'un template

Les marqueurs de génération sont toujours présents. Lorsque l'on sélectionne une classe disposant de ce marqueur l'éditeur réflectif affiche une prévisualisation du code généré dans l'onglet source.

Prévisualisation d'une génération
Prévisualisation d'une génération

Vous pouvez donc répéter cela autant de fois que nécessaire pour la mise au point du template de génération.

Génération des fichiers

Une fois le template de génération mis au point il s'agit de générer les fichiers correspondants. Ceci est possible via l'action Generate files dans le menu Obeo de l'éditeur réflectif.

Génération des fichiers
Génération des fichiers

Vous pouvez alors choisir le repertoire où les fichiers seront générés (ici doc). Acceleo génère un fichier HTML par classe du modèle UML2.

Fichiers générés
Fichiers générés

Génération massive

La génération massive est possible par l'utilisation des chaînes de lancement. Ces dernières permettent de définir une suite d'actions données pour générer un projet et permettent le lancement de plusieurs générations successives.

  • Créez une chaîne de lancement : New -> Chain
  • Paramétrez le méta-modèle comme précédemment
  • Sélectionnez le modèle, le template et un nom de chaîne
  • Sur le fichier .chain créé, Clic droit -> Launch
  • Les fichiers sont générés et consultables avec un navigateur

Ce document est une introduction à la réalisationde modules Acceleo. Le tutorial Acceleo avec GMF aborde la création d'un module de génération pour un DSL réalisé avec GMF.

Ces documentations facilitent la mise en place d'Acceleo ainsi que son utilisation, pour des besoins plus pointus une documentation payante est disponible sur le site de Obeo. Veuillez lire les instructions fournies ici.

Vous pouvez également consulter la documentation de référence d'Acceleo.

Un problème ?

Plusieurs possibilités :