Réunion du 02/07/2008
Ordre du jour
- Exposé de Domnica sur son travail
- Définition de l' implémentation dans WComp des connecteurs
synchrones
Compte Rendu
Participants
Annie Ressouche, Gaetan Rey, Stéphane Lavirotte,
Jean-Yves Tigli, Vincent Hourdin, Valérie Roy, Domnica Pavel,
Vivien Fighiera.
Domnica a fait un exposé sur l' état d'avancement de ses travaux.
Elle a présenté le langage
synchrone LS
dédié à la définition de
connecteurs synchrones complexes qui décrivent la gestion des accès
multiples aux composants de WComp. Elle a aussi présenté
la sémantique
du langage qui donne une définition précise du comportement des
connections (programmes LS) et qui guidera l'implémentation à faire.
slides de la présentation.
|
rapport intermédiare.
|
Définition de l' implémentation dans WComp des connecteurs complexes
Nous avons défini une première implémentation des travaux de
Domnica dans WComp
(voir le compte rendu de Vivien)
Rappels sur WComp
Caractéristiques d'un connecteur
Actuellement WComp permet de créer des connecteurs standards entre les
diffèrents composants. Un connecteur standard est caractérisé par:
- un composant émetteur;
- un composant récepteur;
- l'événement associé qui est émis par le composant
émetteur;
- le nom de la méthode du composant cible à invoquer;
- les arguments de cette méthode, via des accesseurs du composant
émetteur.
Voici une commande exemple simple d'ajout d'un connecteur standard dans WComp:
AddLink(composantEmetteur, composantRecepteur, evenementAssocie, methodeAInvoquer,
{accesseur1, accesseur2,..., accesseurn})
Traitement d'un événement
Un événement est géré de la manière suivante:
- un événement est émis à partir du composant
émetteur (voir 1 du schéma ci-dessous)
- les valeurs des arguments sont récupérées, via l'appel aux
accesseurs du composant émetteur (voir 2 du schéma)
- la méthode du composant cible est invoquée (voir 3 du schéma)
Evolution de WComp
Connecteur complexe
Le but est d' étendre le connecteur standard de WComp. En effet l'objectif est de
pouvoir connecter un ou plusieurs composants émetteurs d' événements
et un ou plusieurs composants récepteurs. Ce type de connecteur est appelé
"connecteur complexe".
Caratéristique d'un connecteur complexe
Un
connecteur complexe est caractérisé de la manière suivante:
- un ensemble de composants émetteurs ou de composants dont on
utilise des accesseurs: C1......Cn;
- un ensemble de composants récepteurs: C'1....C'm;
- une logique de déclenchement décrivant quand les invocations des
méthodes des
composants récepteurs seront déclenchées:
B(Ci[ej]);
- un ensemble de méthodes à invoquer avec leur composant associé.
Cela correspond
à la logique de contrôle réactive du connecteur complexe:
R(C'i.mj.
Cette logique pourra être décrite avec la version actuelle du langage
LS (voir partie 4 de cette section);
- une liste ordonnée des accesseurs pour chacun des paramètres de
chacune des
méthodes invoquées: Ci.mj(Pk) avec
Pk = Cl.getP().
Voici une commande d'ajout d'un connecteur complexe qui en résulterait :
AddLink({composantEmetteur1,..., ComposantEmetteurn},
{composantRecepteur1,..., composantRecepteurm},
logiqueDeDeclenchement, {methodeAInvoquer1, ...,
methodeAInvoquerk}, { accesseur1, accesseur2,
..., accesseurl}).
Fonctionnement d'un connecteur complexe
Un connecteur complexe est décomposé:
-
d'un composant (A sur le schéma ci dessous) qui a pour tâche de
vérifier que la logique de déclenchement est validée. Pour cela
il capte les événements émis par les composants émetteurs.
Si la logique de déclenchement est respectée, ce composant
déclenche
un événement qui provoque l'appel à la méthode du composant B qui
gère la logique de contrôle réactive du connecteur complexe;
- un composant (B sur le schéma) gère la logique de contrôle
réactive du connecteur complexe. Il émet des événements
pour les différentes invocations de méthode des composants
récepteurs.
- chacun de ces événements est récupéré par un
composant (C sur le schéma). Son rôle consiste à récupérer
les paramètres effectifs pour chaque méthode invoquée, via
des accesseurs. Puis ce composant provoque un appel à la méthode du composant
récepteur correspondant avec les paramètres attendus.
Implémentation d'un connecteur complexe dans WComp
Pour ajouter pratiquement un connecteur complexe dans WComp, nous allons
suivre les étapes suivantes:
- Ajout des différents composant dans WComp
Cette étape consiste à ajouter les différents composants
dans WComp. Pour cela les commandes suivantes sont exécutées:
AddComponent(composantA)
AddComponent(composantB)
AddComponent(composantC1)
.....
AddComponent(composantCn)
- Ajout des connecteurs entre les composants émetteurs et
celui de déclenchement
La seconde étape consiste à ajouter les connecteurs entre
les composants émetteurs et le composant responsable de la logique de
déclenchement (composant A). Les liaisons réalisées lors de
cette étape dépendent de la logique de déclenchement.
Voici les commandes qui résultent si tous les composants interviennent
dans la logique de déclanchement:
AddLink(composantEmetteur1, composantA, evenementAssocie1,
methodeComposantA1)
.....
AddLink(composantEmetteurn, composantA, evenementAssocien,
methodeComposantAn)
- Ajout du connecteur entre le composant de déclenchement et celui
de control réactif
La troisième étape consiste à construire le connecteur entre le composant
responsable de la logique de déclenchement et celui responsable de la logique
réactive:
AddLink(composantA, composantB, evenementComposantA, methodeComposantB)
- Ajout des connecteurs entre le composant de control réactif et
ceux de collecte des paramètres
La quatrième étape consiste à connecter le composant responsable
de la logique de contrôle réactive aux composants responsables de la
collecte des paramètres. La construction de ces liens dépend des
méthodes invoquées des composants récepteurs.
Si chacun des composants doit collecter un paramètre on obtient:
AddLink(composantB, composantC1, evenementComposantB1,
methodeComposantC1)
....
AddLink(composantB, composantCn, evenementComposantBn,
methodeComposantCn)
- Ajout des connecteurs de collecte des paramètres
Cette cinquième étape consiste à construire les connecteurs
permettant aux composants responsables de la collecte des paramegrave;tres de
réaliser cette collecte. Ces liens dépendent des méthodes
invoquées des composants récepteurs. Si pour l'invocation de
chaque méthode d'un composant récepteur il faut utiliser un accesseur,
alors les commandes WComp qui en résultent sont les suivantes:
AddLink(composantC1, composantEmetteur1,
evenementAccesseur1, accesseur1)
...
AddLink(composantCn, composantEmetteurn,
evenementAccesseurn, accesseurn)
- Ajout des connecteurs d'invocation des méthodes des composants
récepteurs
Cette dernière étape consiste à connecter les composants responsables
de la collecte des param$egrave;tres aux composants récepteurs. Les commandes
WComp correspondantes sont:
AddLink(composantC1, composantRecepteur1,
evenementInvocationRecepteur1, methodeRecepteur1)
.....
AddLink(composantCn, composantRecepteurn,
evenementInvocationRecepteurn, methodeRecepteurn)
Le langage LS
Le langage LS permet de décrire et formalise les connecteurs complexes.
Voici sa grammaire. Sa sémantique
est décrite dans le rapport intermédiaire le la
section.
Par exemple, le langage LS possède un opérateur de connection (=>)
qui permet d'associer un évènement à une méthode.
Cette instruction est traduite dans WComp de la façon suivante:
Un élément important de ce langage est que sa sémantique s'appuie
sur la terminaison des appels de méthodes. Cet exemple de code LS illustre
cette nécessité: I1 >> I2
(>> est l'opérateur de séquence de LS).
Le code LS précédant indique d'exécuter l'instruction
I2 une fois l'instruction I1 terminée.
Pour exécuter l'instruction I2 il savoir quand la
première instruction s'est terminée. Le meilleur moyen d'avoir
cette information est d'utiliser un booléen de terminaison pour chaque instruction.
En l'état actuel, le langage LS permet de décrire un connecteur standard ou
la logique de contrôle réactive d'un connecteur complexe. Dans les deux cas,
le langage ne permet pas de réaliser des appels à des accesseurs.
Pour pallier à ce manque, des extensions de ce langage seront progressivement
réalisées.
Points à clarifier
Le cas d'un événement dont les valeurs des paramètres de la
méthode à invoquer sont directement passées en paramètre.
En l'état actuel, WComp permet uniquement de récupérer les valeurs
des paramètres en utilisant des accesseurs qui n'ont pas de paramètres.
On voudrait pouvoir créer un connecteur du type suivant:
Cela pose le problème de son application pour un connecteur complexe. En effet dans
ce cas, les données des paramètres transmises par l'événement
sont récupérées par le composant responsable de la logique de
déclenchement du connecteur (A sur le schéma ci-dessous). Cependant, ce
sont les composants dont le rôle consiste à récupérer les
paramèl;tres (C sur le schéma) qui on besoin de ces valeurs.
Une solution consisterait à utiliser un type de composants supplémentaires
(D sur le schéma ci-dessous). Sa raison d'être serait d'extraire les
données contenues par les paramètres des événements émis
par les composants émetteurs. Ils doivent aussi permettre aux composants responsables
de la collecte des données de les récupérer. En dernier lieu ils doivent
transmettre les événements qu'ils re&ccdeil;oivent, sans leurs
données, au composant responsable de la logique de déclenchement.
L'introduction de cette extension du connecteur complexe provoque une modification de la
formalisation du connecteur. Cette extension induit la formalisation suivante :
- un ensemble de composants émetteurs ou de composants dont on
utilise des accesseurs: C1......Cn;
- un ensemble de composants récepteurs: C'1....C'm;
- une logique de déclenchement décrivant quand les invocations des
méthodes des
composants récepteurs seront déclenchées:
B(Ci[ej]);
- un ensemble de méthodes à invoquer avec leur composant
associé.
Cela correspond
à la logique de contrôle réactive du connecteur complexe:
R(C'i.mj.
Cette logique pourra être décrite avec la version actuelle du langage
LS (voir partie 4 de cette section);
- une liste ordonnée des accesseurs pour chacun des paramètres de
chacune des
méthodes invoquées: Ci.mj(Pk) avec
Pk = Cl.getP() ou Dp.
Travaux futurs
Définir le fonctionnement de la logique de déclenchement.
C'est-à-dire la définir formellement ainsi que son traitement.