Prova Finale - Warwide Information Center

Transcript

Prova Finale - Warwide Information Center
Università degli Studi di Genova
Facoltà di Scienze Matematiche Fisiche e Naturali
Corso di Laurea Triennale in Informatica
Anno Accademico 2008/2009
Prova finale
Realizzazione di uno strumento interattivo di
supporto agli utenti del browser game Warwide
Candidato
Simone Riboldi
Relatore
Paola Magillo
1
Indice
1 . I n t r o d u z i o ne...................................................................................................................................3
1. 1. L a soc i età.......................................................................................................................3
1. 2. I l g i o c o...........................................................................................................................3
1 .2. 1. S c o p o d e l g i o c o..............................................................................................4
1 .2.2. G est i o n e d e l l e c i ttà.........................................................................................4
1 .2.3. L e r i cer c h e sc ie nt i f i c h e..................................................................................6
1 .2.4. I l m o n d o d i g i o c o...........................................................................................7
2. S v o l g i m e n t o d e l l a p r o v a f i n a l e.................................................................................................... 10
3. M a n u a l e u te n te.............................................................................................................................1 0
3. 1. B e n v e n u t i a W W I C ...................................................................................................... 10
3.2. C o m e i n i z i a re...............................................................................................................1 1
3.3. F u n z i o n a l i tà d e l p r o g ra m m a........................................................................................1 1
3.3. 1. R a p p o r t o d e l l a sit ua z i o n e att ua l e d e l p r o p r i o ac c o u n t................................. 12
3.3.2. G e n e ra z i o ne d i u n f i l e X L S c o n i l res o c o n t o d e l l e p r o p r i e ar m a te e c i ttà... 1 3
3.3.3. N a v i g a z i o n e d e i m e ssa g g i p r i v at i................................................................ 13
3.3.4. A v v i s o i n cas o d i attac c o.............................................................................. 1 4
4. M a n u a l e m a n u te nt o re d e l c o d i ce................................................................................................. 14
4. 1. Pa c k a ge D a tat y p e......................................................................................................... 14
4.2. Pa c k a ge E x e c u t or......................................................................................................... 16
4.3. Pa c k a ge I n te r f a c ce....................................................................................................... 18
5. C o n c l us i o n i e s v i l u p p i f u t u r i........................................................................................................22
2
1. Introduzione
Lo scopo della prova finale è quello di realizzare uno strumento per
aiutare gli utenti del gioco “Warwide” a gestire il proprio account senza
la necessità di restare costantemente connessi in rete al gioco.
1.1. La società.
La società che ha prodotto il gioco è la Involutive s.n.c. (Figura 1) I
cui responsabili sono studenti del DISI (Ardoino Paolo, Festa Carmelo,
Andrea Fui).
Figura 1: il sito della Involutive.
La Involutive si occupa principalmente della realizzazione di siti web,
tra cui quello della facoltà di scienze dell'università degli studi di
Genova. Due anni fa ha iniziato la realizzazione di questo progetto,
continuando ad effettuare aggiornamenti e a raccogliere un sempre più
vasto numero di utenti (il mondo due è stato aperto il 12 giugno 2008 e
conta più di 1500 utenti attivi).
1.2. Il gioco.
Warwide è un browser game, il che significa che per giocare non serve
installare niente ma è sufficiente un comune browser internet (nella
Figura 2 vediamo la schermata iniziale del gioco). E' multigiocatore ed
in tempo reale, il che significa che ci si scontra con altri utenti umani
e che anche quando non si è online il resto del mondo di gioco va avanti,
potrà quindi capitare di subire attacchi quando non si è connessi ed è
proprio per questo che è stato sviluppato questo tool. Il gioco è
ambientato nel mondo reale, ci si muove su una mappa di gioco che è copia
di quello reale (si possono anche usare le mappe di Google Maps) e le
3
città controllate dagli utenti sono realmente esistenti e la loro
posizione è fedelmente riportata sulla mappa di gioco.
Figura 2: la schermata iniziale di login al gioco.
1.2.1 Scopo del gioco.
L'utente inizia con il controllo di una città a sua scelta fra quelle
disponibili e ha come obiettivo l'estensione territoriale tramite la
conquista di altre città (sia del server, ovvero libere, che di altri
utenti). Per conquistare e mantenere altre città si creano armate
(terrestri e navali, ma presto saranno disponibili anche quelle aeree)
composte da vari tipi di unità che variano dal soldato semplice al carro
armato pesante e dal motoscafo alla corazzata. Per produrre armate è
necessario sviluppare determinate strutture all'interno delle città.
1.2.2. Gestione delle città.
Le strutture base di ogni città sono quelle per produrre le tre risorse,
ovvero:
● Mercato, che produce oro
● Pozzo petrolifero, che produce petrolio
● Miniera di metallo, che produce metallo
Oltre a queste troviamo due tipi di centrale energetica (normale, che
consuma petrolio e nucleare che consuma metallo) per produrre il quarto
tipo di risorsa, l'energia, necessaria a far funzionare tutte le altre
strutture. Nel caso l'energia iniziasse a scarseggiare le strutture
produttive abbassano automaticamente sia i loro consumi energetici che la
loro produzione oraria al fine di risparmiare energia.
La quinta risorsa è quella umana, le persone vengono “prodotte”
attraverso la struttura abitazioni, e vengono impiegate in minima parte
nelle altre strutture e in larga parte per la produzione di soldati.
Nelle figure 3 e 4 troviamo la schermata del ministro dello sviluppo dove
possiamo analizzare e gestire la produttività cittadina.
4
Figura 3: Ministero dello sviluppo.
Figura 4: Ministero dello sviluppo, continuazione.
A difesa delle città (sopratutto dagli attacchi di armate navali) è
5
possibile costruire delle torrette lanciamissili.
Per produrre unità militari servono tre strutture:
● Accademia militare, per produrre fanteria
● Industria bellica, per produrre i mezzi (jeep, camion, carri
armati,...)
● Porto, per produrre i mezzi navali (solo le città costiere ne
possono avere uno)
Nella figura 5 possiamo vedere la schermata del ministro degli armamenti
attraverso cui possiamo reclutare e gestire le armate.
Figura 5: Ministero degli armamenti.
Non sarà possibile sviluppare subito tutte le unità militari, per alcune
sarà necessario aver sviluppato la ricerca scientifica giusta. Per
sbloccare e sviluppare nuove tecnologie sarà pertanto necessaria la
struttura Laboratorio scientifico.
1.2.3 Le ricerche scientifiche.
Le ricerche scientifiche servono sia a sbloccare le unità militari, sia a
potenziarle, sia ad ottenere altri tipi di benefici.
Le ricerche che danno bonus generici sono:
● Tattiche di guerra, che aumenta il numero di armate gestibili
● Energia, che aumenta l'energia prodotta, oltre a rendere
disponibile la centrale nucleare
● Spionaggio che permette di carpire informazioni sulle città nemiche
● Politica, che permette di gestire un maggior numero di città
● Edilizia, che permette di aumentare la velocità di costruzione
delle strutture
Le seguenti ricerche danno invece bonus alle armate:
● Motori, che rende più veloci le armate motorizzate, oltre a
sbloccarne la produzione
● Radar, che aumenta il raggio di visuale delle proprie armate
6
Protezioni, che aumenta il valore di difesa della fanteria
Blindatura, che aumenta il valore di difesa dei mezzi motorizzati
Balistica leggera, che aumenta il valore di attacco della fanteria
Balistica pesante, che aumenta il valore di attacco dei mezzi
motorizzati
Nella figura 6 vediamo la schermata del centro di ricerca attraverso cui
possiamo lanciare nuove ricerche scientifiche.
●
●
●
●
Figura 6: Centro di ricerca.
1.2.4. Il mondo di gioco.
Warwide si avvale di una mappa del mondo reale che fa da sfondo ai
continui scontri per la conquista del territorio. Le città sono quelle
realmente esistenti, così come la loro posizione (anche se non sono
presenti tutte le città del mondo), e buona parte del mondo è già stata
aperta (ovvero vi sono state collocate le città, ed è pertanto possibile
sia iscriversi lì che conquistarle). Attualmente è aperta l'Europa, il
nord Africa e il sud-est asiatico (Giappone, Nord Corea, Sud Corea,
Taiwan, Vietnam, Cambogia, Laos e Thailandia).
Le armate si muovono a velocità verosimili (per aumentare la giocabilità
sono state aumentate, capiterà quindi di vedere carri armati andare a 100
km/h) e i loro spostamenti sono visibili sulla mappa. E' inoltre
possibile assegnare dei waypoint e far compiere alle armate percorsi
complessi aggirando ostacoli (ovviamente un'armata di terra non potrà
muoversi sull'acqua e quindi in alcune zone del mondo si assistono a vere
e proprie gimcane) o evitando di entrare in terriori ostili.
Il gioco permette anche di formare un'alleanza e di vedere le armate dei
propri alleati così come le loro città con un colore diverso da quelle
ostili (per la precisione, hanno una bandiera verde quelle neutrali o
“del server”, rossa quelle nemiche, gialla gli alleati e blu le proprie).
Nella figura 7 possiamo vedere la schermata della mappa strategica con il
7
layer terreno standard.
Figura 7: Mappa strategica.
Al gioco sono collegati anche un blog (il Warherald, che ha
l'impostazione di un vero e proprio giornale) e un forum ove vi sono sia
sezioni per la diplomazia , attraverso le quali le alleanze possono
avviare trattati di pace o iniziare guerre, sia sezioni per i
suggerimenti e per segnalare eventuali bug, per organizzare quest (ovvero
“cacce al tesoro”), sia per parlare di tutto quello che non è inerente al
gioco.
Nelle figure 8 e 9 possiamo vedere rispettivamente il forum del gioco e
il War Herald, il blog-giornale con le notizie più importanti riguardo
alle guerre nel gioco.
8
Figura 7: Forum.
Figura 8: War Herald.
9
2. Svolgimento della prova finale.
Prima dello sviluppo di questo tool era stato realizzato dagli stessi
sviluppatori del gioco un plugin per il browser Mozilla Firefox che
avvisava gli utenti in caso di attacco, ma pesava troppo sul server di
gioco pertanto si è deciso di rimuoverlo e di far sviluppare a terze
parti un tool da scaricare in locale e che interagisse col server solo
tramite file XML generati automaticamente per ogni giocatore in modo da
alleggerire il carico sul server di gioco.La prova finale è stata svolta
in collaborazione con uno degli sviluppatori nonché project menager di
Warwide, Paolo Ardoino, il quale ha realizzato un file xml associato ad
ogni giocatore con la situazione attuale dell'account dello stesso.
Nel file è presente la situazione attuale delle armate e delle città
oltre ai messaggi privati ricevuti. In particolare per ogni armata viene
indicato in che stato è (battaglia, movimento o quiete) quante risorse
trasporta, quali armate ha nel suo radar (indicando nome alleanza e
distanza) e di quali unità è composta (ovvero la coppia nome dell'unità e
quantità).
Durante lo sviluppo mi è stato fornito uno stub di file XML su cui
iniziare a lavorare in locale, contenente le stesse informazioni e
presentando lo stesso formato di quello che poi è stato realizzato in
remoto.
Questo ha dato modo a me di iniziare subito a lavorare sul parsing
dell'XML e ha consentito ai developer di Warwide di ritardare la
creazione della funzione per generare i file XML associati ad ogni
account fino a che non si è reso necessario testare e lavorare in remoto
(ovvero richiedere il file XML via internet).
Prima di iniziare a sviluppare il programma è stata svolta un'attività di
raccolta dei requisiti, sia dialogando con il customer (ovvero con Paolo
Ardoino, sviluppatore di Warwide) che con gli user (i giocatori di
Warwide) al fine di identificare tutti i requisiti funzionali e non
funzionali necessari allo sviluppo del progetto.
Tra i requisiti non funzionali troviamo la portabilità del progetto, per
ora garantita in ambito windows e linux ma negli sviluppi futuri sarà
ampliata anche ai cellulari dotati di supporto Java.
Tra i requisiti funzionali troviamo invece le funzionalità elencate nel
manuale utente (Sezione 3).
E' stata svolta anche un'attività di feedback dando il programma in una
prima release provvisoria ad alcuni giocatori che avevano assunto un
ruolo di tester e grazie ai loro feedback sono stati apportati
miglioramenti (modifiche di bug sopratutto) e aggiunte ritenute
interessanti come ad esempio la funzionalità per generare i file XLS per
Excel.
3. Manuale dell'Utente
3.1. Benvenuti a WWIC
WWIC è uno strumento multipiattaforma per la gestione del proprio account
su Warwide e l'acronimo WWIC sta appunto per WarWide Information Center
ovvero centro informazioni di Warwide. WWIC permette di gestire il
proprio account senza essere costantemente loggati al gioco. In caso di
attacco da parte di un nemico, si verrà avvisati da un segnale acustico e
da un popup nella barra della applicazioni, oltre che da un'e-mail nel
caso si abbia richiesto questo servizio.
10
3.2. Come iniziare
Unzippate il file WWIC.zip nella cartella che volete e lanciate il file
WWIC.jar, apparirà l'icona di un carro armato nella vostra traybar (o
barra delle applicazioni, ovvero quella che contiene l'orologio e il
controllo del volume). Gli utenti Windows possono semplicemente farci
doppio click col pulsante sinistro del mouse per avere accesso
all'interfaccia principale, mentre per gli utenti Linux sarà sufficiente
clickare col pulsante destro del mouse e dal menù che apparirà
selezionare “Riepilogo informazioni” per far apparire la finestra
AccedereRapportoCittàArmate (ARCA da ora in poi). Al primo avvio vanno
impostati i dati di connessione prima di poter aggiornare i dati, e
nell'interfaccia principale visualizzeremo pertanto solo una lista e due
tabelle vuote. Per impostare i dati di connessione è sufficiente dal menù
in alto a sinistra selezionare “Impostazioni” e poi “Modifica Dati
Connessione”. Apparirà quindi l'interfaccia “Modifica Preferenze” nella
quale dovrete inserire username e password che usate per loggarvi al
gioco, proxy e porta nel caso vi colleghiate da una rete aziendale o
universitaria (o da una qualunque rete che utilizzi un proxy), impostare
l'indirizzo e-mail al quale volete ricevere gli aggiornamenti e il server
SMTP del vostro provider internet (nel caso non sia nell'elenco potrete
selezionare altro e impostarlo a mano). Consigliamo di Clickare sul
pulsante “Invia E-mail di test” per verificare di aver inserito
correttamente i dati, così facendo il sistema proverà a inviarvi un'email
sfruttando i parametri da voi forniti e verificando pertanto se sono
corretti o no. Per impostare ogni quanto volete ricevere gli
aggiornamenti da internet (ricordate che le e-mail vengono inviate ogni 5
aggiornamenti, pertanto non conviene impostare valori molto bassi se non
si vogliono ricevere molte e-mail) basterà muovere lo slider tenendo
presente che il minimo è di 60 secondi, ovvero un minuto. Impostati tutti
i dati non resta che premere il bottone “Salva Dati” per rendere
effettive le modifiche.
Per impostare il file audio che volete che sia riprodotto come segnale
acustico per avvisare di un attacco in corso di cui abbiamo accennato in
sezione 3.1, sempre dal menù “Impostazioni” scegliete “Modifica
Preferenze Audio”, si aprirà l'interfaccia “Gestione Audio”, presentando
una lista dei file audio presenti nella cartella util/audio (sarà
pertanto sufficiente copiare all'interno di questa cartella il file wav
che vogliamo per poterlo selezionare dalla lista e utilizzare come suono
di avviso) e tre bottoni: play, stop e salva. Basterà selezionare un file
dalla lista per poterlo eseguire, stopparne l'esecuzione e salvarlo. Una
volta premuto il bottone “salva” apparirà un popup informandovi
dell'effettivo salvataggio nelle preferenze (o avvisandovi se non avete
selezionato niente).
Ora siete pronti per premere il bottone aggiorna nell'interfaccia ARCA,
alla frequenza selezionata l'interfaccia ARCA si aggiornerà mostrando i
nuovi dati (e verranno scaricati anche i messaggi privati, visibili dal
menù “Messaggi”- “Messaggi Privati”), e nel caso di attacco provvederà ad
avvisare con un popup, il suono selezionato, e con un'email all'indirizzo
impostato.
3.3. Funzionalità del programma
Le principali funzionalità del programma sono le seguenti:
1. Rapporto della situazione attuale del proprio account
2. Generazione di un file XLS con il resoconto delle proprie armate e
città
11
3. Navigazione dei messaggi privati
4. Avvisi in caso di attacco (sonoro, tramite popup e tramite email)
3.3.1. Rapporto della situazione attuale del proprio account
Le informazioni relative allo stato attuale del proprio account sono
raggiungibili dall'interfaccia Rapporto Città Armate (vedi Figura 9),
apribile dall'icona nella traybar o con un doppio click su di essa o
dalla voce di menù “Visualizza Riepilogo”.
Figura 9: Interfaccia principare (Rapporto Città Armate).
Nell'interfaccia possiamo trovare una lista delle città e una delle
armate, due tabelle e quattro campi di testo, oltre al bottone
“Aggiorna”.
Selezionando un'elemento dalla lista cambieranno le due tabelle
mostrando, la prima, le unità militari presenti nell'armata (o
città):nella prima colonna troveremo l'immagine dell'unità mentre nella
seconda il numero di unità presenti. Nella seconda tabella troviamo
invece le armate nemiche attaccabili una volta ultimato il task di
movimento (o se non ve ne sono in coda, quelle attaccabili ora) in
particolare troveremo le colonne riportanti in ordine: nome, utente,
alleanza e distanza.
I quattro campi di testo contengono invece le informazioni relative alle
risorse trasportate dall'armata (o presenti in città) e lo status in cui
è (ovvero quiete, battaglia o movimento).
Il bottone aggiorna può essere premuto solo una volta e serve per far
partire l'aggiornamento automatico dei dati. Una volta premuto il bottone
verrà disabilitato.
12
3.3.2. Generazione di un file XLS con il resoconto delle proprie armate e
città
L'XLS è un foglio di calcolo in formato Microsoft Excel. Per generare
questo file contenete il resoconto delle informazioni del proprio account
sarà sufficiente selezionare la voce “XLS” dal menù a tendina che appare
clickando col pulsante destro sull'icona di WWIC nella barra delle
applicazioni (vedi Figura 10).
Figura 10: Esempio di file XLS generato dal programma.
3.3.3 Navigazione dei messaggi privati
Per consultare i propri messaggi privati si può richiamare l'interfaccia
direttamente dal menù a tendina che appare clickando col pulsante destro
sull'icona di WWIC nella barra delle applicazioni oppure dall'interfaccia
“Rapporto Città Armate” clickando sul menù “Messaggi” - “Messaggi
Privati”.
E' possibile visualizare solo gli ultimi cinque messaggi ricevuti,
navigando con le frecce (i bottoni “Back” e “Next”) tra di essi.
Nella figura 11 vediamo l'interfaccia di navigazione messaggi privati.
13
Figura 11: Gestore dei messaggi privati.
3.3.4 Avvisi in caso di attacco
In caso di attacco si possono ricevere tre tipi di avviso.
● Attraverso un popup sulla barra delle applicazioni che informa di
quali armate o città sono sotto attacco o stanno attaccando (ovvero
il loro stato è “battaglia”) e quali armate o città sono andate
perdute dall'ultimo aggiornamento (anche eventuali armate accorpate
o ritirate figureranno nell'elenco di quelle perse).
● Attraverso un suono scelto dall'utente (deve essere in formato
.wav).
● Attraverso un'email di notifica inviata all'indirizzo impostato.
4. Manuale del manutentore del codice
Per lo svolgimento della tesi si è ricorsi al linguaggio di
programmazione Java, all'IDE Eclipse e ad alcune librerie Java. In
particolare sono state usate Sax per il parsing dell'XML, JavaMail per
l'invio delle e-mail e JavaHelp per l'aiuto in linea.
All'interno del progetto non è stata utilizzata alcuna gerarchia di
classi ma troviamo tre package: datatype, che contiene i tipi di dato
(classi con campi e i relativi getter e setter, senza ulteriori metodi),
boundary (ovvero le GUI) e gli executor (ovvero le classi che si occupano
della parte esecutiva del programma), analizziamo ora le classi di ogni
package nel dettaglio.
4.1. Package Datatype:
Classe Armata.
E' il tipo di dato principale, all'interno del programma si usano liste
(per la precisione LinkedList) di Armata. Distinguiamo tra città e armate
andando a controllare se è presente un numero random racchiuso tra
parentesi quadre, nel caso fosse presente si tratta di armata, altrimenti
si tratta di città, infatti ogni città è anche un'armata, che ha come
nome quello della città (e quindi non compare il numero random tra
quadre).
All'interno ha i seguenti campi con i relativi getter e setter:
private LinkedList<Milgroup> milgroups;
14
una lista linkata di unità miliari (vedere classe milgroup);
private Risorse resources;
le risorse: possono essere oro, metallo e petrolio;
private String nome;
il nome dell'armata;
private String status;
lo status dell'armata: può essere move (in movimento), battle (in
battaglia) o none (in quiete);
private String task;
campo non ancora utilizzato, dovrebbe contenere la prossima destinazione
e/o obiettivo dell'armata;
private LinkedList<ArmataNemica> radar;
indica le armate nemiche presenti nel raggio di azione dell'armata.
Essendo un tipo di dato non ha altre operazioni.
Classe ArmataNemica.
Come abbiamo visto ogni armata ha al suo interno una lista di armate
nemiche (per la precisione rappresentano le armate nemiche presenti nella
visuale, o radar, dell'armata che stiamo considerando) caratterizzate dai
seguenti campi con i relativi getter e setter:
private String nome;
private String utente;
private String alleanza;
private float distanza;
Classe Dati.
Rappresenta i dati che vogliamo salvare in locale per effettuare il
recupero del file xml da remoto. Questi dati vengono memorizzati anche in
un file xml in modo da averli disponibili all'avvio successivo. Vediamo
ora i campi uno alla volta:
String audio;
E' il nome del file audio (il path sarà standard, homeDir/ww/audio, ma
l'utente potrà inserire in questa cartella i file che vorrà e scegliere
tra quelli) con il quale l'utente ha scelto di essere avvisato dal
programma in caso di attacco o altra situazione anomala.
String username;
Lo username che usa l'utente per loggarsi al gioco.
String password;
La password che l'utente usa per loggarsi al gioco.
String proxy;
Se l'utente si collega attraverso un proxy, qui andrà indicato il suo
nome.
int porta;
La porta del proxy attraverso cui far passare le richieste http
(tipicamente 8080) nel caso in cui si stia navigando dietro proxy.
String email;
L'indirizzo email a cui vanno inviati i rapporti sulle situazioni
critiche rilevate.
String smtp;
Il server smtp del provider dei servizi internet, bisogna impostarlo per
poter inviare le e-mail.
int frequency;
La frequenza, espressa in secondi, con cui l'utente vuole riscaricare il
file xml da remoto e, quindi, essere aggiornato. Il minimo è 60 (in caso
di valore più basso sul file xml, verrà comunque impostato a 60).
Le operazioni sono solamente i getter e i setter dei campi sopra citati.
15
Classe Milgroup.
Rappresenta ogni singolo gruppo di unità militari dello stesso tipo
all'interno di un'armata. E' caratterizzato da un tipo (soldato semplice,
scelto, granatiere, etc.) e da una quantità, come possiamo vedere dai
campi:
private String unità;
private int quantità;
Le operazioni sono solamente i getter e i setter dei due campi sopra
citati.
Classe Risorse.
Ogni armata (indipendentemente dal fatto che sia città o meno) trasporta
delle risorse che sono precisamente oro, metallo e petrolio. La classe ha
pertanto solo questi tre campi e i relativi getter e setter.
private long gold;
private long metal;
private long oil;
Si sono usati i long per evitare problemi di visualizzazione con numeri
molto grossi (che durante il testing si sono rilevati).
4.2. Package Executor:
Classe AePlayWave.
Si occupa di caricare un file audio e di gestirlo come un thread, sarà
pertanto possibile metterlo in pausa e riprenderne l'esecuzione.
Class CopiaFile.
E' una classe molto semplice che serve a copiare un file in un'altra
directory, viene chiamata al primo avvio del programma per spostare i
file audio dal .jar alla cartella homeDir/ww/audio.
Il costruttore prende come parametri due stringhe, rispettivamente orig
(orgine, o file originale) e dest (destinazione, o file di destinazione).
Classe CopyURL.
Si occupa di copiare un file da remoto in locale. La funzione è molto
simile a quella di copiaFile e il codice del costruttore è il seguente:
public CopiaUrl(String source,String dest)
{
try
{
non è
URL url = new URL(source);
// Copia le risorse su un file locale usando un file remoto se
//specificato un file locale.
InputStream is = url.openStream();
// Stampa le informazioni sulle risorse.
FileOutputStream fos=null;
fos = new FileOutputStream(dest);
int oneChar, count=0;
while ((oneChar=is.read()) != -1)
{
fos.write(oneChar);
count++;
}
16
is.close();
fos.close();
}
catch (MalformedURLException e)
{ System.err.println(e.toString()); }
catch (IOException e)
{ System.err.println(e.toString()); }
}
Classe GeneratoreXML.
Questa classe viene utilizzata per salvare i dati di login e le
preferenze nel file dati.xml. Viene utilizzata la libreria sax per la
creazione di file xml.
Ha i due seguenti campi:
private String id[];
private String desc[];
che vengono settati dal metodo inserisciDati(String id[], String desc[])
e poi usati dal metodo generaXML(String nomefile) il cui parametro è
appunto il nome del file che vogliamo generare(nel nostro caso dati.XML).
La funzione creaFileDati(String id[], String desc[], String nomefile) si
occupa appunto di chiamare le altre due, generando così il file dati.xml.
Classe InterpreteXML.
E' la classe più importante del progetto, si occupa di creare un nuovo
thread e di caricare i dati da remoto ogni volta che trascorre un
intervallo di tempo predefinito. Si occupa anche di creare gli oggetti
che poi saranno passati alle GUI per la visualizzazione dei dettagli
dello stato di gioco dell'utente (in particolare le linked list di armate
e città).
La funzione principale è parseDocument() che si occupa di fare il parsing
del file XML e di generare le strutture dati che verranno utilizzate in
seguito, in particolare chiama la getHandler() che andrà a individuare i
singoli tag (con le funzioni startElement(), endElement() e characters()
possiamo identificare l'apertura del tag, la sua chiusura, e i valori
contenuti in esso).
Abbiamo inoltre una funzione controllaUI(LinkedList<Armata> old,
LinkedList<Armata> new) che prese due linkedList di armata le confronta
per rilevare se un'armata presente in old, non lo è in new (in questo
caso è stata distrutta e quindi viene segnalato all'utente).
La funzione attaccato() viene chiamata a ogni ciclo e controlla se
l'utente ha subito un'attacco (controllando un particolare tag XML,
status, per ogni armata) o se ha perso delle armate (o città), in questo
caso provvede a mostrare un popup con:
● le armate/città sotto attacco
● le armate/città andate distrutte
inoltre riproduce un suono scelto dall'utente costruendo un nuovo oggetto
di tipo AePlayWave e, se l'utente ha deciso di essere informato anche via
e-mail, il sistema provvede a inviarne una con un rapporto dettagliato
della situazione.
Classe LeggiDatiXML.
E' una versione semplificata di interpreteXML, viene usata solo per
leggere i dati di connessione salvati sul file dati.xml. Ha pertanto la
stessa funzione parseDocument() e le funzioni per individuare i tag XML,
17
ovvero startElement(), endElement() e characters() solo che non sono
dentro a un getHandler() poiché la classe LeggiDatiXML estende già un
defaultHandler.
Classe MailNotifier.
Ha solo il costruttore che si occupa di costruire un messaggio con
relativi campi mittente e destinatario, impostare il server smtp e di
inviarlo all'indirizzo impostato.
Classe Main.
E' la classe che contiene il main del programma, e pertanto è quella che
viene lanciata all'avvio e che effettuerà le chiamate alle altre classi.
Si occupa inoltre di creare le cartelle e di copiare i file necessari al
primo avvio del programma. Passiamo ora ad analizzare il codice.
static SystemTray systemTray ;
private static TrayIcon trayIcon;
private static Dati dati= new Dati();
Abbiamo solo tre campi con i relativi getter e setter, oltre a questi
abbiamo tre funzioni, il main, changeIcon e displayMsg.
Al primo avvio il costruttore crea nella home dir dell'utente la cartella
ww, le sottocartelle audio e messages e copiare i file audio presenti
nel jar all'interno della cartella audio, per ulteriori informazioni
guardare i commenti nel codice.
La funzione displayMsg serve per mostrare dei messaggi come popup sulla
traybar, il parametro è la stringa che si vuole mostrare.
La funzione changeIcon serve a cambiare l'icona nella traybar (ad esempio
quando l'utente è sotto attacco o si vuole segnalare un'altra situazione
anomala). Prende come parametro una stringa che corrisponde al nome del
file.
Classe WaveFilter.
Serve a filtrare i file da caricare da cartella. Considera validi solo
quelli con estensione .wav. Questa classe viene utilizzata
dall'interfaccia AccedereSuoni per caricare la lista di suoni presenti
nella cartella predefinita (homeDir/ww/audio).
4. 3. Package Interfacce:
Classe AccedereBrowser.
Si occupa di creare un mini browser per visualizare i messaggi privati
dell'utente. Viene creata una toolbar con tre bottoni: back, next ed
exit.
Col metodo setPage(JEditorPane jep, String url) passiamo un'url che verrà
visualizzata nel panel.
Un'immagine della GUI è visibile in figura 11, cap. 3.3.3.
Classe AccedereDatiLogin.
E' la GUI che permette di modificare e salvare i dati per la connessione
e le preferenze. Troviamo i textField per inserire username, password
(jPasswordField), nome del proxy, porta, indirizzo e-mail, un jSlider per
sapere ogni quanto effettuare l'aggiornamento dei dati e un combobox per
selezionare il server smtp (per inviare le e-mail). Il bottone Invia email di test serve appunto a testare se si è configurato correttamente il
server SMTP di posta ed eventuali proxy, inviando una email di test
18
all'indirizzo indicato.
Il bottone salvaDati chiama l'omonima funzione che a sua volta chiama
GestoreXML.creaFileDati() che come abbiamo visto va a creare (o
modificare) un file xml con dentro le preferenze appena impostate.
Nella figura 12 possiamo vedere la GUI AccedereDatiLogin con alcuni dati
inseriti.
Figura 12: Modifica Preferenze.
Classe AccedereRapportoCittaArmate.
E' la GUI principale, vi troviamo un jTabbedPane che contiene le due
liste (armate e città), due tabelle, una per le armate (una colonna per
l'immagine e una per il numero) e una per le armate nemiche nel radar
(nome, utente, alleanza e distanza). Troviamo inoltre il menù da cui
poter richiamare le altre GUI (AccedereSuoni, AccedereDatiLogin e
AccedereBrowser).
Le funzioni, oltre a quelle relative all'aspetto grafico, sono
selezionatoEl() e aggiorna().
SelezionatoEl() viene chiamato quando si clicka su un elemento della
lista e aggiorna le due tabelle con i dati relativi all'armata(o città)
selezionata, mentre aggiorna fa il refresh delle liste quando vengono
scaricati i dati da remoto.
Per discriminare in quale lista deve finire un'armata (lista di città o
di armate normali) controlliamo se nel nome contiene una parentesi
quadra, in tal caso è di sicuro un'armata (hanno un pattern del tipo
nomeArmata[numerorandom]) altrimenti è una città.[questa convenzione sui
nomi spiegarla bene nella classe Armata]
Sia le tabelle che le liste sono all'interno di jScrollPane in modo che
se crescono di dimensione compare automaticamente la barra di
scorrimento.
In figura 9 cap. 3.3.1 possiamo vedere la GUI
AccedererapportoCittaArmate.
Classe AccedereSuoni.
19
E' la classe che permette all'utente di scegliere con quale suono essere
avvisato di situazioni critiche. I file vengono caricati in una lista
dalla cartella homeDir/ww/audio. L'utente può selezionare il file che
vuole e ascoltarne un'anteprima premendo il bottone play che chiama la
funzione eseguiAudio() la quale passa alla funzione runWave() il file
audio selezionato.
L'utente conferma la sua scelta premendo il bottone salva che invoca
l'omonima funzione, la quale a sua volta invoca la funzione
creaFileDati() in GestoreXML.
In figura 13 possiamo vedere la GUI AccedereSuoni che ci permette di
sceglire con quale suono essere avvisati in caso di necessità.
Figura 13: AccedereSuoni.
Classe AccedereTraybar.
Questa classe serve a generare l'icona nella traybar e ad associargli il
menù (e il listener per cui facendovi doppio click appare l'interfaccia
AccedereRapportoCittàArmate). Ha i seguenti campi con i relativi getter e
setter:
private static LinkedList<Armata> armate= new LinkedList<Armata>();
la lista di armate e di città sotto il controllo dell'utente;
private static Dati dati= new Dati();
i dati relativi alla connessione e le preferenze;
private static long tid;
l'id del processo generato per gestire l'aggiornamento automatico;
public static Main main=null;
serve per avere un singleton del main (ovvero una sola istanza in
esecuzione);
private static AccedereRapportoCittaArmate ARCA=null;
20
Ha inoltre i metodi:
PopupMenu getMenuTrayBar(Main bar) che prende come parametro un oggetto
di tipo Main per aggiungere alla traybar l'icona del programma e
associargli il popupmenu.
Dati getDati() che recupera i dati usando la classe LeggiDatiXML e poi li
restituisce.
ottieniInfo(Dati dati) che prende come parametro un'oggeto di tipo dati e
invoca il costruttore di InterpreteXML per recuperare il file da remoto.
Classe Help.
Questa classe serve per integrare l'help on line, sfruttando le librerie
di javaHelp (che sono uno standard multipiattaforma a differenza
dell'help on line in formato windows). Le pagine dell'help sono semplici
pagine html che possono anche contenere link e immagini e prima della
release vengono indicizzate in modo da rendere utilizzabile la funzione
di ricerca per parola. Inoltre vengono gerarchizzate e divise per
argomenti sfruttando due file xml.
In questa classe vediamo semplicemente come venga incapsulato un helpSet
all'interno di un jFrame tramite la chiamata:
URL url = HelpSet.findHelpSet(cl, "jhelpset.hs");
che lo converte in url e
helpViewer = new JHelp(new HelpSet(cl, url));
che crea un nuovo oggetto di tipo Jhelp che con questa chiamata
frame.setContentPane(helpViewer);
viene appunto incapsulato nel frame.
Il grosso del lavoro viene invece fatto dalla libreria java jHelp che
lanciando un apposito script si occupa di creare i file indice per ogni
pagina html presente nella guida, e con pochi altri file di
configurazione è possibile creare la suddivisione per argomento e la
gerarchia menzionata poco prima.
Nella figura 14 vediamo l'interfaccia dell'aiuto in linea.
21
Figura 14: Guida on line.
5. Conclusioni e sviluppi futuri.
Come ci si era prefissati è stato realizzato uno strumento di supporto
agli utenti di Warwide per gestire il proprio account.
Lo sviluppo della prova finale è iniziato basandomi su uno stub di file
XML molto semplice fornito dagli sviluppatori di Warwide che potete
vedere di seguito:
<warwide>
<armies>
<army name="ARMY_NAME">
<milgroups>
<milgroup type="MILUNIT_TYPE">MILGROUP_TOT</milgroup>
</milgroups>
<transport>
<resources>
<resource type="RESOURCE_TYPE">RESOURCE_QUANTITY</resource>
</resources>
<milgroups>
<milgroup type="MILUNIT_TYPE">MILGROUP_TOT</milgroup>
</milgroups>
</transport>
<status>ARMY_STATUS</status>
<tasks>
<task type="TASK_TYPE">TASK_INFO</task>
</tasks>
22
</army>
</armies>
</warwide>
Questo file è quello che viene interpretato dalla classe interpreteXML
(appartenente al package Executor, come visto in sezione 4.2.) per
ottenere tutte le informazioni relative all'account dell'utente.
I significati dei tag sono i seguenti:
ARMY_NAME: nome dell'armata
MILUNIT_TYPE: codice del tipo di unita' militare ad esempio:
mu_soldier_simple (soldato semplice), mu_soldier_missile (granatiere) ,
etc.
MILGROUP_TOT: numero di unita' per quel tipo ad esempio 100 granatieri.
RESOURCE_TYPE: tipo di risorsa, può assumere i valori money, oil, metal
(oro, petrolio e metallo).
RESOURCE_QUANTITY: numero di unita' per quella risorsa (100 metallo,
etc...).
ARMY_STATUS: stato dell'armata può assumere i valori: none (nessuno), spy
(spionaggio), battle (battaglia), move (movimento).
TASK_TYPE: tipologia di task può assumere i valori spy (spionaggio) ,
battle (battaglia), move (movimento).
Il file XML contiene fornisce tutte e solo le informazioni necessarie
agli utenti e vi è stata interazione con gli utenti stessi per verificare
che fosse effettivamente così e in base alle loro segnalazioni sono stati
fatti gli opportuni cambiamenti.
Con l'evolvere della prova finale lo stub si è modificato fino a giungere
alla sua forma finale presente online e associato ad ogni giocatore di
Warwide.
Di seguito potete vedere un'esempio di file XML generato nella versione
finale (nell'esempio vediamo solo una città e un'armata per brevità
mentre non compaiono i messaggi privati in quanto sono codificati in
base64 e quindi la loro rappresentazione è poco significativa):
<?xml version="1.0" encoding="ISO-8859-2"?><warwide>
<armies>
<army name="Asuta">
<milgroups>
<milgroup type="mu_soldier_simple">50000</milgroup>
<milgroup type="mu_soldier_advanced">10000</milgroup>
<milgroup type="mu_soldier_missile">500</milgroup>
<milgroup type="mu_tank_light">500</milgroup>
<milgroup type="mu_tank_heavy">100</milgroup>
<milgroup type="mu_tower_missile">30</milgroup>
<milgroup type="mu_soldier_incursor">500</milgroup>
</milgroups>
<transport>
<resources>
<resource type="oil">182407051</resource>
</resources>
<milgroups>
</milgroups>
</transport>
<status>ctx_none</status>
<tasks>
<task type="TASK_TYPE">TASK_INFO</task>
</tasks>
<radar>
<armies>
<army name="Hemkan" user="Warwide" ally="" dist="21479"></army>
23
</armies>
</radar>
</army>
<army name="Finale Ligure">
<milgroups>
<milgroup type="mu_tank_heavy">901</milgroup>
<milgroup type="mu_ship_battleship">2192</milgroup>
</milgroups>
<transport>
<resources>
<resource type="money">57419136</resource>
<resource type="metal">1074877</resource>
<resource type="oil">20231848</resource>
</resources>
<milgroups>
</milgroups>
</transport>
<status>ctx_none</status>
<tasks>
<task type="TASK_TYPE">TASK_INFO</task>
</tasks>
<radar>
<armies>
<army name="Eril" user="WAR CLAN Armagheddon" ally="Impero Italico" dist="19606"></army>
</armies>
</radar>
</army>
</armies>
<mailbox>
<messages>
</messages>
</mailbox>
</warwide>
Usando ogni volta lo stub più aggiornato si testavano le funzionalità e
se ne aggiungevano di nuove anche grazie al testing e ai feedback degli
utenti ai quali veniva passata una release precedente a quella
attualmente in lavorazione.
Questo permetteva a me di concentarmi solo su alcuni aspetti dello
sviluppo (il parsing dell'XML e la corretta creazione delle strutture
dati) e allo stesso tempo permetteva agli sviluppatori di WarWide di
rimandare l'effettiva creazione dinamica del file XML.
E' stata un'esperienza altamente positiva e formativa lavorare in un
ambiente reale invece che accademico, sviluppando un prodotto che ora
verrà utilizzato dagli utenti di Warwide, avendo interagito sia con i
preoduttori che con i clienti reali del prodotto.
Era intenzione degli sviluppatori di Warwide di fornire anche un servizio
di avviso via sms, ma poiché è necessario un server dedicato non è stato
possibile realizzarlo durante lo svolgimento di questa prova finale.
Rientra pertanto negli sviluppi futuri di questa applicazione.
24