Vous êtes sur la page 1sur 127

Architectures logicielles:

RMI et CORBA

2me Anne Gnie Informatique Ecole Hassania des Travaux Publics


Karim Guennoun

Le menu

La technologie RMI Exemples (dmo) TP RMI Un middleware un peu plus costaud (CORBA) et multi-langages TP CORBA

Fonctionnement des applications distribues Exemple: RMI

Remote Method Invocation


RMI technologie SUN pour la mise en uvre dobjets distribus Le but de RMI est de permettre l'appel, l'excution et le renvoi du rsultat d'une mthode excute dans une machine virtuelle diffrente de celle de l'objet l'appelant Sappuie sur le stub (ct client) et le skeleton (ct serveur) pour implmenter la communication distante Package: java.rmi

Les deux parties

Une application RMI est constitue gnralement de deux programmes:

Partie Serveur:

Cre des objets distants Cre des rfrences sur ces objets pour les rendre accessibles Attends les requtes des clients: appels distants sur des mthodes sur ces objets Obtient une ou plusieurs rfrences sur des objets distants localiss sur un ou plusieurs serveurs Effectue des appels distants sur les mthodes des objets

Partie Client:

Interfaces, objets et mthodes distantes

Comme nimporte quelle application Java, une application distribue RMI est constitue dinterfaces et de classes

Les interfaces dclarent des mthodes Les classes implmentent ces mthodes et dautres mthodes additionnelles

Les objets possdant des mthodes pouvant tre appeles travers plusieurs JVMs sont appels objets distants.

Ils implmentent une interface distante (remote interface) possdant les caractristiques suivantes:

Hrite de java.rmi.Remote Chaque mthode de linterface peut lever lexception: java.rmi.RemoteException

Fonctionnement de linvocation distante dans RMI

RMI traite un objet distant de manire diffrente par rapport un objet local

Au lieu de crer une copie de lobjet sur lautre JVM (ct client), RMI utilise un stub pour chaque objet distant:

Le stub joue le rle dun reprsentant local (ou proxy) pour lobjet distant Le client invoque la mthode sur le stub local Le stub transporte lappel de mthode vers lobjet distant

Le stub dun objet distant implmente la mme interface distante que lobjet distant

Permet de caster toutes les mthodes Seules les mthodes dclares dans linterface peuvent tre invoques distance

Etapes de cration des applications RMI

Le dveloppement dune application RMI correspond 4 tapes


Design et implmentation des composants de lapplication distribues Compilation des sources Connexion des classes sur le rseau Dmarrage de lapplication

Design et implmentation

Dfinir larchitecture de lapplication

Quels composants sont locaux et lesquels sont distants Dfinir les interfaces distantes pour les composants distants

Spcifient les mthodes invocables distance par les clients (types des paramtres et type de retour)

Implmentation des objets distants:

Les objets distants


Doivent implmenter une ou plusieurs interfaces distantes Peuvent implmenter dautres interfaces et mthodes qui ne peuvent tre appeles que localement

Implmentation des clients:

Les clients qui utilisent les objets distants peuvent tre implments nimporte quel moments aprs la dfinition des

Compilation des sources

Gnration des codes excutables:


Compiler les codes sources (serveurs , clients, les classes dimplmentation) javac Compiler linterface rmic

Gnration du stub

10

Rendre les objets accessibles

Enregistrement sur le registre rmi

Spcification dune localisation Attribution dun nom

Mthode bind (rebind) de la classe java.rmi.Naming

11

Lancement de lapplication

Excution:

Du registre dobjets RMI Du Serveur

Du client

12

Rcapitulation

Ct serveur:

Dfinition de linterface daccs distant Implmentation de la classe de lobjet distant Implmentation du serveur qui cre lobjet distant et lenregistre sur le registre de nommage RMI (RMI registry) Lobtention dune rfrence sur lobjet distant travers le registre de nommage RMI La ralisation des appels de mthodes distantes en utilisant cette rfrence

Ct client: implmentation comprenant

13

Exemple simple

14

Un exemple simple: Lobjet Hello

Lapplication est constitue des classes


Hello: implmente lobjet HelloInt: linterface de lobjet distant Serveur: la partie serveur de lapplication Client: la partie client de lapplication

15

Linterface

package hello; import java.rmi.*; public interface HelloInt extends Remote { public void SayIt() throws RemoteException; }
16

Doit hriter de linterface java.rmi.Remote Publie les mthodes accessibles par appels distants Dans un fichier HelloInt.java:

Limplmentation

Implmente le code de lobjet distant Implmente toutes les mthodes dclares dans linterface Hrite de la classe UnicastRemoteObject Toutes les mthodes y compris le constructeur lvent lexception RemoteException

17

La classe Hello.java
package hello; import java.rmi.*; import java.rmi.server.*; public class Hello extends UnicastRemoteObject implements HelloInt { public Hello() throws RemoteException { super(); } public void SayIt()throws RemoteException { System.out.println("bonjour"); } }

18

Le serveur

