Ingegneria del software I Seminario1:CORBA Ingegneria del Software I Università La Sapienza 1 Introduzione • CORBA (Common Object Request Broker Architecture) • Definita da OMG (Object Management Group) • Incapsulamento per la comunicazione tra applicazioni diverse Ingegneria del Software I Università La Sapienza 2 Architettura Ingegneria del Software I Università La Sapienza 3 Elementi • IDL • ORB – 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, … Ingegneria del Software I Università La Sapienza 4 Interface Definition Language • Definisce operazioni utilizzabili su un oggetto. • Ha proprio sistema di tipi • Compilato verso linguaggi principali Ingegneria del Software I Università La Sapienza 5 Esempio • Interfaccia oggetto conto corrente bancario Interface Conto { attribute string numeroConto; void deposito(int long ammontare); void prelievo(int long ammontare); long saldo(); }; Ingegneria del Software I Università La Sapienza 6 Tipi Primitivi in IDL • Interi • Float • Booleani • Caratteri • Stringhe • Object Reference • Any Ingegneria del Software I Università La Sapienza 7 Tipi Costruiti in IDL • Struct • Union • Array, Sequences (con lunghezze fisse o variabili) • Enum Ingegneria del Software I Università La Sapienza 8 Compilazione IDL • Compilatore riceve descrizione IDL e genera interfacce nel linguaggio di implementazione • Specifiche Language Mapping (IDLLinguaggio impl.) • Genera: – Stub (lato client) – Skeleton (lato server) Ingegneria del Software I Università La Sapienza 9 Stub • Stub – Interfaccia del client per richiedere servizi 1. Client invoca localmente lo Stub 2. Lo Stub impacchetta (marshalling) i dati di invocazione del messaggio 3. Il messaggio viene consegnato all’ORB 4. L’ORB lo invia al server Ingegneria del Software I Università La Sapienza 10 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 Ingegneria del Software I Università La Sapienza 11 Comunicazione locale Ingegneria del Software I Università La Sapienza 12 Object Adapter • Si occupa di attivare gli oggetti 1. Il client mediante stub invoca metodo dell’ORB 2. ORB notifica invocazione all’OA che attiva implementazione 3. Implementazione si registra e si dichiara pronta 4. OA passa invocazione allo skeleton che spacchetta i parametri e li fornisce all’Implementazione 5. Implementazione esegue metodo, restituisce parametri al client mediante skeleton che gestisce anche eccezioni Ingegneria del Software I Università La Sapienza 13 Portable Object Adapter • Gestisce le risorse lato server • Stabilisce politiche di memorizzazione e attivazione degli oggetti • Gestisce persistenza Ingegneria del Software I Università La Sapienza 14 Interazione Ingegneria del Software I Università La Sapienza 15 Esempio interazione client-server 1. 2. 3. 4. 5. 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 Ingegneria del Software I Università La Sapienza 16 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 Ingegneria del Software I Università La Sapienza 17 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; } } Ingegneria del Software I Università La Sapienza 18 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.n arrow(orb.resolve_initial_refe rences("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(); } } Ingegneria del Software I Università La Sapienza 19 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,nu ll); // 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_o bject(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(); } } Ingegneria del Software I Università La Sapienza 20 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 Ingegneria del Software I Università La Sapienza 21 Dynamic Invocation Interface • Codice interpretato per invocare operazioni su nuovi oggetti. • Unica interfaccia per tutte le operazioni su tutte le istanze. • Permette query asincrone. Ingegneria del Software I Università La Sapienza 22 Struttura dell'ORB Ingegneria del Software I Università La Sapienza 23 ORB interface • Permette accesso ai servizi CORBA • Accesso all'Interface Repository • Costruzione di DII • Operazioni su Object Reference • Operazioni su politiche • Costruzione di valuetype Ingegneria del Software I Università La Sapienza 24 Esempi di servizi • Naming 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 Ingegneria del Software I Università La Sapienza 25 Comunicazione remota Ingegneria del Software I Università La Sapienza 26 IIOP • GIOP: astratto rispetto al livello di trasporto • IIOP: mapping di GIOP su TCP/IP – Specifica informazioni di indirizzamento dell’oggetto Ingegneria del Software I Università La Sapienza 27 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::TaggedCompon ent> components; }; }; Ingegneria del Software I Università La Sapienza 28