Title: Invocation de M
1 Invocation de Méthode à des Objets distants
Exemple CORBA
Common Object Request Broker Architecture Mise en
pratique avec Orbacus en JAVA
2Consensus pour linteropérabilité
1.1-histoire
- 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 dexploitation
- Pas de consensus sur les protocoles réseau
- Pas de consensus sur les formats des données
- manipulées par les applications
- Recherche dun Consensus pour linteropérabilité
3CORBA
1.2 CORBA?
- Common Object Request Broker Architecture CORBA
- Plate-forme client/serveur orientée objets
- Un standard pour linteropé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
4Historique
1.2 CORBA?
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
2000
2002
CORBA 3.0
CORBA 2.1
Fondation de lOMG
Publication de lOMA
Publication CORBA 1.1
Mapping IDL/C
Adoption CORBA 2.0
Publication CORBA 1.2
CORBA 2.3
Publication CORBA 1.0
- Minimum Corba
- RealTime Corba
- Corba Component Model
5Object Management Group (OMG)
I.3. OMG
http//www.omg.org
- 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)
6OMG en résumé
OMA pour l architecture logicielle ? MDA
(Model Driven Architecture) CORBA pour le
middleware technique UML pour la
modélisation UML Unified Modeling
language MOF pour la méta-modélisation MOF
Meta-Object Facility
7Processus de développement
8Le langage IDL Un esperanto pour les objets
contrat
Client d objets
Fournisseur d objets
Stub IDL
Bus CORBA
Squelette IDL
Objets Corba
9Spé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.
objets grid
Appel de get et set sur l'objet grid distant
Processus client
Processus serveur
10Spé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)
11Le langage IDL Interface Definition Language
- langage de spécification dinterfaces,
supportant lhé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 dinterface
- la correspondance IDL-langage de programmation
est fournie pour les langages C, C, Java,
Smalltalk, Ada, Cobol.
12Exemple
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
13Elé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)
14Eléments IDL
- Un module permet de limiter la validité des
identificateurs - Interface ensemble dopérations et de types
gtclasse C -
- Syntaxe
- Interface lthéritagegt ltinterface Bodygt
- opération (synchrone ou asynchrone sans
résultat) - attribut (possibilité de lecture seule)
Surcharge Interdite
- Réutilisation de spécifications existantes
(include)
15Exemple
module unService typedef unsigned long
EntierPositif typedef sequenceltPositifgt
desEntiersPositifs interface Premier
boolean est_premier ( in EntierPositif
nombre) desEntiersPositifs nombres_premiers (in
EntierPositif nombre) module
monApplication interface MonService
unServiceEntierPositif prochainPremier(..)
module
définitions de type
interface
opérations
16Exemple
3. IDL Description
17 18Attribut IDL
Définition dattribut interface account
readonly attribute float balance attribute
string description ... Equivaut à
float get_balance() string
get_description() void set_description(in
string s)
19Operations (1/2)
3. IDL Description
- Paramètres nommés
- et associés à un mode
- Opérations bloquantes
- par défaut
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)
Client
uneBanque
newAccount
calcul
retours
ltuneOpérationgt ltmodeInvocationgt lttypeRetourgt
ltidentificateurgt ( ltparamètresgt )
ltclausesExceptionsgtltclausesContextesgt
20Pourquoi 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
21Opérations (2/2)
3. IDL Description
- Opération non bloquante
- Pas de paramètre de type out, inout ou
dexceptions - Valeur de retour void
- Pas d exceptions déclenchées.
Client
uneBanque
notify(ok )
méthode finie
22Exceptions
3. IDL Description
exception reject string reason
account newAccount (in string name) raises
(reject) exception DateErronnee String
raison
CORBAException
CORBAUserException
CORBASystemException
Des exceptions CORBA standardisées
UNKNOWN NO_PERMISSION BAD_PARAM
NO_IMPLEMENT COM_FAILURE OBJECT_NOT_EXIST INV_O
BJREF .
Gestion explicite de la part du client
23Définitions circulaires
3. IDL Description
module Circulaire interface B interface A
void utiliséB(in B unB) interface B
void utiliséA(in A unA)
24Héritage multiple
3. IDL Description
interface A ... interface B A ...
interface C A ... interface D B, C
...
A
B
C
D
25Types de base et autres types
3. IDL Description
- Types 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
Types de données dynamiques et auto-descriptifs
26Type Any
3. IDL Description
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()
27Exemple Compilation interface IDL vers Java
1- Exemple introductif
Grid.idl
jidl Grid.idl
A écrire
Compilateur IDL/Java
Généré
Répertoire grid
Répertoire grid
Répertoire grid
Répertoire grid
Client
Serveur
GridOperations.java
_GridStub.java
GridPOA.java
I
Grid.java
Client.java
Grid_Impl.java
GridHelper.java
Serveur.java
GridHolder.java
28Les classes Stubs et Squelettes
1- Exemple introductif
- implantation du stub
- public 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 squelette
- public abstract class GridPOA . GridOperations
- reçoit et décode des requêtes
- doit être héritée par limplantation
29Implémentation du serveur (1)
1- Exemple introductif
- 1. Initialiser le bus CORBA
- obtenir lobjet ORB
- 2. Initialiser ladaptateur dobjets
- obtenir le POA
- 3. Créer les implantations dobjets
- 4. Enregistrer les implantations par ladaptateur
- 5. Diffuser leurs références
- afficher une chaîne codifiant lIOR
- 6. Attendre des requêtes venant du bus
- 7. Destruction du Bus
30Implé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 dobjet (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 lopérateur bind (2.a 2.b)
- spécifique à chaque produit donc non portable
31Le cycle de vie des objets
- Problème
- actuellement, 1 grille 1 serveur
- pas de création/destruction dobjets à distance
- seulement invocation dopérations
- Solution
- notion de fabrique dobjets
- exprimée en OMG-IDL
- Cest un canevas de conception Design pattern
- voir aussi le service LifeCycle
Autres usages de la fabrique - gestion de
droits, load-balancing, polymophisme,
32Limplantation de la fabrique
Grille
Fabrique
33Limplantation de la fabrique
Grille
Fabrique
34Interface IDL d une fabrique de Grilles
module grilles . . . interface Fabrique
Grid newGrid(in short width,in short height)
35Scénario d obtention de la référence du service
de nommage
ORB
Client ou Serveur
resolve_initial_references ("NameService")
CosNaming NamingContext
conversion
ajout,retrait,lecture,...
36Notion de chemin daccès
37Enregistrer un objet
- Opération pour publier un Objet
- en général, opération réalisée par le serveur
- Scénario Type
- 1. Créer un objet
- 2. 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)
38Retrouver 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)
39Une application dadministration de la fabrique
- Création dune 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
40Annuaire service de nommage
java.rmi.Naming
bind rebind unbind lookup
Client
rmi URL
java.rmi.naming
RMI Registry
RMI Remote Object
41RMI URL
- Même syntaxe que http mais préfixe rmi
- rmi//mymachine.com/monObjet
- Inconvénient perte de la transparence
- gt utilisation de JNDI (Java Naming Directory
Interface)
42JNDI Nommage et directory
Lien (bind)
- C/monRépertoire/monFichier
Nom
Contexte
Créé le 12 mars 2002 Taille 12 M
Attributs
43Conventions de nommage
- LDAP (Light Directory Access Protocol)
- "cnTodd Sundsted, oComFrame, cUS" nomme la
personne "cnTodd Sundsted" - Note c country, o organization
- DNS
- carabosse.essi.fr
- gt Abstraction JNDI
44Naming/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")
45Usage
- 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)
46Service providers
47L'interface Context
48Contexte
- Le contexte permet une isolation des noms, par
exemple pour plusieurs applications gt évite les
collisions - Structure hiérarchique comme un répertoire
49Interface 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.
50Mais 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
51Contextes
- Pas de contexte racine gt InitialContext
- Possibilité de créer des sous-contextes
- public Context createSubcontext(String name)
- throws NamingException
52Un 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'initialisation
- import java.util.Hashtable
53Cré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.RefFSContextFactor
y" - )
- hashtableEnvironment.put(
- Context.PROVIDER_URL,
- "file//tmp"
- )
- Context context new InitialContext(hashtab
leEnvironment)
54Lien 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)
55Enumération de tous les objets
- NamingEnumeration namingEnumeration
context.listBindings("") - while (namingEnumeration.hasMore())
- Binding binding (Binding)namingEnumera
tion.next() - System.out.println(
- binding.getName() " "
- binding.getObject()
- )
-
56Recherche d'un objet particulier
- Object object context.lookup(unNom)
- System.out.println(
- unNom " "
- object
- )
57Utilisation de l'objet
- On reçoit un object, il faut par conséquent faire
un "cast" pour pouvoir l'utiliser - (MyClass) object.myMethode(.)
58Ré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
59Directory Service
60Directory Service
61Les 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
62GetAttributes
- 2 formes possibles
- Attributes
- getAttributes(
- String stringName
- )
- Attributes
- getAttributes(
- String stringName,
- String rgstringAttributeNames
- )
63modifyAttributes
- void
- modifyAttributes(
- String stringName,
- int nOperation,
- Attributes attributes
- )
- Avec les opérations
- ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et
REMOVE_ATTRIBUTE
64Search
- 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)
65Search pour faire des requêtes
- NamingEnumeration
- search(
- String stringName,
- Attributes attributesToMatch
- )
- On peut utiliser des filtres de recherche selon
la spécification RFC 2254 - (cnBabs Jensen)
- (!(cnTim Howes))
- ((objectClassPerson)((snJensen)(cnBab
s J))) - (ounivofmich)
- NamingEnumeration
- search(Name stringName, String stringRFC2254Filter
, SearchControls searchcontrols)
66Search 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
67Un exemple
- String filter "(objectclassInetorgperson)"
- SearchControls controls new SearchControls()
- controls.setSearchScope(SearchControls.SUBTREE_SCO
PE) - controls.setReturningObjFlag(false)
- controls.setReturningAttributes(attrIds)
- try
-
- NamingEnumeration enumDev
- initCtx.search("oupeople", filter, sc)
68Classes à connaître
Renvoient une NamingEnumeration de ...
69Utilisation 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.next
Element())) -
-
70Résumé Directory
- Mêmes méthodes que Context
- Créé à partir de InitialDirContext
- Rajoute la gestion des attributs
- Rajoute les fonctions de recherche
71Autres fonctionnalités
72Noms composés
- Object obj1 ctx.lookup("cnTed Geisel,
ouPeople, oJNDITutorial") - CompositeName cname new CompositeName(
- "cnTed Geisel, ouPeople, oJNDITutorial")
- Object obj2 ctx.lookup(cname)
- L'interface lookup a 2 signatures String ou Name
73Stockage 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
74Exemple 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("cnRemoteHello", h)
- Une fois que l'objet est stocké dans le
Directory, une autre application peut l'utiliser - Hello h2 (Hello)ctx.lookup("cnRemoteHello")
- NB cf. javax.rmi.Naming.bind, lookup
75Exemple 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
-
76Factory 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.get
Name())) - RefAddr addr ref.get("fruit")
- if (addr ! null)
- return new Fruit((String)addr.getContent())
-
- return null
-
77URL LDAP
- Ldap supporte les URLS de la forme
- ldap//hostport/dn?attributes?scope?filter?extens
ions - Le nom d'hôte par défaut est localhost
- Le port par défaut est 389
- Exemple
- Object obj new InitialContext().lookup(
- "ldap//localhost389/cnhomedir,cnJon20Ruiz
,ouPeople,ojnditutorial")
78alias
- Il est possible de définir des alias
- ctx.search("ouStaff", "(cnJ)", null)
- Propriété d'environnement
- java.naming.ldap.derefAliases
- always
- never
- finding
- searching
79Autres idées
- Espaces de nommages
- Fédérations de serveur , referrals (alias de
serveurs) - Sécurité, authentification, SSL
- Liens avec JINI, EJB ...