Title: En savoir plus sur le nommage
1En savoir plus sur le nommage
2Annuaire service de nommage
java.rmi.Naming
bind rebind unbind lookup
Client
rmi URL
java.rmi.naming
RMI Registry
RMI Remote Object
3RMI 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)
4JNDI Nommage et directory
Lien (bind)
- C/monRépertoire/monFichier
Nom
Contexte
Créé le 12 mars 2002 Taille 12 M
Attributs
5Conventions 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
6Naming/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")
7Usage
- 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)
8Service providers
9L'interface Context
10Contexte
- Le contexte permet une isolation des noms, par
exemple pour plusieurs applications gt évite les
collisions - Structure hiérarchique comme un répertoire
11Interface 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.
12Mais 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
13Contextes
- Pas de contexte racine gt InitialContext
- Possibilité de créer des sous-contextes
- public Context createSubcontext(String name)
- throws NamingException
14Un 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
15Cré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)
16Lien 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)
17Enumé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()
- )
-
18Recherche d'un objet particulier
- Object object context.lookup(unNom)
- System.out.println(
- unNom " "
- object
- )
19Utilisation de l'objet
- On reçoit un object, il faut par conséquent faire
un "cast" pour pouvoir l'utiliser - (MyClass) object.myMethode(.)
20Ré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
21Directory Service
22Directory Service
23Les 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
24GetAttributes
- 2 formes possibles
- Attributes
- getAttributes(
- String stringName
- )
- Attributes
- getAttributes(
- String stringName,
- String rgstringAttributeNames
- )
25modifyAttributes
- void
- modifyAttributes(
- String stringName,
- int nOperation,
- Attributes attributes
- )
- Avec les opérations
- ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et
REMOVE_ATTRIBUTE
26Search
- 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)
27Search 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)
28Search 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
29Un 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)
30Classes à connaître
Renvoient une NamingEnumeration de ...
31Utilisation 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())) -
-
32Résumé Directory
- Mêmes méthodes que Context
- Créé à partir de InitialDirContext
- Rajoute la gestion des attributs
- Rajoute les fonctions de recherche
33Autres fonctionnalités
34Noms 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
35Stockage 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
36Exemple 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
37Exemple 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
-
38Factory 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
-
39URL 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")
40alias
- 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
41Autres idées
- Espaces de nommages
- Fédérations de serveur , referrals (alias de
serveurs) - Sécurité, authentification, SSL
- Liens avec JINI, EJB ...