Pont CORBA Java-Delphi
L'objet de cet article est de montrer comment une application cliente Java peut invoquer un objet défini dans une application serveur développée avec Delphi, en utilisant le support CORBA de Java 2 et l'implémentation CORBA Visigenic pour Delphi.

Client : Java 2 (JDK 1.3), Forte for Java
Serveur : Pascal Objet, Delphi 6, Visibroker 4.1

Les ORB (Object Request Broker) sont interopérables parce qu'ils se conforment à la norme CORBA ; dans la pratique cela peut être délicat...
Le programme de démonstration du répertoire "COSNaming40" de Delphi 6 utilise le service de nom "NameService" accessible à partir d'autres ORB pour permettre l'accès aux objets qui y sont recensés. N'ayant pas réussi à y accéder depuis l'ORB de Java 2 (JDK 1.3), l'application cliente Java utilise l'IOR (Interoperable Object Reference) de l'objet disponible dans l'application serveur.

Les programmes client et serveur partent de la définition d'interface suivante du fichier Hello.idl :

module HelloApp
{
  interface Hello
  {
    string sayHello();
  };
};

L'application cliente Java se contentera d'invoquer la méthode sayHello pour obtenir le fameux "Hello World !".
Les définitions de classes de support pour Java et Delphi sont obtenus respectivement avec l'exécution des outils idlj du JDK 1.3 et idl2pas de Delphi 6 (il faut avoir installé Visibroker 4.1).


Client Java

import HelloApp.*; // Le package contenant les classes "stubs"
import org.omg.CORBA.*;


public class HelloClient
{
  public static void main(String args[])
  {
    try{

      // Créer et initialiser l'ORB
      ORB orb = ORB.init(args, null);

      String ref = "IOR:01202..."; // L'IOR de l'objet serveur

      org.omg.CORBA.Object objRef = orb.string_to_object(ref);

      Hello helloRef = HelloHelper.narrow(objRef);

      // Appeler la méthode sayHello de l'objet serveur
      String hello = helloRef.sayHello();
      System.out.println(hello);

    } catch(Exception e) {
        System.out.println("ERROR : " + e);
        e.printStackTrace(System.out);
      }
  }
}


Serveur Delphi

L'application serveur est une application Delphi comportant une fiche avec un objet de type TMemo et dont l'unité suit (les unités HelloApp_c, HelloApp_i, HelloApp_impl et HelloApp_s ont été générées par idl2pas) :

unit ServerMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Corba, HelloApp_c, HelloApp_i, HelloApp_impl, HelloApp_s, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  protected
    FHello : Hello; // objet "skeleton"
    procedure InitCorba;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.InitCorba;
begin
  CorbaInitialize;

  // Créer le serveur
  FHello := THelloSkeleton.Create('Hello', THello.Create);
  BOA.ObjIsReady(FHello as _Object);

  // Afficher l'IOR de l'objet
  Memo1.Text := Orb.ObjectToString(FHello as CorbaObject);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  initCorba;
end;

end.


La classe THello déclarée dans l'unité "HelloApp_impl" définie la méthode sayHello qu'il suffit de compléter en saisissant par exemple :
Result := 'Hello World !';


Exécution

Voici l'ordre dans lequel exécuter chaque partie. Tout d'abord lancer l'osagent de Visibroker, suivi de l'application serveur. Le contrôle TMemo affiche alors l'IOR de l'objet serveur à reporter dans le code source Java du client.
Le client peut alors être exécuté pour afficher le traditionnel message "Hello World !".
Cette façon de faire n'est pas très élégante ! Une meilleur solution consisterait à ce que l'application écrive l'IOR dans un fichier qui serait alors rendu disponible au travers d'un serveur web. L'application cliente Java réclamerait ce fichier par une requête HTTP avant de réaliser ses invocations.

Sommaire

Client Java
Serveur Delphi
Exécution

Début

Copyright © 2003 OBJECT-EVERYWHERE. Tous droits réservés | Bertrand Goetzmann