package model;
import java.util.Collection;
import java.util.LinkedList;
import java.util.Map;
import main.config.Config;
import model.data.exceptions.RecordNotFoundException;
import model.data.xml.writers.InvoiceWriter;
import model.data.xml.writers.WarningWriter;
import model.events.EventManager;
import model.events.InRentEditedStateEvent;
import model.events.WarningCreatedEvent;
//import model.events.WarningDeletedEvent;
import model.exceptions.FalseFieldException;
import model.exceptions.FalseIDException;
/**
* Warning.java
*
* @author Christopher Bertels (chbertel@uos.de)
* @date 15.09.2008
*
* Klasse für alle Warnings (Mahnungen).
*/
public class Warning
{
private int wID;
private InRent inRent = null;
private int inRentID;
// private boolean deleted = false;
private static int minwID;
private static Map<Integer, Warning> warningList;
public static final float billFactor = 1.5f;
public static final float getWarningPrice()
{
return Float.parseFloat(Config.get().getSetting(Config.Settings.WARNINGPRICE));
}
/**
* Öffentlicher Konstruktor für Warnings.
*
* @param inRent Das InRent der Warning.
*/
public Warning(InRent inRent)
{
this(minwID, inRent.getID());
this.inRent = inRent;
// inRent.setWarned(true);
minwID++;
// Event feuern
EventManager.fireEvent(new WarningCreatedEvent(this));
warningList.put(this.wID, this);
}
/**
* Privater Konstruktor. Wird nur innerhalb der Klasse (in der
* reCreate-Methode) genutzt.
*
* @param wID
* @param inRentID
*/
private Warning(int wID, int inRentID)
{
this.wID = wID;
this.inRentID = inRentID;
}
/**
* Gibt die ID (Nummer) dieser Warning zurück.
*
* @return Die ID dieser Warning (Mahnung).
*/
public int getID()
{
return this.wID;
}
/**
* @return Die InRentID der zugehörigen InRent.
*/
public int getInRentID()
{
return this.inRentID;
}
/**
* Gibt das InRent zu dieser Warning zurück.
*
* @return Das InRent dieser Warning.
*/
public InRent getInRent()
{
if (this.inRent == null)
{
try
{
this.inRent = InRent.findByID(this.inRentID);
}
catch (RecordNotFoundException e)
{
this.inRent = null;
}
}
return this.inRent;
}
/**
* Erstellt eine Quittung für diese Mahnung im mahnungen/quittungen/ Ordner. Name der
* Quittings-Datei ist die ID dieses Warning Objektes + '.txt'
* @param videoUnits Die VideoUnits die einst dem InRent dieser Warning gehört haben.
*/
public void createInvoice(Collection<VideoUnit> videoUnits)
{
InvoiceWriter writer = new InvoiceWriter();
writer.writeInvoiceFor(this, videoUnits);
}
// /**
// * Entfernt Warning aus globaler Warning-Liste. Wird beim nächsten Speichern
// * nicht mehr mitgespeichert und geht somit verloren.
// */
// public void delete()
// {
// warningList.remove(this.getID());
// this.deleted = true;
// this.getInRent().setWarned(false);
//
// // Event feuern
// EventManager.fireEvent(new WarningDeletedEvent(this));
// }
// /**
// * Gibt an, ob das Objekt gelöscht wurde (via delete())
// *
// * @return True, falls gelöscht, False sonst.
// */
// public boolean isDeleted()
// {
// return this.deleted;
// }
/**
* Wird in der DataBase Klasse aufgerufen um die geladenen Warnings global
* verfügbar zu machen.
*
* @param wID ID der geladenen Warning.
* @param inRentID InRentID der geladenen Warning.
* @return Das geladene Warning Objekt.
*/
public static Warning reCreate(int wID, int inRentID)
{
return new Warning(wID, inRentID);
}
/**
* Gibt eine Warning (Mahnung) zu einer angegebenen ID zurück.
*
* @param warningID Die WarningID zur zu suchenden Warning.
* @return Die Warning (Mahnung), die gesucht wurde.
* @throws RecordNotFoundException Wird geworfen, falls ID ungültig bzw.
* keine Warning mit dieser ID existiert.
*/
public static Warning findByID(int warningID)
throws RecordNotFoundException
{
if (warningList.containsKey(warningID))
{
return warningList.get(warningID);
}
else
{
throw new RecordNotFoundException("Mahnung", "Mahnungsnummer",
warningID);
}
}
/**
* Gibt eine Warning zu einem InRent zurück (falls vorhanden, sonst null).
* @param inRent Das InRent, dessen Warning gefunden werden soll.
* @return Das Warning (falls vorhanden) oder null (falls nicht).
*/
public static Warning findByInRent(InRent inRent)
{
Warning warning = null;
for(Warning w : warningList.values())
{
if(w.getInRent() == inRent)
warning = w;
}
if(warning == null && inRent.isOverDuration())
{
warning = new Warning(inRent);
}
return warning;
}
/**
* Gibt eine Menge von Warnings zu einem angegebenen Customer zurück.
*
* @param customer Der Customer, dessen Warnings gesucht werden.
* @return Die Menge der Warnings des Customers.
*/
public static Collection<Warning> findByCustomer(Customer customer)
{
Collection<Warning> foundWarnings = new LinkedList<Warning>();
for (Warning w : warningList.values())
{
if (w.inRent.getCustomer() == customer)
{
foundWarnings.add(w);
}
}
return foundWarnings;
}
/**
* Gibt alle Warnings (Mahnungen) in der Datenbasis zurück.
*
* @return Alle vorhandenen (gespeicherten) Warnings.
*/
public static Collection<Warning> findAll()
{
return warningList.values();
}
/**
*
* @param newWarningList Setzt die neue (globale) Liste von Warnings.
* @throws FalseFieldException Wird geworfen, falls der übergebene Wert
* ungültig (null) ist.
*/
public static void setWarningList(Map<Integer, Warning> newWarningList)
throws FalseFieldException
{
if (newWarningList != null)
{
warningList = newWarningList;
}
else
{
throw new FalseFieldException("WarningsList is null!");
}
}
/**
* Setzt die MinID für Warnings.
*
* @param newMinwID Die neue MinID für Warnings.
* @throws FalseIDException Wird geworfen, falls übergebener Wert ungültig
* ist.
*/
public static void setMinID(int newMinwID) throws FalseIDException
{
if (newMinwID > 0)
{
minwID = newMinwID;
}
else
{
throw new FalseIDException(
"Übergebene MinID für Warnings ist kleiner 0!");
}
}
/**
* Gibt die MinID für Warnings zurück.
*
* @return Die MinID für Warnings.
*/
public static int getMinID()
{
return minwID;
}
/**
* Übergibt alle noch ausstehenden Mahnungen (Warnings) dem WarningWriter
* und schreibt sie in eine Datei.
*
* @return Die Menge der neuen Mahnungen, die erstellt wurden.
*/
public static Collection<Warning> createPendingWarnings()
{
WarningWriter writer = new WarningWriter();
Collection<Warning> newPendingWarnings = InRent.getNewWarnings();
for(Warning w : newPendingWarnings)
{
writer.writeWarning(w);
w.inRent.setWarned(true);
EventManager.fireEvent(new InRentEditedStateEvent(w.inRent));
}
return newPendingWarnings;
}
/**
* überprüft, ob neue Mahnungen fällig sind, die noch nicht erstellt wurden
* @return true, wenn neue Mahnungen fällig, false sonst
*/
public static boolean newWarnings()
{
return InRent.newWarnings();
}
/**
* liefert eine Liste der neuen, fälligen und noch nicht erstellten Mahnungen
* @return Liste der neuen Mahnungen
*/
public static Collection<Warning> getNewWarnings()
{
return InRent.getNewWarnings();
}
}