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
Documenti analoghi
Il formato XML
anni ottanta da Tim Berners-Lee al CERN di Ginevra. Verso il 1994 ha avuto una forte diffusione,
in seguito ai primi utilizzi commerciali del web.
Nel corso degli anni, seguendo lo sviluppo di Inte...