Progetto di Programmazione Internet A.A. 2002/03
rev 1.3 dello 01/01/03

Il progetto consiste nell'implementazione di un semplice cliente testuale di posta elettronica.
Tale programma deve mantenere una lista locale di messaggi di posta ricevuti (inbox) che deve essere resa disponibile fra sessioni diverse (deve quindi essere memorizzata su file system) prima della chiusura del programma.

Funzionamento del programma

La normale interfaccia del programma consiste in una lista di messaggi (se disponibili) nella quale, uno per riga, appaiono il subject del messaggio, il mittente e la data di spedizione. Tali messaggi vanno contrassegnati con una numerazione crescente a partire dal numero 1.

Subito sotto la lista dei messaggi sara' ricavato uno spazio per leggere l'input dell'utente che attraverso opportune istruzioni porta' svolgere determinate operazioni.

Il programma permette di operare sui messaggi di posta elettronica ricevuti come segue:

• mostrare la lista a partire da un indice specificato
• ordinare la visualizzazione della lista dei messaggi per:
   • campo from (ordine alfabetico);
   • campo subject (ordine alfabetico);
   • data (dal piu' vecchio al piu' recente o viceversa);
• leggere uno specifico messaggio;
• cancellare un messaggio;
• scaricare nuovi messaggi dall'ingoing mail server;

Il programma permette la spedizioni di nuovi messaggi.

Tutte le funzionalita' sopra indicate vanno attivate dall'utente attraverso l'immissione di appositi comandi la cui sintassi e':

1. sort {from|subject|date [descending]}
2. show <N>
3. delete <N>
4. download
5. send <address>
6. <N>
7. quit

Dove <N> e' un numero intero che individua un messaggio all'interno della lista dei messaggi disponibili all'interno della casella.

Dettaglio dei comandi.

1. ordina la visulizzazione dei messaggi secondo il criterio specificato;
2. visualizza il messaggio specificato;
3. cancella il messaggio specificato;
4. si collega all'ingoing mail server e scarica gli eventuali nuovi messaggi;
5. spedisce un messaggio di posta. Dopo aver immesso questo comando l'utente potra' comporre il messaggio su piu' righe terminandolo con una riga col solo carattere '.'; il programma quindi chiedera' conferma per l'effettiva spedizione;
6. mostra la lista dei messaggi a partire dal messaggio con indice <N> (se esistente);
7. esce dall'applicazione.

Protocolli da utilizzare.

Il programma dovra' interfacciarsi verso l'ingoing mail server usando il protocollo POP3 che deve essere supportato come descritto nelle specifiche dell'RFC 1939.
Si puo' assumere che il server supporti il comando TOP.
Se l'utente non avra' specificato lo username e la password da utilizzare per l'autenticazione il programma (solo al primo collegamento) li chiedera' all'utente.
Nel caso in cui username e password non dovessero essere corrette il programma chiedera' all'utente di reinserirle o di annullare lo scaricamento dei messaggi.

Per la posta in uscita si deve utilizzare un sottoinsieme del protocollo SMTP (RFC 2821) come descritto in appendice A.

Parametri su riga di comando.

[-ip inport] [-op outport] [-u username password] <email> <inserver> <outserver>

dove:

inport e' il port cui connettersi all'ingoing mail server (se omesso si assume 110)
outport e' il port cui connettersi all'outgoing mail server (se omesso si assume 25)
username e password sono l'username e la password da usare per autenticarsi presso l'ingoing mail server
email e' l'indirizzo di email dell'utente (da usare in fase di spedizione dei messaggi)
inserver e' l'indirizzo mnemonico dell'ingoing mail server
outserver e' l'indirizzo mnemonico dell'outgoing mail server

Note sull'implementazione.

Il programma non dovra' fare uso di classi che non siano parte del programma stesso o che non siano parte della libreria di classi standard di Java 2, Standard Edition versione 1.4.

All'esecuzione il programma puo' caricare in memoria tutto il contenuto (se presente) dell'inbox memorizzata in sessioni precedenti.

Eventuali comandi errati immessi dall'utente (sintassi errata, riferimenti a numeri di messaggi non esistenti, ecc...) non devono compromettere la funzionalita' del programma e devono risultare in messaggi d'errore chiaramente interpretabili dall'utente.

Il programma puo' assumere, per miglior formattazione dell'output, che la dimensione del terminale sia di 25 righe da 80 caratteri.

Gruppi

I gruppi dovranno essere composti da due o tre persone. In casi particolari (es. studenti lavoratori) potrebbero essere accettati anche gruppi da uno previo richiesta con mail alla dott. Turrini.

Modalita' di consegna

