invocation de méthode à des objets distants exemple : corba
DESCRIPTION
Invocation de Méthode à des Objets distants Exemple : CORBA. C ommon O bject R equest B roker A rchitecture Mise en pratique avec Orbacus en JAVA. 1.1-histoire. Consensus pour l’interopérabilité. Le problème : Intégration des applications - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/1.jpg)
Invocation de Méthode à des Objets distants
Exemple : CORBA
Common Object Request Broker ArchitectureMise en pratique avec Orbacus en JAVA
![Page 2: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/2.jpg)
Le problème : Intégration des applications Pas de consensus sur les langages de programmation Pas de consensus sur les plate-formes de développement Pas de consensus sur les systèmes d’exploitation Pas de consensus sur les protocoles réseau Pas de consensus sur les formats des données manipulées par les applications
Recherche d’un Consensus pour l’interopérabilité
Consensus pour l’interopérabilité
1.1-histoire
![Page 3: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/3.jpg)
3
CORBA
Common Object Request Broker Architecture : CORBA
Plate-forme client/serveur orientée objets
Un standard pour l’interopérabilité entre objets
– Support pour différents langages
– Support pour différentes plate-formes (interopérabilité)
– Communications au travers du réseau
– Des services (Distributed transactions, events, ... )
– Guides et modèles de programmation
1.2 CORBA?
![Page 4: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/4.jpg)
consortium international créé en 1989 but non lucratif regroupement de plus de 460 organismes
• constructeurs (SUN, HP, DEC, IBM, ...)• environnements systèmes (Microsoft, OSF, Novell, ...)• outils et langages (Iona, Object Design, Borland, ...)• produits et BD (Lotus, Oracle, Informix, O2, ...)• industriels (Boeing, Alcatel, Thomson, ...)• institutions et universités (INRIA, NASA, LIFL, W3C)
I.3. OMG
http://www.omg.org
Object Management Group (OMG)
![Page 5: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/5.jpg)
6
OMG en résumé
OMA : pour l ’architecture logicielle MDA (Model Driven Architecture)
CORBA : pour le « middleware » technique
UML pour la modélisationUML = Unified Modeling language
MOF pour la méta-modélisationMOF = Meta-Object Facility
![Page 6: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/6.jpg)
Processus de développement
![Page 7: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/7.jpg)
contrat
IDL
Bus CORBA SqueletteIDL
StubIDL
Fournisseurd ’objets
Clientd ’objets
Le langage IDL: Un « esperanto » pour les objets
Objets Corba
![Page 8: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/8.jpg)
9
Spécification interface IDL (1/2)
Un objet grid est un tableau contenant des valeurs.Les valeurs sont accessibles grâce aux opérateurs get et set qui peuvent être invoqués à distance.
Processus client Processus serveur
Appel de get et set sur l'objet grid distant
objets grid
![Page 9: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/9.jpg)
10
Spécification interface IDL (2/2)
interface Grid { readonly attribute short height; readonly attribute short width; void set (in short n, in short m, in long value); long get(in short n, in short m); void copyIn(inout Grid g);};
![Page 10: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/10.jpg)
Le langage IDL: Interface Definition Language
langage de spécification d’interfaces, supportant l’héritage
multiple;
indépendant de tout langage de programmation ou
compilateur (langage pivot entre applications);
langage utilisé pour générer les stubs, les squelettes et pour définir
les interfaces du Référentiel d’interface;la correspondance IDL-langage de programmation est fournie
pour les langages C, C++, Java, Smalltalk, Ada, Cobol.
![Page 11: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/11.jpg)
Exemple interface account { readonly attribute float balance; attribute string description; void credit (in float f); void debit (in float f); };interface currentAccount : account { readonly attribute float overdraftLimit; };interface bank { exception reject {string reason;}; account newAccount (in string name)
raises (reject); currentAccount newCurrentAccount (in string name, in float limit)
raises (reject); void deleteAccount (in account a); };
interface attribut
opérations
exception
opérations
![Page 12: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/12.jpg)
Eléments IDL Une spécification IDL définit un ou plusieurs types, constantes, exceptions, interfaces, modules,...
• pragma
• constantes
• types de base au format binaire normalisé
• nouveaux types (typedef, enum, struct, union, array, sequence)
• exceptions
• types de méta-données (TypeCode, any)
![Page 13: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/13.jpg)
Eléments IDL
Un module permet de limiter la validité des identificateurs
Interface : ensemble d’opérations et de types =>classe C++
Syntaxe : Interface | [<héritage>] { <interface Body>};
• opération (synchrone ou asynchrone sans résultat)• attribut (possibilité de lecture seule)
Surcharge Interdite
Réutilisation de spécifications existantes (#include)
![Page 14: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/14.jpg)
module unService {
typedef unsigned long EntierPositif; typedef sequence<Positif> desEntiersPositifs;
interface Premier {
boolean est_premier ( in EntierPositif nombre);desEntiersPositifs nombres_premiers (in EntierPositif nombre);
};};
module monApplication { interface MonService {
unService::EntierPositif prochainPremier(..);
Exemple
module
définitionsde type
interface
opérations
![Page 15: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/15.jpg)
Exemple
3. IDLDescription
![Page 16: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/16.jpg)
// Regroupe les définitions communes à ce service.module date {// Une année est codée par un entier 16 bits.
typedef short Annee; // Ensemble non borné d'années. typedef sequence<Annee> DesAnnees;
enum Mois { // Enumération des mois. Janvier, Fevrier, Mars, Avril, Mai, Juin,Juillet, Aout, Septembre, Octobre, Novembre, Decembre };// Ensemble non borné de mois.
typedef sequence<Mois> DesMois;
// Enumération des jours de la semaine. enum JourDansLaSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche };
// Un jour est un entier 16 bits non signé. typedef unsigned short Jour;
struct Date { // Structure pour la notion de date. Jour le_jour; Mois le_mois; Annee l_annee; };// Ensemble non borné de dates.
typedef sequence<Date> DesDates;
// Regroupement de divers formats de dates. union DateMultiFormat// Le discriminant anonyme sert à choisir le format.
switch(unsigned short) { case 0: string chaine; case 1: Jour nombreDeJours; default: Date date; };
exception ErreurInterne {}; exception MauvaiseDate { DateMultiFormat date; }; // Service de traitement sur les dates. interface Traitement { boolean verifierDate (in Date d); JourDansLaSemaine calculerJourDansLaSemaine ( in Date d) raises(ErreurInterne,MauvaiseDate); long nbJoursEntreDeuxDates (in Date d1, in Date d2) raises(MauvaiseDate); void dateSuivante (inout Date d, in Jour nombreJours) raises(MauvaiseDate); };
// Service de conversion de dates. interface Convertisseur { Jour convertirDateVersJourDansAnnee (in Date d) raises(MauvaiseDate); Date convertirChaineVersDate (in string chaine) raises(MauvaiseDate); string convertirDateVersChaine (in Date d) raises(MauvaiseDate); // L’année courante pour l’opération suivante. attribute Annee annee_courante; Date convertirJourDansAnneeVersDate (in Jour jour); // L’année de référence des opérations suivantes. readonly attribute Annee base_annee ; Date convertirJourVersDate (in Jour jour); Jour convertirDateVersJour (in Date d) raises(MauvaiseDate); void obtenirDate(in DateMultiFormat d1,out Date d2) raises(MauvaiseDate); };
// Héritage de spécification. interface ServiceDate : Traitement,Convertisseur {}; };
// Regroupe les définitions communes à ce service. module date { // Une année est codée par un entier 16 bits. typedef short Annee; // Ensemble non borné d'années. typedef sequence<Annee> DesAnnees;
enum Mois { // Enumération des mois. Janvier, Fevrier, Mars, Avril, Mai, Juin,Juillet, Aout, Septembre, Octobre, Novembre, Decembre }; // Ensemble non borné de mois. typedef sequence<Mois> DesMois;
// Enumération des jours de la semaine. enum JourDansLaSemaine { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche };
// Un jour est un entier 16 bits non signé. typedef unsigned short Jour;
struct Date { // Structure pour la notion de date. Jour le_jour; Mois le_mois; Annee l_annee; }; // Ensemble non borné de dates. typedef sequence<Date> DesDates; // Regroupement de divers formats de dates. union DateMultiFormat // Le discriminant anonyme sert à choisir le format. switch(unsigned short) { case 0: string chaine; case 1: Jour nombreDeJours; default: Date date; };
![Page 17: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/17.jpg)
Attribut IDL
Définition d’attributinterface account {
readonly attribute float balance;attribute string description;...
};
Equivaut à :float get_balance();string get_description();void set_description(in string s);
![Page 18: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/18.jpg)
void op1 (in long input, out long output, inout long both);
interface account;
interface bank { account newAccount (in string name); void deleteAccount (in account old);};
Operations (1/2)
Paramètres nommés et associés à un mode
Opérations bloquantes par défaut
<uneOpération> ::= <modeInvocation> <typeRetour> <identificateur>‘ (‘ <paramètres> ‘ ) ’ <clausesExceptions><clausesContextes>
Client uneBanque
newAccountcalcul
retours
3. IDLDescription
![Page 19: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/19.jpg)
20
Pourquoi différents modes de passage de paramètres ?
in : Données fournies par le client
out : Données retournées par l ’objet
inout : Données clientes modifiées par l ’objet
Répartition
Passage par copie
![Page 20: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/20.jpg)
Opérations (2/2)
oneway void notify (in string message);
Opération non bloquante
Pas de paramètre de type out, inout ou d’exceptions
Valeur de retour : void
Pas d ’exceptions déclenchées.
Client uneBanque
notify(«ok »)
méthodefinie
3. IDLDescription
![Page 21: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/21.jpg)
22
Exceptionsexception reject {string reason;}; account newAccount (in string name)
raises (reject);
exception DateErronnee {String raison; };
Des exceptions CORBA standardisées
UNKNOWN NO_PERMISSIONBAD_PARAM NO_IMPLEMENTCOM_FAILURE OBJECT_NOT_EXISTINV_OBJREF ……….
CORBA::Exception
CORBA::UserException
CORBA::SystemException
3. IDLDescription
Gestion explicite de la part du client
![Page 22: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/22.jpg)
Définitions circulaires
module Circulaire {interface B;interface A {
void utiliséB(in B unB);}interface B {
void utiliséA(in A unA);}
3. IDLDescription
![Page 23: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/23.jpg)
Héritage multiple
interface A { ... }interface B : A { ... }interface C : A { ... }interface D : B, C { ...}
A
B C
D
3. IDLDescription
![Page 24: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/24.jpg)
Types de base et autres typesTypes de base• short• long• unsigned short• unsigned long• float• double• char• boolean• octet•…...
Types construits• struct• union• enum
Types génériques• array• sequence• string
MétaTypes•any•TypeCode
Types de données dynamiques et auto-descriptifs
3. IDLDescription
![Page 25: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/25.jpg)
26
Type Any
interface PileDeChaines {readonly attribut string sommet;void poser(in string valeur);string retirer();
};interface PileGénérique {
readonly attribut Any sommet;readonly attribut TypeCode typeDesValeurs;void poser(in Any valeur);Any retirer();
};
3. IDLDescription
![Page 26: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/26.jpg)
27
Grid.java
Exemple Compilation interface IDL vers Java
Client
_GridStub.java GridPOA.java
Serveur
Grid_Impl.javaClient.java
Serveur.java
A écrire
Généré
1- Exemple introductif
Grid.idl
Compilateur IDL/Java
Répertoire gridRépertoire grid
Répertoire gridRépertoire grid
I
GridHelper.java
GridHolder.java
jidl … Grid.idl
GridOperations.java
![Page 27: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/27.jpg)
28
• implantation du stubpublic class _GridStub ……. Grid
– envoie de requêtes– invisible par le programmeur– instanciée automatiquement par GridHelper (narrow)– Utilise le DII pour assurer la portabilité du binaire
• implantation du squelettepublic abstract class GridPOA ………. GridOperations
– reçoit et décode des requêtes– doit être héritée par l’implantation
1- Exemple introductif
Les classes Stubs et Squelettes
![Page 28: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/28.jpg)
29
Implémentation du serveur (1)
1- Exemple introductif
1. Initialiser le bus CORBA
– obtenir l’objet ORB
2. Initialiser l’adaptateur d’objets
– obtenir le POA
3. Créer les implantations d’objets
4. Enregistrer les implantations par l’adaptateur
5. Diffuser leurs références
– afficher une chaîne codifiant l’IOR
6. Attendre des requêtes venant du bus
7. Destruction du Bus
![Page 29: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/29.jpg)
30
Implémentation du client
1- Exemple introductif
1. Initialiser le bus (objet ORB)
2. Créer les souches des objets à utiliser
2.a. obtenir les références d’objet (IOR)
2.b. convertir vers les types nécessaires– narrow contrôle le typage à travers le réseau
3. Réaliser les traitements
• Rem. : éviter l’opérateur bind (2.a + 2.b)– spécifique à chaque produit donc non portable
![Page 30: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/30.jpg)
31
Le cycle de vie des objets
• Problème
– actuellement, 1 grille = 1 serveur
– pas de création/destruction d’objets à distance
– seulement invocation d’opérations
• Solution
– notion de fabrique d’objets
– exprimée en OMG-IDL
• C’est un canevas de conception : Design pattern
– voir aussi le service LifeCycleAutres usages de la fabrique :
- gestion de droits, load-balancing, polymophisme, …
![Page 31: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/31.jpg)
32
FabriqueGrilleGrille
GrilleGrille
creerGrille
L’implantation de la fabrique
![Page 32: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/32.jpg)
33
L’implantation de la fabrique
FabriqueGrilleGrille
GrilleGrille
detruireGrille
![Page 33: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/33.jpg)
34
Interface IDL d ’une fabrique de Grilles
module grilles {. . .interface Fabrique { Grid newGrid(in short width,in short height);}; };
![Page 34: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/34.jpg)
35
Scénario d ’obtention de la référence du service de nommage
Client ou Serveur ORB
CosNaming::NamingContext
resolve_initial_references ("NameService");
conversion
ajout,retrait,lecture,...
![Page 35: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/35.jpg)
37
Enregistrer un objet
• Opération pour publier un Objet– en général, opération réalisée par le serveur
• Scénario Type1. Créer un objet2. Construire un chemin d ’accès (Name)3. Appeler l ’opération « bind » ou « rebind » avec le chemin et la référence de l ’objet
void bind (in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound);
![Page 36: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/36.jpg)
38
Retrouver un objet
• Opération réalisée par un client ou un serveur
• Scénario type :
– construire un chemin d ’accès (Name)
– appeler l ’opération « resolve » avec le chemin
– convertir la référence obtenue dans le bon type
Object resolve (in Name n)
raises (NotFound, CannotProceed, InvalidName)
![Page 37: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/37.jpg)
39
• Création d’une nouvelle grille et mise à disposition par le service Nommage
– 1. Initialiser le bus CORBA
– 2. Obtenir le service Nommage (NS)
– 3. Obtenir la fabrique depuis le NS
– 4. Créer un répertoire
– 5. Enregistrer le répertoire dans le NS
Une application d’administration de la fabrique
![Page 38: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/38.jpg)
40
Annuaire : service de nommage
Client
java.rmi.naming
rmi URL
RMI Registry RMI Remote Object
java.rmi.Naming
bindrebindunbindlookup
![Page 39: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/39.jpg)
41
RMI URL
• Même syntaxe que http mais préfixe rmi
• rmi://mymachine.com/monObjet
• Inconvénient : perte de la transparence
• => utilisation de JNDI (Java Naming Directory Interface)
![Page 40: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/40.jpg)
42
JNDI : Nommage et directory
• C:/monRépertoire/monFichier Lien (bind)
NomContexte
Créé le 12 mars 2002Taille : 12 MAttributs
![Page 41: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/41.jpg)
43
Conventions de nommage
• LDAP (Light Directory Access Protocol) :"cn=Todd Sundsted, o=ComFrame, c=US" nomme la personne
"cn=Todd Sundsted"Note : c = country, o = organization
• DNS : carabosse.essi.fr
• => Abstraction JNDI
![Page 42: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/42.jpg)
44
Naming/Directory
• Un service de Naming permet de retrouver des objets à partir d'un nom ("pages blanches")
• Un service de Directory rajoute des fonctionnalités permettant d'associer des attributs aux points d'entrée, et de faire une recherche sur ces attributs ("pages jaunes")
![Page 43: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/43.jpg)
45
Usage
• Les services de nommage sont utilisés :– Pour stocker des objets– Pour offrir un point d'accès aux applications réparties
(RMI, Corba , EJB…)
Ils servent également de référentiel d'entreprise pour accéder à des applications (machine/port), des bases de données, et même des informations de sécurité (gestion des accès au sein d'une entreprise)
Mais aussi pour référencer des devices (imprimantes, etc.) (cf. Jini)
![Page 44: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/44.jpg)
46
Service providers
![Page 45: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/45.jpg)
L'interface Context
![Page 46: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/46.jpg)
48
Contexte
• Le contexte permet une isolation des noms, par exemple pour plusieurs applications => évite les collisions
• Structure hiérarchique comme un répertoire
![Page 47: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/47.jpg)
49
Interface Context
• void bind(String stringName, Object object): Lie un nom à un objet. Le nom ne doit pas déjà être lié à un autre objet. Tous les contextes intermédiaires doivent exister.
• void rebind(String stringName, Object object): Lie un nom à un objet. Si le nom est déjà lié, la liaison précédente est écrasée. Tous les contextes intermédiaires doivent exister.
• Object lookup(String stringName): Renvoie l'objet pointé par le nom
• void unbind(String stringName): Délie l'objet pointé par le nom.
![Page 48: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/48.jpg)
50
Mais aussi
• void rename(String stringOldName, String stringNewName): Modifie le nom auquel l'objet est lié.
• NamingEnumeration listBindings(String stringName): Envoie une énumération contenant les noms liés au contexte passé en paramètre, ainsi que les objets liés à ces noms et leur classe
• NamingEnumeration list(String stringName): Renvoie une énumération contenant les noms liés au contexte, ainsi que les noms de classes des objets liés à eux
![Page 49: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/49.jpg)
51
Contextes
• Pas de contexte racine => InitialContext
• Possibilité de créer des sous-contextes
public Context createSubcontext(String name)
throws NamingException
![Page 50: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/50.jpg)
52
Un exemple : d'abord les packages
import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.Binding;import javax.naming.NamingEnumeration;import javax.naming.NamingException;
// Pour les paramètres d'initialisationimport java.util.Hashtable;
![Page 51: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/51.jpg)
53
Création du contexte initial
L'information d'environnement spécifie le provider JNDI par le nom de la factory.
Dans ce cas : répertoire sous forme URL file://...
Hashtable hashtableEnvironment = new Hashtable(); hashtableEnvironment.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory" ); hashtableEnvironment.put( Context.PROVIDER_URL, "file://tmp" ); Context context = new
InitialContext(hashtableEnvironment);
![Page 52: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/52.jpg)
54
Lien avec la sécurité
private Context getInitialCtx()
{
// Set up our JNDI environment properties...
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
env.put(Context.PROVIDER_URL, HOST);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, USER);
env.put(Context.SECURITY_CREDENTIALS, PASSWORD);
try
{ return new InitialDirContext(env); }
catch(NamingException e)
![Page 53: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/53.jpg)
55
Enumération de tous les objets
NamingEnumeration namingEnumeration = context.listBindings("");
while (namingEnumeration.hasMore()) {
Binding binding = (Binding)namingEnumeration.next();
System.out.println(
binding.getName() + " " +
binding.getObject()
);
}
![Page 54: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/54.jpg)
56
Recherche d'un objet particulier
Object object = context.lookup(unNom);
System.out.println(
unNom + " " +
object
);
![Page 55: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/55.jpg)
57
Utilisation de l'objet
On reçoit un object, il faut par conséquent faire un "cast" pour pouvoir l'utiliser
(MyClass) object.myMethode(….)
![Page 56: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/56.jpg)
58
Résumé
• Comme dans RMI• InitialContext• bind, lookup• On peut lister un contexte, créer un sous-contexte• Utilisation d'une factory pour lier à une
implémentation et initialiser les paramètres• La sécurité est définie au niveau de
l'environnement passé à la factory
![Page 57: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/57.jpg)
Directory Service
![Page 58: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/58.jpg)
60
Directory Service
• Naming + attributs
![Page 59: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/59.jpg)
61
Les fonctions de base
void bind(
String stringName,
Object object,
Attributes attributes
)
• Même méthode que Context, mais avec un paramètre de plus : les attributs.
• Idem rebind, lookup• Idem createSubcontext• Créé à partir de InitialDirContext
![Page 60: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/60.jpg)
62
GetAttributes
• 2 formes possiblesAttributes
getAttributes(
String stringName
)
Attributes
getAttributes(
String stringName,
String [] rgstringAttributeNames
)
![Page 61: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/61.jpg)
63
modifyAttributes
void
modifyAttributes(
String stringName,
int nOperation,
Attributes attributes
)
• Avec les opérations :• ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et REMOVE_ATTRIBUTE
![Page 62: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/62.jpg)
64
Search
• La forme la plus simple passe une liste d'attributs
• Il est possible d'utiliser des filtres selon la norme
RFC 2254
• Les contrôles permettent la mise en forme des résultats (par exemple tri ascendant, etc…)
![Page 63: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/63.jpg)
65
Search : pour faire des requêtes
NamingEnumeration
search(
String stringName,
Attributes attributesToMatch
)
On peut utiliser des filtres de recherche selon la spécification RFC 2254:
(cn=Babs Jensen)
(!(cn=Tim Howes))
(&(objectClass=Person)(|(sn=Jensen)(cn=Babs J*)))
(o=univ*of*mich*)
NamingEnumeration
search(Name stringName, String stringRFC2254Filter, SearchControls searchcontrols)
![Page 64: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/64.jpg)
66
Search : contrôle de la recherche
• On peut utiliser des contrôles permettant :– De définir les attributs à renvoyer– De définir la portée de la recherche (récursive
en arbre, locale…)– Le nombre maximum de réponses– Le temps maximum d'attente– De renvoyer ou non l'objet Java associé– De déréférencer ou non les liens
![Page 65: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/65.jpg)
67
Un exemple
String filter = "(objectclass=Inetorgperson)";
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
controls.setReturningObjFlag(false);
controls.setReturningAttributes(attrIds);
try
{
NamingEnumeration enumDev =
initCtx.search("ou=people", filter, sc);
![Page 66: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/66.jpg)
68
Classes à connaître
Context.list() NameClassPair
Context.listBindings() Binding
Directory.search() SearchResult
Renvoient une NamingEnumeration de ...
![Page 67: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/67.jpg)
69
Utilisation d'un SearchResult
while (enumDev.hasMore())
{
SearchResult sr = (SearchResult)enumDev.next();
Attributes attributes = sr.getAttributes();
NamingEnumeration ne = attributes.getAll();
while (ne.hasMore())
{
Attribute attr = (Attribute) ne.next();
String attrID = attr.getID();
NamingEnumeration values = attr.getAll();
. . .
while (values.hasMore())
child.add(
new DefaultMutableTreeNode(values.nextElement()));
}
}
![Page 68: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/68.jpg)
70
Résumé : Directory
• Mêmes méthodes que Context
• Créé à partir de InitialDirContext
• Rajoute la gestion des attributs
• Rajoute les fonctions de recherche
![Page 69: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/69.jpg)
Autres fonctionnalités
![Page 70: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/70.jpg)
72
Noms composés
Object obj1 = ctx.lookup("cn=Ted Geisel, ou=People, o=JNDITutorial");
CompositeName cname = new CompositeName(
"cn=Ted Geisel, ou=People, o=JNDITutorial");
Object obj2 = ctx.lookup(cname);
• L'interface lookup a 2 signatures : String ou Name
![Page 71: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/71.jpg)
73
Stockage d'objets
• On peut stocker– Des objets serialisables– Des références et des objets référençables– Des objets avec des attributs– Des Remote Objects– Des objets Corba
![Page 72: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/72.jpg)
74
Exemple : stockage d'un objet RMI
// On initialise le Contexte
// ctx = new javax.naming.InitialDirContext...
Hello h = new HelloImpl();
// Bind the object to the directory
ctx.bind("cn=RemoteHello", h);
• Une fois que l'objet est stocké dans le Directory, une autre application peut l'utiliser
Hello h2 = (Hello)ctx.lookup("cn=RemoteHello");
NB: cf. javax.rmi.Naming.bind, lookup
![Page 73: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/73.jpg)
75
Exemple : stockage d'une référence
• public class Fruit implements Referenceable {
String fruit;
public Fruit(String f) {
fruit = f;
}
public Reference getReference() throws NamingException {
return new Reference(
Fruit.class.getName(),
new StringRefAddr("fruit", fruit),
FruitFactory.class.getName(),
null); // Factory location
}
![Page 74: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/74.jpg)
76
Factory pour une référence
public class FruitFactory implements ObjectFactory {public Object getObjectInstance(Object obj, Name name, Context ctx,
Hashtable env) throws Exception {if (obj instanceof Reference) { Reference ref = (Reference)obj; if (ref.getClassName().equals(Fruit.class.getName())) {
RefAddr addr = ref.get("fruit");if (addr != null) { return new Fruit((String)addr.getContent());}}}
return null; }}
![Page 75: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/75.jpg)
77
URL LDAP
• Ldap supporte les URLS de la forme :ldap://host:port/dn?attributes?scope?filter?
extensions
• Le nom d'hôte par défaut est localhost• Le port par défaut est 389• Exemple :
Object obj = new InitialContext().lookup( "ldap://localhost:389/cn=homedir,cn=Jon
%20Ruiz,ou=People,o=jnditutorial");
![Page 76: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/76.jpg)
78
alias
• Il est possible de définir des aliasctx.search("ou=Staff", "(cn=J*)", null);
• Propriété d'environnementjava.naming.ldap.derefAliases
– always – never – finding– searching
![Page 77: Invocation de Méthode à des Objets distants Exemple : CORBA](https://reader035.vdocuments.pub/reader035/viewer/2022062408/5681376a550346895d9f00f9/html5/thumbnails/77.jpg)
79
Autres idées
• Espaces de nommages
• Fédérations de serveur , referrals (~alias de serveurs)
• Sécurité, authentification, SSL
• Liens avec JINI, EJB ...