You are on page 1of 118

Xavier Blanc

Xavier.Blanc@lip6.fr

L'environnement

C.O.R.B.A.
utilisation avec Java

Plan de la prsentation
Aperu de C.O.R.B.A.
Une premire application avec C.O.R.B.A.
Des applications plus consquentes
Service de dsignation
Etude du type Any
Les mcanismes dynamiques de C.O.R.B.A.
Synthse sur C.O.R.B.A.
2

Aperu de C.O.R.B.A.

Qu'est ce que l'O.M.G. ?

O.M.G. ( Object Management Group ) est un consortium qui


regroupe plus 800 entreprises du monde entier.
Consortium ouvert aux horizons autres que les concepteurs de logiciels
( industriels, chercheurs, universit, etc... ).

Ce consortium dfinit des spcifications pour fournir un modle de


coopration entre objets rpartis.

Fonctionnement de l'OMG

Plusieurs niveaux de souscriptions existent :


contributing, domain contributing, influencing, auditing, university.

Principe de cration des spcifications


request for information, request for proposal.

Principe d'approbation des spcifications


Task Force,
Technical Comitee
Architecture Board

Les spcifications de l'O.M.G.

L'OMG spcifie tous les constituants d'un modle objet global


appel O.M.A. ( Object Model Architecture )
CORBA est une partie de ce modle,

OMA
MDA

Utilitaires communs ( services ),


Elments spcifiques des corps de mtier ( objets de domaines ).

Qu'est ce que C.O.R.B.A. ?

CORBA ( Common Object Request Broker Architecture ) est un


environnement rparti (middleware).

Dfini par l'OMG :


premire spcification : 1991
seconde version majeure : 1995
troisime version majeure : 2002

Version courante ( Septembre 2002) : 3.0


7

Objectifs de CORBA

Fournir un environnement ouvert


les membres participent aux spcifications

Fournir un environnement portable


les API sont dfinis pour rendre les applications portables ( quelque
soit le produit CORBA utilis )

Fournir un environnement interoprable


Permettre aux applications CORBA de collaborer entre elles.

Le bus CORBA

Le bus CORBA = ORB

NT

UNIX

UNIX

PC

PC

Sparc

La vue relle du bus CORBA

ORB
PC/NT

ORB
PC/UNIX

ORB
Sparc/UNIX

NT

UNIX

UNIX

PC

PC

Sparc

Rseau TCP/IP
10

Serveur et objets

Un serveur CORBA peut hberger plusieurs objets CORBA.

Chaque objet est accessible indpendamment des autres objets du


serveur.

Chaque objet exprime son offre de services. Pour cela, on utiliser


un langage de description de services appel IDL CORBA.

11

Le langage IDL CORBA

