Przykład programu wykorzystującego standard CORBA w środowisku Java. Dwa pierwsze przykłady przetestowano w środowisku Java 1.3, ostatni w środowisku 1.4 z wykorzystaniem POA.

Wspólne dla obydwu wersji pliki

Plik slownik.idl

Opisuje interfejs serwera udostępniający prosty słownik polsko-angielski.

// Moduł do zdalnego słownika 

module Tlumaczenie {

  exception Nieznane {};

  interface Slowniczek {
    
    // wstawienie pary
    void wstaw(in string pol, in string ang);

    // argument: ang, wynik pol
    string angpol(in string ang) raises(Nieznane);

    // argument: pol, wynik ang
    string polang(in string pol) raises(Nieznane);

    // rozmiar słownika 
    readonly attribute unsigned long rozmiar;

  };
};	// koniec modułu Tlumaczenie

Plik TlumaczImpl.java

Implementacja serwera.

// implementacja deklaracji slownik.idl

import java.util.*;
import Tlumaczenie.*;

public class TlumaczImpl extends Tlumaczenie._SlowniczekImplBase {

    private Vector _pol;
    private Vector _ang;

    public TlumaczImpl() {
        super();
        _pol = new Vector();
        _ang = new Vector();
    }

    // implementacja interfejsu
    public void wstaw(String pol, String ang)  {
        _pol.add(pol);
        _ang.add(ang);
    }

    public String angpol(String ang) throws Nieznane {
        int idx = _ang.indexOf(ang);
        if (idx == -1) { throw new Nieznane(); }
        else return ((String)_pol.get(idx));
    }

    public String polang(String pol) throws Nieznane {
        int idx = _pol.indexOf(pol);
        if (idx == -1) { throw new Nieznane(); }
        else return ((String)_ang.get(idx));
    }

    public int rozmiar() {
        return _ang.size();
    }
}

Wersja z komunikacją przez plik

Plik SerwerPlik.java

Uruchomienie serwera i zapisanie do pliku jego referencji.

// zarządzanie serwerem, IOR przekazywany jest przez plik
// java 1.3

import java.io.*;
import Tlumaczenie.*;

// Rejestracja implementacji obiektu

public class SerwerPlik {
    public static void main(String[] args) {
        if (args.length!=1) {
            System.err.println("Wymagany argument: plik z ior");
            return;
        }

        try {
            // Uruchomienie ORB.
            org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
            
            // Utworzenie obiektu tlumaczacego
            TlumaczImpl tlumacz = new TlumaczImpl();
            orb.connect(tlumacz);
			
            tlumacz.wstaw("czerwony", "red");
            tlumacz.wstaw("zielony","green");
            
            // Wypisanie identyfikatora obiektu
            System.out.println( "GII:\n" + orb.object_to_string(tlumacz) );

            // zapisanie identyfikatora w pliku
            PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(args[0])));
            out.println( orb.object_to_string(tlumacz) );
            out.close();
			
            // oczekiwanie na wywołania metod
            java.lang.Object sync = new java.lang.Object();
            synchronized (sync) {
                sync.wait();
            }

        } catch (Exception e) {
	        System.err.println("Błąd serwera: " + e);
	        e.printStackTrace(System.out);
        }
    }
}

Plik KlientPlik.java

Klient korzystający z serwera, referencję odczytuje z pliku.

// implementacja klienta z przekazywaniem pliku
// java 1.3
import java.io.*;
import org.omg.CORBA.*;
import Tlumaczenie.*;