import java.rmi.*; import java.rmi.registry.*; import hello.*; public class Serveur{ public static void main(String[] args) throws Exception { // cration de lobjet Hello h = new Hello();
19

Cre lobjet distant Lenregistre sur le serveur de nommage RMI Dans un fichier Serveur.java

Le serveur

Lenregistrement dun objet se fait travers la mthode rebind Prend en paramtre:


Lobjet Sa localisation: port et nom attribu

20

Introduire le reste du code du serveur: System.out.println("Je vais enregistrer mon objet"); Naming.rebind("rmi://localhost:1099/hello",h); System.out.println("Cest fait!"); }}

Le client

La premire tape est dobtenir une rfrence sur lobjet distant:


Utiliser la mthode statique lookup de la classe naming Retourne le stub en faisant une recherche sur le nom de lobjet rfrenc dans le registre de nommage Retourne lexception NotBoundException si la recherche choue

21

Le code du client
import hello.*; import java.rmi.*; public class Client{ public static void main(String[] args) { try { Remote remote_h = Naming.lookup("rmi://localhost:1099/hello"); if (remote_h instanceof HelloInt) { ((HelloInt) remote_h).SayIt(); } } catch (Exception e) { } }}

22

Structuration de lapplication

23

Dans un rpertoire mon_premier_RMI

Les classes Client et Serveur les classes Hello et HelloInt dedans

Un rpertoire hello avec

Mettre le rpertoire courant dans le classpath Compilation du serveur et du Client

javac *.java rmic hello.Hello

Gnration du stub

Excution

Lancement du registre de nommage

java sun.rmi.registry.RegistryImpl 1099 java Serveur java Client

Lancement du serveur

Lancement du client

24

A vous de jouer!

Afficher un message de retour chez le client En considrant plusieurs clients et plusieurs Serveurs:

Passer le nom du client au serveur Passer le nom du serveur au client

En crant un autre objet Bonjour, et un autre ServeurBis, construire une architecture en squence o le client appelle Serveur qui appelle ServeurBis
ServeurBis Client
Bonjour Hello

Serveur

25

Le middleware ORB et La norme CORBA

26

Points Abords

27

Le middleware Concepts gnraux de CORBA Lapplication Hello Le langage IDL Mapping IDL et Java Cration et connexion des objets au BUS Localisation des objets en CORBA tapes de dveloppement

Le middleware

Motivation et objectifs

28

Le middleware

Li larchitecture 3-tier Le terme middleware est une combinaison de middle (du milieu) et software (logiciel) En franais, plusieurs terminologies

intergiciel logiciel dintermdiation par abus de langage: Bus logiciel

29

Motivations

Comment rendre l'criture d'applications distribues "aussi simple" que celle des applications centralises ? Quel cadre fournir pour permettre l'intgration aussi bien de nouveaux services que d'applications existantes ?

30

Objectifs

Dvelopper une architecture unifie base sur les technologies objet pour l'intgration d'applications rparties. Afin d'offrir un environnement logiciel pour supporter :

La rutilisabilit et la portabilit des composants logiciels. L'htrognit et l'interoprabilit entre les diffrents

langages environnements informatiques (machines,OS).

31

Difficults

Htrognit multi-formes

des matriels des systmes des langages

Accs aux ressources (comment les trouver?) Les problmes classiques:


transaction, concurrence, ...

32

Beaucoup d'approches "Orientes Objets" incompatibles (BDs, langages ...)

Fonctions du middleware

Le middleware a quatre fonctions principales


Fournir une interface ou API (Application Programming Interface) de haut niveau aux applications Masquer lhtrognit des systmes matriels et logiciels sous-jacents Rendre la rpartition aussi invisible (transparente) que possible Fournir des services rpartis dusage courant

Exemples de middleware Objet

CORBA J2EE/EJB .NET

33

Classification

Remote Procedure Call (RPCs)

Les clients font des appels des procdures qui sexcutent sur des systmes distants. Approche publisher/subscriber par change de messages entre le client et le serveur Ce type de middleware permet de faire des appels de mthodes sur des objets distants Middleware entre lapplication et les serveurs de base de donnes

Message-Oriented Middleware (MOM)

Object Request Broker (ORB)

SQL-Oriented Data Access

34

L'Object Management Group (OMG)


Norme CORBA ( Common Object Request Broker Architecture ) cre par lOMG en 1992 Consortium fond en 1989 (Sun, H.P., ...), bas aux Etats-Unis : plus de 700 membres:

Constructeurs (Sun, HP, IBM ...) Environnements systmes (Microsoft, Novell ...) Outils et langages (Iona, Object Design, Borland ...) Produits et BD (Lotus, Oracle, Informix, O2 ...) Industriels (Boeing, Alcatel, Thomson ...)

35

Concepts gnraux de CORBA

36

Le standard CORBA : fonctionnalits (1)

Transparence la localisation (locale ou distante) et l'invocation :

Contrle dinvocation la compilation (statique). Contrle dinvocation l'excution (dynamique).

Liaison avec "tous" les langages de programmation :


Un langage de description d'interfaces (IDL) fortement typ. Des "projections" de l'IDL vers les langages d'implantation /programmation (C/C++/java ...).

37

Le standard CORBA : fonctionnalits (2)

Activation automatique et transparente des objets :

les objets sont en mmoire uniquement s'ils sont utiliss.

Environnements htrognes (langages, OS,machines ...). Protocole gnrique d'interoprabilit entre ORBs diffrents :