Il s'agit de dcrire au sein d'une interface ( vue cliente de l'objet )


la liste des services offerts ( ensemble de fonctions ).

interface Horloge
{
string donne_heure_a_paris();
string donne_heure_a_pekin();
};

12

La compilation IDL

Une description IDL est compile pour gnrer les amorces


ncessaires au mcanisme RPC.

description
IDL

13

orc
m
a
'
el
d
n
o
i

ra t
n

G
Gn
rati
on

de l'
a

souche

ur

squelette

en t
i
l
c
e

mor
ce s

erve

Intervention des amorces


C.O.R.B.A.
Client Java

Objet C++

Souche Java

Squelette C++

ORB Java
PC/NT

ORB
PC/UNIX

ORB C++
Sparc/UNIX

NT

UNIX

UNIX

PC

PC

Sparc

Protocole IIOP
14

Souche : Cot client


Fonctions de la souche :

Prpare les paramtres dentre de


linvocation
Dcode les paramtres de sortie et le rsultat

Souche statique

Une par type dobjet serveur invoquer


Identique aux talons clients RPC
Gnre la compilation partir de linterface IDL

Souche dynamique

15

Souche gnrique construisant dynamiquement tout


type de requtes
Permet dinvoquer des objets serveurs que lon
dcouvre lexcution (i.e. dont on ne connat pas
linterface la compilation : Rfrentiel dinterfaces)

Squelette : Ct serveur
Fonctions du squelette :
dcode les paramtres dentre des invocations
prpare les paramtres de sortie et le rsultat

Squelette statique
un par type dobjet serveur invoquable
identique aux talons serveurs RPC
gnr la compilation partir de linterface IDL

Squelette dynamique
squelette gnrique prenant en compte dynamiquement tout
type de requtes
permet de crer lexcution des classes dobjets serveurs (i.e.
que lon ne connaissait pas la compilation)
16

L'identit d'un objet C.O.R.B.A.


Chaque objet C.O.R.B.A. est associ une rfrence
d'objet qui forme son identit.
Deux objets C.O.R.B.A. du mme type ( exemple deux
objets Horloge ) ont deux identits diffrentes.

Les rfrences d'objets sont


le moyen d'accs un objet.
serveur
17

L'adaptateur d'objets

Serveur
Objet A

Objet B

Squelette A

Squelette B

Client
Souche A

Adaptateur d'objets

Le bus C.O.R.B.A. ( O.R.B. )


18

L'adaptateur d'objets
Fonctions

Interface entre les objets CORBA et lORB


Enregistrement et recherche des implantations
dobjets
Gnration de rfrences pour les objets
Gestion de linstanciation des objets serveurs
Activation des processus dans le serveur
Aiguillage des invocations de mthodes vers les
objets serveurs

Diffrents type dadaptateur

BOA (Basic Object Adapter)


POA (Portable Object Adapter)

19

Les communications avec CORBA

Les participants un change CORBA communiquent l'aide d'un


protocole spcifique CORBA : IIOP ( Internet Inter-ORB
Protocol ).

Le protocole IIOP est indpendant du langage de programmation,


du systme d'exploitation et de la machine utilise.

Un client Java pourra utiliser un serveur C++

20

Normalisation des communications


Protocoles dinteroprabilit entre ORBs
conformes CORBA 2
GIOP : General Inter-ORB Protocol
Messages : request, reply, cancelrequest,
ncessite un protocole de transport fiable, orient connexion

IIOP (Internet IOP) : instanciation de GIOP sur TCP


Autres implantations de GIOP au-dessus de HTTP, RPC
DCE, RPC Sun

Composants du protocole
CDR : Common Data Representation
Format de donnes dencodage des donnes
21

IOR : Interoperable Object References (rfrences


dobjets)

Les services C.O.R.B.A.

Pour acclrer et faciliter le dveloppement d'applications avec


C.O.R.B.A., l'O.M.G a spcifie un ensemble de services.

22

A l'heure actuelle, plus de 17 services ont t dfinis.

Les services sont vendus sparment du bus CORBA.

Seul quelques services sont actuellement disponibles sur le march.

L'annuaire C.O.R.B.A.

L'annuaire C.O.R.B.A. est un service.

Il s'agit d'un serveur qui enregistre des associations nom / rfrence


d'objet.

23

Un serveur peut enregistrer ses objets dans l'annuaire.

Un client peut rcuprer l'accs un objet en consultant l'annuaire.

Vue du modle O.M.A.


Services
Annuaire

Transaction

Objets de domaines
Mdecine

Electronique

Le bus C.O.R.B.A.

Client

Serveur

Applications utilisateurs
24

Administration

Impression

Utilitaires communs

Une premire application


avec C.O.R.B.A.

25

Oprations raliser
1. Dcrire les services offerts des objets CORBA
2. Dvelopper les objets CORBA
3. Dvelopper le serveur
4. Dvelopper le client

26

Dcrire les services offerts

27

Le dveloppement d'une application CORBA commence par


l'numration des services offerts par chaque objet corba.

Une mme description IDL peut contenir plusieurs descriptions


d'objets.

Une description IDL s'effectue au sein d'un fichier texte comportant


par convention l'extension .idl

Chaque objet offre une interface qui contient une liste


d'oprations qui seront par la suite offertes aux applications
clientes.

Premires rgles sur l'IDL


Une interface est une numration d'oprations et de
dfinitions de types de donnes.
Pas de majuscule

interface Exemple
{
// contenu de l'interface
};
Se termine par un point virgule

Une interface supporte l'hritage multiple.

28

interface AutreExemple : Exemple1, Exemple2


{
// contenu de l'interface
};

Dcrire une opration


Les oprations dcrites dans une interface respectent le
format suivant :
type_de_retour nom_de_l'operation ( liste_des_paramtres ) ;

C.O.R.B.A. offre plusieurs types de donnes :


- les types de bases
- les types complexes

La liste des paramtres peut


tre vide.
29

Les types de bases

Les types de bases de CORBA sont :

30

boolean
octet
short ( ushort )
long ( ulong )
longlong ( ulonglong )
float
double
long double
char
wchar
string
wstring

Les paramtres d'une opration

La description d'un paramtre comporte trois parties :


le modificateur
le type de l'argument ( type de base ou type complexe )
le nom de l'argument

Le modificateur spcifie le sens d'change du paramtre :


in : du client vers l'objet CORBA
out : en retour, de l'objet CORBA le client
inout : quivalent un passage par adresse.

31

Un exemple de description IDL


L'exemple suivant dcrit un objet qui offre une interface appele
. Cette interface comporte une opration dnomme
entrane l'affichage d'un message sur le serveur

affiche qui

( message pass en tant

que paramtre ).

interface Premier
{
void affiche ( in string message ) ;
};

32

Premier

Compilation d'une description IDL

La description doit tre compile afin de gnrer les amorces


( souche et squelette ) requises pour l'tablissement de la
communication inter-processus.

Exemple de compilation IDL :


idlj fall v Premier.idl

jdk
1.

A l'issu de la compilation, plusieurs fichier sont crs :


PremierPOA.java : il s'agit du squelette,
_PremierStub.java : il s'agit de la souche,
Premier.java : il s'agit de l'interface

PO
A
BO
A

PremierOperations.java : il s'agit des oprations de l'interface


33

Concept de mapping

Une description IDL est traduite vers un langage de


programmation.

Les rgles de traduction sont appeles mapping et font partie de


la spcification CORBA.

Grce au mapping, deux fournisseurs d'ORBs offriront le mme


modle de programmation.
portabilit des applications

34

Correspondance des types de bases

35

IDL

boolean

octet

short
ushort

long
ulong

long long
ulong long

Java

boolean

byte

short

int

long

IDL

float

double

Java

float

double

IDL

string

wstring

Java

string

string

long double

char

wchar

char

char

Dvelopper les objets CORBA

Pour dvelopper un objet CORBA plusieurs critres sont prendre


compte :
le type de l'adaptateur d'objet utilis,
l'approche de dveloppement.

Deux adaptateurs d'objets sont disponibles :


le B.O.A. ( Basic Object Adapter )
le P.O.A. ( Portable Object Adapter )

Deux approches existent :


l'approche par hritage : ici l'implantation de l'objet doit hriter du
squelette ( c'est dire de la classe Java correspondant au squelette qui
t gnre par le compilateur ).
l'approche par dlgation (prochaine partie).

36

Lapproche par hritage

API de CORBA

org.omg.PortableServer.Servant

PremierPOA

Implantation
de l'objet

37

PO
A
BO
A

PremierOperations

A dvelopper par le programmeur

Gnr
partir de l'IDL

Dveloppement de notre
premier objet CORBA
public class PremierImpl extends PremierPOA
{
public void affiche( String message )
{

L'implantation hrite
du squelette.

System.out.println( message );
}
}

!
38

La seule obligation est de ne pas oublier l'hritage du squelette.


Ensuite, il faut tout simplement fournir le code des oprations
dcrites dans l'interface IDL.

Dvelopper le serveur
Les tapes respecter sont les suivantes :
initialiser l'ORB
initialiser l'adaptateur d'objets
crer l'objet CORBA
enregistrer l'objet CORBA
exporter la rfrence de l'objet CORBA
attendre les invocations clientes

39

Initialiser l'ORB

Pour cela, on fait appel la fonction statique init de la classe


org.omg.CORBA.ORB .

Deux formes de cette fonction sont disponibles :


org.omg.CORBA.ORB.init( )
org.omg.CORBA.ORB.init( String [] args, java.util.Properties prop )

public static void main( String [ ] args )


{
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, null );
//
}

