Professional Documents
Culture Documents
Gruppo Alpha
Andrea Martelli
Emanuele Mottola
Roberto Paolillo
Corso di laurea in Ingegneria Informatica Specialistica
Anno Accademico 2007/2008
Indice
1 Introduzione......................................................................................................................................2
1.1 Principi di progettazione...........................................................................................................2
1.1.1 Principio di apertura e chiusura.........................................................................................2
1.1.2 Principio dell'inversione delle dipendenze........................................................................2
1.1.3 Principio di segregazione delle interfacce.........................................................................2
1.1.4 Principio di singola responsabilità.....................................................................................3
1.1.5 Principio di sostituzione di Liskov....................................................................................3
1.2 Ipotesi semplificative di progetto..............................................................................................3
2 Descrizione statica del sistema.........................................................................................................4
2.1 Diagramma delle classi.............................................................................................................4
2.2 Pattern di progetto.....................................................................................................................9
2.2.1 Pattern DAO......................................................................................................................9
2.2.2 Pattern Strategy...............................................................................................................12
2.2.3 Pattern Singleton.............................................................................................................13
2.2.4 Pattern Flyweight.............................................................................................................16
2.2.5 Pattern Factory Method...................................................................................................17
3 Modellazione dei dati....................................................................................................................17
3.1 Diagramma EntitàRelazione..................................................................................................19
3.2 Schema relazionale.................................................................................................................19
4 Comportamento dinamico del sistema...........................................................................................24
4.1 Casi d'uso principali................................................................................................................24
4.1.1 Ottenimento dei segmenti di una borsa............................................................................27
4.1.2 Esecuzione di un ordine...................................................................................................29
4.2 Schema dellae pagine..............................................................................................................29
5 Componenti.....................................................................................................................................31
5.1 Diagramma dei componenti....................................................................................................31
5.2 Il demone................................................................................................................................33
5.3 Graph applet............................................................................................................................34
6 Deployment....................................................................................................................................34
6.1 Diagramma di deployment......................................................................................................34
6.2 Pattern MVC...........................................................................................................................36
6.3 Considerazioni sulla sicurezza................................................................................................37
6.4 Ottenimento dati borsa............................................................................................................37
Gruppo Alpha Documento di Progetto 1.0 1
1 Introduzione
Il presente documento descrive il progetto del sistema, sia nella parte statica che in quella dinamica.
Il diagramma delle classi, che nel precedente documento di analisi conteneva solo le classi entity, è stato ora
esteso e completato delle altre classi, elencandone i metodi principali.
Al fine di illustrare in maniera trasparente la filosofia e le modalità di progettazione del sistema, si descrivono
e dettagliano tutti i pattern utilizzati, spiegando i motivi che hanno portato alla scelta degli stessi.
Viene inoltre descritta la modellazione dei dati, dal progetto del diagramma EntitàRelazioni allo schema
relazionale.
Per descrivere il comportamento dinamico del sistema se ne sono dettagliati 2 casi d'uso fondamentali, ed è
stato inoltre realizzato un diagramma delle pagine per rendere immediatamente comprensibile lo schema di
navigazione in cui si può muovere l'utente.
Completano la descrizione progettuale del sistema il diagramma delle componenti e il diagramma di
deployment, con il dettaglio del fulcro centrale dell'intero sistema: l'ottenimento dei dati reali delle borse.
1.1 Principi di progettazione
Nello sviluppo del progetto è stata posta sempre grande attenzione sugli aspetti legati alla flessibilità, alla
riusabilità e alla manutenibilità, caratteristiche irrinunciabili in un buon progetto software OO.
In questo i benefici maggiori sono derivati dall'applicazione dei pattern, lo studio e l'analisi di principi generici
di buona progettazione, infine da un notevole sforzo di astrazione. In particolare è stata molto utile la
consultazione del libro "Agile Software Development: Principles, Patterns, and Practices" di Robert Martin,
dal quale si è tratto spunto per discutere brevemente di queste "good practices".
1.1.1 Principio di apertura e chiusura
"Le entità software, come classi, moduli e funzioni devono essere aperte all'estensione ma chiuse alle
modifiche"
È un principio generico da considerare quando ci si vuole assicurare che per estendere il comportamento di
una classe non ci sia bisogno di modificarla internamente, ma sia sufficiente estenderla. Lo stesso principio
può essere applicato a librerie, moduli e package. Così facendo è possibile mantenere la retrocompatibilità
del codice e delle applicazioni, ed è possibile inoltre effettuare test in maniera regressiva. Il principio può
essere applicato utilizzando classi astratte e interfacce. Esempi concreti sono il Template Pattern e lo
Strategy Pattern (da noi utilizzato per la connessione al DB).
1.1.2 Principio dell'inversione delle dipendenze
"I moduli di alto livello non devono dipendere da quelli di basso livello. Entrambi devono dipendere dalle
astrazioni"
"Le astrazioni non devono dipendere dai dettagli, ma dovrebbe avvenire il contrario"
È necessario disaccoppiare i moduli di alto livello da quelli di livello più basso, introducendo un livello di
astrazione tra le classi di alto e basso livello. Inoltre le astrazioni fatte in fase di progetto non devono
dipendere dai dettagli implementativi o di dominio, ma deve avvenire esattamente il contrario. Grazie a
questa separazione, i moduli o le classi diventano intercambiabili, un pò come avviene con le Factories o le
Abstract Factories.
1.1.3 Principio di segregazione delle interfacce
"I clients non devono essere forzati a dipendere da interfacce che non usano"
Le interfacce devono essere autocontenute. Non è corretto inserire metodi inappropriati all'interno di
un'interfaccia, anche perché questo costringerà a implementarli in seguito. La presenza di questi denota una
errata modellazione e individuazione dei compiti delle classi. Interfacce con metodi errati sono dette
"inquinate" o "fat interfaces", e dev'essere quindi buona cura del progettista evitarle.
Gruppo Alpha Documento di Progetto 1.0 2
1.1.4 Principio di singola responsabilità
"Una classe deve avere solo una ragione per cambiare"
In questo contesto una responsabilità è considerata un motivo per cambiare. In pratica se abbiamo due
motivi che possono indurre a modificare una classe, questa dev'essere suddivisa in due classi distinte. In
questo modo ogni singola classe avrà un solo motivo per cambiare, e se si renderà necessario un
cambiamento basterà intervenire sulla classe interessata. Con questa tecnica si realizza quindi una
suddivisione di compiti tra classi, sempre a favore dei principi ispiratori di modularità e manutenibilità.
1.1.5 Principio di sostituzione di Liskov
"I tipi derivati devono essere completamente sostituibili dai loro tipi base"
È un'estensione dell'Open Close principle, e implica il fatto che dobbiamo esser certi che le nuove classi
derivate estendano le classi base senza cambiarne il comportamento. Le nuove classi derivate dovrebbero
quindi essere in grado di sostituire le classi base senza alcun cambiamento nel codice e questo è senz'altro
favorito nel linguaggio Java.
1.2 Ipotesi semplificative di progetto
Rispetto a quanto documentato nelle fasi precedenti del progetto, lo stesso ha subito dei leggeri
cambiamenti dovuti ad una migliorata percezione del dominio di interesse, dei vincoli progettuali e temporali,
e delle previsioni inerenti la fase implementativa.
Sono state quindi assunte alcune ipotesi semplificative, analizzate di seguito:
1) Effetto dell'inserimento di ordini
Quando un utente inserisce un ordine di acquisto o vendita, nel mercato reale, questo ha un effetto
diretto sul valore del titolo azionario in questione, secondo le leggi della domanda e dell'offerta. Oltre
al valore del titolo in sé vi è un altra componente, di interesse più pratico per l'utente, che cambia: il
book del titolo. Questo contiene di solito le cinque migliori offerte di acquisto e vendita, ordinate
rispettivamente in ordine decrescente e crescente, corredate dalla quantità offerta.
Non potendo disporre di questo set di informazioni, difficili da reperire e che implicherebbero
complicazioni troppo pesanti, ci si è limitati a considerare denaro e lettera (che coincidono con i primi
valori del book), e a valutare l'eseguibilità degli ordini solo rispetto a questi.
Inoltre, dal momento che considerare gli effetti dell'inserimento di un ordine solo parzialmente
sarebbe una forzatura, consideriamo i valori di denaro e lettera non influenzabili dagli ordini inseriti
dagli utenti del nostro sistema.
2) Modalità di evasione degli ordini
La seconda questione è legata strettamente alla prima: non avendo a disposizione il book dei titoli,
non è possibile gestire le quantità disponibili per ogni titolo, e di conseguenza considerare la
possibilità di un'esecuzione parziale degli ordini (es.: richiesta di 100 azioni Fiat, ma solo 80
disponibili). In virtù di questo, gli ordini saranno da considerare sempre evasi completamente.
3) Valuta dei conti
Normalmente, a seconda del Paese di appartenenza di un utente, il conto dovrebbe essere gestito
ed espresso nella valuta propria dell'utente stesso. Si considerano, però, tutti i conti espressi in
Euro, che è la valuta di default. Quando l'utente effettua compravendite di titoli non europei, il
sistema consider l'appropriato tasso di cambio per effettuare le transazioni in Euro.
4) Valuta di riferimento
Per evitare ridondanza, il sistema considera e immagazzina soli e tutti i tassi di cambio tra l'Euro e le
altre valute. Avendo a disposizione questi dati, i tassi di cambio tra due generiche valute possono
essere ricavati semplicemente.
2 Descrizione statica del sistema
2.1 Diagramma delle classi
Gruppo Alpha Documento di Progetto 1.0 3
Gruppo Alpha Documento di Progetto 1.0 4
Gruppo Alpha Documento di Progetto 1.0 5
Gruppo Alpha Documento di Progetto 1.0 6
2.2 Pattern di progetto
2.2.1 Pattern DAO
Per garantire la persistenza degli oggetti è stato necessario introdurre delle classi boundary che
consentissero di mappare le classi con le entità del modello relazionale. Per questo compito si è ricorsi ad un
pattern di dettaglio, non facente parte dei pattern della "Gang of Four" ma ampiamente testato e
riconosciuto, al punto da rientrare tra i Core J2EE Patterns. Questi pattern sono specifici per applicazioni
multitier e pensati appositamente per adattarsi ad un ambiente di sviluppo come J2EE. Ciò è infatti possibile
perchè J2EE ha tra le sue prerogative, oltre ovviamente al rispetto del modello MVC, scalabilità,
performance e riutilizzabilità. Proprio in ossequio al modello MVC, questi patterns sono suddivisi tra
Presentation Tier, Businness Tier e Integration Tier Patterns (tra questi ultimi rientra il DAO).
Gruppo Alpha Documento di Progetto 1.0 7
Si è scelto, al fine di garantire in modo efficiente la persistenza degli oggetti entity, il pattern Data Access
Object in modo da gestire in maniera centralizzata sia il recupero dei dati dal database che l'aggiornamento,
la creazione e la cancellazione.
L'interfaccia DAO infatti espone quattro metodi fondamentali:
● Create, per l'inserimento nel database di un oggetto appena creato
● Retrieve, per l'ottenimento di un oggetto memorizzato nel DB
● Update, per l'aggiornamento dei dati di un oggetto esistente
● Delete, per la cancellazione dal DB di un oggetto esistente
Questi quattro metodi sono meglio noti in letteratura come "interfaccia CRUD" e rappresentano un modo
semplificato per gestire la persistenza degli oggetti nel DB.
Ogni altra query che è necessario porre al DB, relativamente ad un dato oggetto entity, è inoltre eseguita da
un metodo nell'oggetto DAO. Per questo motivo gli oggetti DAO rappresentano il singolo punto d'accesso del
sistema al database, garantendo una maggiore modularità e manutenibilità, nonché una perfetta
applicazione del modello MVC.
In particolare si è posto, come vincolo progettuale, che le query che è necessario porre al DB restituiscano
un solo campo, restituito in forma di array come valore di ritorno del metodo. Ciò è accettabile considerato
che le uniche query di tale tipo sono quelle necessarie a ricostruire le relazioni tra gli oggetti mappati nel DB
in memoria: saranno dunque necessari solo metodi che restituiscano i valori delle chiavi esterne di ogni
entità, in modo da stabilire come costruire le composizioni di oggetti.
Ognuno di questi metodi utilizza un oggetto JDBC di tipo PreparedStatement che, rispetto al classico
Statement, garantisce tempi di esecuzione nettamente minori.
Gruppo Alpha Documento di Progetto 1.0 8
Il DAO, se applicato in contemporanea ad un pattern Abstract Factory, permette inoltre di rendere
trasparente al sistema la scelta del database utilizzato (relazionale, ad oggetti, flat files ecc.). È possibile
anche l'utilizzo congiunto con i Transfer Objects che consentirebbero, in caso di oggetti DAO localizzati in
un ambiente distribuito, di ridurre il numero di chiamate ai metodi accessors (getters e setters) per
valorizzare gli attributi.
2.2.2 Pattern Strategy
Il pattern Strategy definisce una famiglia di algoritmi, incapsulando ciascuno di essi in una classe, e li rende
intercambiabili. Questo pattern consente ad un client di utilizzare un dato servizio indipendentemente
dall'algoritmo con cui esso è realizzato. Inoltre il pattern trova applicazione nel definire un metodo di
connessione al database. Esso consente di utilizzare dei differenti approcci di connessione, mediante stringa
JDBC o risorsa JNDI (Java Naming and Directory Interface), con unica connessione condivisa o con un pool
di connessioni disponibili.
2.2.3 Pattern Singleton
Per alcune delle strategies implementate per l'oggetto DBConnector è necessario garantire che venga
restituita una singola istanza dell'oggetto JDBC Connection. A questo scopo viene realizzato il pattern
Singleton, il quale garantisce che un oggetto abbia una singola istanza esistente.
Il pattern prevede l'utilizzo di un attributo di tipo static (per l'oggetto Connection) e un metodo anch'esso
static che restituisca l'oggetto se questo è stato già istanziato, mentre lo istanzi se questo non è ancora stato
creato.
È da notare che una versione assai simile a questa è utilizzata dal pattern Flyweight nel suo metodo
getElemento di FlyweightFactory, allo scopo di verificare se un oggetto Flyweight è già stato istanziato.
Gruppo Alpha Documento di Progetto 1.0 9
2.2.4 Pattern Flyweight
Come illustrato precedentemente, quando viene richiamato il getter relativo ad un oggetto facente parte di
una composizione, come ad esempio Segmento.getTitoli(), gli oggetti Titolo vengono istanziati e inseriti nella
lista che implementa la composizione (Segmento.titoli).
Nel realizzare queste composizioni molto spesso si vengono a creare delle gerarchie cicliche: ad esempio gli
Indici sono composti da serie di Titoli, e questi fanno riferimento ad una Borsa.
Per le esigenze di progetto si è chiaramente reso necessario che queste relazioni siano verso istanze
univoche di oggetti, in modo tale da evitare così la ridondanza dei dati e contestualmente garantendo che
questi siano sempre consistenti e aggiornati, senza necessità alcuna di implementare complessi (in questo
caso) meccanismi come quello del pattern Observer.
A giustificare ulteriormente questa scelta vi è il fatto che gli oggetti di tipo Titolo sono molto numerosi nel
sistema, nell'ordine delle seimila unità, considerando l'elenco titoli delle tre borse implementate. Risulterebbe
quindi assai dispendioso ipotizzare che questi oggetti vengano duplicati quando inseriti in composizioni
differenti, come Segmento e Indice.
È chiaro come in questa circostanza il pattern Flyweight è di grande aiuto. Esso implementa infatti un
meccanismo di condivisione degli oggetti, in modo da gestirne efficientemente un gran numero a granularità
fine. In questo caso gli oggetti sono quelli facenti parte delle composizioni (Titoli, soprattuto).
Citando la GoF:
“The Flyweight pattern is often combined with the Composite pattern to implement a logically hierarchical
structure in terms of a directedacyclic graph with shared leaf nodes.”
La scelta progettuale adottata è dunque quella di realizzare una struttura gerarchica avente i nodi foglia
Gruppo Alpha Documento di Progetto 1.0 10
condivisi. In pratica vengono definiti degli oggetti di tipo Elenco, che mantengono la lista degli oggetti già
istanziati e ne consentono sia l'accesso che la creazione in modo unitario e centralizzato.
Un nuovo Titolo nel sistema viene istanziato solo mediante chiamata al metodo ElencoTitoli.getTitolo che,
prima di istanziare un nuovo oggetto e recuperare il suo contenuto dal DB mediante TitoloDAO, verifica nella
sua lista che non ci sia già lo stesso oggetto e nel qual caso lo restituisce.
Questo meccanismo permette di avere a disposizione in ogni pagina JSP la rappresentazione del suo
"mondo", ovvero tutte le entità interessate, e di poter ottenere in caso di necessità tutte le informazioni
correlate ad esse, seguendo semplicemente le gerarchie o le associazioni tra classi.
2.2.5 Pattern Factory Method
Gli oggetti di tipo Elenco sono creati a partire da una superclasse comune: ElencoCompleto.
L'implementazione dei loro metodi è comune in tutto a parte che nel tipo di oggetto da creare e restituire, nel
caso in cui l'oggetto richiesto non è presente nella lista di quelli già istanziati; ed è proprio per questo motivo
viene utilizzato il pattern Factory Method.
Esso è realizzato rendendo ElencoCompleto una classe astratta che implementa tutti i metodi a parte proprio
il factory method.
Quest'ultimo viene dunque implementato nelle classi derivate da ElencoCompleto (ElencoTitoli,
ElencoBorse, ElencoSegmenti e ElencoIndici), e non fa altro che istanziare un oggetto del tipo
corrispondente e restituirlo.
Così facendo si è garantito il massimo riuso del codice, realizzando quattro classi con la stessa
implementazione che fungono da factory per oggetti di tipo differente.
Bisogna sottolineare che non sarebbe stato possibile ottenere lo stesso risultato utilizzando i costrutti
generics di Java (templates per C++), in quanto non è possibile istanziare un oggetto avente un tipo
indeterminato individuabile solo a runtime.
Inoltre è da evidenziare come il metodo getElemento utilizza in parte il pattern Template Method, che è
usato spesso in congiunzione con il Factory Method.
3 Modellazione dei dati
Gruppo Alpha Documento di Progetto 1.0 11
Gruppo Alpha Documento di Progetto 1.0 12
3.1 Diagramma EntitàRelazioni
Come si può osservare comparando il diagramma delle classi “precedente” inserito nel documento di analisi
con il modello ER, lo schema del database rispecchia abbastanza fedelmente l’impostazione strutturale data
in quella fase. É evidente che il lavoro di analisi del dominio e di progettazione svolto nelle due distinte fasi si
è quindi rivelato coerente ed efficace, portando senza particolari difficoltà al modello finale del sistema.
La struttura del DB ricalca inoltre la suddivisione effettuata nella descrizione degli attori del sistema, dove è
stata fatta una distinzione (a scopo puramente semplificativo) tra DB Titoli e DB Utenti. Si possono infatti
individuare due macro aree all’interno del diagramma ER, l’una interessante i titoli, le borse e tutte le
informazioni “statiche” ad essi collegate, l’altra interessante gli utenti con i loro conti e ordini.
Inoltre è rilevante notare il parallelismo tra entità/tabelle del DB ed Entities del diagramma delle classi, che
sono in buona parte sovrapponibili.
La gestione dei dati persistenti e il collegamento tra classi e database sono realizzati utilizzando il pattern
DAO, approfondito nell’apposita sezione.
Sono necessarie alcune precisazioni sullo schema del DB:
● Titolo: rappresenta non solo i titoli azionari, ma anche i tassi di cambio tra le valute (la valuta di
riferimento è l’Euro) e i valori riassuntivi degli indici. Considerazione analoga va fatta ovviamente per
Quotazione.
● Titolo posseduto: rappresenta i portafogli dell’utente (Azioni, Valute, Virtuale). La distinzione tra
azioni e valute viene fatta sulla base dell’associazione a Titolo, ed inoltre il flag virtuale indica se il
titolo è presente nel portafoglio virtuale o in quello reale. Questi vengono gestiti in modo molto simile
pur con alcune differenze sulla gestione e l’esecuzione degli ordini.
● Conto: per ragioni di coerenza dei dati e di ridondanza, il conto di ogni utente non contiene
direttamente l’informazione sul credito disponibile, ma viene ricavata quando richiesta analizzando
tutti i movimenti precedenti relativi a quel conto realizzati in passato (incluso un eventuale
versamento iniziale).
Il DBMS utilizzato per l'applicazione è MySQL della Sun Microsystem, Open Source, multipiattaforma e
dotato di buone prestazioni.
Le connessioni al DB possono essere effettuate usando diverse strategie (Standard, Pooled e mediante
Jdni), con differenti tradeoff tra semplicità di realizzazione e prestazioni.
3.2 Schema relazionale
Il presente schema fornisce una visione più "concreta" di come appare il DB progettato, descritto dal
precedente schema. Sono visibili in particolare le tabelle associative per le relazioni nm e i vincoli di chiave
esterna che implementano le relazioni 1n.
Gruppo Alpha Documento di Progetto 1.0 13
Gruppo Alpha Documento di Progetto 1.0 14
4 Comportamento dinamico del sistema
4.1 Casi d'uso principali
Gruppo Alpha Documento di Progetto 1.0 15
Gruppo Alpha Documento di Progetto 1.0 16
4.1.1 Ottenimento dei segmenti di una borsa
Il diagramma successivo schematizza un caso tipico di interazione tra classi all'interno del sistema.
Osservando anche il diagramma delle classi si può notare la presenza di un motivo ricorrente: la richiesta di
un Elenco che gestisce l'ottenimento dei suoi componenti tramite il loro Data Access Object in maniera
ottimizzata. Entrando più nel dettaglio, nella fattispecie l'utente richiede la visualizzazione di tutti i segmenti
di una Borsa contraddistinta da un codice. Viene quindi richiesto l'elenco delle Borse all'oggetto Elenchi (che
è un pool di flyweight), e tramite questo viene ottenuto l'oggetto della Borsa in questione; qualora questo non
fosse stato precedentemente instanziato, viene caricato dal DB utilizzando BorsaDAO). Di seguito vengono
quindi ottenuti tutti i segmenti della borsa in questione e inseriti nell'altro flyweight, ElencoSegmenti. Ora
quindi gli oggetti sono disponibili per l'elaborazione o la visualizzazione mediante pagina JSP.
Schemi analoghi vanno considerati per altre azioni tipiche che coinvolgono oggetti di tipo
ElementoConCodice ed Elenco, come la richiesta di tutte le Borse, degli indici tipici di un mercato, dei titoli di
un segmento o di quelli facenti parte di un dato indice. La modellazione delle classi ha permesso quindi la
creazione di un ambiente uniforme che permette, una volta appreso lo schema base di funzionamento, di
sfruttare in maniera semplice, e anche abbastanza ripetitiva, la maggior parte delle funzioni del sistema.
Gruppo Alpha Documento di Progetto 1.0 17
Gruppo Alpha Documento di Progetto 1.0 18
4.1.2 Esecuzione di un ordine
Questo rappresenta senza dubbio il processo più importante e più complesso dell'intero sistema. Essendo
un'operazione di routine, e che necessita di tutti i privilegi possibili, è svolta dal Demone ad intervalli di
tempo regolari, come descritto in seguito.
Quando un utente inserisce un ordine di acquisto o vendita di un generico titolo, questo non viene eseguito
immediatamente neanche nel caso in cui ciò sarebbe teoricamente possibile, ma viene inserito nel database
come ordine pendente. È quindi il demone a verificare periodicamente la soddisfacibilità degli ordini e ad
eseguirli quando possibile.
Il flusso delle operazioni prevede l'ottenimento di tutti i Conti degli utenti, e la loro interrogazione per ottenere
gli Ordini di ognuno. Quindi il demone verifica l'eseguibilità di ogni ordine controllando l'ultima quotazione del
titolo interessato, l'apertura o la chiusura del segmento di riferimento, l'eventuale avvenuta scadenza
dell'ordine. Se tutti i controlli vanno a buon fine, l'ordine viene eseguito restituendo il TitoloPosseduto e
generando un opportuno Movimento che influenza il valore del Conto.
4.2 Schema delle pagine
Il diagramma seguente fornisce una visione completa dei possibili cammini di navigazione effettuabili dagli
utenti, in base alle loro credenziali (base, avanzato, amministratore) e alle condizioni che si verificano di volta
in volta, in modo da evidenziare rapidamente e in maniera visivamente efficace le principali funzionalità
offerte.
Gruppo Alpha Documento di Progetto 1.0 19
Gruppo Alpha Documento di Progetto 1.0 20
5 Componenti
5.1 Diagramma dei componenti
Il diagramma dei componenti può essere rappresentato con diversi livelli di dettaglio.
L'approccio scelto è stato di suddividere le classi entity e control in componenti aggregati e successivamente
esplicitare le relazioni tra questi componenti e quelli esterni al sistema, quali:
● librerie software, marcate con lo stereotipo <<library>>;
● sistemi esterni autonomi, come applicazioni client o server; per questi si è usato lo stereotipo
<<external system>> ;
● file, linkati o elaborati a runtime, che contengono parte della logica (come il layer di presentazione e
l'interfaccia grafica): lo stereotipo utilizzato è <<file>> .
Gruppo Alpha Documento di Progetto 1.0 21
Gruppo Alpha Documento di Progetto 1.0 22
5.2 Il demone
Il componente che racchiude al suo interno la maggior parte della business logic del sistema è quello che
abbiamo chiamato Demone. Il nome deriva proprio dalla funzione che esso ricopre, in analogia a quanto
accade in generale nei sistemi di tipo Unix. Questo è, infatti, un thread eseguito in background e non sotto il
diretto controllo dell'utente. Nella fattispecie, l'ambiente in cui il demone viene eseguito è il web server
Apache, e l'unico utente che può interagire con esso è l'amministratore del sistema, il quale ha a
disposizione un pannello di controllo (realizzato con apposita interfaccia web) accessibile dall'interno del sito
di TOL e che gli consente una serie di operazioni, tra le quali: avviare, fermare, controllare lo stato del
demone, leggerne il file di log, etc.
Le due operazioni fondamentali che il processo esegue ad intervalli di tempo regolari e prefissati (ma
modificabili dall'amministratore) saranno:
● Aggiornamento delle quotazioni intraday
Il demone ottiene l'elenco dei segmenti aperti nel momento dell'esecuzione e per ognuno di essi
l'elenco dei titoli. Quindi si interfaccia al fornitore dei dati di borsa (Yahoo Finance) ed effettua il
download delle quotazioni a blocchi, in modo da ottimizzare il numero di connessioni e richieste
HTTP necessarie al completamento. Contestualmente, inserisce i dati ottenuti all'interno del
database, che contiene quindi lo storico intraday delle quotazioni. Un meccanismo analogo, ma
differente solo in alcuni piccoli dettagli implementativi, viene utilizzato per aggiornare i tassi di
cambio delle valute internazionali.
● Verifica ed esecuzione degli ordini
Subito dopo aver aggiornato le quotazioni, il demone prende in esame gli ordini pendenti inseriti
dagli utenti. Questo perché le compravendite non sono immediate, ma vengono effettuate solo
quando determinate condizioni sono verificate. Iil demone consulta quindi il DB per ottenere la lista
di ordini, per ognuno di essi verifica l'eseguibilità (mercato aperto, disponibilità economica
dell'utente, valutazione di denaro o lettera, ecc..) e, in caso affermativo, esegue le seguenti azioni:
1. inserimento del record opportuno nel portafoglio dell'utente interessato
2. aggiornamento del conto dell'utente tramite la generazione di un movimento, che tiene conto della
quantità acquistata e dell'eventuale tasso di cambio
3. rimozione dell'ordine pendente dal database
Il meccanismo di gestione degli ordini riguardanti titoli azionari e valute è identico, in quanto queste ultime si
possono gestire in tutto e per tutto come normali azioni.
È chiaro quindi che le funzioni svolte dal demone sono quelle su cui si basa l'intero sistema. Proprio per
questa ragione, questo componente è sviluppato in modo da essere il più possibile ottimizzato e tollerante
agli errori, gestendo in maniera adeguata tutte le eccezioni per evitare che il processo si interrompa.
Gruppo Alpha Documento di Progetto 1.0 23
5.3 Graph applet
Per la visualizzazione dei grafici di analisi tecnica si utilizza un Applet Java al posto di semplici immagini
statiche. In questo modo si evita di dover gestire la generazione e la cancellazione delle immagini
temporanee, si offre inoltre all'utente un'interfaccia molto più interattiva che non risente dei problemi di
refresh tipici delle pagine HTML.
I grafici permettono all'utente di selezionare gli indicatori e le elaborazioni da visualizzare e sfruttano come
fonte dati il servizio storico di Yahoo Finance. La comunicazione tra l'applet, residente sul client, e il server, a
cui è demandato il compito di ottenere gli andamenti delle quotazioni, è realizzata col sistema RMI (Remote
Method Invocation) di Java. Questa tecnica consente di realizzare applicazioni distribuite invocando metodi
di oggetti remoti, referenziati tramite un registry, in maniera trasparente all'utente.
La applet è realizzata mediante JFreeChart, una libreria Java Open Source che consente di generare una
grande quantità di grafici, sia in 2D che in 3D, partendo da una fonte di dati.
6 Deployment
6.1 Diagramma di deployment
Gruppo Alpha Documento di Progetto 1.0 24
Gruppo Alpha Documento di Progetto 1.0 25
6.2 Pattern MVC
Il ModelViewController, tradotto in italiano ModelloVistaControllore, è un pattern architetturale molto
diffuso in sistemi software objectoriented che si sovrappone all'architettura a livelli threetier.
Si è scelto di modellare il sistema mediante lo schema MVC perché l'intento di questo pattern è di
disaccoppiare il più possibile tra loro le parti dell'applicazione adibite al controllo, all'accesso ai dati e alla
presentazione.
Aver utilizzato rigidamente questo approccio ha portato ad innegabili vantaggi come:
• indipendenza tra i business data (model) la logica di presentazione (view) e quella di controllo
(controller);
• separazione dei ruoli e delle relative interfacce
• viste diverse per il medesimo model
• il semplice supporto per nuove tipologie di client: bisogna scrivere la vista ed il controller appropriati
riutilizzando il model esistente.
Il pattern è quindi basato sulla separazione dei componenti software che interpretano i ruoli principali.
Di seguito vengono elencati nello specifico quelli adottati in questo progetto:
● model: classi entity, JavaBean;
● presentazione dati (view): classi JSP, JSTL, HTML con CSS, AJAX per le quotazioni, Applet e RMI;
● control: core logic implementata dal demone, servlets per inserimento ordini
Gruppo Alpha Documento di Progetto 1.0 26
6.3 Considerazioni sulla sicurezza
In un sistema di trading on line, in cui sono coinvolte transazioni finanziarie e dati riservati degli utenti, la
sicurezza riveste certamente un ruolo fondamentale. Per ottemperare a queste necessità, nell'ambito di
questo progetto sono stati considerati alcuni sistemi per migliorare la sicurezza delle comunicazioni.
In primo luogo, le password degli utenti vengono inviate al server e memorizzate non in chiaro, cosa che
esporrebbe il sistema ad attacchi del tipo "man in the middle" e ad un'elevata criticità dell'accesso al DB da
parte di utenti non autorizzati, ma cifrate mediante l'algoritmo di hashing MD5.
Al login, quindi, l'hash della password immessa viene confrontato con quello in possesso del database. In
questo modo, inoltre, anche l'estrema ipotesi di un accesso non autorizzato al database non
comprometterebbe l'usabilità delle password, dal momento che gli hash sono irreversibili.
Inoltre, tutte le comunicazioni tra client, e quindi browser, e server, sfruttano un canale di comunicazione
sicuro creato grazie al protocollo HTTPS (Hypertext Transfer Protocol over Secure Socket Layer). Questo è in
buona sostanza un URI sintatticamente identico allo schema http:// ma con la differenza che gli accessi
vengono effettuati sulla porta 443 e che tra il protocollo TCP e HTTP si interpone un livello di
crittografia/autenticazione (SSL o TLS). È
Il web server dispone quindi di un certificato che permette l'autenticazione e la cifratura delle comunicazioni,
e grazie ai due accorgimenti appena descritti il rischio di violare l'integrità e la riservatezza dei dati sensibili è
drasticamente ridotto.
6.4 Ottenimento dati borsa
La caratteristica di maggior pregio, nonché il pilastro dell'intero sistema oggetto del progetto, è l'utilizzo di
dati reali di borsa.
Sono stati presi in considerazione tre mercati azionari fra i più importanti al Mondo: la Borsa Italiana, il
London Stock Exchange e il Nasdaq, oltre al mercato delle valute. Per ognuno di essi è stato realizzato
l'elenco reale dei titoli quotati, la loro reale suddivisione in segmenti e indici, gli orari di apertura e le festività.
Una volta completato l'inserimento nel DB di queste informazioni che vengono considerate statiche dal
momento che cambiano a intervalli di tempo relativamente lunghi, è stata effettuata un'attenta analisi del
servizio Yahoo Finance. Qui si è scoperta la possibilità di interrogare direttamente il database di Yahoo
tramite query string passate al server tramite URL (quindi su protocollo HTTP).
In questo modo è possibile ottenere le quotazioni intraday ritardate di 20 minuti. I dati restituiti sono in forma
di file di testo in formato ".csv" (Comma Separated Values) e per questo molto leggeri, il che ha permesso di
ottimizzare molto le procedure di download dei dati, basti pensare che le quotazioni dei circa 7000 titoli
presenti nel DB vengono ottenute in un tempo mediamente inferiore ai 10 secondi utilizzando una comune
linea ADSL. L'alternativa a questa modalità di ottenimento dei dati sarebbe stato un ben più impegnativo e
lento parsing delle pagine web.
È ora opportuno evidenziare un cambiamento di strategia rispetto a quanto delineato in fase di analisi.
Inizialmente infatti era stata prevista la realizzazione dello storico delle quotazioni per poter disporre di una
base dati sulla quale effettuare l'analisi tecnica, altrimenti impossibile.
Questa idea è stata abbandonata successivamente alla scoperta del fatto che il servizio Yahoo Finance
mette a disposizione, in modo simile a quanto descritto per le quotazioni intraday, anche i dati storici dei titoli,
risalenti a periodi molto antecedenti la data di questo progetto, il che è certamente un grosso vantaggio.
È evidente quindi che non è necessaria la realizzazione del database storico, ma è possibile reperire i dati,
quando necessari, direttamente da Yahoo Finance, soluzione a nostro avviso assai conveniente sotto molti
punti di vista.
Gruppo Alpha Documento di Progetto 1.0 27