Programmazione CORBA in Java Ing. Andrea Santoro http://www.dis.uniroma1.it/~santoroa santoro@dis.uniroma1.it (codice preparato dall ing. Alessandro Termini)
Overview Naming Service Motivazioni Name Service in ORB della Sun Esempio completo Conto bancario 2
Name Service Associa stringhe (nomi) ad object reference I client identificano i server semplicemente dal loro nome Indipendente dalla locazione del servizio Struttura a grafo = Naming Context = Oggetto = Object Reference Naming Context iniziale 3
ORB della Sun : Name Service tnameserv Parte sulla porta 900 Per cambiare porta tnameserv ORBInitialPort <porta> client e server con naming java client [-ORBInitialPort <porta>] 4
Name Service: l interfaccia NamingContextExt Lato server import org.omg.cosnaming.*; NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references( NameService )); nc.bind(nc.to_name( HelloServer ),o); Lato client import org.omg.cosnaming.*; NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references( NameService )); HelloServ helloserv = HelloServHelper.narrow( nc.resolve(nc.to_name( HelloServer ))); 5
Gestione Naming Context annidati import org.omg.cosnaming.*; org.omg.corba.object o = poa.servant_to_reference( new HelloImpl()); NamingContextExt rootctx = NamingContextExtHelper.narrow( orb.resolve_initial_references( "NameService")); NamingContextExt helloserverctx = rootctx.bind_new_context( rootctx.to_name( helloserverctx )); helloserverctx.bind( helloservctx.to_name( hello_1 ),o); rootctx helloserverctx hello_1 6
L interfaccia NamingContextExt module CosNaming interface NamingContext //... void bind(in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound); Object resolve(in Name n) raises... void bind_context(in Name n, in Object obj) raises... NamingContext bind_new_context(in Name n); NamingContext new_context(); }; }; void unbind(in name n) raises... void rebind(in Name n, Object obj) raises... void destroy(); 7
Sviluppo di applicazione CORBA: Conto Bancario Sviluppare un applicazione CORBA con la quale sia possibile gestire conti bancari; il conto è caratterizzato sicuramente da un numero di identificazione, dal titolare del conto e dal tipo di conto stesso. sul conto bancario devono poter essere eseguite le operazioni di prelievo e deposito; deve poter essere possibile visualizzare il saldo del conto e cambiare il tipo di conto; eventuali situazioni anomale (come prelievi non consentiti) devono essere esplicitamente segnalate. 8
Conto Bancario : IDL module Banca exception AmmontareInvalido }; exception PrelievoInvalido }; struct InfoConto long numeroconto; string titolareconto; string tipoconto; }; interface Conto readonly attribute InfoConto info; void cambiatipoconto(inout string tipo); void deposito(in long amount) raises(ammontareinvalido); long prelievo(in long amount) raises(ammontareinvalido,prelievoinvalido); long saldo(); }; }; 9
Conto Bancario : mapping in Java CORBA Java module Banca package Banca; exception AmmontareInvalido public final class AmmontareInvalido È una eccezione (classe che estende org.omg.corba.userexception) struct InfoConto attribute InfoConto info; readonly attribute public final class InfoConto Classe senza metodi con solo gli attributi definiti nello struct Si mappa in DUE METODI nell oggetto Conto public void info(infoconto var); public InfoConto info(); Si mappa in uno solo dei 2 metodi previsti per il mapping public InfoConto info(); 10
Conto Bancario : interfaccia Java package Banca; public interface ContoOperations Banca.InfoConto info(); void cambiatipoconto( org.omg.corba.stringholder tipo); void deposito(int amount) throws Banca.AmmontareInvalido; int prelievo(int amount) throws Banca.AmmontareInvalido, Banca.PrelievoInvalido; int saldo(); } 11
Conto Bancario : implementazione package Banca; public class ContoImpl extends ContoPOA private int _saldo; private InfoConto _infoconto; public ContoImpl(InfoConto infoconto) _saldo = 0; _infoconto = infoconto; } 12
Conto Bancario : implementazione public void deposito(int amount) throws AmmontareInvalido if (amount>=0) _saldo += amount; else throw new AmmontareInvalido("Ammontare Invalido."); } public int prelievo(int amount) throws AmmontareInvalido, PrelievoInvalido if (amount<0) throw new AmmontareInvalido("Ammontare Invalido."); _saldo -= amount; if (_saldo < 0) _saldo += amount; throw new PrelievoInvalido("Saldo insufficiente."); } return _saldo; } 13
Conto Bancario : implementazione public void cambiatipoconto(org.omg.corba.stringholder tipo) String old = _infoconto.tipoconto; _infoconto.tipoconto = tipo.value; tipo.value = old; } public int saldo() return _saldo; } public InfoConto info() return _infoconto; } 14
Conto Bancario : server ORB orb = ORB.init(args, null); POA poa = POAHelper.narrow( orb.resolve_initial_references("rootpoa")); ContoImpl conto_impl = new ContoImpl(infoConto); org.omg.corba.object o = poa.servant_to_reference(conto_impl); NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("nameservice")); nc.rebind(nc.to_name(""+infoconto.numeroconto), o); poa.the_poamanager().activate(); System.out.println("server started"); orb.run(); 15
Conto Bancario : client Gestione parametri inout/out org.omg.corba.stringholder nuovotipo = new org.omg.corba.stringholder(new String( )); contobancario.cambiatipoconto(nuovotipo); 16