40

PO
A
BO
A

Initialiser l'adaptateur d'objets

Une application serveur contient au minimum un POA


(elle peut en avoir plusieurs) appel le RootPOA
Le(s) POA(s) sont grs par le POA Manager
Une application serveur doit
Rcuprer une rfrence dobjet RootPOA
POArootpoa=
POAHelper.narrow(orb.resolve_initial_refer
ences
(RootPOA));
et
Activer le POA Manager

41

rootpoa.the_POAManager().activate();

POAManager & POA


SERVEUR
Requtes
client

ORB
(orb)

POAManager

Servant
Servant

POA
POA
POA*

Servant

Servant
Servant
Servant
Servant
Servant

*RootPOA
(rootpoa)
42

Crer et enregistrer l'objet CORBA

Pour crer l'objet CORBA, il suffit de crer une instance de la


classe d'implantation de l'objet ( PremierImpl ). Dans la
terminologie POA, cet objet sappelle un servant
PremierImpl premier = new PremierImpl();

Enregistrer un servant revient lui associer une rfrence :


org.omg.CORBA.Object ref = rootpoa.servant_to_reference(premier );

43

Echanger une rfrence d'objet

Chaque objet CORBA dispose d'une identit ( la rfrence d'objet ).

Pour qu'un client puisse appeler un objet CORBA, celui-ci doit en


connatre la rfrence de l'objet.
C'est pourquoi l'objet CORBA doit changer avec le client sa rfrence
d'objet.

Pour cela, on utilise deux oprations particulires de la classe


org.omg.CORBA.ORB :
object_to_string : cette opration transforme une rfrence d'objet en
une chane de caractres.
string_to_object : cette opration transforme une chane de caractres
en une rfrence d'objet.

44

