Réalisation d'un service d'annuaire sur CORBA

Equipe enseignante 2005-2006 :
Vincent Danjean, Didier Donsez , Clément Escoffier, Vania.Marangozova-Martin

 

Anciens enseignants : Fabienne Boyer, Didier Donsez ,Jean-François Méhaut, Mikaël Désertot

Septembre 2005

Ce mini-projet SAR permet d'utiliser les mécanismes fournis par CORBA pour la réalisation d'applications distribuées.

Le support requis pour ce projet est à télécharger.

CORBA est une norme ayant donné lieu à plusieurs implémentations appelées ORB (Object Request Brokers). Nous proposons d'utiliser l'ORB intégré au JDK1.4 ou 1.5. Cependant il n’est pas exclu d’utiliser un autre ORB comme JacORB (http://www.jacorb.org/)

Le problème consiste à programmer un service simple de consultation et de mise à jour d'un annuaire (Repertory).

1  Annuaire - version 1 : travail à faire

1.1 Comment programmer une application selon le modèle CORBA

Lire la documentation du JDK présentant les principes d'utilisation de CORBA pour la réalisation d'applications réparties, et regarder en particulier les exemples des applications hello.

Un complément de documentation se trouve sur les sites

Vous pouvez aussi tester (en dehors de la séance) les exemples commentés du JDK "Getting Started with Java IDL"

·        http://java.sun.com/j2se/1.4.1/docs/guide/idl/GShome.html

·        http://java.sun.com/j2se/1.4.1/docs/guide/idl/jidlExample.html

·        http://java.sun.com/j2se/1.4.1/docs/guide/idl/jidlExample2.html

·        http://java.sun.com/j2se/1.4.1/docs/guide/idl/jidlExample3.html

·        http://java.sun.com/j2se/1.4.1/docs/guide/idl/tutorial/jidl2machines.html

D’autres documents de démarrage sont disponibles sur les site de Sun, de Netscape et de Borland (VisiBroker):

·        http://java.sun.com/developer/onlineTraining/corba/corba.html

·        http://developer.netscape.com/docs/manuals/enterprise/javapg/contents.htm

·        http://info.borland.com/techpubs/books/vbj/vbj40/programmers-guide/contents.html

1.2 Description de l'application Annuaire -Version 1

Dans une première étape, nous allons travailler sur une version simple de l'annuaire. L'interface fournie par un annuaire est la suivante :

Pour pouvoir travailler, il faut suivre les consignes citées ci-après. Les fichiers fournis dans le paquet tpcorba.zip comprennent :

1.3 Comprendre l'application Annuaire - Version 1

1.4 Exécuter l'application Annuaire - Version 1

Dans un premier temps, le serveur communique son IOR (Inter Object Reference) au client au travers d'un fichier partagé (repertory.ior) (sautez cette étape à partir de 2003)

Dans un deuxième temps, on va lancer l'application en faisant en sorte que le serveur communique son IOR au client via un serveur de noms. Ceci permet de lancer le client et le serveur sur des sites différents, ne partageant pas de fichiers.

1.5 Questions

2 Annuaire - version 2 : travail à faire

L'application proposée à l'étape 1 est limitée, puisqu'elle ne permet de créer et de manipuler qu'un unique annuaire.

Pour lever cette limitation, et rendre cette application plus générale, nous proposons d'écrire une deuxième version dans laquelle on fournit une fabrique d'annuaires et dans laquelle Person est un struct IDL.

L'interface de la fabrique est la suivante :

2.0 Struct

Modifiez l’exemple fournit pour que Person est soit désormais un struct IDL. Compilez et testez.

2.1 Fabrique

On demande d'écrire :

Il est recommandé de faire une copie complète de l'arborescence pour chaque nouvelle question, et d'adapter les fichiers existants.

Vous pouvez essayer de mettre en place un mode de fonctionnement dans lequel il y a des administrateurs (programme Administrateur) qui créent les annuaires et les gèrent (ajout/retrait de personnes), et des clients ordinaires (programme Client), qui utilisent les annuaires (choix d’un annuaire, recherche d’une personne). Le programme Server crée et connecte à l’ORB la fabrique d’annuaires.

Écrire le programme d'un administrateur, modifier le programme du client, et faire fonctionner le système avec plusieurs annuaires.

2.2 Réponse d'opération de taille variable

Modifiez l'interface Repertory pour y ajouter les opérations suivantes et implémentez ces opérations.

        typedef sequence<Person> SeqOfPerson;  // type liste de personnes
        SeqOfPerson listAll()               // retourne toutes les entrées du répertoire
        SeqOfPerson listLike(string regexp) // retourne les entrées dont le
                                               // nom vérifie l’expression régulière regExp
.

Remarque : Pour les expressions régulières, vous pourrez utiliser la classe java.util.regex.Pattern et java.util.regex.Matcher du JDK1.4.x (http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex)

Voici un exemple d'utilisation :

Pattern p = Pattern.compile("du.*");
Matcher m = p.matcher("dupont");
boolean b = m.matches();

ou bien alors

boolean b = Pattern.matches("du.*", "dupont");

La correspondance entre les types idl et les types java est donnée dans http://java.sun.com/j2se/1.4.1/docs/guide/idl/mapping/jidlMapping.html

2.3 Utilisation d'un Holder

Ajoutez l’opération suivante à l'interface Repertory. Cette opération manipule des paramètres de type out et inout, ce qui implique d’utiliser un mécanisme particulier fourni par Corba. Ce mécanisme consiste à englober les paramètres out et inout dans des objets spécifiques appelés Holders, générés lors de la compilation idlj.

        SeqOfPerson    listBetween(
        in string regexp, // expression régulière que verifie le nom des Person
        inout long first,  // numéro d'ordre de la première entrée à retourner
        inout long last,  // numéro d'ordre de la derniere entrée à retourner
        out   long size  // nombre total de Person vérifiant l'expression régulière
        );

 

La méthode listBetween"du*",first,last,size) retourne des "fragments" de la reponse totale list("du*") pour eviter de retourner des milliers de réponse.

