Cours complet sur ATL (ATLAS Transformation Language) : les “Matched Rules”, le pattern élément cible (4/5)
Dans l'article précédent :
https://www.urbanisation-si.com/cours-complet-sur-atl-atlas-transformation-language-les-matched-rules-la-section-des-variables-locales-35
nous avion abordé les “Matched Rules” (les règles de correspondance) et la section des variables locales. Voyons à présent la section du pattern élément cible.
Le pattern élément cible (4/5)
La section "to" correspond au pattern cible de la règle, contenant les patterns des éléments cibles.
Cette section est obligatoire et possède au moins un pattern d’élément cible, séparés par une virgule s’il y en a plusieurs.
ATTENTION : le 1er pattern correspond au pattern par défaut de la règle.
Dans ATL, il existe 2 types de pattern d’élément cible : le simple et l’itératif (les patterns itératifs d’éléments sont obsolètes et sont remplacés par les “lazy rules”) .
Chaque pattern correspond à une variable déclarée par son nom ( out_vari) et son type ( out_typei).
Le pattern simple est spécifié comme un “set” de liens définissant la manière dont l’entité (les attributs ou les références) des éléments générés doivent être initialisés.
Syntaxe pour l’initialisation :
Le nom de l’entité initialisée doit se référer à une variable associée à un pattern d’élément cible.
L’expression ( exp) est une expression OCL.
S’il y a plusieurs liens, on les sépare par des virgules.
Il est fortement recommandé d’initialiser les entités plutôt que de se reposer sur le mécanisme par défaut qui peut varier suivant le gestionnaire de modèle utilisé pour accéder aux éléments de modèle.
Exemple complet :
from
j : Biblio!Journal
to
b : Biblio!Book (
title <- j.title + '_(' + j.vol + '):' + j.num,
authors <- j.articles
->collect(e | e.authors)->flatten()->asSet()
chapters <- j.articles,
pagesNb <- j.articles->collect(e | e.pagesNb)->sum()
)
}
Cettte règle génère un élément du modèle Book à partir d’un élément de modèle Journal. Elle initialise les entités title, authors, chapters et pagesNb de l’élément Book cible:
- Le “title” du “Book” correspond au “title” du “journal” concaténé avec “vol” et num;
- Le “chapters” du “Book” correspond aux éléments de modèle qui seront générés à partir de “articles” de “Journal”;
- L’entité “authors” de “Book” correspond à tous les “authors” des différents “articles” de “Journal” sans doublon;
- L’attribut “pagesNb” est initialisé avec la somme des nombres de page (pagesNb) de tous les articles du modèle source “Journal”.
3 cas d’assignation possible :
- Référence à un élément de modèle cible généré dans la règle courante;
- Référence à un élément par défaut de modèle cible d’une autre règle;
- Référence à un élément de modèle cible d’une autre règle.
Premier cas : la reference est simplement initialisée avec l’élément local correspondant à l’élément du modèle cible.
from
i : MM_A!ClassA
to
o_1 : MM_B!Class1 (
linkToClass2 <- o_2
),
o_2 : MM_B!Class2 (
...
)
}
Deuxième cas :
La reference doit être initialisée avec l’élément de modèle source correspondant à une autre règle. Dans l’exemple suivant, la règle Case2_R1 génère un élément de modèle cible ( o_1) qui a une référence à un élément de modèle cible correspondant au pattern cible par défaut ( o_1) de la règle Case2_R2., à condition que l’élément de modèle source correspondant à Case2_R1 possède une référence ( linkToClassB) à la classe MM_A!ClassB du e l’élément de modèle source :
from
i : MM_A!ClassA
to
o_1 : MM_B!Class1 (
linkToClass2 <- i.linkToClassB
)
}
rule Case2_R2 {
from
i : MM_A!ClassB
to
o_1 : MM_B!Class2 (
...
),
...
}
La reference est initialisée avec l’élément de modèle source correspondant à Case2_R2 quand l’élément de modèle cible MM_B!Class2 est générée.
3ème cas correspondant à initialiser une référence avec un élément de pattern cible non par défaut d’une autre règle.
On utilise alors l’opération resolveTemp() définie dans le context du module ATL. Cette operation permet d’accéder à des éléments de modèle cible associés à des éléments de pattern cible d’une autre règle.
Elle accepte 2 paramètres :
- l’élément de modèle source correspondant à l’autre règle pour générer l’élément de modèle cible
- et le nom de l’élément de pattern cible auquel il est associé.
Exemple :
from
i : MM_A!ClassA
to
o_1 : MM_B!Class1 (
linkToClass2 <- thisModule.resolveTemp(i.linkToClassB, 'o_n')
)
}
rule Case3_R2 {
from
in : MM_A!
to
o_1 : MM_B!Class3 (
...
),
...
o_n : MM_B!Class2 (
...
),
...
}
Quand plusieurs modèles de sortie sont conformes au même métamodèle alors le mot clé in permet de specifier le modèle de sortie.
Exemple :
to
o : MM_B!Class2 in OUT2
"Il est bien des choses qui ne paraissent impossibles que tant qu'on ne les a pas tentées."
André Gide
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 : les métamodèles mindmap, l'embarras du choix !
- Cours complet sur ATL (ATLAS Transformation Language) : introduction aux règles ATL
- Cours complet sur ATL (ATLAS Transformation Language) : les “Matched Rules”, la section des variables locales (3/5)
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 782 autres membres