RMI: metodi equals e hashcode



Похожие документы
Mobilità di Codice. Massimo Merro Programmazione di Rete 128 / 144

Programmazione distribuita

Socket & RMI Ingegneria del Software - San Pietro

Esercitazione di Sistemi Distribuiti: Java RMI

UnicastRemoteObject. Massimo Merro Programmazione di Rete 103 / 124

Java Remote Method Invocation

Organizzazione della lezione. Lezione 18 Remote Method Invocation - 6. (con callback) L accesso al registry per il rebind()

RMI. Java RMI RMI. G. Prencipe

Registri RMI. Massimo Merro Univ. Verona Programmazione di Rete 90 / 247

Programmazione di sistemi distribuiti

Contesto e motivazioni Architettura e concetti di base Componenti di RMI RMIRegistry Interfacce, eccezioni e classi Lo sviluppo di una applicazione L

Activation In sintesi: è inutile avere attivi degli oggetti se non vengono utilizzati

7 Esercitazione (svolta): Callback. Polling. Java RMI: callback. Server. Server. Client. Client. due possibilità:

RMI Remote Method Invocation

Remote Method Invocation (RMI)

Java: Compilatore e Interprete

GESTIONE DEI PROCESSI

Telematica II 17. Esercitazione/Laboratorio 6

Programmazione a Oggetti Lezione 10. Ereditarieta

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Servers Activatable. Massimo Merro Programmazione di Rete 166 / 193

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Java Security Model e RMI

Oggetti Lezione 3. aspetti generali e definizione di classi I

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Nelle reti di calcolatori, le porte (traduzione impropria del termine. port inglese, che in realtà significa porto) sono lo strumento

Cenni di programmazione distribuita in C++ Mauro Piccolo

RMI e Firewall. Una soluzione è offerta dal transport layer di RMI stesso

Parte II: Reti di calcolatori Lezione 10

Introduzione a Java Remote Method Invocation (RMI)

13. Chain of Responsibility

Lezione n.10 LPR- Informatica Applicata RMI CallBacks

Appunti di Informatica 1

Progettazione : Design Pattern Creazionali

Java Virtual Machine

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

Organizzazione della lezione. 15. Java Remote Method Invocation (3) Lo schema del Factory Design Pattern - 1. Factory design pattern

Main System Monitor Keyboard

Tutorial per l installazione del J2SE 6 e configurazione del sistema operativo

2.5. L'indirizzo IP identifica il computer di origine, il numero di porta invece identifica il processo di origine.

Test di unità con JUnit4

Approccio stratificato

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Programmazione II. Lezione 4. Daniele Sgandurra 30/09/2011.

appunti delle lezioni Architetture client/server: applicazioni server

NOTE OPERATIVE. Prodotto Inaz Download Manager. Release 1.3.0

Strumenti per la programmazione

Programmazione Orientata agli Oggetti in Linguaggio Java

Funzioni in C. Violetta Lonati

Panoramica: che cosa è necessario

Gestione delle eccezioni in Java

Il linguaggio Java. Concetti base. I packages

Collegamento remoto vending machines by do-dots

Programmazione ad Oggetti. Java Parte I

Java threads (2) Programmazione Concorrente

Capitolo 4 Pianificazione e Sviluppo di Web Part

19. LA PROGRAMMAZIONE LATO SERVER

Specifica i tipi di oggetti a creare, utilizzando un istanza prototipo, e crea nuove istanze tramite la copia di questo prototipo.

Reti di Calcolatori. Il Livello delle Applicazioni

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Il Web Server e il protocollo HTTP

La Gestione delle risorse Renato Agati

Siti web centrati sui dati (Data-centric web applications)

Reti di Telecomunicazione Lezione 6

Protezione. Protezione. Protezione. Obiettivi della protezione

Introduzione alle applicazioni di rete

Programmare in Java. Olga Scotti

JNDI. Massimo Merro Programmazione di Rete 214 / 229

Come funziona internet

Programmazione di rete in Java

Console di Amministrazione Centralizzata Guida Rapida

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Architettura MVC-2: i JavaBeans

