1 - Descrizione
Il progetto consiste nel realizzare un programma per gestire il log di un rudimentale sistema di eCommerce. Per log si intende in genere un file di testo contenente informazioni generate in modo incrementale da un sistema hardware e/o software. Ogni volta che una nuova informazione viene generata, questa viene anche aggiunta al log secondo una qualche regola. Noi adotteremo le seguenti semplificazioni:
-
le informazioni da registrare nel log sono di due tipi:
- acquisto di uno o più prodotti nel sito (situazione a cui ci riferiremo parlando di evento cliente);
- visita a un link pubblicitario che parte dal sito (situazione a cui ci riferiremo parlando di evento web)
- un log è accessibile leggendo o scrivendo un'intera riga di testo; una riga si riferisce a uno ed un solo evento;
- man mano che vengono aggiunte nuove righe a un log, queste vengono inserite all'inizio del file, spostando le righe rimanenti in avanti di una posizione.
2 - Il formato del log
I contenuti di una generica riga del devono essere separati dal carattere di barra verticale.
Ogni riga che si riferisce a un evento cliente deve contenere i seguenti dati (nell'ordine specificato), tutti in formato testuale:
- un numero intero, che indica la priorità dell'evento
-
una data, espressa indicando il giorno (espresso nel formato
gg/mm/aaaa
), un carattere di spazio, e l'ora (espressa nel formatohh:mm:ss
seguito dalla stringaAM
o dalla stringaPM
) -
Una stringa di caratteri che inizia con i tre caratteri
CL:
e continua con una descrizione testuale dell'evento - Una stringa di caratteri che indica il nome di login dell'utente che ha effettuato l'acquisto
- Un numero decimale che indica il valore totale in Euro dei beni acquistati
La seguente riga riporta un esempio di evento cliente:
2|22 Dec 2003 15:20:21 GMT|CL:descrizione1|pippo|500.0
Ogni riga che si riferisce a un evento web deve contenere i seguenti dati (nell'ordine specificato), tutti in formato testuale:
- un numero intero, che indica la priorità dell'evento
-
una data, espressa indicando il giorno (espresso nel formato
gg/mm/aaaa
), un carattere di spazio, e l'ora (espressa nel formatohh:mm:ss
seguito dalla stringaAM
o dalla stringaPM
) -
Una stringa di caratteri che inizia con i tre caratteri
WE:
e continua con una descrizione testuale dell'evento - Una stringa di caratteri che indica l'indirizzo del sito visitato
-
Una stringa che indica l'indirizzo IP numerico da cui proviene l'utente che ha cliccato sul link pubblicitario. Un indirizzo IP numerico individua in modo univoco un elaboratore collegato a una rete che utilizza il protocollo TCP-IP (su cui si basa internet). Questo tipo di indirizzo è specificato indicando quattro numeri interi, compresi tra 0 e 255, separati da un punto. Ad esempio
159.149.147.1
indica un indirizzo ip simbolico. Gli indirizzi simbolici che si specificano ad esempio in un web browser vengono tradotti in indirizzi IP numerici grazie all'ausilio di particolari database chiamati DNS. Ad esempio l'indirizzowww.dsi.unimi.it
viene tradotto nell'indirizzo IP numerico159.149.147.1
La seguente riga riporta un esempio di evento web:
8|22 Dec 2003 15:20:21 GMT|WE:descrizione2|http://www.dsi.unimi.it|159.149.181.6
Nel sito di sottoposizione del progetto (cfr. la sezione 5) è disponibile un log di esempio in formato elettronico.
Attenzione! I formati per indicare date ed ore sono indicativi: è pertanto possibile fare riferimento ad altri tipi di formati, purchè questi siano adeguati a indicare in modo equivalente a quello richiesto una data e un'ora. Qualora si scelga di utilizzare un formato alternativo, il progetto dovrà essere sviluppato in modo coerente. Ovviamente in quest'ultimo caso il log di esempio descritto nel paragrafo precedente potrebbe non risultare utilizzabile.
3 - Le classi da realizzare
E' obbligatorio realizzare in JAVA il programma descritto nella sezione precedente utilizzando le seguenti classi:
-
IP
, che descrive un generico indirizzo ip numerico. La classe dovrà avere i seguenti contenuti:-
int[] numeric
: variabile d'istanza che contiene i quattro numeri di un indirizzo IP numerico -
IP(int, int, int, int)
: costruttore che interpreta i quattro argomenti come i quattro numeri di un indirizzo IP numerico -
IP(String)
: costruttore che interpreta la stringa passata come una sequenza di quattro numeri interi, compresi tra 0 e 255, separati da punti. Se vi sono errori di conversione o di formato della stringa è necessario emettere un'eccezione appropriata -
String toString()
: metodo che ritorna una stringa contenente la tipica visualizzazione di un indirizzo IP, in cui i singoli valori numerici sono separati da un punto
-
-
classe
Event
, che indica un generico evento-
int priority
: variabile d'istanza che indica la priorità dell'evento -
java.util.Date arrivalDate
: variabile d'istanza che indica la data di arrivo dell'evento -
String description
: variabile d'istanza che indica la descrizione dell'evento -
Event(String)
: costruttore che interpreta la stringa passata come la sequenza delle tre variabili di istanza (nell'ordine sopra indicato) separate da una barra verticale. Se vi sono errori di conversione o di formato della stringa è necessario emettere un'eccezione
-
-
classe
WebEvent
(derivata daEvent
), che indica un generico evento web. La classe dovrà avere i seguenti contenuti:-
String adUrl
: variabile d'istanza contenente l'URL del sito a cui punta il link pubblicitario, cioè l'indirizzo della formahttp://xxxx
tipicamente usato in un web browser, dovexxxx
rappresenta una serie di parole separate da punti -
IP referrer
: variabile d'istanza contenente l'indirizzo IP numerico da cui proviene l'utente -
WebEvent(String s)
: costruttore che interpreta la stringa passata come la sequenza delle cinque variabili di istanza (prima le tre della classeEvent
e poi le due della classeWebEvent
, tutte nell'ordine sopra indicato) separate da una barra verticale. Se vi sono errori di conversione o di formato della stringa è necessario emettere un'eccezione
-
-
classe
ClientEvent
(derivata daEvent
), che indica un generico evento cliente. La classe dovrà avere i seguenti contenuti:-
String login
: variabile d'istanza contenente il nome di login dell'utente che ha effettuato l'acquisto -
double price
: variabile d'istanza contenente il prezzo totale dei prodotti acquistati -
ClientEvent(String s)
: costruttore che interpreta la stringa passata come la sequenza delle cinque variabili di istanza (prima le tre della classeEvent
e poi le due della classeClientEvent
, tutte nell'ordine sopra indicato) separate da una barra verticale. Se vi sono errori di conversione o di formato della stringa è necessario emettere un'eccezione
-
-
classe
Log
, che indica un generico log. La classe dovrà avere i seguenti contenuti:-
String name
: variabile d'istanza contenente il nome del file in cui è memorizzato il log -
Event[] data
: variabile d'istanza che contiene il log, sotto forma di array di eventi -
Log(String)
: costruttore che legge il log contenuto nel file di testo il cui nome è specificato come argomento e istanzia l'oggetto corrispondente -
String toString()
: metodo che crea e ritorna una stringa contenente l'intero log -
void write()
: metodo che scrive il contenuto del log nel file corrispondente, cancellando i contenuti precedenti -
void reload()
: metodo che ricarica dal file i contenuti del log nell'oggetto -
Log duplicate()
: metodo che crea una copia dell'oggetto e la ritorna -
void backup(String)
: metodo che effettua una copia di backup del log, salvandola in un file il cui nome è specificato nella stringa passata come argomento -
void trim(double)
: metodo che mantiene solo la percentuale di eventi più recenti del log contenuta nell'argomento (che deve quindi contenere un numero tra zero e uno, emettendo un'eccezione in caso contrario). Gli eventi rimanenti devono essere eliminati, dopodichè il log deve essere scritto sul relativo file -
void trim(Date)
: metodo che elimina dal log tutti gli eventi anteriori alla data passata come argomento. Dopo questa operazione il log deve essere scritto sul relativo file -
void receiveEvent(Event)
: metodo che riceve un generico evento, specificato come argomento, che aggiunge nel log caricato in memoria, SENZA aggiornare la versione salvata su disco. L'evento ricevuto va salvato come PRIMA riga del log, e gli eventi rimanenti devono essere spostati ognuno in avanti di una posizione -
boolean check()
: metodo che verifica che il log sia consistente dal punto di vista temporale, e cioè che le righe siano ordinate per data decrescente, ritornando true in caso affermativo e false in caso negativo
-
-
classe
MainLoop
, che tramite un menù testuale permetta di effettuare le seguenti operazioni, tramite una o più chiamate ai metodi delle classi sopra descritte:- Creazione di un nuovo log
- Aggiunta di un nuovo evento al log
- Salvataggio del contenuto corrente del log su disco
- Ricarica del contenuto del log da disco, con conseguente eliminazione del contenuto corrente
- Visualizzazione dei contenuti del log
- Creazione di una copia del log, in un altro file di testo il cui nome va specificato dall'utente
- Eliminazione di una percentuale dei contenuti del log
- Eliminazione dei contenuti del log anteriori a una certa data, specificata dall'utente
- Verifica della consistenza temporale del log
A parte quanto espressamente richiesto, è lasciata piena libertà sull'implementazione delle singole classi e sull'eventuale introduzione di altre classi, a patto di seguire le regole del paradigma ad oggetti ed i principi di buona programmazione.
Non è richiesto l'utilizzo di particolari modalità grafiche di visualizzazione: è sufficiente una qualunque modalità di visualizzazione basata sull'uso dei caratteri.
E' invece espressamente richiesto di non utilizzare package non standard di Java (si possono quindi utilizzare java.util
, java.io
e così via), con l'unica eccezione package prog.io
incluso nel libro di testo per gestire l'input da tastiera e l'output a video.
4 - Gestione delle date
In vari punti del progetto è espressamente richiesto di gestire delle date. In questo testo è stato fatto riferimento alla classe java.util.Date
, vista a lezione. Nella documentazione delle API di Java è possibile trovare informazioni dettagliate su questa classe che permettono di realizzare alcuni dei metodi di cui è richiesta l'implementazione. In alternativa è possibile utilizzare anche la classe java.text.DateFormat
.
5 - Modalità di consegna
Il progetto può essere svolto al massimo da tre persone che intendono sostenere l'intero esame di Informatica Generale e Laboratorio negli appelli di Febbraio o Aprile 2004, e deve essere consegnato entro mezzanotte di venerdì 6 febbraio 2004, utilizzando il sito di sottoposizione delle esercitazioni (all'indirizzo http://infogen.dsi.unimi.it). Per poter effettuare la sottoposizione è necessario autenticarsi utilizzando un nome di login e una password. Nella pagina principale del sito stesso è spiegato come ottenere questi dati. Nel caso il progetto venga svolto da più di una persona, dovrà essere fatta in ogni caso una sola sottoposizione, indicando chiaramente in un commento all'inizio dei sorgenti consegnati nome, cognome e matricola dei vari componenti del gruppo
Dovranno essere consegnati tutti i sorgenti Java che permettano al programma di essere eseguito correttamente, compressi in un archivio di tipo ZIP che estragga i file nella directory in cui si trova l'archivio stesso (altri tipi di sottoposizioni verranno automaticamente rifiutate dal sito). Nell'archivio dovrà anche essere accluso un breve documento in formato txt o rtf in cui
- verrà descritto il modo in cui interfacciarsi con il programma
- saranno illustrate le principali scelte implementative e le strategie utilizzate per svolgere il progetto Il sistema rifiuterà automaticamente le sottoposizioni i cui sorgenti contengano errori rilevati in fase di compilazione.
E' inoltre richiesto di consegnare una copia cartacea della stampa del codice sorgente prodotto in portineria del DSI indicando chiaramente nome, cognome e numero di matricola di tutti i componenti del gruppo, nonchè il turno e il docente di riferimento.
6 - Valutazione
Durante la prova orale con i singoli studenti saranno discusse le modalità implementative adottate e la padronanza di alcuni dei concetti necessari per preparare il progetto e/o spiegati a lezione. La valutazione del progetto sarà fatta in base alla
- conformità dell'implementazione scelta per risolvere il problema con il paradigma di programmazione a oggetti;
- conformità del codice presentato alle regole di buona programmazione;
- adeguatezza del manuale utente presentato a descrivere il modo in cui un utente può utilizzare il programma;
- assenza di errori nel programma;
- usabilità del programma;
Dario Malchiodi Dipartimento di Scienze dell'Informazione Via Comelico 39/41 20135 Milano Stanza T304 – Tel. +39 02 503 16338 eMail malchiodi@dsi.unimi.it |
Walter Cazzola Dipartimento di Informatica e Comunicazione Via Comelico 39/41 20135 Milano Stanza S233 – Tel. +39 0103536637 eMail cazzola@disi.unige.it |