PROGETTO

Metodologie di Programmazione a.a. 2010-2011

Il progetto consiste nella realizzazione di una piccola applicazione in Java per gestire i servizi di un'agenzia di viaggi. La modellazione è necessariamente molto schematica, con varie semplificazioni, alcune poco realistiche.
Per progetti individuali, l'agenzia fornisce un servizio di prenotazioni di pacchetti vacanze di durata esclusivamente settimanale. Le settimane dell'anno sono numerate a partire da 1, e la settimana 1 è la prima settimana intera (da lunedì a domenica) dell'anno.
Per gruppi di due o tre studenti, l'agenzia fornisce sia il servizio di prenotazioni per pacchetti vacanze che quello di acquisto di biglietti aerei.

Si deve costruire e gestire (per uso interno) un archivio che contiene i dati (nome del villaggio, indirizzo, ecc.) dei pacchetti vacanze, i dati dei clienti, ed i dati delle prenotazioni (numero della settimana, cognome, villaggio, ecc.). All'inizio di ogni sessione, l'archivio è costruito leggendo i dati da file. Alla fine (o prima della chiusura) della sessione, le informazioni sulle prenotazioni dei pacchetti vacanze (ed eventuali modifiche dei dati) devono essere memorizzate per uso nella sessione successiva. L'applicazione deve accettare un qualsiasi percorso (pathname) per il file dei dati e le modifiche devono essere riportate nello stesso file, riscrivendolo.

La parte del file che contiene le informazioni relative ai pacchetti ha il seguente formato. Le informazioni relative a ciascun pacchetto sono precedute dalla stringa "PACCHETTO". Le prime 4 linee relative a ciascun pacchetto hanno il seguente formato:

PACCHETTO        La stringa "PACCHETTO"
A                Nome del villaggio vacanze (una stringa) (per esempio, ClubMed1)
I                Indirizzo (una stringa) (per esempio, Lampedusa)
N1;N2;...;Nk     Recapiti telefonici (almeno uno)
e poi due linee per ogni settimana. La prima linea ha il seguente formato:
NSett;NSD;PSD;NSU;PSU;Seq
dove
NSett  Numero della settimana (un intero tra 1 e 52)
NSD    Numero stanze doppie disponibili per la settimana (un intero ≥ 0)
PSD    Prezzo stanza doppia (un intero ≥ 0)
NSU    Numero suite multi-stanze disponibili per la settimana (un intero ≥ 0)
PSU    Prezzo suite multi-stanze (un intero ≥ 0)
Seq    Corsi offerti: una sequenza, eventualmente vuota, con i seguenti caratteri: 
            'V' vela, 'E' equitazione, 'T' tennis, 'S' surf, 'B' immersione con bombole
La seconda linea è una sequenza di stringhe, separate da ';', rappresentanti l'elenco dei potenziali clienti in lista d'attesa per una stanza doppia, ad esempio:
Rossi;De Luca;Verdi

La stringa "PACCHETTO" separa le informazioni relative ai pacchetti dei diversi villaggi.

Deve essere possibile aggiornare le disponibilità di un pacchetto (aggiunta di un villaggio vacanze appena acquistato, per esempio, o non più disponibile per disastro naturale) o delle settimane (nuove stanze appena ristrutturate o aggiunta di corsi offerti) per ciascun villaggio.

Ad ogni settimana è associato un insieme di clienti con il tipo di stanza ed i corsi selezionati.

Ogni cliente è rappresentato da un oggetto della classe appropriata ed è caratterizzato da (almeno) cognome, nome, telefono, numero di carta di credito.

La parte del file che contiene le informazioni relative ai clienti ha il seguente formato. La prima linea contiene la stringa "CLIENTI". Poi una linea per ogni cliente con il seguente formato:

C;N;T;R
dove
C      Cognome
N      Nome
T      Telefono
R      Tipo e numero di carta di credito
Si assume, per semplicità, che il cognome sia sufficiente ad identificare univocamente un cliente. Esempio:
CLIENTI
Rossi;Mario;06987675;VISA4986754435540032
De Luca;Lucia;;MASTERCARD4999954435540777
Verdi;Gian Carlo;3456435466;VISA49999544355499988

Il contenuto della parte clienti del file può essere modificato solo tramite una prenotazione accettata o l'inserimento in una lista d'attesa. Deve essere possibile cancellare una prenotazione fatta o cambiarne le caratteristiche (suite invece che stanza doppia, aggiunta/rimozione di un corso, ecc.) se la permanenza non è iniziata. Si deve poter fare una prenotazione, previa verifica da parte del sistema della disponibilità da parte del villaggio vacanze. Se non c'è disponibilità di stanze doppie, viene proposto al potenziale cliente di aggiungere il cognome ad una lista d'attesa. Le liste d'attesa sono di lunghezza arbitraria. Le informazioni sui clienti non sono mai cancellate.

La parte del file relativa alle prenotazioni ha il seguente formato. La prima linea contiene la stringa "PRENOTAZIONI" poi le prenotazioni sono suddivise in blocchi, ogni blocco è la lista delle prenotazioni relative ad un villaggio vacanze. Ogni blocco è preceduto da due linee con il seguente formato:

PRENOTAZIONI   La stringa "PRENOTAZIONI"
A              Nome del villaggio vacanze
Poi, una linea per ogni prenotazione con il seguente formato:
N;C;M;I;seq
dove
N     Numero della settimana (un intero tra 1 e 52)
C     Cognome del cliente (stringa)
M     Nome del cliente (stringa)
I     Tipo di stanza (carattere 'D' per doppia o 'S' per suite)
seq   Corsi richiesti: una sequenza, eventualmente vuota, 
            con i caratteri 'V', 'E', 'T', 'S', 'B'.
I caratteri della sequenza seq devono essere presenti anche nella sequenza del pacchetto corrispondente.

Quando una prenotazione è passata, cioè la settimana è antecedente la data odierna, deve essere cancellata dall'archivio.

All'inizio dell'accesso al sistema, si chiede il pathname del file dal quale prelevare i dati. Poi il sistema presenta la scelta tra l'accesso alle Gestione Prenotazione o Richiesta Prenotazione da parte del cliente e l'accesso alla Gestione Offerta dei pacchetti in una zona riservata ai gestori.

Con la scelta Gestione Offerta, si deve optare per la modifica dell'archivio pacchetti o per esportare/salvare su file testo tutte le prenotazioni di un particolare villaggio. Se la richiesta è di modifica di un pacchetto, il sistema presenta l'elenco dei pacchetti da cui il gestore può selezionarne uno. La modifica di un pacchetto può riguardare una delle componenti NSD, PSD, NSU, PSU, Seq. Se la rimozione di una stanza è possibile (almeno una è ancora disponibile nel periodo selezionato) viene mostrato un messaggio di conferma; altrimenti si presenta il messaggio appropriato (eventualmente, per progetti più ambiziosi, proponendo un trasferimento della prenotazione ad altro villaggio). L'aggiunta di una stanza automaticamente la rende disponibile alle prenotazioni, se la lista d'attesa è vuota.

L'Esportazione crea un file testo cui possiamo assegnare un nome tramite una finestra di dialogo, con i due bottoni OK e Annulla. Il risultato ottenuto premendo il bottone OK è un file di testo con le prenotazioni separate per villaggi e, per ogni villaggio, in ordine (crescente) di numero di settimana.

Alla Richiesta Prenotazione, il sistema mostra l'elenco dei pacchetti da cui il cliente può selezionarne uno, e chiedere la disponibilità per una specifica settimana; a questo punto viene data l'opzione di mostrare i Dettagli del villaggio vacanze con l'eventuale stanza disponibile, e quella per Prenotare la stanza. Con Dettagli, sono evidenziate le caratteristiche del villaggio in formato testo. Con Prenotare, si richiedono i dati del cliente e si mostra un messaggio di conferma della prenotazione; altrimenti si presenta il messaggio d'errore appropriato (carta di credito non valida, stessa settimana già prenotata dallo stesso cliente in altro villaggio, ecc.).

