Distributore di bevande

Sviluppare un programma per la gestione di un distributore di bevande che risponda ai seguenti requisiti.
Si parte dal progetto Eclipse (Istruzioni)


R1: Tipi di Bevande

Il distributore di bevande è in grado di erogare alcuni tipi di bevande; ogni bevanda è caratterizzata da un codice, nome ed un prezzo. Ad esempio:

Codice
Bevanda
Prezzo
A
Acqua
0.20
B
Coca
0.30
C
Birra
1.00

Il metodo aggiungiBevanda() permette di aggiungere la descrizione di una bevanda.
Il distributore permette di conoscere, dato il codice, il prezzo e il nome della bevanda tramite i metodi getPrice() e getName() rispettivamente.
Quando si richiede un codice corrispondente ad una bevanda non disponibile, viene generata un'eccezione di BevandaNonValida.

R2: Credito

Il distributore può essere utilizzato con delle tessere di credito. Ogni tessera è caratterizzata da un codice (un numero intero) e da un credito disponibile. I crediti vengono definiti tramite il metodo caricaTessera(). In qualsiasi istante è possibile sapere il credito residuo di una tessera tramite il metodo leggiCredito() che riceve come parametro il codice della tessera; in caso di codice di tessera non valido viene restituita un'eccezione di TesseraNonValida.
Esempio di tessere:

Codice
Credito
12 5.5
21 10.0
99 0.75

R3: Approvigionamento Distributore.

Il distributore è costituito da quattro colonne in cui sono disposte le lattine delle bevande. Ogni colonna contiene un unico tipo di bevanda ed è caratterizzata dal numero di lattine contenute e dal tipo di bevanda che contiene. In partenza tutte le colonne sono vuote.
Quando viene ricaricato il distributore viene assegnato ad ogni colonna un tipo di bevanda ed il numero di lattine presenti; a questo scopo si usa il metodo aggiornaColonna() che riceve come parametro il numero della colonna, il tipo di bevanda e il numero di lattine presenti nella colonna.
Le colonne sono numerate a partire da 1.
Esempio:

Numero
Colonna
Nome
Bibita
Lattine
1
Acqua 40
2
Coca 1
3
Birra 50
4
Acqua 50

Dato un codice di una bibita (es. "A") è possibile sapere quante lattine sono disponibili tramite il metodo lattineDisponibili(). Il metodo somma tutte le lattine disponibili in tutte le colonne che contengono il tipo di bevanda data.

R4: Erogazione

Il distributore eroga le bevande specificando il codice della bevanda e il codice della tessera con cui pagare. Se i codici (di bevanda e di tessera) sono validi, il credito residuo della tessera è almeno pari al prezzo della bevanda ed esiste almeno una lattina disponibile per la bevanda selezionata, il distributore decrementa il credito residuo della tessera del prezzo della bevanda, e riduce il numero di lattine disponibili nella colonna che le contiene.
L'erogazione viene fatta tramite il metodo eroga() che restituisce il numero della colonna da cui viene prelevata la lattina.
Se il credito residuo della tessera non è sufficiente il distributore segnala l'errore generando un'eccezione di CreditoInsufficiente.
Se non ci sono lattine disponibili in nessuna colonna il metodo genera un'eccezione di BevandaEsaurita.