Java Naming and Directory Interface
Gaël Thomas
Université Pierre et Marie Curie
Master Informatique
M2 – Spécialité SAR
Introduction
Java Naming and Directory Interface (JNDI)
Java Standard Edition
API de connexion à des services d’annuaires et de résolution de noms
RMI Registry (RMI), CosNaming (Corba), LDAP, NIS, File System, DNS…
!!Uniformise l’accès à ces annuaires dans une seule API
!!Utilisation simultanée et transparente de ces annuaires
Service de résolution de noms
Associe des noms à des entités + recherche à partir du nom
Service d’annuaire
Associe des attributs et des noms aux entités + recherche à partir des deux
2008-2009 Master SAR - M2 MDOC - Introduction 2
Conteneur EJB Conteneur EJB
Introduction
2008-2009 Master SAR - M2 MDOC - Introduction 3
Base
De
Donnée
Conteneur WEB
Client léger : navigateur Web
Service de transport : IIOP, RMI ou autre
Service BD : JDBC
Service Nommage :
JNDI
Serveur WEB
Client
lourd
Cache
JEE
Service Transaction: JTA/JTX
HTTP
Exemples d’annuaire
Exemple de service de résolution de noms : RMIRegistry
!!API définie en Java
!!Associe des noms plats à des objets RMI
Rappel : objet RMI = objet Serveur, implémente l’interface Remote
Lancer le service de résolution de noms :
!!shell$ rmiregistry &
Se connecter au service de résolution de noms en Java
!!Registry LocateRegistry.getRegistry(String host, int port);
2008-2009 Master SAR - M2 MDOC - Introduction 4
Exemples d’annuaire
Exemple de service de résolution de noms : RMIRegistry
Utiliser le RMI Registry
!!void bind(String name, Remote obj);
!!void rebind(String name, Remote obj);
!!String[] list();
!!Remote lookup(String name);
2008-2009 Master SAR - M2 MDOC - Introduction 5
Exemples d’annuaire
Exemple de service de résolution de noms : le système de fichiers
!!API définie par le système d’exploitation
!!Associe des noms hiérarchiques à des objets fichiers
Notion de répertoire :
!Entité contenant des noms
!Un répertoire possède un nom dans un autre répertoire
Utiliser le système de fichier sous linux
!!ls (list), rm (remove), touch/redirection (bind), mv (move)
2008-2009 Master SAR - M2 MDOC - Introduction 6
/
etc bin
conf.d ls passwd
Exemples d’annuaire
Exemple de service d’annuaire : LDAP
!!Associe des propriétés (clé=valeur) à des entités
!!Chaque entité possède une classe (Person etc..) définie dans un schéma
!!Structure hiérarchique, appelée DIT (Directory Information Tree)
!!Chaque nœud de l’arbre est une entité qui possède une propriété appelée RDN
(Relative Distinguished Name) unique pour la classe
Un nœud est identifié par son DN (Distinguished Name) constitué de la liste
(inverse) des RDN jusqu’à la racine
2008-2009 Master SAR - M2 MDOC - Introduction 7
dc=inria
ou=computer ou=people
dc=fr
uid=anne uid=igor
dn: dc=fr
dn: dc=inria, dc=fr
dn: uid=igor, ou=people, dc=inria, dc=fr
dn: ou=people, dc=inria, dc=fr
Exemples d’annuaire
Exemple de service d’annuaire : LDAP
!!Recherche : dans un sous-arbre (à partir d’un DN)
!!Scope : définit la profondeur de la recherche
!scope=sub : dans tout le sous-arbre
!scope=one : uniquement parmi les fils
!scope=base : uniquement sur notre propre nœud (utile pour consulter les autres
attributs d’un nœud)
!!Recherche à l’aide de filtre
Exemples :
!(user=Bob) : cherche Bob
!(&(user=B*)(objectclass=Person)) : cherche une personne dont le nom
commence par B
!(&(age>22)(age<33)(objectclass=Person)) : cherche les personne dont l’âge est
compris entre 22 et 33
Un annuaire LDAP est une BD hiérarchique
2008-2009 Master SAR - M2 MDOC - Introduction 8
Architecture de JNDI
Architecture de JNDI
JNDI API : api d’utilisation de services de nommage
javax.naming.*, javax.naming.directory.*, javax.naming.ldap.*,
javax.naming.event.*
Naming Manager : correspondance entre l’API JNDI et les
fournisseurs de services
JNDI SPI : api interne des fournisseurs de services
javax.naming.spi.*
2008-2009 Master SAR - M2 MDOC - Introduction 9
Architecture de JNDI
2008-2009 Master SAR - M2 MDOC - Introduction 10
Architecture de JNDI
JNDI : système hiérarchique de résolution de noms et annuaire
!!API d’accès à des annuaires avec des fournisseurs d’annuaires
!!API d’accès à des services de résolution de noms sinon
(API d’accès à un annuaire hérite de l’API de résolution de noms)
Différences principales entre les deux API
!!Annuaire : recherche par nom ou par filtre
!!Service résolution nom : recherche par nom uniquement
Étude dans le suite : le service de résolution de nom uniquement
!!API pour les annuaires : voir la JavaDoc javax.naming.directory
!!Notions correspondent à celles de LDAP
2008-2009 Master SAR - M2 MDOC - Introduction 11
Architecture de JNDI
Hiérarchie de contexte
!!Un contexte est un répertoire de noms
(répertoire dans les fs, NamingContext Corba, nom de domaine DNS…)
!!Contient des associations <nom, objet>
!!Peut contenir des sous-contextes (association <nom, Context>)
!!N’existe que si le fournisseur de service l’offre (pas le cas de RMIRegistry)
InitialContext
!!Contexte racine dans JNDI
!!Obligatoire pour toute recherche
!!Construit avec new InitialContext() ou new InitialContext(Hashtable env)
Possibilité de passer des paramètres au contexte initial via
!Propriété (jndi.properties)
!Table de hash env
2008-2009 Master SAR - M2 MDOC - Introduction 12
Utilisation de JNDI
Les deux paramètres de base du contexte initial
!!INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial"
Classe du fournisseur de service du contexte initial
(Attention : cette classe doit être dans le CLASSPATH)
!!PROVIDER_URL = "java.naming.provider.url »
Paramètres passé au fournisseur, en général URL du service
Exemple
Properties props = Properties();
props.put(INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.registry.RegistryContextFactory");
props.put(PROVIDER_URL, "rmi://localhost:1099");
Context ic = new InitialContext(props);
2008-2009 Master SAR - M2 MDOC - Introduction 13
Utilisation de JNDI
Extrait de l’API de Context
!!void bind(String name, Object obj):
associe l’objet obj au nom name
(chemin complet, tous les contexte intermédiaires doivent exister)
!!NamingEnumeration<Binding> listBinding(String name):
renvoie la liste des associations possédant le nom name (1 niveau)
!!Object lookup(String name):
Renvoie l’objet ayant pour nom name (dans le sous-arbre)
!!void rebind(String name, Object obj):
Ré-associe l’objet obj au nom name
!!void unbind(String name):
Détruit l’association ayant pour nom name
!!Context createSubcontext(String name):
Crée un sous-contexte ayant pour nom name (préférable à bind)
2008-2009 Master SAR - M2 MDOC - Introduction 14
Utilisation de JNDI
Exemple avec le service de résolution de noms RMI
public interface Hello { void sayHello(); }
public HelloImpl implements Hello { … implem … }
Côté serveur
Context ic = new InitialContext(props);
Remote obj = new HelloImpl();
UnicastRemoteObject.exportObject(obj, 0);
ic.rebind("mon-serveur", obj);
Côté client
Context ic = new InitialContext(props);
Hello server = (Hello)ic.lookup("mon-serveur");
server.sayHello();
2008-2009 Master SAR - M2 MDOC - Introduction 15
L’usine à objet
Problème avec les Stateful Bean:
A chaque client son Bean!
! !ic.lookup("Test@Remote")
renvoie un nouveau Bean à chaque appel
Solution : enregistrer des javax.naming.Reference
!! Interception de la recherche
2008-2009 Master SAR - M2 MDOC - Introduction 16
L’usine à objet
Exemple : l’usine MaFactory
public MaFactory extends ObjectFactory {
public Object getObjectInstance(Object obj, Name name,
Context nameCtx, Hashtable environment) {
String cname = name.get(0); // nom de l’objet
Class cl = Class.forName(name); // charge la classe
return cl.newInstance();
}
}
2008-2009 Master SAR - M2 MDOC - Introduction 17
L’usine à objet
Exemple : l’enregistrement
interface Cinema {}
public CinemaImpl implements Cinema {}
// (class de l’objet, class de l’usine, classpath de l’usine)
Reference ref = new Reference( Cinema.class.getName(),
MaFactory.class.getName(),
null);
ic.bind("CinemaImpl", ref);
2008-2009 Master SAR - M2 MDOC - Introduction 18
L’usine à objet
Exemple : la recherche
ic.lookup("CinemaBean");
2008-2009 Master SAR - M2 MDOC - Introduction 19
rmiregistry
"CinemaBean" ref instance de MyFactory
new CinemaBean
lookup
car
Reference
getObjectInstance
Valeur
retournée
URL JNDI
ContextInitial : associé à un unique fournisseur
Problème :
Utiliser simultanément plusieurs fournisseurs de nommages
Solution :
Les URL JNDI
!!Définissent des protocoles
!!Associe des protocoles avec des fournisseurs
"rmi://localhost:1099/mon-serveur",
"iiop://susanoo.lip6.fr/un-autre-serveur"
2008-2009 Master SAR - M2 MDOC - Introduction 20
1 / 10 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !