3 Le langage IDL 3 IDL Un esperanto

  • Slides: 68
Download presentation
3 - Le langage IDL 3. IDL Un « esperanto » pour les objets

3 - Le langage IDL 3. IDL Un « esperanto » pour les objets Le contrat IDL Client d ’objets Stub IDL Bus CORBA Objets Corba © 2000, Mireille Fornarino, E. S. S. I. Fournisseur d ’objets Squelette IDL

Le langage IDL 3. IDL Description Interface Definition Language + langage de spécification d’interfaces,

Le langage IDL 3. IDL Description Interface Definition Language + langage de spécification d’interfaces, supportant l’héritage multiple; 2 indépendant de tout langage de programmation ou compilateur (langage pivot entre applications); + langage utilisé pour générer les stubs, les squelettes et pour définir les interfaces du Référentiel d’interface; 2 la correspondance IDL-langage de programmation est fournie pour les langages C, C++, Java, Smalltalk, Ada, Cobol. © 2000, Mireille Fornarino, E. S. S. I.

IDL versus C++ 3. IDL Description + Grammaire IDL : sous ensemble de la

IDL versus C++ 3. IDL Description + Grammaire IDL : sous ensemble de la grammaire ANSI C++ avec constructions supplémentaires Nouveaux mots clés : attribute interface module oneway readonly sequence any © 2000, Mireille Fornarino, E. S. S. I.

Exemple interface attribut opérations exception opérations © 2000, Mireille Fornarino, E. S. S. I.

Exemple interface attribut opérations exception opérations © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description interface account { readonly attribute float balance; attribute string description; void credit (in float f); void debit (in float f); }; interface current. Account : account { readonly attribute float overdraft. Limit; }; interface bank { exception reject {string reason; }; account new. Account (in string name) raises (reject); current. Account new. Current. Account (in string name, in float limit) raises (reject); void delete. Account (in account a); };

Eléments IDL 3. IDL Description + Une spécification IDL définit un ou plusieurs types,

Eléments IDL 3. IDL Description + Une spécification IDL définit un ou plusieurs types, constantes, exceptions, interfaces, modules, . . . • pragma • constantes • types de base au format binaire normalisé • nouveaux types (typedef, enum, struct, union, array, sequence) • exceptions • types de méta-données (Type. Code, any) © 2000, Mireille Fornarino, E. S. S. I.

Eléments IDL 3. IDL Description + Un module permet de limiter la validité des

