package factories;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import data.programmation.Piece;
import data.programmation.Representation;
/**
*
* @author brahim
*
*/
public class FabPiece {
/*
* TODO: A RECHERCHER DANS LE CACHE
* une fois rempli
*/
/**
* Cache contenant les pieces.
* key=idPiece
* value=Piece
*/
// private HashMap cachePieces;
/**
* Connexion JDBC
*/
private Connection c;
/*
* Traitement du singleton
* de la fabrique
*/
private static FabPiece instance;
/**
* Constructeur prive
*
*/
private FabPiece(){
// this.cachePieces = new HashMap();
}
/**
* Recuperation du singleton de FabPersonne
* @return
*/
public static FabPiece getInstance(){
if(instance == null)
instance = new FabPiece();
return instance;
}
/**
* Requetes SQL
*/
/** Selection de toutes les pieces */
String selectToutesPieces = "SELECT IDPIECE,TITREPIECE,AUTEUR,TITRESAISON,"
+ "TYPEPERIODE,DATEDEB,DATEFIN "
+ "FROM PIECE,PERIODE "
+ "WHERE PIECE.IDPIECE = PERIODE.IDPIECE " +
"ORDER BY IDPIECE ASC";
/** selection des pieces a periode ouverte a une date donnee */
String selectPiecesPeriodeOuverte =
"SELECT IDPIECE,TITREPIECE,AUTEUR,TITRESAISON," +
"TYPEPERIODE,DATEDEB,DATEFIN " +
"FROM PIECE,PERIODE " +
"WHERE PIECE.IDPIECE = PERIODE.IDPIECE " +
"AND ? >= DATEDEB " +
"AND ? <= DATEFIN " +
"ORDER BY IDPIECE ASC";
/** recherche du titre d'une piece */
String selectTitrePiece = "select titrePiece from piece p,seance s" +
" where s.idPiece = p.idPiece and idSeance = ? ";
/** selection des seances d'une piece */
String selectSeancesPiece =
"SELECT distinct IDSEANCE,DATESEANCE,HEURE,NBPLACESRESTANTES" +
" FROM SEANCE WHERE IDPIECE = ?";
/** recherche des tarifs pour une piece */
/* 1. idpiece
* 2. nomcategorie
* 3. idzone
* 4. montant
*/
String selectTarifsPiece =
"Select * from prix where idpiece = ?";
// statements
PreparedStatement pSelectPPO;
PreparedStatement pSelectTP;
// on recupere egalement les seances <=> composition
PreparedStatement pSelectSeancesPiece;
PreparedStatement pSelectTarifsPiece;
PreparedStatement pSelectTitrePiece;
/**
* Preparation des statements
*
*/
private void init() throws SQLException{
// preparation des statements:
pSelectPPO = this.c.prepareStatement(selectPiecesPeriodeOuverte);
pSelectTP = this.c.prepareStatement(selectToutesPieces);
pSelectSeancesPiece = this.c.prepareStatement(selectSeancesPiece);
pSelectTarifsPiece = c.prepareStatement(selectTarifsPiece);
pSelectTitrePiece = c.prepareStatement(selectTitrePiece);
}
/**
* 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();
}
/*
* Fonctions classiques de la fabrique
*/
/**
* Recuperation d'un ensemble de Pieces, avec les Seances/Representations
* 1. recuperation de seances pour une piece donnee
* 2. recuperation de pieces pour une date donnee.
*/
public Collection getSeancesPiece(String idPiece)
throws SQLException{
// liste contenant les seances de la piece donnee.
ArrayList lesSeances = new ArrayList();
pSelectSeancesPiece.clearParameters();
pSelectSeancesPiece.setString(1, idPiece);
ResultSet seancesRS = pSelectSeancesPiece.executeQuery();
// recuperation de toutes les informations concernant les seances
while(seancesRS.next()){
/*
* 1 = idseance = string
* 2 = dateseance = date
* 3 = heure = int
* 4 = nbplacesrestantes = int
*/
Representation repres = new Representation(
seancesRS.getString(1),
seancesRS.getDate(2),
seancesRS.getInt(3)
);
repres.setNbPlacesRestantes(seancesRS.getInt(4));
lesSeances.add(repres);
}
return lesSeances;
}
/**
*
* @param idPiece
* @return
* @throws SQLException
*/
public String getTitrePiece(String idSeance) throws SQLException{
pSelectTitrePiece.clearParameters();
pSelectTitrePiece.setString(1, idSeance);
ResultSet rsTitre = pSelectTitrePiece.executeQuery();
if(rsTitre.next()){
return rsTitre.getString(1);
}
return "";
}
/**
* Recuperation de l'ensemble (COLLECTION) de pieces
* avec les representations correspondantes.
*/
public Collection getLesPieces(Date today)
throws SQLException{
/* liste des pieces trouvees a periode
* de reservation ouverte.
*/
ArrayList lesPieces = new ArrayList();
ResultSet rs;
/*
* Si la date n'est pas definie, on recupere toutes les
* pieces.
*/
if(today == null){
pSelectTP.clearParameters();
rs = pSelectTP.executeQuery();
}else{
pSelectPPO.clearParameters();
pSelectPPO.setDate(1, today);
pSelectPPO.setDate(2, today);
rs = pSelectPPO.executeQuery();
}
// String idPieceTmp = "";
Piece p; // = new Piece(idPieceTmp);
while(rs.next()){
/*
* 1 IDPIECE = String
* 2 TITREPIECE = String
* 3 AUTEUR = String
* 4 TITRESAISON = String
* 5 TYPEPERIODE = String
* 6 DATEDEB = Date
* 7 DATEFIN = Date
*
* Ici il faut s'attendre a recevoir plusieurs fois
* un rs avec IDPIECE identique: plusieurs types de
* periodes de reservation!
*/
String id = rs.getString(1);
String titre = rs.getString(2);
String auteur = rs.getString(3);
String saison = rs.getString(4);
// if(!id.equals(idPieceTmp)){
p = new Piece(id, titre, auteur, saison);
// idPieceTmp = id;
// ajouter les representations pour cette piece:
// le faire seulement si on cree une nouvelle piece!
for(Iterator it = this.getSeancesPiece(id).iterator();
it.hasNext(); ){
p.addRepresentation((Representation)it.next());
}
//Ajout des tarifs
pSelectTarifsPiece.clearParameters();
pSelectTarifsPiece.setString(1, id);
ResultSet rsTarifs = pSelectTarifsPiece.executeQuery();
while(rsTarifs.next()){
p.addTarif(rsTarifs.getString(2), rsTarifs.getString(3), rsTarifs.getDouble(4));
}
// ajouter la piece dans la liste des pieces a retourner.
lesPieces.add(p);
// ajouter la piece dans le cache:
//this.cachePieces.put(id, p);
//TODO: si on utilise le cache!
// }
// recuperation du reste des informations du ResultSet
String type =rs.getString(5);
Date deb = rs.getDate(6);
Date fin = rs.getDate(7);
// ajout du type et des dates debut/fin de la periode periodes
p.setPeriodeEnCours(type);
p.setPeriodeDebut(deb);
p.setPeriodeFin(fin);
}
return lesPieces;
}
//Date d = Date.valueOf("2007-01-03");
}