package factories;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import data.theatre.Place;
import data.theatre.Rangee;
import data.theatre.Theatre;
import data.theatre.Zone;
import java.util.*;
/**
*
* @author brahim
*
*/
public class FabTheatre {
/**
* Connexion JDBC
*/
private Connection c;
/*
* Traitement du singleton de la fabrique
*/
private static FabTheatre instance;
/**
* Constructeur prive
*
*/
private FabTheatre() {
// this.cacheTheatre = new HashMap();
}
/**
* Recuperation du singleton de FabPersonne
*
* @return
*/
public static FabTheatre getInstance() {
if (instance == null)
instance = new FabTheatre();
return instance;
}
/**
* Requetes SQL
*/
/* Les infos sur le théatre */
String selectTheatre = "Select theatre from saison";
/* Les zones */
String selectZones = "Select distinct idzone from theatre";
/* Les rangées et places d'une zone */
String selectRangees = "select idrangee,nbfauteuils from theatre where "
+ " idzone = ? group by idzone,idrangee,nbfauteuils";
/* Les places restantes */
String selectPlacesLibre = "select nbPlacesZone - sum(nbplacesreservees) "
+ "from reservation r,zone z where idzone = ? and z.idzone = r.idzone "
+ " and r.idseance = ?";
/** recuperation du nombre total de places d'une zone */
String selectNbPlacesZone = "select nbPlacesZone from zone where idZone = ?";
/** recherche du nombre de reservations d'une seance concernant une zone */
String selectNbReservations = "select count(*) from reservation where idseance = ? and idZone = ? ";
/**
* select nbPlacesZone - sum(nbplacesreservees) from reservation r,zone z
* where idzone = 'premiere' and z.idzone = r.idzone and r.idseance = '1AV';
*/
/* Les statements */
PreparedStatement pSelectTheatre, pSelectZones, pSelectRangees,
pSelectPlacesLibre, pSelectNbPlacesZone,pSelectNbReservations;
/**
* Preparation des statements
*
*/
private void init() throws SQLException {
// preparation des statements:
pSelectTheatre = c.prepareStatement(selectTheatre);
pSelectZones = c.prepareStatement(selectZones);
pSelectRangees = c.prepareStatement(selectRangees);
pSelectPlacesLibre = c.prepareStatement(selectPlacesLibre);
pSelectNbPlacesZone = c.prepareStatement(selectNbPlacesZone);
pSelectNbReservations = c.prepareStatement(selectNbReservations);
}
/**
* Mise en place d'une connexion JDBC au singleton
*
* @param c
* @throws SQLException
*/
public void setConnection(Connection c) throws SQLException {
this.c = c;
this.init();
}
/**
*
* @param z
* @return
* @throws SQLException
*/
public Zone parametrerZone(String idZone) throws SQLException{
Zone zone = new Zone(idZone);
pSelectRangees.clearParameters();
pSelectRangees.setString(1, idZone);
ResultSet rsRangees = pSelectRangees.executeQuery();
// Pour les rangées
while(rsRangees.next()){
String idRangee = rsRangees.getString(1);
Rangee r = new Rangee(idRangee);
int nbPlaces = rsRangees.getInt(2);
for(int i=1;i<=nbPlaces;i++){
r.addPlace(new Place(i));
}
// On ajout cette rangée à la zone
zone.addRangee(r);
}
return zone;
}
/**
*
* @return
* @throws SQLException
*/
public Collection getZones() throws SQLException{
ArrayList listZones = new ArrayList();
// On récupére les zones
pSelectZones.clearParameters();
ResultSet rsZones = pSelectZones.executeQuery();
// On paramètre les objets zones avant de les ajouter
while(rsZones.next()){
String idZone = rsZones.getString(1);
listZones.add(idZone);
}
return listZones;
}
/**
*
* @param idSeance
* @param idZone
* @return
* @throws SQLException
*/
public int getPlacesRestantes(String idSeance, String idZone) throws SQLException{
pSelectNbPlacesZone.clearParameters();
pSelectNbPlacesZone.setString(1, idZone);
int nbPlacesZone = 0;
ResultSet rsNbPlacesZone = pSelectNbPlacesZone.executeQuery();
if(rsNbPlacesZone.next()){
nbPlacesZone = rsNbPlacesZone.getInt(1);
}
//Nombre de réservations existantes => Pas de nvl ...
int nbReservations = 0;
pSelectNbReservations.clearParameters();
pSelectNbReservations.setString(1, idSeance);
pSelectNbReservations.setString(2, idZone);
ResultSet rsNbReservations = pSelectNbReservations.executeQuery();
if(rsNbReservations.next()){
nbReservations = rsNbReservations.getInt(1);
}
// Pas de réservation pour cette séance dans cette zone, on renvoit le nombre total
if(nbReservations == 0){
return nbPlacesZone;
}
pSelectPlacesLibre.clearParameters();
pSelectPlacesLibre.setString(1,idZone);
pSelectPlacesLibre.setString(2,idSeance);
ResultSet rsPlacesLibre = pSelectPlacesLibre.executeQuery();
if(rsPlacesLibre.next()){
//System.out.println("[FT idSeance = "+idSeance +" idZone = "+idZone+"] PLACES TOTAL = "+nbPlacesZone);
//System.out.println("[FT idSeance = "+idSeance +" idZone = "+idZone+" ] PLACES LIBRES = "+rsPlacesLibre.getInt(1));
//int nbPlacesRestantes = rsPlacesLibre.getInt(1);
return rsPlacesLibre.getInt(1);
//System.out.println("Places restantes = "+nbPlacesRestantes);
//if(nbReservations == 0){
// return (nbPlacesRestantes==0)?nbPlacesZone:nbPlacesRestantes;
//}
}
/*
* Pas de réservation pour cette zone et cette séance, on renvoie le
* nombre total
*/
return 0;
//return nbPlacesZone;
}
/**
*
* @return
* @throws SQLException
*/
public Theatre getTheatre() throws SQLException{
pSelectTheatre.clearParameters();
ResultSet rsTheatre = pSelectTheatre.executeQuery();
Theatre theatre = new Theatre(rsTheatre.getString(1));
// On récupére les zones
pSelectZones.clearParameters();
ResultSet rsZones = pSelectZones.executeQuery();
// On paramètre les objets zones avant de les ajouter
while(rsZones.next()){
String idZone = rsZones.getString(1);
// On paramétre cette zone (ajout des rangées ...)
Zone z = this.parametrerZone(idZone);
// On ajoute cette zone au théatre
theatre.addZone(z);
}
return theatre;
}
}