Par exemple, si list("du*") retourne 95 Person

? signifie que la valeur de la variable est quelconque.

2.4 Serveur générique

Le serveur générique d'objets distants GenericServer.java utilise le fichier de description config.properties pour instancer des objets CORBA, récupérer et enregistrer leur IOR, les enregistrer auprès le service de noms et/ou de les sauvegarder dans un fichier .ior. Ce serveur utilise la réflexion de Java pour instancier les classes dont les noms sont passés dans le fichier de configuration. Modifiez le fichier de configuration du serveur générique pour instancier la fabrique développée au 2.1 et complétée par 2.2 et 2.3. Faites vos tests sans modifier vos clients précédents. Désormais vous n’utiliserez que ce serveur générique pour la suite de vos développements.

2.5 Répartition de la charge de travail

Le service Repertory doit supporter des milliers de requêtes à la minute sur des millions d’objets Person (gérées/stockées)

Pour supporter la charge de travail, on décide alors que le service Repertory sera réparti entre 2 objets distants Repertory placés sur 2 machines distantes. La gestion des objets Person sera aussi répartie entre les 2 objets Repertory selon un critère de distribution.

Q1 : Quels sont les critères de distribution qui peuvent être envisagés ? Comparez ces critères du point de vue  :

Q2 : Etudiez différentes architectures d'objets réparties qui rendent cette distribution transparente au client du service et comparez dans un tableau ces architectures du point de vue :

Vous donnerez des critères supplémentaires.

Q3 : On vous propose d'implanter la solution qui consiste à gérer la distribution au niveau du client en utilisant le critère de distribution basé sur le hachage du champ 'name' de Person (qui est l'identifiant ou sa clé primaire !) modulo le nombre d'objets de service (2 pour l'instant)
La classe à compléter est la suivante

public class DRepertory implements RepertoryOperations {
 private Repertory repmod0;
 private Repertory repmod1;
 public DRepertory(Repertory repmod0,Repertory repmod1) {
  this.repmod0=repmod0;
  this.repmod1=repmod1;
 }
 public DRepertory(String namerepmod0,String namerepmod1) {
  // A compléter
 }
 private static int hashname(String name) {
  return name.hashCode()%2;
 }
 public Person get(String name) {
  return hashname(name)==0) ? repmod0.get(name) : repmod1.get(name);
 }
 ...
 // A compléter
}

Remarque : si la répartition se fait au niveau des serveurs ou au niveau du proxy, la classe DRepertory est

public class DRepertory extends RepertoryPOA {
 idem ...
}

Question : dans le cas où l’annuaire (contenant 95 entrées) est réparti entre deux serveurs (contenant respectivement 50 entrées et 45 entrées), quelles sont les valeurs de paramètres de invocations de méthodes faites par le proxy pour la méthode suivante : listBetween("du*",first=40,last=100,size=?) retourne 55 éléments et first==40,last==94,size==95

Q4 : Généraliser à N objets distants

Q5 : Généraliser à N objets distants en utilisant un critère de distribution par intervalle sur le nom au lieu du fonction de hachage sur le nom.

3. Compléments

3.1 Utilisation de contextes de nommage côté service

S'il vous reste du temps, vous pouvez programmer un serveur pour qu'il enregistre 3 objets Repertory dans les sous-contextes de nommage repertory.job, repertory.personal.family, repertory.personal.friend auprès du serveur de noms.

Pour vous aider vous pourrez consulter la documentation du JDK à ce sujet : "Adding Objects to the Namespace", http://java.sun.com/j2se/1.4.1/docs/guide/idl/jidlNaming.html#example1

3.2 Listage des contexte de nommage côté client