IIOP est une instanciation de GIOP sur Internet (TCP/IP).

38

RPC (Remote Procedure Call)

Orient procdural

Mme code, mmes donnes


Code f() -------------------------------------------

SERVEUR

CLIENT Invoquer f

Data

Remote porcedure Call

39

ORB (Object Request Broker)

Orient Objet
SERVEUR CLIENT

Mme mthode, diffrentes implmentations, donnes

Invoquer f sur Objet X

Invoquer f sur Objet Y

Objet Y f()

Objet X f()

Object Request Broker

40

Fonctionnement

Parallle avec le fonctionnement du tlphone

LORB le rseau tlphonique

Les "Objects Services" sont

Appareil tlphonique Annuaires modems, fax


Appeler quelquun Accs Internet

Applications : utilisation du tlphone


41

Invocation dune mthode distance


1: Invocation dune mthode 3: transport de linvocation 5: Invocation de lobjet rel 7: Emballage du rsultat 9: Dballage du rsultat

2: Emballage des arguments 4: dballage des arguments 6: Retour de linvocation locale 8: Transport du rsultat 10: Retour de linvocation distante

(1) Client (10)

(2)

(4)

(5) Implantation Objet

(9) (3)

(7)

(6)

42

Stub client Souche client

(8) Rseau

Skeleton Stub serveur Souche serveur

Nomenclature CORBA: Le minimum connatre


Stub & Skeleton: souches client et serveur BOA (Basic Object Adapter).

Identifie le servant Passe la requte au skeleton associ Transporte les requtes vers le BOA Initialise lORB et le BOA Cre le servant par instantiation de limplmentation de lobjet

ORB (Object Request Broker)

Serveur: processus qui


Client: processus qui utilise le servant IOR (Interoperable Object Reference)

43

Identifie un objet unique sur le bus

Architecture CORBA
SERVEUR CLIENT

Servant
Client IDL Stubs Serveur IDL Skeleton Basic Object Adapter

44

Object Request Broker

IOR: rfrences des objets CORBA

Un IOR identifie un objet unique sur le bus par un code bas sur 3 informations principales:

Nom de la machine hte (Hostname): La machine sur laquelle sexcute le serveur. Il est choisi par le BOA. Il concide avec le nom associ ladresse IP Le numro de port (port number): un numro attribu par le BOA, chaque excution du serveur. Il concide avec le numro de port TCP La cl de lobjet (Object Key): pour chaque objet cr par le serveur, le BOA lui attribue une cl unique

45

chaque relance du serveur, les rfrences des IOR publies peuvent devenir invalides

Fonctionnalits des composants

Serveur
Client

Interface Repository

Dynamic Invocation Interface

Static Static Static Invocation Invocation Invocation Interface Interface Interface

ORB Interface

Static Static Static Skeleton Skeleton Skeleton Interface Interface Interface

Dynamic Skeleton interface

Basic Object Adapter

Implementati on Repository

46

ORB

Fonctionnalits des composants Ct client (1/2)

SII: Code Java (ou C++) du stub. Gnr par le compilateur IDL IR: Interface Repository: Objet CORBA dont linterface permet dobtenir des informations sur les IDL des objets du bus

Client

Interface Repository

Dynamic Invocation Interface

Static Static Static Invocation Invocation Invocation Interface Interface Interface

ORB Interface

Static Static Static Skeleton Skeleton Skeleton Interface Interface Interface

Dynamic Skeleton interface

Basic Object Adapter

47

Implementati on Repository

Fonctionnalits des composants Ct client (2/2)

DII: permet aux clients dinvoquer des oprations dont ils construisent la requte dynamiquement en obtenant des informations depuis le rfrentiel dinterface (IR).

Aussi gnre par le compilateur IDL Interface gnrique mais plus complexe utiliser quune SII.

Client

Interface Repository

Dynamic Invocation Interface

Static Static Static Invocation Invocation Invocation Interface Interface Interface

ORB Interface

48

Static Static Static Skeleton Skeleton Skeleton Interface Interface Interface

Dynamic Skeleton interface

Basic Object Adapter

Implementati on Repository

Fonctionnalits des composants Ct Serveur (1/2)

BOA (Basic Object Adapter):


API partiellement spcifie par lOMG Elle permet lexcution des requtes transmises par lORB

SSI: Code Java (ou C++) du skeleton

Gnr par le compilateur IDL


Client
Dynamic Invocation Interface Static Static Invocation Invocation Invocation Interface Interface Interface Static

49

Interface Repositor y

ORB Interface

Static Static Static Skeleton Skeleton Skeleton Interface Interface Interface

Dynamic Skeleton interface

Basic Object Adapter

Implementa tion Repository

Fonctionnalits des composants Ct Serveur (2/2)

DSI:

permet au serveur de traiter des requtes doprations sans disposer lavance des squelettes de dballage Sert raliser des interprteurs CORBA et des passerelles entre ORBs Non spcifi par lOMG Contient les informations stockes par le BOA concernant les objets servants Client
Dynamic Invocation Interface
Static Static Static Invocation Invocation Invocation Interface Interface Interface

Implementation Repository:

50

Interface Repositor y

ORB Interface

