/**
* This file is part of eCommerce.
*
* Foobar is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Foobar is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* 2007 Matej Hausenblas matej.hausenblas@gmail.com
*
*/
package metier.commandes;
import factories.FClients;
import factories.FCommandes;
import factories.FProduits;
import factories.exceptions.FactoriesException;
import interfaces.commandes.IMetierCommandes;
import interfaces.exceptions.MetierException;
import java.io.Serializable;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import metier.produits.MetierProduits;
import base.Client;
import base.Commande;
import base.Produit;
import database.GestionConnection;
/**
*
*/
public class MetierCommandes /*extends UnicastRemoteObject*/ implements IMetierCommandes, Serializable{
/**
* Generated Serial Version UID
*/
private static final long serialVersionUID = 5448745543595402858L;
/*
* Fabrique de commandes, a la creation de cette classe,
* on souhaite pouvoir utiliser la fabrique eventuellement a plusieurs
* endroits, on la retrouve alors et initialise sa connexion.
*/
private FCommandes fc;
private FClients fcli;
private FProduits fprod;
/**
* Constructeur métier
*
* @throws MetierException
*/
public MetierCommandes() throws /*RemoteException,*/ MetierException{
/*super();*/
this.fc = FCommandes.getInstance();
this.fcli = FClients.getInstance();
this.fprod = FProduits.getInstance();
// s'assurer que la fabrique a bien une connexion a la base de donnees.
try{
if(! fc.hasConnection()){
fc.setConnection(GestionConnection.getInstance().getConnection());
}
if(! fcli.hasConnection()){
fcli.setConnection(GestionConnection.getInstance().getConnection());
}
if(! fprod.hasConnection()){
fprod.setConnection(GestionConnection.getInstance().getConnection());
}
// Mise a jour de la base de donnees:
}catch(SQLException se){
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
}
}
/*
* (non-Javadoc)
* @see interfaces.commandes.IMetierCommandes#getDelai(base.Commande)
*/
public int getDelai(Commande c) throws RemoteException, MetierException {
int delai = 0;
// Recuperation de tous les produits concernes
for(Iterator<String> it = c.getLesProduits().keySet().iterator();
it.hasNext();){
String refProd = it.next();
try {
Produit p = fprod.rechercherProduit(refProd);
// mise a jour du max(Delai disponible)
if(p.getDelaiDisponible() > delai)
delai = p.getDelaiDisponible();
} catch (SQLException e) {
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
}
}
return delai;
}
/* (non-Javadoc)
* @see interfaces.commandes.IMetierCommandes#ajouterCommande(base.Commande)
*/
public synchronized void ajouterCommande(Commande c) throws RemoteException,
MetierException {
try {
fc.creerCommande(c);
} catch (SQLException e) {
e.printStackTrace();
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
} catch (FactoriesException e) {
if(e.getMessage().equals(FactoriesException.COMMANDE_EXISTE_DEJA)){
// renvoi du message
throw new MetierException(e.getMessage());
}
}
}
/* (non-Javadoc)
* @see interfaces.commandes.IMetierCommandes#rechercherCommandesClient(java.lang.String)
*/
public ArrayList<Commande> rechercherCommandesClient(String idClient)
throws RemoteException, MetierException {
/* d'abord recherche du client */
Client cli;
try {
cli = fcli.rechercherClient(idClient);
} catch (SQLException e) {
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
} catch (FactoriesException e) {
// le client n'existe pas
throw new MetierException(e.getMessage());
}
// liste des commandes
ArrayList<Commande> sesCommandes = new ArrayList<Commande>();
for(Iterator<String> it = cli.getLesCommandes().iterator(); it.hasNext(); ){
String refCde = it.next();
try {
Commande cde = fc.rechercherCommande(refCde, idClient);
// ajout de la commande trouvee dans la liste
sesCommandes.add(cde);
} catch (SQLException e) {
// Coupure du reseau ou plantage serveur BD
e.printStackTrace();
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
}
}
return sesCommandes;
}
/* (non-Javadoc)
* @see interfaces.commandes.IMetierCommandes#supprimerCommande(java.lang.String)
*/
public synchronized int supprimerCommande(Commande c)
throws RemoteException, MetierException {
int res;
// suppression de la commande de la base
try {
res = fc.supprimerCommande(c);
} catch (SQLException e) {
throw new MetierException(MetierException.CONNEXION_IMPOSSIBLE);
} catch (FactoriesException e) {
// la commande n'existe pas dans la base!
throw new MetierException(e.getMessage());
}
// mise a jour des stocks
// recuperation de tous les produits concernes
for(Iterator<String> it = c.getLesProduits().keySet().iterator();
it.hasNext();){
String refProd = it.next();
// voici la quantite reservee par cette commande
int qte = c.getLesProduits().get(refProd).intValue();
// liberation de la reservation dans la base.
new MetierProduits().libererProduit(refProd, qte);
// s'il y a un probleme au cours de route, on s'arrete ici.
}
return res;
}
}