• Aucun résultat trouvé

Partie III : Une architecture de mise en œuvre 103

9.4 Notre solution pour la mise en œuvre du dépôt de schémas d’interactions

9.4.2 Interfaces de base

10: BadOperationReason reason; 11: }; 12: 13: interface ISRObject 14: { 15: // read interface

16: readonly attribute ObjectKind kind;

17:

18: // write interface

19: void destroy () raises (BAD_OPERATION);

20: };

21: };

FIG. 9.10 –Interface commune à tous les objets de dépôt

schéma d’interactions (représenté par un objet Repository), un dossier (représenté par un objet Folder), une définition d’un schéma d’interactions (représentée par un objet InteractionScheme), une règle d’in-teraction (représentée par un objet InteractingRule), ou une opération réactive (représentée par un objet Operation).

UnScopedNameest un nom composé d’un ou de plusieurs identificateurs séparés par les caractères “::”. Un tel nom correspond à un nom qualifié du langage ISL. Un nom qualifié est dit absolu s’il commence par les caractères “::”. Il décrit de manière non ambigu un objet de dépôt dans un dépôt de schéma d’interactions. Un nom qualifié est dit relatif s’il ne commence pas par les caractères “::”. Son nom complet doit être résolu relativement à un contexte.

UnObjectKindidentifie le type réel d’un objet de dépôt et donc la méta-information contenue par cet objet de dépôt.

9.4.2 Interfaces de base

Plusieurs interfaces CORBA sont utilisées comme interfaces de base pour les objets de dépôt de l’ISR. Ces interfaces ne sont pas instanciables.

Un ensemble commun de fonctions est utilisé pour localiser les objets de dépôt dans le dépôt de schémas d’interactions (et donc les méta-informations). Ces fonctions sont définies dans les interfaces ISRObject,Container, etContaineddécrites ci-après. Tous les objets de dépôt héritent de l’interfaceISRObject qui fournit un moyen d’identifier le type réel de l’objet (et donc le type réel de la méta-information qu’il contient). Les objets de dépôt qui sont des conteneurs d’autres objets de dépôt (tels que les dossiers) héritent des fonctions de navigation de l’interface Container. Les objets contenus dans ces conteneurs héritent des fonctions de navigation de l’interface Contained.

Interface commune à tous les objets de dépôt

L’interface de baseISRObjectreprésente l’interface la plus générique supportée par tous les objets de dépôt (figure 9.10). Toutes les autres interfaces sont dérivées de ISRObject.

L’attributkindidentifie le type exact de la méta-information (c’est-à-dire le type de l’objet de dépôt). La fonctiondestroydétruit l’objet de dépôt (il cesse d’exister) et les méta-informations qu’il possède. Si cet objet est un conteneur (c’est-à-dire s’il dérive de l’interface Container) alors la fonctiondestroyest appliquée sur tout le contenu. Si l’objet de dépôt qui doit être détruit se trouve contenu dans un conteneur alors il est supprimé de ce conteneur.

Si la fonctiondestroyest invoquée sur un objet de dépôtRepository(c’est-à-dire que l’on essaye de détruire la racine du dépôt de schémas d’interactions) alors l’exception BAD_OPERATIONest déclenchée avec notRemoveablecomme raison. Si la suppression d’un objet de dépôt provoque une incohérence au sein du

dépôt de schémas d’interactions (par exemple la suppression d’un schéma d’interactions dont d’autres schémas d’interactions dérivent) alors l’exceptionBAD_OPERATIONest déclenchée avechasDependencycomme raison.

Interface commune à tous les

«

contenants

»

L’interface de baseContainedest héritée par toutes les interfaces des objets de dépôt qui sont contenus dans d’autres objets de dépôt. Tous les objets du dépôt de schémas d’interactions excepté l’objet racine (Repository) et les définitions des comportements réactifs du langage ISL sont contenus dans d’autres objets de dépôts. L’interfaceContainedest présentée par la figure 9.11.

Un objet contenu dans un autre objet dispose d’un attribut namequi permet de l’identifier de manière unique dans le conteneur. Modifier l’attribut namepermet de changer l’identité de l’objet de dépôt dans son conteneur. Une exception système BAD_PARAM est déclenchée, avec 3 comme code d’erreur (minor code), si un objet avec la même valeur pour l’attribut nameexiste déjà dans l’objet de dépôt conteneur.

