Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
En savoir plus sur le nommage
2
Annuaire : service de nommage
java.rmi.Naming bind rebind unbind lookup Client rmi URL java.rmi.naming RMI Registry RMI Remote Object
3
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)
4
JNDI : Nommage et directory
Lien (bind) C:/monRépertoire/monFichier Nom Contexte Créé le 12 mars 2002 Taille : 12 M Attributs
5
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
6
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")
7
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)
8
Service providers
9
L'interface Context
10
Contexte Le contexte permet une isolation des noms, par exemple pour plusieurs applications => évite les collisions Structure hiérarchique comme un répertoire
11
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.
12
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
13
Contextes Pas de contexte racine => InitialContext
Possibilité de créer des sous-contextes public Context createSubcontext(String name) throws NamingException
14
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'initialisation import java.util.Hashtable;
15
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" ); Context.PROVIDER_URL, "file://tmp" Context context = new InitialContext(hashtableEnvironment);
16
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)
17
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() ); }
18
Recherche d'un objet particulier
Object object = context.lookup(unNom); System.out.println( unNom + " " + object );
19
Utilisation de l'objet On reçoit un object, il faut par conséquent faire un "cast" pour pouvoir l'utiliser (MyClass) object.myMethode(….)
20
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
21
Directory Service
22
Directory Service Naming + attributs
23
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
24
GetAttributes 2 formes possibles Attributes getAttributes(
String stringName ) String stringName, String [] rgstringAttributeNames
25
modifyAttributes Avec les opérations : void modifyAttributes(
String stringName, int nOperation, Attributes attributes ) Avec les opérations : ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et REMOVE_ATTRIBUTE
26
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…)
27
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*) search(Name stringName, String stringRFC2254Filter, SearchControls searchcontrols)
28
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
29
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);
30
Classes à connaître Renvoient une NamingEnumeration de ...
31
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())); }
32
Résumé : Directory Mêmes méthodes que Context
Créé à partir de InitialDirContext Rajoute la gestion des attributs Rajoute les fonctions de recherche
33
Autres fonctionnalités
34
Noms composés L'interface lookup a 2 signatures : String ou Name
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
35
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
36
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
37
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
38
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; }}
39
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");
40
alias Il est possible de définir des alias Propriété d'environnement
ctx.search("ou=Staff", "(cn=J*)", null); Propriété d'environnement java.naming.ldap.derefAliases always never finding searching
41
Autres idées Espaces de nommages
Fédérations de serveur , referrals (~alias de serveurs) Sécurité, authentification, SSL Liens avec JINI, EJB ...
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.