Con la scelta Gestione Prenotazione, si richiedono le informazioni del cliente e la richiesta (se cancellazione o modifica di caratteristiche). Se la rimozione è di una prenotazione esistente per il cliente stesso, viene mostrato un messaggio di conferma, altrimenti si presenta il messaggio d'errore appropriato (un cliente può cancellare solo le proprie prenotazioni esistenti).

Per questa applicazione, si ignorano aspetti di autenticazione dell'utente. Per la verifica della carta di credito, si crea una classe con un solo metodo che restituisce true/false in maniera casuale (preferibilmente true almeno 4 volte su 5).

L'applicazione va sviluppata sia con interfaccia testuale, permettendo che tutti i dati/comandi dall'esterno siano ricevuti da tastiera e/o file (ad esempio, tramite opportuni menu testuali) sia in versione interattiva con un sistema di finestre (come oggetti di classi GestoreFrame, ClienteFrame, ecc.) in cui compaiono le varie alternative visualizzate con pulsanti da "premere" (Aggiungi, Esporta, Dettagli, Prenota, Cancella) e campi dove "selezionare" (per esempio il nome del villaggio) o "inserire" (data, cognome, no. carta di credito, ecc.) le informazioni ricevute dall'esterno. Ovviamente, le due versioni (con l'interfaccia testuale e con l'interfaccia grafica) devono avere in comune tutto ciò che è indipendente dall'interfaccia.

I progetti sviluppati da gruppi di due o tre studenti devono fornire anche il secondo servizio di prenotazione di voli aerei giornalieri, limitati al giorno dopo. In questo caso:

La parte del file con le informazioni relative ai voli è preceduta dalla stringa "VOLI" con il seguente formato:

VOLI        	La stringa "VOLI"
Poi una linea per ogni volo con il seguente formato:
Sigla;ORI;DEST;PART;ARR;rimasti
dove
Sigla  		stringa composta da due lettere maiuscole e due cifre (per esempio AZ34)
ORI    		stringa (luogo di partenza)
DEST   		stringa (luogo di arrivo) 
PART   		orario di partenza
ARR    		orario di arrivo
rimasti  	posti ancora disponibili (intero &ge 0)

La parte del file relativa alle prenotazioni voli inizia con una prima linea che contiene la stringa "PREN VOLI" poi le prenotazioni dei voli sono suddivise in linee con il seguente formato:

C;M;Sigla;ORI;DEST
dove
C     	Cognome del cliente (stringa)
M     	Nome del cliente (stringa)
Sigla   come nella parte VOLI
ORI    	stringa (luogo di partenza)
DEST   	stringa (luogo di arrivo) 

Anche per il servizio voli aerei deve essere sviluppata sia l'interfaccia testuale che quella a finestre.

Valutazione

Il progetto sarà valutato in base ai seguenti aspetti (in ordine di importanza):
  1. Correttezza e rispetto delle specifiche
  2. Qualità della progettazione
  3. Chiarezza e completezza della documentazione
  4. Efficienza

Consegna

La documentazione richiede una breve relazione che descrive le responsabilità di tutte le classi dell'applicazione e le relazioni tra di esse, possibilmente con l'aiuto di un diagramma UML (solo classi). La relazione deve contenere i nomi degli autori e deve essere in uno dei tre formati: testo semplice, PDF o HTML. Inoltre, le classi e i metodi, nei file sorgenti, vanno documentati tramite javadoc e le implementazioni vanno adeguatamente commentate.

Tutti i file del progetto vanno consegnati in un unico file JAR generato seguendo scrupolosamente le indicazioni fornite nella pagina del progetto. I sorgenti del progetto devono essere compilabili (senza errori) ed eseguibili nella piattaforma Java SE 1.6. Questo implica che nessuna libreria esterna, oltre a quelle di Java SE 1.6, può essere usata.