Il dispose également d’un attributownerqui permet d’identifier le propriétaire de la méta-information contenue dans l’objet de dépôt. Modifier l’attribut ownerpermet de changer le propriétaire d’une méta-information (par exemple pour rendre partagée la définition d’un schéma d’interactions). Une exception systèmeBAD_PARAMest déclenchée, avec 2 comme code d’erreur, si la nouvelle valeur de l’attribut ownerne correspond à aucun propriétaire déclaré auprès du dépôt de schémas d’interactions.

1: module CosInteraction 2: {

3: typedef string Login;

3: typedef sequence <Container> ContainerSeq; 4:

5: enum CannotProceedReason

6: {

7: nameAlreadyExist, badType, badLogin, notRemoveable

8: }; 9: 10: exception CANNOT_PROCEED 11: { 12: CannotProceedReason reason; 13: }; 14:

15: interface Contained : ISRObject

16: {

17: // read/write interface

18: attribute Identifier name;

19: attribute Login owner;

20:

21: // read interface

22: readonly attribute Container definedIn;

23: readonly attribute ScopedName absoluteName;

24: 25: struct Description 26: { 27: ObjectKind kind; 28: any value; 29: }; 30: 31: Description describe (); 32: ContainerSeq within (); 33: 34: // write interface

35: void move (in Container newContainer, in Identifier newName) raises (CANNOT_PROCEED);

36: };

37: };

Les objetsContaineddisposent d’un attributdefinedInqui identifie le conteneur dans lequel l’objet est contenu. Les objets peuvent être contenus par un conteneur soit parce qu’ils sont définis avec ce dernier (par exemple, les règles d’interaction définies dans un schéma d’interactions sont contenues dans l’objet de dépôt décrivant les méta-informations du schéma d’interactions), soit parce qu’ils sont hérités par le conteneur (des règles d’interaction peuvent être contenues par un objet de dépôt décrivant un schéma d’interactions parce que le schéma d’interactions hérite d’un autre schéma d’interactions qui définit ces règles d’interaction). Si un objet est contenu dans un conteneur par héritage, l’attribut definedInidentifie l’objet de dépôt dont il est hérité.

L’attribut absoluteName est un nom qualifié absolu qui identifie l’objet contenu de manière unique dans le dépôt de schémas d’interactions représenté par un objet Repository. Si l’attributdefinedInde cet objet désigne l’objet de dépôt Repository, la valeur de l’attribut absoluteNameest la concaténation de la chaîne “::” et du contenu de son attributname. Dans les autres cas, la valeur de l’attribut absoluteNameest la concaténation de la valeur de l’attributabsoluteNamedu conteneur référencé par l’attributdefinedIn, de la chaîne de caractères “::”, et du contenu de l’attribut name.

La fonctiondescribe renvoit une structure contenant les méta-informations stockées par l’objet de dépôt. La description de la structure exacte associée à chaque type d’objet de dépôt est fournie lors de la définition de l’interface IDL du type de l’objet de dépôt. Le champ kindde la structureDescription retournée fourni le type de l’objet le plus approprié vis-à-vis des énumérations définies dans ObjectKind et le champvaluecontient, sous la forme d’un objet any, les méta-informations décrites par le type de l’objet de dépôt.

La fonctionwithinrenvoie la liste des objets conteneurs dans lesquels est contenu l’objet de dépôt. Si l’objet de dépôt désigne un dossier ou un schéma d’interactions alors il ne peut être contenu que par un unique conteneur qui est nécessairement un objet de dépôt désignant un dossier (ou l’objet de dépôtRepositoryreprésentant le dépôt de schémas d’interactions lui-même). Les autres objets de dépôt peuvent être contenus par les objets qui les définissent et par ceux qui en héritent (par exemple un objet de dépôt décrivant les méta-informations d’une règle d’interation est contenu par l’objet de dépôt décrivant le schéma d’interactions qui l’a définie mais aussi par tous les objets de dépôt décrivant les méta-informations des schémas d’interactions héritant de ce schéma d’interactions).

La fonctionmovedéplace l’objet de dépôt de son conteneur actuel vers un autre objet de dépôt conte-neur. Elle enlève automatiquement l’objet de dépôt de son conteneur actuel, et l’ajoute dans le conteneur spécifié parnewContainer. Afin que la cohérence du dépôt de schémas d’interactions soit toujours vérifiée après le déplacement de l’objet de dépôt, elle doit respecter les conditions suivantes :

– Le nouveau conteneur doit être en mesure de contenir le type de l’objet de dépôt. Si ce n’est pas le cas l’exceptionCANNOT_PROCEEDest déclenchée avecbadTypecomme raison.

