TP4 : Common Object Request Broker Architecture (intro CORBA)
Téléchargez cette archive contenant
des exemples à tester et à compléter.
Pour tous les exercices, pensez bien à tuer tous vos programmes
serveurs à chaque fois que vous vous déloguez d'une machine Linux.
Exercice 0
- Placez-vous dans le répertoire
Carre
et parcourez rapidement les différents codes sources
présents, puis réalisez les étapes
suivantes :
- Réaliser la projection (mapping) de l'interface IDL par la commande
idlj -fall -oldImplBase Icarre.idl
Plusieurs fichiers sont alors générés automatiquement.
- Compiler les sources en exécutant le script
./compile
.
IMPORTANT : se sont les fichiers *Operations.java
qui fournissent les
interfaces Java qui à utilisées dans l'implantation.
- Lancer l'application en commençant par le serveur :
java Serveur
Le serveur affiche alors son IOR (Interoperable Object Reference) qu'il faut
passer en argument du client.
ATTENTION : la chaîne "IOR:" fait partie intégrante de l'IOR du serveur.
- Lancer le client par :
java Client
- Refaire les étapes 3 et 4, mais cette fois le client et le serveur ne doivent pas
se trouver sur la même machine.
- Ne pas oublier de tuer le serveur en se déconnectant.
Exercice 1
- Recopiez le contenu du répertoire
Carre/
dans un nouveau répertoire
Carre_Holder
, puis placez-vous dans ce répertoire.
Exécuter le script ./clean
pour supprimer les fichiers générés
par idlj
et le bytecode.
- Modifier la fonction
long carre(in long source)
de l'IDL afin de faire passer
le résultat de la fonction en second paramètre.
La nouvelle signature de la fonction devient donc
void carre(in long source, out long resultat)
.
Le code des fichiers Icarre.idl
, IcarreImpl.java et Client.java
est à modifier.
- Lancer le serveur et tester le service distant.
Exercice 2
Dans cet exercice, on va utiliser le POA (Portable Object Adaptor).
Par rapport à l'exercice 1, un intermediaire appelé POA se place entre
le squelette de l'objet distant et l'ORB au niveau du serveur.
Ce POA normalisé permet de faire interopérer le serveur avec
differents ORBs (pas uniquement celui de java SUN).
- Recopier le contenu du répertoire
Carre/ dans un nouveau
répertoire Carre_POA
, puis placez-vous dans ce répertoire.
Nettoyez-le comme au début de l'exercice précédent.
- Modifier le fichier
compile
en enlevant l'option -oldImplbase
lors de l'appel à idlj
.
ATTENTION : la projection IDL vers Java change, le squelette n'est plus _IcarreImplBase
mais IcarrePOA
.
- Modifier le code du serveur pour utiliser le POA.
Pour cela, supprimer la ligne :
String ior = orb.object_to_string(myobj);
et la remplacer par les lignes :
POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
org.omg.CORBA.Object poaobj = poa.servant_to_reference(myobj);
String ior = orb.object_to_string(poaobj);
Ne pas oublier de mettre à jour les imports de package et les exceptions :
import org.omg.PortableServer.*;
catch (org.omg.CORBA.UserException)
- (facultatif) Faire de même pour la version
Holder
pour laquelle le
résultat est un argument de la fonction.
Exercice 3
Placez-vous dans le répertoire Matrice
.
- Ce répertoire contient un fichier
OpMatrice.idl
.
Cette interface IDL définit un service qui propose la multiplication de 2
matrices.
Projeter cette interface avec l'outil idlj
.
- Proposer une implémentation CORBA de ce service, équivalente
à ce qui a été fait précédemment avec RMI
dans le TD2 et le TP3.
Cette fois-ci on pourra multiplier des matrices rectangulaires
quelconques : a
de dimension n*k
et b
de dimension k*m
.
- Le Client demandera au service distant de multiplier les deux matrices
a et b telles que :
int[][] a = { {1, 0, 0}, {0, 2, 0}, {0, 0, 3}, {0, 0, 4} };
int[][] b = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} };
et retourner un résultat égal à :
res = a*b = { {1, 2, 3}, {2, 4, 6}, {3, 6, 9}, {4, 8, 12} };
- REMARQUE : pour éviter de faire un copier/coller de l'IOR à partir du
shell, on peut écrire l'IOR dans un fichier qui sera lu par le client.
Dans le fichier IDL est définie une constante iorfile
contenant
le nom du fichier où l'IOR sera stocké.
Dans le serveur, pour écrire l'IOR dans un fichier, vous pouvez par exemple
utiliser le code suivant :
FileOutputStream file = new FileOutputStream(iorfile.value);
PrintWriter out = new PrintWriter(file);
out.println(ior); out.flush();
file.close();
Dans le client, on peut utiliser le code suivant pour lire l'IOR depuis un fichier :
FileReader file = new FileReader(iorfile.value);
BufferedReader in = new BufferedReader(file);
ior = in.readLine();
file.close();
Modifier le code pour permettre le passage de l'IOR par fichier.
Exercice 4
Placez-vous dans le répertoire Annuaire
.
- Le fichier
Annuaire.idl
définit l'interface IDL
d'un service d'annuaire comme celui vu dans le TP3.
Générer l'ensemble des fichiers associés à cette
interface.
- Proposer une implémentation CORBA de ce service en utilisant le POA.
Reprendre pour cela l'exercice RMI de l'annuaire dans le TP3.
[Page réalisée à à l'aide
d'un document de Guillaume
Latu]