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