En savoir plus sur le nommage. 2 Annuaire : service de nommage Client java.rmi.naming rmi URL RMI RegistryRMI Remote Object java.rmi.Naming bind rebind

  • View
    104

  • Download
    0

Embed Size (px)

Text of En savoir plus sur le nommage. 2 Annuaire : service de nommage Client java.rmi.naming rmi URL RMI...

  • Page 1
  • En savoir plus sur le nommage
  • Page 2
  • 2 Annuaire : service de nommage Client java.rmi.naming rmi URL RMI RegistryRMI Remote Object java.rmi.Naming bind rebind unbind lookup
  • Page 3
  • 3 RMI URL Mme syntaxe que http mais prfixe rmi rmi://mymachine.com/monObjet Inconvnient : perte de la transparence => utilisation de JNDI (Java Naming Directory Interface)
  • Page 4
  • 4 JNDI : Nommage et directory C:/monRpertoire/monFichier Lien (bind) Nom Contexte Cr le 12 mars 2002 Taille : 12 M Attributs
  • Page 5 Abstraction JNDI">
  • 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
  • Page 6
  • 6 Naming/Directory Un service de Naming permet de retrouver des objets partir d'un nom ("pages blanches") Un service de Directory rajoute des fonctionnalits permettant d'associer des attributs aux points d'entre, et de faire une recherche sur ces attributs ("pages jaunes")
  • Page 7
  • 7 Usage Les services de nommage sont utiliss : Pour stocker des objets Pour offrir un point d'accs aux applications rparties (RMI, Corba, EJB) Ils servent galement de rfrentiel d'entreprise pour accder des applications (machine/port), des bases de donnes, et mme des informations de scurit (gestion des accs au sein d'une entreprise) Mais aussi pour rfrencer des devices (imprimantes, etc.) (cf. Jini)
  • Page 8
  • 8 Service providers
  • Page 9
  • L'interface Context
  • Page 10
  • 10 Contexte Le contexte permet une isolation des noms, par exemple pour plusieurs applications => vite les collisions Structure hirarchique comme un rpertoire
  • Page 11
  • 11 Interface Context void bind(String stringName, Object object) : Lie un nom un objet. Le nom ne doit pas dj tre li un autre objet. Tous les contextes intermdiaires doivent exister. void rebind(String stringName, Object object) : Lie un nom un objet. Si le nom est dj li, la liaison prcdente est crase. Tous les contextes intermdiaires doivent exister. Object lookup(String stringName) : Renvoie l'objet point par le nom void unbind(String stringName) : Dlie l'objet point par le nom.
  • Page 12
  • 12 Mais aussi void rename(String stringOldName, String stringNewName) : Modifie le nom auquel l'objet est li. NamingEnumeration listBindings(String stringName) : Envoie une numration contenant les noms lis au contexte pass en paramtre, ainsi que les objets lis ces noms et leur classe NamingEnumeration list(String stringName) : Renvoie une numration contenant les noms lis au contexte, ainsi que les noms de classes des objets lis eux
  • Page 13
  • 13 Contextes Pas de contexte racine => InitialContext Possibilit de crer des sous-contextes public Context createSubcontext(String name) throws NamingException
  • Page 14
  • 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 paramtres d'initialisation import java.util.Hashtable;
  • Page 15
  • 15 Cration du contexte initial L'information d'environnement spcifie le provider JNDI par le nom de la factory. Dans ce cas : rpertoire 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 16
  • 16 Lien avec la scurit 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 17
  • 17 Enumration de tous les objets NamingEnumeration namingEnumeration = context.listBindings(""); while (namingEnumeration.hasMore()) { Binding binding = (Binding)namingEnumeration.next(); System.out.println( binding.getName() + " " + binding.getObject() ); }
  • Page 18
  • 18 Recherche d'un objet particulier Object object = context.lookup(unNom); System.out.println( unNom + " " + object );
  • Page 19
  • 19 Utilisation de l'objet On reoit un object, il faut par consquent faire un "cast" pour pouvoir l'utiliser (MyClass) object.myMethode (.)
  • Page 20
  • 20 Rsum Comme dans RMI InitialContext bind, lookup On peut lister un contexte, crer un sous- contexte Utilisation d'une factory pour lier une implmentation et initialiser les paramtres La scurit est dfinie au niveau de l'environnement pass la factory
  • Page 21
  • Directory Service
  • Page 22
  • 22 Directory Service Naming + attributs
  • Page 23
  • 23 Les fonctions de base void bind( String stringName, Object object, Attributes attributes ) Mme mthode que Context, mais avec un paramtre de plus : les attributs. Idem rebind, lookup Idem createSubcontext Cr partir de InitialDirContext
  • Page 24
  • 24 GetAttributes 2 formes possibles Attributes getAttributes( String stringName ) Attributes getAttributes( String stringName, String [] rgstringAttributeNames )
  • Page 25
  • 25 modifyAttributes void modifyAttributes( String stringName, int nOperation, Attributes attributes ) Avec les oprations : ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et REMOVE_ATTRIBUTE
  • Page 26
  • 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 contrles permettent la mise en forme des rsultats (par exemple tri ascendant, etc)
  • Page 27
  • 27 Search : pour faire des requtes NamingEnumeration search( String stringName, Attributes attributesToMatch ) On peut utiliser des filtres de recherche selon la spcification 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 28
  • 28 Search : contrle de la recherche On peut utiliser des contrles permettant : De dfinir les attributs renvoyer De dfinir la porte de la recherche (rcursive en arbre, locale) Le nombre maximum de rponses Le temps maximum d'attente De renvoyer ou non l'objet Java associ De drfrencer ou non les liens
  • Page 29
  • 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);
  • Page 30
  • 30 Classes connatre Renvoient une NamingEnumeration de...
  • Page 31
  • 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())); }
  • Page 32
  • 32 Rsum : Directory Mmes mthodes que Context Cr partir de InitialDirContext Rajoute la gestion des attributs Rajoute les fonctions de recherche
  • Page 33
  • Autres fonctionnalits
  • Page 34
  • 34 Noms composs 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 35
  • 35 Stockage d'objets On peut stocker Des objets serialisables Des rfrences et des objets rfrenables Des objets avec des attributs Des Remote Objects Des objets Corba
  • Page 36
  • 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
  • Page 37
  • 37 Exemple : stockage d'une rfrence 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 38
  • 38 Factory pour une rfrence public class FruitFactory implements ObjectFactory { public Object getObjectInstance(Object obj, Name na