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]