Génération de Code avec Acceleo

Transcription

Génération de Code avec Acceleo
Génération de Code
avec Acceleo
Cedric Dumoulin
Rendu 1

Un zip ou tar contenant:

Le projet de votre métamodèle


Le projet avec la génération de code html




Fichier .mtl
Le projet avec les exemples


Permettant de construire un modèle avec des sections, des sous-sections et
des paragraphes.
Un exemple de modèle (instance du MM)
Le fichier html généré à partir de votre exemple
Ne mettez pas le répertoire .metadata !! Ni les xxx.edit et
xxx.editor
Un document PDF avec:



Le diagramme de votre MM
Un snapshoot de votre exemple avec les nœuds visible
Un snapshoot du fichier HTML
LE PROJET
Principe de base
Doc
.html
gén
éra
tion
Doc
Patron de
génération
(template)
.odt
A réaliser
Doc
A réaliser
T
Document
Html ou odt
Avec
instructions de
remplacement
(trous)
T
Modèle
Patron (avec
trous)
.document
Modèle
complété
.document
G
G
.html
Doc
.odt
TEMPLATES
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
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
M
name = ‘alice’
birthday = ‘1 janvier 2000’
données
Bonjour alice
birthday : 1 janvier 2000
résultat
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
…
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’
MTL / ACCELEO
Structure d’un module
[comment encoding = UTF-8 /]
[**
* The documentation of the module generate2.
*/]
[module generate2('http:///document.ecore')]
[**
* The documentation of the template generateElement.
* @param aDocument
*/]
[template public generateElement(aDocument : Document)]
[comment @main/]
[file (aDocument.name, false, 'UTF-8')]
[/file]
[/template]
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')/]
...
Template



Spécifie un template avec des trous
Permet de générer le texte
Est délimité par


Contient le texte à générer et les endroits à remplacer par des
données


[template]...[/template]
[c.name/]
A au moins un paramètre

é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


nom du fichier à générer
peut contenir un chemin d’accès – les répertoires sont alors créés

append_mode

output_encoding


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]
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 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]
[template public generateName(ele : NamedElement)]
[ele.name/]
[/template]
ici, seul le premier
template est
executé par le
moteur
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


[c.generateName()/]
ou en passant les paramètres

[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]
Iterations
Boucles [for]

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(a : Attribute | c.attribute)]
[a.type.name/] [a.name/];
[/for]
}
[/template]
Polymorphisme

Lors de l’utilisation du
polymorphisme:

écrivez un template pour le cas par
défaut


faite lui écrire un message d’erreur
n’écrivez pas tous les cas à l’aide de
[if]

faite un template pour chaque sous-cas
Polymorphisme
[template public generateElement(mamifere : Mamifere)]
[comment @main/]
[file (aDocument.name, false, 'UTF-8')]
[toProfil(mamifere)/]
[/file]
[/template]
[template public toProfil(mamifere : Mamifere)]
!!! A implementer !!!
[/template]
[template public toProfil(cheval : Cheval)]
nom : [cheval.name/]
robe : [cheval.robe/]
[/template]
[template public toProfil(singe : Singe)]
nom : [singe.name/]
pelage : [singe.pelage/]
[/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
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.
[comment encoding = UTF-8 /]
[module generate('http:///mjava.ecore')/]
[template public generate(c : Class)]
[comment @main /]
[file (c.genFullPath(), false, 'UTF-8')]
package [c.genFullPath()/];
/**
*
*/
public class [c.name/] {
[c.genProperties()/]
[c.genMethods()/]
}
[/file]
[/template]
[template public genFullPath(c : Class)]
[c.qualifiedName.substituteAll('.', '/').concat('.java')/]
[/template]
[template public genProperties(c : Class)]
[for (p : Property | c.properties)]
[p.genProperty()/]
[/for]
[/template]
[template public genMethods(c : Class)]
[/template]
[template public genProperty(p : Property)]
/**
* Property [p.name/]
*/
[p.type.name/] [p.name/];
[/template]
[template public genName(ele : NamedElement)]
[ele.name/]
[/template]

Documents pareils