public class KlientPlik {
    public static void main(String args[]) {
        if (args.length!=1) {
            System.err.println("Wymagany argument: plik ior");
            return;
        }
        try {
            // utworzenie i inicjowanie ORB'a
            ORB orb = ORB.init(args, null);

            // odczyt identyfikatora obiektu ze wskazanego pliku
            BufferedReader in = new BufferedReader(new FileReader(args[0]));
            String ior = in.readLine();
            in.close();

            // zamiana identyfikatora na wskaźnik
            org.omg.CORBA.Object obj = orb.string_to_object(ior);

            // zawężenie do obiektu Slowiczek
            Slowniczek slownik = SlowniczekHelper.narrow(obj);

            // wywołania metod
            System.out.println(slownik.angpol("red"));
            System.out.println(slownik.angpol("green"));
            slownik.wstaw("niebieski","blue");
            System.out.println(slownik.polang("niebieski"));
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

Uruchomienie

Polecenia:

idlj slownik.idl
idlj -fserver slownik.idl
generują odpowiednie pliki w katalogu Tlumaczenie. W szczególności zostaje wygenerowany plik z deklaracją klasy _SlowniczekImplBase, po której dziedziczy implementacja klasy TlumaczImpl.

Następnie należy skompilować wszystkie pliki:

javac Tlumaczenie/*.java
javac -classpath . *.java
Programy serwera i klienta uruchamiamy podając jako parametr jakiś plik (dla klienta i serwera musi być ten sam).
java TlumaczSerwer iiop
java TlumKlient iiop

Wersja z serwerem nazw

Plik SerwerNaming.java

import java.io.*;
import Tlumaczenie.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

// Rejestracja implementacji obiektu

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

        try {
            // Uruchomienie ORB'a
            ORB orb = ORB.init(args,null);
            
            // Utworzenie obiektu tlumaczacego
            TlumaczImpl tlumacz = new TlumaczImpl();
            orb.connect(tlumacz);
			
            // Przestrzeń nazw
            org.omg.CORBA.Object objRef = 
                orb.resolve_initial_references("NameService");
            NamingContext ncRef = NamingContextHelper.narrow(objRef);

            // związanie obiektu z nazwą
            NameComponent nc = new NameComponent("tlumacz", "");
            NameComponent path[] = { nc };
            ncRef.rebind(path, tlumacz);

            tlumacz.wstaw("czerwony", "red");
            tlumacz.wstaw("zielony","green");
            
            // Identyfikator obiektu
            System.out.println( orb.object_to_string(tlumacz) );

            // oczekiwanie na wezwania
            java.lang.Object sync = new java.lang.Object();
            synchronized (sync) {
                sync.wait();
            }

        } catch (Exception e) {
	        System.err.println("Stock server error: " + e);
	        e.printStackTrace(System.out);
        }
    }
}

Plik KlientNaming.java

// java 1.3

import java.io.*;
import org.omg.CORBA.*;
import Tlumaczenie.*;
import org.omg.CosNaming.*;

public class KlientNaming {
    public static void main(String args[]) {
        try {
            // utworzenie i inicjowanie ORB'a
            ORB orb = ORB.init(args, null);

            // Usługi nazw
            org.omg.CORBA.Object objRef = 
                orb.resolve_initial_references("NameService");
            NamingContext ncRef = NamingContextHelper.narrow(objRef);

            // Znalezienie obiektu po nazwie
            NameComponent nc = new NameComponent("tlumacz", "");
            NameComponent path[] = {nc};

            // zawężenie do obiektu Slowiczek
            Slowniczek slownik = SlowniczekHelper.narrow(ncRef.resolve(path));

            // wykorzystanie słownika
            System.out.println(slownik.angpol("red"));
            System.out.println(slownik.angpol("green"));
            System.out.println(slownik.polang("niebieski"));
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}



Kompilacja i ururchomienie aplikacji

Kompilacja przebiega tak samo jak w poprzednim przykładzie. Nieco inaczej wygląda uruchomienie, gdyż będziemy korzystać z serwera nazw tnameserv. W tym wypadku konieczne jest ustalenie wspólnego portu, przez który będą się komunikowały poszczególne elementy całego programu.

tnameserv -ORBInitialPort 1050 
java TlumSerwer2 -ORBInitialPort 1050 
java TlumKlient2 -ORBInitialPort 1050

Wykorzystanie POA (W Java 1.4)

Implementacja serwera TlumaczImplpoa.java

// implementacja deklaracji slownik.idl

import java.util.*;
import Tlumaczenie.*;

public class TlumaczImplpoa extends Tlumaczenie.SlowniczekPOA {

    private Vector _pol;
    private Vector _ang;

    public TlumaczImplpoa() {
        super();
        _pol = new Vector();
        _ang = new Vector();
    }

    // implementacja interfejsu
    public void wstaw(String pol, String ang)  {
        _pol.add(pol);
        _ang.add(ang);
    }

    public String angpol(String ang) throws Nieznane {
        int idx = _ang.indexOf(ang);
        if (idx == -1) { throw new Nieznane(); }
        else return ((String)_pol.get(idx));
    }

    public String polang(String pol) throws Nieznane {
        int idx = _pol.indexOf(pol);
        if (idx == -1) { throw new Nieznane(); }
        else return ((String)_ang.get(idx));
    }

    public int rozmiar() {
        return _ang.size();
    }
}

Implementacja serwera SerwerPOA.java

// java 1.4

import java.io.*;
import Tlumaczenie.*;

import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

// Rejestracja implementacji obiektu.

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

      try {
            // Uruchamianie ORB'a
            ORB orb = ORB.init(args,null);

            // Pobranie korzenia POA & i aktywowanie POAManager
            POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
            rootpoa.the_POAManager().activate();

            // Utworzenie obiektu tlumaczacego.
            TlumaczImplpoa tlumacz = new TlumaczImplpoa();

            // Utworzenie referencji dla obiektu 
            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(tlumacz);
            Slowniczek href = SlowniczekHelper.narrow(ref);

            // Przestrzen nazw
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

            // Znalezenie obiektu po nazwie
            String name = "tlumacz";
            NameComponent path[] = ncRef.to_name( name );
            ncRef.rebind(path, href);

            
            tlumacz.wstaw("czerwony", "red");
            tlumacz.wstaw("zielony", "green");

            // Identyfikator obiektu
            System.out.println(orb.object_to_string(ref) );

            // oczekiwanie na wywołania metod
            orb.run();

        } catch (Exception  e) {
            System.err.println("Błąd serwera: " + e);
            e.printStackTrace(System.out);
        }
    }
}

Klient KlientPOA.java

// java 1.4

import Tlumaczenie.*;
import java.io.*;
import org.omg.CORBA.*;
import org.omg.CosNaming.*;

public class KlientPOA {
    public static void main(String args[]) {
        try {
            // utworzenie i inicjowanie ORB'a
            ORB orb = ORB.init(args, null);

            // Usługi nazw
            org.omg.CORBA.Object objRef = 
                orb.resolve_initial_references("NameService");
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

            // zawężenie do obiektu Slowiczek
            Slowniczek slownik = SlowniczekHelper.narrow(ncRef.resolve_str("Tlumacz"));

            // wykorzystanie słownika
            System.out.println(slownik.angpol("red"));
            System.out.println(slownik.angpol("green"));
            System.out.println(slownik.polang("niebieski"));
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

Kompilacja i uruchomienie

Aplikację uruchamiamy wydając następujące dwa polecenia:


idlj -v -fall slownik.idl
javac Tlumaczenie\*.java *.java
Następnie uruchamiamy serwer ORB:
orbd -ORBInitialPort 1050
Można już uruchomić serwer
java SerwerPOA -ORBInitialPort 1050 -ORBInitialHost localhost
i program klienta
java KlientPOA -ORBInitialPort 1050 -ORBInitialHost localhost

Przykład z POA nadesłał p.Robert Andrzejuk