– Le nouveau conteneur ne doit pas déjà contenir un objet de dépôt ayant la même valeur pour l’attributname. Si cette condition n’est pas respectée l’exceptionCANNOT_PROCEEDest déclenchée avec nameAlreadyExistcomme raison.

– Si l’objet de dépôt ne peut pas être supprimé de son conteneur actuel (car sa suppression provo-querait une incohérence du dépôt de schémas d’interactions) alors l’exception CANNOT_PROCEEDest déclenchée avecnotRemoveablecomme raison.

L’attributnameest modifié ennewName. Les attributsdefinedInetabsoluteNamesont mis à jour pour refléter le nouveau conteneur et le nom. Si l’objet de dépôt est aussi un conteneur alors l’attribut absoluteNamede tous les objets qu’il contient sont également mis à jour.

Interface commune à tous les conteneurs

L’interface de baseContainerest utilisée pour mettre en œuvre une hiérarchisation des contenus tout en offrant une interface commune de navigation au sein des conteneurs. Un conteneur peut contenir un nombre quelconque d’objets de dépôt dérivés de l’interface Contained. Tous les conteneurs, excepté le conteneurRepository, sont aussi dérivés de l’interfaceContained(ils sont tous contenus dans un autre conteneur). L’interfaceContainerest présentée par la figure 9.12.

La fonctionlookuprenvoie un objet de dépôt contenu dans le conteneur à partir de son nom qualifié (relativement au conteneur). L’utilisation d’un nom qualifié absolu (c’est-à-dire débutant par “::”) per-met de renvoyer un objet de dépôt à partir de la racine du dépôt de schémas d’interactions. Si aucun objet de dépôt n’est trouvé, une référence sur l’objet nil est renvoyée.

1: module CosInteraction 2: {

3: typedef sequence <Contained> ContainedSeq; 4:

5: interface Container : ISRObject

6: {

7: // read interface

8: Contained lookup (in ScopedName searchName);

9: ContainedSeq lookupName (in Identifier searchName, in long levels2Search, in ObjectKind limitKind, in boolean excludeInherited);

10:

11: ContainedSeq contents (in ObjectKind limitKind, in boolean excludeInherited); 12: 13: struct Description 14: { 15: Contained containedObject; 16: ObjectKind kind; 17: any value; 18: }; 19:

20: typedef sequence <Description> DescriptionSeq; 21:

22: DescriptionSeq describeContents (in ObjectKind limitKind, in boolean excludeInherited, in long maxItems);

23: };

24: };

FIG. 9.12 –Interface commune à tous les conteneurs

La fonction contentsrenvoie la liste des objets contenus ou hérités par l’objet de dépôt conteneur. Cette fonction permet de naviguer à travers la hiérarchie des objets de dépôt. En commençant la re-cherche à l’objet de dépôtRepository, un client peut utiliser cette fonction pour lister tous les objets de dépôt (et donc toutes les méta-informations) contenus dans le dépôt de schémas d’interactions.

Lorsque le paramètre limitKinda la valeurisrAll, tous les objets du conteneur sont retournés. Si le paramètrelimitKinda la valeur d’un type d’objet de dépôt spécifique, seuls les objets de dépôt de ce type sont renvoyés. Le paramètreexcludeInheritedpermet de spécifier si les objets de dépôt qui sont contenus dans le conteneur par héritage sont, ou ne sont pas, renvoyés par la fonction.

La fonction lookupNamepermet de localiser un objet de dépôt, grâce à son nom, dans un conteneur spécifique ou dans les objets de dépôt contenus par ce conteneur. Elle permet, grâce au paramètre level2Search, d’indiquer la profondeur de la recherche. Lorsque ce paramètre vaut 1 alors la recherche est cantonnée à l’objet de dépôt du conteneur courant, lorsqu’il est supérieur à 1, la recherche s’effectue récursivement (la profondeur de récurrence est définie par la valeur exacte du paramètre) dans les conte-neurs contenus dans le conteneur courant. Une valeur de -1 ne limite pas la profondeur de la recherche. Les paramètreslimitKindetexcludeInheritedont la même sémantique que pour la fonctioncontents.

La fonctiondescribeContentscombine la fonctioncontentsetdescribe(définie par l’interfaceContained). Pour chaque objet de dépôt renvoyé par la fonctioncontents, la description de l’objet est renvoyée (c’est-à-dire que la fonctiondescribeest appelée et le résultat renvoyé).