Ingénierie Dirigée par les Modèles (IDM) : tutoriel Eclipse Ecore, le corps à corps avec les méta modèles
Si vous avez manquez le début, résumé des épisodes de la 1ère saison de notre série estivale qui nous a fait voyagé dans les modèles, les méta, les métamétamodèles et leurs transformations avec ATL (ATLAS Transformation Language).
L'objectif était de transformer les membres d'une famille (père, mère, fils et filles) en simples personnes en précisant le sexe.
Nous sommes partis d'un métamodèle "Families" sérialisé en XMI et conforme au métamétamodèle Ecore d'Eclipse Modeling Framework (EMF), nous avons écrit avec ATL, les règles de transformation vers le métamodèle "Persons" en XMI et conforme à Ecore.
Et enfin pour tester, nous avons "peuplé" la famille en utilisant un modèle en XMI instanciant le métamodèle "Families", puis exécuté la transformation ATL pour obtenir un modèle d'instances de "Persons généré en XMI.
Je vous propose un flashback et de voir comment a été créé ce métamodèle "Families" en XMI passé en entrée de notre transformation et comment on a créé un modèle d'objets XMI (lui aussi en entrée de transformation) instance de ce métamodèle.
A vos marques, prêt partez, démarrez Eclipse Modeling Tools (voir le tutoriel sur l'installation dans l'article "Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language) pour voir la vraie vie").
- Optez pour la perspective "Modeling"
- File - New - Other - Eclipse Modeling Framework - Ecore Modeling Project
- Name - MetaModeleFamilies - Next - Next
- Sélectionnez tous les viewpoints qui permettent d'avoir par la suite toutes les fonctionnalités (diagrammes, tables, documentation, génération d'éditeurs, ...) - Finish
Vous obtenez dans votre projet, 3 fichiers :
- metaModeleFamilies.aird
- metaModeleFamilies.ecore
- metaModeleFamilies.genmodel
Un nouveau plugin Sirius, développé en collaboration avec la société Obeo, que nous n'avons pas encore installé (mais ça ne serait tardé), permet à votre modèle d'être accessible par tous les éditeurs de votre projet.
Les "viewpoint" sont différentes représentations de votre métamodèle Ecore :
- Clic droit sur le projet - Viewpoints Selection permet de choisir des représentations (sélectionnez les 4 : Archetype, Design, Generation et Review)
Toutes ces représentations sont stockées dans le fichier .aird
- Clic droit sur le EPackage metaModeleFamilies de metaModeleFamilies.ecore - New Representation permet d'avoir le metaModeleFamilies class diagram, ...
- Même chose pour metaModeleFamilies.genmodel
Un modèle d'un autre projet peut être chargé :
- Sous le projet MetaModeleFamilies - Project Dependencies - Clic droit - Add model
Pour créer un diagramme à partir d'un fichier Ecore :
- Clic droit sur le fichier Ecore - Initialize Ecore Diagram ...
- Design Entities - platform ... - sélectionnez votre métamodèle Ecore - Nommez votre diagramme de classe
- Un diagramme de classe vide est alors créé.
- Clic droit dans le diagramme de classe - Add related Elements - Sélectionnez toutes les classes du métamodèle Ecore existant.
- La 1ère icône en haut à gauche du diagramme Arrange all permet de mieux disposer les éléments de modélisation mais pas dans le cas où il y aurait plusieurs relations entre 2 classes, elles apparaîtront toutes superposées, il vous faudra mettre la main à la pâte pour les séparer !
- L'Entities Diagram Editor permet de créer, de modifier et de visualiser le métamodèle Ecore. Mais attention, il n'est pas synchronisé automatiquement avec toutes les EClasses du EPackage, mais seulement celles qui ont été sélectionnées soit par drag&drop du Model Explorer dans le diagramme, soit par Add de la palette ou bien encore par le menu contextuel Add Related Elements.
Sinon vous vous pouvez ajouter des EClasse, ... grâce à la Palette dans un nouveau fichier Ecore vide :
- Drag&Drop Eclasse dans le diagramme
- Pour modifier les propriétés soit directement dans la vue Properties, soit en double cliquant sur la EClasse.
- Nommez votre EClasse Family
Pour ajouter un attribut et le typer :
- Double cliquer sur le fichier Ecore (.ecore)
- Dans l'onglet "metaModeleFamilies.ecore", dans le package puis dans la classe "Family", clic droit New Child - EAttribute
- Sélectionner le nouvele attribut "null"
- Dans la vue Properties, dans EType, sélectionner EString et dans Name saisir "lastName " (si vous ne mettez pas de type, la validation du modèle ne se fait pas et la classe reste en rouge !)
De la même manière créez la classe Member avec l'attribut fisrtName.
Créez les relations bi-directionnelles (voir le diagramme en début de cet article).
- Sélectionnez dans la palette Relation - Bi-directionnal Reference
- Modifiez directement dans le diagramme, d'abord coté Family puis Member, les cardinalités et les rôles en cliquant dans les zones des rôles et en saisissant la cardinalité par ex. 0..* et le libellé du rôle
- Sélectionnez la relation - Containment dans les Properties pour avoir une relation de composition entre le composite Family et ses composants Member.
Dans l'icône Layers en haut du diagramme, si Validation est cochée alors une erreur dans le modèle (par exemple un oubli de typer un attribut) provoque l'affichage en rouge de l'élément erroné (dans ce cas la classe de l'attribut).
En laissant la souris un moment sur l'élément en rouge, un tooltip apparaît mentionnant la cause de l'erreur.
Pour visualiser la sérialisation XMI du métamodèle metaModeleFamilies.ecore :
Clic droit - Open With - Text Editor
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="metaModeleFamilies" nsURI="http://www.example.org/metaModeleFamilies"
nsPrefix="metaModeleFamilies">
<eClassifiers xsi:type="ecore:EClass" name="Family">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="lastName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="father" lowerBound="1"
eType="#//Member" containment="true" eOpposite="#//Member/familyFather"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="mother" lowerBound="1"
eType="#//Member" containment="true" eOpposite="#//Member/familyMother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="sons" upperBound="-1" eType="#//Member"
containment="true" eOpposite="#//Member/familySon"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="daughters" upperBound="-1"
eType="#//Member" containment="true" eOpposite="#//Member/familyDaughter"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Member">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="firstName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyFather" eType="#//Family"
eOpposite="#//Family/father"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyMother" eType="#//Family"
eOpposite="#//Family/mother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familySon" eType="#//Family"
eOpposite="#//Family/sons"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyDaughter" eType="#//Family"
eOpposite="#//Family/daughters"/>
</eClassifiers>
</ecore:EPackage>
Une fois le métamodèle Families conforme au métamétamodèle Ecore finalisé, il ne reste plus qu'à générer un modèle d'instances.
- Double cliquez sur le fichier metaModeleFamilies.genmodel
- Clic droit sur la racine - Generate All (les classes Java + les 2 éditeurs sous forme de nouveaux plugins Eclipse servant à la création du modèle)
- Vérifiez que les classe Java sont générées dans src (3 packages suivant le pattern de la programmation par contrat : interfaces, implémentations et utilitaires).
- 3 projets sont créés : MetaModeleFamilies.edit , MetaModeleFamilies.editor, MetaModeleFamilies.tests
Exécuter le premier éditeur :
- Clic droit sur MetaModeleFamilies.edit - Run As - Eclipse Application
- Un nouvel Eclipse se lance.
- Créez un projet vide : File - New - Project (dans General) - Nommez le ModeleFamilies
- Clic droit sur le projet - File - New - Example EMF Model Creation Wizards - Sélectionnez votre métamodèle MetaModeleFamilies Model - Next - sélectionnez votre projet ModeleFamilies - Nommez votre modèle : PremierModele.metamodelefamilies (remarquez l'extension correspondant à votre métamodèle) - Next - Model Object : Family (le composite) - Finish
- Dans la fenêtre de l'éditeur - Sélectionnez Family (sous la racine platform) - dans Properties : LastName=Dupond - Clic droit - New Child : Father Member - FisrtName=Jean
- Répéter la même opération pour les autres membres de la famille : mère=Alexandra, 1er fils=Pierre, 2ème fils=Paul, 1ère fille=Louane, 2ème fille=Manon
- Sauvegarder Tout
- Clic droit sur le fichier PremierModele.metamodelefamilies - Open With - Text Editor et vérifier que l'on a bien la sérialisation XMI désirée :
<metaModeleFamilies:Family xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:metaModeleFamilies="http://www.example.org/metaModeleFamilies" lastName="Dupond">
<father firstName="Jean"/>
<mother firstName="Alexandra"/>
<sons firstName="Pierre"/>
<sons firstName="Paul"/>
<daughters firstName="Louane"/>
<daughters firstName="Manon"/>
</metaModeleFamilies:Family>
Ce fichier peut servir en entrée de notre transformation ATL de nos précédents articles.
"Les femmes détestent les hommes trop prévisibles, elles adorent un certain coefficient de surprise."
Antonio Lobo Antunes
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
A découvrir aussi
- Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language), le "Da Vinci code" de la transformation ATL
- Cours complet sur ATL (ATLAS Transformation Language) : les énumérations
- Cours complet sur ATL (ATLAS Transformation Language) : les “Matched Rules”, le pattern élément cible (4/5)
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 769 autres membres