• Aucun résultat trouvé

Mod´elisation des aspects dynamiques du contexte

5.5 Instanciation et configuration du syst`eme

5.5.4 Mod´elisation des aspects dynamiques du contexte

Les constructions pr´esent´ees jusqu’ici ne permettent que de mod´eliser la structure statique du contexte, et les ´evolutions des attributs. Elles ne permettent pas de sp´ecifier les ´evolutions de la structure mˆeme du contexte. Pour cela, nous introduisons deux nouvelles constructions bas´ees sur la notion de gabarit (template).

Branches conditionnelles simples

La premi`ere construction permet de d´efinir une branche de l’arborescence dont l’apparition est condi- tionn´ee par une expression bool´eenne. Pour cela, il suffit d’utiliser un ´el´ement xml if contenant une arborescence de ressources et d’attributs normaux (voire d’autres branches conditionnelles). Cet ´el´ement ifposs`ede un attribut test qui d´efinit une expression quelconque du mˆeme type que celles utilis´ees pour d´efinir les attributs synth´etiques.

Par exemple :

<!-- La valeur bool´eenne d’une ressource ou d’un attribut est vrai ssi celui-ci existe. --> <if test="sys://devices/usb/mouse">

<resource name="mouse"> ...

</resource> </if>

<if test="sys://devices/usb/keyboard or sys://devices/ps2/keyboard"> <resource name="keyboard">

... </resource> </if>

La s´emantique de cette construction est la suivante. Lorsqu’une telle branche est d´efinie, le syst`eme observe les ´evolutions de l’expression d´efinie par l’attribut test.

– Si la valeur de l’expression, convertie en bool´een, devient true (soit initialement, soit apr`es avoir ´et´e false), alors le syst`eme instancie le gabarit comme si les tags <if ...> et </if> n’apparaissaient pas dans le texte.

– Si la valeur de l’expression, convertie en un bool´een, devient false, alors le syst`eme supprime du contexte (ou, initialement, ignore) les ressources contenues `a l’int´erieur, exactement comme si tout l’´el´ement if et son contenu n’´etaient pas pr´esents.

Bien entendu, `a chaque changement, le syst`eme g´en`ere les ´ev´enements appropri´es pour permettre aux clients de r´eagir `a ces ´evolutions.

Il est tout `a fait possible d’imbriquer les gabarits. Dans ce cas, un gabarit qui est inclus dans un autre ne sera pris en compte par le syst`eme que si ce dernier est instanci´e, et si le gabarit englobant disparaˆıt, tout son contenu disparaˆıt avec lui, qu’il soit statique ou dynamique.

Branches conditionnelles multiples

La seconde construction dynamique est en fait une g´en´eralisation de la premi`ere, qui permet un nombre quelconque d’instanciations d’un gabarit param´etr´e par une variable.

Pour cela, on utilise l’´el´ement xml foreach. Celui-ci poss`ede deux attributs : 1. variable, qui sp´ecifie un nom de variable, utilis´e pour param´etrer le gabarit ;

2. et in, qui sp´ecifie une expression dont la valeur doit ˆetre un ensemble de ressources ou d’attributs. <foreach variable="device" in="sys://devices/usb/*">

<resource name="..."> ...

</resource> </foreach>

La s´emantique de foreach est similaire `a celle de if, except´e que le syst`eme instancie une branche pour chaque ´el´ement de l’ensemble retourn´e par l’expression in. Puisque la valeur de cette expression peut varier dynamiquement, de nouvelles branches peuvent apparaˆıtre ou d’anciennes branches disparaˆıtre en cours d’ex´ecution. Avant d’ˆetre instanci´ee, la branche correspondant `a un ´el´ement donn´e est transform´ee par le syst`eme :

– Si l’expression renvoie un ensemble de ressources, les occurences de la variable d´esign´ee dans l’at- tribut variable, sous la forme $var, sont remplac´ees par le nom de la ressource correspondant `a la branche.

– Si l’expression renvoie un ensemble d’attributs, les occurences de $var sont remplac´ees par le nom de l’attribut, et les occurences de $var_value sont remplac´ees par sa valeur.

Ces variables peuvent ˆetre utilis´ees soit dans le contenu d’attributs soit `a l’int´erieur d’´el´ements xml. Il est ainsi possible de faire d´ependre la structure d’une partie du contexte de la valeur de certaines expressions (en particulier de certains attributs). Imaginons par exemple qu’une application d´epende d’informations concernant les syst`emes de fichiers de son hˆote. Il n’est pas possible de construire statique- ment une description g´en´erique de ces informations, car le nombre et le type de disques et de syst`emes de fichiers varie d’un syst`eme `a l’autre, voire varie dynamiquement pour un syst`eme donn´e (branchement `a chaud d’un disque dur externe par exemple). Cependant, avec les nouvelles constructions que nous avons introduites, ce probl`eme peut se r´esoudre de la mani`ere suivante :