Le code du serveur
import org.omg.CORBA.ORB;
import org.omg.PortableServer.*;
public class Serveur
{
public static void main( String [] args )
{
try {
ORB orb = ORB.init( args, null );
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
PremierImpl premier = new PremierImpl();
org.omg.CORBA.Object objref = rootpoa.servant_to_reference(premier);
String ref = orb.object_to_string( objref );
java.io.FileOutputStream file = new java.io.FileOutputStream("ObjectID");
java.io.PrintStream output = new java.io.PrintStream( file );
output.println( ref );
output.close();
orb.run();
} catch ( Exception ex )
{ ex.printStackTrace(); }
}

45

Dvelopper le client
Les tapes suivre sont les suivantes :
Initialiser l'ORB,
Rcuprer la rfrence de l'objet utiliser,
Convertir la rfrence vers le type de l'objet utiliser,
Utiliser l'objet.

46

Conversion de rfrences d'objets

org.omg.CORBA.Object

object_to_string

Premier

string_to_object

Conversion

47

org.omg.CORBA.Object

La conversion consiste utiliser une fonction spcifique


appele narrow .

Les classes helpers

Pour chaque lment dcrit en IDL, le compilateur gnre une


classe supplmentaire appele classe helper.

Cette classe porte le nom de l'lment IDL avec pour suffixe


"Helper".

Les classes helpers associes aux interfaces IDL comportent une


opration de conversion ( narrow ).
public class PremierHelper
{
public static Premier narrow( org.omg.CORBA.Object obj ) { // }
//...
}

48

Le code du client

49

public class Client


{
public static void main( String [ ] args )
{
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, null );
try {
java.io.FileInputStream file = new java.io.FileInputStream("ObjectID");
java.io.InputStreamReader input = new java.io.InputStreamReader( file );
java.io.BufferedReader reader = new java.io.BufferedReader(input);
String ref = reader.readLine();
file.close();
org.omg.CORBA.Object obj = orb.string_to_object(ref) ;
Premier premier = PremierHelper.narrow( obj );
premier.affiche("Bonjour du client");
} catch ( java.lang.Exception ex )
{ ex.printStackTrace(); }
}
}

Excuter l'application
Suivre les tapes suivantes :
lancer le serveur,
copier le fichier contenant la rfrence d'objet sur le poste
client,
lancer le client.

50

Synthse
Le dveloppement d'une application CORBA respecte
toujours les mme tapes.
Description des objets l'aide de l'IDL,
Implantation des divers objets,
Implantation du serveur avec changes des rfrences,
Implantation du client.

51

Exercice

Dveloppez une application CORBA qui offre deux objets :


l'objet Banque qui crer des comptes,
et l'objet Compte qui gre diverses informations ( titulaire, solde ).

Le client pourra crer de nouveaux comptes et manipuler chaque


compte pour y effectuer des crdits et dbits.

Les tapes sont :


dfinir la description IDL des objets Banque et Compte,
Dvelopper les implantations de ces objets,
Dvelopper le serveur puis le client.

52

Des applications plus


consquentes...

53

Gestion des exceptions

Si une erreur se produit lors du traitement dans l'objet C.O.R.B.A. il


est possible de faire remonter une exception du ct client.

Cette exception sera vhicule sur le rseau entre le serveur et le


client.

Comme tout lment chang sur le rseau avec C.O.R.B.A. une


exception doit tre dcrite en IDL.

54

Dcrire une exception en IDL

Pour dcrire une exception, on fait appel au mot clef IDL


exception :
exception nom_de_l'exception
{
membres_de_l'exception;
};

Chaque membre respecte le format suivant :


type_idl nom_du_membre;

55

L'exception peut ne pas avoir de membre.

Signaler qu'une opration peut


lancer une exception.

Comme en Java, une opration dcrite avec l'IDL doit signaler sa


capacit lancer une exception.

Pour cela, la description d'une opration doit comporter une clause


supplmentaire qui numre les exceptions pouvant tre lances.

Format de la clause raises :


raises ( liste_des_noms_d'exceptions )

Exemple :
void f( ) raises ( monException );

56

Les catgories d'exceptions

Il existe deux catgories d'exceptions sous C.O.R.B.A. :


les exceptions systmes ( hritent de
org.omg.CORBA.SystemException ),
les exceptions utilisateurs ( hritent de
org.omg.CORBA.UserException ).

Une exception dcrite en IDL est une exception utilisateur qui sera
traduite en Java sous forme d'une classe.

57

Lancer une exception


depuis l'objet CORBA

Pour lancer une exception CORBA on procde exactement de la


mme faon qu'en Java.

Chaque opration doit avoir une clause throws et l'on lance


l'exception avec l'instruction throw .
public void f() throws monException
{
//
throw new monException();
}

58

Intercepter l'exception dans le client

L'interception du ct client s'effectue toujours sur le mme


principe qu'en Java.

Un gestionnaire catch doit tre plac pour intercepter


l'exception.
try
{
objet.f();
}
catch ( monException ex )
{
System.out.println("Une exception s'est produite");
}

59

Mapping IDL/Java & Exception

Une exception IDL peut tre dfinie au sein d'une interface IDL.
interface Diviseur
{
exception DivisionParZero { };

};

60

float division( in float nb1, in float nb2 )


raises ( DisivionParZero );

Dans ce cas, la traduction de DivisionParZero sera lgrement


diffrente car celle-ci sera place dans un package Java portant le nom de
l'interface avec pour suffixe Package .

Ainsi, le nom de l'exception en Java sera :


DiviseurPackage.DivisionParZero

Cette rgle s'applique tous les types complexes qui sont dcris dans une
interface.

Exercice

Ecrire l'implantation de l'interface IDL suivante ainsi qu'un extrait


de client qui utiliserait celle-ci.
exception DivisionParZero
{ };
interface Diviseur
{
float division( in float nb1, in float nb2 )
raises ( DisivionParZero );
};

61

Les attributs IDL

Il est possible dans une description IDL de dfinir des attributs


d'interface.

Un attribut est une donne accessible soit en lecture/criture, soit en


lecture seulement.

Pour dcrire un attribut, on respecte le format suivant :


[ readonly ] attribute type_de_l'attribute nom_de_l'attribut;

Optionnel, ce mot clef signale que l'attribut


est accessible en lecture seule.
62

Traduction d'un attribut IDL en Java

Un attribut est traduit en Java en deux oprations ( une pour la


lecture et une pour l'criture ).

Rgle de traduction :
[ readonly ] attribute type nom ;
public void nom( type value );
public type nom( );

Exemple :
attribute string nom;
public void nom( String value );
public String nom();

63

L'opration d'criture n'existe


pas dans le cas d'un attribut
spcifi "readonly".

Le module IDL

La notion de module est similaire celle de package de Java.

Un module introduit un espace de dsignation supplmentaire. On


notera qu'un module peut contenir un autre module, une interface,
une description de type complexe.

La description d'un module respecte la syntaxe suivante :


module nom_du_module
{
// corps du module
};
Un module est traduit en un package.

64

Exercice

Implanter l'objet CORBA dont la description IDL est la suivante :


module Exemple
{
interface Personne
{
readonly attribute string nom;
attribute string adresse( );
readonly attribute long age();
void anniversaire();
};
};

65

Notion d'Alias

Un alias permet de dfinir un autre nom pour un type existant.

Pour dcrire un alias en IDL, on respecte la rgle suivante :


typedef nom_du_type nom_de_l'alias;

Exemple :
typedef long Heure;

Par la suite, on peut utiliser l'alias comme type :


void fixe_heure( in Heure h );

66

Traduction d'un Alias en Java

La notion d'alias n'existe pas en Java. C'est pour cette raison que
l'alias est remplac en Java par le type original.

// IDL
typedef long Heure;
interface Exemple
{
void fixe_heure( in Heure h );
};
// Java
public interface Exemple //
{
public void fixe_heure( int h );
}
67

Notion de squence IDL

Une squence est une donne similaire un tableau.

Une squence se dcrit en IDL par le mot clef sequence . La


description d'une squence est couple celle d'un alias.

On distingue deux types de squences :


les squences bornes : sequence< type, borne >
les squences non bornes : sequence< type >

Exemples :
typedef sequence<String> liste;
typedef sequence<String, 100> liste_bornee;

68

Traduction d'une squence en Java

Une squence IDL est traduite en un tableau Java.

Exemples :
// IDL
typedef sequence<long> colonne;
// Java
int [ ]
// IDL
typedef sequence<colonne> matrice;
// Java
int [ ] [ ]

69

Notion de structure IDL

Une structure IDL est une description qui permet de regrouper


plusieurs donnes appeles membres.

Les structures IDL doivent contenir au minimum un membre.

Chaque structure respecte le format suivant :


struct nom_de_la_structure
{
liste_des_membres;
};

chaque membre est dcrit par :


type nom;
70

Exemple de structure
struct Personne
{
string nom;
string prenom;

Une structure peut ensuite servir de type de donne.

};
typedef sequence< Personne > liste;
interface Course
{
attribute liste participants;
};
71

Traduction d'un structure

Une structure est traduite en une classe Java ou chaque membre


est un attribut public de cette classe.

Cette classe comporte deux constructeurs :


un constructeur par dfaut,
un constructeur avec un paramtre pour chaque membre.

Chaque membre est lui mme traduit selon la rgle standard qui lui
est propre ( exemple : une squence est traduite en un tableau ).

72

Exemple de traduction de structure


// IDL
struct Personne
{
string nom;
string prenom;
};
// Java
public class Personne //
{
public String nom;
public String prenom;
public Personne() { // }
public Personne( String _nom, String _prenom ) { // }
73

Hritage d'interfaces IDL

74

La langage de description IDL supporte le concept d'hritage


multiple.

Par contre aucune surcharge n'est autorise.

Pour convertir une rfrence d'objet vers une rfrence d'un objet
de base on doit utiliser l'opration narrow :
interface Base
{ // };

Sub a = .

interface Sub : Base


{ // }:

Base b = BaseHelper.narrow( a );

Echange de rfrence d'objets

Parmi les types de bases de l'IDL il existe celui de rfrence d'objet


symbolis par Object .

Ainsi, l'aide de ce paramtre un client pourra changer des


rfrences avec un objet CORBA.

On peut galement changer des rfrences d'objets types en


utilisant comme paramtre le nom d'une interface IDL.

75

Exemples
interface Exemple
{
//
};
interface AutreExemple
{
void f ( in Object obj );
void g ( in Exemple obj );
};

76

On pourra grce f changer des


rfrences d'objets dont celle de Exemple .

Avec g on ne pourra changer que des


rfrences d'objets vers Exemple o
des rfrences d'objets hritants
de Exemple .

Les classes Holders

77

Afin d'changer des paramtres d'oprations par adresses, une


classe supplmentaire est gnre : la classe holder.

Pour chaque type standard de CORBA ainsi que ceux dfinis en


IDL, une classe holder est gnre.

Une classe holder porte le mme nom que le type avec pour
suffixe Holder .

Cette classe comporte un attribut public appel value qui


correspond au type associ la classe holder.

Exemple de classe holder


Format gnral :
public class XXXHolder //
{
public XXX value;
public XXXHolder() { // }
public XXXHolder( XXX _value ) { }
// ...
}
Exemple pour org.omg.CORBA.StringHolder :

78

public class StringHolder // ...


{
public String value;
public StringHolder() { // }
public StringHolder( String _value ) { // }
// ...
}

Quelques piges...
Type standard IDL : string
Traduction en Java : String
Classe holder associe : org.omg.CORBA.StringHolder
Type utilisateur IDL : typedef long heure;
Traduction en Java : int
Classe holder associe : org.omg.CORBA.IntHolder

!
79

Aucune classe holder n'est gnre pour une


re-dfinition de type except pour les squences
et les tableaux.

Les paramtres out et inout

Un paramtre de type out ou inout est traduit en un holder.

Exemples :
// IDL
void retourne_heure( out Heure h );
// Java
public void retourne_heure( org.omg.CORBA.IntHolder h );
// IDL
typedef sequence<long> colonne;
typedef sequence<colonne> matrice;
void ajoute_matrices( in matrice m1, in matrice m2, out matrice result );
// Java
public void ajoute_matrices( int [ ][ ] m1, int [ ] [ ] m2, matriceHolder result );

80

Exercice

Implanter l'interface suivante :


interface Exemple
{
typedef struct Personne
{
String nom;
String prenom;
} coureur;
typedef sequence< coureur > participants;
void inscrire_coureur( in coureur C );
void liste_des_coureurs( inout participants coureurs );
};

81

Approche par dlgation

Lapproche par hritage ne permet pas un objet dimplanter plusieurs


interfaces.

Dans l'approche par dlgation, l'implantation de l'objet n'hrite plus de


squelette mais implante l'interface d'oprations. Lhritage multiple
dinterface est donc possible.

L'implantation de l'objet est appele : le dlgu.

Une autre classe est gnre : la classe de dlgation. La classe de


dlgation est un objet CORBA qui dlgue ses oprations au dlgus.

82

Illustration du principe de dlgation

Client

Invoque

Objet de dlgation
Dlgue

Dlgu

!
83

Le dlgu n'est pas un objet CORBA. Il ne


dispose donc pas d'une rfrence d'objet.

Cration de lobjet dlgu


Lobjet dlgu nest plus un objet CORBA.
Il implante linterface PremierOperations
public class PremierImpl implements PremierOperations {
public void affiche(String message) {
System.out.println("le message : "+message);
}
}
84

Gnration de l'objet de dlgation

L'objet de dlgation est automatique gnr partir de la


description IDL.

Pour cela, il faut appliquer une option spciale du compilateur


d'IDL :
idl2java fallTIE Premier.idl

La classe de dlgation porte le nom de l'interface laquelle elle est


associe avec pour suffixe Tie .
PremierPOATie.java

85

jdk
1.4

PO
A
BO
A

Utilisation de l'objet de dlgation

L'objet de dlgation comporte une opration importante :


son constructeur qui prend en paramtre l'objet dlgu

Le serveur doit donc


crer l'objet de dlgation en lui donnant comme paramtre son
dlgu : new PremierTie(new PremierImpl())
connecter celui-ci l'adaptateur d'objets.
exporter au client la rfrence de l'objet de dlgation.

86

Il ny a aucune modification du client

Exercice
Reprendre l'exercice prcdent en utilisant cette fois
l'approche par dlgation. On devra en plus dvelopper
le serveur.
interface Diviseur
{
exception DivisionParZero { };
float division( in float nb1, in float nb2 )
raises ( DisivionParZero );
87

};

Service de dsignation

88

Commenons par un exercice


Exporter/Importer une rfrence dobjet dans un
fichier est fastidieux
Pourquoi ne pas crer un objet CORBA qui
stocke les rfrences dobjets et permet dy
accder partir de noms symboliques (DNS)
A vous de dfinir lIDL

89

Service de dsignation (nommage)


Rle : retrouver les rfrences dobjet partir de
noms symboliques
Dfinition du service : dans une interface IDL
Module CosNaming

Structure : arborescence appel graphe de


dsignation (Naming Graph)
Une racine
Des rpertoires, appels contexte de nommage
Des feuilles : les rfrences dobjet

90

Un contexte est un objet qui gre une liste de


liaisons (= associations nom-rfrence)

Enregistrer une IOR dans lannuaire


= Crer une liaison dans un contexte
~ ranger lassociation nom-IOR dans un rpertoire

Rcuprer la rfrence du contexte dans lequel on va


crer la liaison
Hypothse dans lexemple : la liaison est cre la racine de
larbre => on rcupre lIOR de la racine
NamingContextncRef=NamingContextHelper

.narrow(orb.resolve_initial_references(("NameSe
rvice")));

Faire la liaison (mthode bind() ou rebind()) de


lobjet contexte ncRef) entre le nom et lIOR href
91

Quest-ce quun nom ?

Quest-ce quun nom ?


Squence ordonne de doublons
(Identificateur, Qualificatif)
Un seul doublon = nom simple
("Hello","appliCORBA")

classe NameComponent
Dfinir un nom simple
Crer une squence un doublon (~ 1 tableau 1 lm.)
NameComponent[]name=new
NameComponent[1];
Initialiser la squence
name[0]=newNameComponent();
name[0].id="Hello";name[0].kind=
"appliCORBA";
92

La liaison
Liaison : Mthodes bind ou rebind de linterface
NamingContext
bind(name, href) : cre la liaison name-href dans le
contexte ncref
rebind(name, href) : cre la liaison name-href dans le
contexte ncref mme si le nom est dj li

93

Obtenir une rfrence


Retrouver une IOR tant donn un nom
= rsolution de noms
La rsolution
Commence la racine => il faut se positionner sur la
racine, donc rcuprer son IOR (cf le serveur)
Est faite par la mthode resolve(name) de
linterface NamingContext
=> il faut initialiser name, de type
NameComponent (cf le serveur)
Ne pas oublier de caster (narrow) vers le type voulu
94

orbd

jdk

1.4

Service de dsignation du jdk1.4


Lancer orbd :
orbd ORBInitialPort ?? ORBInitialHost ??

Dans le serveur, mettre les paramtres suivants


dans linitialisation de lORB
ORBInitialPort ??
ORBInitialHost ??

95

Etude du type Any

96

Any : un mta type !

Le type Any est un type de donne de CORBA.

En IDL, le mot clef correspondant est any .

Un type Any peut contenir une valeur de nimporte quel autre type
de donne de CORBA ( types de bases et types complexes ).

Ainsi, un Any peut contenir un entier, un rel et mme une structure


ou une squence.

97

Le type Any en Java

CORBA fournit une classe appele org.omg.CORBA.Any qui


correspond la traduction en Java du type IDL any .

Cette classe comporte de nombreuses oprations dont certaines pour


insrer une valeur et dautres pour extraire une valeur.

Ainsi, pour chaque type de base de CORBA il existe un couple


doprations ( insertion / extraction ) qui respecte le format suivant :
void insert_XXXX( xxxxx valeur );
xxxxx extract_XXXX( ) throws org.omg.CORBA.BAD_OPERATION;

Le nom Java du type


98

Le nom IDL du type

Cette exception est lance si


le type demand nest pas celui contenu.

Cration dun type Any

Pour crer un type Any on utilise lopration create_any


propose par la classe ORB.

Exemple :
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();
org.omg.CORBA.Any monAny = orb.create_any();

99

Exemple dutilisation
public class Exemple
{
public static void main( String [] args )
{
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, null );
org.omg.CORBA.Any any = orb.create_any();
int nombre = 100;
any.insert_long( nombre );
int extrait = any.extract_long( );
}
}
100

Exercice
Dvelopper lapplication suivante ( client et objet ) :
interface Calculatrice
{
any addition( in any nb1, in any nb2 );
};

Le client pourra alors additionner des entiers ( int ) et


des rels ( float ).

101

Insrer et extraire des types complexes

Pour tous les types dfinis par lutilisateur en IDL, le compilateur


gnre une classe dite Helper qui porte le nom du type et ayant
pour suffixe Helper .

Une classe Helper comporte deux oprations statiques pour


respectivement insrer et extraire une valeur du type auquel elle est
associe .

Les oprations respectent le format suivant :


void insert( org.omg.CORBA.Any any, xxxxx valeur );
xxxxx extract( org.omg.CORBA.Any any );

102

Si le type Any ne contient pas la valeur attendue, alors une


exception de type org.omg.CORBA.MARSHAL est lance.

Connatre le type de la valeur dun Any

Il est galement possible dinterroger le type Any afin de connatre


le type de la valeur quil contient.

En effet, chaque Any est associ deux informations :


La valeur quil contient,
La description du type de la valeur.

Lopration type de la classe org.omg.CORBA.Any retourne


la description du type.

103

La description du type

104

La description du type est en fait une classe qui comporte un grand


nombre doprations pour obtenir des informations sur le type.

Le type est reprsent par un TypeCode dont la classe Java se


nomme org.omg.CORBA.TypeCode .

Tous les types CORBA ( simples et complexes ) ont un TypeCode


( une description ).

Les informations retournes par un TypeCode sont forcment


fonction du type quil dcrit. De ce fait, toutes les oprations de la
classe TypeCode ne sont pas utilisables chaque fois.

Les familles de types

Chaque type CORBA est associ une famille de type appel TCKind.

Chaque type simple dispose de sa propre famille dont le nom est tk_xxxx
( boolean = tk_boolean ).

Les types complexes appartiennent chacun une famille prcise comme :


tk_struct, tk_sequence,

En Java, la classe org.omg.CORBA.TCKind correspond la traduction


du type CORBA TCKind.
Cette classe comporte pour chaque catgorie de famille un attribut public de
valeur entire dont le nom est celui de la catgorie prcd de _ :
_tk_boolean
Cette classe comporte galement pour chaque catgorie un objet de type
TCKind dont le nom est celui de la catgorie. Pour obtenir la valeur entire de
ce TCKind, on utilise lopration value .

105

Les principales oprations dun TypeCode

Parmi les oprations les plus utiles, on distingue :


String name() : retourne le nom du type
TCKind kind() : retourne la famille du type
int member_count() : retourne le nombre de membres ( structure et
exceptions )
String member_name( int index ) : retourne le nom dun membre
TypeCode member_type( int index ) : retourne la description du type
dun membre
int length( ) : retourne la taille du type ( squences et tableaux )
TypeCode original_type() : retourne le type original ( alias )

106

Obtenir le TypeCode dun type


On distingue deux mthodes selon que le type soit
simple ou complexe :
Les types simples : on utilise lopration get_primitive_tc
propose par la classe ORB. Cette opration requiert en
paramtre le TCKind du type demand.
Les types complexes : les classes Helpers fournissent une
opration statique appele type .

107

Exemple
// Initialise lORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init();

// Rcupre le TypeCode dun type simple : octet


org.omg.CORBA.TypeCode tc_simple =
orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_octet );

// Rcupre le TypeCode dune structure Personne dcrite en IDL


org.omg.CORBA.TypeCode tc_complexe = PersonneHelper.type( );

108

Exercice
Reprendre lapplication prcdente en utilisant la notion
de TypeCode :
Typedef sequence<int> intSequence;
interface Calculatrice
{
any addition( in any nb1, in any nb2 );
};

Les types additionner seront soit des entiers, des rels


ou des squences dentiers.
109

Les mcanismes dynamiques


de C.O.R.B.A.

110

Concept de mcanismes dynamiques


Il est possible dans C.O.R.B.A. de ne pas utiliser de
souche du ct client !
De mme, il est possible de ne pas utiliser de squelette
du ct serveur !
Si l'application cliente n'utilise pas de souche, elle doit
alors construire elle mme dynamiquement les
invocations vers les objets CORBA.

111

De mme, si une application serveur n'utilise pas de


squelette, elle doit alors intercepter dynamiquement les
invocations clientes.

Le mcanisme D.I.I.

112

Le mcanisme D.I.I. ( Dynamic Invocation Interface ) fournit une


API pour crer manuellement ses requtes et invoquer celles-ci
auprs d'un objet.

Grce D.I.I. on peut facilement dvelopper des applications


clientes gnriques capable d'invoquer n'importe quel objet
CORBA.

Le mcanisme D.I.I. est galement utilis pour fournir une


portabilit de la souche. En effet, en employant dans le code de la
souche uniquement des oprations de D.I.I. toutes les souches
seront portables d'un ORB un autre.

Le mcanisme D.S.I.

113

Le mcanisme D.S.I. ( Dynamic Server Interface ) permet de


concevoir des serveurs capables d'intercepter des invocations
clientes sans squelette.

L'API de D.S.I. fournit toutes les fonctions ncessaires la capture


d'une requtes et l'interprtation des lments qui la constitue.

A l'aide de D.S.I. on peut dfinir des serveurs gnrique mais


galement offrir la portabilit du squelette ( sur le mme principe
que D.I.I. pour la souche ).

Notion de rfrentiel d'interfaces

114

Le rfrentiel d'interfaces ( IR = Interface Repository ) est un


serveur CORBA.

Ce serveur est une sorte de base de donnes qui contient des


descriptions d'objets CORBA.

Ces descriptions ( identiques IDL ) sont accessibles via un


ensemble d'interfaces.

Le rfrentiel d'interfaces peut tre utilis par un client ou serveur


CORBA afin d'obtenir des informations sur la description d'un
objet. Coupl D.I.I. ou D.S.I. le rfrentiel d'interfaces permet la
mise en uvre d'applications totalement gnriques.

Synthse sur C.O.R.B.A.

115

Un environnement complet...

C.O.R.B.A. est une architecture qui dfinit un environnement pour


permettre la collaboration entre applications rparties.

C.O.R.B.A. est disponible sur de nombreuses plate-formes, dans de


nombreux langages et chez de nombreux fournisseurs.

C.O.R.B.A. est simple programmer en comparaison des


environnements quivalent.

116

C.O.R.B.A. offre une homognisation du systme d'informations.

Vue de l'architecture C.O.R.B.A.

Objet C.O.R.B.A.
CLIENT

SERVEUR
Squelette

souche

D.I.I.

Adaptateur d'objets

le bus C.O.R.B.A.
117

D.S.I.

Pour plus d'informations...

Quelques ouvrages
Au cur de CORBA
( J.DANIEL, Vuibert )

CORBA : des concepts la


pratique
( Ph.MERLE, InterEditions )

118

You might also like