Résultats du 4 décembre 2019
Les résultats obtenus lors de la séance du 4 décembre 2019 sont disponibles.
Introduction
Ces cours se déroulent sur machine, dans l'environnement Eclipse (Modeling tools) et abordent :
- la création d'un métamodèle,
- la création de modèles (instances d'un métamodèle),
- les transformations M2M (Model to model), avec QVT operational,
- les transformations M2T (Model to text), avec Acceleo,
- la création d'une syntaxe textuelle concrète pour un métamodèle (avec Xtext).
Contexte
On souhaite créer un DSL pour représenter des automates. On crée pour cela un projet eCore et un métamodèle comportant les concepts suivants :
- StateMachine (une machine à états) possédant un nom, une liste d'entrées (Input), une liste de sorties (Output) et une liste d'états (State) ;
- Input, représente une entrée, caractérisée par son nom ;
- Output, représente une sortie, caractérisée par son nom ;
- State, représente un état, caractérisé par son nom. Un état peut être initial ou non et possède des transitions (Transition) ;
- Transition, représente une transition entre deux états. Elle possède une garde (Input), une action (Output) et un état cible (State).
Une fois ce métamodèle créé, instanciez une StateMachine ayant pour entrées a et b, pour sorties x et y et deux états A et B, A étant initial. Il existe une transition de A vers B de garde a et d'action x, et une transition de B vers A de garde b et d'action y. Pour cela, choisissez "Create Dynamic Instance..." dans le menu contextuel de la classe StateMachine dans l'arborescence du .ecore.
Modèle objet
Afin de pouvoir générer du code, on définit (dans un autre projet) un autre métamodèle des automates, plus proche de l'implémentation :
- FSMClass, la classe des automates, ayant pour attributs un nom, une liste d'états (StateClass) et un état initial ;
- StateClass, la classe des états, ayant pour attributs un nom et une liste de transitions (TransitionClass) ;
- TransitionClass, la classe des transitions, ayant pour attributs une garde et une action (chaînes de caractères) et un état cible (StateClass).
Ce modèle permettra de générer du code Java ou C++ par exemple.
Transformation M2M
Pour modéliser la transformation d'un automate vers un modèle d'un programme, nous utiliserons QVT operational. Ce langage permet de décrire des transformations M2M (Model to model). Vous trouverez en ligne une documentation de QVT operational ainsi qu'un tutoriel. Il y a également une présentation faite à la conférence EclipseCon en 2009.
Pour créer la transformation, créez un nouveau projet Model to Model Transformation > Operational QVT Project, et choisissez Create a plug-in project. Cochez Create artifacts in new QVT Operational Project et sélectionnez Operational QVT Transformation.
Dans le fichier source de la transformation, déclarez les métamodèles source et destination à l'aide du mot clef modeltype.
Définissez les mapping des différents concepts du métamodèle source vers ceux du métamodèle cible, puis complétez le main pour convertir l'élément racine du modèle source (StateMachine), ce qui entraînera la conversion des autres éléments (à condition que vous ayez bien géré les propriétés de Containment dans le métamodèle source).
Votre transformation devrait avoir une structure semblable à ceci :
Exécutez cette transformation sur une instance du métamodèle source et inspectez le résultat.
Pour exécuter une transformation QVTop, il faut créer une Run configuration de type QVT Operational Transformation
et renseigner les paramètres Transformation module
(sélectionnez votre transformation en cliquant sur le bouton Browse), le modèle source (IN
) et le modèle cible (OUT
). Pour créer un nouveau modèle cible, sélectionnez tout d'abord le même fichier que pour le modèle source, puis changez son nom dans le champ de texte.
Transformation M2T (Model to text)
On souhaite maintenant générer le code Java correspondant à un modèle objet d'un automate. Nous utiliserons Acceleo : créez un projet Acceleo. Sur la deuxième page du dialogue de création du projet, ajoutez le métamodèle source de la transformation (celui qui correspond à la version objet des automates, et que vous trouverez en sélectionnant Runtime version) et cochez la case Main template.
Ouvrez le fichier generate.mtl qui se trouve dans le package main, et complétez le comme suit :
Comme il n'est pas commode d'éditer du code Java dans l'éditeur Acceleo, nous allons exécuter la transformation sur un modèle, éditer le code Java généré jusqu'à obtenir le comportement voulu, puis reporter ce code dans le fichier .mtl
en remplaçant les parties qui dépendent du modèle source par des instructions de génération Acceleo.
Créez un projet Java qui contiendra les fichiers nécessaires à l'exécution du code généré.
Pour exécuter la transformation, utilisez Run As
, choisissez Launch Acceleo Application, et renseignez le modèle source et le dossier src
du projet Java comme dossier de destination.
Complétez le code généré (vous pouvez créer d'autres classes dans le projet Java si nécessaire), et une fois qu'il fonctionne, recopiez ce code dans la transformation Acceleo, et éditez-le pour générer du code similaire pour tout modèle.