1. Le programmeur d´efinit une sonde g´en´erique interrogeant le syst`eme pour connaˆıtre la liste des syst`emes de fichiers disponibles14. `A chaque fois qu’elle est interrog´ee, cette sonde renvoie une liste

de couples (nom partition, point montage), par exemple (hda1, ”/”), (hda2, ”/home”). 2. Il ajoute ensuite cette sonde `a une ressource abstraite filesystems.

3. `A l’int´erieur de cette ressource, il sp´ecifie un gabarit foreach de la fa¸con suivante :

<foreach variable="partition" in="@*">

<resource name="$partition"> <!-- Remplac´e par le nom de l’attibut: hda1, hda2... --> <sensor name="fs" class="org.obasco.wildcat.sensors.FileSystemSensor">

14

En pratique, ce genre de sonde g´en´erique peut ˆetre cod´e une fois pour toute et r´eutilis´e directement par de nombreuses applications.

<configuration>

<device>$partition</device> <!-- Remplac´e par hda1, hda2... --> </configuration>

<schedule><periodic period="10000"/></schedule> </sensor>

<!-- $xxx_value est remplac´e par la valeur de l’´el´ement, ici "/", "/home"... --> <attribute name="mount_point">$partition_value</attribute>

</resource> </foreach>

L’expression utilis´ee, .@* renvoie l’ensemble des attributs de la ressource filesystems, en l’occurrence @hda1, @hda2 (notons qu’il s’agit bien des attributs, pas de leurs valeurs). Une nouvelle branche est donc cr´e´ee pour chacun de ces ´el´ements, en utilisant le gabarit. Pour chacune de ces branches, la variable $partitionest substitu´ee par la valeur appropri´ee :

– Lorsque la variable est utilis´ee l`a o`u une expression est attendue, comme par exemple dans la d´efinition de l’attribut mount point, la valeur utilis´ee est directement la valeur de la variable, ici un attribut ; on doit utiliser la fonction value() pour r´ecup´erer la valeur d’un attribut.

– Lorsque la variable est utilis´ee en dehors d’un tel contexte, la valeur utilis´ee est le nom de l’´el´ement. C’est le cas par exemple dans la d´efinition du nom de la ressource `a instancier.

Dans notre exemple, le r´esultat initial serait donc : <resource name="hda1">

<attribute name="mount_point">"/"</attribute>

<!-- Plus les attributs sp´ecifiques `a la sonde configur´ee pour observer hda1. -->

</resource>

</resource name="hda2">

<attribute nape="mount_point">"/home"</attribute>

<!-- Plus les attributs sp´ecifiques `a la sonde configur´ee pour observer hda2. -->

</resource>

Si maintenant l’utilisateur introduit un CD-ROM, la sonde associ´ee a la ressource filesystems renverra un nouvel attribut (hdc, ”/mnt/cdrom”). R´ealisant cela, le syst`eme instanciera donc une troisi`eme fois le gabarit pour obtenir :

<resource name=’hdc’>

<attribute nape=’mount_point’>"/mnt/cdrom"</attribute>

<!-- Plus les attributs sp´ecifiques `a la sonde configur´ee pour observer hdc. -->

</resource>

Bien entendu, cette ressource disparaˆıtra en mˆeme temps que l’attribut correspondant, lorsque l’uti- lisateur ´ejectera le CD-ROM.

5.5.5

Conclusion

Dans cette section, nous avons pr´esent´e l’impl´ementation standard de la notion de domaine contex- tuel fournie par WildCAT. Cette impl´ementation est g´en´erique et peut ˆetre configur´ee `a l’aide d’un fichier xml. La structure de ce fichier correspond `a la structure voulue du contexte, except´ee en ce qui concerne les ´evolutions dynamiques. Pour g´erer cet aspect, nous avons introduit deux constructions : l’une per- met d’avoir des branches de l’arborescence dont l’existence dans le contexte en conditionn´ee par une expression ; l’autre – g´en´eralisation de la premi`ere – utilise une notion de gabarit param´etr´e par une variable et qui peut ˆetre instanci´e par le syst`eme un nombre quelconque de fois, nombre qui peut varier dynamiquement.