CORBA ■ ■ ■ ■ ■ ■
Présentation - L'OMG Le langage IDL Le mode "statique" Le mode "dynamique" Architecture Exemple
Page 1 1
Motivations ■
Motivations • influence du concept d’objet • langage (programmation) • système (architecture)
■
But poursuivi • Permettre à des applications actives sur différentes machines d’un environnement distribué hétérogène de coopérer au travers d'objets distribués
Page 2 2
O. M. G. ■
Consortium créé en 1989 • + de 850 membres aujourd'hui • constructeurs, éditeurs de logiciels et utilisateurs
■
Objectif : • Emergence de standards pour l'intégration d'applications distribuées hétérogènes et la réutilisation de composants logiciels.
Page 3 3
O.M.G. Concepts clés ■
Interopérabilité de composants (applications) • par l'intermédiaire d'un mode de coopération unifié è l'appel à des objets distants • Gestion de l'hétérogénéité des machines, systèmes et langages par l'utilisation d'un langage pivot commun è l'OMG IDL
■
Tirer avantage de la technologie "objet" • Encapsulation, Polymorphisme, Héritage, Exceptions • Séparation entre interface et réalisation • Les clients ne dépendent que de l'interface définie pour les objets qu'ils accèdent.
Page 4 4
O.M.G. - Vision globale ■
Common Object Request Broker Architecture
■
Un Bus à objets distribués = ORB • transport des requêtes, Activation des Objets, etc.
■
Des services de base (Corba Services) Des utilitaires (Corba Facilities)
■
Des interfaces de domaines (Objets métiers)
■
• "Interopérabilité sémantique"
Page 5 5
O.M.G. - Modèle ■
Modèle orienté Objet Client/Serveur • Chaque application peut exporter certaines de ces fonctionnalités (services) sous la forme d'objets Corba. • L'interaction entre applications est matérialisée par les invocations à distance des méthodes des objets ainsi définis. • La notion Client/Serveur n'intervient que lors de l'utilisation d'un objet : • l'application implantant l'objet est le serveur • l'application utilisant l'objet est le client • Une application peut-être à la fois cliente et serveur
Page 6 6
O.M.G. - Modèle Application Cliente
Application Serveur
Bus CORBA Référence de l'Objet
Requête
Objet CORBA
Etat de l'objet Activation Code d'implantation
Interface de l'objet
Page 7 7
O.M.G. - Modèle ■
Client • Application invoquant des objets à travers le bus Corba
■
Référence d'objet • Structure désignant l'objet Corba et contenant l'information nécessaire pour le localiser sur le bus
■
Requête • Mécanisme d'invocation d'une opération ou d'accès à un attribut
■
Bus Corba • Achemine les requêtes du client vers l'objet en masquant les problèmes d'hétérogénéité (langages, systèmes, matériels, etc.)
Page 8 8
O.M.G. - Modèle ■
Objet Corba • Composant logiciel cible, entité virtuelle gérée par le bus Corba
■
Activation • Processus d'association d'un objet d'implantation à un objet Corba
■
Implantation de l'objet • Entité codant l'objet Corba à un instant donné et gérant un état temporaire de l'objet • Au cours du temps, un objet Corba peut être associé à différentes implantations
Page 9 9
O.M.G. - Modèle ■
Code d'implantation • Ensemble des traitements associés à l'implantation des opérations de l'objet Corba • Exemple : une classe C++ ou Java, ou un ensemble de fonctions C
■
Serveur • Structure d'accueil des objets d'implantation et des exécutions des opérations (ex: un processus Unix)
Page 10 10
Architecture Globale Object Management Architecture ■
OMA : Object Management Architecture • Vision globale de construction d'applications réparties • Classification des objets intervenants dans l'application • Services communs : fonctions systèmes accessibles sous forme d'objets. • nommage, persistance, transactions, sécurité, etc. • Utilitaires communs :
Page 11 11
Architecture Globale Object Management Architecture ■
Services communs : Corba Services • Fonctions systèmes accessibles sous forme d'objets. • Nommage, persistance, transactions, sécurité, etc.
■
Utilitaires communs : Corba Facilities • Canevas d'objets ("framework") répondant aux besoins de certains utilisateurs • IHM, administration, workflow, etc.
■
Interfaces de domaines : Domain Interface • Objectif : interopérabilité sémantique entre les systèmes d'informations des entreprises • Objets métiers spécifiques à des secteurs d'activités : Finance, santé, télécoms
Page 12 12
Architecture Globale Object Management Architecture Interfaces de domaine
Objets applicatifs
Utilitaires communs Workflow Administration
Télécoms
Spécifiques
Santé
Finance
DataWare
IHM
Bus d’objets répartis Nommage
Vendeur
Interrogations
Cycle de vie
Sécurité
Relations Collections
Temps
Transactions Propriétés Persistance
Licences
Externalisation
Events Changements Concurrence
Services objet communs
Page 13 13
Le bus d'objets répartis Architecture ■
Liaison avec les langages de programmation • C, C++, SmallTalk, Ada, Cobol et Java.
■ ■
Transparence des invocations Invocation statique et dynamique • statique : invocations controlées à la compilation • dynamique : invocations construites et controlées à l'exécution
■ ■
Activation automatique et transparente des objets Interopérabilité entre bus • GIOP (Global Inter-Orb Protocol) è IIOP (Internet IOP) au dessus de TCP/IP
Page 14 14
Le bus d'objets répartis Architecture Serveur Client
DSI SII
ORB Interface
SII
SSI
Object Adaptor
Object Request Broker Référentiel d'interfaces IFR
Référentiel d'implantations ImplR
Interfaces communes à tous les ORB. Interfaces propres à chaque type d'objets (stubs et skeltons). Interface propres à chaque ORB.
Page 15 15
Le bus d'objets répartis Architecture ■
ORB : Object Request Broker (négociateur) • Noyau de transport des requêtes (protocoles GIOP, IIOP) • L'interface du bus fournit les primitives de base : initialisation, etc.
■
SII : Static Invocation Interface • Stubs permettant d'effectuer les requêtes statiques • Générés à partir des définitions OMG-IDL
■
DII : Dynamic Invocation Interface • Interface permettant la construction dynamique d'une requête vers un objet Corba sans générer/utiliser d'interface SII (stub)
Page 16 16
Le bus d'objets répartis Architecture ■
IFR : Interface Repository • référentiel des interfaces OMG-IDL accessibles par les applications
■
SSI : Static Skeleton Interface • Proxy permettant à l'implantation des objets de recevoir les requêtes qui leur sont destinées • Générés à partir des définitions OMG-IDL
■
DSI : Dynamic Skeleton Interface • Interface permettant d'intercepter dynamiquement une requête sans générer une interface SSI (proxy) • Correspond au DII mais coté serveur
Page 17 17
Le bus d'objets répartis Architecture ■
OA : Object Adaptor • Création des objets Corba • Maintient des associations entre objets Corba et implantations • Activation des implantations
■
ImplR : Implémentation Repository • Référentiel des implantations • Contient l'information nécessaire à l'activation
Page 18 18
Le langage OMG-IDL ■
Langage pivot entre les applications Corba
■
Masque l'hétérogénéïté Description des interfaces d'objets Corba Production du code de communication entre les objets
■ ■
■
Description des interfaces du bus Corba
Page 19 19
Le langage OMG-IDL ■
Interopérabilité entre langage généralement limité à une passerelle vers le langage C
■
Chaque langage définit sa propre vision • de la structuration des données • structure, type abstrait, objet, etc. • de la structuration du code • fonction, package, classe, etc. • des mécanismes d'exécution • allocation mémoire, instanciation d'une classe, etc. • appel de fonction, invocation de méthode, etc.
Page 20 20
Le langage OMG-IDL "Esperanto" ■
Une application = des objets Corba • décrits par des interfaces OMG-IDL • communiquants via le bus Corba Code ADA
Code C
Code Cobol
OMG-IDL
OMG-IDL
OMG-IDL Application OMG-IDL
OMG-IDL
Objet C++
Objet Java
Page 21 21
Le langage OMG-IDL Isolation Interface/Implantation Application Cliente
Interface OMG-IDL
Implantation Objet Serveur Skeleton
Stub Bus Corba
Page 22 22
Le langage OMG-IDL Isolation Interface/Implantation ■
Définition de l'interface de l'objet en OMG-IDL • Opérations, paramètres, exceptions è API de l'objet indépendante des langages è Les objets peuvent è être écrits en C, C++, Java, Ada, Cobol, etc. è Encapsuler des applications "propriétaires" è Les clients peuvent è être écrits à la main, générés par des outils è être écrits en C, C++, etc.
Page 23 23
Le langage OMG-IDL Isolation Interface/Implantation Coté Client
Coté Implantation Cobol
C
Cobol
IDL IDL
Ada
C
IDL IDL
IDL
ORB
ORB
IDL
Java
Ada
IDL IDL
IDL
IDL IDL
Java
IDL
C++
C++ Smalltalk
Smalltalk
Page 24 24
CORBA ■
Object Request Broker (ORB): • Mécanismes permettant aux objets de réaliser des appels de méthodes sur des objets "distants" de manière transparente. • Transparence: • Distribution • Localisation • Hétérogénéïté hardware et software • Fournit l'interopérabilité entre des applications dans un environnement distribué hétérogène. • Permet l'interaction des systèmes d'objets.
Page 25 25
Utilisation de l'OMG-IDL ■
Mode "statique" • projection des description OMG-IDL vers les langages d'implantation des clients et des serveurs
■
Mode "dynamique" • Instanciation sous forme d'objets Corba des descriptions OMG-IDL conservées dans un référentiel commun
Page 26 26
Utilisation de l'OMG-IDL Mode statique ■
Clients et serveurs utilisent les stubs générés statiquement. • Les stubs encapsulent l'utilisation du bus, l'activation, la distribution des composants et l'hétérogénéité.
Page 27 27
Utilisation de l'OMG-IDL Mode dynamique ■
Motivations • effectuer une requête sur un service dont l'identité et/ou la structure n'est pas connue à la compilation du programme client (statiquement)
■
Principe de réalisation • construction dynamique d'un appel de méthode • recherche d'un objet fournissant le service désiré • recherche des caractéristiques du service (nom de méthode, nombre et type des paramètres, etc.) • construction par programme d'une requête (en utilisant des primitives ad hoc)
Page 28 28
Interface OMG-IDL ■
Abstraction d'un type d'objet Corba API à rendre publique
■
Contient les opérations
■
• Exportées par l'objet • utilisées par les autres objets • Pas (forcément) toutes les méthodes de l'objet
Page 29 29
Opération OMG-IDL ■
Abstraction d'un traitement effectué sur l'objet
■
Décrit par une signature • Nom de l'opération • Paramètres • Nom formel • Type • Mode de passage : in, out, inout (passage par copie) • Type du résultat • Cas d'erreurs ou d'exceptions
Page 30 30
Type de données OMG-IDL ■
Objets hétérogènes • langages de programmation différents • machines et systèmes différents è Définition précise (nature et format binaire) des types de données échangées lors des invocations entre objets è Gestion automatique de l'hétérogénéïté
■
Le langage OMG-IDL permet la description précise des types de données et définit exactement leur format binaire
Page 31 31
Le langage OMG-IDL ■
Langage de spécification fortement typé • Pas un langage de programmation
■
Un "Esperanto" entre les langages • indépendants des langages et des compilateurs • projection vers de nombreux langages
■
Ni Union, ni intersection des langages • • • •
Pas de généricité (template en C++) Pas de surcharge, ni de redéfinition d'opérations Exceptions (inexistantes en C) Passage de paramètre Out (inexistant en Java)
Page 32 32
Le langage OMG-IDL Exemple // Interface OMG-IDL d'un service d'annuaire #include
// Réutilisation du service de dates module annuaire { typedef String Nom; // Nom d'une personne typedef sequence DesNoms; // Ensemble de noms struct Personne { // Description d'une personne Nom nom; // - son nom string informations; // - données diverses string telephone; // - son téléphone string email; // - son @ email string url; // - son @ www ::date::Date date_naissance;// - sa date de naissance } typedef sequence DesPersonnes;
Page 33 33
Le langage OMG-IDL Exemple interface Repertoire { readonly attribute string libelle; exception ExisteDeja { Nom nom; }; exception Inconnu { Nom nom; }; void AjouterPersonne(in Personne personne) raises(ExisteDeja); void retirerPersonne(in Nom nom) raises(Inconnu); void modifierPersonne(in Personne personne) raises(Inconnu); Personne obtenirPersonne(in Nom nom) raises(Inconnu); DesNoms lister(); }; };
Page 34 34
Le langage OMG-IDL Type de données élémentaires void short unsigned short long unsigned long long long … float, double, long double boolean octet char wchar string, wstring string<80>, wstring<256>
rien entier 16 bits entier 16 bits non signé entier 32 bits entier 32 bits non signé entier 64 bits réel 32, 64 et 128 bits (IEEE) booleen (true, false) donnée 8 bits (opaque) caractère 8 bits (ISO Latin) caractère 16 bits International chaînes de caractères chaînes de caractères bornées
Page 35 35
Le langage OMG-IDL Types construits ■
Définition de nouveaux types à partir des types élémentaires • Alias • Equivalence de deux types typedef unsigned short Jour; typedef short Annee;
• Enumérations • Définition d'un type discret (ensemble de valeurs) enum Mois { jan, fev, mar, … , nov, dec};
Page 36 36
Le langage OMG-IDL Types construits • Structure • Ensemble de champs typés struct Date { Jour jour; Mois mois; Annee annee; };
• Unions • Un discriminant scalaire + un ensemble de choix union DateMultiFormat { switch(unsigned short) { case 0: string chaine; default: Date date; }; };
Page 37 37
Le langage OMG-IDL Types construits • Tableaux • Définition d'un ensemble de données homogènes • Taille définie à la spécification, multiple dimensions typedef long[10] Vecteur10; typedef double[10][10] Matrice10x10;
• Séquences • Définition d'un ensemble de données homogènes • Taille indéfinie à la spécification, une ! Dimension typedef sequence Vecteur; typedef sequence Matrice;
• Exceptions • 0 ou n champs typés, similaire aux structures exception ErreurInterne {}; exception Inconnu { Nom nom; };
Page 38 38
Le langage OMG-IDL Interface d'objets ■
Définition d'un type d'objets abstrait • Signature des opérations et attributs • Espace de définition de types • Exemple : interface Repertoire { … };
• Une seule spécification pour de multiples implantations ! • Fonction du contexte • Fonction de la qualité de service désirée • Fonction de l'existant
Page 39 39
Le langage OMG-IDL Opérations ■
Définition d'une opération • Traitement propre à un type d'objet • Une signature fortement typée • arguments, résultat, exceptions • Mode de passage des paramètres • in, out, inout • Passage uniquement par copie ! • Exemple : Personne obtenirPersonne(in Nom nom) raises(Inconnu);
Page 40 40
Le langage OMG-IDL Opérations ■
Les exceptions • Permet d'avertir l'appelant des erreurs d'exécution lors de l'invocation d'une opération • Exceptions utilisateurs • Problèmes liés à l'utilisation de l'objet • Explicitement spécifiée dans la signature de l'opération • Exception système • problèmes liés à l'utilisation du bus • implicitement spécifiée pour toutes les opérations
Page 41 41
Le langage OMG-IDL Opérations ■
Mode d'appel • Synchrone (par défaut) • envoi d'une requête vers l'objet • attente bloquante d'une réponse • Asynchrone oneway void envoyer(Message msg);
• Pas de résultats, de out ou inout • Implantation souvent fiabilisée
Page 42 42
Le langage OMG-IDL Attributs ■
Attribut = opération(s) liée à une propriété interface Exemple { attribute long prop1; readonly attribute long prop2; };
• équivalent à la définition d'une paire d'opération, une pour accéder la valeur, une pour modifier cette valeur interface Exemple { long get_prop1(); void set_prop1(in long val); void long get_prop2(); };
Page 43 43
Le langage OMG-IDL Héritage d'interfaces ■
Spécialisation de types d'objets • Héritage multiple • Ni surcharge, ni redéfinition
■
Peripherique
Exemple interface interface Interface Interface
■
Corba::Object
Peripherique { … }; Ecran HP Ecran : Peripherique { … }; HP : Peripherique { … }; EcranAvecHP EcranAvecHP : Ecran, HP { … };
Attention : Héritage de spécification • Héritage d'implantation dépendant du langage
Page 44 44
Le langage OMG-IDL Modules ■
Regroupement de définitions OMG-IDL • Espace de nommage • Eviter les conflits de noms • Modularité, visibilité et portée des définitions
■
Exemple module date { struct Date { … }; } module Application { interface Service { date::Date getDate(); }; };
Page 45 45
Le langage OMG-IDL Valeurs ■
Par défaut les objets Corba sont passés par référence
■
Valeur OMG-IDL = structure IDL + opérations • Copie à l'émission, création à la réception • prise en compte des graphes d'objets • héritage simple d'un type valeur • héritage multiple d'interface
■
Disponible en Corba 3.0
Page 46 46
Le langage OMG-IDL Méta-données ■ ■
Typage fort contraignant pour décrire des interfaces généralistes Solution : types de données génériques • Corba::TypeCode encapsule un type OMG-IDL • any encapsule n'importe quelle valeur OMG-IDL
■
Exemple interface Pile { void empiler(in any valeur); any depiler(); boolean estVide(); readonly attribute Corba::TypeCode typeValeur; }
Page 47 47
La compilation OMG-IDL
Compilateur IDL/C++ OMG-IDL
Compilateur IDL/Java
Projection C++
Projection Java
Compilateur IDL/IR Référentiel des Interfaces
Page 48 48
Notion de projection ■
Traduction des concepts Corba et OMG-IDL vers les constructions d'un langage de programmation donné • Toutes les constructions OMG-IDL • La notion de référence d'objets Corba • L'invocation d'opération • Les modes de passage de paramètres • La gestion des exceptions • L'accès aux attributs • L'API du bus Corba décrite en OMG-IDL
■
Standardisée : • C, Smalltalk, C++, Ada, Cobol et Java
Page 49 49
Projection OMG-IDL / Java ■
Objectifs : • Utilisation d'objets Corba depuis un programme Java • Implanter des objets Java en Corba
■
Portabilité totale • Langage Java unique • Sources et bytecodes Java 100% portable
■
Compiler 1 fois, exécuter partout • Tous les bus Corba Java
Page 50 50
Projection OMG-IDL / Java ■
Identificateur OMG-IDL = identificateur Java • Si conflit alors l'identificateur est précédé de '_'
■
Module OMG-IDL = package Java • Les API du bus sont décrites dans le module OMG-IDL représenté en Java par le package org.omg.Corba
■
Types élémentaires
OMG-IDL
Java
OMG-IDL
Java
void boolean octet short unsigned short long
void boolean byte short short int
unsigned long int long long long unsigned long long long float float double double long double ?
Page 51 51
Projection OMG-IDL / Java ■
Types élémentaires
OMG-IDL
Java
char wchar string wstring fixed
char char java.lang.String java.lang.String java.math.BigDecimal
■
Types Java "plus large" que types OMG-IDL • Vérification à l'exécution et générations d'exceptions
Page 52 52
Projection OMG-IDL / Java ■ ■
Java : pas de passage out et inout Les classes Holder • Un attribut contenant la valeur • Un constructeur par défaut • Un constructeur avec valeur initial final public class TypeHolder { public Type value; public TypeHolder() {} public TypeHolder(Type v) { value = v; } }
• Fournies pour les types élémentaires dans le package org.omg.Corba • Générées pour tous les types utilisateurs
Page 53 53
Projection OMG-IDL / Java ■
Les classes Helper
■
Fonctions utiles pour les types OMG-IDL définis par les utilisateurs • insertion dans un any • Extraction depuis un any • etc.
■
Nom de la classe • NomTypeOMG-IDL + Helper • Exemple : DateHelper
Page 54 54
Projection OMG-IDL / Java ■
Alias • Pas d'alias en Java è utilisation du type réel
■ ■
Constantes OMG-IDL = constantes Java Structure OMG-IDL = classe Java • non extensible è final • chaque champs est représenté par un attribut public • Un constructeur par défaut et un constructeur initialisant tous les champs
■
Enumération OMG-IDL è classe Java • A chaque Label est associé • Une valeur entière (utile dans les switch) • Une instance d'objet
Page 55 55
Projection OMG-IDL / Java ■
Tableaux et séquence OMG-IDL è tableaux Java • Contrôle d'accès par Java • Contrôle à l'emballage par Corba • Taille différente à la taille déclarée ou supérieure au maximum • Exception : Corba::Marshal
■
Exceptions è classe Java
Java.lang.Exception
• Similaire à la projection d'une structure OMG-IDL
Org.omg.Corba.userException
Java.lang.RuntimeException
Org.omg.Corba.SystemException
Page 56 56
Projection OMG-IDL / Java ■
Interface OMG-IDL è interface Java • Signature des opérations • Signature des opérations d'accès aux attributs • une pour l'accès en lecture • une pour la modification si "non readonly" • Graphe d'héritage IDL è graphe d'interfaces Java • Héritage de l'interface org.omg.Corba.Object • Héritage des interfaces Java respectives
Page 57 57
Projection OMG-IDL / Java Exemple // OMG-IDL // struct Date { Jour jour; Mois mois; Annee annee }; public final class Date { public short jour; public Mois mois; public short annee; public Date() {} public Date(short j, Mois m, short a) { jour = j; mois = m; annee = a; } }
Page 58 58
Projection OMG-IDL / Java Exemple // OMG-IDL // enum Mois { Jan, Fev, … Dec } public final class Mois { public static final int _Jan = 0; public static final Mois Jan = new … public static final int _dec = 11; public static final Mois dimanche = new
Mois(_Jan);
Mois(_dec);
public int value() { … } public static Mois from_int(int value) { … } private Mois(int v) { … } }
Page 59 59
Projection OMG-IDL / Java Exemple // Utilisation de l'enumeration Mois m = Mois.Janvier; switch (m.value()) { case Mois._Jan: … ; … case Mois._Dec: … ; }; m = Mois.from_int(7); if (m == Mois.Aout) … ;
Page 60 60
Projection OMG-IDL / Java Exemple // Utilisation de la structure Date d = new Date(); d.jour = (short) 31; d.mois = Mois.Dec; d.annee = (short) 1999; d = new Date((short) 1, Mois.Jan, (short) 2000);
Page 61 61
Projection OMG-IDL / Java Exemple // OMG-IDL // interface Exemple { // long operation( in long p_in, // out short p_out, // inout long p_inout); // } interface Exemple extends org.omg.Corba.Object { int operation(int p_in, org.omg.Corba.ShortHolder p_out, org.omg.Corba.IntHolder p_inout); }
Page 62 62
Projection OMG-IDL / Java Exemple // Utilisation des modes de passage Exemple obj = … ; ShortHolder p_out = new ShortHolder(); IntHolder p_inout = new IntHolder(131); int res = obj.operation(57, p_out, p_inout); short v1 = p_out.value; int v2 = p_inout.value;
Page 63 63
Orbacus ■
Object Oriented Concepts • http://www.ooc.com • gratuit, sources disponibles
■
Environnement Corba2.0 • Projections C++ et Java • Compilateur générant les souches • Bibliotèques implantant le bus • Les mécanismes dynamiques • référentiel d'interface, DII et DSI. • Des services : nommage, événements, etc. • OS: Solaris, Linux, Windows 95/NT, AIX, etc.
Page 64 64
Orbacus
Applications C++ Cliente et/ou Serveur
Applications Java Cliente et/ou Serveur
Stubs/Skeletons Classes C++ Bibliothèque Corba Classes C++
Stubs/Skeletons Classes Java Bibliothèque Corba Classes Java
Sockets TCP/IP
Sockets Java
OS
JVM ORB Core sur Internet (IIOP)
Page 65 65
Exemple : Hello en Java Hello.idl
Compilateur OMG-IDL / Java
_HelloImplBase.java
StubForHello.java
HelloClient.java
Hello.java HelloHelper.java HelloHolder.java
HelloImpl.java HelloServeur.java Serveur
Client
Page 66 66
Exemple : Hello en Java ■
Interface OMG-IDL Hello
interface Hello { void doHello(); };
■
Interface Java Hello
public interface Hello extends org.omg.CORBA.Object { public void doHello(); }
■
Classes Java HelloHelper, HelloHolder
Page 67 67
Exemple : Hello en Java ■
Classe StubForHello : implantation de la souche • Sert à envoyer les requêtes • Utilisé en lieu et place de l'objet Hello dans le client • Invisible pour le programmeur
■
Classe _HelloImplBase • Recoit et décode les requêtes • Doit être hérité par l'implantation
public class HelloImpl extends _HelloImplBase { public HelloImpl() {} public void doHello() { System.out.println("Hello world!"); } }
Page 68 68
Exemple : Hello en Java Org.omg.CORBA Object
Org.omg.CORBA PortableObjectImpl
Hello
Org.omg.CORBA DynamicImplementation
_HelloImplBase
StubForHello
interface
_HelloImpl
Classe abstraite
Classe concrète
extends implements
Page 69 69
Exemple : Hello en Java public class HelloServeur { public static void main(String args[]) { try { // Initialisation du Bus Corba org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); org.omg.CORBA.BOA boa = orb.BOA_init(args, null); // Creation de l'objet serveur HelloImpl hello = new HelloImpl(); // Diffusion de la référence de l'objet System.out.println("IOR(hello)=" + orb.object_to_string(hello)); // Mise en attente du serveur boa.impl_is_ready(null); System.exit(0); } catch (org.omg.CORBA.SystemException exc) { exc.printStackTrace(); System.exit(1); } } }
Page 70 70
Exemple : Hello en Java public class HelloClient { public static void main(String args[]) { try { // Initialisation du Bus Corba org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // Creation de la souche Java referencant l'objet distant org.omg.CORBA.Object obj = orb.string_to_object(args[0]); Hello hello = HelloHelper.narrow(obj); // Invocation de l'objet distant hello.doHello(); System.exit(0); } catch (org.omg.CORBA.SystemException exc) { exc.printStackTrace(); System.exit(1); } } }
Page 71 71
Exemple : Hello en Java ■
Génération des souches et squelettes
# mkdir hello # jidl Hello.idl --package hello
■
Compilation des sources
# mkdir classes # javac -d classes *.java hello/*.java
■ Execution # java HelloServeur IOR(hello)=IOR:10…09 # java HelloClient IOR:10…09 Hello world!
Page 72 72
Exemple : Hello en C++ Hello.idl
Compilateur OMG-IDL / C++
Hello_skel.h Hello_skel.cpp
Hello.cpp Hello.h HelloClient.cpp
HelloImpl.cpp HelloServeur.cpp
Client
Serveur
Page 73 73
Exemple : Hello en C++ ■
Définition de la Classe souche : Hello.h
class Hello; typedef Hello* Hello_ptr; class Hello_var { Hello_ptr ptr; … };
Libération automatique de la mémoire !
class Hello : virtual public CORBA_Object { … public: virtual void doHello(); static Hello_ptr _narrow(CORBA_Object_ptr); };
■
Implantation de la classe souche : Hello.cpp • spécifique à chaque ORB !
Page 74 74
Exemple : Hello en C++ ■
Définition de la classe squelette : Hello_skel.h
#include class Hello_skel : virtual public Hello, virtual public CORBA_Object_skel { public: virtual void hello() = 0; protected: Hello_skel(); void dispatcher(…); }
■ Implantation de la classe • Spécifique à chaque ORB
squelette : Hello_skel.cpp
Page 75 75
Exemple : Hello en C++ ■
Implantation de Hello en C++ : HelloImpl.cpp
// Importation du squelette C++ #include // Implantation par heritage class HelloImpl : Hello_skel { public: // Constructeur HelloImpl() : Hello_skel() {}; void doHello() { cout << "Hello world!" << endl; } }
Page 76 76
Exemple : Hello en C++ #include int main(int argc, char* argv[]) { try { // Initialisation du bus Corba CORBA_ORB_var orb = CORBA_ORB_init(argc, argv); CORBA_BOA_var boa = orb->BOA_init(argc, argv); // Creation de l'objet serveur Hello_var hello = new HelloImpl(); // Diffusion de la référence de l'objet CORBA_String_var helloIOR = orb->object_to_string(hello); cout << "IOR(hello)=" << helloIOR << endl; // Mise en attente du serveur boa->impl_is_ready(CORBA_ImplementationDEF::_nil()); return 0; } catch(CORBA_SystemException& exc) { PrintException(exc); return 1; } }
Page 77 77
Exemple : Hello en C++ #include int main(int argc, char* argv[]) { try { // Initialisation du Bus Corba CORBA_ORB_var orb = CORBA_ORB_init(argc, argv); // Creation de la souche Java referencant l'objet distant CORBA_Object_var obj = orb->string_to_object(argv[1]); assert(!CORBA_is_nil(obj)); Hello_var hello = Hello::_narrow(obj); // Invocation de l'objet distant hello->doHello(); return 0; } catch (CORBA_SystemException& exc) { PrintException(exc); return 1; } } }
Page 78 78
Exemple : Hello en C++ ■
Génération des souches et squelettes
# …/bin/idl Hello.idl
■
Compilation des sources
# gcc -o Hello.o Hello.cpp Makefile! #… # gcc -o HelloServeur HelloServeur.o HelloImpl.o Hello_skel.o Hello.o #…
■ Execution # ./HelloServeur IOR(hello)=IOR:10…09 # ./HelloClient IOR:10…09 Hello world!
Page 79 79
Application Cliente
Serveur Interface OMG-IDL
Implantation Objet Serveur Skeleton
Stub Bus Corba
Page 80 80
class StubForRepertoire implements Repertoire extends CorbaStub { … } ExcExisteDeja* ajouter(char* nom, char* tel); ExcInconnu* supprimer(char* nom); ExcInconnu* consulter(char* nom, char**tel);
Application Cliente
Serveur Interface Repertoire { void ajouter(String nom, String tel) interface Repertoire { throw(ExisteDeja); void ajouter(String nom, String tel) Interface nom) void supprimer(String throw ExisteDeja; throw(Inconnu); OMG-IDL void supprimer(String nom) String consulter(String nom) throw Inconnu; throw(Inconnu); String consulter(String nom) } throw Inconnu; }
Implantation Objet Serveur Skeleton
Stub Bus Corba
Page 81 81