Occorre consegnare in formato digitale (mail a turrini@cs.unibo.it) un file in formato jar (per info sul formato jar fare riferimento a: http://developer.java.sun.com/developer/Books/JAR/basics/index.html) contenente le seguenti directory:

• src
contiente i sorgenti del progetto. Si ricorda che i sorgenti devono essere scritti seguendo opportune regole di coding style (http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html), devono essere commentati in maniera chiara e non banale.
Es. di commento banale:
i++; // incremento della variabile
es. di commento appropriato:
// ricerca della prima posizione libera
while ((tree[firstFreePosition] != null) && (i < size)) {
  firstFreePosition = (firstFreePosition + 1) % size;
  i++;
}
if (tree[firstFreePosition] != null){
  firstFreePosition = -1;
}


• classes
contenente i file .class con il bytecode risultante dalla compilazione dei sorgenti

• doc
contente la documentazione che deve essere scritta e quindi generata automaticamente utilizzando javadoc. Inoltre occorre aggiungere un documento project.html in formato HTML dove vengono descritte le scelte progettuali effettuate (per esempio: uso di una certa struttura dati piuttosto che un'altra, descrizione per sommi capi della struttura del progetto e del codice sorgente dei metodi piu' importanti )

• dist
contenente il file jar da installare. Tale file deve contenere i .class e il file manifest nel quale e' indicato l'entry point.
In sostanza facendo java -jar nome.jar deve venire lanciato il vostro programma.

La mail deve avere subjet "consegna progetto <nomeGruppo>" e in attachment il file <nomeGruppo.jar>. Il nome gruppo deve essere di al massimo 6 digit (lettere o numeri) (puo' essere formato con le sillabe iniziali dei cognomi) e deve contenere solo lettere e numeri.

La documentazione deve essere consegnata anche in formato cartaceo lasciandola nella casella di posta dei dottorandi (che si trova al primo piano del dipartimento di informatica) indirizzata alla dott. Turrini.

Vanno consegnate in forma cartacea i seguenti files:

project.html
tutti i file sorgenti stampati in orizzontale (sotto linux si puo' usare enscript -r nomefile).
Ogni file deve essere graffettato nell'angolo in alto a sinistra.

I tempi per la consegna della documentazione cartacea sono gli stessi della consegna del progetto.

Tempi di consegna

Chi intende sostenere lo scritto in data 28 gennaio deve consegnare il progetto entro le ore 10 del 22 gennaio. Chi intende sostenere lo scritto in data 17 febbraio deve consegnare il progetto entro le ore 10 dell' 11 febbraio. Chi intende sostenere l'esame in altri appelli deve comunque consegnare il progetto inderogabilmente entro le ore 10 del 23 febbraio (essendo il 23 febbraio una domenica la consegna della documentazione cartacea e' spostata a lunedi' 24).

Valutazione del progetto

Alla discussione del progetto devono essere presenti tutti i membri del gruppo.
Essa mira ad individuare il livello di comprensione di cio' che e' stato consegnato e l'attiva partecipazione di tutti i membri del gruppo alla realizzazione del progetto.
Ecco un esempio delle domande che potranno essere fatte:
• spiegare alcune scelte progettuali
• spiegare cosa fa un determinato metodo
• spiegare l'organizzazione delle classi

Appendice A - Sottoinsieme del protocollo SMTP da utilizzare per la spedizione dei messaggi.

Per inviare dei messaggi di posta elettronica una volta connessi all'outgoing mail server
attenersi al seguente protocollo; il protocollo prevede la ricezione e l'invio di una sequenza di messaggi.

Prima di tutto il server invia un messaggio al client che, in assenza di errori,
inizia con il codice "220".

Segue poi la seguente sequenza di messaggi generati dal client a fronte dei quali, in assenza di errori,
il server risponde con un messaggio che inizia col codice indicato fra parentesi. Nel caso in cui il codice
sia diverso si deve interrompere la procedura e ritornare un errore all'utente.

Messaggio1:
HELO hostname.domainname
(220)

Messaggio2:
MAIL FROM: <sender>
(250)

Messaggio3:
RCPT TO: <recipient>
(250)

Messaggio4:
DATA
(354)

Messaggio5:
Subject: soggetto
From: mittente
To: destinatario

messaggio
su
piu'
linee
.
(250)

Messaggio6:
QUIT
(221)

Nota: il Messaggio5 e' formato da una prima linea contenente il soggetto, da una linea vuota, e da una piu' linee terminate da una linea che contiene il solo carattere '.'.
sender e recipient nei messaggi 1 e 2 sono gli indirizzi di posta elettronica del mittente e del destinatario, i caratteri '<' e '>' non servono a contrassegnare simboli non terminali ma devono fare parte dei messaggi.
Il Messaggio1 prevede che il client si identifichi presso il server con il proprio hostname seguito dal carattere '.' seguito dal proprio domainname; per determinare quali stringhe usare si possono usare metodi quali getLocalAddress della classe Socket.
Come previsto dal protocollo SMTP al termine di ogni messaggio (e anche al termine di ogni linea nel caso di un messaggio multi-linea) il separatore da usare e' la sequenza CRLF (cioe' CarriageReturn seguito da LineFeed), tale sequenza corrisponde al letterale Java "\r\n".

Appendice B - Addendum alle specifiche per gli studenti del secondo anno

• Usare sempre, per ogni revisione sui sorgenti, il tool RCS effettuando il checkin con commenti adeguati.
• Per la compilazione e la generazione dei commenti JavaDOC si deve utilizzare il tool ANT.
• Utilizzare XML per memorizzare i dati sul file (DTD a vostro piacimento purche' sensato).

Ovviamente in questo caso dovranno essere consegnati anche:
• il file build.xml (contenenti almeno i task javac, javadoc, jar piu' il target di init e di clean e un target help, implementato utilizzando il task echo, che permette di visualizzare il nome dei vari target e cosa fanno). Il file build.xml deve essere consegnato anche in formato cartaceo.
• i file generati con RCS

ChangeLog

1.1 - Corretti alcuni errori e aggiunti alcuni header al protocollo dell'appendice A
1.2 - Aggiunta l'appendice B; precisati i tempi di consegna; ritocchi alla formattazione
1.3 - Aggiunto il comando quit