S'il vous reste du temps, vous pouvez programmer un client NsBrowse qui visualise l'espace de noms géré par un serveur de noms de l’application (méthode list de la classe NamingContext). Cette fonctionnalité permettra à un client de connaître l’ensemble des contextes de nommage disponibles. Si vous être un fan de Swing ou SWT, vous pouvez programmer un client graphique NsBrowseGUI en utilisant un JTree pour explorer l’arbre des NamingContext.

Pour vous aider vous pourrez consulter la documentation du JDK à ce sujet : "Sample Client: Browsing the Namespace in the Naming Service", http://java.sun.com/j2se/1.4.1/docs/guide/idl/jidlNaming.html#example3

3.3 Serveur générique

S'il vous reste du temps, vous pouvez compléter de programmer le serveur générique d'objets distants GenericServer.java. Votre travail consiste à compléter le code de ce serveur pour pouvoir passer des paramètres d'initialisation aux constructeurs d'objets et pour avoir des contextes hiérarchiques de nommage (cf 3.1).

Faites vos tests avec les clients précédents.

3.4 ORBD

L’ORBD (ORB Deamon) est un serveur d’objets CORBA fournit dans le JDK. Il inclut en autre le service de nommage persistant. L’outil servertool permet grâce des commandes en ligne de déployer et  d’administrer de servants sur l’ORBD.

Votre travail consiste à déployer les objets Repertory, RepertoryFactory et Hello sur l’ORBD au moyen de l’outil servertool et à tester ces déploiements au moyen des clients déjà développés.

3.5 Persistance

S'il vous reste du temps, vous pouvez modifier les annuaires pour rendre persistant les entrées des annuaires aux interruptions de service (réponse à la troisième question du 1.5).

3.6 Invocation dynamique

S'il vous reste du temps, vous pouvez programmer un client DIIClient qui utilise le DII pour invoquer la méthode get() sur un objet Repertory

Selon vous, quelles sont les applications possibles de la DII ?

Pour vous aider vous pourrez consulter la documentation du JDK à ce sujet : "Advanced Topic: The Dynamic Skeleton Interface (DSI)", http://java.sun.com/j2se/1.4/docs/guide/idl/jidlDSI.html , http://developer.netscape.com/docs/manuals/enterprise/javapg/dsi.htm#1005531 et le cours de Geib, Merle, Gransart http://corbaweb.lifl.fr/CORBA_des_concepts_a_la_pratique/index.html Section 4.3

3.7 Dépositaire d'Interfaces

L’architecture Corba fournit un service permettant de consulter dynamiquement les descriptions IDL des objets répartis. Ce service est appelé le référentiel d’interfaces. S'il vous reste du temps, vous pouvez programmer un client IrBrowse qui visualise l'espace d'interfaces géré par le référentiel d’interfaces de l'ORB. Remarque : cette étape ne peut être faite avec l’ORB du JDK qui n’inclut pas de service dépositaire d’interfaces. JacORB http://www.jacorb.org/

Pour vous aider vous pourrez consulter le cours de Geib, Merle, Gransart http://corbaweb.lifl.fr/CORBA_des_concepts_a_la_pratique/index.html ou http://corbaweb.lifl.fr/CORBA_des_concepts_a_la_pratique/cours_CORBA.pdf "Section 4.2.6.1. Consulter le référentiel" .

3.8 Interopérabilité Java et .NET avec IIOP

CORBA permet des programmes (clients et serveurs) écrit dans différents langages et sur différentes plates-formes d’interopérer. L’archive http://www-adele.imag.fr/~donsez/cours/ex_dotnet/interopcsharpjava.zip présente un exemple d’interopérabilité des clients et de serveurs écrit en Java et en C# via IIOP, le protocole d’interopérabilité d’ORB CORBA sur IP. L’exécution de cet exemple requière l’installation du framework .NET (il est installé dans plusieurs salles machines de l’UFR) téléchargeable gratuitement depuis le site http://www.microsoft.com/dotnet.

S'il vous reste du temps, vous pouvez programmer uniquement en C# le serveur d’annuaire de la question 2.1 après avoir regarder l’exemple de l’archive http://www-adele.imag.fr/~donsez/cours/ex_dotnet/interopcsharpjava.zip. Vous utiliserez donc votre client écrit en Java pour interroger et mettre à jour l’annuaire servi pour ce serveur C#. La présentation http://www-adele.imag.fr/~donsez/cours/dotnetremoting.pdf détaille l’architecture extensible de .NET Remoting qui est le bus de communication générique du framework .NET.

4. Compte rendu

Chaque binôme doit rendre par mail à l’enseignant de son groupe une SEULE et UNIQUE archive (zip ou jar) des différentes versions de repertory (après l’avoir nettoyé ant clean) ainsi qu’un document HTML répondant aux différentes questions posées (votre travail sera également jugé sur la qualité de votre source : commentaires, identifiants, …). N’oubliez par de mettre vos noms dans vos sources.

IMPORTANT : Le nom de l’archive doit comporter la formation, l’année et les noms des 2 binômes et (exemple : RICM3_0506_LAUREL_HARDY.zip ou M2PGI_0506_LAUREL_HARDY.zip).