Università degli Studi di ROMA Facoltà di Ingegneria Corso di Laurea Triennale in Ingegneria Informatica ANNO ACCADEMICO 2008 - 2009 TESI DI LAUREA: Reingegnerizzazione di un applicativo web: Monopoli on-line RELATORE: LAUREANDO: Prof. Giuseppe Santucci Andrea Mancini Matricola: 796867 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ INDICE Introduzione ......................................................................................................................................... 1 Scenario applicativo ......................................................................................................................... 2 Obiettivo dello stage ........................................................................................................................ 4 Motivazioni ...................................................................................................................................... 4 1 Le applicazioni e i Frameworks utilizzati .................................................................................... 5 2 Requisiti utente .......................................................................................................................... 17 2.1 Specifiche di portata........................................................................................................... 17 2.2 Specifiche di dettaglio ........................................................................................................ 17 2.3 Specifiche consegnate ........................................................................................................ 17 3 Modellazione del dominio ......................................................................................................... 18 3.1 Analisi del testo .................................................................................................................. 18 3.1.1 Actors ......................................................................................................................... 18 3.1.2 Dominio dei dati......................................................................................................... 18 3.1.3 Requisiti funzionali .................................................................................................... 18 3.2 Class Diagram di dominio.................................................................................................. 20 3.3 State Diagram ..................................................................................................................... 21 3.4 Use Case Diagram a basso livello ...................................................................................... 22 3.5 Descrizione Use Case Diagram.......................................................................................... 23 3.6 Use Case Diagram ad alto livello ....................................................................................... 23 4 Pianificazione ............................................................................................................................. 36 4.1 Pianificazione del progetto................................................................................................. 36 4.1.1 Function point ............................................................................................................ 36 4.1.2 La metodologia .......................................................................................................... 36 4.1.3 Pert ............................................................................................................................. 38 4.1.4 Gantt ........................................................................................................................... 39 5 Disegno del sistema ................................................................................................................... 40 5.1 Architettura Hardware........................................................................................................ 40 5.1.1 Server ......................................................................................................................... 40 5.1.2 Client .......................................................................................................................... 40 5.1.3 Piattaforma di sviluppo .............................................................................................. 41 5.2 Architettura Software ......................................................................................................... 42 5.3 Progetto della base di dati .................................................................................................. 43 5.3.1 Progettazione concettuale .......................................................................................... 43 5.3.1.1 Schema ER ............................................................................................................. 43 5.3.1.2 Scelte critiche effettuate nella fase di progettazione .............................................. 44 5.3.2 Progettazione logica ................................................................................................... 44 5.3.2.1 Ristrutturazione schema ER ................................................................................... 44 5.3.2.2 Schema ER ristrutturato ......................................................................................... 44 5.3.2.3 Schema logico ........................................................................................................ 45 5.3.2.4 Vincoli .................................................................................................................... 46 5.3.2.5 Politiche di cancellazione....................................................................................... 46 5.3.2.6 Viste ....................................................................................................................... 46 5.3.2.7 Creazione del DB con popolamento tabelle ........................................................... 47 5.4 Prototipazione .................................................................................................................... 56 5.4.1 Prototipo freddo ......................................................................................................... 56 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica i Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.4.2 Schema di navigazione del sito tramite ADM (Araneus Data Model) ...................... 57 5.5 Design model ..................................................................................................................... 59 5.5.1 Implementation model ............................................................................................... 59 5.5.1.1 Component diagram ............................................................................................... 59 6 Implementazione ........................................................................................................................ 60 6.1 Introduzione ....................................................................................................................... 60 6.2 Pagine web ......................................................................................................................... 60 6.2.1 Template grafico ........................................................................................................ 60 6.2.2 Motivazioni delle scelte generali ............................................................................... 62 6.2.3 Stile ............................................................................................................................ 62 6.2.4 Sfondo ........................................................................................................................ 62 6.2.5 Immagini varie ........................................................................................................... 62 6.2.6 Scelte implementative ................................................................................................ 62 6.3 Problemi riscontrati ............................................................................................................ 63 6.3.1 Eclipse ........................................................................................................................ 63 7 Manuale d’installazione ............................................................................................................. 64 7.1 Operazioni preliminari ....................................................................................................... 64 7.1.1 Installazione Java Virtual Machine: JDK 1.6 ............................................................. 64 7.1.2 Installazione DBMS: MySQL 5 ................................................................................. 64 7.1.3 Installazione Web Server: Apache TomCat 6 ............................................................. 65 7.2 Installazione ....................................................................................................................... 66 7.2.1 Avvio del DBMS ........................................................................................................ 66 7.2.2 Creazione e popolamento del database ...................................................................... 66 7.2.3 Copia dei contenuti web ............................................................................................. 67 7.2.4 Avvio del Web Server ................................................................................................ 67 7.2.5 Lanciare applicazione ................................................................................................ 67 7.2.6 Primo accesso (Log-in / Registrazione) ..................................................................... 68 7.3 Utilizzo dell’applicazione .................................................................................................. 68 8 Commenti e ringraziamenti ........................................................................................................ 69 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica ii Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Introduzione La reingegnerizzazione (“reengineering”) è un metodo utilizzato in campo manageriale per sopperire a risultati insoddisfacenti. Ciò avviene ripensando l'azienda per processi orizzontali e riprogettando gli stessi processi secondo precisi standard di efficienza. Le aziende riprogettando i loro processi possono ottenere miglioramenti durevoli di costo, efficienza e qualità. Nel nostro caso si tratta di reingegnerizzazione di un sito web. Un sito web fa parte del patrimonio di una azienda: visitatori fidelizzati, applicazioni tagliate sulle esigenze aziendali, investimenti già effettuati creano un valore che è necessario preservare nel tempo. Allo stesso tempo, però, il sito è uno strumento di business e deve condurre al raggiungimento di risultati concreti: spesso siti web "obsoleti" hanno necessità di essere riprogettati. Lo scopo è di mostrare come lo sviluppare in un linguaggio di programmazione (ad esempio Java) possa cambiare nel corso del tempo. Con l’intervento dell’ingegneria del software si è iniziato a dare delle regole, un determinato ordine nel programmare, definendo vari paradigmi di sviluppo di un software, come ad esempio il modello MVC (Model View Controller). Da tale approccio si sono poi aggiunti i cosiddetti Frameworks che oltre a proporre il loro MVC aiutano i programmatori a scrivere del codice modulare rendendolo riusabile anche in altri progetti (ad esempio nello sviluppo di applicazioni web) improntando così uno scheletro solido per la struttura dell’applicazione. In particolare noi andremo a vedere in dettaglio solo alcuni Frameworks che però andranno così a toccare tutti gli aspetti contemplati nel MVC. Per rendere la spiegazione più interessante e avvincente ho deciso di prendere come esempio un mio progetto universitario che unisce due esami molto validi per la formazione di uno studente verso il mondo del lavoro. Gli esami sono: il progetto di ingegneria del software e il progetto di basi di dati. Il progetto di ingegneria del software richiedeva di dover analizzare, progettare, sviluppare e testare un applicativo orientato al web utilizzando il linguaggio Java come linguaggio di implementazione e HTML per la visualizzazione. Il progetto di basi di dati richiedeva di creare un applicazione Java che facesse uso di un database SQL relazionale (MySql) per la memorizzazione, ricerca e modifica dei dati. Per unire i due progetti ho deciso di creare un applicazione web che facesse uso del database. L’applicazione scelta fu la realizzazione di un sito web che permetta di giocare on-line al celebre e famosissimo gioco del Monopoli. Il sito web infatti permette di registrarsi per effettuare l’accesso, una volta effettuato si può decidere se creare una partita o parteciparne ad una già creata (non iniziata) e visualizzare la classifica dei punteggi, in partita si possono effettuare tutte le azioni che prevede il regolamento del gioco, tra cui la trattativa per lo scambio e vendita dei territori tra due giocatori ed in più il salvataggio di una partita in corso per poterla poi riprendere successivamente. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 1 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Scenario applicativo Durante il ciclo di vita e l'uso di un applicativo software, le aspettative e le condizioni in cui esso era stato sviluppato possono cambiare, determinando la necessità di una riqualificazione, nell'ottica di un aumento delle prestazioni e della stabilità. Supponendo di aver ricevuto la richiesta di manutenzione evolutiva dell’applicativo web “Monopoli-OnLine”, utilizziamo lo schema del ciclo di vita a spirale come strumento di sviluppo. Figura 1 : Modello a spirale La spirale ha il pregio di considerare tutto il ciclo di vita; oltre ad arrivare alla consegna del software, permette di strutturare e programmare anche l'attività successiva all'installazione. In sostanza si occupa anche della manutenzione che molti altri modelli trascurano. Con questo modello il software si evolve di pari passo con l'avanzare del processo così da consentire allo sviluppatore e al cliente di valutare meglio i rischi e di reagire ad ogni stadio. Dapprima si rende necessario l’analisi del vecchio progetto facendo riferimento ai requisiti richiesti, individuando i punti di intervento. Il vecchio progetto essendo basato sulla caratteristica del design pattern MVC (Model-ViewController), è già improntato con l’ottica ingegneristica di riusabilità, modularità e disaccoppiamento, e questo ci permette di porre l’attenzione ai singoli moduli. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 2 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Controller View Model Figura 2 Vediamo in fondo le 3 componenti basi che compongono il design pattern MVC: Model: View: Controller: Rappresenta gli oggetti dati. Il modello è ciò che viene rappresentato e manipolato dall'utente. Serve come rappresentazione del modello. È l'oggetto che presenta lo stato corrente degli oggetti dati. Definisce il modo con cui l'interfaccia utente reagisce all'input dell'utente. L'utilizzo del pattern MVC offre molteplici vantaggi tra i quali una separazione tra i livelli di presentazione e di transazione; ciò permette di cambiare il look and feel di un'applicazione senza ricompilare il codice del Modello o del Controller. In secondo luogo il tempo di sviluppo può essere significativamente ridotto, perché i programmatori possono pensare alle transazioni, mentre i View programmers (HTML e JSP) si concentrano sull'interfaccia. L'ultimo beneficio è la separazione della logica di presentazione da quella di business che rende più facile mantenere e modificare un'applicazione Web basata a strati (o livelli). A questo punto lo scenario si presenta nel seguente modo : Model: View: Controller: Sono rappresentate le classi Java “DAO/DAC” che interagiscono con il database per recuperare e scrivere informazioni SQL. Sono pagine HTML con incapsulato del codice Java per renderle dinamiche. Sono classi Java denominate Servlet che elaborano le azioni dell’utente finale (J2EE). ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 3 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Obiettivo dello stage Sperimentare nuove tecnologie (Frameworks) per lo sviluppo di applicativi web. Individuazione dei punti di intervento. Le aree d’intervento in questa reingegnerizzazione per completezza andranno a toccare tutte e tre le componenti del design pattern MVC : Model: View: Controller: Mappatura delle classi JavaBeans in XML utilizzato da Hibernate per la gestione del database. Aggiunta di AJAX nelle pagine HTML/JSP per minimizzare l’interazione con il server. Modifica del codice in Java Struts 1.2.9 sostituendo le Servlets con Action e ActionForm. Motivazioni Lavorando nel campo dell’informatica è indispensabile stare al passo con i tempi e conoscere pregi e difetti di nuove soluzioni che potrebbero essere utili nell’implementazione di un qualunque genere di software. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 4 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 1 Le applicazioni e i Frameworks utilizzati Eclipse Galileo SR1 Descrizione: Eclipse è un progetto open source legato alla creazione e allo sviluppo di una piattaforma di sviluppo ideata da un consorzio di grandi società quali Ericsson, HP, IBM, Intel, MontaVista Software, QNX, SAP e Serena Software, chiamato Eclipse Foundation, e creata da una comunità strutturata sullo stile dell'open source. Pur essendo orientata allo sviluppo del progetto stesso, questo IDE (ambiente di sviluppo integrato) è utilizzato anche per la produzione di software di vario genere. Si passa infatti da un completo IDE per il linguaggio Java (JDT, "Java Development Tools") ad un ambiente di sviluppo per il linguaggio C++ (CDT, "C/C++ Development Tools") e a plug-in che permettono di gestire XML, PHP e persino di progettare graficamente una GUI per un'applicazione JAVA (Eclipse VE, "Visual Editor"), rendendo di fatto Eclipse un ambiente RAD. Il programma è scritto in linguaggio Java, ma anziché basare la sua GUI su Swing, il toolkit grafico di Sun Microsystems, si appoggia a SWT, librerie di nuova concezione che conferiscono ad Eclipse un'elevata reattività. La piattaforma di sviluppo è incentrata sull'uso di plug-in, delle componenti software ideate per uno specifico scopo, per esempio la generazione di diagrammi UML, ed in effetti tutta la piattaforma è un insieme di plug-in, versione base compresa, e chiunque può sviluppare e modificare i vari plug-in. Nella versione base è possibile programmare in Java, usufruendo di comode funzioni di aiuto quali: completamento automatico ("Code completion"), suggerimento dei tipi di parametri dei metodi, possibilià di accesso diretto a CVS e riscrittura automatica del codice (funzionalità questa detta di Refactoring) in caso di cambiamenti nelle classi. Essendo scritto in Java, Eclipse è disponibile per le piattaforme Linux, HP-UX, AIX, Mac OS X e Windows. Note positive: Programmazione assistita con strumenti di segnalazione e correzione di errore, controllo sintattico su tutto il progetto, integrabile con molti plug-in. (Junit, Cactus, ...) e programmi (TomCat, MySQL, ...). Note negative: L’IDE richiede un hardware non mediocre, risulta difficile la portabilità del progetto da una macchina ad un’altra se non vengono seguiti dei piccoli accorgimenti, sono stati riscontrati problemi nel associazione con TomCat 5.5/6.0 ed a volte avvisa errori inesistenti sul codice HTML (ad esempio per il tag Form). Apache Tomcat Descrizione: Apache Tomcat (o semplicemente Tomcat) è un web container open source sviluppato dalla Apache Software Foundation. Implementa le specifiche JSP e Servlet di Sun Microsystems, fornendo quindi una piattaforma per l'esecuzione di applicazioni Web sviluppate nel linguaggio Java. La sua distribuzione standard include anche le funzionalità di web server tradizionale, che corrispondono al prodotto Apache. In passato, Tomcat era ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 5 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ gestito nel contesto del Jakarta Project, ed era pertanto identificato con il nome di Jakarta Tomcat; attualmente è oggetto di un progetto indipendente. Tomcat è rilasciato sotto licenza Apache Software License, ed è scritto interamente in Java; può quindi essere eseguito su qualsiasi architettura su cui sia installata una JVM. Note positive: Permette di provare la propria applicazione sulla propria macchina di sviluppo generando un application server a tutti gli effetti. È possibile avviare e bloccare il proprio application server locale a piacimento. Note negative: Non è gestita la coda dei messaggi. Struts 1.2.9 Descrizione: Apache Struts è un progetto open source sponsorizzato dalla Apache Software Foundation ed è l'implementazione Java server-side del design pattern MVC (Model View Controller). Il progetto Struts è nato con l'intenzione di implementare un framework open-source per la creazione di applicazioni web che permettesse la separazione del livello di presentazione e che fosse, allo stesso tempo, astratto dai vari livelli di dato e dalle transizioni. I componenti di Struts Struts, come ogni application framework, è un insieme di classi e interfacce che costituiscono lo scheletro per costruire le nostre Web application. I componenti base su cui si appoggia sono: ActionServlet: È la servlet di controllo che gestisce tutte le richieste dell'applicazione. Come tutte le servlet estende la classe javax.servlet.http.HttppServlet e che quindi implementa tutti i metodi di lifecycle, incluso init(), doGet(), doPost() ed il destroy. struts-config.xml: È il cuore di tutta l'applicazione. In tale file XML si vanno a settare ed a definire i vari elementi della nostra applicazione e le loro associazioni. Tale file viene letto in fase di start-up dell'applicazione dalla ActionServlet. Action: Le Action sono le classi alle quali le ActionServlet delegal'elaborazione della richiesta. ActionMapping: Contiene gli oggetti associati ad una Action nello struts-config come ad esempio gli ActionForward. ActionForm: Sono considerati dei veri contenitori di dati. Fanno riferimento ad uno specifico form e vengono popolati automaticamente dal framework con i dati contenuti nella request http. ActionForward: Contengono i path ai quali la servlet di Struts inoltra il flusso in base alla logica dell'applicazione. Custom-tags: Sono tag particolari forniti dal framework Struts per assolvere a molti dei più comuni compiti delle pagine JSP. In figura 3 è rappresentato il flusso elaborativo nella logica di Struts: ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 6 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Figura 3 : Flusso Elaborativo di Struts Come si puó notare il Client invia una richiesta http (1), la quale viene ricevuta dalla servlet di Struts, che provvede a popolare l'ActionForm associato alla richiesta con i dati della request (2) e l'ActionMapping associata alla richiesta (4). Tutti i dati sono stati letti dallo struts-config.xml in fase di start up. L' ActionServlet delega l'elaborazione dati alla relativa Action (3) passandole in input request e response http e l'ActionForm e l'ActionMapping precedentemente valorizzati. La Action si interfaccia con lo strato di business object. Al termine dell'elaborazione restituisce alla ActionServlet un ActionForward (6) contenete il path della vista da fornire all'utente. La Action esegue il forward alla vista specifica nell'ActionForward (7). Tale flusso di operazioni non è totalmente completo tuttavia fornisce un'indicazione di base su come viene gestito il flusso di richieste e di elaborazione dati in un applicazione Struts. Il Deployment descriptor dell'applicazione Il file web.xml descrive tutti i componenti dell'applicazione Web. Le informazioni che possono essere descritte nel seguente file sono: Parametri ed inizializzazione ServletContext Contenuto localizzato Configurazione della sessione Definizione Servlet/JSP Mapping Servlet/JSP Riferimenti a tag library Mappature a tipi MIME Lista di file di Welcome Pagine di errore ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 7 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Hibernate Descrizione: La programmazione orientata agli oggetti ci garantisce delle opportunità di sviluppo peculiari di questo paradigma di programmazione. In particolare la possibilità di astrarre dei concetti generali, ed applicarli a diversi contesti in maniera praticamente automatizzata consente il rapido sviluppo basato su servizi già creati. Esistono in commercio piattaforme evolute che estendono proprio i concetti di astrazione e riusabilità portandoli a diventare basi portanti per progetti di più ampio respiro. è il caso di Hibernate le cui peculiarità sono la base della piattaforma di middleware per la persistenza forse più interessante in commercio (nonché la base dell'application server JBoss per la persistenza degli entity java bean). Hibernate è uno strato di middleware che consente allo sviluppatore di automatizzare le procedure per le operazioni cosiddette CRUD (Create, Read, Update, Delete) dei database. In ambito di sistemi informativi, in particolar modo applicati al web, questo tipo di operazioni sono quelle che più di altre portano lavoro: di codifica, di test e di debug. In particolare l'eterogeneità tra il linguaggio di programmazione utilizzato per la logica applicativa (nel nostro caso Java, ma in generale anche gli altri linguaggi) e quello utilizzato per interrogare le basi di dati relazionali (SQL, standard o dialetti derivati dalle implementazioni del database) è all'origine della difficoltà di produrre in tempi brevi prodotti affidabili. Le pratiche di programmazione più comuni, hanno portato, nel tempo, a modelli di sviluppo che prevedono l'utilizzo dei Javabean, in particolare in ambiente web application, come oggetti contenitore di informazioni residenti su base di dati. Oggetti, che tra le altre cose ben si prestano ad essere rappresentati in fase di visualizzazione grazie ai tag delle pagine JSP. Il successivo passo è quindi quello di avere uno strato di programmazione che si interpone tra la pagina JSP ed il database, occupandosi di popolare con le informazioni corrette proprio i javabean. Hibernate nasce con questo scopo e si evolve fino a diventare forse la più robusta piattaforma di middleware per la persistenza attualmente presente. Il progetto, opensource da sempre, è sotto l'elgida Red Hat, che qualche tempo fa ha acquisito il progetto JBoss (di cui Hibernate è ormai colonna portante). L'idea è quella di indicare al middleware in maniera dichiarativa (con dei descrittori testuali, xml) l'associazione tra la classe del javabean e la tabella in cui risiedono i dati. Una volta definite queste associazioni, l'infrastruttura che utilizzeremo si occuperà di recuperare dinamicamente le informazioni associate (leggendo i descrittori) e creare automaticamente le query necessarie (in base all'operazione che utilizzeremo). ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 8 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Figura 4 : Hibernate layer A differenza degli entity java bean (che pure hanno una logica similare), qui dovremo chiedere esplicitamente l'operazione da svolgere (salvataggio, update, cancellazione, ecc). In realtà, la piattaforma consente di fare molto di più. Lo scopo di questo articolo è però quello di illustrare i primi passi per poter utilizzare la tecnologia, quindi vediamo come poter incominciare da subito ad utilizzare la piattaforma. Installazione Più che installazione, bisogna parlare di importazione delle librerie (jar) che contengono la logica di middleware. Dal sito ufficiale potete raggiungere la pagina di download e scaricare il materiale necessario ad iniziare. Come dicevo nel precedente paragrafo, la tecnologia è particolarmente complessa (e interessante) nelle sue funzionalità avanzate e nel sito troverete tutto il materiale di cui avrete bisogno per approfondimenti. Per iniziare è sufficiente scaricare la tecnologia (core), arrivata, al momento in cui scrivo, alla versione 3.2.5. Una volta scaricati i file, importate le librerie jar sotto il vostro progetto oppure rendetele visibili al classpath. Tutte le classi necessarie le trovate nel package hibernate3.jar, quindi sarà sufficiente importare quest'ultimo. Un esempio pratico Quello che vogliamo realizzare è la creazione di un'associazione tra una tabella di un database e un Javabean attraverso il quale poter rappresentare i dati. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 9 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Prendiamo il caso della persistenza di informazioni di persone, presenti in un database. Immaginiamo il database abbia diverse informazioni registrate tra cui un identificativo, il nome e l'indirizzo email. Iniziamo a sviluppare il Javabean associato, che chiameremo Persona. Ovviamente si tratta di una classe con i suddetti attributi di istanza (privati), i metodi getter e setter pubblici ed il costruttore di default (unici vincoli di un javabean). Listato 1. Javabean che contiene informazioni su una persona package it.html.hibernate; public class Persona { //Variabili di istanza private int id; private String nome; private String email; //Costruttore pubblico public Persona(){} public String getEmail() { return email; } //Metodi getter / setter public void setEmail(String email) { this.email = email; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } Come potete vedere, non c'è niente di particolarmente rilevante: nessuna estensione o implementazione, il che rende possibile fare evolvere la classe da altre e così via. Ma procediamo con quello che è il ponte tra il javabean e Hibernate: il descrittore xml. Il descrittore ha il compito di definire l'associazione tra l'oggetto appena scritto ed il database. Immaginiamo che la tabella del database si chiami AnagraficaCliente e che abbia una serie di campi tra cui: ANAG_ID, nome, cognome, CLI_EMAIL e CLI_TEL. Listato 2. Descrittore <?xml version="1.0"?> <hibernate-mapping> <class name="it.html.hibernate.Persona" table="AnagraficaCliente"> <id name="id" column="ANAG_ID"> <generator class="native"/> </id> ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 10 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ <property name="email" column="CLI_EMAIL"/> <property name="nome"/> </class> </hibernate-mapping> Il descrittore, dovendo associare la classe alla tabella, si presenta molto semplicemente. Il tag class, racchiude l'associazione vera e propria già nei sui due attributi name e table. Già noi in questo modo associamo il javabean alla tabella. Successivamente, sempre all'interno dello stesso tag definiamo le altre informazioni di supporto (relative alle proprietà del bean). Il tag id definisce l'identificativo della tabella (la chiave), mentre i tag property definiscono l'associazione tra la proprietà del javabean (attributo name) e la colonna del database (attributo column). Quando l'attributo column manca è implicito che il nome della colonna sarà quello definito dall'attributo name. Questo file, per convenzione, viene inserito a livello del sorgente java e si chiamerà (sempre per convenzione) Persona.hbm.xml. A completare il quadro mancano però alcune componenti essenziali. Come sappiamo, per poter interrogare una base di dati abbiamo bisogno dei bridge JDBC che sono dei driver dipendenti dall'implementazione del DBMS usato. Dovremo infatti creare un altro file che definisca le informazioni su database (indirizzo) e driver (classe da usare). Listato 3. Definisce le informazioni per la connessione al DB <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.username">root</property> <property name="connection.password">****</property> <property name="connection.pool_size">1</property> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <property name="current_session_context_class">thread</property> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create</property> <mapping resource="it/html/hibernate/Persona.hbm.xml"/> </session-factory> </hibernate-configuration> Il file di configurazione (hibernate.cfg.xml) indica i driver necessari alla connessione. Per questo semplice esempio utilizzeremo un database HSQL (un DBMS realizzato in java). Due sono le possibilità per definire la connessione al database: il file di configurazione (xml) oppure un file proprietà. Rimaniamo concentrati sul listato sopra. Le proprietà definiscono il driver da utilizzare (connection.driver_class) e l'url (connection.url) di connessione al database più altri parametri opzionali. Utilizzando altri database bisogna fare attenzione a portare i driver JDBC a livello di visibilità del classpath. Altro parametro a cui bisogna fare attenzione è il tag mapping, nella cui proprietà resource viene indicato il path dove recuperare lo schema di persistenza che avevamo scritto in precedenza (più eventualmente altri presenti). ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 11 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Quello che ci rimane è creare il middleware vero e proprio. Si tratta di una classe di controllo, che, una volta istanziata, si occuperà di effettuare le operazioni CRUD, convertendole in operazioni SQL e quindi in operazioni di persistenza sulla base di dati. Listato 4. Classe usata per testare la persistenza del javabean Persona package it.html.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class PersonaUnitTest { public static void main(String[] args) { System.out.println("Persona Unit Test"); // Recupero la sessione: attenzione, questa operazione // può essere gestita come un Singleton lungo tutta l'applicazione Session session = new Configuration().configure().buildSessionFactory().getCurrentSession(); //Creo una nuova persona Persona p=new Persona(); p.setId(101); p.setNome("Pasquale Congiustì"); p.setEmail("[email protected]"); //Utilizziamo un modello transazionale dichiarativo session.beginTransaction(); //Chiedo al middleware di salvare questo oggetto nel database session.save(p); //fine della transazione: salviamo tramite commit() session.getTransaction().commit(); } } Il listato ci mostra una classe main. Nella realtà, probabilmente, codificheremo l'operazione di controllo sul controllore (una servlet, nel paradigma MVC). L'oggetto che si occupa di tutto è l'oggetto Session, il cui ciclo di vita può essere ottimizzato condividendo lo stesso oggetto tra più richieste. L'operazione di salvataggio vera e propria è rappresentata dal metodo save, che si aspetta come parametro un oggetto generico (nel nostro caso una Persona). Sarà quel metodo ad effettuare una richiesta SQL (una insert, presumibilmente) verso la base di dati, recuperando le informazioni proprio dal descrittore e dal javabean. Analogamente bisognerà fare con le operazioni load, update e delete. La conversione verrà curata dal framework in tutto e per tutto. Ajax Descrizione: Si sente molto parlare di AJAX e non sempre in modo chiaro. L'esigenza di avere una guida chiarificatrice sull'argomento è diventata sempre più reale al punto da far nascere siti interamente dedicati, ma che partono il più delle volte dal presupposto che chi legge sappia già molto di JavaScript o dello stesso AJAX. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 12 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Questa guida vorrebbe quindi far luce sulla questione, spiegando dettagliatamente l'acronimo tanto mormorato e le sue potenzialità al fine di fornire ai meno aggiornati o meno preparati su Javascript, le conoscenze per usare questa tecnica di sviluppo. Cenni storici L'acronimo AJAX, che significa esattamente Asynchronous JavaScript And XML (JavaScript asincrono ed XML), è stato enunciato per la prima volta da Jesse Garrett, nel 18 Febbraio 2005, come titolo di un post all'interno del suo blog (http://www.adaptivepath.com/publications/essays/archives/000385.php). Non si tratta di una nuova tecnologia né di un'invenzione bensì di un concetto utilizzato per sviluppare applicativi avanzati e particolari quali Gmail, Google Maps o Google Suggest. Il concetto è in parte espresso nell'acronimo scelto, un utilizzo asincrono di Javascript che attraverso l'interfacciamento con XML, può permettere ad un client di richiamare informazioni lato server in modo veloce e trasparente, allargando gli orizzonti delle rich internet applications. Queste applicazioni fino a poco tempo fa erano legate principalmente alle tecnologie AdobeMacromedia Flash o Java (con le applet). Entrambe purtroppo non sempre interpretabili dai client degli utenti e troppo spesso usate a sproposito con il solo scopo di stupire, discorso che spesso e purtroppo vale anche oggi. In alternativa a queste tecniche di interazione client/server, quando nel 1996 venne introdotto l'iframe in Internet Explorer 3, molti sviluppatori sfruttarono quest' ultimo modificando l'attributo sorgente (src) della pagina racchiusa e simulando così un refresh trasparente di una parte di contenuti il che emulava, in modo abbastanza sporco, un'interazione asincrona. Nel 1998 Microsoft cominciò a sviluppare una tecnologia, chiamata Remote Scripting, con lo scopo di creare una tecnica più elegante per richiamare contenuti differenti ed è in questo periodo, seppur con nome differente, che AJAX venne utilizzato per la prima volta, per poi evolversi in versioni più mature fino a diventare un oggetto vero e proprio, noto ora come XMLHttpRequest. Il motivo principale di tanto successo è che solo ultimamente il Remote Scripting ha suscitato lo stupore degli addetti ai lavori nel vedere cosa Google fosse riuscita a fare all'interno dei suoi applicativi senza necessità di Flash Player o Java Virtual Machine, mantenendo comunque la compatibilità con molteplici browser di utenti che per diversi motivi non potevano usufruire di Javascript. Come spesso è accaduto negli ultimi anni, molti hanno preso spunto da Google ed il web, noto per la sua immediatezza propositiva, è stato in grado in poco più di un anno di regalarci numerosi esempi di applicativi basati su AJAX, esagerando in alcuni casi nell'utilizzo ma considerando molto spesso e fin da subito, a differenza di quanto accadde per Flash ed Applets anni prima, due delle problematiche più diffuse del web attuale: accessibilità ed usabilità. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 13 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Descrizione tecnica e teorica Se parliamo di AJAX, oggi, parliamo di un oggetto specifico: XMLHttpRequest. A seconda del browser usato prende nomi differenti o viene richiamato in maniera differente. Nel caso di Internet Explorer, ad esempio, questo oggetto è restituito da un ActiveXObject mentre nei browsers alternativi più diffusi (Mozilla, Safari, FireFox, Netscape, Opera ed altri) XMLHttpRequest è supportato nativamente, cosa che dovrebbe accadere anche per IE dalla versione 7. Questo oggetto permette di effettuare la richiesta di una risorsa (con HTTP) ad un server web in modo indipendente dal browser. Nella richiesta è possibile inviare informazioni, ove opportuno, sotto forma di variabili di tipo GET o di tipo POST in maniera simile all'invio dati di un form. La richiesta è asincrona, il che significa che non bisogna necessariamente attendere che sia stata ultimata per effettuare altre operazioni, stravolgendo sotto diversi punti di vista il flusso dati tipico di una pagina web. Generalmente infatti il flusso è racchiuso in due passaggi alla volta, richiesta dell'utente (link, form o refresh) e risposta da parte del server per poi passare, eventualmente, alla nuova richiesta da parte dell' utente. Figura 5. Rappresentazione di una richiesta ad un server con latenza e risposta Il terzo ed inevitabile incomodo di questo ciclo è l'attesa che trascorre tra una richiesta dell' utente e la risposta del server. Con l'aggiunta di AJAX si perde questa linearità e mentre l'utente è all'interno della stessa pagina le richieste sul server possono essere numerose e completamente indipendenti. Nulla infatti vieta, teoricamente, di effettuare decine di richieste simultanee al server per operazioni differenti con o senza controllo da parte del navigatore. Figura 6. Rappresentazione di una richiesta ad un server con latenza e risposta Ciò che resta del vecchio flusso, il tempo di attesa, passa spesso in secondo piano ed in molti tipi di interazione è praticamente impercettibile. Ma attenzione poichè questo tempo è anche uno dei maggiori problemi dell'utilizzo di AJAX, sia per gli sviluppatori sia per i navigatori. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 14 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ I primi potrebbero trovarsi in difficoltà qualora l'operazione asincrona dovesse attendere assolutamente una risposta al fine di completare una serie di operazioni più o meno sensibili mentre i secondi potrebbero non avere idea di cosa stia accadendo alla pagina chiudendola ignari di aver richiesto un'informazione. A completare questa breve introduzione tecnica e teorica è il tipo di risposta che l'oggetto si aspetta dopo una chiamata che non deve essere necessariamente di tipo XML o letta come tale ma che può essere semplicemente testuale, in contro tendenza con l'acronimo stesso ma non per questo inusuale. MySQL Descrizione: MySQL è un Relational database management system (RDBMS), composto da un client con interfaccia a caratteri e un server, entrambi disponibili sia per sistemi Unix come GNU/Linux che per Windows, anche se prevale un suo utilizzo in ambito Unix. Dal 1996 supporta la maggior parte della sintassi SQL e si prevede in futuro il pieno rispetto dello standard ANSI. Possiede delle interfacce per diversi linguaggi, compreso un driver ODBC, due driver Java e un driver per Mono e .NET. Il codice di MySQL viene sviluppato fin dal 1979 dalla ditta TcX ataconsult, adesso MySQL AB, ma è solo dal 1996 che viene distribuita una versione che supporta SQL, prendendo spunto da un altro prodotto: mSQL. Il codice di MySQL è di proprietà della omonima società, viene però distribuito con la licenza GNU GPL oltre che con una licenza commerciale. Fino alla versione 4.0, una buona parte del codice del client era licenziato con la GNU LGPL e poteva dunque essere utilizzato per applicazioni commerciali. Dalla versione 4.1 in poi, anche il codice dei client è distribuito sotto GNU GPL. Esiste peraltro una clausola estensiva che consente l'utilizzo di MySQL con una vasta gamma di licenze libere. MySQL svolge il compito di DBMS nella piattaforma LAMP, una delle più usate e installate su Internet per lo sviluppo di siti e applicazioni web dinamiche. Nel luglio 2007 la società svedese MySQL AB ha 385 dipendenti in 265 paesi. I suoi principali introiti provengono dal supporto agli utilizzatori di MySQL tramite il pacchetto Enterprise, dalla vendita delle licenze commerciali e dall'utilizzo da parte di terzi del marchio MySQL. Il 16 gennaio 2008 Sun Microsystems ha acquistato la società per un miliardo di dollari, stimando il mercato del database in 15 miliardi di dollari. Il 20 aprile 2009 la stessa Sun Microsystems è stata acquistata da Oracle per 7,4 miliardi di dollari. Il software MediaWiki, che gestisce i siti del progetto Wikipedia, è basato su database MySQL Microsoft office 2007 Descrizione: Microsoft Office 2007 è l'attuale release di Office, creata per sostituire Microsoft Office 2003. Microsoft Office 2007, formalmente conosciuto come Office 12, è stato rilasciato nel Novembre 2006 in versione corporate e il 30 gennaio 2007 in versione retail. Microsoft ha incluso diverse nuove caratteristiche e miglioramenti in Office 2007, fra ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 15 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ i quali una nuova interfaccia grafica, the Ribbon, che ha sostituto i menu, le toolbar e i principali task panels. Adobe Creative Suite CS4 Descrizione: Adobe Creative Suite è una raccolta di software per il disegno grafico, lo sviluppo di pagine web e la realizzazione di contenuti audio e video. La suite viene distribuita in quattro versioni differenti: Design (Standard e Premium), con applicazioni finalizzate alla creazione di documenti creativi, immagini e grafica; Web (Standard e Premium), con applicazioni finalizzate alla creazione di siti web; Production Premium, con applicazioni per la creazione, la modifica e la gestione di file multimediali come musica e filmati; Master Collection, comprendente tutte le applicazioni delle altre tre edizioni. La sua ultima versione, la Adobe Creative Suite 4 (abbreviato CS4) fu annunciata il 23 settembre 2008; da novembre è disponibile anche il supporto multilingue (con installazione in italiano) ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 16 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 2 Requisiti utente 2.1 Specifiche di portata Effettuare manutenzione evolutiva dell’applicazione web Monopoli on-line. Il progetto consiste nel permettere di giocare al famoso gioco da tavola “Monopoli” via Web, permettendo ad amici o sconosciuti, lontani e vicini di giocare comodamente ognuno a casa propria o ovunque si abbia una connessione ad internet. L’applicazione dovrà mantenere le stesse funzionalità ma migliorare il servizio (prestazioni, efficienza) e la qualità del prodotto (riusabilità). 2.2 Specifiche di dettaglio L’architettura del sistema prevede un Web Server centrale che unisca le connessioni dei vari Clients in partite di Monopoli, mantenendo i dati di ogni partita salvata e i vincitori di ogni partita conclusa nel proprio database. Pertanto l’analisi di base rimane la stessa definita in precedenza. Le specifiche funzionali: uso dei frameworks. 2.3 Specifiche consegnate Mantenendo inalterato la “modellazione del dominio” (descritto successivamente) ci focalizzeremo su l’utilizzo di tre frameworks per soddisfare le specifiche di portata. Struts 1.2.9 per i controlli Hibernate per l’interazione col database Ajax per l’interfaccia utente e minimizzare l’interazione con il server. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 17 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 3 Modellazione del dominio L’analisi del dominio è stata articolata in due livelli secondo ordini diversi di granularità. Lo scopo è quello di individuare nel primo approccio le funzionalità di base del sistema in modo tale da dare all’utente un’idea chiara sui servizi che gli vengono messi a disposizione, e nel passo successivo, entrare nel dettaglio nella descrizione di funzioni e dati. 3.1 Analisi del testo L’analisi del testo è un lavoro di ispezione, condotto sulla specifica di portata, per individuare gli attori e le funzionalità di riferimento del sistema. Con queste informazioni inizia l’attività di modellazione del dominio. 3.1.1 Actors Utente: L’utente è quel cliente che accede al sito web. Può solo registrarsi, loggarsi, visualizzare le partite in attesa e salvate, e visualizzare la classifica generale. Giocatore: Il giocatore è quell’utente che è entrato in una partita e può utilizzare a pieno le funzionalità del sito. 3.1.2 Dominio dei dati Le principali strutture dati emerse dall’analisi che caratterizzano il dominio di applicazione sono: Partita: La partita è la struttura principale dell’applicazione e comprende il 90% dell’utilizzo del sito Sala d’attesa: Mantiene traccia delle partite in attesa e delle partite salvate 3.1.3 Requisiti funzionali Le principali funzionalità esportate dal sistema sono: Crea/Partecipa/Ripristina partita: E’ la prima funzione importante che si incontra nell’applicazione, permette di creare, partecipare e ripristinare una partita Tira dadi: E’ la funzione che permette di muovere la tua pedina sul tabellone Trattativa: E’ la funzione che permette di scambiare territori con gl avversari ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 18 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Territori: E’ la funzione che permette di visualizzare i territori di una pedina Salva: E’ la funzione che permette di salvare la partita in corso per poi finirla in un secondo tempo Ritirati: E’ la funzione che permette di ritirarti ed abbandonare la partita Classifica generale: E’ la funzione che permette di visualizzare i punteggi più alti ottenuti dai vincitori delle partite già concluse ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 19 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 3.2 Class Diagram di dominio Il Class Diagram è un diagramma strutturale della famiglia dei diagrammi UML, che modella la rappresentazione e l’organizzazione degli elementi del dominio di analisi in termini di oggetti. Il diagramma si concentra non tanto sulle singole istanze, quanto sulle classi di dominio, che rappresentano insiemi di oggetti omogenei e sulle quali è possibile esprimere proprietà locali attraverso gli attributi. Le proprietà che coinvolgono più di una classe sono invece modellate dalle associazioni o relazioni che, a livello formale, rappresentano delle relazioni matematiche e sono quindi sottoinsiemi del prodotto cartesiano tra le classi su cui insistono. Di seguito viene presentato il class diagram di dominio: Figura 7 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 20 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 3.3 State Diagram Il diagramma degli stati e delle transizioni viene definito per una classe, ed intende descrivere l’evoluzione di un generico oggetto di quella classe. Il diagramma rappresenta le sequenze di stati, le risposte e le azioni, che un oggetto attraversa durante la sua vita in risposta agli stimoli ricevuti. Uno stato rappresenta una situazione in cui un oggetto ha un insieme di proprietà considerate stabili. Una transizione modella un cambiamento di stato. Di seguito descriviamo lo state diagram della classe Contratto come esempio essendo l’unica classe che subisce il cambiamento di stato Figura 8 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 21 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 3.4 Use Case Diagram a basso livello Il diagramma degli use case illustra le funzionalità fondamentali che il sistema deve realizzare, in termini dei suoi scenari di utilizzo. Uno use case rappresenta tipicamente una interazione tra l’utente ed il sistema. Ogni use case è collegato agli utenti (actor) addetti all’utilizzo e ad eventuali altri casi d’uso con cui è relazionato (generalization, extend, include). Il diagramma in sé è un ottimo strumento di raccordo tra l’analista e il committente, ma di fatto non ci dice molto sulle caratteristiche del sistema, se non un’idea di massima sui suoi servizi offerti e da chi sono fruibili. Il punto chiave del diagramma sono le descrizioni degli use case. In queste vengono spiegate cosa fanno le operazioni previste, come deve avvenire l’interazione tra l’utente e il sistema e quali sono le principali eccezioni allo scenario principale. Figura 9 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 22 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 3.5 Descrizione Use Case Diagram Le descrizioni dei casi d’uso devono necessariamente restare in questa fase su un livello abbastanza generico. Questo significa descrizioni corpose nel campo “brief description”, un “main success scenario” fitto di botta-risposta tra utente e sistema ma con degli input e degli output che ancora con riflettono lo schema preciso di presentazione dei dati. Si è cercato poi di lavorare molto sul campo “extensions” per cogliere almeno le più importanti tra le molte eccezioni allo scenario principale. Lo scopo delle prossime fasi sarà proprio quello di entrare nel dettaglio delle descrizioni, snellire lo scenario di successo e specializzare le interazioni tra utente e sistema. 3.6 Use Case Diagram ad alto livello Siamo arrivati al massimo livello di granularità in cui tutti i casi d’uso sono completamente spacchettati. Il diagramma si ramifica andando da un livello astratto ad uno sempre più preciso fino ad avere sulle foglie le funzionalità più elementari. L’obiettivo è quello di impostare l’architettura del sistema con un approccio button-up, in cui le funzionalità complesse vengono viste e trattate come una composizione di funzioni elementari in modo da avere un basso accoppiamento ed una buona modularità. La struttura aiuta poi la pianificazione del progetto ed il calcolo dei function point perché si evita di avere a che fare con operazioni troppo corpose in cui è spesso difficile cogliere tutte le microfunzionalità ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 23 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Figura 10 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 24 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 25 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 26 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 27 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 28 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 29 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 30 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 31 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 32 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 33 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 34 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 35 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 4 Pianificazione 4.1 Pianificazione del progetto La pianificazione ha lo scopo di dare al progetto una stima di riferimento circa i tempi ed i costi di realizzazione. Questa fase, che tipicamente occupa tra il 5% e il 7% dell’intera durata del progetto, è fondamentale perché aiuta ad avere il controllo delle risorse coinvolte, migliora l’organizzazione del team di sviluppo e permette di controllare l’evoluzione del lavoro nel tempo. 4.1.1 Function point Il metodo dei Function point è correntemente lo standard più in voga per stimare la complessità di sviluppo di un progetto software. Presentati in un articolo del 1984 (anche se le prime proposte risalgono al 1975), hanno presto preso piede nel mondo delle software house grazie al fatto che permettono di capire le dimensioni, quindi i costi e i tempi di sviluppo del progetto con una misura empirica basata sulle sue funzionalità, andando di fatto a sostituire quello che fino ad allora era lasciato al parere di un esperto. Il loro problema, essendo abbastanza datati, è quello di essere stati modellati per un software puramente transazionale e non cogliere quindi gli aspetti dinamici tipici delle applicazioni di oggi, in particolare delle web application, tanto che ne esistono varie rivisitazioni che adattano i FP a queste esigenze (OO-FP, Cosmic FP, UML-FP, WEB-FP). Tuttavia risulta la metodologia standard per questo problema e sono, ad oggi, il più forte strumento contrattuale nei rapporti tra l’azienda e il cliente. La versione usata nel nostro progetto e la IFPUG 4.2. 4.1.2 La metodologia La tecnica generale è quella di cercare nei requisiti le funzionalità che caratterizzano il sistema e di valutarle attraverso tre livelli di complessità: semplice, medio, alto. Gli elementi significativi da valutare sono cinque e si distinguono in: Dati Internal Logical File (ILF): Gruppo di dati logico riconoscibile dall’utente, mantenuto e aggiornato all’interno del confine dell’applicazione. External Interface File (EIF): Gruppo di dati logico riconoscibile dall’utente, referenziato dall’applicazione ma che non rientra nel dominio (è un ILF di un’altra applicazione). Gli elementi che stabiliscono la complessità di queste funzioni sono il numero di: o Data Element Type (DET): Campo unico che caratterizza un file, riconoscibile dall’utente. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 36 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ o Record Element Type (RET): Campo corrispondente a un sottogruppo di dati che caratterizzano un file, riconoscibile dall’utente. Transazioni External Input (EI): Funzione elementare atomica che acquisisce dati dall’esterno, li elabora ed aggiorna uno o più ILF. External Output (EO): Funzione elementare atomica che ha lo scopo di presentare dati all’esterno. Un EO è da considerarsi tale solo nel caso in cui esegue almeno una delle seguenti quattro operazioni: 1. 2. 3. 4. Fa calcoli sui dati Crea dati derivati Altera il comportamento del sistema Aggiorna uno o più ILF External Query (EQ): Funzione elementare atomica che ha lo scopo di reperire e presentare dati all’esterno. La differenza con l’EO è che l’EQ si specializza sul reperimento dei dati e dunque non deve eseguire nessuna delle precedenti 4 operazioni. Gli elementi che stabiliscono la complessità di queste funzioni sono il numero di: o File Type Refered (FTR): file manipolato dalla transazione. o Data Element Type (DET): Campo unico che caratterizza un file, riconoscibile dall’utente (i det comuni ad input ed output vanno considerati una sola volta). Dalla somma dei pesi associati alle varie funzionalità si ottengono gli Unadjusted Funcition Point (UFP). Il secondo passo è proprio quello di calcolare il fattore di aggiustamento (F), un parametro correttivo che tiene conto di come deve essere realizzata l’applicazione, delle caratteristiche del suo ambiente di sviluppo e del contesto di lavoro, dal quale saranno poi calcolati gli Adjusted Function Point (AFP). Questo parametro è ottenuto dalla somma di 14 fattori valutati con un punteggio da 0 a 5 ed è in grado di far variare la stima degli UFP del 35%, secondo la seguente formula: AFP = UFP · (0,65 + 0,01 · F) ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 37 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 4.1.3 Pert Il diagramma Pert (Program Evaluation and Review Tecnique), introdotto negli anni ‘50 per la gestione del progetto Polaris della marina americana, è un grafo orientato che riporta la sequenza delle attività coinvolte, le loro durate, e le interdipendenze tra di queste. Ogni attività è rappresentata da un nodo mentre le dipendenza sono rappresentate da archi. Una volta stesa la rete delle attività, è possibile individuare il cammino critico: sequenza di attività che determina l’intera durata del progetto; le parallelizzazioni tra le mansioni, determinanti nel caso di sviluppo concorrente, con i tempi di anticipo e di ritardo massimo su ogni attività. Per il Pert di questo progetto, l’unico punto di riferimento sui tempi è la stima degli FP per fase, quindi l’approccio è stato quello di individuare le attività più importanti di ogni fase, valutarle con delle durate la cui somma rispetti la stima degli FP. A A B B C C Figura 11 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 38 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 4.1.4 Gantt Il diagramma Gantt (da Henry Gantt 1861-1919) è un diagramma temporale, da integrare al Pert, che riporta sull’asse dei tempi tutte le attività rispettando eventuali vincoli temporali. Sul diagramma vengono poi riportate le varie scadenze (milestones) ed i potenziali parallelismi. Figura 12 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 39 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5 Disegno del sistema 5.1 Architettura Hardware Il sistema è disegnato per un’architettura di tipo Client/Server. Lo scenario tipico di impiego è la partita al gioco Monopoli attraverso internet. Il server è composto da una o più macchine sulle quali risiede il Web Server, le Application server e il DBMS. Per la comunicazione la larghezza di banda suggerita è di 1 Mbit/sec notevolmente ridotta rispetto ai 4 Mbit/sec della versione iniziale, per colpa della pesantezza della pagina del tabellone e del contesto a lei associata. 5.1.1 Server I requisiti minimi del server sono essenzialmente legati alla capacità di calcolo della macchina, al sistema operativo e al DBMS installato. Il DBMS utilizzato per lo sviluppo è MySQL 5.1; nella sua documentazione non sono indicati particolari requisiti minimi ed è compatibile con tutti i più noti sistemi operativi. La configurazione minima consigliata è la seguente: Processore 2 Ghz 1024 MB di Ram Hard Disk 200 GB 5.1.2 Client Il client è un semplice calcolatore provvisto di una connessione ad internet. La configurazione minima consigliata è la seguente: Processore 1 Ghz Ram 512 MB Spazio libero di 200 MB ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 40 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.1.3 Piattaforma di sviluppo Notebook Packard Bell (XP) Processore Intel Centrino 1.8 Ghz 1 GB di Ram Hard Disk 80 GB Notebook ASUS (XP) Processore Intel Centrino Duo 1.66 Ghz 1 GB di Ram Hard Disk 80 GB Notebook IBM (XP) Processore Intel Pentium III 900 MHz 256 MB di Ram Hard Disk 20 GB Notebook HP (XP) Processore Intel Centrino 1.2 GHz 512 MB di Ram Hard Disk 100 GB Notebook IBM (XP) Processore Intel Pentium 4 1.9 GHz 512 MB di Ram Hard Disk 40 GB Notebook HP (Vista / Linux-Ubuntu 10.7) Processore AMD Turion 64x2 2.2 GHz GB di Ram Hard Disk 250 GB Desktop Packard Bell (Vista) Processore Intel Core2 Duo 2.13 GHz GB di Ram Hard Disk 500 GB ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 41 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.2 Architettura Software La struttura di base del software segue quella del pattern MVC (Model, View, Controller) in cui i vari componenti dell’applicazione vengono separati in moduli che implementano funzionalità di gestione sui dati (Model/Hibernate), moduli dedicati alla logica di controllo (Controller/Struts 1.2.9) ed i moduli che implementano la logica di presentazione (View/Jsp-Ajax). Questa soluzione è tra le più adottate nel mondo del software design perché risponde bene ai canoni di modularità, flessibilità e manutenibilità delle applicazioni moderne anche se va detto che non sempre viene utilizzata in maniera corretta. Il codice è scritto in java 1.6 con l’impiego dei frameworks sopra descritti: Servlet: Tecnologia java multithreading che estende le funzionalità del Web server completamente portabile e indipendente dal protocollo di comunicazione, anche se, come nel nostro caso, si utilizza Struts 1.2.9 e le servlet le denominiamo Action. Una servlet è in grado di gestire lo stato degli utenti, leggere i dati inviati dal client, manipolarli e passarli ad altri componenti. Java Servlet Pages (JSP): Particolare tipo di servlet che immerge direttamente il codice java all’interno di pagine web. Gli scriplet (statement java) vengono marcati con dei particolari tag e la pagina jsp viene tradotta in una vera e propria servlet dal server al momento dell’invocazione ma utilizzando il MVC cercheremo di lasciare la logica di calcolo al modulo Controller. La logica di accesso ai dati persistenti è stata implementata utilizzando il frameworks Hibernate che oltre a mappare le classi di manipolazione dei dati (Java Bean) gestisce anche il pull di connessioni verso il DB rendendo trasparente all’applicazione il tipo ti DB utilizzato. Le pagine web sono scritte per lo più in HTML con l’aggiunta di qualche script di tipo Javascript (e Ajax) per supportare la presentazione dei dati e per alleggerire un pò la logica di controllo lato server. Per le funzioni Application Server e Servlet Engine è stato utilizzato Apache Tomcat 6.0.28 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 42 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.3 Progetto della base di dati Nel nostro caso la base dati è già disponibile e solidamente testata, ma riportiamo le specifiche di progettazione per completezza. 5.3.1 Progettazione concettuale La progettazione concettuale serve a rappresentare i dati del dominio di interesse attraverso un modello formale ad alto livello che prende il nome di scheda concettuale o schema ER (EntityRelationship). In questa fase siamo ancora fortemente orientati alla modellazione e l’unico aspetto che interessa sono la correttezza nella rappresentazione dei dati. 5.3.1.1 Schema ER Lo schema descrive la struttura del dominio a livello intenzionale ed ha moltissimi concetti analoghi al Class Diagram UML tanto che l’uno può essere ottenuto dall’altro con un processo di traduzione diretta. La differenza di fondo sta nel fatto che l’ER tratta i dati come entità e non come classi di oggetti. Degli altri costrutti utilizzati: relazioni, attributi, generalizzazioni se ne è già parlato nel Class Diagram. È importante scegliere di un identificatore tra gli attributi di entità. Anche in questo caso, gli aspetti sintattici che non vengono colti dal modello possono essere scritti in vincoli esterni. Figura 13 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 43 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.3.1.2 Scelte critiche effettuate nella fase di progettazione E’ stato necessario aggiungere l’attributo “ora” come attributo identificativo alle classe Partita. Questo ci ha consentito di poter gestire il salvataggio di un maggior numero di partite e dando così agli utenti finali una maggiore libertà nella creazione delle stesse. Abbiamo così una terna (data, ora, codice) che identifica l’oggetto partita. 5.3.2 Progettazione logica Si passa ora dal modello relazionale allo schema logico della base dati. Vengono ora presi in considerazione anche aspetti legati all’efficienza e alle prestazioni, per questo lo schema e gli eventuali vincoli, devono essere corredati dalle informazioni rilevanti sul carico applicativo. 5.3.2.1 Ristrutturazione schema ER Questa fase serve a rendere lo schema direttamente traducibile in schema logico, senza ulteriori scelte progettuali. La ristrutturazione si concentra su quei costrutti che non possono essere colti dalla struttura relazionale del database ed i punti che vengono trattati, nel nostro caso, sono: 5.3.2.2 Schema ER ristrutturato Figura 14 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 44 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.3.2.3 Schema logico Utente (nome, cognome, dataNascita, nick, password, e-mail) Giocatore(nome, cognome, dataNascita, nick, password, e-mail) foreign key Giocatore [nick] ≤ Utente [nick] foreign key Giocatore [nick] ≤ Utilizza [nickU] foreign key Giocatore [nick] ≤ Sosta [nickS] inclusion Giocatore [nick] ≤ Partecipa [nickP] Utilizza (nickU, codiceU, dataU, oraU, pedina) foreign key Utilizza [nickU] ≤ Giocatore [nick] foreign key Utilizza [codiceU, dataU, oraU] ≤ Partita [codice, data, ora] inclusion Utilizza [pedina] ≤ Pedina [immagine] Pedina (immagine) inclusion Pedina [immagine] ≤ Utilizza [pedina] Sosta (nickS, codiceS, dataS, oraS, casella) foreign key Sosta [nickS] ≤ Giocatore [nick] foreign key Sosta [codiceS, dataS, oraS] ≤ Partita [codice, data, ora] inclusion Sosta [casella] ≤ Caselle [NumCasella] Partecipa (nickP, codiceP, data, ora, soldi) foreign key Partecipa[nickP] ≤ Giocatore [nick] foreign key Partecipa [codiceP, dataP, oraP] ≤ Partita [codice, data, ora] Partita (data, codice, data, ora) foreign key Partita[codice, data, ora] ≤ Possiede [codicePO, dataPO, oraPO] foreign key Partita[codice, data, ora] ≤ Ha [codiceH, dataPO, oraPO] inclusion Partita[codice, data, ora] ≤ Partecipa [codiceP, dataP, oraP] foreign key Partita[codice, data, ora] ≤ Vincitore [codiceV, dataV, oraV] foreign key Partita[codice, data, ora] ≤ Utilizza [codiceU, dataU, oraU] foreign key Partita[codice, data, ora] ≤ Sosta [codiceS, dataS, oraS] Vincitore (Saldofinale, nickV, codiceV, dataV, oraV) foreign key Vincitore[codiceV, dataV, oraV] ≤ Partita[codice, data, ora] foreign key Vincitore [nickV] ≤ Giocatore [nick] Possiede (codicePO, nickPO, contratto) foreign key Possiede [nickPO] ≤ Giocatore [nick] foreign key Possiede [codicePO, dataPO, oraPO] ≤ Partita [codice, data, ora] foreign key Possiede [contratto] ≤ Contratto [nome] Contratto (pedaggio, nome, prezzo, ipoteca) foreign key Contratto [nome] ≤ Possiede [contratto] foreign key Contratto [nome]≤ Associato [nomeC] Associato (nomeA, coloreA) Foreign key Associato [nomeA] ≤ Contratto [nome] Foreign key Associato [coloreA] ≤ Territorio [colore] Edificabile (valoreCasa, nomeE) foreign key Edificabile [nomeE] ≤ Contratto [nome] inclusion Edificabile [nomeE] ≤ Ha [nomeH] Ha (numeroCase, nickH, codiceH, dataH, oraH, nomeH) foreign key Ha [nickH] ≤ Giocatore [nick] foreign key Ha [codiceH, dataH, oraH] ≤ Partita [codice, data, ora] ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 45 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ foreign key Ha [nomeH] ≤ Edificabile [nomeC] NonEdificabile (nomeNE) foreign key NonEdificabile [nomeC] ≤ Contratto [nome] Caselle (numCasella, nomeC) inclusion key Caselle [numCasella] ≤ Sosta [casella] Speciali (soldi, testo, numCasellaS) foreign key [numCasellaS] ≤ casella [numCasella] Territori (colore, numCasellaT) foreign key Territori [numCasellaT] ≤ Caselle [numCasella] foreign key Territori [colore] ≤ Associato [coloreA] Carte (numId, testo, importo) Imprevisti (numIdI) foreign key Imprevisti [numIdI] ≤ Carte [numId] Probabilità (numIdP) foreign key Probabilità [numIdP] ≤ Carte [numId] 5.3.2.4 Vincoli Vincoli esterni: La terna Giocatore G, Partita P, Edificabile E della relazione “possiede” deve essere uguale alla terna presente nella relazione “Ha” 5.3.2.5 Politiche di cancellazione Per quanto riguarda le politiche di cancellazione, abbiamo scelto di eliminare i dati all’interno della base dopo l’operazione di ripristino perché in caso della terminazione della partita non abbiamo più bisogno di memorizzare i dati avendo così un risparmio eliminando così la fase di update. Tutto funziona alla perfezione con solo le due fasi di inserimento e cancellazione. I dati della partita restano disponibili a runtime e in caso di interruzione, si ha la fase di salvataggio (insert) che va a memorizzare tutti i dati sulla base, mentre in caso di terminazione gli unici dati salvati sono quelli relativi alla classifica generale (Vincitore, Partita e Saldo finale). 5.3.2.6 Viste Non sono state necessarie viste per il progetto. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 46 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.3.2.7 Creazione del DB con popolamento tabelle drop database monopoli; create database monopoli; use monopoli; drop table Utente; Create table Utente ( nome character (30) not null, cognome character (30) not null, dataNascita character (10) not null, nick character (30) primary key, password character (30) not null, e_mail character (62) not null, unique (nome, cognome, dataNascita) ); drop table Partita; Create table Partita ( codice character (30) not null, data character (10) not null, ora character (10) not null, unique (codice, data, ora) ); drop table Pedina; create table Pedina ( immagine character (8) primary key ); drop table Sosta; Create table Sosta( nickS character (30) not null, codiceS character (30) not null, dataS character (10) not null, oraS character (10) not null, casella integer not null, primary key (nickS, codiceS, dataS, oraS, casella), foreign key (nickS) references Utente (nick) ON DELETE CASCADE ON UPDATE CASCADE, foreign key (codiceS, dataS, oraS) references Partita (codice, data, ora) ON DELETE CASCADE ON UPDATE CASCADE ); drop table Partecipa; Create table Partecipa( ordine int (1) not null, soldi int (10) not null, nickP character (30) not null, codiceP character (30) not null, dataP character (10) not null, oraP character (10) not null, primary key (nickP, codiceP, dataP, oraP), foreign key (nickP) references Utente (nick) ON DELETE CASCADE ON UPDATE CASCADE, foreign key (codiceP, dataP, oraP) references Partita (codice, data, ora) ON DELETE CASCADE ON UPDATE CASCADE ); drop table Contratto; create table Contratto( pedaggio integer (4) not null, nome character (30) primary key, prezzo integer (4) not null, ipoteca integer (4) not null ); drop table Possiede; Create table Possiede( nickP character (30) not null, codiceP character (30) not null, dataP character (10) not null, oraP character (10) not null, contratto character (30) not null, ipoteca bit not null, primary key (nickP, codiceP, dataP, oraP, contratto), foreign key (codiceP, dataP, oraP) references Partita (codice, data, ora) ON DELETE CASCADE ON UPDATE CASCADE, foreign key (nickP) references Utente (nick) ON DELETE CASCADE ON ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 47 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ UPDATE CASCADE, foreign key (contratto) references Contratto (nome) ON DELETE CASCADE ON UPDATE CASCADE ); drop table Edificabile; Create table Edificabile( valoreCasa integer (4) not null, nomeE character (30) not null, unique (valoreCasa, nomeE), foreign key (nomeE) references Contratto (nome)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Ha; Create table Ha( numeroCase integer (4) not null, nickH character (30) not null, codiceH character (30) not null, dataH character (10) not null, oraH character (10) not null, nomeH character (30) not null, primary key (nickH, codiceH, dataH, oraH, nomeH), foreign key (nickH) references Utente (nick)ON DELETE CASCADE ON UPDATE CASCADE, foreign key (codiceH, dataH, oraH) references Partita (codice, data, ora)ON DELETE CASCADE ON UPDATE CASCADE, foreign key (nomeH) references Edificabile (nomeE)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Caselle; Create table Caselle( numCasella integer (2) primary key, nome character (30) not null ); drop table Speciali; Create table Speciali( soldi integer (4) default 0, testo varchar (300) not null, numCaselleS integer (2) primary key, foreign key (numCaselleS) references Caselle (numCasella)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Territori; Create table Territori( colore character (30) not null, numCasellaT integer (2) primary key, foreign key (numCasellaT) references Caselle (numCasella)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Carte; Create table Carte( numId integer (2) primary key, testo varchar (300) not null, importo integer (4) default '0' ); drop table Imprevisti; Create table Imprevisti( numIdI integer (2) primary key references carte (numId), foreign key (numIdI) references Carte (numId)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Probabilita; Create table Probabilita( numIdP integer (2) primary key, foreign key (numIdP) references Carte (numId)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Utilizza; Create table Utilizza ( nickU character (30) not null, codiceU character (30) not null, dataU character (10) not null, oraU character (10) not null, pedina character (8) not null, primary key (nickU, codiceU,dataU, oraU, pedina), foreign key (nickU) references Utente (nick)ON DELETE CASCADE ON UPDATE CASCADE, ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 48 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ foreign key (codiceU, dataU, oraU) references Partita (codice, data, ora)ON DELETE CASCADE ON UPDATE CASCADE, foreign key (pedina) references Pedina (immagine)ON DELETE CASCADE ON UPDATE CASCADE ); drop table Associato; create table Associato( nomeA character (30) primary key, numcasellaA integer (2) not null, foreign key (nomeA) references Contratto (nome)ON DELETE CASCADE ON UPDATE CASCADE, foreign key (numcasellaA) references Territori (NumcasellaT)ON DELETE CASCADE ON UPDATE CASCADE ); drop table CaseAlberghi; create table CaseAlberghi( nomeCA character (30) not null, numero integer (2) not null, costo integer (5) not null, unique (nomeCA, numero, costo), foreign key (nomeCA) references Contratto (nome)ON DELETE CASCADE ON UPDATE CASCADE ); insert into Contratto values (60,'Stazione Nord', 480, 250); insert into Contratto values (60, 'Stazione Sud', 480, 250); insert into Contratto values (60, 'Stazione Est', 480, 250); insert into Contratto values (60, 'Stazione Ovest', 480, 250); insert into Contratto values (5, 'Vicolo Corto', 150, 75); insert into Contratto values (10, 'Vicolo Stretto', 150, 75); insert into Contratto values (15, 'Bastioni Gran Sasso', 250, 125); insert into Contratto values (15, 'Viale Monterosa', 250, 125); insert into Contratto values (20, 'Viale Vesuvio', 300, 150); insert into Contratto values (25, 'Via Accademia', 350, 175); insert into Contratto values (25, 'Corso Ateneo', 350, 175); insert into Contratto values (30, 'Piazza Universita', 400, 200); insert into Contratto values (35, 'Via Verdi', 450, 225); insert into Contratto values (35, 'Corso Raffaello', 450, 225); insert into Contratto values (40, 'Piazza Dante', 500, 250); insert into Contratto values (45, 'Via Marco Polo', 550, 275); insert into Contratto values (45, 'Corso Magellano', 550, 275); insert into Contratto values (50, 'Largo Colombo', 600, 300); insert into Contratto values (55, 'Viale Costantino', 650, 325); insert into Contratto values (55, 'Viale Traiano', 650, 325); insert into Contratto values (60, 'Piazza Giulio Cesare', 700, 350); insert into Contratto values (65, 'Via Roma', 750, 375); insert into Contratto values (65, 'Corso Impero', 750, 375); insert into Contratto values (70, 'Largo Augusto', 800, 400); insert into Contratto values (90, 'Viale dei Giardini', 900, 450); insert into Contratto values (125, 'Parco della Vittoria', 1000, 500); insert into Contratto values (50, 'Societa Elettrica', 380, 190); insert into Contratto values (50, 'Societa Acqua Potabile', 380, 190); insert into Edificabile values (125, 'Vicolo Corto'); insert into Edificabile values (125, 'Vicolo Stretto'); insert into Edificabile values (125, 'Bastioni Gran Sasso'); insert into Edificabile values (125, 'Viale Monterosa'); insert into Edificabile values (125, 'Viale Vesuvio'); insert into Edificabile values (250, 'Via Accademia'); insert into Edificabile values (250, 'Corso Ateneo'); insert into Edificabile values (250, 'Piazza Universita'); insert into Edificabile values (250, 'Via Verdi'); insert into Edificabile values (250, 'Corso Raffaello'); insert into Edificabile values (250, 'Piazza Dante'); insert into Edificabile values (375, 'Via Marco Polo'); insert into Edificabile values (375, 'Corso Magellano'); insert into Edificabile values (375, 'Largo Colombo'); insert into Edificabile values (375, 'Viale Costantino'); insert into Edificabile values (375, 'Viale Traiano'); insert into Edificabile values (375, 'Piazza Giulio Cesare'); insert into Edificabile values (500, 'Via Roma'); insert into Edificabile values (500, 'Corso Impero'); insert into Edificabile values (500, 'Largo Augusto'); insert into Edificabile values (500, 'Viale dei Giardini'); insert into Edificabile values (500, 'Parco della Vittoria'); insert into Caselle values ( 01,'Vicolo Corto'); insert into Caselle values ( 02,'Probabilita'); insert into Caselle values ( 03,'Vicolo Stretto'); ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 49 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ insert into Caselle values ( 04,'Tassa Patrimoniale'); insert into Caselle values ( 05,'Stazione Sud'); insert into Caselle values ( 06,'Bastioni Gran Sasso'); insert into Caselle values ( 07,'Imprevisti'); insert into Caselle values ( 08,'Viale Monterosa'); insert into Caselle values ( 09,'Viale Vesuvio'); insert into Caselle values ( 10,'Prigione - Transito'); insert into Caselle values ( 11,'Via Accademia'); insert into Caselle values ( 12,'Societa Elettrica'); insert into Caselle values ( 13,'Corso Ateneo'); insert into Caselle values ( 14,'Piazza Universita'); insert into Caselle values ( 15,'Stazione Ovest'); insert into Caselle values ( 16,'Via Verdi'); insert into Caselle values ( 17,'Probabilita'); insert into Caselle values ( 18,'Corso Raffaello'); insert into Caselle values ( 19,'Piazza Dante'); insert into Caselle values ( 20,'Parcheggio Gratuito'); insert into Caselle values ( 21,'Via Marco Polo'); insert into Caselle values ( 22,'Imprevisti'); insert into Caselle values ( 23,'Corso Magellano'); insert into Caselle values ( 24,'Largo Colombo'); insert into Caselle values ( 25,'Stazione Nord'); insert into Caselle values ( 26,'Viale Costantino'); insert into Caselle values ( 27,'Viale Traiano'); insert into Caselle values ( 28,'Societa Acqua Potabile'); insert into Caselle values ( 29,'Piazza Giulio Cesare'); insert into Caselle values ( 30,'Prigione'); insert into Caselle values ( 31,'Via Roma'); insert into Caselle values ( 32,'Corso Impero'); insert into Caselle values ( 33,'Probabilita'); insert into Caselle values ( 34,'Largo Augusto'); insert into Caselle values ( 35,'Stazione Est'); insert into Caselle values ( 36,'Imprevisti'); insert into Caselle values ( 37,'Viale dei Giardini'); insert into Caselle values ( 38,'Tassa di Lusso'); insert into Caselle values ( 39,'Parco della Vittoria'); insert into Caselle values ( 40, 'Via'); insert into Territori values ('Rosa',01); insert into Territori values ('Rosa', 03); insert into Territori values ('Stazione', 05); insert into Territori values ('Celeste', 06); insert into Territori values ('Celeste', 08); insert into Territori values ('Celeste', 09); insert into Territori values ('Arancione',11); insert into Territori values ('Societa', 12); insert into Territori values ('Arancione', 13); insert into Territori values ('Arancione', 14); insert into Territori values ('Stazione', 15); insert into Territori values ('Marrone',16); insert into Territori values ('Marrone', 18); insert into Territori values ('Marrone',19); insert into Territori values ('Rosso', 21); insert into Territori values ('Rosso', 23); insert into Territori values ('Rosso', 24); insert into Territori values ('Stazione', 25); insert into Territori values ('Giallo', 26); insert into Territori values ('Giallo', 27); insert into Territori values ('Societa', 28); insert into Territori values ('Giallo',29); insert into Territori values ( 'Verde',31); insert into Territori values ('Verde', 32); insert into Territori values ('Verde', 34); insert into Territori values ('Stazione', 35); insert into Territori values ('Viola', 37); insert into Territori values ('Viola', 39); insert into Carte values (01, 'Maturano le cedole delle vostre cartelle di rendita, ritirate 375 Euro', 375); insert into Carte values (02, 'Matrimonio in famiglia spese impreviste 375 Euro',375); insert into Carte values (03, 'Andate fino al Parco della Vittoria', 0); insert into Carte values (04, 'Andate avanti fino al VIA', 0); insert into Carte values (05, 'Andate sino a Via Accademia: se passate dal <<Via!>> ritirate 500 Euro', 500); insert into Carte values (06, 'Fate tre passi indietro (con tanti auguri!)', 0); insert into Carte values (07, 'Cena fuori con la tua metà, pagate 50 Euro', 50); insert into Carte values (08, 'Andate in prigione direttamente e senza passare ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 50 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ dal <<Via!>>', 0); insert into Carte values (09, 'Avete tutti i vostri stabili da riparare: pagare 60 Euro per ogni casa e 250 Euro per ogni albergo', 0); insert into Carte values (10, 'Andate sino al Largo Colombo se passate dal <<Via!>> ritirate 500 Euro', 500); insert into Carte values (11, 'Dovete pagare un contributo di miglioria stradale, 100 Euro per ogni casa e 250 Euro per ogni albergo che possedete', 0); insert into Carte values (12, 'Avete vinto un terno al lotto: ritirate 250 Euro', 250); insert into Carte values (13, 'Versate 50 Euro per beneficenza', 50); insert into Carte values (14, 'Andate alla Stazione NORD: se passate dal <<Via!>> ritirate 500 Euro', 500); insert into Carte values (15, 'La banca vi paga gli interessi del vostro conto corrente, ritirate 125 Euro', 125); insert into Carte values (16, 'Multa di 40 Euro per aver guidato senza patente', 40); insert into Carte values (17, 'Andate fino al <<Via!>>', 0); insert into Carte values (18, 'Andate in prigione direttamente e senza passare dal <<Via!>>', 0); insert into Carte values (19, 'Cena fuori con la tua metà, pagate 50 Euro', 50); insert into Carte values (20, 'Complimenti S maturata la cedola delle vostre azioni ritirate 60 Euro', 60); insert into Carte values (21, 'Pagate una multa di 25 Euro', 25); insert into Carte values (22, 'Avete vinto il secondo premio in un concorso di bellezza: ritirate 25 Euro', 25); insert into Carte values (23, 'Ritornate al Vicolo Corto', 0); insert into Carte values (24, 'Scade il vostro premio di assicrazione pagate 125 Euro', 125); insert into Carte values (25, 'Avete perso una causa: pagate 250 Euro', 250); insert into Carte values (26, 'Ereditate da un lontano parente 250 Euro', 250); insert into Carte values (27, 'Pagate il conto del Dottore: 125 Euro', 125); insert into Carte values (28, 'Rimborso tassa sul reddito: ritirate 50 Euro dalla Banca', 50); insert into Carte values (29, 'Auguri!!! il vostro compleanno: ogni giocatore vi regala 25 Euro', 25); insert into Carte values (30, 'Avete venduto delle azioni ricavate 125 Euro', 125); insert into Carte values (31, 'Siete creditori verso la Banca di 500 Euro: ritirateli', 500); insert into Carte values (32, 'Avete vinto un premio di consolazione alla Lotteria di Merano: ritirate 250 Euro', 250); insert into Imprevisti values (01); insert into Imprevisti values (02); insert into Imprevisti values (03); insert into Imprevisti values (04); insert into Imprevisti values (05); insert into Imprevisti values (06); insert into Imprevisti values (07); insert into Imprevisti values (08); insert into Imprevisti values (09); insert into Imprevisti values (10); insert into Imprevisti values (11); insert into Imprevisti values (12); insert into Imprevisti values (13); insert into Imprevisti values (14); insert into Imprevisti values (15); insert into Imprevisti values (16); insert into Probabilita values (17); insert into Probabilita values (18); insert into Probabilita values (19); insert into Probabilita values (20); insert into Probabilita values (21); insert into Probabilita values (22); insert into Probabilita values (23); insert into Probabilita values (24); insert into Probabilita values (25); insert into Probabilita values (26); insert into Probabilita values (27); insert into Probabilita values (28); insert into Probabilita values (29); insert into Probabilita values (30); insert into Probabilita values (31); insert into Probabilita values (32); insert into Associato values ('Bastioni Gran Sasso', 06); insert into Associato values ('Corso Ateneo', 13); insert into Associato values ('Corso Impero', 32); ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 51 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert insert into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into into Associato values ('Corso Magellano', 23); Associato values ('Corso Raffaello', 18); Associato values ('Largo Augusto', 24); Associato values ('Largo Colombo', 34); Associato values ('Parco della Vittoria', 39); Associato values ('Piazza Dante', 19); Associato values ('Piazza Giulio Cesare', 29); Associato values ('Piazza Universita', 14); Associato values ('Societa Acqua Potabile', 28); Associato values ('Societa Elettrica', 12); Associato values ('Stazione Est', 35); Associato values ('Stazione Nord', 25); Associato values ('Stazione Ovest', 15); Associato values ('Stazione Sud', 05); Associato values ('Via Accademia', 11); Associato values ('Via Marco Polo', 21); Associato values ('Via Roma', 31); Associato values ('Via Verdi', 16); Associato values ('Viale Costantino', 26); Associato values ('Viale dei Giardini', 37); Associato values ('Viale Monterosa', 08); Associato values ('Viale Traiano', 27); Associato values ('Viale Vesuvio', 09); Associato values ('Vicolo Corto', 01); Associato values ('Vicolo Stretto', 03); Pedina values ('Fiasco'); Pedina values ('Fungo'); Pedina values ('Candela'); Pedina values ('Pianta'); Pedina values ('Pera'); Pedina values ('Mela'); CaseAlberghi values ('Vicolo Corto', 01, 25); CaseAlberghi values ('Vicolo Corto', 02, 75); CaseAlberghi values ('Vicolo Corto', 03, 225); CaseAlberghi values ('Vicolo Corto', 04, 400); CaseAlberghi values ('Vicolo Corto', 05, 625); CaseAlberghi values ('Vicolo Stretto', 01, 50); CaseAlberghi values ('Vicolo Stretto', 02, 150); CaseAlberghi values ('Vicolo Stretto', 03, 450); CaseAlberghi values ('Vicolo Stretto', 04, 800); CaseAlberghi values ('Vicolo Stretto', 05, 1125); CaseAlberghi values ('Bastioni Gran Sasso', 01,75); CaseAlberghi values ('Bastioni Gran Sasso', 02,225); CaseAlberghi values ('Bastioni Gran Sasso', 03,675); CaseAlberghi values ('Bastioni Gran Sasso', 04,1000); CaseAlberghi values ('Bastioni Gran Sasso', 05,1375); CaseAlberghi values ('Viale Monterosa', 01, 75); CaseAlberghi values ('Viale Monterosa', 02, 225); CaseAlberghi values ('Viale Monterosa', 03, 675); CaseAlberghi values ('Viale Monterosa', 04, 1000); CaseAlberghi values ('Viale Monterosa', 05, 1375); CaseAlberghi values ('Viale Vesuvio', 01, 100); CaseAlberghi values ('Viale Vesuvio', 02, 250); CaseAlberghi values ('Viale Vesuvio', 03, 750); CaseAlberghi values ('Viale Vesuvio', 04, 1125); CaseAlberghi values ('Viale Vesuvio', 05, 1500); CaseAlberghi values ('Via Accademia', 01, 125); CaseAlberghi values ('Via Accademia', 02, 375); CaseAlberghi values ('Via Accademia', 03, 1125); CaseAlberghi values ('Via Accademia', 04, 1550); CaseAlberghi values ('Via Accademia', 05, 1875); CaseAlberghi values ('Corso Ateneo', 01, 125); CaseAlberghi values ('Corso Ateneo', 02, 175); CaseAlberghi values ('Corso Ateneo', 03, 1125); CaseAlberghi values ('Corso Ateneo', 04, 1550); CaseAlberghi values ('Corso Ateneo', 05, 1875); CaseAlberghi values ('Piazza Universita', 01, 150); CaseAlberghi values ('Piazza Universita', 02, 450); CaseAlberghi values ('Piazza Universita', 03, 1250); CaseAlberghi values ('Piazza Universita', 04, 1750); CaseAlberghi values ('Piazza Universita', 05, 2250); CaseAlberghi values ('Via Verdi', 01, 175); CaseAlberghi values ('Via Verdi', 02, 500); CaseAlberghi values ('Via Verdi', 03, 1375); CaseAlberghi values ('Via Verdi', 04, 1875); CaseAlberghi values ('Via Verdi', 05, 2375); ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 52 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ insert into CaseAlberghi values ('Corso Raffaello', 01, 175); insert into CaseAlberghi values ('Corso Raffaello', 02, 500); insert into CaseAlberghi values ('Corso Raffaello', 03, 1375); insert into CaseAlberghi values ('Corso Raffaello', 04, 1875); insert into CaseAlberghi values ('Corso Raffaello', 05, 2375); insert into CaseAlberghi values ('Piazza Dante', 01, 200); insert into CaseAlberghi values ('Piazza Dante', 02, 550); insert into CaseAlberghi values ('Piazza Dante', 03, 1500); insert into CaseAlberghi values ('Piazza Dante', 04, 2000); insert into CaseAlberghi values ('Piazza Dante', 05, 2500); insert into CaseAlberghi values ('Via Marco Polo', 01, 225); insert into CaseAlberghi values ('Via Marco Polo', 02, 625); insert into CaseAlberghi values ('Via Marco Polo', 03, 1750); insert into CaseAlberghi values ('Via Marco Polo', 04, 2200); insert into CaseAlberghi values ('Via Marco Polo', 05, 2625); insert into CaseAlberghi values ('Corso Magellano', 01, 225); insert into CaseAlberghi values ('Corso Magellano', 02, 625); insert into CaseAlberghi values ('Corso Magellano', 03, 1750); insert into CaseAlberghi values ('Corso Magellano', 04, 2200); insert into CaseAlberghi values ('Corso Magellano', 05, 2625); insert into CaseAlberghi values ('Largo Colombo', 01, 250); insert into CaseAlberghi values ('Largo Colombo', 02, 750); insert into CaseAlberghi values ('Largo Colombo', 03, 1875); insert into CaseAlberghi values ('Largo Colombo', 04, 2250); insert into CaseAlberghi values ('Largo Colombo', 05, 2750); insert into CaseAlberghi values ('Viale Costantino', 01, 275); insert into CaseAlberghi values ('Viale Costantino', 02, 825); insert into CaseAlberghi values ('Viale Costantino', 03, 2000); insert into CaseAlberghi values ('Viale Costantino', 04, 2500); insert into CaseAlberghi values ('Viale Costantino', 05, 3000); insert into CaseAlberghi values ('Viale Traiano', 01, 275); insert into CaseAlberghi values ('Viale Traiano', 02, 825); insert into CaseAlberghi values ('Viale Traiano', 03, 2000); insert into CaseAlberghi values ('Viale Traiano', 04, 2500); insert into CaseAlberghi values ('Viale Traiano', 05, 3000); insert into CaseAlberghi values ('Piazza Giulio Cesare', 01, 300); insert into CaseAlberghi values ('Piazza Giulio Cesare', 02, 900); insert into CaseAlberghi values ('Piazza Giulio Cesare', 03, 2125); insert into CaseAlberghi values ('Piazza Giulio Cesare', 04, 2625); insert into CaseAlberghi values ('Piazza Giulio Cesare', 05, 3125); insert into CaseAlberghi values ('Via Roma', 01, 325); insert into CaseAlberghi values ('Via Roma', 02, 1000); insert into CaseAlberghi values ('Via Roma', 03, 2250); insert into CaseAlberghi values ('Via Roma', 04, 2750); insert into CaseAlberghi values ('Via Roma', 05, 3250); insert into CaseAlberghi values ('Corso Impero', 01, 325); insert into CaseAlberghi values ('Corso Impero', 02, 1000); insert into CaseAlberghi values ('Corso Impero', 03, 2250); insert into CaseAlberghi values ('Corso Impero', 04, 2750); insert into CaseAlberghi values ('Corso Impero', 05, 3250); insert into CaseAlberghi values ('Largo Augusto', 01, 375); insert into CaseAlberghi values ('Largo Augusto', 02, 1125); insert into CaseAlberghi values ('Largo Augusto', 03, 2500); insert into CaseAlberghi values ('Largo Augusto', 04, 3000); insert into CaseAlberghi values ('Largo Augusto', 05, 3500); insert into CaseAlberghi values ('Viale dei Giardini', 01, 500); insert into CaseAlberghi values ('Viale dei Giardini', 02, 1250); insert into CaseAlberghi values ('Viale dei Giardini', 03, 2750); insert into CaseAlberghi values ('Viale dei Giardini', 04, 3000); insert into CaseAlberghi values ('Viale dei Giardini', 05, 3500); insert into CaseAlberghi values ('Parco della Vittoria', 01, 500); insert into CaseAlberghi values ('Parco della Vittoria', 02, 1500); insert into CaseAlberghi values ('Parco della Vittoria', 03, 3500); insert into CaseAlberghi values ('Parco della Vittoria', 04, 4250); insert into CaseAlberghi values ('Parco della Vittoria', 05, 5000); drop table Turno; create table Turno( nickT character (30) not null, codiceT character (30) not null, dataT character (10) not null, oraT character (10) not null, primary key (nickT, codiceT,dataT, oraT), foreign key (nickT) references Utente (nick) ON DELETE CASCADE ON UPDATE CASCADE ); drop table Vincitore; ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 53 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Create table Vincitore( saldofinale int (10) not null, nickV character (30) not null, codiceV character (30) not null, dataV character (10) not null, oraV character (10) not null, primary key (codiceV, dataV, oraV) ); drop table URL; Create table URL ( Nome character (30) not null, Url character (100) primary key, unique (Nome, Url) ); insert into Url values ('Vicolo Stretto', 'prototipofreddo5Territori_files/VicoloStretto.jpg'); insert into Url values ('Vicolo StrettoR', 'prototipofreddo5Territori_files/VicoloStretto_retro.jpg'); insert into Url values ('Vicolo Corto', 'prototipofreddo5Territori_files/VicoloCorto.jpg'); insert into Url values ('Vicolo CortoR', 'prototipofreddo5Territori_files/VicoloCorto_retro.jpg'); insert into Url values ('Viale Vesuvio', 'prototipofreddo5Territori_files/VialeVesuvio.jpg'); insert into Url values ('Viale VesuvioR', 'prototipofreddo5Territori_files/VialeVesuvio_retro.jpg'); insert into Url values ('Viale Traiano', 'prototipofreddo5Territori_files/VialeTraiano.jpg'); insert into Url values ('Viale TraianoR', 'prototipofreddo5Territori_files/VialeTraiano_retro.jpg'); insert into Url values ('Viale Monterosa', 'prototipofreddo5Territori_files/VialeMonterosa.jpg'); insert into Url values ('Viale MonterosaR', 'prototipofreddo5Territori_files/VialeMonterosa_retro.jpg'); insert into Url values ('Viale dei Giardini', 'prototipofreddo5Territori_files/VialeDeiGiardini.jpg'); insert into Url values ('Viale dei GiardiniR', 'prototipofreddo5Territori_files/VialeDeiGiardini_retro.jpg'); insert into Url values ('Viale Costantino', 'prototipofreddo5Territori_files/VialeCostantino.jpg'); insert into Url values ('Viale CostantinoR', 'prototipofreddo5Territori_files/VialeCostantino_retro.jpg'); insert into Url values ('Via Verdi', 'prototipofreddo5Territori_files/ViaVerdi.jpg'); insert into Url values ('Via VerdiR', 'prototipofreddo5Territori_files/ViaVerdi_retro.jpg'); insert into Url values ('Via Roma', 'prototipofreddo5Territori_files/ViaRoma.jpg'); insert into Url values ('Via RomaR', 'prototipofreddo5Territori_files/ViaRoma_retro.jpg'); insert into Url values ('Via Marco Polo', 'prototipofreddo5Territori_files/ViaMarcoPolo.jpg'); insert into Url values ('Via Marco PoloR', 'prototipofreddo5Territori_files/ViaMarcoPolo_retro.jpg'); insert into Url values ('Via Accademia', 'prototipofreddo5Territori_files/ViaAccademia.jpg'); insert into Url values ('Via AccademiaR', 'prototipofreddo5Territori_files/ViaAccademia_retro.jpg'); insert into Url values ('Stazione Sud', 'prototipofreddo5Territori_files/StazioneSud.jpg'); insert into Url values ('Stazione SudR', 'prototipofreddo5Territori_files/StazioneSud_retro.jpg'); insert into Url values ('Stazione Ovest', 'prototipofreddo5Territori_files/StazioneOvest.jpg'); insert into Url values ('Stazione OvestR', 'prototipofreddo5Territori_files/StazioneOvest_retro.jpg'); insert into Url values ('Stazione Nord', 'prototipofreddo5Territori_files/StazioneNord.jpg'); insert into Url values ('Stazione NordR', 'prototipofreddo5Territori_files/StazioneNord_retro.jpg'); insert into Url values ('Stazione Est', 'prototipofreddo5Territori_files/StazioneEst.jpg'); insert into Url values ('Stazione EstR', 'prototipofreddo5Territori_files/StazioneEst_retro.jpg'); insert into Url values ('Societa Elettrica', 'prototipofreddo5Territori_files/SocietaElettrica.jpg'); ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 54 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ insert into Url values ('Societa ElettricaR', 'prototipofreddo5Territori_files/SocietaElettrica_retro.jpg'); insert into Url values ('Societa Acqua Potabile', 'prototipofreddo5Territori_files/SocietaAcquaPotabile.jpg'); insert into Url values ('Societa Acqua PotabileR', 'prototipofreddo5Territori_files/SocietaAcquaPotabile_retro.jpg'); insert into Url values ('Piazza Universita', 'prototipofreddo5Territori_files/PiazzaUniversita.jpg'); insert into Url values ('Piazza UniversitaR', 'prototipofreddo5Territori_files/PiazzaUniversita_retro.jpg'); insert into Url values ('Piazza Giulio Cesare', 'prototipofreddo5Territori_files/PiazzaGiulioCesare.jpg'); insert into Url values ('Piazza Giulio CesareR', 'prototipofreddo5Territori_files/PiazzaGiulioCesare_retro.jpg'); insert into Url values ('Piazza Dante', 'prototipofreddo5Territori_files/PiazzaDante.jpg'); insert into Url values ('Piazza DanteR', 'prototipofreddo5Territori_files/PiazzaDante_retro.jpg'); insert into Url values ('Parco della Vittoria', 'prototipofreddo5Territori_files/ParcoDellaVittoria.jpg'); insert into Url values ('Parco della VittoriaR', 'prototipofreddo5Territori_files/ParcoDellaVittoria_retro.jpg'); insert into Url values ('Largo Colombo', 'prototipofreddo5Territori_files/LargoColombo.jpg'); insert into Url values ('Largo ColomboR', 'prototipofreddo5Territori_files/LargoColombo_retro.jpg'); insert into Url values ('Largo Augusto', 'prototipofreddo5Territori_files/LargoAugusto.jpg'); insert into Url values ('Largo AugustoR', 'prototipofreddo5Territori_files/LargoAugusto_retro.jpg'); insert into Url values ('Corso Raffaello', 'prototipofreddo5Territori_files/CorsoRaffaello.jpg'); insert into Url values ('Corso RaffaelloR', 'prototipofreddo5Territori_files/CorsoRaffaello_retro.jpg'); insert into Url values ('Corso Magellano', 'prototipofreddo5Territori_files/CorsoMagellano.jpg'); insert into Url values ('Corso MagellanoR', 'prototipofreddo5Territori_files/CorsoMagellano_retro.jpg'); insert into Url values ('Corso Impero', 'prototipofreddo5Territori_files/CorsoImpero.jpg'); insert into Url values ('Corso ImperoR', 'prototipofreddo5Territori_files/CorsoImpero_retro.jpg'); insert into Url values ('Corso Ateneo', 'prototipofreddo5Territori_files/CorsoAteneo.jpg'); insert into Url values ('Corso AteneoR', 'prototipofreddo5Territori_files/CorsoAteneo_retro.jpg'); insert into Url values ('Bastioni Gran Sasso', 'prototipofreddo5Territori_files/BastioniGranSasso.jpg'); insert into Url values ('Bastioni Gran SassoR', 'prototipofreddo5Territori_files/BastioniGranSasso_retro.jpg'); ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 55 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.4 Prototipazione L’obiettivo della prototipazione è quello di fornire in tempi rapidi un documento a scopo dimostrativo che presenti il prodotto. Il fine è quello di dare un’idea di massima al cliente della struttura dell’applicazione e coinvolgerlo fin da subito nello sviluppo, ma serve anche e soprattutto a chiarire le idee sui requisiti del sistema e sulle conseguenti scelte progettuali. Nel nostro caso viene fornito un prototipo freddo che implementa le funzionalità più importanti del sistema per ciascun utente. 5.4.1 Prototipo freddo Il prototipo freddo è realizzato in pagine HTML e JavaScript. Il JavaScript è utilizzato per controllare il riempimento e la coerenza dei dati inseriti nei campi form. I collegamenti tra le pagine sono realizzati attraverso link statici inseriti come collegamento ipertestuale o come “action” della form; non vi è dunque alcuna manipolazione sui dati inseriti ma tutto viene simulato a scopo dimostrativo. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 56 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.4.2 Schema di navigazione del sito tramite ADM (Araneus Data Model) Araneus Data Model è un formalismo logico utilizzato nella progettazione di siti web per modellare pagine ipertestuali. Gli schemi ADM descrivono la struttura delle pagine (page scheme) e come queste sono collegate tra di loro. I tipi previsti da ADM sono: Figura 15 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 57 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ In questo progetto ADM è stato utilizzato per documentare il prototipo freddo e questi sono gli schemi relativi alle tre aree dell’applicazione: Figura 16 * Per migliore visualizzazione e chiarezza del diagramma, essendo Trattativa e TrattativaBis nell’ADM sono state visualizzate come unica pagina web avendo l’interfaccia molto simile. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 58 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 5.5 Design model Questa fase rappresenta il cuore della progettazione. È qui che vanno a definirsi tutte le scelte progettuali che caratterizzeranno il sistema in ogni suo dettaglio. È importante dunque lavorare bene su questa parte, cercando di mantenere una buona coerenza nella modellazione, in modo da prepararsi al meglio per la stesura del codice. Tuttavia, proprio per la difficoltà di queste attività (ed anche per la nostra inesperienza), sarà necessario un intenso lavoro di raffinamento parallelo all’implementazione. 5.5.1 Implementation model L’Implementation model è un insieme di diagrammi UML che descrive come è strutturato il software dell’applicazione anche rispetto alle risorse Hardware. 5.5.1.1 Component diagram Il Component diagram si specializza sui componenti software e su come questi sono relazionati tra loro. Figura 17 : Design model ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 59 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 6 Implementazione 6.1 Introduzione Questo docunento spiega sinteticamente i punti principali che caratterizzano la realizzazione dell’applicazione. Le informazioni che riguardano più da vicino il codice sono state commentate nelle varie classi e sono disponibili nelle API (Application Program Interface) (/doc/index.htm). Lo scopo principale del documento è quello di trattare le tecniche utilizzate ed i problemi critici che abbiamo incontrato. 6.2 Pagine web Come già anticipato nelle fasi precedenti, in questa sede è stata completamente rivista la veste grafica. Le pagine statiche e dinamiche dell’applicazione sono state ridisegnate utilizzando un nuovo template grafico. 6.2.1 Template grafico A titolo di esempio, riportiamo le prime pagine del sito: Figura 18 : Homepage ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 60 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Figura 19 : Registrazione Figura 20 : Sala d’attesa Rimanendo vicino al prototipo freddo abbiamo creato le pagine del sito in modo da somigliare il più possibile al gioco reale del Monopoli. Abbiamo scelto di non sovraccaricare la pagina del tabellone con l’immagine di sfondo anche per rendere più snello il continuo aggiornamento di essa. Implementazione del template grafico L’implementazione anche se non è effettivamente difficoltosa, ha richiesto molto tempo per l’implementazione dei molteplici controlli di validazione, visibilità e stabilità della pagina. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 61 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 6.2.2 Motivazioni delle scelte generali Abbiamo voluto riportare il Monopoli così comè, da gioco da tavolo ad interattivo cambiando il meno possibile. 6.2.3 Stile Lo stile utilizzato è uno stile chiaro che non risalti fastidioso agli occhi e quindi sono stati utilizzati colori VERDE e CELESTINO. 6.2.4 Sfondo E’ stato scelto uno sfondo che ha lo stesso colore del tabellone del gioco 6.2.5 Immagini varie Le immagini sono state prese direttamente tramite scanner dal gioco o trovate su internet 6.2.6 Scelte implementative Data Si è scelto di utilizzare per la rappresentazione delle date in concatenazioni di stringhe invece che utilizzare gli oggetti delle librerie java a causa della difficoltà della loro manipolazione e per renderle sicuaramente più pobili in caso di cambio della piattaforma del DB. Contesto A causa del carattere interattivo del progetto si è reso necessario l’utilizzo del servletContext (contesto), per permettere il passaggio di informazioni tra i vari utenti. Per l’utilizzo del contesto, avendo la necessità, di rendere univoche le chiavi che permettevano l’accesso a vari attributi, sono stati implementati, nella classe servleUtil.java, una serie di metodi (riconoscibili dal prefisso “codifica” nel loro nome) che generavano il tag dell’attributo concatenando tra di loro un carattere speciale, identificativo di un tipo di attributo, con delle stringhe. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 62 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 6.3 Problemi riscontrati 6.3.1 Eclipse Scarsa portabilità di un progetto da una macchina ad un’altra con riconfigurazione totale dell’IDE. Rilevazione di falsi errori persistenti, di tag del codice HTML, a volte anche in Java ma risolti con un Clean and Build (pulisci e compila). ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 63 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 7 Manuale d’installazione 7.1 Operazioni preliminari Prima di procedere all’installazione dell’applicazione occorre installare tutti i componenti necessari. 7.1.1 Installazione Java Virtual Machine: JDK 1.6 L’applicazione è sviluppata in Java 1.6 dunque la macchina deve essere provvista della console java aggiornata. Qualora non fosse così, è possibile scaricare la versione per il proprio sistema operativo dal sito: http://java.sun.com/javase/downloads/index.jsp. È comunque possibile trovare la versione per Windows nella directory installazione nel file: jdk-6u2-windows-i586-p.exe. Lanciare il file e seguire la procedura di installazione lasciando le scelte di default. 7.1.2 Installazione DBMS: MySQL 5 Il file che si trova all’interno della directory installazione riguarda la versione di MySQL per ambiente Windows dal nome: mysql-essential-5.0.41-win32.msi. Per altri sistemi operativi scaricare la versione dal sito www.mysql.com. Scegliere la modalità d’installazione “tipica” e nel wizard di configurazione scegliere standard configuration. Nella seguente schermata lasciare le seguenti impostazioni. Si consiglia di impostare lo start del server all’avvio. Figura 21 ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 64 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Fare attenzione all’eventuale password immessa come utente di root, per non mettere password deselezionare l’opzione Modify Security Settings: Figura 22 Per le prime applicazioni si consiglia di non la password. Tutte le altre impostazioni possono essere lasciate di default. 7.1.3 Installazione Web Server: Apache TomCat 6 Lanciare il file apache-tomcat-6.0.20.exe che trovate nella directory installazione. Anche in questo caso porre attenzione alla password di accesso che viene chiesta di inserire: Figura 23 Si consiglia di non mettere password per le prime applicazioni. Tutte le altre inpostazioni possono essere lasciate di default. ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 65 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 7.2 Installazione 7.2.1 Avvio del DBMS Digitare dal prompt di comandi il comando: > mysqld --user root Il DBMS può essere avviato anche manualmente come servizio esterno che, in ambiente windows si trova in pannello di controllo → strumenti di amministrazione → servizi → mysql. Per spegnerlo si può procedere nello stesso modo oppure digitando da prompt dei comanti: > mysqladmin --user root shutdown 7.2.2 Creazione e popolamento del database Una volta avviato il DBMS, digitare dal prompt dei comandi: > mysql –u root (senza password) > mysql –u root –p (con password) Inserire la password di root (soltanto se prevista durante l’installazione). In questo modo accederete a MySQL come utente root e verrà visualizzata la schermata: Figura 24 Da qui inserire il comando: > source C:/Monopoli/Creazione_DataBase.sql (inserire la lettera del proprio drive) ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 66 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ Vengono così create e popolate con alcuni dati, tutte le tabelle del database e l’utente di lavoro: Figura 25 A questo punto il database è correttamente settato per l’utilizzo. 7.2.3 Copia dei contenuti web Copiare il file di progetto “Monopoli.war” dentro la cartella webapps di TomCat (ricordarsi dove l’avete installato, normalmente si trova in C:\Programmi\Apache Software Foundation\TomCat 6). 7.2.4 Avvio del Web Server TomCat può essere avviato lanciando il file tomcat6.exe all’interno della cartella bin di TomCat oppure, in ambiente Windows, lanciare Monitor Tomcat che trovate in Start → Programmi → Apache TomCat 6 ed apparirà un’icona in basso a destra. Da questa, nel caso sia di colore rosso, cliccare con il tasto destro, selezionare start service e diventerà di colore verde. Eseguire questa operazione soltanto dopo aver copiato i cotenuti web. 7.2.5 Lanciare applicazione Dopo aver seguito tutti i passi precedenti, utilizzare un qualsiasi browser (alcuni diversi da Internet Explorer potrebbero dare problemi sullo stile grafico) e inserire l’indirizzo: http://localhost:8080/Monopoli-WebApplication/ Si accede così alla pagina iniziale “index.html” dove si può entrare nella HomePage del gioco, leggere le regole dl gioco o consultare la documentazione ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 67 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 7.2.6 Primo accesso (Log-in / Registrazione) Se non avete un vostro account clicca su registrati, compila la form, e poi effettua il Log-in dalla Home-Page Nick : ***** Password: ******** Da ora potrai divertirti con la nuova versione del Monopoli On-Line! 7.3 Utilizzo dell’applicazione Una volta effettuato il Log-in ti troverai nella “sala d’attesa”, qui puoi fare diverse azioni: Creare una partita. Per creare una partita bisognerà inserire il nome della partita, selezionare “crea” dal menù “modalità”, scegliere la pedina con cui giocare e selezionare il numero di giocatori che parteciperanno alla partita, poi premere “ok”. Partecipare ad una partita già creata. Per partecipare ad una partita bisognerà inserire il nome della partita (scelto tra quelli dell’elenco partite in attesa), selezionare “partecipa” dal menù “modalità”, inserire la data e l’ora della partita, scegliere la pedina con cui giocare e premere “ok”. Ripristinare una partita salvata in precedenza. Per ripristinare una partita salvata bisognerà inserire il nome della partita (scelto tra quelli dell’elenco partite salvate), selezionare “ripristina” dal menù “modalità”, inserire la data e l’ora della partita, premere “ok”. Visualizzare la classifica geneale. Semplice click sul tasto per visualizzare l’elenco dei punteggi ottenuti dai vincitori delle partite concluse. Effettuare il Log-out. Semplice click per uscire dal gioco Nella partita o pagina chiamata “Tabellone”: Tira dadi Visualizzare i territori di un giocatore Effettuare una trattativa con un giocatore Comprare o vendere case Ipotecare o disipotecare un territorio Salvare la partita corrente Ritirarsi dalla partita corrente ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 68 Reingegnerizzazione di un applicativo web: Monopoli on-line ____________________________________________________________________________________________________________ 8 Commenti e ringraziamenti Commenti La scelta di avere un’architettura a più livelli mi ha sicuramente aiutato nel ridefinire le classi java di ogni livello e l’inserimento dei frameworks è stato facilitato perché non esisteva la possibilità di compromettere la totalità della struttura dell’applicazione. Certamente si è rivelato efficace l’utilizzo dei frameworks che hanno ridotto notevolmente il tempo di stesura del codice. Ad esempio struts dà la possibilità utilizzare delle classi pre-create, quindi si parte da uno scheletro già definito. Ringraziamenti E’ sempre difficile trovare parole giuste per ringraziare tutti coloro che hanno creduto in me, che mi hanno incitato e convinto a prendere il cosiddetto “Pezzo di carta”. Ma visto che ora FINALMENTE ci sono riuscito e per vostra sfortuna dovrete aggiungere Dott. o Ing. davanti al mio nome farò un piccolo sforzo per riuscire a ringraziare tutti voi. GRAZIE! GRAZIE! GRAZIE! a Emanuela, ai miei genitori e a tutta la mia famiglia, alla famiglia di Emanuela, ai miei amici, ai colleghi INPS e CSC e tutti coloro che ci hanno creduto! ancora GRAZIE! Andrea ____________________________________________________________________________________________________________ Università di Roma “La Sapienza” Tesi di Laurea in Ingegneria Informatica 69