urbanisation-si

urbanisation-si

Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language), le "Da Vinci code" de la transformation ATL

ingenierie-dirigee-par-les-modeles-IDM-tutoriel-ATL-execution-06.png

L'objectif de cet article est de vous montrer les principes de base d'une transformation de modèles avec ATL (ATLAS Transformation Language).

Si comme moi, cela fait longtemps que vous n'avez pas codé dans un langage, n'ayez crainte, je vous fourni tous les sources et vous n'aurez qu'à les copier-coller alors bon courage.

Sélectionnez le projet Families2Persons créé lors d'un article précédent avec les 2 métamodèles Families.ecore et Persons.ecore (voir la série de l'été 2015 consacrée à ATL).

  1. File - New - Other - ATL - ATL File - File name = Families2Persons.atl
  2. Next
  3. Input Models - Add - Model Name = laissez IN par défaut - Metamodel Name = Families - Browse Workspace = Families.ecore
  4. Output Models - Add - Model Name = laissez OUT par défaut - Metamodel Name = Persons - Browse Workspace = Persons.ecore

Ouvrez le fichier Families2Persons.atl avec l'éditeur de source, vous devez avoir :

-- @path Families=/Families2Persons/Families.ecore -- @path Persons=/Families2Persons/Persons.ecore

module Families2Persons;
create OUT : Persons from IN : Families;

Appliquons les bonnes pratiques de programmation consistant à créer des services (ou fonction, en ATL on parle de helpers comme dans Java).

Les 1er helper regarde si une occurrence de Membre est liée à un familyMother de type Family ou familyDaughter dans ce cas le helper isFemale() renvoie true et false dans le cas contraire.

Le 2ème helper retourne le lastName de tous les membres de la famille : père, mère, fils ou filles.

helper context Families!Member def: isFemale(): Boolean =
	if not self.familyMother.oclIsUndefined() then
		true
	else
		if not self.familyDaughter.oclIsUndefined() then
			true
		else
			false
		endif
	endif;
helper context Families!Member def: familyName: String =
	if not self.familyFather.oclIsUndefined() then
		self.familyFather.lastName
	else
		if not self.familyMother.oclIsUndefined() then
			self.familyMother.lastName
		else
			if not self.familySon.oclIsUndefined() then
				self.familySon.lastName
			else
				self.familyDaughter.lastName
			endif
		endif
	endif;

Pour finir, on ajoute 2 règles pour créer les "Person" : "Male" ou "Female" :

La règle Member2Male regarde si l'occurrence considérée n'est pas "Female" en appelant le helper précédent, crée une nouvelle instance de Male, concatène le "firstName" et "familyName" dans le fullName de la super classe abstraite Person  de Male.

La règle Member2Female fait la même chose mais pour "Female" bien sur.

rule Member2Male {
	from
		s: Families!Member (not s.isFemale())
	to
		t: Persons!Male (
			fullName <- s.firstName + ' ' + s.familyName
		)
}
rule Member2Female {
	from
		s: Families!Member (s.isFemale())
	to
		t: Persons!Female (
			fullName <- s.firstName + ' ' + s.familyName
		)
}

Créez le fichier des instances de Family et Member dans le projet Families2Persons :

  1. File - New - File - sample-Families.xmi avec le contenu suivant :
<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Families">
	<Family lastName="March">
		<father firstName="Jim"/>
		<mother firstName="Cindy"/>
		<sons firstName="Brandon"/>
		<daughters firstName="Brenda"/>
	</Family>
	<Family lastName="Sailor">
		<father firstName="Peter"/>
		<mother firstName="Jackie"/>
		<sons firstName="David"/>
		<sons firstName="Dylan"/>
		<daughters firstName="Kelly"/>
	</Family>
</xmi:XMI>

Suspens, reste à exécuter la transformation ATL :

  1. Clic droit sur le fichier Families2Persons.atl - Run As - Run Configuration - ATL Transformation - Families2Persons 
  2. Onglet ATL Configuration
  3. Source Models - IN = clic sur Workspace - Families2Persons - sample-Families.xmi
  4. Target Models - OUT = clic sur Workspace - Families2Persons - saisir le nom de fichier sample-Persons.xmi qui contiendra le résultat de la transformation.
  5. Pour ne pas à refaire la configuration de l'exécution : clic sur l'onglet Common
  6. Sélectionner Shared file - Browse -  Families2Persons

Le suspens est à son comble : clic sur Apply puis sur Run

Le résultat se trouve dans le fichier sample-Persons.xmi qui doit ressembler à ceci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns="Persons">
	<Male fullName="Jim March"/>
	<Male fullName="Brandon March"/>
	<Male fullName="Peter Sailor"/>
	<Male fullName="David Sailor"/>
	<Male fullName="Dylan Sailor"/>
	<Female fullName="Cindy March"/>
	<Female fullName="Brenda March"/>
	<Female fullName="Jackie Sailor"/>
	<Female fullName="Kelly Sailor"/>
</xmi:XMI>

Voilà fin du suspens et fin de notre 1ère saison sur ATL qui se termine avec un "happy end" à l'américaine.  

 

"La meilleure façon de combattre le mal est un progrès résolu dans le bien."
Lao-Tseu

 

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/

http://bonnes-pratiques-si.eklablog.com/

http://urbanisation-si.eklablog.com/



10/08/2015
1 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 132 autres membres