Génération de Code avec Acceleo Plan

Transcription

Génération de Code avec Acceleo Plan
21/10/2010
Génération de Code
avec Acceleo
Cedric Dumoulin
Plan

Principe générale des templates

Le standard OMG : MTL

1er exemple









ex de template
fonctionement : query puis generation













Module, template,
generer dans un fichier
afficher une variable
specifier le template de depart
Faire une boucle
Faire une condition



Documentations



Eclipse->Help
specification OMG
completion
Qu’est-ce qu’un template
Environement de developpement
Acceleo et MTL – norme OMG
Notions de bases

créer projet dans l’eclipse contenant le code EMF
lancer Eclipse de test
Importer, par reference, le projet de template
Utiliser le projet de template dans l’eclipse de test
augmenter la memeoire de Eclipse
Notions de base


implémentation : Acceleo

Environement de dev


Les implementations existantes


squelette de base
generer dans un fichier
afficher une variable
specifier le template de depart
Faire une boucle
Faire une condition
Faire des templates separe :
methodes; module
Afficher une enumeration
Operations sur les chaines
expression OCL
Documentations


specification OMG
completion
1
21/10/2010




Dev MM dans un Eclipse
Dev templates dans un autre (lance a
partir du 1er)
Utiliser l’URL du MM
(http:///mjava.ecore)
Augmenter la memoire
Templates


En francais : ‘patron’
Un templates sert à générer tout type de
texte


C’est une ébauche du texte à générer


xml, code, texte, …
contient des ‘trous’ à remplacer par les vrais
valeurs
On ‘instancie’ un template


on spécifie les valeurs à utiliser
on obtient le texte final
2
21/10/2010
Templates
Principe générale



un template (fichier texte) avec des « trous »
des données
le moteur rempli les trous avec les données
et génère le fichier de sortie
Bonjour [name]
birthday : [birthday]
template
name = ‘alice’
birthday = ‘1 janvier 2000’
M
Bonjour alice
birthday : 1 janvier 2000
résultat
données
Exemples de Moteur de
templates existant

Eclipse






Jet
XPand
Acceleo – pour générer du texte à partir de
modèles
JSP – pour pages web dynamiques
PHP – pour pages web dynamiques
…
3
21/10/2010
Le standard OMG : MTL

MTL :
« MOF Model to Text Transformation
Language »



standard OMG (Object Management Group)
conçue pour générer du texte à partir de modèles
définis par des métamodèles
Implémentation de référence:


Acceleo
Disponible dans Eclipse

Prendre la distribution ‘Eclipse Modeling’
Module


Contient des templates et des queries
Correspond à un fichier ‘.mtl’



un module == un fichier ‘.mtl’
Sert d’espace de nommage
Le fichier doit commencer par

[module <module_name>('metamodel URI')/]
generate.mtl
[comment encoding = UTF-8 /]
[module generate('http:///mjava.ecore')/]
...
4
21/10/2010
Template



Spécifie un template avec des trous
Permet de générer le texte
Est délimité par

[template]...[/template]

Contient le texte à générer et les endroits à remplacer par des
données

A au moins un paramètre


[c.name/]
élément du métamodèle qui est utilisé pour obtenir les données
generate.mtl
[comment encoding = UTF-8 /]
[module generate('http:///mjava.ecore')/]
[template public generateClass(c : Class)]
[
name = [c.name/]
[/
[/template]
File


Tag à utiliser dans un template
Permet de spécifier le fichier de sortie
(dans lequel le texte est généré)

[file (<uri_expression>, <append_mode>, '<output_encoding>')] (...) [/file]

uri_expression

append_mode

output_encoding




nom du fichier à générer
peut contenir un chemin d’accès – les répertoires sont alors créés
optionnel – indique si le texte doit être remplacé ou ajouté
optionnel
[comment encoding = UTF-8 /]
[module generate('http:///mjava.ecore')/]
[template public generateClass(c : Class)]
[comment @main /]
[file (c.name, false, 'UTF-8')]
name = [c.name/]
[/file]
[/template]
5
21/10/2010
Template
exécution

Un template peut être exécuté de deux
façons:

soit par appel par le moteur



le moteur recherche dans le modèle tout les
éléments du type requis par le paramètre du
template
Pour chaque élément, le template est appelé
soit par appel explicite, à partir d’un autre
template

équivalent à un appel de méthode
Template
exécution par le moteur

Le moteur execute:


les templates contenant un tag [file]
les templates contenant une annotation

[comment @main /]
[module generate('http:///mjava.ecore')/]
[template public generateClass(c : Class)]
[comment @main /]
[file (c.name, false, 'UTF-8')]
class [c.name/]
[/file]
[/template]
ici, seul le premier
template est
executé par le
moteur
[template public generateName(ele : NamedElement)]
[ele.name/]
[/template]
6
21/10/2010
Template
appel explicite

Un template peut appeler d’autre template (~ appel de
méthode)

l’appel se fait sur une instance du type du paramètre

ou en passant les paramètres


[c.generateName()/]
[generateName(c)/]
[template public generateClass(c : Class)]
[comment @main /]
[file (c.name, false, 'UTF-8')]
name = [c.generateName()/]
[/file]
[/template]
[template public generateName(ele : NamedElement)]
[ele.name/]
[/template]
Template
Pre-condition

Un template peut avoir une pré condition

il ne sera exécuté que si la condition est vrai
[template public generateClass(c : Class) ? (isCompilationUnit = true)]
[comment @main /]
[file (c.name, false, 'UTF-8')]
name = [c.name/]
[/file]
[/template]
[template public generateClass(c : Class) ? (isCompilationUnit = false)]
[/template]
7
21/10/2010
Iterations

Le bloc for
Déclare une variable ‘a’ de type Attribute
Produit le texte entre [for] et [/for]
pour chaque attribut de la collection c.attribute


[template public classToJava(c : Class)]
class [c.name/]
{
// Attribute declarations
[for
[for(a
: Attribute | c.attribute)]
[a.type.name/] [a.name/];
[/for]
}
[
[/template]
Demo

Environement de travail







Le MM dans l’eclipse de depart
Les templates dans l’Eclipse de test (ici test du
MM)
Test des templates dans l’Eclipse de test
Si modification du MM ???
Creation d’un projet Acceleo
Parametrage url
Generation des templates
8
21/10/2010
Bibliographie

Standard OMG


Aide Eclipse



Help Contents -> Acceleo (…) -> Quick Start
http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.ac
celeo.doc/doc/overview.html
Site Acceleo



http://www.omg.org/spec/MOFM2T/1.0/
http://www.eclipse.org/acceleo/
http://www.eclipse.org/acceleo/documentation/
Tutorial

Voir Help Contents -> Acceleo -> tuto
Exercices

Écrire le template permettant de générer un
squelette simple d’une classe. On utilise votre
métamodèle.
9