Query View Transform (QVT) Operational : tutoriel, plus simple tu meurs !
Mes derniers articles sont consacrés au langage de transformation de modèles ATL (Atlas Transformation Language).
Voir par exemple le tutoriel complet :
ou bien le cours complet qui commence :
ATL est un langage opensource, largement utilisé utilisé dans l'industrie. Son implémentation est robuste et performante. Et surtout il existe des outils fiables comme le plugin pour Eclipse.
Mais ATL n'est pas une norme.
Son concurrent à l'avantage d'être une norme de l'OMG Object Management Group , l'organisation qui a fait notamment UML, MDA, ...
Il s'agit de QVT (Query View Transform). Il existe 2 types de QVT : QVTd (déclaratif, diisé en QVTr Relation et QVTc Core), équivalent des "matched rules" ATL et QVT Operational (impératif), équivalent des "called rules" ATL.
QVT avec son pédigré, pourrait être "La Solution" ultime pour transformer des modèles.
Seulement voilà, comme très souvent dans les normes, QVT souffre d'une grande complexité.
Mais il y a pire ! Les outils l'implémentant sont rares et incomplet. Seul QVTo commence à être implémenté alors que QVT-Relation est à l'état d'embryon.
Eclipse propose un plugin pour QVT Operational et un autre non finalsé pour QVT Relation.
Pour l'installer :
- http://projects.eclipse.org/projects/modeling.mmt.qvt-oml/downloads
- Décompressez le zip dans un répertoire.
- Dans Eclipse, allez dans le menu Help - Install new software - Add - Local - sélecionnez le répertoire - nommez et OK
N'échapperons pas à la règle de commencer par le traditionnel "Hello world" que font tous les débutants dans un langage.
Tout d'abord le métamodèle source et cible dans notre cas de tutoriel "plus simple tu meurs", voici son fichier Ecore (ABC.ecore) :
<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="ABC" nsURI="http:///ABC.ecore" nsPrefix="ABC">
<eClassifiers xsi:type="ecore:EClass" name="Root">
<eStructuralFeatures xsi:type="ecore:EReference" name="element" upperBound="-1"
eType="#//Element" containment="true"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="A" eSuperTypes="#//Element">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="a" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="B" eSuperTypes="#//Element">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="b" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="C" eSuperTypes="#//Element">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="c" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Element" abstract="true">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="abc" upperBound="-1" eType="#//Element"
containment="true"/>
</eClassifiers>
</ecore:EPackage>
Créer un nouveau projet : File - New - Project - Eclipse Modeling Framework -Empty EMF Project
Clic droit sur ABC.ecore - Initialize ecore diagram : pour générer le diagramme du modèle, cela ne peut pas faire de mal !
Double clic droit sur ABC.genmodel - clic droit sur ABC (2 ème icône dans la hiérarchie) - Generate All
Clic droit sur le projet - run As - Run Configurations - onglet Arguments - VM arguments :
-Dosgi.requiredJavaVersion=1.6 -Xms256m -Xmx768m -XX:MaxPermSize=256m
puis Run
Une nouvelle instance d'Eclipse se lance pour exécuter le nouveau plugin.
File - New - Project - Model to Model Transformation - Operational QVT Project.
Nommez votre projet
Ecrire le source de la transformation :
transformation NewTransformation(in source:ABC, out target:ABC);
main() {
source.rootObjects()[Root]->map Root2Root();
}
mapping Root :: Root2Root() : Root {
element += self.element->select(a |
a.oclIsKindOf(A))[A]->map A2B();
}
mapping A :: A2B() : B
when {
self.id > 0
}
{
result.id := self.id;
result.b := self.a + " World!";
}
A est transformé en B, en utilisant le même id et en concaténant l'attribut "a" à la chaîne "World" pour créer l'attribut "b".
Créer le modèle à transformer :
Clic droit sur le projet - New - Other - Example EMF Model Creation Wizards - ABC Model
Double clic sur le modèle vide - clic droit sur Root - New chlid - ajouter et modifier dans la vue Properties :
- A: id=1, A=”Hello”
- A: id=-1, A=”World”
- C: id=1, C=”C'est quoi ce truc ?”
Pour exécuter la transformation :
Clic droit sur le fichier de transformation (.qvto) - Run As - Run Configuration - Operational QVT Interpreter - New_configuration - Run
Le modèle transformé se trouve dans le fichier "sortie.abc" :
"La vraie valeur d'un homme réside, non dans ce qu'il a, mais dans ce qu'il est."
Oscar Wilde
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 : métamodèle de mindmap, en veux tu en voilà
- Cours complet sur ATL (ATLAS Transformation Language) : introduction aux règles ATL
- Cours complet sur ATL (ATLAS Transformation Language) : les règles paresseuses (Lazy Rules)
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 769 autres membres