Ingegneria del software I Seminario1:CORBA
Introduzione CORBA (Common Object Request Broker Architecture) Definita da OMG (Object Management Group) Incapsulamento per la comunicazione tra applicazioni diverse
Architettura
Elementi IDL ORB GIOP (General Inter-ORB Protocol) Nasconde locazione fisica oggetti interagenti Permette: invocazione, attivazione, … Interfacce ORB: Object Adapter Dynamic Invocation Interface Repository GIOP (General Inter-ORB Protocol) Nasconde locazione fisica di oggetti in ORB diversi COS (CORBA Object Services) Naming services, Transaction services, …
Interface Definition Language Definisce operazioni utilizzabili su un oggetto. Ha proprio sistema di tipi Compilato verso linguaggi principali
Esempio Interfaccia oggetto conto corrente bancario Interface Conto { attribute string numeroConto; void deposito(int long ammontare); void prelievo(int long ammontare); long saldo(); };
Tipi Primitivi in IDL Interi Float Booleani Caratteri Stringhe Object Reference Any
(con lunghezze fisse o variabili) Tipi Costruiti in IDL Struct Union Array, Sequences (con lunghezze fisse o variabili) Enum
Compilazione IDL Compilatore riceve descrizione IDL e genera interfacce nel linguaggio di implementazione Specifiche Language Mapping (IDL-Linguaggio impl.) Genera: Stub (lato client) Skeleton (lato server)
Stub Stub Interfaccia del client per richiedere servizi Client invoca localmente lo Stub Lo Stub impacchetta (marshalling) i dati di invocazione del messaggio Il messaggio viene consegnato all’ORB L’ORB lo invia al server
Skeleton Implementazione oggetto lato server Scheletro dell’oggetto con sezioni parti da implementare Coopera con Object Adapter per attivazione dell’oggetto Riceve richiesta dall’Object Adapter, estrae i dati (unmarshalling) e li passa all’implementazione dell’oggetto
Comunicazione locale
Object Adapter Si occupa di attivare gli oggetti Il client mediante stub invoca metodo dell’ORB ORB notifica invocazione all’OA che attiva implementazione Implementazione si registra e si dichiara pronta OA passa invocazione allo skeleton che spacchetta i parametri e li fornisce all’Implementazione Implementazione esegue metodo, restituisce parametri al client mediante skeleton che gestisce anche eccezioni
Portable Object Adapter Gestisce le risorse lato server Stabilisce politiche di memorizzazione e attivazione degli oggetti Gestisce persistenza
Interazione
Esempio interazione client-server Scrittura interfaccia IDL Compilazione interfaccia Scrittura implementazione Scrittura del server Scrittura del client Classi lato Client Classi lato Server Classi di supporto _ContoStub.java ContoPOA.java ContoHelper.java Conto.java ContoPOATie.java Conto Holder.java ContoOperations.java
Classi Le classi lato client e lato server formano rispettivamente Stub e Skeleton Le classi di supporto vengono utilizzate sia dal client che dal server sono proprie del mapping idl2java in questo caso Helper: funzioni di utilità per le gestione oggetti Holder: gestione parametri in uscita, non presente in java
Implementazione oggetto Conto public class ContoImpl extends ContoPOA { private int _saldo; private String _numeroConto; public ContoImpl(String arg) _saldo = 0; _numeroConto = arg; } public void deposito(int amount) _saldo += amount; public int prelievo(int amount) _saldo -= amount; return _saldo; public int saldo() { return _saldo; } String numeroConto() return _numeroConto; void numeroConto(String arg) _numeroConto = arg;
Classe Server public class Server { public static void main( String[] args ) // Inizializzazione ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); try // Creazione riferimento al POA org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA")); // Attivazione oggetto nel POA org.omg.CORBA.Object o = poa.servant_to_reference(new ContoImpl("0393")); poa.the_POAManager.activate(); // Pubblicazione OR in un file PrintWriter ps = new PrintWriter(new FileOutputStream(new File( args[0] ))); ps.println( orb.object_to_string( o ) ); ps.close(); } catch ( Exception e ) { e.printStackTrace(); // Attivazione ORB orb.run();
Classe Client public class Client { public static void main(String args[]) try // Inizializzazione dell’ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null); // Dichiarazione della variabile per l’oggetto Conto contoBancario; // Reperimento dell’Object Reference da file BufferedReader in = new BufferedReader(new FileReader(args[0])); String IORString = in.readline(); // Creazione riferimento remoto all’oggetto contoBancario = ContoHelper.narrow(orb.string_to_object(IORString)); // Invocazione operazioni sull’oggetto contoBancario.deposito(2000); contoBancario.prelievo(200); System.out.println("Il saldo del conto" + contoBancario.numeroConto() + "è: " + contoBancario.saldo()); } catch (Exception e) { e.printStackTrace();
Dynamic Invocation Interface Nell'esempio: collegamento statico tra client e server, codice oggetto server conosciuto dal client a tempo di compilazione Per costruire collegamenti dinamici a oggetti non conosciuti a tempo di compilazione si usa DII QueryInterface
Dynamic Invocation Interface Codice interpretato per invocare operazioni su nuovi oggetti. Unica interfaccia per tutte le operazioni su tutte le istanze. Permette query asincrone.
Struttura dell'ORB
ORB interface Permette accesso ai servizi CORBA Accesso all'Interface Repository Costruzione di DII Operazioni su Object Reference Operazioni su politiche Costruzione di valuetype
Esempi di servizi Naming service Trading service Permette di mettere in relazione nomi e riferimenti ad oggetti Metodi per binding e resolve Trading service Permette di ritrovare oggetti con certe caratteristiche
Comunicazione remota
IIOP GIOP: astratto rispetto al livello di trasporto IIOP: mapping di GIOP su TCP/IP Specifica informazioni di indirizzamento dell’oggetto
IOR Object Reference remota IOR contiene indirizzo IP e numero di porta su cui è in ascolto il server Specifica IDL di uno IOR module IIOP { //PIDL struct Version { octet major; octet minor; }; struct ProfileBody_1_1 { Version iiop_version; string host; unsigned short port; sequence<octet> object_key; sequence<IOP::TaggedComponent> components;