Parola chiave extends

Multithreading in Java. Fondamenti di Sistemi Informativi

Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

Internet e posta elettronica. A cura di Massimiliano Buschi

Applicazioni web centrati sui dati (Data-centric web applications)

Scaletta. Estensioni UML per il Web. Applicazioni web - 2. Applicazioni web. WAE: Web Application Extension for UML. «Client page»

Concetto di Funzione e Procedura METODI in Java

Guida rapida alla Webconferencing

Tale attività non è descritta in questa dispensa

Registratori di Cassa

Corso basi di dati Installazione e gestione di PWS

Web Application Libro Firme Autorizzate

Comunicazione tra Processi

Транскрипт:

RMI: metodi equals e hashcode Per verificare se due oggetti remoti contengono gli stessi dati, la chiamata indirizzata al metodo equals() avrebbe bisogno di contattare i server dove si trovano gli oggetti e comparare i rispettivi contenuti La chiamata potrebbe fallire, ma equals della classe Object non è in grado di sollevare un eccezione di tipo RemoteException Di conseguenza in un interfaccia remota non è possibile definire un metodo equals Lo stesso dicasi per hashcode() 1 1

RMI: metodi equals e hashcode E necessario quindi ridefinire i metodi equals e hashcode della classe RemoteObject, che è superclasse di tutti gli oggetti remoti e stub I metodi di RemoteObject non esaminano il contenuto degli oggeti ma solo il riferimento all oggetto server. Se si ridefiniscono i metodi nell implementazione dell oggetto remoto, saranno utilizzabili solo localmente sul server ma non avranno effetto sugli stub, poiché essi sono generati automaticamente (continuano ad usare equals di Object) 2 2

Struttura gerarchica delle classi ed interfacce RMI Object Serializable RemoteObject Remote RemoteStub RemoteServer UnicastRemoteObject 3 3

