UserDBServer
Per l'implementazione del server che
mantiene le informazioni sugli utenti ci si è appoggiati al
DBMS InstantDB.
Si tratta di un DBMS sviluppato da terzi
completamente in Java, che ben si adatta alle esigenze di
questo progetto. A dire la verità, vista l'esigua complessità
del database utilizzato, che di fatto si riduce ad un'unica
tabella con due campi, sarebbe stato possibile implementare
questo componente dell'architettura NetGame come una semplice
applicazione che gestisca un file di testo.
La scelta di utilizzare un database relazionale ci ha però
offerto l'opportunità di approfondire un altro aspetto della
piattaforma Java, ovvero l'API JDBC. Questa API consente infatti
a programmi scritti in Java di accedere ai database praticamente
di qualunque costruttore, grazie alla possibilità di utilizzare
il bridge JDBC-ODBC. ODBC è uno standard per comunicare con
database introdotto da Microsoft e supportato da svariati
produttori (tra cui Oracle, Infomix, Synbase). Essa consiste
in un'API generale per tutti i database. Ogni database fornisce
poi la propria implementazione del driver ODBC adatta al proprio
server DB. Essa converte le istruzioni dal linguaggio standard
SQL a quello specifico del DB in questione.
Anche Java fornisce un'API analoga a ODBC, tuttavia i driver
JDBC non comunicano direttamente con tanti server quanti quelli
a cui si connettono i driver ODBC. Per questo uno dei primi
driver JDBC realizzato fu proprio il bridge JDBC-ODBC, grazie
al quale java può accedere con semplicità a tutti i DB che
supportano ODBC.
In realtà in questo progetto non si è avuta necessità di utilizzare
tale bridge in quanto InstantDB fornisce direttamente un driver
compatibile JDBC, e quindi può essere utilizzato direttamente
questo.
La connessione ad un database utilizzando
questa API prevede innanzitutto l'inserimento della direttiva
import java.sql.*;
in quanto tutte le classi interessate
sono contenute in questo package. Sarà poi necessario caricare
il driver JDBC del database. Questo lo si fa con la seguente
istruzione :
Class.forName(nome della classe driver);
Nel caso IstantDB, la classe che implementa
il driver è : org.enhydra.instantdb.jdbc.idbDrive r.
Dopodiché la connessione si può instaurare con:
DriverManager.getConnection(Url del DB);
le url utilizzate per stabilire una
connessione con un database variano secondo il driver JDBC
in uso. La forma generale è comunque la seguente : jdbc:subprotocol:subname.
Nel caso di IstantDB la forma è :
jdbc:idb:<percorso del file di proprietà del database>
Il file di proprietà è il file (in genere
con estensione .prp) che definisce tutte le impostazioni del
database. Si rimanda alla documentazione di IstantDB per una
descrizione dettagliata delle numerose opzioni; qui basti
ricordare che è in tale file che viene definito il file (o
i files) che conterranno le tabelle costituenti il database.
Una volta creata la connessione i comandi
SQL, query e update, possono essere eseguiti attraverso la
classe statement ed i metodi executeQuery() e
executeUpdate() .
Struttura del DB e query utilizzate.
La struttura del database di NetGame
è semplicissima e consiste in un'unica tabella (Users )
composta da due campi, che rappresentano rispettivamente lo
username e la password degli utenti iscritti a NetGame. L'istruzione
SQL per creare la tabella è la seguente :
CREATE TABLE Users (userName char(20), password char(20))
La chiave primaria è evidentemente lo
userName , perché non è consentito in NetGame
che più utenti abbiano lo stesso nome.
Le query necessarie in questo progetto sono le seguenti :
Verifica se un utente è iscritto e con quale password :
SELECT * FROM Users WHERE userName = 'nome'
Aggiunta di un nuovo account :
INSERT INTO Users VALUES ('nome', 'pwd')
Rimozione di un account :
DELETE FROM Users WHERE userName = 'nome'
Metodi della classe
All'avvio (nella funzione main )
è possibile specificare un particolare file di configurazione,
altrimenti ne viene assunto uno a default (netgameUsers.prp ).
E' altresì possibile specificare host, nome e porta del server
stesso. Lo UserDbServer si dovrà poi configurare
come classe remota, e quindi effettuare tutte le operazioni
necessarie (impostazione di un security manager e binding
all'RMIRegistry ).
A questo punto può essere aperta la connessione al server.
Tale connessione sarà poi chiusa al termine dell'esecuzione.
Lo UserDBServer deve soddisfare due esigenze
:
- implementare l'interfaccia
IUserDBAccess ,
per poter essere consultata dai MainServer
- fornire i metodi per apportare le modifiche
al database, ovvero per inserire ed eliminare account di
utenti
L'interfaccia IUserDBAccess presenta un solo
metodo :
public void checkUser(String userName, String password) throws RemoteException, FailedLoginException;
questo metodo controlla se esiste l'account
userName e la password corrispondente
è esatta. Solo in caso negativo viene lanciata l'eccezione
FailedLoginException .
I metodi per modificare il database sono :
public boolean insertAccount(String userName, String password)
public boolean removeAccount(String userName)
con l'ovvio significato. Naturalmente
si controllerà rispettivamente nel primo caso che l'account
non esista già e nel secondo che esista effettivamente prima
di toglierlo. Questi metodi sono invocabili solo attraverso
l'interfaccia grafica, che ha l’aspetto seguente:
|