Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language), concevez les métamodèles avant de passer aux choses sérieuses
Dans les articles précédents nous avons vu que la transformation de modèles nécessitent que ceux-ci soient décrits par des métamodéles et qu'à leur tour les métamodéles le soient par un métamétamodéle en l'occurrence "Ecore" d'Eclipse pour le langage auquel nous nous intéressons : ATL (ATLAS Transformation Language).
Maintenant qu'Eclipse Modeling Tools, Papyrus et ATL sont installés, il est grand temps de passer aux choses sérieuses.
Si on se réfère à MDA (Model Driven Architecture), la norme de l'OMG (Object Management Group) pour les transformations de modèles, une des composantes de ce framework est le MOF (Meta Object Facility) qui décrit les 4 niveaux de modélisation : M0 la vraie vie (les objets avec leur état), M1 modèle, M2 métamodèle et M3 métamétamodèle auto décrit .
On part de la vraie vie c'est à dire des objets (par exemple la facture du 26/01 du client Martin), puis on remonte d'un niveau d'abstraction, au niveau modèle (les classes Facture et Client) puis encore plus abstrait avec le méta modèle (on modélise le modèle : par ex. en urbanisation du Système d'Information, on trouve : le métamodèle du niveau métier, le métamodèle du niveau fonctionnel, le métamodèle du niveau applicatif) puis enfin ça se termine avec le métamétamodèle du MOF où tout est représenté sous forme de Classe.
Pour récapituler, dans notre tutoriel consacré à ATL, le métamétamodèle est Ecore d'Eclipse, le métamodèle source est Families, le métamodèle cible est Persons.
Le modèles source est décrit dans le fichier sample-Families.xmi et est conforme au métamodèle Families et le modèle cible résultat de la transformation est décrit dans sample-Persons.xmi conforme au métamodèle Persons.
En fait fait les modèles à transformer correspondent au niveau M0 objet du MOF, mais comme dans IDM tout est modèle, on peut aussi les considérer au niveau M1 modèle.
Alors commençons et comme dans tous les environnements, AGL ou autres, il faut créer un projet et Eclipse Modeling Tools n'échappe pas à la règle :
- Menu Window - Open Perspective - Other - ATL
- File - New - ATL Project - Project name = Families2Persons
Créez le métamodèle source Families.ecore.
- Clic droit sur le projet - New - Other - Eclipse Modeling Framework - Ecore Model - File name = Families.ecore
- Affichez la vue Properties : Window - Show View - Other - General - Properties
- Nommez la racine du fichier : Families
Créez la classe Family :
- Clic droit sur la racine - New Child - EClass - dans la vue properties : Name = Family
- Créez les attributs de la classe Family : clic droit sur la classe - New Child - EAttribute - Name = lastName - EType = EString - Lower Bound = 1 et Upper Bound = 1
Créez la classe Member de la même manière avec l'attribut firstName (EString).
Après les classes et les attributs, reste les relations :
- Clic droit sur Family - New Child - EReference - Name = Father - EType = Member - EOpposite = familyFather : Family - Lower Bound = 1 - Containment = true
- Idem pour mother et pour sons, daughters il faut modifier les multiplicités : Lower Bound = 0 et Upper Bound = -1 (signifie * identique à 0 ou pluseurs).
- Mettre les rôles du coté Member : familyFather - EType = Family - EOpposite = father : Member - Containment = false - Lower Bound = 0 - Upper Bound = 1
Créer le métamodèle cible Persons.ecore de la même manière que précédemment.
Créez la classe abstraite Person sous la racine Persons avec :
- l'attribut fullName (EString) et la multiplicité 1..1.
- la propriété Abstract = true
Créez les classes Male et Female et mettre la propriété ESuper Types = Person pour spécifier qu'elles héritent de la classe Person.
Voilà qui nous permettra d'écrire nos règles de transformation mais suspens jusqu'au prochain article.
Si vous ne voulez pas faire toutes ces manipulations, vous pouvez ouvrir votre fichier Families.ecore vide avec le Text Editor et copier-coller le contenu ci-dessous (idem pour Persons .ecore)
Families.ecore
<?xml version="1.0" encoding="ISO-8859-1"?>
<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="Families">
<eClassifiers xsi:type="ecore:EClass" name="Family">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="lastName" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="father" ordered="false"
lowerBound="1" eType="#//Member" containment="true" eOpposite="#//Member/familyFather"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="mother" ordered="false"
lowerBound="1" eType="#//Member" containment="true" eOpposite="#//Member/familyMother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="sons" ordered="false" upperBound="-1"
eType="#//Member" containment="true" eOpposite="#//Member/familySon"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="daughters" ordered="false"
upperBound="-1" eType="#//Member" containment="true" eOpposite="#//Member/familyDaughter"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Member">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="firstName" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyFather" ordered="false"
eType="#//Family" eOpposite="#//Family/father"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyMother" ordered="false"
eType="#//Family" eOpposite="#//Family/mother"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familySon" ordered="false"
eType="#//Family" eOpposite="#//Family/sons"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="familyDaughter" ordered="false"
eType="#//Family" eOpposite="#//Family/daughters"/>
</eClassifiers>
</ecore:EPackage>
Persons.ecore
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI 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">
<ecore:EPackage name="Persons">
<eClassifiers xsi:type="ecore:EClass" name="Person" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="fullName" ordered="false"
unique="false" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Male" eSuperTypes="#/0/Person"/>
<eClassifiers xsi:type="ecore:EClass" name="Female" eSuperTypes="#/0/Person"/>
</ecore:EPackage>
</xmi:XMI>
"Gagner sa vie ne vaut pas le coup, attendu qu'on l'a déjà. Le boulot y en a pas beaucoup, faut le laisser à ceux qui aiment ça."
Coluche
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) : un exemple vaut mieux qu'un long discours
- Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language) pour voir la vraie vie
- Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language), le "Da Vinci code" de la transformation ATL
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 754 autres membres