// Das hier steht im DatenbankManager (dataStore)
public ArrayList<Zimmer> getAllFreieZimmer() throws java.sql.SQLException {
ArrayList<Zimmer> freieZimmer = new ArrayList<Zimmer>();
Zimmer zimmer;
int znr;
String zbez;
double kosten_pro_nacht;
boolean dusche, balkon, tier, tv, raucherzimmer;
String anJahr, anMonat, anTag, abJahr, abMonat, abTag;
if (BuchungsManager.getTheBuchungsManager().getAnreiseJahr() == null) {
anJahr = "2016";
} else {
anJahr = BuchungsManager.getTheBuchungsManager().getAnreiseJahr();
}
if (BuchungsManager.getTheBuchungsManager().getAnreiseMonat() == null) {
anMonat = "01";
} else {
anMonat = BuchungsManager.getTheBuchungsManager().getAnreiseMonat();
}
if (BuchungsManager.getTheBuchungsManager().getAnreiseTag() == null) {
anTag = "01";
} else {
anTag = BuchungsManager.getTheBuchungsManager().getAnreiseTag();
}
if (BuchungsManager.getTheBuchungsManager().getAbreiseJahr() == null) {
abJahr = "2016";
} else {
abJahr = BuchungsManager.getTheBuchungsManager().getAbreiseJahr();
}
if (BuchungsManager.getTheBuchungsManager().getAbreiseMonat() == null) {
abMonat = "01";
} else {
abMonat = BuchungsManager.getTheBuchungsManager().getAbreiseMonat();
}
if (BuchungsManager.getTheBuchungsManager().getAbreiseTag() == null) {
abTag = "01";
} else {
abTag = BuchungsManager.getTheBuchungsManager().getAbreiseTag();
}
if (theSetup.isDBactive()) { // wenn mit DB gearbeitet wird, dann
if (conn == null) { //keine Datenbabk verfügbar!
return freieZimmer; // Leere Gästeliste melden
}
ResultSet rs = reader.query("SELECT Zimmer.Zimmernr, Zimmer.Zimmerbezeichnung, Zimmer.KostenproNacht, zimmer.dusche, zimmer.balkon, zimmer.tier, zimmer.tv, zimmer.raucherzimmer FROM Zimmer WHERE Zimmernr NOT IN"
+ "(SELECT Zimmer.Zimmernr FROM Buchung, Zimmer "
+ "WHERE (Anreisedatum BETWEEN '" + anJahr + "-" + anMonat + "-" + anTag + "' "
+ "AND '" + abJahr + "-" + abMonat + "-" + abTag + "' "
+ "OR Anreisedatum <= '" + anJahr + "-" + anMonat + "-" + anTag + "')"
+ "AND (Abreisedatum BETWEEN '" + anJahr + "-" + anMonat + "-" + anTag + "' "
+ "AND '" + abJahr + "-" + abMonat + "-" + abTag + "' "
+ "OR Abreisedatum >= '" + abJahr + "-" + abMonat + "-" + abTag + "') "
+ "AND (Buchung.Zimmernummmer = Zimmer.Zimmernr))"
+ "ORDER BY Zimmernr");
// jetzt alle Gäste anlegen und der Liste hinzufügen
while (rs.next() == true) { // solange ein Datensatz da ist:
znr = rs.getInt("ZimmerNR");
zbez = rs.getString("Zimmerbezeichnung");
kosten_pro_nacht = rs.getDouble("KostenproNacht");
dusche = rs.getBoolean("Dusche");
balkon = rs.getBoolean("Balkon");
tier = rs.getBoolean("Tier");
tv = rs.getBoolean("TV");
raucherzimmer = rs.getBoolean("Raucherzimmer");
// Jetzt wird der Gast erschaffen...
zimmer = new Zimmer(znr, zbez, kosten_pro_nacht, dusche, balkon, tier, tv, raucherzimmer);
// Und jetzt in unsere Gästeliste eingefügt
freieZimmer.add(zimmer);
}
reader.closeResult(rs); // Arbeit getan, Reader kann rs schließen
}
return freieZimmer;
}
// Einen neuen Gast in die Datenbank einfügen
public void addZimmer(Zimmer einZimmer) {
if (theSetup.isDBactive()) { // wenn mit DB gearbeitet wird, dann
if (conn == null) { // gar keine Datenbank verfügbar, daher...
return; // ... gibt es nichts zu tun!
}
String sql = "INSERT INTO ZIMMER ";
sql += "(ZIMMERNR, KATEGORIEBEZEICHNUNG, ZIMMERBEZEICHNUNG, KOSTENPRONACHT, ANZAHLBETTEN, DUSCHE, BALKON, TIER, TV, RAUCHERZIMMER) ";
sql += "VALUES (?,?,?,?,?,?,?,?,?,?)";
try {
PreparedStatement pstmt = mrDB.createPreparedStatement(sql);
pstmt.setInt(1, einZimmer.getZimmerNr());
pstmt.setString(2, einZimmer.getKategorieBezeichnung());
pstmt.setString(3, einZimmer.getZimmerBezeichnung());
pstmt.setDouble(4, einZimmer.getKosten_pro_nacht());
pstmt.setInt(5, einZimmer.getAnzahlBetten());
pstmt.setBoolean(6, einZimmer.isDusche());
pstmt.setBoolean(7, einZimmer.isBalkon());
pstmt.setBoolean(8, einZimmer.isTier());
pstmt.setBoolean(9, einZimmer.isTv());
pstmt.setBoolean(10, einZimmer.isRaucherzimmer());
pstmt.executeUpdate();
pstmt.close();
} catch (SQLException e) {
System.out.println("DB-Fehler beim Einfügen Zimmer: " + einZimmer);
System.out.println(e.getMessage());
System.exit(0);
}
}
if (theSetup.isDebugModus()) {
System.out.println("DB-Manager: neues Zimmer eingefügt: " + einZimmer);
}
}
//Das hier ist der FreieZimmerManager
package appcenter;
import dataStore.DbManager;
import java.sql.SQLException;
import java.util.ArrayList;
public class FreieZimmerManager {
// der DB-Manager
private final DbManager mrDB;
// der Puffer in dem alle Gastobjekte liegen werden
private ArrayList<Zimmer> freieZimmerListe;
// wo wir in der Gästeliste gerade sind
private int pZimmerPosition = 0;
// Es folgt der ALLEINIGE Manager, der sich um alle Daten kümmert
// er darf KEINEN Kollegen haben, daher ist auch er ein 'Singleton'
// Wir merken uns den Manager hier in der Klasse, daher static
private static FreieZimmerManager derFreieZimmerManager;
// getTheGastManager() liefert dem Aufrufer das Objekt derGastManager.
// Wenn derGastManager noch nicht da ist, wird er geschaffen
public static FreieZimmerManager getTheFreieZimmerManager() {
if (derFreieZimmerManager == null) {
// noch kein Manager existent, daher erst mal einen machen:
derFreieZimmerManager = new FreieZimmerManager();
}
return derFreieZimmerManager;
}
// hier nun der Konstruktor der Klasse GastManager:
// durch 'private' verhindern wir, dass irgendwer weitere Manager macht
private FreieZimmerManager() {
// Zuerst holen wir den den für die Datenhaltung zuständigen DB-Manager.
// Dieser kümmerst sich um die ganzen Datenspeicherungen auf Platte...
mrDB = DbManager.getTheDBManager();
// Nun die Gäste vorbereiten, indem wir alle Gäste aus der DB holen
try {
freieZimmerListe = mrDB.getAllFreieZimmer();
} catch (java.sql.SQLException e) {
System.out.println("Fehler beim Laden der Zimmer!");
e.printStackTrace();
System.exit(0); // Programm abbrechen!!
}
} // Ende des Konstruktors
public int getAnzahlZimmer() {
return freieZimmerListe.size();
}
public ArrayList<Zimmer> getAlleZimmer() {
return freieZimmerListe;
}
public Zimmer getZimmer(int pos) {
//Holt den Gast aus der Liste, der auf Listenplatz pos liegt
//Falls das nicht möglich ist, wird null geliefert
if (freieZimmerListe.isEmpty()) { // NUll liefern, wenn gar keine Gäste da sind
return null; // Puffer leer
}
// Auch null liefern, wenn pos ausserhalb des Puffers liegt
if (pos < 0 || pos >= freieZimmerListe.size()) {
return null;
}
pZimmerPosition = pos; // An diese Listenposition gehen und...
return freieZimmerListe.get(pZimmerPosition); // dortigen Gast liefern
}
public Zimmer getZimmer() {
//holt den Gast, der an der AKTUELLEN Pufferposition gespeichert ist
return getZimmer(pZimmerPosition);
}
public Zimmer getFirstZimmer() {
//holt den ersten Gast am Beginn der Gästeliste
pZimmerPosition = 0; // An den Anfang der Gästeliste gehen
return getZimmer(pZimmerPosition); // dortigen Gast liefern
}
public Zimmer getLastZimmer() {
//holt den Gast am Listenende
pZimmerPosition = freieZimmerListe.size() - 1; // ans Ende der Liste gehen
return getZimmer(pZimmerPosition); // dortigen Gast liefern
}
public Zimmer getNextZimmer() {
//holt den Gast an der nächsten Listenposition
pZimmerPosition++; // Position um eine Stelle weiter schalten
return getZimmer(pZimmerPosition); // dortigen Gast liefern
}
public Zimmer getPrevZimmer() {
//holt den Gast an der vorherigen Pufferposition
pZimmerPosition--; // Position um eine Stelle nach vorne schalten
return getZimmer(pZimmerPosition); // dortigen Gast liefern
}
public int findeZimmerPosition(int znr) {
// Sucht in der Gästeliste den Gast mit Nr gnr
// und liefert dann die Position in der Liste, wenn er gefunden wurde.
// Wenn er nicht gefunden wurde (also nicht drin ist), wird -1 geliefert!
if (freieZimmerListe.isEmpty()) {
return -1; // Liste ist leer: sicher keiner drin!
}
int pos = 0; // die Position in der Liste
Zimmer einZimmer = getFirstZimmer();
while (einZimmer != null) { //Solange einGast auf einen Gast zeigt, tue:
if (einZimmer.getZimmerNr() == znr) // Hurra, wir haben ihn!
{
return pos; // daher: Suche beenden und Position melden
}
// Okay, der war es nicht! Weiter zum nächsten Gast gehen
einZimmer = getNextZimmer();
pos++;
}
// Jetzt sind wir durch die ganze Gästeliste komplett durchgegangen
// und haben ihn nicht gefunden! Daher:
return -1;
// ANMERKUNG:
// finde() ist eine sehr schlecht gemachte Methode, denn sie ist
// bei großer Gastanzahl elend langsam (ineffizient)
// man nennt das Vorgehen hier: 'sequentielles Suchen'
// Wie könnte man viel besser werden? Wer hat eine Idee?
}
public int findeZimmerPosition(Zimmer z) {
// Sucht den Gast in der Gästeliste mit der gleichen GNr wie einGast
// und liefert dann die Position in der Liste, wenn er gefunden wurde.
// Wenn er nicht gefunden wurde (also nicht drin ist), wird -1 geliefert!
return findeZimmerPosition(z.getZimmerNr());
}
public void neuesZimmer(Zimmer einZimmer) throws Exception {
// fügt einGast in Gästeliste (und eventuell Datenbank) ein
int pos = findeZimmerPosition(einZimmer);
if (pos >= 0) {
//Ein solcher Gast ist ja schon da, den gibt es also schon!
throw new Exception("Doppeltes Zimmer!");
}
freieZimmerListe.add(einZimmer); // einGast in Gästeliste einfügen
// er wurde am Ende angefügt, daher Listenposition anpassen
pZimmerPosition = freieZimmerListe.size() - 1;
// Jetzt muss der Gast (eventuell) noch in die DB kommen
mrDB.addZimmer(einZimmer);
}
public void aktualisiereZimmer(Zimmer einZimmer) throws Exception {
// aktualisiert die Eigenschaften des Gasts in der Gästeliste und DB
int pos = findeZimmerPosition(einZimmer);
if (pos < 0) {
//er ist ja noch gar nicht in der Liste!
throw new Exception("Zimmer fehlt: " + einZimmer);
}
// Liste an der gefundenen Position aktualisieren,
// d.h. Gast wird dort in den Puffer eingetragen
pZimmerPosition = pos;
freieZimmerListe.set(pZimmerPosition, einZimmer);
// Jetzt muss der Gast (eventuell) noch in der DB aktualisiert werden
mrDB.updateZimmer(einZimmer);
}
public void entferneZimmer(Zimmer zimmer) {
// lösche den Gast gast aus Puffer und Datenbank
int pos = freieZimmerListe.indexOf(zimmer);
if (pos < 0) {
//er ist gar nicht im Puffer,also nichts weiter tun
return;
}
// Die Methode deletedGastt ist überladen: es gibt sie 2x aber in
// unterschiedlicher Ausprägung: mal übergibt man einen Gast,
// (das ist die Methode hier
// und bei der anderen Methode übergibt man die Pufferposition.
// Da wir nun wissen, wo der Gast im Puffer ist, kann den
// Rest der Arbeit doch gleich unsere "Schwester-Methode" erledigen:
deleteZimmer(pos);
}
public void deleteZimmer(int pos) {
// lösche den Gast, der an Position pos ist, aus dem Puffer
// Nur wenn pos OK ist, wird gearbeitet:
if (pos < 0 || pos >= freieZimmerListe.size()) {
return; // dann nix tun
}
Zimmer einZimmer = getZimmer(pos);
freieZimmerListe.remove(pos); // aus dem Puffer entfernen
// gegebenenfalls Pufferposition anpassen, falls Puffer leer wurde, oder
// wir den hintersten Gast löschten und nun zuweit hinten stehen
if (freieZimmerListe.isEmpty()) {
pZimmerPosition = 0;
} else // falls Pufferposition zu weit hinten:
if (pZimmerPosition >= freieZimmerListe.size()) {
pZimmerPosition = freieZimmerListe.size() - 1;
}
// Jetzt muss der Gast eventuell noch aus der DB verschwinden:
mrDB.deleteZimmer(einZimmer);
}
public int checkeZNR(String text) {
// Ist Text eine gültige Gastnummer?
// im Fehlerfall -1 liefern, sonst den ermittelten Wert
int znr;
try {
znr = Integer.parseInt(text);
} catch (NumberFormatException e) {
return -1;
}
// es ist zumindest mal ein Integer, aber weiter:
if (znr < 0) {
return -1;
}
// es ist alles OK
return znr;
}
public double checkeKostenProNacht(String text) {
// Ist Text ein gültiger Umsatz (>=0) ?
// im Fehlerfall -1 liefern, sonst den ermittelten Wert
double kpn;
try {
kpn = Double.parseDouble(text);
} catch (NumberFormatException e) {
return -1;
}
// es ist zumindest mal ein Integer, aber weiter:
if (kpn < 0) {
return -1;
}
// es ist alles OK
return kpn;
}
public int checkeANZAHLBETTEN(String text) {
int ab;
try {
ab = Integer.parseInt(text);
} catch (NumberFormatException e) {
return -1;
}
if (ab < 0) {
return -1;
}
return ab;
}
public Zimmer getZimmerAnzahlBetten(int anzahl) {
//Holt den Gast aus der Liste, der auf Listenplatz pos liegt
//Falls das nicht möglich ist, wird null geliefert
if (freieZimmerListe.isEmpty()) { // NUll liefern, wenn gar keine Gäste da sind
return null; // Puffer leer
}
// Auch null liefern, wenn pos ausserhalb des Puffers liegt
if (anzahl < 0 || anzahl > 6) {
return null;
}
pZimmerPosition = anzahl; // An diese Listenposition gehen und...
return freieZimmerListe.get(pZimmerPosition); // dortigen Gast liefern
}
}
// Das hier steht in DlgBuchung (gui)
private void jButtonFilternActionPerformed(java.awt.event.ActionEvent evt) {
BuchungsManager.getTheBuchungsManager().setAnreiseTag(jTextFieldAnreiseTag.getText());
BuchungsManager.getTheBuchungsManager().setAnreiseMonat(jTextFieldAnreiseMonat.getText());
BuchungsManager.getTheBuchungsManager().setAnreiseJahr(jTextFieldAnreiseJahr.getText());
BuchungsManager.getTheBuchungsManager().setAbreiseTag(jTextFieldAbreiseTag.getText());
BuchungsManager.getTheBuchungsManager().setAbreiseMonat(jTextFieldAbreiseMonat.getText());
BuchungsManager.getTheBuchungsManager().setAbreiseJahr(jTextFieldAbreiseJahr.getText());
}