RMI: clone clone non può sollevare RemoteException (come equals e hashcode) No ha senso creare un clone di uno stub: per avere un altro riferimento all oggetto remoto basta duplicare il suo riferimento Possiamo definire un metodo remoteclone per l implementazione dell oggetto remoto: interface SomeInterface extends java.rmi.remote { public Object remoteclone() throws RemoteException, clonenotsupportedexception; [ ] class SomeInterfaceImpl extends UnicastRemoteObject implements SomeInterface { public Object remoteclone() throws RemoteException, clonenotsupportedexception { return clone(); 4 4

RMI: parametri remoti inappropriati Consideriamo un metodo remoto con la seguente interfaccia void paint(graphics g) throws RemoteException Considerazioni: Graphics (o meglio, le sue sottoclassi) interagiscono con il codice grafico nativo, memorizzando puntatori a blocchi di memoria, che servono a questi metodi. Tali puntatori vengono memorizzati come valori interi nell oggetto Graphics. Questi valori sul server non sarebbero validi Graphics non è Serializabile, quindi non può essere inviata via RMI 5 5

1. Dynamic class downloading in RMI Una delle capacità più significative della piattaforma Java è quella di permettere il caricamento a run-time delle classi da un URL (Uniform Resource Locator) a una JVM in esecuzione su un processo separato e di solito su un differente sistema fisico Il risultato di tutto questo è che un applicazione può eseguire un programma (ad esempio un applet) che era inesistente su disco fino a quel momento 6 6

2. Dynamic class downloading in RMI Per esempio, una JVM in esecuzione all interno di un Web Browser può scaricare il bytecode per le sottoclassi e per tutte le altre classi necessarie a quell applet Il sistema sul quale è in esecuzione il browser è probabile che non abbia mai eseguito quest applet prima, e che non l abbia mai installata neanche su disco Una volta che tutte le classi necessarie sono state scaricate dal server, il browser può iniziare l esecuzione dell applet usando le risorse locali del sistema sul quale il client browser è in esecuzione. Figure 1: Downloading applets 7 7

3. Dynamic class downloading in RMI Java RMI trae vantaggio dalla capacità di scaricare ed eseguire classi su sistemi dove queste classi non sono mai state installate su disco Usando le API RMI alcune JVM, non solo quelle nei browser, possono scaricare classi java, incluse le classi stub RMI, le quali permettono l esecuzione di chiamata di metodi su server remoti. Potrebbe essere necessario scaricare anche sottoclassi di classi di cui sono già disponibili gli stub 8 8

4. Dynamic class downloading in RMI Quando un programma java usa un Class Loader, il class loader necessita di sapere la locazione (o locazioni) dalla quale caricare le classi necessarie al programma stesso. Di solito, un class loader è usato insieme ad un server HTTP che mette a disposizioni le classi Un codebase puo essere definito per indicare la fonte, o il luogo, da cui caricare le classi per una Java Virtual Machine Si può associare il CLASSPATH come un "local codebase", perchè rappresenta la lista dei luoghi su disco da cui si possono caricare le classi. La variabile CLASSPATH viene consultata ogni volta che si caricano classi da disco. 9 9

Come viene usato codebase in RMI Il valore della propietà java.rmi.server.codebase rappresenta una o più locazioni URL dalle quali gli stubs (e altre classi necessarie agli stubs) possono essere caricati. Così come le applets, le classi necessarie per eseguire chiamate a metodi remoti possono essere caricate da URLs "file:///", ma come le applets, un URLs "file:///" generalmente richiede che il client e il server siano fisicamente sullo stesso host. Generalmente, le classi necessarie per eseguire chiamate a metodi remoti dovrebbero rese accessibili attraverso risorse di rete, come un server HTTP o FTP. 10 10

Come viene usato codebase in RMI Prima di far partire il server, è necessario che l RMI registry sia in esecuzione (attraverso il comando rmiregistry) Dobbiamo assicurarci che la shell nella quale verrà eseguito rmirgistry non abbia la variabile ambiente CLASSPATH settata o una variabile CLASSPATH settata che non include il path delle classi stubs dell oggetto remoto che vuoi rendere disponibili ai client. Se si esegue rmiregistry ed esso può cercare le classi stub nel CLASSPATH (o nella directory corrente), esso non ricorderà che le classi stub possono essere caricate dal codebase del server, specificato attraverso la proprietà java.rmi.server.codebase nel momento in cui viene avviata l applicazione server 11 11

Come viene usato codebase in RMI 12 12

Come viene usato codebase in RMI 1. Il codebase dell oggetto remoto è specificato dal server dell oggetto remoto attraverso la proprietà java.rmi.server.codebase java -Djava.rmi.server.codebase=http://webserver/export/ 2. Il server RMI registra un oggetto remoto con l rmiregistry 3. Il codebase settato sulla JVM del server è annotato al riferimento dell oggetto remoto nell RMI registry 13 13

Come viene usato codebase in RMI 4. Il client RMI chiede un riferimento ad un determinato oggetto remoto. Il riferimento ( istanza dello stub dell oggetto remoto) è quello che il client userà per fare chiamate ai metodi dell oggetto remoto. 5. RMI registry ritorna un riferimento (istanza dello stub) alla classe richiesta 6. Se l istanza della classe stub può essere trovata localmente nel CLASSPATH, in cui viene sempre cercato prima di cercare nel codebase, il client caricherà la classe localmente 14 14

Come viene usato codebase in RMI 7. Se la classe stub non viene trovata nel CLASSPATH del client, il client tenterà di recuperare la classe stub dal codebase dell oggetto remoto 8. Il client richiede la classe stub attraverso il codebase. Il codebase che il client usa è l URL che era stato annotato all istanza dello stub quando la classe stub è stata caricata dal registry 9. La definizione della classe stub (e altre classi che sono necessarie) è caricata dal client 15 15

Come viene usato codebase in RMI 10. Ora il client ha tutte le informazioni necessarie per invocare metodi sull oggetto remoto. Ma a differenza dell applet che usa il codebase per poter eseguire codice sulla sua JVM, il client RMI usa il codebase dell oggetto remoto per eseguire codice su una JVM remota 16 16

Altri usi di codebase In aggiunta al caricamento delle classi stub e delle loro classi associate, la proprietà java.rmi.server.codebase può essere usata per specificare una locazione dalla quale delle classi, non solo stubs, possono essere caricate. Quando un client effettua una chiamata a un metodo di un oggetto remoto, si possono verificare tre casi, dipendenti dal tipo(i) dei parametri(o) del metodo(i) 17 17

Altri usi di codebase 1. Nel primo caso, tutti i parametri del metodo(i) (e il valore di ritorno) sono tipi di dato primitivi, quindi l oggetto remoto conosce come interpretare i parametri dei metodi, e non c è necessità di controllare il CLASSPATH o il codebase 2. Nel secondo caso, almeno un parametro del metodo remoto o il valore di ritorno è un oggetto per il quale però l oggetto remoto può cercare la definizione della classe localmente nel suo CLASSPATH 18 18

Altri usi di codebase 3. Nel terzo caso il metodo remoto riceve un istanza di un oggetto per il quale l oggetto remoto non può cercare la definizione della classe localmente nel suo CLASSPATH. La classe dell oggetto inviata dal client è un sottotipo del tipo di parametro dichiarato (implementazione di interfaccia o sottoclasse) Così come il codebase delle applets, il codebase del client è usato per caricare classi per altre JVMs Se la propietà codebase è settata sull applicazione client, allora quel codebase è annotato all istanza del sottotipo quando la stessa viene caricata dal client. 19 19

Esempi d uso Il valore del codebase può riferirsi a: L URL di una directory in cui le classi sono organizzate in package L URL di un file JAR Una stringa contenente istanze multiple di file JAR e/o directory secondo i criteri precedenti Nota: Quando il valore del codebase si riferisce a un URL di una directory, il valore deve terminare con un "/" 20 20

Esempi d uso Se le classi da caricare si trovano su un server HTTP chiamato ad esempio webserver, nella directory export ( sotto la web root), il codebase deve essere settato come segue: - Djava.rmi.server.codebase=http://webserver/export/ Come prima, ma in un file JAR chiamato ad esempio "mystuff.jar, nella directory public (sotto la web root), il codebase deve essere settato come segue: -Djava.rmi.server.codebase=http://webserver/public/mystuff.jar Se le classi da caricare si trovano in due file JAR "mystuff.jar" and "myotherstuff.jar e questi due file si trovano su due server separati (chiamati "webserver1" " webserver2 ), il codebase deve essere settato come segue: -Djava.rmi.server.codebase="http://webserver1/myStuff.jar http://webserver1/myotherstuff.jar" 21 21

Client-side callbacks In molte architetture, un server può avere la necessità di effettuare una chiamata ad un client Affinché questo sia possibile, un client RMI deve comportarsi anche da server RMI Client Callback: meccanismo che permette ad un client di essere notificato dal server al verificarsi dell evento per cui si è registrato e messo in attesa. Notifica del server = Invocazione di un metodo remoto del client Può non essere pratico per un client estendere la classe java.rmi.server.unicastremoteobject Un oggetto remoto può rendersi pronto per uso remoto chiamando il metodo statico: UnicastRemoteObject.exportObject(remote_objec) 22 22

Client-side callbacks Su lato server bisogna mantenere un riferimento al client su cui fare la callback 1. definire l interfaccia remota del server, come sempre, in cui però ci sia anche il metodo che il client invoca per inviare al server il riferimento su cui fare la callback 2. implementare l interfaccia remota del server 3. istanziare l implementazione dell interfaccia remota del server e pubblicarla sul registry 23 23

Client-side callbacks Su lato client bisogna fornire il metodo remoto che il server deve invocare per fare la callback: 1. definire l interfaccia remota del client, in cui viene dichiarato il metodo di callback invocato dal server 2. implementare l interfaccia remota del client, ovvero implementare il metodo di callback 3. istanziare l implementazione dell interfaccia remota del client e passarla al server che la utilizzarà per invocare il metodo remoto di callback 24 24

Client-side callbacks Il client esporta ed implementa un interfaccia remota Nell esempio seguente, il client implementerà l interfaccia Time Monitor, che è progettata per essere chiamata da un servizio che fornisce la data e il tempo corrente Il server non può chiamare il client finchè non conosce la locazione del client stesso E compito del client registrarsi con il server. Il client fa questo attraverso il metodo registertimemonitor del server, passando al server come parametro di questo metodo un riferimento a se stesso NOTA: Verrà usata una via alternativa per settare RMI registry 25 25

Client-side callbacks import java.rmi.*; import java.util.date; public interface TimeMonitor extends java.rmi.remote { public void time(date d) throws RemoteException; import java.rmi.*; public interface TimeServer extends java.rmi.remote { public void registertimemonitor(timemonitor tm) throws RemoteException; 26 26

Client-side callbacks import java.util.date; class TimeTicker extends Thread { private TimeMonitor tm; TimeTicker( TimeMonitor tm ){ this.tm = tm; public void run(){ while(true) try{ sleep( 2000 ); tm.time(new Date()); catch ( Exception e ){System.out.println(e); 27 27

Client-side callbacks import java.net.*; import java.io.*; import java.util.date; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.locateregistry; public class TimeServerImpl implements TimeServer { private static TimeServerImpl tsi; public static void main (String[] args) { try { tsi = new TimeServerImpl(); LocateRegistry.createRegistry(1099); System.out.println("Registry created"); ); UnicastRemoteObject.exportObject(tsi); Naming.rebind("TimeServer", tsi); System.out.println( "Bindings Finished" ); System.out.println( "Waiting for Client requests" [to be continued ] 28 28

Client-side callbacks catch (Exception e) { System.out.println(e); public void registertimemonitor( TimeMonitor tm ) { System.out.println( "Client requesting a connection" ); TimeTicker tt; tt = new TimeTicker( tm ); tt.start(); System.out.println( "Timer Started" ); // class TimeServerImpl 29 29

Client-side callbacks import java.util.date; import java.net.url; import java.rmi.*; import java.rmi.server.*; public class TimeClient implements TimeMonitor { private TimeServer ts; public TimeClient() { try { System.out.println( "Exporting the Client" ); UnicastRemoteObject.exportObject(this); ts = (TimeServer)Naming.lookup( "rmi://localhost:1099/timeserver"); ts.registertimemonitor(this); catch (Exception e) { System.out.println(e); [to be continued ] 30 30

Client-side callbacks public void time( Date d ) { System.out.println(d); //class TimeClient public class Main { public static void main (String[] args) { new TimeClient(); 31 31

Sicurezza Java 2 garantisce la sicurezza utilizzando delle classi (gestori della sicurezza) che controllano l ammissibilità delle operazioni svolte da un programma La possibilità di scaricare codice è controllata e regolata da un security manager che opera in accordo ad una policy Può essere necessario specificare un file di policy In un classico file di policy usato in RMI si permette al codice scaricato, ad esempio da un certo codebase, di: Connettersi o accettare connessioni di rete sulle porte il cui numero è maggiore di 1024 (es. rmiregistry 1099) Connettersi alla porta 80 (the port for HTTP) Questo è il codice di un file di policy generale (client.policy): grant { permission java.net.socketpermission "*:1024-65535", "connect,accept"; permission java.net.socketpermission "*:80", "connect"; ; 32 32

Sicurezza Il client e il server devono essere eseguiti specificando la proprietà java.security.policy per indicare il file di policy che contiene i permessi che si intendono accordare: Es. lato client: java -Djava.security.policy=client.policy Client Per settare il gestore della sicurezza di default è necessario utilizzare all interno della classe client o server: System.setSecurityManager(new RMISecurityManager()); Così facendo rendiamo visibile il nuovo file di policy: aggiorniamo lo stato dei permessi Il S.M. garantisce che le classi che vengono caricate non eseguano operazioni per le quali non siano abilitate se il S.M non è specificato non è permesso nessun caricamento di classi da parte sia del client ( stub ) che del server 33 33