Développement d’une Application CORBA 16/11/2018 Chapitre 4 Développement d’une Application CORBA
Etapes de Mise en Œuvre d’application simple en CORBA 16/11/2018 Etapes de Mise en Œuvre d’application simple en CORBA Le développement d'une application CORBA respecte toujours les même étapes. Description des objets à l'aide de l'IDL, Implantation des divers objets, Implantation du serveur avec échanges des références, Implantation du client.
Scénario de développement 16/11/2018 Scénario de développement Écriture des contrats IDL Compilation d’une description IDL Implémentation des objets CORBA Développer le serveur Développer le client
Scénario de développement 16/11/2018 3 1 2 4
1. Écriture des contrats IDL 16/11/2018 1. Écriture des contrats IDL
16/11/2018 Le développement d'une application CORBA commence par l'énumération des services offerts par chaque objet corba. Une même description IDL peut contenir plusieurs descriptions d'objets. Une description IDL s'effectue au sein d'un fichier texte comportant par convention l'extension « .idl » Chaque objet offre une interface qui contient une liste d'opérations qui seront par la suite offertes aux applications clientes.
Une interface supporte l'héritage multiple. 16/11/2018 Une interface est une énumération d'opérations et de définitions de types de données. interface Exemple { // contenu de l'interface }; Une interface supporte l'héritage multiple. interface AutreExemple : Exemple1, Exemple2
16/11/2018 Les opérations décrites dans une interface respectent le format suivant : type_de_retour nom_de_l'operation ( liste_des_paramètres ) C.O.R.B.A. offre plusieurs types de données : les types de bases les types complexes La liste des paramètres peut être vide.
La description d'un paramètre comporte trois parties : 16/11/2018 La description d'un paramètre comporte trois parties : – le modificateur:spécifie le sens d'échange du paramètre : in : du client vers l'objet CORBA out : en retour, de l'objet CORBA vers le client inout : équivalent à un passage par adresse. – le type de l'argument ( type de base ou type complexe ) – le nom de l'argument
16/11/2018 Exemples L'exemple suivant décrit un objet qui offre une interface appelée « Premier ». Cette interface comporte une opération dénommée «affiche» qui entraîne l'affichage d'un message sur le serveur (message passé en tant que paramètre). interface Premier { void affiche ( in string message ) ; };
Exemple Le contrat IDL: fichier texte premier.idl interface Premier { void affiche ( in string message ) ; }; Compilation du contrat IDL: jidl premier.idl – PremierPOA.java (squelette) – _PremierStub.java (souche) – Premier.java (interface) – PremierOperations.java (opérations définies dans l’interface) Premier Objet CORBA (en Java) public class PremierImpl extends PremierPOA public void affiche( String message ) System.out.println( message ); } 16/11/2018
2. Projections des interfaces 16/11/2018 2. Projections des interfaces
Une description IDL est traduite vers un langage de programmation. 16/11/2018 Une description IDL est traduite vers un langage de programmation. Une projection est définie pour un langage donné: IDL java ; IDL C++ ; IDL . . . Les règles de traduction sont appelées «mapping» et font partie de la spécification CORBA.
Elle spécifie, pour le langage cible : 16/11/2018 Elle spécifie, pour le langage cible : La projection des types de base IDL ; La projection des constructeurs de types : const, enum, struct, union, sequence, array, typedef ; La projection des références vers les objets ; La projection des appels de méthodes : passage des paramètres, réception des résultats La manipulation des exceptions ; La projection des accès aux attributs. L’API de l’ORB ; Elle décrit l’utilisation des différents Services Corba pour le langage cible.
16/11/2018
3. Compilation d’une description IDL 16/11/2018 3. Compilation d’une description IDL
jidl Premier.idl jidl compteur1.idl idl compteur1.idl 16/11/2018 La description doit être compilée afin de générer les amorces ( souche et squelette ) requises pour l'établissement de la communication inter-processus. Exemple de compilation IDL : jidl Premier.idl jidl compteur1.idl idl compteur1.idl A l'issu de la compilation, plusieurs fichier sont créés. Java C++
16/11/2018 Si on veut générer les souches/squelettes de la projection en Java, on utilise la commande : jidl Premier.idl Un sous-répertoire pour le package M_compteur est généré : il correspond au module de même nom. Les fichiers générés sont alors: Premier.java, PremierHelper.java, PremierHolder.java, _PremierStub.java, PremierOperations.java, PremierPOA.java
16/11/2018 Premier.java : interface Java de l’interface IDL dérivant elle-même de l’interface PremierOperations et de l’interface CORBA.Object PremierHelper.java : Classe qui regroupe des méthodes d’utilisation(liaison à un objet ...) des objets distribués ; PremierHolder.java : Classe “enveloppe” pour le passage de paramètres ; _PremierStub.java : souches de l’objet distant I_compteur qui sont utilisées par le client ; PremierOperations.java : méthodes permettant au POA de rediriger les invocations de l’ORB vers le servant. PremierPOA.java : squelette de l’objet I_compteur utilisé pour implémenter le service, par dérivation.
4. Implémentation des objets CORBA 16/11/2018 4. Implémentation des objets CORBA
le type de l'adaptateur d'objet utilisé, l'approche de développement. 16/11/2018 Pour développer un objet CORBA plusieurs critères sont à prendre à compte : le type de l'adaptateur d'objet utilisé, l'approche de développement. Deux adaptateurs d'objets sont disponibles : – le B.O.A. ( Basic Object Adapter ) – le P.O.A. ( Portable Object Adapter ) Deux approches existent : – l'approche par héritage : ici l'implantation de l'objet doit hériter du squelette ( c'est à dire de la classe Java correspondant au squelette qui à été générée par le compilateur ). – l'approche par délégation .
Approche par héritage: 16/11/2018
La seule obligation est de ne pas oublier l'héritage du squelette. 16/11/2018 public class PremierImpl extends PremierPOA { public void affiche( String message ) { System.out.println( message ); } } La seule obligation est de ne pas oublier l'héritage du squelette. Ensuite, il faut tout simplement fournir le code des opérations décrites dans l'interface IDL.
16/11/2018 5. Développer le serveur
Les étapes à respecter sont les suivantes : 16/11/2018 Les étapes à respecter sont les suivantes : initialiser l'ORB initialiser l'adaptateur d'objets créer l'objet CORBA enregistrer l'objet CORBA exporter la référence de l'objet CORBA attendre les invocations clientes
16/11/2018 Initialiser l'ORB Pour cela, on fait appel à la fonction statique « init » de la classe « org.omg.CORBA.ORB ». Deux formes de cette fonction sont disponibles : – org.omg.CORBA.ORB.init( ) – org.omg.CORBA.ORB.init( String [] args, java.util.Properties prop ) public static void main( String [ ] args ) { org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, null ); // … }
initialiser l'adaptateur d'objets (POA) 16/11/2018 initialiser l'adaptateur d'objets (POA) Au niveau du POA, on parle de : Servant implante une interface IDL ; Serveur accueille un ou plusieurs servants ; Référence d’objet vision de la part du client d’une interface IDL ; Une application serveur contient au minimum un POA (elle peut en avoir plusieurs) appelé le RootPOA Le(s) POA(s) sont gérés par le POA Manager
Une application serveur doit – Récupérer une référence d’objet RootPOA 16/11/2018 Une application serveur doit – Récupérer une référence d’objet RootPOA POA rootpoa = POAHelper.narrow (orb.resolve_initial_references («RootPOA»)); et – Activer le POA Manager rootpoa.the_POAManager().activate();
16/11/2018
Créer l’objet CORBA Cette construction se fait en deux étapes : 16/11/2018 Créer l’objet CORBA Cette construction se fait en deux étapes : On créé l’objet (servant) qui implémente le service CORBA. On associe une référence à l’objet créé et on l’enregistre dans le POA pour le rendre accessible aux clients.
16/11/2018 Créer l'objet CORBA Pour créer l'objet CORBA, il suffit de créer une instance de la classe d'implantation de l'objet ( PremierImpl ). Dans la terminologie POA, cet objet s’appelle un servant PremierImpl premier = new PremierImpl(); Enregistrer un servant revient à lui associer une référence : org.omg.CORBA.Object ref = rootpoa.servant_to_reference(premier );
Exporter la référence de l’objet (Publier sa référence) 16/11/2018 Exporter la référence de l’objet (Publier sa référence) Chaque objet CORBA dispose d'une identité ( la référence d'objet ). Pour qu'un client puisse appeler un objet CORBA, celui-ci doit en connaître la référence de l'objet. C'est pourquoi l'objet CORBA doit échanger avec le client sa référence d'objet. – object_to_string : cette opération transforme une référence d'objet en une chaîne de caractères. – string_to_object : cette opération transforme une chaîne de caractères en une référence d'objet.
16/11/2018 La conversion consiste à utiliser une fonction spécifique appelée « narrow ».
Cette classe porte le nom de l'élément IDL avec pour suffixe "Helper". 16/11/2018 Pour chaque élément décrit en IDL, le compilateur génère une classe supplémentaire appelée classe helper. Cette classe porte le nom de l'élément IDL avec pour suffixe "Helper". Les classes helpers associées aux interfaces IDL comportent une opération de conversion ( narrow ). public class PremierHelper { public static Premier narrow( org.omg.CORBA.Object obj ) { //… } //... }
Attendre les requêtes Clientes 16/11/2018 Attendre les requêtes Clientes Le serveur se met à l’écoute des requêtes clientes en lançant une boucle du serveur . orb.run
import org.omg.CORBA.ORB; import org.omg.PortableServer.*; 16/11/2018 Initialisation de l’ORB Exemple de serveur import org.omg.CORBA.ORB; import org.omg.PortableServer.*; public class Serveur { public static void main( String [] args ) try { ORB orb = ORB.init( args, null ); POA rootpoa = POAHelper.narrow(orb.resolve_initial_references ("RootPOA")); rootpoa.the_POAManager().activate(); PremierImpl premier = new PremierImpl(); org.omg.CORBA.Object objref = rootpoa.servant_to_reference(premier); API de CORBA Activer le POA manager Récupérer une référence d’objet RootPOA Créer le servant premier Enregistrer ou associer une référence objref au servant premier
} catch ( Exception ex ) String ref = orb.object_to_string( objref ); 16/11/2018 Transformer la référence objref en une chaine ref String ref = orb.object_to_string( objref ); java.io.FileOutputStream file = new java.io.FileOutputStream("ObjectID"); java.io.PrintStream output = new java.io.PrintStream( file ); output.println( ref ); output.close(); orb.run(); } catch ( Exception ex ) { ex.printStackTrace(); } } L’identité de l’objet (sa référence) est récupérée dans le fichier en sortie file sous forme de chaîne de caractères
16/11/2018 6. Développer le client
Les étapes à suivre sont les suivantes : 16/11/2018 Les étapes à suivre sont les suivantes : – Initialiser l'ORB, – Récupérer la référence de l'objet à utiliser, – Convertir la référence vers le type de l'objet à utiliser, – Utiliser l'objet.
Exemple de client de l’objet Premier 16/11/2018 Exemple de client de l’objet Premier public class Client { public static void main( String [ ] args ) org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init( args, null ); try { java.io.FileInputStream file = new java.io.FileInputStream ("ObjectID"); java.io.InputStreamReader input = new java.io.InputStreamReader( file ); java.io.BufferedReader reader = new java.io.BufferedReader(input); Initialisation de l’ORB Ouverture du fichier file qui contient l’identité de l’objet
String ref = reader.readLine(); file.close(); 16/11/2018 String ref = reader.readLine(); file.close(); org.omg.CORBA.Object obj = orb.string_to_object(ref) ; Premier premier = PremierHelper.narrow( obj ); premier.affiche("Bonjour du client…"); } catch ( java.lang.Exception ex ) Récuperer l’identité de l’objet ref Transformer la référence ref en un objet obj Utilisation de l’objet premier à travers sa méthode affiche
Exécuter l'application consiste à suivre les étapes suivantes : 16/11/2018 Exécuter l'application consiste à suivre les étapes suivantes : lancer le serveur, copier le fichier contenant la référence d'objet sur le poste client, lancer le client