• Aucun résultat trouvé

Méthode getRepresentation() de ComponentSc

passé en paramètre pour dessiner une liaison allant du point (x,y) au point (cx, cy). Il dessine également à l’extrémité (cx, cy) un losange (symbole généralement utilisé pour les agrégations) ;

– isModelLink() : retourne true, une agregation sera une liaison au niveau M1 ; – getModelLinkRepresentation(int x, int y, int cx, int cy, Graphics g) : n’est pas

implantée parce qu’au niveau modèle une agregation n’aura pas de représentation graphique. Par contre, mettre une agregation entre deux éléments e1 et e2 au niveau modèle aura une incidence sur les coordonnées de ces éléments. Cette action est implantée dans computeModelClosestBorder(MaLiaison l) ;

– computeModelClosestBorder(MyLink l) : lorsque userM2 assigne une représenta- tion graphique à un component ou à un connector à l’aide de l’éditeur de dessin du DrawingArea, il peut également définir des points de connexions qui pourront éventuellement être utilisés par des liaisons. La méthode computeModelClosestBor- der(MyLink l)d’agregationSC va trouver les points de connexions les plus proches entre l’élément source et l’élément cible de la liaison l. Ensuite, elle attribue à ces deux points les mêmes coordonnées dans la zone de dessin du DrawingArea. Cela aura pour effet visuel de "coller" l’élément source de la liaison à sa cible ou inver- sement.

À chacun de ces trois composants de type ConcreteSyntaxType, userM3 ajoute des pro- priétés qui seront visibles dans la table des propriétés au niveau méta-modèle ou au niveau modèle. Par exemple une propriété "name" de type String, propriété qui permettra d’assi- gner un nom au concept associé au niveau méta-modèle et dont la valeur devra apparaître sur la représentation du concept. Une propriété "abstract" de type booléen qui permettra à userM3 d’autoriser ou non qu’un concept de type component ou connector présent au niveau M2 le soit au niveau M1.

8.5. FONCTIONNEMENT GÉNÉRAL 102

8.5.3

userM3 : spécification de la sémantique

Le userM3 pour spécifier la sémantique de son langage de méta-modélisation va créer trois composants composites de type SemanticType : componentSem, connector- Sem et agregationSem. Il crée ensuite pour chacun d’eux, deux composants primitifs : M2Semanticet M1Semantic qui vont implanter respectivement la sémantique du concept associé au niveau méta-modèle et sa sémantique au niveau modèle. On aura alors les composants componentMMSem, componentMSem, connectorMMSem, connectorMSem, agregationMMSemet agregationMSem qui fournissent tous une interface SemanticItf. Les principales méthodes de SemanticItf qui doivent être implantées par ces composants pri- mitifs sont :

– isConnectable(Element from, Element to) : cette méthode est appelée sur les concepts de type liaison. Elle permet de vérifier si les éléments from et to peuvent être reliés par la liaison sur qui est appelée cette méthode ;

– validateCreation(Element myself, Vector<Element> elements) : permet à userM3 de spécifier des contraintes qui doivent être vérifiées à la création d’un concept ; – validateModification(Vector<Attribut> attributs, Hashtable<String, String []> pro-

pertiesToDisplay) : permet à userM3 de spécifier des contraintes qui doivent être vérifiées à la modification d’un concept ;

– makeTool(Element myself) : permet à userM3 de spécifier si un concept présent au niveau M2 doit être présent au niveau M1 ou non. Si oui, cette méthode renvoie un itempour ce concept, item qui sera intégré dans la palette de l’éditeur de modèles. Comme nous le verrons dans le méta-modèle de Fractal dans le chapitre suivant, il y a des composants qui sont abstraits et qu’on ne désire pas avoir dans la palette de l’éditeur de modèles (niveau M1). userM3 peut contrôler cela par des propriétés.

Sémantique component

UserM3 implante les méthodes requises pour la sémantique du concept component au niveau méta-modèle (M2Semantic) de la façon suivante :

– validateCreation(Element myself, Vector<Element> elements) : dans cette mé- thode, userM3 vérifie par exemple l’unicité de la propriété name ;

– validateModification(Vector<Attribut> attributs, Hashtable<String, String []> pro- pertiesToDisplay) : dans cette méthode, userM3 vérifie par exemple que les valeurs que userM2 assigne aux propriétés name et abstract respectent les types de ces propriétés ;

– makeTool(Element myself) : Dans cette méthode, userM3 retourne un item pour myself qui sera rajouté dans la palette de l’éditeur de modèles.

Sémantique connector

UserM3 implante la sémantique d’un connector qui est exactement la même que celle d’un component.

Sémantique agregation

UserM3 implante les méthodes requises pour la sémantique au niveau M2 du concept agregation:

– isConnectable(Element from, Element to) : au niveau M2, userM3 souhaite qu’une agregationne soit autorisée qu’entre un élément de type component et un élément de type connector. Dans cette méthode userM3 vérifie que from et to soient bien un élément de type component pour l’un et un élément de type connector pour l’autre. Sinon la méthode renvoi false et la liaison n’est pas autorisée ;

