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]