Eléments IDL 3. IDL Description + Un module permet de limiter la validité des identificateurs + Interface : ensemble d’opérations et de types =>classe C++ Syntaxe : Interface | [<héritage>] { <interface Body>}; • opération (synchrone ou asynchrone sans résultat) • attribut (possibilité de lecture seule) Surcharge Interdite +Réutilisation de spécifications existantes (#include) © 2000, Mireille Fornarino, E. S. S. I.

Exemple module 3. IDL Description module un. Service { définitions de typedef unsigned long

Exemple module 3. IDL Description module un. Service { définitions de typedef unsigned long Entier. Positif; typedef sequence<Positif> des. Entiers. Positifs; interface Premier { opérations boolean est_premier ( in Entier. Positif nombre); des. Entiers. Positifs nombres_premiers (in Entier. Positif nombre); }; }; module mon. Application { interface Mon. Service { un. Service: : Entier. Positif prochain. Premier(. . ); © 2000, Mireille Fornarino, E. S. S. I.

Exemple © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description

Exemple © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description

Attribut IDL Définition d’attribut interface account { readonly attribute float balance; attribute string description;

Attribut IDL Définition d’attribut interface account { readonly attribute float balance; attribute string description; . . . }; Equivaut à : float get_balance(); string get_description(); void set_description(in string s); © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description

Operations (1/2) 3. IDL Description <une. Opération> : : = <mode. Invocation> <type. Retour>

Operations (1/2) 3. IDL Description <une. Opération> : : = <mode. Invocation> <type. Retour> <identificateur> ‘ (‘ <paramètres> ‘ ) ’ <clauses. Exceptions><clauses. Contextes> + Paramètres nommés et associés à un mode void op 1 (in long input, out long output, inout long both); + Opérations bloquantes par défaut interface account; Client une. Banque new. Account retours © 2000, Mireille Fornarino, E. S. S. I. interface bank { account new. Account (in string name); calcul void delete. Account (in account old); };

3. IDL Opérations (2/2) Description oneway void notify (in string message); +Opération non bloquante

3. IDL Opérations (2/2) Description oneway void notify (in string message); +Opération non bloquante + Pas de paramètre de type out, inout ou d’exceptions + Valeur de retour : void Client une. Banque notify( «ok » ) + Pas d ’exceptions déclenchées. méthode finie © 2000, Mireille Fornarino, E. S. S. I.

3. IDL Exceptions exception reject {string reason; }; account new. Account (in string name)

3. IDL Exceptions exception reject {string reason; }; account new. Account (in string name) raises (reject); exception Date. Erronnee { String raison; }; Description CORBA: : Exception CORBA: : User. Exception CORBA: : System. Exception Des exceptions CORBA standardisées UNKNOWN BAD_PARAM COM_FAILURE INV_OBJREF NO_PERMISSION NO_IMPLEMENT OBJECT_NOT_EXIST ………. Gestion explicite de la part du client © 2000, Mireille Fornarino, E. S. S. I. - 12 -

Définitions circulaires module Circulaire { interface B; interface A { void utiliséB(in B un.

Définitions circulaires module Circulaire { interface B; interface A { void utiliséB(in B un. B); } interface B { void utiliséA(in A un. A); } © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description

Types de base et autres types Types de base • short • long •

Types de base et autres types Types de base • short • long • unsigned short • unsigned long • float • double • char • boolean • octet Méta. Types • …. . . • any • Type. Code © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Description Types construits • struct • union • enum Types génériques • array • sequence • string Types de données dynamiques et auto-descriptifs

Type Any 3. IDL Description interface Pile. De. Chaines { readonly attribut string sommet;

Type Any 3. IDL Description interface Pile. De. Chaines { readonly attribut string sommet; void poser(in string valeur); string retirer(); }; interface Pile. Générique { readonly attribut Any sommet; readonly attribut Type. Code type. Des. Valeurs; void poser(in Any valeur); Any retirer(); }; © 2000, Mireille Fornarino, E. S. S. I. - 15 -

Projection vers un langage de programmation 3. IDL Projection Definitions IDL Client C++ Précompilateur

Projection vers un langage de programmation 3. IDL Projection Definitions IDL Client C++ Précompilateur IDL Serveur Objet implementation Java Methodes Adaptateur d'objet Stubs C++ Squelettes Java Noyau ORB © 2000, Mireille Fornarino, E. S. S. I.

Mapping C++ des modules 3. IDL Projection + traduit en namespace C++ + les

Mapping C++ des modules 3. IDL Projection + traduit en namespace C++ + les modules CORBA contiennent des types prédéfinis des interfaces et des opérations // IDL module M { // définitions }; © 2000, Mireille Fornarino, E. S. S. I. // C++ namespace M { // définitions };

Projections de types élémentaires © 2000, Mireille Fornarino, E. S. S. I. 3. IDL

Projections de types élémentaires © 2000, Mireille Fornarino, E. S. S. I. 3. IDL Projection - 19 -

Projections en C++ et Java 3. IDL Projection • énumération : enum en C++

Projections en C++ et Java 3. IDL Projection • énumération : enum en C++ ; constantes encapsulées dans une classe dont le nom est celui du type énuméré en Java • séquences: encapsulées dans une classe qui contrôle les débordements en C++; des tableaux dynamiques en Java • tableaux : tels que. • Interface : classe C++ ; interface Java interface J: I {…} extends I {…} class J : public virtual I interface J • Opérations : méthodes • Attributs : une ou deux méthodes d ’accès © 2000, Mireille Fornarino, E. S. S. I. - 20 -

Projection en Java : définitions contenues dans une interface Génération d ’un package contenant

Projection en Java : définitions contenues dans une interface Génération d ’un package contenant la traduction des définitions imbriquées IDL : interface Une. Interface{ struct une. Structure {…}; } Java généré : package Une. Interface. Package; public final class Une. Structure{ …} Utilisation : Une. Interface. Package. Une. Structure s = …; © 2000, Mireille Fornarino, E. S. S. I. - 22 -

Passage de paramètres en java 3. IDL Projection // OMG IDL interface Modes {

Passage de paramètres en java 3. IDL Projection // OMG IDL interface Modes { long operation ( in long in. Arg, out long out. Arg, inout long inout. Arg); } //Java interface Modes { int operation(int in. Arg, org. omg. CORBA. Int. Holder out. Arg, org. omg. CORBA. Int. Holder inout. Arg); } //Utilisation Modes m = …; Int. Holder arg. Sortie = new Int. Holder(); Int. Holder arg. ES = new Int. Holder(131); int result = m. operation(57, arg. Sortie, arg. ES); …. arg. Sortie. value…. . © 2000, Mireille Fornarino, E. S. S. I. - 24 -

Mapping C++ des références objet Interface interface A { void op 1 (in long

Mapping C++ des références objet Interface interface A { void op 1 (in long param); }; + traduit en classes C++ + traduit en deux types C++ • A_var Référence sur un objet (instance de classe A) avec gestion automatique de la mémoire. • A_ptr Similaire aux pointeurs C++. © 2000, Mireille Fornarino, E. S. S. I. // C++-used A_ptr a. Ptr; A_var a. Var; a. Var->op 1(2); a. Ptr->op 1(5); 3. IDL Projection

Gestion mémoire : pointeurs en C++ En C++ Gestion difficile car les clients et

Gestion mémoire : pointeurs en C++ En C++ Gestion difficile car les clients et les serveurs sont dans des processus différents. Problèmes : Qui fait l’allocation de la mémoire ? (malloc, new) Qui fait la désallocation de la mémoire ? (delete) interface T { string op 1() }; char* T_i: : op 1() { char* tmp = CORBA: : string_alloc(6); strcpy(tmp, «hello» ); return tmp; }; c «hello» Client © 2000, Mireille Fornarino, E. S. S. I. tmp «hello» Serveur - 26 -

3. IDL Exceptions (1/3) Projection + Définition d'un ensemble d'exception système standardisées : UNKNOWN,

3. IDL Exceptions (1/3) Projection + Définition d'un ensemble d'exception système standardisées : UNKNOWN, BAD_PARAM, NO_MEMORY, etc. . . ; + Possibilité de définir des exceptions propres à l'utilisateur; + Exceptions propagées de l'objet implémentation vers le client; CORBA: : Exception CORBA: : User. Exception exceptions définies dans les IDL © 2000, Mireille Fornarino, E. S. S. I. CORBA: : System. Exception CORBA: : UNKNOWN autres exceptions système standard du bus CORBA

Mapping C++ des exceptions (3/3) 3. IDL Projection Interface IDL Client interface bank {

Mapping C++ des exceptions (3/3) 3. IDL Projection Interface IDL Client interface bank { exception reject {string reason; }; account new. Account (in string name) raises (reject); . . . } bank_var b; . . . try { a = b->new. Account("Bill"); } catch (const bank: : reject& r) { // actions } catch(. . . ) {. . . } © 2000, Mireille Fornarino, E. S. S. I. Objet Implémentation void bank_i: : newaccount (const char* name, CORBA: : Environnement&) {. . . throw bank: : reject ("Impossible to create a new account"); };

Mapping C++ interface room { attribute string name; attribute long number; . . .

Mapping C++ interface room { attribute string name; attribute long number; . . . } Compilateur IDL Client class room : public virtual CORBA: : Object {. . . } Projection Serveur class room _i : public virtual room. Impl, public SDAroom {. . . CORBA: : String* name() { return SDAroom: : name(); } void name (const CORBA: : String& s) { SDAIroom: : name(s); } CORBA: : Long number() { return SDAroom: : number(); } void number(const CORBA: : Long l) { SDAIroom: : number(l); } } class room. Impl : public virtual room {. . . virtual CORBA: : String* name()=0; virtual void name (const CORBA: : String&)=0; virtual CORBA: : Long number()=0; virtual void number(const CORBA: : Long)=0; . . . } © 2000, Mireille Fornarino, E. S. S. I. 3. IDL

Utilisation à partir de C++(1) 3. IDL Utilisation interface Calendrier { attribute Annee annee.

Utilisation à partir de C++(1) 3. IDL Utilisation interface Calendrier { attribute Annee annee. Courante; exception Date. Erronnee {String raison; }; boolean verifier. Une. Date(in Date d); void le. Jour. Suivant(inout Date d); Date convertir. Chaine (in String une. Chaine) raises (Date. Erronnee); Calendrier_var mon. Calendrier = … référence; Annee annee. ATraiter = mon. Calendrier -> annee. Courante(); mon. Calendrier -> annee. Courante(annee. ATraiter +1); if (mon. Calendrier -> verifier. Date (une. Date)) { mon. Calendrier -> le. Jour. Suivant(date); CORBA: : String chaine = mon. Calendrier -> convertir. Date (une. Date); try { date = convertir. Chaine (¨ 31 fevrier 1998 ¨); } catch (Date. Erronnee& exception) { cout << exception. raison}; © 2000, Mireille Fornarino, E. S. S. I. - 30 -

Utilisation à partir de C++(2) 3. IDL Utilisation interface Calendrier { …. } typedef

Utilisation à partir de C++(2) 3. IDL Utilisation interface Calendrier { …. } typedef sequence <Date> des. Dates; interface Calendrier. Ferie : Calendrier { void les. Jours. Feries (in Annee Une. Annee, out des. Dates dates); } Calendrier. Ferie_var mon. Calendrier. Ferie = Calendrier. Ferie: : _narrow (ton. Calendrier); des. Dates dates. Repos; mon. Calendrier. Ferie -> les. Jours. Feries (1998, dates. Repos); for (CORBA: : Ulong i=0; i< dates. Repos. length(); i++){ CORBA: : String_var chaine; chaine = mon. Calendrier. Ferie -> convertir. Chaine(dates. Repos[i]); } © 2000, Mireille Fornarino, E. S. S. I. - 31 -

ORBacus ORBACUS is an Object Request Broker (ORB) that is compliant with the Common

ORBacus ORBACUS is an Object Request Broker (ORB) that is compliant with the Common Object Request Broker Architecture (CORBA) specification (2. 4 + features 3) • Full CORBA IDL support • C++ and Java language mappings • Simple configuration and bootstrapping • Portable Object Adapter • Objects by Value • Portable Interceptors • Single- and Multi-threaded • Active Connection Management • Fault Tolerant Extensions © 2000, Mireille Fornarino, E. S. S. I. • Dynamic Invocation and Dynamic Skeleton Interface • Dynamic Any • Interface and Implementation Repository • Pluggable Protocols • IDL-to-HTML and IDL-RTF documentation tools • Includes Naming, Trading, Event, Notify, Property Services, balancing, … - 32 -

Étapes de mise en oeuvre Spécification interface IDL Compilation interface IDL Implantation des objets

Étapes de mise en oeuvre Spécification interface IDL Compilation interface IDL Implantation des objets Corba Implantation du client Implantation du serveur Enregistrement du serveur Côté client © 2000, Mireille Fornarino, E. S. S. I. Utilisation du service Nommage Côté serveur - 33 -

Spécification interface IDL (1/2) 1 - Exemple introductif Un objet grid est un tableau

Spécification interface IDL (1/2) 1 - Exemple introductif Un objet grid est un tableau contenant des valeurs. Les valeurs sont accessibles grâce aux opérateurs get et set qui peuvent être invoqués à distance. objets grid Appel de get et sur l'objet grid distant Processus client © 2000, Mireille Fornarino, E. S. S. I. Processus serveur - 34 -

Spécification interface IDL (2/2) 1 - Exemple introductif interface Grid { readonly attribute short

Spécification interface IDL (2/2) 1 - Exemple introductif interface Grid { readonly attribute short height; readonly attribute short width; void set (in short n, in short m, in long value); long get(in short n, in short m); void copy. In(inout Grid g); }; © 2000, Mireille Fornarino, E. S. S. I. - 35 -

1 - Exemple introductif Compilation interface IDL Grid. idl jidl … Grid. idl Client

1 - Exemple introductif Compilation interface IDL Grid. idl jidl … Grid. idl Client _Grid. Stub. java Client. java A écrire Compilateur IDL/Java Répertoire grid Grid. Operations. java I Grid. java Grid. Helper. java Généré Serveur Grid. POA. java Grid_Impl. java Serveur. java Grid. Holder. java © 2000, Mireille Fornarino, E. S. S. I. - 36 -

Hiérarchie Java des classes <<Abstraite>> org. omg. CORBA. portable. Object. Impl Org. omg. Portable.

Hiérarchie Java des classes <<Abstraite>> org. omg. CORBA. portable. Object. Impl Org. omg. Portable. Server. Servant <<Interface>> Grid. Operations étend <<Interface>> étend Implémente Grid étend _Grid. Stub <<Interface>> Org. omg. CORBA. Object <<abstract>> Grid. POA Grid_Impl Standard Généré À implémenter © 2000, Mireille Fornarino, E. S. S. I. - 37 -

L ’interface Java générée 1 - Exemple introductif // Extrait fichier grid. java public

L ’interface Java générée 1 - Exemple introductif // Extrait fichier grid. java public interface Grid extends Grid. Operations, … org. omg. CORBA. Object {} public interface Grid. Operations{ short height(); void set(short n, short m, int value); short width(); void copy. In(Grid. Holder g); } Sans readonly : + void height(short val); © 2000, Mireille Fornarino, E. S. S. I. - 38 -

Les classes Java communes générées 1 - Exemple introductif Sont également générées les classes

Les classes Java communes générées 1 - Exemple introductif Sont également générées les classes : // Classe utilitaire pour le type Grid final public class Grid. Helper { public static Grid narrow(org. omg. CORBA. Object obj) { …} …. . } conversion de type, insertion dans un Any, extraction, obtenir le Type. Code, . . // Classe utilitaire pour le passage out et inout final public class Grid. Holder implements org. omg. CORBA. portable. Streamable { public Grid value; public grid. Holder(Grid initial) { value = initial; } … © 2000, Mireille Fornarino, E. S. S. I. - 39 -

Les classes Java Stubs et Squelettes 1 - Exemple introductif • implantation du stub

Les classes Java Stubs et Squelettes 1 - Exemple introductif • implantation du stub public class _Grid. Stub extends… implements Grid – envoie de requêtes – invisible par le programmeur – instanciée automatiquement par Grid. Helper (narrow) – Utilise le DII pour assurer la portabilité du binaire • implantation du squelette public abstract class Grid. POA extends. . . implements Grid. Operations – reçoit et décode des requêtes – doit être héritée par l’implantation © 2000, Mireille Fornarino, E. S. S. I. - 40 -

Implémentation de l'interface (Classes servants) 1 - Exemple introductif Ecrire une classe Java qui

Implémentation de l'interface (Classes servants) 1 - Exemple introductif Ecrire une classe Java qui hérite de la classe. Grid. POA public class Grid_impl extends Grid. POA { public int [][] valeur; public Grid_impl(short width, short height) { valeur = new int [width] [height]; ……. } public int get(short n, short m) { return valeur[n][m]; } public short height(){ return (short) valeur[1]. length; } public void copy. In(Grid. Holder g) …. . g. value. set(i, j, this. valeur[i][j]) ; …} © 2000, Mireille Fornarino, E. S. S. I. - 41 -

Implémentation du serveur (1) 1 - Exemple introductif 1. Initialiser le bus CORBA –

Implémentation du serveur (1) 1 - Exemple introductif 1. Initialiser le bus CORBA – obtenir l’objet ORB 2. Initialiser l’adaptateur d’objets – obtenir le POA 3. Créer les implantations d’objets (servants) 4. Enregistrer les implantations par l’adaptateur 5. Diffuser leurs références – afficher une chaîne codifiant l’IOR 6. Attendre des requêtes venant du bus 7. Destruction du Bus © 2000, Mireille Fornarino, E. S. S. I. - 42 -

Implémentation du serveur (2) 1 - Exemple introductif public class Serveur. De. Grilles{ public

Implémentation du serveur (2) 1 - Exemple introductif public class Serveur. De. Grilles{ public static void main(String args[]) throws Exception { // Propriétés nécessaires à l’utilisation d’ORBACUS java. util. Properties props = System. get. Properties(); props. put("org. omg. CORBA. ORBClass", "com. ooc. CORBA. ORB"); props. put("org. omg. CORBA. ORBSingleton. Class", "com. ooc. CORBA. ORBSingleton"); // Initialisation du bus CORBA pour un processus serveur. int status = 0; org. omg. CORBA. ORB orb = null; try { orb = org. omg. CORBA. ORB. init(args, props); (1) status = run(orb); (2, 3, 4, 5, 6) } catch(Exception ex) { ex. print. Stack. Trace(); status = 1; } if(orb != null) { try { orb. destroy(); (7) } catch(Exception ex) { ex. print. Stack. Trace(); } © 2000, Mireille Fornarino, E. S. S. I. - 43 -

Implémentation du serveur (3) 1 - Exemple introductif public class Serveur. De. Grilles{ …

Implémentation du serveur (3) 1 - Exemple introductif public class Serveur. De. Grilles{ … static int run(org. omg. CORBA. ORB orb) throws org. omg. CORBA. User. Exception { org. omg. Portable. Server. POA root. POA = org. omg. Portable. Server. POAHelper. narrow( orb. resolve_initial_references("Root. POA")); (2) org. omg. Portable. Server. POAManager manager = root. POA. the_POAManager(); Grid_Impl grille. Impl = new Grid_Impl(100, 100); // (3) « création de servants Grid Grille = Grid_Impl. _this(orb); (4) « activation de servants » try { // Obtenir sous forme textuelle l'IOR de l'objet. String chaine. IOR = orb. object_to_string (grille); // (5) //. . . diffuser la chaîne. . System. out. println("IOR : " + chaine. IOR); . // Mettre le serveur en attente des requêtes venant du bus CORBA. manager. activate(); orb. run(); // (6) } © 2000, Mireille Fornarino, E. S. S. I. - 44 - »

Implémentation du client 1 - Exemple introductif 1. Initialiser le bus (objet ORB) 2.

Implémentation du client 1 - Exemple introductif 1. Initialiser le bus (objet ORB) 2. Créer les souches des objets à utiliser 2. a. obtenir les références d’objet (IOR) 2. b. convertir vers les types nécessaires – narrow contrôle le typage à travers le réseau 3. Réaliser les traitements • Rem. : éviter l’opérateur bind (2. a + 2. b) – spécifique à chaque produit donc non portable © 2000, Mireille Fornarino, E. S. S. I. - 45 -

Implémentation du client en Java 1 - Exemple introductif public class Client. De. Grille

Implémentation du client en Java 1 - Exemple introductif public class Client. De. Grille { public static void main(java. lang. String[] args) { //………… Comme le serveur avec status = run(orb, args[0]); //IOR est ici passé en argument … static int run(org. omg. CORBA. ORB orb, String ref) { try { org. omg. CORBA. Object obj = orb. string_to_object(ref); // (2. a) Grid grille = Grid. Helper. narrow(objet); // (2. b) System. out. println(grille. height()); System. out. println(grille. width()); grille. set((short) 2, (short) 4, 123); System. out. println("grid[2, 4] is " + grille. get((short)2, (short)4)); } } © 2000, Mireille Fornarino, E. S. S. I. - 46 -

Activation des servants Informer l’ORB de l’existence d’un servant comme « représentant » d’un

Activation des servants Informer l’ORB de l’existence d’un servant comme « représentant » d’un objet CORBA particulier. L’activation d’un servant lui affecte un object identifier utilisé dans les références qui seront créées. La valeur de Id. Assignment. Policy du POA permet de laisser le POA ou le code de l’application serveur affecter l’Identificateur. La valeur de Implicit. Activation. Policy permet de choisir entre une activation active et une activation passive (NO_IMPLICIT_ACTIVATION/ IMPLICIT_ACTIVATION) © 2000, Mireille Fornarino, E. S. S. I. - 47 -

Activation Implicite Si le POA de l’objet servant a les politiques : RETAIN, IMPLICIT_ACTIVATION,

Activation Implicite Si le POA de l’objet servant a les politiques : RETAIN, IMPLICIT_ACTIVATION, et SYSTEM_ID : L’activation implicite est réalisée lors de la première création d’une référence sur le servant: Grid Grille = Grid. Impl. _this(orb); Le nouveau servant est activé (en utilisant le POA renvoyé par _default_POA), qui par défaut renvoie le Root. POA © 2000, Mireille Fornarino, E. S. S. I. - 48 -

Activation explicite de servants Quand le POA d’un Servant est défini avec les politiques

Activation explicite de servants Quand le POA d’un Servant est défini avec les politiques : NO_IMPLICIT_ACTIVATION // The code instantiates a servant. I_mpl impl = new I_impl(); // To activate a servant, we need the servant’s POA. orb. omg. Portable. Server. POA poa = impl. _default_POA(); Et SYSTEM_ID //creates a unique ID for the servant poa. activate_object(impl); Et USER_ID byte[] id = "My. Object. Name". get. Bytes(); poa. activate_object_with_id(id, impl); © 2000, Mireille Fornarino, E. S. S. I. - 49 -

Désactivation de servants org. omg. Portable. Server. POA poa = impl. _default_POA(); byte[] id

Désactivation de servants org. omg. Portable. Server. POA poa = impl. _default_POA(); byte[] id = poa. servant_to_id(impl); poa. deactivate_object(id); © 2000, Mireille Fornarino, E. S. S. I. - 50 -

Le cycle de vie des objets • Problème – actuellement, 1 grille = 1

Le cycle de vie des objets • Problème – actuellement, 1 grille = 1 serveur – pas de création/destruction d’objets à distance – seulement invocation d’opérations • Solution – notion de fabrique d’objets – exprimée en OMG-IDL • C’est un canevas de conception : Design pattern – voir aussi le service Life. Cycle Autres usages de la fabrique : - gestion de droits, load-balancing, polymophisme, … © 2000, Mireille Fornarino, E. S. S. I. - 51 -

L’implantation de la fabrique creer. Grille Fabrique © 2000, Mireille Fornarino, E. S. S.

L’implantation de la fabrique creer. Grille Fabrique © 2000, Mireille Fornarino, E. S. S. I. Grille - 52 -

L’implantation de la fabrique Fabrique Grille detruire. Grille © 2000, Mireille Fornarino, E. S.

L’implantation de la fabrique Fabrique Grille detruire. Grille © 2000, Mireille Fornarino, E. S. S. I. - 53 -

Interface IDL d ’une fabrique de Grilles module grilles {. . . interface Fabrique

Interface IDL d ’une fabrique de Grilles module grilles {. . . interface Fabrique { Grid new. Grid(in short width, in short height); }; }; © 2000, Mireille Fornarino, E. S. S. I. - 54 -

Implantation Java de la fabrique de grilles import grille. *; public class Fabrique_impl extends

Implantation Java de la fabrique de grilles import grille. *; public class Fabrique_impl extends Fabrique. POA { org. omg. CORBA. ORB orb_; public Fabrique_Impl (org. omg. CORBA. ORB orb) { orb_=orb; . . . } public Grid new. Grid(int width, int height){ Grid_impl gi = new Grid_Impl(width, height); return gi. _this(orb_); } } } © 2000, Mireille Fornarino, E. S. S. I. - 55 -

Références interface A{}; interface B { A get. A(); } B b =. .

Références interface A{}; interface B { A get. A(); } B b =. . . // Get a B object reference somehow A a = b. get. A(); public class B_impl extends BPOA { org. omg. CORBA. ORB orb_; A_impl a_; public B_impl(org. omg. CORBA. ORB orb) { orb_ = orb; a_ = new A_impl(); } A get. A() { return a_. _this(orb_); } } © 2000, Mireille Fornarino, E. S. S. I. - 56 -

Références et strings Vous pouvez convertir toute référence en une string et inversement pour

Références et strings Vous pouvez convertir toute référence en une string et inversement pour par exemple: • le serveur créé un objet et écrit sa référence dans un fichier String ref = orb. object_to_string(grille); String ref. File = « Grid. ref » ; File. Output. Stream file = new File. Output. Stream(ref. File); Print. Writer out = new Print. Writer(file); out. println(ref); out. flush(); file. close(); • Le client lit le fichier et utilise la référence pour accéder à l’objet. File. Input. Stream file = new File. Input. Stream(ref. File); string ref = new Buffered. Reader ( new Input. Stream. Reader(file)). read. Line(); file. close(); org. omg. CORBA. Object obj = orb. string_to_object(ref); • Stockage dans une BD © 2000, Mireille Fornarino, E. S. S. I. Service de nommage - 57 -

Services initiaux : références Services initiaux : ensemble de services uniques dont la référence

Services initiaux : références Services initiaux : ensemble de services uniques dont la référence peut être obtenue par l’opération resolve_initial_references : // IDL module CORBA { interface ORB { typedef string Object. Id; exception Invalid. Name {}; Object resolve_initial_references( in Object. Id identifier) raises(Invalid. Name); }; }; Noms standardisés par exemple: Name. Service et Trading. Service. © 2000, Mireille Fornarino, E. S. S. I. - 60 -

Scénario d ’obtention de la référence du service de nommage ORB Client ou Serveur

Scénario d ’obtention de la référence du service de nommage ORB Client ou Serveur resolve_initial_references ("Name. Service"); Cos. Naming: : Naming. Context conversion ajout, retrait, lecture, . . . © 2000, Mireille Fornarino, E. S. S. I. - 61 -

Obtenir le service de Nommage en Java import org. omg. Cos. Naming. *; .

Obtenir le service de Nommage en Java import org. omg. Cos. Naming. *; . . . //retrouver la référence de l ’objet notoire « Name. Service » org. omg. CORBA. Object obj. Ref = null; try { obj. Ref = orb. resolve_initial_references ("Name. Service"); } catch( org. omg. CORBA. ORBPackage. Invalid. Name e ) { outils. ARRET ("Le service initial Name. Service est inconnu"); } //la convertir en une référence à un objet //de type Cos. Naming: : Naming. Context ns. Ref = Naming. Context. Helper. narrow(obj. Ref); if ( ns. Ref == null ) { outils. ARRET ("Le service initial 'Name. Service' n'est pas un objet Cos. Naming: : Naming. Context"); © 2000, Mireille Fornarino, E. S. S. I. - 62 -

Créer un nom/chemin en Java import org. omg. Cos. Naming. *; //créer un chemin

Créer un nom/chemin en Java import org. omg. Cos. Naming. *; //créer un chemin simple Name. Component[] ns. Nom = new Name. Component [1]; ns. Nom[0] = new Name. Component( "grille. A ", ""); //créer un chemin composé Name. Component[] ns. Nom = new Name. Component [2]; ns. Nom[0] = new Name. Component( "appli", ""); ns. Nom[1] = new Name. Component( "grille ", ""); © 2000, Mireille Fornarino, E. S. S. I. - 64 -

Enregistrer un objet • Opération pour publier un Objet – en général, opération réalisée

Enregistrer un objet • Opération pour publier un Objet – en général, opération réalisée par le serveur • Scénario Type 1. Créer un objet 2. Construire un chemin d ’accès (Name) 3. Appeler l ’opération « bind » ou « rebind » avec le chemin et la référence de l ’objet void bind (in Name n, in Object obj) raises (Not. Found, Cannot. Proceed, Invalid. Name, Already. Bound); © 2000, Mireille Fornarino, E. S. S. I. - 65 -

Enregistrer un objet en Java //créer un chemin Name. Component[] ns. Nom = new

Enregistrer un objet en Java //créer un chemin Name. Component[] ns. Nom = new Name. Component [1]; ns. Nom[0] = new Name. Component("MONOBJET", ""); //enregistrer l ’objet try { ns. Ref. bind (ns. Nom, une. Ref. Objet); } catch (org. omg. Cos. Naming. Context. Package. Not. Found enf) {. . . } catch(org. omg. Cos. Naming. Context. Package. Already. Bound eab){. . . } catch(org. omg. Cos. Naming. Context. Package. Cannot. Proceed ecp){. . . } catch(org. omg. Cos. Naming. Context. Package. Invalid. Name ein) {. . . © 2000, Mireille Fornarino, E. S. S. I. - 66 -

Retrouver un objet • Opération réalisée par un client ou un serveur • Scénario

Retrouver un objet • Opération réalisée par un client ou un serveur • Scénario type : – construire un chemin d ’accès (Name) – appeler l ’opération « resolve » avec le chemin – convertir la référence obtenue dans le bon type Object resolve (in Name n) raises (Not. Found, Cannot. Proceed, Invalid. Name) © 2000, Mireille Fornarino, E. S. S. I. - 67 -

Retrouver un objet en Java //créer un chemin Name. Component[] ns. Nom = new

Retrouver un objet en Java //créer un chemin Name. Component[] ns. Nom = new Name. Component [1]; ns. Nom[0] = new Name. Component("MONOBJET", ""); //retrouver l ’objet org. omg. CORBA. Object obj. Ref = null; try { obj. Ref = ns. Ref. resolve (ns. Nom); } catch (org. omg. Cos. Naming. Context. Package. Not. Found enf) {. . . } catch(org. omg. Cos. Naming. Context. Package. Cannot. Proceed ecp). . . } catch (org. omg. Cos. Naming. Context. Package. Invalid. Name ein). . . } //convertir la référence Grille une. Ref. Objet = Grille. Helper. narrow (obj. Ref); © 2000, Mireille Fornarino, E. S. S. I. - 68 -

Une application d’administration de la fabrique • Création d’une nouvelle fabrique de grilles et

Une application d’administration de la fabrique • Création d’une nouvelle fabrique de grilles et mise à disposition par le service Nommage – – – 1. Initialiser le bus CORBA 2. Initialiser l’adaptateur d’objets 3. Créer la fabrique 4. Obtenir le service Nommage (NS) 5. Créer un répertoire (contexte) 6. Enregistrer le couple fabrique/répertoire dans le NS © 2000, Mireille Fornarino, E. S. S. I. - 69 -

Serveur Java de la fabrique import org. omg. CORBA. *; // le bus CORBA.

Serveur Java de la fabrique import org. omg. CORBA. *; // le bus CORBA. import org. omg. Cos. Naming. *; // le service Nommage. public class Serveur. Fabrique { public static void main(String args[]) throws Exception { … (1) (2) status = run(orb); } static int run(org. omg. CORBA. ORB orb)… {Fabrique. Impl fabrique = new Fabrique. Impl(); // (3) Naming. Context nc = Naming. Context. Helper. narrow( // (4) orb. resolve_initial_references ("Name. Service")); Name. Component[] nom = new Name. Component[1]; // (5) nom[0] = new Name. Component("FABRIQUE", ""); nc. rebind(nom, fabrique); // (6) } © 2000, Mireille Fornarino, E. S. S. I. - 70 -

Client de la fabrique public class Administration { public static void main(String args[]) throws

Client de la fabrique public class Administration { public static void main(String args[]) throws Exception { ORB orb = ORB. init (args, null); // (1) Naming. Context nc = Naming. Context. Helper. narrow( // (2) orb. resolve_initial_references ("Name. Service")); Name. Component[] ns. Nom = new Name. Component [1]; ns. Nom[0] = new Name. Component("FABRIQUE", ""); org. omg. CORBA. Object objet=nc. resolve(ns. Nom); //(3. a) Fabrique fabrique=Fabrique. Helper. narrow(objet); //(3. b) Grid g = fabrique. new. Grid( 4, 4); // (4) ns. Nom[0] = new Name. Component( "Grille 4 x 4", ""); nc. bind (ns. Nom, g); // (5) } © 2000, Mireille Fornarino, E. S. S. I. - 71 -

Conclusion • CORBA : ça marche et c’est simple • Choisir son langage d’implantation

Conclusion • CORBA : ça marche et c’est simple • Choisir son langage d’implantation – C++ : complexe et moins portable – Java : portable et plus lent • Choisir son bus – 1 bus = 1 bibliothèque – mixer les bus : c’est possible Expérimentez en TPs ! © 2000, Mireille Fornarino, E. S. S. I. - 72 -

Disponibilité de Orbacus • Bus CORBA: – ORBacus <URL: http: //www. ooc. com> –

Disponibilité de Orbacus • Bus CORBA: – ORBacus <URL: http: //www. ooc. com> – MICO <URL: http: //www. vsb. cs. unifrankfurt. de/~mico/> • Environnements systèmes : – Sun Solaris, Linux, SGI IRIX, HP-UX, AIX, W 95/NT …, JDK 1. 1. x et 1. 2, 1. 3… 1. 4… • Gratuit avec les sources C++ et java • URL : http: //corbaweb. lifl. fr © 2000, Mireille Fornarino, E. S. S. I. - 73 -

OMG-IDL : évaluation : Bon langage de spécification d’interfaces d’objets : Facile à apprendre

OMG-IDL : évaluation : Bon langage de spécification d’interfaces d’objets : Facile à apprendre ô types de base figés ô interdiction de sous-typer ou étendre une structure ou union ô interdiction de surcharge à l’intérieur d ’un module ô pas de passage d’objets par valeur (disponible en 3. 0) ô pas de sémantique des objets (contraintes, assertions, …) ô Pas d ’expression possible de la qualité de service ô pas de notion d’architecture logicielle © 2000, Mireille Fornarino, E. S. S. I. 3. IDL