Static Static Static Skeleton Skeleton Skeleton Interface Interface Interface

Dynamic Skeleton interface

Basic Object Adapter

Implementa tion Repository

Fonctionnalits des composants (ct client et serveur)

Interface ORB: Une API qui fournit les primitives de base pour:

initialiser et paramtrer lenvironnement CORBA, associer objets et IOR

object_to_string: fournit la reprsentation en string dun objet CORBA

On lutilise gnralement du ct serveur pour publier une "stringified" IOR Utilise gnralement ct client pour associer le stub de lobjet servant

string_to_object: associe un objet CORBA un string

51

Description des interfaces Application cliente

IDL ------------------------------------

Gnration de code client et serveur en Java

(1)
Compilateur IDL->Java

Implmentation des interfaces

Code Serveur
Java ------------------------------------

(4)

Java ------------------------------------

(2)
SII (stub) SSI (skeleton)

Java ------------------------------------

(3)

Compilateur Java

Compilateur Java

52

CLIENT

SERVEUR

Gnration de code client Java et serveur en C++


Description des interfaces Application cliente
Compilateur IDL->Java IDL ------------------------------------

(1)

Compilateur IDL->C++

Implmentation des interfaces

Code Serveur
C++ ------------------------------------

(4)

Java ------------------------------------

(2)
SII (stub) SSI (skeleton)

C++ ------------------------------------

(3)

Compilateur Java

Compilateur C++

53

CLIENT

SERVEUR

Premire application CORBA

Lapplication Hello

54

Linterface de IDL

Dans un fichier Hello.idl:


Interface Hello { void hello( ); } ;

Simple, non?

55

_HelloImplBase.java

56
Hello.java HelloHolder.java

Compilation de lIDL
Hello.idl

Compilateur idl pour mapping vers Java

HelloHelper.java

StubForHello.java

Implmentation du servant en Java

Fichier Hello_impl.java
package hello; import org.omg.CORBA.*; public class Hello_impl extends _HelloImplBase { public void hello ( ) { System.out.println( "Hello World!" ); } }

57

Implmentation du serveur Hello Cration de lORB et du BOA


