Académique Documents
Professionnel Documents
Culture Documents
■ 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.
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
Page 5
5
O.M.G. - Modèle
Page 6
6
O.M.G. - Modèle
Application Application
Cliente Serveur
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
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
Objets Interfaces Utilitaires communs
applicatifs de domaine
Workflow Administration
Télécoms
Spécifiques Santé Finance DataWare IHM
Cycle
Interrogations de vie Transactions Propriétés Persistance Events Changements Concurrence
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 SSI
ORB
SII SII
Interface Object Adaptor
Object Request Broker
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
■ Masque l'hétérogénéïté
■ Description des interfaces d'objets Corba
■ Production du code de communication entre
les objets
Page 19
19
Le langage OMG-IDL
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
Code ADA Code
C OMG-IDL Cobol
OMG-IDL OMG-IDL
Application
OMG-IDL OMG-IDL
Objet Objet
C++ Java
Page 21
21
Le langage OMG-IDL
Isolation Interface/Implantation
Interface
Application OMG-IDL
Cliente
Implantation
Objet Serveur
Stub Skeleton
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
Page 23
23
Le langage OMG-IDL
Isolation Interface/Implantation
Coté Client Coté Implantation
Cobol Cobol
C C
IDL IDL
IDL IDL
Ada IDL IDL
Ada
ORB ORB
IDL IDL
Java IDL IDL
Java
IDL IDL
C++ C++
Smalltalk Smalltalk
Page 24
24
CORBA
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
Page 29
29
Opération OMG-IDL
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
Page 31
31
Le langage OMG-IDL
Page 32
32
Le langage OMG-IDL
Exemple
// Interface OMG-IDL d'un service d'annuaire
#include <date.idl> // Réutilisation du service de dates
module annuaire {
typedef String Nom; // Nom d'une personne
typedef sequence<Nom> 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<Personne> DesPersonnes;
Page 33
33
Le langage OMG-IDL
Exemple
interface Repertoire {
readonly attribute string libelle;
Page 34
34
Le langage OMG-IDL
Type de données élémentaires
void rien
short entier 16 bits
unsigned short entier 16 bits non signé
long entier 32 bits
unsigned long entier 32 bits non signé
long long entier 64 bits
…
float, double, long double réel 32, 64 et 128 bits (IEEE)
boolean booleen (true, false)
octet donnée 8 bits (opaque)
char caractère 8 bits (ISO Latin)
wchar caractère 16 bits International
string, wstring chaînes de caractères
string<80>, wstring<256> 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<long> Vecteur;
typedef sequence<Vecteur> 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 { … };
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 Corba::Object
• Héritage multiple
• Ni surcharge, ni redéfinition Peripherique
■ Exemple
interface Peripherique { … };
Ecran HP
interface Ecran : Peripherique { … };
Interface HP : Peripherique { … };
Interface EcranAvecHP : Ecran, HP { … }; EcranAvecHP
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
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
Projection
C++
Compilateur
IDL/C++
Compilateur
IDL/IR
Référentiel
des Interfaces
Page 48
48
Notion de projection
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
Page 51
51
Projection OMG-IDL / Java
■ Types élémentaires
OMG-IDL Java
char char
wchar char
string java.lang.String
wstring java.lang.String
fixed java.math.BigDecimal
Page 52
52
Projection OMG-IDL / Java
Page 53
53
Projection OMG-IDL / Java
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
Org.omg.Corba.userException Org.omg.Corba.SystemException
Page 56
56
Projection OMG-IDL / Java
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 Mois(_Jan);
…
public static final int _dec = 11;
public static final Mois dimanche = new Mois(_dec);
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;
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 = … ;
short v1 = p_out.value;
int v2 = p_inout.value;
Page 63
63
Orbacus
Page 64
64
Orbacus
Stubs/Skeletons Stubs/Skeletons
Classes C++ Classes Java
Bibliothèque Corba Bibliothèque Corba
Classes C++ 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
Hello.java
HelloHelper.java HelloImpl.java
HelloHolder.java
HelloClient.java
HelloServeur.java
Client Serveur
Page 66
66
Exemple : Hello en Java
Page 67
67
Exemple : Hello en Java
Page 68
68
Exemple : Hello en Java
Org.omg.CORBA
Object
Org.omg.CORBA Org.omg.CORBA
PortableObjectImpl Hello DynamicImplementation
_HelloImplBase
StubForHello _HelloImpl
Page 69
69
Exemple : Hello en Java
<HelloServeur.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
<HelloClient.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
■ 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.cpp Hello_skel.cpp
Hello.h
HelloImpl.cpp
HelloClient.cpp
HelloServeur.cpp
Client Serveur
Page 73
73
Exemple : Hello en C++
Page 74
74
Exemple : Hello en C++
Page 75
75
Exemple : Hello en C++
void doHello() {
cout << "Hello world!" << endl;
}
}
Page 76
76
Exemple : Hello en C++
<HelloServeur.cpp>
#include <Hello_skel.cpp>
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++
<HelloClient.Cpp>
#include <Hello.h>
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
■ Execution
# ./HelloServeur
IOR(hello)=IOR:10…09
# ./HelloClient IOR:10…09
Hello world!
Page 79
79
Application Serveur
Cliente
Interface
OMG-IDL
Implantation
Objet Serveur
Stub Skeleton
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 Serveur
Interface Repertoire {
Cliente void ajouter(String nom, String tel)
interface Repertoire {
throw(ExisteDeja); void ajouter(String nom, String tel)
Interface nom)
void supprimer(String throw ExisteDeja;
OMG-IDL
throw(Inconnu); void supprimer(String nom)
String consulter(String nom) throw Inconnu;
throw(Inconnu); String consulter(String nom)
} throw Inconnu;
}
Implantation
Objet Serveur
Stub Skeleton
Bus Corba
Page 81
81