• Aucun résultat trouvé

userM3 : spécification de la syntaxe concrète

8.5 Fonctionnement général

8.5.2 userM3 : spécification de la syntaxe concrète

Le userM3 pour spécifier la syntaxe concrète de son langage de méta-modélisation crée trois composants primitifs de type ConcreteSyntaxType : componentSC, connectorSC et agregationSC. Il les rajoutent respectivement dans component, connector et agrega- tion. Les composants componentSC, connectorSC et agregationSC fournissent une inter- face ConcreItf puisqu’ils sont du type ConcreteSyntaxType. Les principales méthodes qui doivent être implantées dans componentSC, connectorSC et agregationSC sont :

– isLink() : permet de savoir si au niveau M2 le concept concerné est une liaison ou une classe (au sens UML) ;

– getRepresentation() : dans le cas où isLink() retourne false, getRepresentation() doit être implantée pour définir la représentation du concept concerné au niveau M2 ;

– getLinkRepresentation(int x, int y, int cx, int cy, Graphics g) : dans le cas où isLink() retourne true, getLinkRepresentation() doit être implantée pour définir la représentation du concept concerné au niveau M2 ;

– isModelLink() : qui va permettre de savoir si au niveau M1 le concept concerné est une liaison ou une classe ;

– getModelRepresentation(Element e) : dans le cas où isModelLink() retourne false, getModelRepresentation()doit être implantée pour définir la représentation par dé- faut du concept concerné au niveau M1 ;

– getModelLinkRepresentation(int x, int y, int cx, int cy, Graphics g) : dans le cas où isModelLink() retourne true, getModelLinkRepresentation() doit être implantée pour définir la représentation du concept concerné au niveau M1 ;

– isInChargeOfModelComputeClosestBorder() : il se pose le problème des points de connexion entre une liaison et un concept. Ces points de connexion doivent pouvoir être définis autant au niveau M2 qu’au niveau M1. Toutefois, la nécessite d’avoir des points de connexion prédéfinis est beaucoup moins importante lorsqu’on défini un méta-modèle. C’est pourquoi au niveau M2 nous avons choisi de définir les points de connexion par défaut1. Par contre pour le niveau M1, nous permettons à userM3 de définir des points de connexion pour des liaisons au niveau M1. Lorsque la méthode isInChargeOfModelComputeClosestBorder retourne true, cela signifie

8.5. FONCTIONNEMENT GÉNÉRAL 100 que la méthode suivante computeModelClosestBorder sera appelée pour le calcul des points de connexion. Sinon c’est le DrawingArea qui se chargera de trouver les points de connexion de cette liaison ;

– computeModelClosestBorder(MyLink l) : l représente une référence vers un objet de type MyLink qui est une structure de donnée permettant de représenter les liai- sons d’un méta-modèle . Si isInChargeOfModelComputeClosestBorder() retourne true, userM3 doit implanter la méthode computeModelClosestBorder(MyLink l) qui va déterminer quel est le point de connexion sur la source et le point de connexion de la liaison sur la destination. Remarquons au passage que l’éditeur de dessin du Dra- wingArea permet de spécialiser la représentation d’un élément d’un méta-modèle et de définir des points de connexion sur ces représentations. Ces points pourront ensuite être utilisés par la méthode computeModelClosestBorder.

Syntaxe concrète de component

UserM3 implante les méthodes requises pour la syntaxe concrète du concept com- ponentde la façon suivante :

– isLink() : retourne false, un component ne sera pas une liaison au niveau M2. – getRepresentation() : userM3 implante cette méthode de telle sorte qu’elle renvoie

un JPanel dans lequel il a dessiné un rectangle (Cf. Figure 8.13). JPanel que le DrawingArea pourra afficher et manipuler dans sa zone de dessin ;

– isModelLink() : retourne false, un component ne sera pas une liaison au niveau M1 ; – GetModelRepresentation() : n’est pas implantée, ce qui signifie que ce sera à userM2

d’assigner une représentation graphique (avec l’éditeur de dessin) pour le niveau M1 à chaque élément de type component de ses langages (Figure8.14).

Syntaxe concrète de connector

UserM3 implante la syntaxe concrète d’un connector qui est exactement la même que celle d’un component. La seule différence étant la couleur du rectangle renvoyé par getRepresentation()pour ce concept au niveau M2.

Syntaxe concrète d’agregation

UserM3 implante les méthodes requises pour la syntaxe concrète du concept agrega- tionde la façon suivante :

– isLink() : retourne true, une agregation sera une liaison au niveau M2.

– getLinkRepresentation(int x, int y, int cx, int cy, Graphics g) : dans cette méthode userM3 va utiliser la référence du Graphics utilisé par le DrawingArea qui lui est

FIGURE 8.13 – 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