Trs important: le mme langage doit tre utilis pour implanter le servant et le serveur Dans un fichier Serveur.java:
package hello; import org.omg.CORBA.*; import java.io.*; public class Serveur { public static void main (String args[ ]) { try { // Crer ORB et BOA ORB orb = ORB.init(args, new java.util.Properties( ) ); BOA boa = orb.BOA_init(args, new java.util.Properties ( ) );

58

Implmentation du serveur -Suite

Suite du mme fichier : Seveur.java


// Crer limplmentation de lobjet Hello_impl p = new Hello_impl ( ) ; // Calculer lIOR stringifieg String ref = orb.object_to_string ( p ) ; // afficher la rfrence lcran System.out.println( ref ); // dmarrer lexcution boa.impl_is_ready (null); } catch (SystemException ex) { System.err.println(ex.getMessage( ) ); ex.printStackTrace ( ); System.exit (1); } } }

59

Code Java du Client

Dans un fichier Client.java:

60

package hello; import org.omg.CORBA.*; import java.io.*; public class Client { try { // crer lORB ORB orb = ORB.init(args, new java.util.Properties ( ) ); // rcuprer lIOR du servant String ref= args[0]; // crer une rfrence sur lobjet CORBA associ lIOR org.omg.CORBA.Object obj = orb.string_to_object(ref); if (obj==null) throw new Runtime Exception ( );

Code Java Client -Suite-

// Lier le Stub Client lobjet CORBA Hello hello = HelloHelper.narrow(obj); if(hello == null) throw new RuntimeException( ); // maintenant, nous pouvons utiliser lobjet java Hello comme // sil tait local

61

hello.hello ( ); } catch(COMM_FAILURE ex) { System.err.println(ex.getMessage ( ) ); System.exit(1); } } }

Le langage de description

Interface Definition Language (IDL)

62

Caractristiques du langage IDL


IDL = Interface Definition Language Objectif: Dfinir les interfaces indpendamment des applications IDL est un langage dclaratif: ressemble beaucoup la partie dclarative de C++ IDL est indpendant de tout langage de programmation LOMG dfinit des correspondances entre lIDL et de nombreux langages de programmation

C++, SmallTalk, Ada, Java Cobol, C

63

Les concepts principaux

Linterface

Comme une classe C++ ou Java mais dfinit uniquement linterface dun objet sans informations sur sa prsentation en mmoire et sans informations sur limplmentation de ses mthodes Comme une mthode

Les oprations

Pas de surcharge doprations Le nom des paramtres sont spcifier in || out || inout

Le mode de passage doit tre prciser

Les attributs

64

Comme un attribut dune classe C++ ou Java Il peut tre modifiable ou non (dans le dernier cas : readonly)

Structuration en IDL
Module
Dclarations: alias de type types complexes exceptions

Interface
Dclarations: alias de types types complexes, exceptions Dclarations: oprations, attributs

Module
Dclarations: alias de type types complexes exceptions

Interface

Dclarations: alias de types types complexes, exceptions Dclarations: oprations, attributs

65

Imbrication dans IDL

Il nest pas possible dimbriquer les interfaces. Lexemple suivant est incorrect
interface A { interface B { void operationB( ); }; void operationA( ); };

66

Imbrication en IDL

Mais il est possible dimbriquer les modules


module A { interface C { void operationC ( ); } ; module B { typedef short entier; interface D { void operationD ( ); } ; } ; } ;

67

Les valeurs IDL


Types CORBA

Objets

Non-Objets

Rfrences dobjets

Simples
struct

Complexes
sequence union array

68short

long

unsigned short

unsigned long

float

double

char

string

octet

enum

any

La dclaration de types complexes en IDL

Les constantes
module valeursIDL { const double PI = 3.14; const short s= 1; const long deux = 1+1; };

69

La dclaration de types complexes en IDL

Les tableaux:
module valeursIDL { typedef string tableau[20]; interface Nom { attribute string nom; void setNom(in tableau t, in long }; typedef Nom matrice[10] [10]; };

indice);

70

La dclaration de types complexes en IDL

Les numrations
module valeursIDL { enum Marque {Renault, Peugeot, Citroen, Dacia}; enum Couleur { rouge, bleu, jaune, vert, noir, blanc }; };

71

La dclaration de types complexes en IDL

Les structures
module valeursIDL { struct voiture {
Marque marque; Couleur couleur; string matricule; }; };

72

Les exceptions CORBA

Deux types dexceptions


Exceptions utilisateur Exceptions systme: la norme en spcifie 25

BAD_PARAM: mauvais paramtre dune opration du bus COMM_FAILURE: chec dans la communication INV_OBJREF: Rfrence dobjet non valide NO_RESSOURCES: ressources insuffisantes pour le traitement de lopration NO_PARMISSION: droit insuffisants pour linvocation de lopration MARSHAL: erreur dans lemballage/dballage dun paramtre ou dun rsultat INTERNAL: erreur interne du bus BAD_OPERATION: opration inconnue ou non valide OBJ_NOT_EXIST: objet dtruit

73

Exemple dune description IDL


module Graphique { typedef unsigned short entier; const entier uneconstante=1; enum Couleur {rouge, bleu, jaune, vert, noir, blanc }; struct Dimensions { entier largeur; entier longueur; } ; typedef string ligne; typedef sequence<ligne> Texte;

74

Exemple dune description IDL


interface fenetre{ readonly attribute Dimensions dimension, attribute Couleur fond; void ecrire (in Texte texte); Texte lire ( ); void ligneContenant(inout Texte unMotif); }; interface boutton{ attribute Couleur fond; attribute Texte text; }; };

75

Lutilisation de typedef est obligatoire pour les tableaux et les squences en paramtre dune opration

Mapping

Correspondance IDL avec Java

76

Image dun module IDL en Java


Un module IDL est associ un module de Java ayant le mme nom Toutes les dclarations de types IDL sont associes aux dclarations correspondantes de classe ou dinterface dans le module produit Toutes les dclaration IDL non encapsules dans aucun module sont associes un package Java par dfaut.

77

Image dune interface

Une interface IDL est associe :


Une interface publique Java avec le mme nom Une classe supplmentaire de Java avec le suffixe "Helper" ajout au nom de linterface

Fournit une mthode statique "narrow" qui permet org.omg.CORBA dtre transform vers une rfrence dobjet dun type plus spcifique Lexception BAD_PARAM est leve si la transformation choue

78

Une classe de support "Holder". Son nom est le nom de la classe Java suivi de ce suffixe

Exemple

Fichier IDL :
module Graphique { interface boutton { attribute Couleur fond; attribute Texte text; }; };

79

Exemple

Interface Java gnre: boutton (boutton.java)

package Graphique; public interface boutton extends org.omg.CORBA.Object { // deux mthodes pour chaque attribut(une seule pour les readonly) public Couleur fond( ); public void fond(Couleur value); public String[ ] texte ( ); public void texte(String [ ] value); }

80

Images des types simples et des constantes


IDL
short long unsigned long long long unsigned long float double boolean octet char string IDL

Java
short int int long long float double boolean byte char string Java true false

C++
CORBA::Short CORBA::Long CORBA::Ulong CORBA::LongLong CORBA::ULongLong CORBA::Float CORBA::Double CORBA::Boolean CORBA::Octet CORBA::Char CORBA::String C++ CORBA::TRUE CORBA::FALSE

81

TRUE False

Images des types complexes: rgles gnrales (1/2)

Les alias de types dclars par "typedef type alias" nont pas de correspondance en java

Utiliser type directement Une classe aliasHelper est gnre par le compilateur IDL

82

Les numrations en Java sont traduites par des classes qui portent le mme nom Une structure IDL est associe en Java une classe

Images des types complexes: rgles gnrales (2/2)

Les tableaux IDL ont pour image les tableaux Java dimension fixe

Lexception CORBA::MARSHAL est leve en cas de dbordement lors de lutilisation de tableau Java en paramtres dune invocation

Une classe de support est gnre et porte le nom: nom-tableauHolder

Les squences bornes ou non sont associes en Java des tableaux

83

Une classe support est gnre et porte le nom: nomsequenceHolder

Exemple: structures (1/2)

Fichier IDL

module valeursIDL { struct voiture { Marque marque; Couleur couleur; string matricule;

};
};

84

Exemple: structures (2/2)

Trois classes sont gnres : voiture, voitureHolder, voitureHelper

85

package valeurIDL; final public class voiture { public voiture( ) { } // un constructeur vide public voiture (Marque marque, Couleur couleur, String matricule) { } // dclaration des attributs : champs de la structure public Marque marque; public Couleur couleur; String matricule; }

Exemple: les tableaux (1/2)


module valeursIDL { typedef string tableau[20]; interface Nom { attribute string Nom; void setNom(in tableau t, in long }; typedef Nom matrice[10] [10]; };

indice);

86

Exemple: les tableaux (2/2)


Linterface Nom.java obtenue
package valeurIDL; public interface Nom extends org.omg.CORBA.Object { public String Nom( ); public void Nom(String nom); // les dclarations: idl typedef string tableau[20] // et void setNom(in tableau t, in long sont associs : public void setNom(String[ ] t, int indice); }

87

Les interfaces: oprations et attributs

Les oprations dune interface sont traduites par des mthodes de la classe associe Les attributs readonly dune interface sont associs une mthode, sans paramtres permettant dy accder en lecture

La valeur de lattribut est obtenue comme rsultat de lappel de la mthode

Les autres attributs sont associs en plus des mthodes daffectation

La mthode a un paramtre de mme type que l attribut

88

Linvocation dune opration op() se fait en Java via lappel de mthode objetJava.op()

Le passage des paramtres en Java

in correspond au passage par valeur

Nom et type du paramtre IDL : Nom et type correspondant en Java Le mapping Java a prvu des classes conteneur appels Holder chaque type T est associe une classe THolder qui est utilise pour le passage en paramtre par rfrence Les classes Holder des types simples sont dfinies par dfaut Pour les autres classes dfinies par le programmeur, cest le compilateur IDL qui se charge de la gnration de code pour les classes Holder

out et inout correpondent au passage par rfrence


89

Exemple (1/2)
Module IDL:
module Exemple { interface Modes{ long operation (in long inArg , out long outArg, inout long inoutArg); }; };

90

Exemple (2/2)
Le code Java gnre
package Exemple; public interface Modes{ int operation (int inArg, intHolder outArg, intHolder inoutArg); }

91

Exemple de limage dune interface (1/2)


Fichier IDL:
typedef string ligne; typedef sequence<ligne> Texte;

interface fenetre{ readonly attribute Dimensions dimension; attribute Couleur fond; void ecrire (in Texte text); Texte lire ( ); void ligneContenant (inout Texte motif); };

92

Exemple de limage dune interface (2/2)


On obtient la classe fenetre.java :
public interface fenetre{ public Dimensions dimension( ); public Couleur fond( ); public void fond(Couleur value); public void ecrire (String[ ] text); public String[ ] lire( ); public void ligneContenant(StringHolder[ ] motif); }

93

Les exceptions utilisateur

Sont associs des classes qui hritent dune classe de base des exceptions

org.omg.CORBA.UserException

Sont gres naturellement comme les exceptions Java

94

Exemple: les exceptions (1/2)


Fichier IDL:
module Hello { exception ilDort { string laRaison; short depuis_quand; }; };

95

Exemple: les exceptions (2/2)


Correspondance Java:
package Hello; final public class ilDort extends org.omg.CORBA.UserException { public String laRaison; public short depuis_quand; public ilDort ( ) { }; public ilDort(String raison, short depuis) { laRaison =raison; depuis_quand=depuis; } }

96

Cration et connexion des objets au bus

97

Implmentation par hritage (1/2)


interface A{ void operationA ( ); };

La classe dimplmentation prend le suffixe _impl


Elle hrite de la classe _XImplBase gnre par le compilateur IDL Elle implmente les oprations de linterface

98

Implmentation par hritage (2/2)

Code de la classe dimplmentation:


public class A_impl extends _AImplBase { void operationA ( ) { code dimplmentation en Java } }

99

Cration des objets CORBA


Se fait directement par lappel new sur la classe dimplmentation Plusieurs Servants peuvent tre crs du ct serveur et utiliss du ct client
A servant1 = new A_impl( ); // Code Java A servant2 = new A_impl( ); // autre Code Java

10 0

Connexion directe des objets au bus CORBA

Connexion explicite dun objet au BOA // code Java org.omg.CORBA.ORB orb = A servant =new A_impl( ); orb.connect(servant); // obtenir la ref de lORB

Dconnexion dun objet du BOA // code Java orb.disconnect(servant);

Aprs cet appel, les requtes ce servant entranent la leve de lexception OBJECT_NOT_EXIST

10 1

Connexion via une manufacture dobjets

Une manufacture est une interface qui permet de crer des objets dautre interface

permet la cration dobjets CORBA par simple appel de mthodes au lieu de le coder en dure du ct serveur
interface produit { // code idl de linterface void detruire( ); }; interface factory { produit CreerProduit( ); };

10 2

Implmentations correspondantes

Implmentation de linterface produit


public class produit_impl extends _produitImplBase { org.omg.CORBA.ORB orb_; public produit_impl(org.omg.CORBA.ORB orb) { orb_ =orb; } public void detruire( ) { orb_.disconnect(this); } }

10 3

Implmentations correspondantes

Implmentation de linterface factory

public class factory_impl extends _factoryImplBase { org.omg.CORBA.ORB orb_; public factory_impl (org.omg.CORBA.ORB orb) { orb_ = orb;} public produit CreerProduit( ) { produit objet =new produit_impl(orb_) orb_.connect(objet); return objet; } }

10 4

Localisation des Objets en corba

10 5

Fichiers partags
Objet A

CLIENT

SERVEUR

10 6

2- rcuprer une rfrence sur lobjet partir de son IOR enregistre sous forme de string dans le fichier "ObjetA.ref"

ObjetA.ref

1- enregistrer lIOR transforme en string de lobjet A dans un fichier "ObjetA.ref"

Exemple
1- le code du serveur
org.omg.CORBA.ORB orb= ... //obtenir 1 rfrence sur lORB ObjetA impl=new ObjetA_impl( ); String ref=orb.objet_to_string(impl); java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileOutputStream("ObjetA.ref")); out.println(ref);

2- le code du client

10 7

org.omg.CORBA.ORB orb=//obtenir 1 rfrence sur lORB java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader("objetA.ref") String ref=in.readLine( ) org.omg.CORBA.Objet obj=orb.string_to_object(ref); ObjetA a=ObjetAHelper.narrow(obj);

Utilisation du Web
CLIENT
Objet A

SERVEUR 2- rcuprer une rfrence sur lobjet partir de son IOR enregistre sous forme de string dans www.EHTP/~guennoun/ fichierA 1- enregistrer lIOR transforme en string de lobjet A dans ~guennoun/public_html/fichierA

10 8

ObjetA.ref

Serveur WEB

Exemple
1- le code du serveur
org.omg.CORBA.ORB orb= ... //obtenir 1 rfrence sur lORB ObjetA impl=new ObjetA_impl( ); String ref=orb.objet_to_string(impl); java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileOutputStream(/home//"ObjetA.ref")); out.println(ref);

10 9

2- le code du client
import java.net.*; import java.io.*; String location="http://www.laas.fr/~guennoun/ObjetA.ref" org.omg.CORBA.ORB orb=//obtenir 1 rfrence sur lORB URL url=new URL(location); URLConnection conn=url.openConnection( ); BufferedReader in = new BufferedReader(new inputStreamReader(conn.getInputStream( )); String ref=in.readLine( ) org.omg.CORBA.Objet obj=orb.string_to_object(ref); ObjetA a=ObjetAHelper.narrow(obj);

11 0

Service de nommage

CLIENT

Objet A

SERVEUR

11 1

2- rcuprer une rfrence sur lobjet enregistr sous le nom "A"

1- enregistrer objetA sous le nom "A" Service de Nommage

Le service de nommage CORBA

Naming Service

11 2

Objectifs

Maintient des associations de type nom/objet (name binding) Une association est toujours dfinies relativement un contexte (naming context) Diffrents noms peuvent tre associs au mme objet, sous le mme ou sous diffrents contextes Associer (bind) un nom = crer une association de type nom/objet dans un contexte donn Rsoudre (resolve) un nom = dterminer lobjet associ dans un contexte donn Un objet peut tre un objet CORBA applicatif ou un contexte de nommage qui est aussi un objet CORBA

11 3

Caractristiques de la spcification OMG

Fdration de services envisage Port de nommage

Associer des contextes des noms sous dautres contextes conduit un arbre de nommage Les cycles sont autoriss
Association, dissociation, recherche et numration Le renommage nest pas spcifi

c1

c2

o1

Oprations spcifies

c1. 1

o.V1

o.V2

11 4

Le module CosNaming (1/2)

Spcifie les types pour construire les nom utiliss par le service

NameComponent comme une structure Name comme une squence de NameComponent

Spcifie l interface NamingContext avec les oprations suivantes

Pour les objets applicatifs de type Object


void bind/rebind (in Name n,in Object obj) Association dun nom et un objet obj

Pour les objet contexte de type NamingContext


void bind_context/rebind_context (in Name,in NamingContext nc) Association dun nom et dun contexte

11 5

Le module CosNaming (2/2)

Pour les deux types dobjets


object resolve(in Name n) Recherche dobjet par son nom void unbind(in Name n) Libration dun nom; i.e. le dissocier dun objet

Cration dun contexte


NamingContext new_context( ) Cre un nouveau context sur le mme serveur que le contexte appelant NamingContext bind_new_context (in Name n) Cre un nouveau contexte et l associe au nom n

11 6

Destruction dun contexte

void destroy( )

Les noms: dfinitions et exemples


typedef string Istring; Struct NameComponent{ Istring id; Istring kind;}; typedef sequence <NameComponent> Name;
NameComponent[ ] LeNom=new NameComponent[ 2]; LeNom[0]=new NameComponent( ); LeNom[0].id="c2" ; LeNom[0].kind="cont "; LeNom[1]=new NameComponent( ); LeNom[1].id="o1" ; LeNom[0].kind="obj "; c2,cont o1,obj

11 7

Exemple dutilisation ct serveur


//obtenir lIOR du serveur de nom java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader("NamingService.ref")); Initial_context String ior=in.readLine(); NamingContext context_initial= NamingContextHelper.narrow(orb.string_to_object(ior)); //cration du context c2 NameComponent[ ] LeNom = new NameComponent[1]; LeNom[0]=new NameComponent( ); LeNom[0].id="c2" ; LeNom[0].kind="cont"; nc2 NamingContext nc2=context_initial.new_context( ); Context_initial.bind_context(LeNom,nc2); //cration dun objet CORBA de type A A objectA=new A_impl( ) ; //cration dun binding o1/obj avec objetA o1 NameComponent[ ] NomA=new NameComponent[1]; NomA[0]=new NameComponent( ); NomA[0].id="o1" ; NomA[0].kind="obj"; nc2.bind(NomA,objetA);

11 8

Exemple dutilisation ct client


// obtenir lIOR du serveur de nom et le lier au stub NamingContext java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader("NamingService.ref")); String ior=in.readLine(); NamingContext context_initial= NamingContextHelper.narrow(orb.string_to_object(ior)); //rcuprer la rfrence de o1 et la lier un stub de type A NameComponent[ ] LeNom = new NameComponent[2]; LeNom[0]=new NameComponent( ); LeNom[0].id="nc2 " ; LeNom[0].kind="cont "; LeNom[1]=new NameComponent( ); LeNom[1].id="o1" ; LeNom[1].kind="obj"; org.omg.CORBA.Object obj=context_initial.resolve(LeNom); A stubObjetA= Ahelper.narrow(obj);

11 9

Exemple dutilisation ct client Code quivalent


// obtenir lIOR du serveur de nom et le lier au stub NamingContext java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader("NamingService.ref")); String ior=in.readLine(); NamingContext context_initial= NamingContextHelper.narrow(orb.string_to_object(ior)); //rcuprer une rfrence sur le naming context nc2 NameComponent[ ] NomNC2 = new NameComponent[1]; NomNC2[0]=new NameComponent( ); NomNC2[0].id="nc2 " ; NomNC2[0].kind="cont "; org.omg.CORBA.Object obj1=context_initial.resolve(NomNC2); NamingContext nc2= NamingContextHelper.narrow(obj1); //rcuprer une rfrence sur lobjet A NameComponent[ ] LeNom = new NameComponent[1]; LeNom[0]=new NameComponent( ); LeNom[0].id="o1 " ; LeNom[0].kind="obj "; org.omg.CORBA.Object obj2=nc2.resolve(LeNom); A stubObjetA= Ahelper.narrow(obj);

12 0

Rgles dquivalence

Ctx ->bind(<c1;c2;;cn>,obj) Ctx ->resolve(<c1;c2;;cn-1>)->bind(<cn>,obj) Ctx ->bind_context(<c1;c2;;cn>,nc) Ctx ->resolve(<c1;c2;;cn-1>)->bind_context(<cn>,nc) Ctx ->resolve(<c1;c2;;cn> Ctx ->resolve(<c1;c2;;cn-1>)->resolve(<cn>) Ctx ->unbind(<c1;c2;;cn>) Ctx ->resolve(<c1;c2;;cn-1>)->unbind(<cn>) 12 Ctx ->bind_new_context(<c1;c2;;cn>) 1 Ctx ->resolve(<c1;c2;;cn-1>)->bind_new_context(<cn>

Enumration des associations (1/2)

Opration list de linterface NamingContext

void list (in unsigned long nb, out BindingList bl, out BindingIterator bi);

bl : liste des nb premires associations bi : itrateur sur les associations restantes

12 2

Enumration des associations (2/2)

Dfinitions de types

enum BindingType (nobject,ncontext) struct Binding{ Name binding_name; BindingType binding_type} typedef sequence<Binding> BindingList;

interface BindingIterator

12 3

interface BindingIterator{ boolean next_one(out Binding b); boolean next_n(in unsigned long nb, out BindingList bl); void destroy( ); };

Etapes de dveloppement

12 4

Etapes dimplmentation

Dfinition de lIDL

interface A {string hello( );}

Compilation de lIDL: gnre 5 classes/interfaces java:

2 utilise par le broker

A.java, StubForA.java

3 utilise par le programmeur

AHolder.java, AHelper.java, _AImplBase.java

Implmentation de linterface A:
import org.omg.CORBA.*; public class A_impl extends _AImplBase { public String hello ( ){ //code }

12 5

Cration du client et du serveur


Ct serveur

Ct client

1- initialisation de lORB

1- initialisation de lORB

ORB orb=ORB.init(---)
BOA boa= orb.BOA_init(---)

ORB orb=ORB.init(---)

2- initialisation du BOA 3- Cration dun objet CORBA

2- obtenir la rfrence de lobjet

String ref= args[0];

A_impl o = new A_impl( ); String ref= object_to_string(o); System.out.println(ref); orb.connect(o);

4- Publication de sa rfrence

3- Crer une rfrence sur lobjet CORBA associ

org.omg.CORBA.Object o = orb.string_to_object(ref); A a =Ahelper.narrow(o); System.out.println(a.hello());

5- Connecter lobjet au bus

4- Lier le stub client cet objet

6- dmarrage du service

Utilisation

126

Boa.impl_is_ready(---)

Des questions ?

127