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.
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
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();
}
}
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);
}
}
}
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);
}
}
}
Polecenia:
idlj slownik.idl idlj -fserver slownik.idlgenerują 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 . *.javaProgramy serwera i klienta uruchamiamy podając jako parametr jakiś plik (dla klienta i serwera musi być ten sam).
java TlumaczSerwer iiop java TlumKlient iiop
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);
}
}
}
// 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 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
// 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();
}
}
// 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);
}
}
}
// 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);
}
}
}
Aplikację uruchamiamy wydając następujące dwa polecenia:
idlj -v -fall slownik.idl javac Tlumaczenie\*.java *.javaNastępnie uruchamiamy serwer ORB:
orbd -ORBInitialPort 1050Można już uruchomić serwer
java SerwerPOA -ORBInitialPort 1050 -ORBInitialHost localhosti program klienta
java KlientPOA -ORBInitialPort 1050 -ORBInitialHost localhost
Przykład z POA nadesłał p.Robert Andrzejuk