urbanisation-si

urbanisation-si

Cours complet sur ATL (ATLAS Transformation Language) : les “Matched Rules”, le pattern élément cible (4/5)

cours-complet-atl-atlas-transformation-language-matched-rule-pattern-cible-4.gif

 

Dans l'article précédent :

//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 :

 

feature_name <- exp

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 :

 

 

rule Journal2Book {
      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:

  1. Le “title” du “Book” correspond au  “title” du  “journal” concaténé avec “vol” et num;
  2. Le “chapters” du “Book” correspond aux éléments de modèle qui seront générés à partir de “articles” de “Journal”;
  3. L’entité “authors” de “Book” correspond à tous les “authors” des différents “articles” de “Journal” sans doublon;
  4. 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 :

  1. Référence à un élément de modèle cible généré dans la règle courante;
  2. Référence à un élément par défaut de modèle cible d’une autre règle;
  3. 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.

 

rule Case1 {
      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 :

 

rule Case2_R1 {
      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 :

 

 

rule Case3_R1 {
      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 :  

 

create OUT1 : MM_B, OUT2 : MM_B from ... ;
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 :  

 

//urbanisation-si.wix.com/blog

//urbanisme-si.wix.com/blog

//urbanisation-si.wix.com/urbanisation-si

//urbanisation-si.over-blog.com/

//rhonamaxwel.over-blog.com/

//urbanisation-des-si.blogspot.fr/

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

//urbanisation-si.eklablog.com/



11/10/2015
0 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 107 autres membres