Imprimer depuis des programmes écrits dans des langages différents Java, Javascript…
Avec deux PC, je vais créer un client, et un serveur d’impression. Le serveur d’impression va accueillir les demandes d’impressions dans n’importe quel langage. Un programme écrit en Java par exemple, va pouvoir imprimer. Un programme écrit en C++ aussi, javascript, C#, etc.
L’IDL
L’IDL permet de cibler plusieurs langage.
L’IDL peut être généré avec http://eclipsecorba.sourceforge.net/
http://www-scf.usc.edu/~csci201/lectures/Lecture25/CORBA-Eclipse.pdf
L’IDL est fourni par le métier, la MOA : nous fournit un répertoire avec un IDL dans :
… Communication par Bus Logiciel\td1-PriseEnMain\__sources
Je lance la commande idlj –fall dessus pour récupérer les classes.java
$ idlj -f all Imprimante.idl
Outil idlj:
com.sun.tools.corba.se.idl.InvalidArgument: No IDL file was specified. Compiler Usage: java com.sun.tools.corba.se.idl.toJavaPortable.Compile [options] <idl file> where <idl file> is the name of a file containing IDL definitions, and Options: |
Une question? Posez-la ici
L’interface décrit les méthodes distantes
La compilation de l’IDL génère automatiquement
-le skeleton POA, ImprimantePOA.java qui va me retourner mon IOR. (genere une adresse ip et un numéro de port pour cet objet) . On récupère l’IOR du rootPOA. Operation de narrowing qui fait appel à la classe POAHelper
-le stub, ImprimanteStub.java
objet proxy, et les classes holders, et helper (obligatoire car elle contient la méthode narrow qui permet de passer du monte Corba au monde java ou réciproquement).
J’obtiens le serveur
ServeurImprimantes.java
J’obtiens le client
Imprimante.java
On obtient l’interface commune au client et au serveur :
imprime.java
L’iDL compilé génère les classes
ImprimanteIMPL étend la classe abstraite, l’interface Imprimante POA qui est le squelette : à l’intérieur de cette classe, on
On définit donc les méthodes de la classe abstraite, sinon ca ne compile pas.
-getinfo(){ //code }
-printDocument(){ //code }
Le code propre à Corba va se rouver dans le client et le serveur
Le serveur
J’écris une classe que l’on appelle ServeurImprimante.Java
J’ai 2 objets servants Corba, un par imprimante
Avec nom des imprimantes, tableau des servants
Lignes propres à Corba.
Je récupère l’ORB grace à la méthode ORB.init (je peux passer des arguments, ou pas)
Je dois récupérer le portable object adapteur : j’utilise donc resolve_initial_references sur le nom RootPOA qui est connu de l’ORB.
Cette méthode me retourne l’IOR. L’IOR ce sont des informations de localisation de l’objet distant.
Faire un « iordump » sur un ior, on obtient en clair, de manière lisible, les informations : repositoryID, la version du protocole IIOP, et des informations d’adressage : IP, port… Ensuite j’ai uen clé KEY qui dépend du fournisseur du bus CORBA. Donc ce sont des informations de localisation.
A l’aide de cette IOR, je fais une opération de narrowing pour régupérer un objet JAVA. Je transforme l’IOR en objet JAVA. (poru récupérer le root POA car j’en ai besoin, c’est l’objet notoire, l’objet qui existe déjà dans Corba).
Ensuite, obligatoirement, je dois activer le POA manager : donc j’ai un objet java POA, je vais chercher le POA manager du rootPAO qui s’appelle POA et j’appelle la méthode POA activate, et ce POA manager va gérer les requêtes entrentes.
Toujours dans ma classe ServeurImprimante.Java
dans mon tableau Servants, je crée les objets imprimante canon et hp
Je récupère une IOR. C’est mon POA qui me l’a généré, et cela représente la localisation réseau de mes 2 servants qui sont les 2 imprimantes.
Cet IOR, pour la diffuser au client : je vais prendre une méthode classique, et je vais inscrire les infos dans un fichier.
1 IOR par imprimante
Je transforme l’IOR de type object en chaine de caractere, avec un ToString() ensuite je crée le fichier et j’écris mon IOR dans le fichier.
// Ecrire dans un fichier la référence des deux objets CORBA.
Ensuite je mets le serveur en run, en attente. Il attend quoi?
Il attend qu’un client se connecte et demande une impression
Le client
Le client doit récupérer des IOR, les transformer en JAVA, et appeler les méthodes qui correspondent à l’interface IDL :
-getInfo()
-printDocument() ;
Je me connecte à l’ORB par init : ORB.init
Je récupère les IOR que j’ai streamifié dans le fichier : je lis le fichier :
Avec un String ior=in.readLine()
Je transforme la string en objet avec stringt_to_object(ior)
Le serveur a créé les IOR, le client les récupère.
Le but je le rappelle est d’invoquer les méthodes distantes.
J’ai récupéré l’IOR d’un imprimante, je le transforme grace à l’opération de narrowing dans un objet java printer référence qui est de type imprimante, objet proxy généré par la projection de l’IDL en java.
J’utilise le squelette imprimante POA, j’utilise l’objet proxy Imprimante, et j’utilise la classe HelperImprimante qui contient la méthode narrow.
Ensuite on obtient quelques informations sur l’objet distant
Et je lance la méthode printerRef.getinfo
Je lance le terminal et la commande :
Java Imprime canon fichier
J’obtiens
« Impression du document fichier sur canon taille 7 »
Idem pour
Java Imprime hp fichier
Une question? Posez-la ici