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.

 

idl stub skeleton poa java orb helper narrow160

 

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] is any combination of the options listed below.  The options
are optional and may appear in any order; <idl file> is required and
must appear last.

Options:
-d <symbol>               This is equivalent to the following line in an
                          IDL file:  #define <symbol>
-emitAll                  Emit all types, including those found in #included files.
-f<side>                  Define what bindings to emit.  <side> is one of client,
                          server, all, serverTIE, allTIE.  serverTIE and allTIE
                          cause delegate model skeletons to be emitted.  If this
                          flag is not used, -fclient is assumed.
-i <include path>         By default, the current directory is scanned for
                          included files.  This option adds another directory.
-keep                     If a file to be generated already exists, do not
                          overwrite it.  By default it is overwritten.
-noWarn                   Suppress warnings.
-oldImplBase              Generate skeletons compatible with old (pre-1.4) JDK ORBs.
-pkgPrefix <t> <prefix>   When the type or module name <t> is encountered at
                          file scope, begin the Java package name for all files
                          generated for <t> with <prefix>.
-pkgTranslate <t> <pkg>   When the type or module name <t> in encountered, replace
                          it with <pkg> in the generated java package.  Note that
                          pkgPrefix changes are made first.  <t> must match the
                          full package name exactly.  Also, <t> must not be
                          org, org.omg, or any subpackage of org.omg.
-skeletonName <xxx%yyy>   Name the skeleton according to the pattern.
                          The defaults are:
                          %POA for the POA base class (-fserver or -fall)
                          _%ImplBase for the oldImplBase base class
                          (-oldImplBase and (-fserver or -fall)).
-td <dir>                 use <dir> for the output directory instead of
                          the current directory.
-tieName <xxx%yyy>        Name the tie according to the pattern.  The defaults are:
                          %POATie for the POA tie (-fserverTie or -fallTie)
                          %_Tie for the oldImplBase tie
                          (-oldImplBase and (-fserverTie or -fallTie)).
-v, -verbose              Verbose mode.
-version                  Display the version number and quit.

 

 

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