CORBA offre due interfacce di programmazione dal lato cliente:
I due meccanismi si differenziano per i diversi livelli di semplicità e flessibilità.
La semplicità del meccanismo statico SII deriva dalla disponibilità della classe stub rappresentativa del servizio, generata tramite compilazione dell’IDL.
La flessibilità del meccanismo dinamico è legata alla possibilità di realizzare le richieste remote anche in mancanza della classe stub. La richiesta può essere generata anche in mancanza di informazioni sull’interfaccia del servizio (introspezione).
Per entrambi i meccanismi, il tramite di un’invocazione remota è un oggetto richiesta (Request), istanza della classe di libreria org.omg.CORBA.Request
La Request è affidata al trasporto dell’ORB Core.
Il meccanismo SII si basa sul pattern Proxy, caratterizzato dalla separazione tra l’interfaccia del servizio e le diverse implementazioni.
La specifica del servizio è realizzata attraverso la definizione di una interfaccia, che ne definisce le proprietà e le operazioni.
Il modello fa corrispondere all’interfaccia due implementazioni:
L’implementazione lato client dell’interfaccia è la classe stub.
Le istanze sono note in letteratura con il termini di “oggetti proxy”.
In realtà l’interazione è più complessa, e vede la presenza di ulteriori entità intermediarie nella comunicazione cliente-servente:
Dal punto di vista del client, le entità visibili sono il proxy e, al più, il broker.
Il broker realizza la comunicazione tra proxy e servizio reale.
Per il programmatore la struttura interna del proxy è irrilevante.
Si basa:
Si articola in quattro passi:
1. Inizializzazione della piattaforma
Metodo statico init() dell’ORB.
Restituisce un riferimento all’ORB, istanza della classe org.omg.CORBA.ORB.
Con l’inizializzazione:
2. Acquisizione del riferimento IOR all’oggetto remoto
Creazione di un oggetto org.omg.CORBA.Object. Vari modi:
3. Creazione del proxy
Si utilizza la Helper Class generata dalla compilazione IDL.
La classe Helper serve a creare un proxy per un oggetto remoto a partire dal suo riferimento (operazione detta narrowing).
4. Uso dell’oggetto remoto
Invocazione di un metodo dell’oggetto remoto come se esso fosse locale, grazie al proxy.
Prevedere la gestione delle eccezioni di sistema.
L’invocazione di un metodo può comportare il sollevarsi di una eccezione di sistema, di tipo org.omg.CORBA.SystemException.
Le gestione di tali eccezioni non è obbligatoria in quanto non specificata nell’interfaccia del proxy, ma è opportuna per un corretto uso degli oggetti remoti.
Primo esempio- definizione IDL
Operazione IDL senza parametri formali e senza valori di ritorno
IDL
interface ServizioA{
void operazione();
};
Classi ed interfacce generate dal compilatore a supporto della programmazione dei clienti;
Secondo esempio- definizione IDL
Operazione IDL con parametro formale di tipo semplice scambiato in modalità input-output
IDL
interface ServizioB{
;
void operazione(inout string s);
}
Classi necessarie alla programmazione:
Terzo esempio – definizione IDL
Operazione con parametro formale strutturato scambiato in modalità inout
IDL
interface ServizioC{
struct StrutturaEsempio{
string campo1;
float campo2;
} ;
void operazione(inout StrutturaEsempio st);
};
Terzo esempio – classi ed interfacce generate
ServizioCHelper
StrutturaEsempio
StrutturaEsempioHelper
StrutturaEsempioHolder
Quarto esempio – definizione IDL
Operazione che restituisce una struct d’utente
IDL
interface ServizioD{
struct StrutturaEsempio{
string campo1;
float campo2;
} ;
StrutturaEsempio operazione();
};
Quinto esempio – definizione IDL
Operazione con eccezione definita dall’utente
IDL
interface ServizioE {
exception EccezioneEsempio{
string motivoEccezione;
};
void operazione() raises(EccezioneEsempio);
};
Il programmatore non utilizza esplicitamente la classe EccezioneEsempioHelper; essa è utilizzata nel proxy per costruire l'eccezione restituita dall'oggetto servente.
Sesto esempio – definizione IDL
Operazione con valore di ritorno di tipo valuetype
IDL
module modulo{
valuetype OggettoPassatoPerValore {
string metodo();
public string attributo; };
interface ServizioF {
OggettoPassatoPerValore
operazione(); };
};
Settimo esempio – definizione IDL
Operazione con valore di ritorno di tipo any
IDL
interface ServizioG {
any operazione();
}
;
2. La modellazione a oggetti e il linguaggio UML (richiami)
3. Generalità su Java e la programmazione ad oggetti
6. Regole di traduzione da UML a Java/C++
7. Programmazione multi-thread
8. Sincronizzazione tra thread
9. Programmazione client-server con socket TCP/IP (Java networkin...
10. Programmazione di applicazioni client-server: il Pattern Proxy...
12. Design Patterns
13. Pattern architetturali - Esempi
14. Design pattern creazionali. Esempi
15. Design pattern strutturali. Esempi
16. Introduzione alle tecnologie middleware
17. Modelli di middleware: RPC, MOM, TP, TS