– validateCreation(Element myself, Vector<Element> elements) : vérifie par exemple l’unicité de la propriété name dans le méta-modèle en cours d’édition ;

– validateModification(Vector<Attribut> attributs, Hashtable<String, String []> pro- pertiesToDisplay) : UserM3 a ajouté une propriété minFrom et une propriété max- Fromau concept agregation. Ces propriétés représentent les cardinalités d’une agre- gation. Dans cette méthode userM3 vérifie que les valeurs que userM2 assigne aux propriétés minFrom et maxFrom sont positives ou égales à -1 ;

– makeTool(Element myself) : dans notre exemple, userM3 autorise qu’un item soit créé dans la palette de l’éditeur de modèles pour chaque agregation définie au ni- veau M2.

Au niveau M1 la sémantique d’une agregation consistera essentiellement en la vérifi- cation des valeurs des propriétés.

Nous allons maintenant dérouler le fil d’exécution pour que userM2 arrive à implanter le DSML décrit à la Figure8.12(a).

8.5.4

UserM2 : Spécification de la syntaxe abstraite

Pour créer un élément component dans la zone de dessin de l’éditeur de méta-modèle, userM2 clique sur le bouton component dans la palette. Le DrawingArea enregistre alors le composant component encapsulé dans ce bouton comme étant le composant courant. Lorsque userM2 clique ensuite dans la zone de dessin, le DrawingArea utilise les API Fractal pour récupérer le sous composant concreteSyntax du composant courant. Dans notre cas ce sera le composant componentSC. Le DrawingArea récupère ensuite l’inter- face serveur ConcreteItf de componentSC et appelle sa méthode isLink() pour savoir si

8.5. FONCTIONNEMENT GÉNÉRAL 104 userM2 veut créer une liaison ou une classe. isLink() de componentSC renvoie false. Le DrawingAreaappelle alors la méthode getRepresentation() de ComponentSC qui lui ren- voie un JPanel dans lequel est dessiné un rectangle. JPanel que le DrawingArea va alors ajouter à l’endroit où userM2 a cliqué dans la zone de dessin. Ensuite, le DrawingArea utilise les API Fractal pour récupérer le sous composant semantic du composant courant. Ce sera le composant componentSem. Il récupère ensuite le sous composant M2Semantic de componentSem et obtient le composant componentMMSem. Enfin, il récupère l’inter- face serveur SemanticItf de componentMMSem et appelle sa méthode validateCreation qui va vérifier la contrainte d’unicité de nom pour l’élément de type component nouvel- lement créé. userM2 attribue la valeur "composant" à la propriété name de l’élément de type component nouvellement créé.

UserM2 clique ensuite sur le bouton connector, et tout le processus précédent est ré- pété, mais cette fois ci avec comme composant courant, le composant connector. userM2 attribue la valeur "service" à la propriété name de l’élément de type connector nouvel- lement créé. Le DrawingArea appelle alors la méthode validateModification de connec- torMMSemqu’il a récupéré lors de la création du nouvel élément connector. validateMo- dificationde connectorMMSem va autoriser la valeur "service".

Lorsque userM2 clique maintenant sur le bouton agregation pour créer une agrega- tionentre l’élément composant créé et l’élément service. Le même mécanisme s’opère, le DrawingArea récupère l’interface ConcreteItf d’agregationSC et appelle sa méthode isLink(). La méthode isLink() de agregationSC renvoyant true, le DrawingArea va alors attendre le deuxième clic de l’utilisateur parce que c’est une liaison que userM2 veut créer. Il récupère ensuite l’interface SemanticItf du composant agregationMMSem de la même façon que pour l’élément composant. Le DrawingArea récupère les éléments sur lesquels userM2 a cliqué dans la zone de dessin et les passent en paramètre de la méthode isConnectabled’agregationMMSem. Si isConnectable retourne true alors le DrawingA- reaappelle la méthode getLinkRepresentation d’agregationSC en lui passant en paramètre les coordonnées des points où l’utilisateur a cliqué ainsi que le Graphics permettant de dessiner dans la zone de dessin du DrawingArea. getLinkRepresentation d’agregationSC va donc dessiner une ligne allant du premier point au deuxième, ainsi qu’un losange au niveau du deuxième point.

Chaque élément créé au niveau M2 possède une référence vers l’interface ConcreteItf du sous composant de type SyntaxConcreType du composant à partir duquel il a été créé, ainsi qu’une référence vers l’interface SemanticItf de son sous composant M2Semantic et une référence vers l’interface SemanticItf de son sous composant M1Semantic.

8.5.5

userM2 : spécification de la syntaxe concrète

Pour assigner une représentation graphique à l’élément composant de son langage, userM2 sélectionne d’abord cet élément à l’aide du bouton selection de la palette. Ensuite, il clique sur le bouton schematic qui va ouvrir l’éditeur de dessin du DrawingArea, éditeur

représenté à la Figure 8.14. userM2 dessine ou importe l’image d’un carré arrondi et orange qui sera la représentation de tous les éléments de ce type au niveau modèle. Il y spécifie également deux points de connexion sur la face latérale gauche du carré. L’éditeur de dessin retourne un JPanel qui contient la représentation graphique spécifiée par userM2.