Transcript
Page 1: 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

En savoir plus sur le nommage

Page 2: 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

2

Annuaire : service de nommage

Client

java.rmi.naming

rmi URL

RMI Registry RMI Remote Object

java.rmi.Naming

bindrebindunbindlookup

Page 3: 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

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)

Page 4: 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

4

JNDI : Nommage et directory

• C:/monRépertoire/monFichier Lien (bind)

NomContexte

Créé le 12 mars 2002Taille : 12 MAttributs

Page 5: 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

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: 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

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")

Page 7: 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

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)

Page 8: 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

8

Service providers

Page 9: 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

L'interface Context

Page 10: 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

10

Contexte

• Le contexte permet une isolation des noms, par exemple pour plusieurs applications => évite les collisions

• Structure hiérarchique comme un répertoire

Page 11: 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

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.

Page 12: 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

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

Page 13: 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

13

Contextes

• Pas de contexte racine => InitialContext

• Possibilité de créer des sous-contextes

public Context createSubcontext(String name)

throws NamingException

Page 14: 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

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'initialisationimport java.util.Hashtable;

Page 15: 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

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"      );      hashtableEnvironment.put(        Context.PROVIDER_URL,         "file://tmp"      );      Context context = new

InitialContext(hashtableEnvironment);

Page 16: 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

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)

Page 17: 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

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()

          );

        }

Page 18: 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

18

Recherche d'un objet particulier

 Object object = context.lookup(unNom);

          System.out.println(

            unNom + " " +

            object

          );

Page 19: 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

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(….)

Page 20: 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

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

Page 21: 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

Directory Service

Page 22: 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

22

Directory Service

• Naming + attributs

Page 23: 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

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

Page 24: 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

24

GetAttributes

• 2 formes possiblesAttributes

getAttributes(

   String stringName

)

Attributes

getAttributes(

   String stringName,

   String [] rgstringAttributeNames

)

Page 25: 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

25

modifyAttributes

void

modifyAttributes(

   String stringName,

   int nOperation,

   Attributes attributes

)

• Avec les opérations :• ADD_ATTRIBUTE, REPLACE_ATTRIBUTE, et REMOVE_ATTRIBUTE

Page 26: 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

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…)

Page 27: 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

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*)

NamingEnumeration

search(Name stringName, String stringRFC2254Filter, SearchControls searchcontrols)

Page 28: 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

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

Page 29: 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

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: 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

30

Classes à connaître

Context.list() NameClassPair

Context.listBindings() Binding

Directory.search() SearchResult

Renvoient une NamingEnumeration de ...

Page 31: 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

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: 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

32

Résumé : Directory

• Mêmes méthodes que Context

• Créé à partir de InitialDirContext

• Rajoute la gestion des attributs

• Rajoute les fonctions de recherche

Page 33: 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

Autres fonctionnalités

Page 34: 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

34

Noms composés

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: 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

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

Page 36: 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

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: 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

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

}

Page 38: 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

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; }}

Page 39: 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

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");

Page 40: 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

40

alias

• Il est possible de définir des aliasctx.search("ou=Staff", "(cn=J*)", null);

• Propriété d'environnementjava.naming.ldap.derefAliases

– always – never – finding– searching

Page 41: 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

41

Autres idées

• Espaces de nommages

• Fédérations de serveur , referrals (~alias de serveurs)

• Sécurité, authentification, SSL

• Liens avec JINI, EJB ...


Recommended