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