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