Module Server, Service Sale : ajout méthd isSaleRevertSupported(); Ajout Javadoc; Correction erreur compilation liée à la classe FileUtil

This commit is contained in:
Notmoo 2017-08-02 18:20:51 +02:00
parent d9462b4a13
commit 9a75623825
4 changed files with 94 additions and 9 deletions

View File

@ -2,11 +2,22 @@ package com.pqt.server.module.sale;
import com.pqt.core.entities.sale.Sale; import com.pqt.core.entities.sale.Sale;
//TODO écrire Javadoc /**
* Interface définissant les méthodes requises pour tout DAO du service de gestion des commandes {@link SaleService}.
* <p/>
* Les implémentations de cette interface doivent pouvoir valider des commandes, agir sur le stock et générer les
* identifiants de commandes validées.
* <p/>
* Les implémentations peuvent (optionnel) assurer une persistance des données relatives aux commandes validées, et
* peuvent donc assurer le revert des commandes {@link #submitSaleRevert(long)}. <b>Le support de cette fonctionnalité
* est optionnel</b>.
*
* @see SaleService pour de plus amples détails sur le fonctionnement attendu des méthodes
*/
public interface ISaleDao { public interface ISaleDao {
long submitSale(Sale sale); long submitSale(Sale sale);
void submitSaleRevert(long id); boolean isSaleRevertSupported();
boolean submitSaleRevert(long id);
} }

View File

@ -12,9 +12,21 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Iterator; import java.util.Iterator;
/**
* Implémentation de l'interface {@link ISaleDao} utilisant un fichier comme moyen pour assurer la persistance des
* données relatives aux commandes validées. <b>Cette implémentation ne supporte pas le rollback de commandes</b>.
* <p/>.
* La persistance des données est faite de sorte que ces données soient lisibles par un humain lorsque le fichier est
* ouvert avecc un éditeur de texte quelconque.
* <p/>
* Les identifiants attribués aux commandes validées sont incrémentés à chaque fois, en se basant soit sur la dernière
* valeur attribuée (lue depuis le fichier de sauvegarde lors de l'instantiation), soit sur une valeur par défaut. Ils
* sont tous <b>positifs et non-nuls</b>.
*/
public class NoRevertFileSaleDao implements ISaleDao { public class NoRevertFileSaleDao implements ISaleDao {
private static final String SALE_LOG_FILE_NAME = "sale_log.txt"; private static final String SALE_LOG_FILE_NAME = "sale_log.txt";
private static final long DEFAULT_SALE_ID = 0; //équivaut à la valeur du premier id - 1
private StockService stockService; private StockService stockService;
private long nextSaleId; private long nextSaleId;
private ISaleRenderer renderer; private ISaleRenderer renderer;
@ -64,7 +76,7 @@ public class NoRevertFileSaleDao implements ISaleDao {
* @return last sale id used in the log file, or -1 if none was found. * @return last sale id used in the log file, or -1 if none was found.
*/ */
private long readLastSaleIdFromFile(){ private long readLastSaleIdFromFile(){
long id = -1; long id = DEFAULT_SALE_ID;
if(FileUtil.exist(SALE_LOG_FILE_NAME)){ if(FileUtil.exist(SALE_LOG_FILE_NAME)){
try(ReversedLinesFileReader rlfr = new ReversedLinesFileReader(new File("SALE_LOG_FILE_NAME"))){ try(ReversedLinesFileReader rlfr = new ReversedLinesFileReader(new File("SALE_LOG_FILE_NAME"))){
boolean stop = false; boolean stop = false;
@ -89,7 +101,12 @@ public class NoRevertFileSaleDao implements ISaleDao {
} }
@Override @Override
public void submitSaleRevert(long id) { public boolean isSaleRevertSupported() {
return false;
}
@Override
public boolean submitSaleRevert(long id) {
//TODO Créer un nouveau dao qui supporte le revert //TODO Créer un nouveau dao qui supporte le revert
throw new UnsupportedOperationException("Le revert de commandes n'est pas supporté"); throw new UnsupportedOperationException("Le revert de commandes n'est pas supporté");
} }

View File

@ -7,8 +7,24 @@ import com.pqt.server.module.sale.listeners.ISaleListener;
import com.pqt.server.module.sale.listeners.SimpleSaleFirerer; import com.pqt.server.module.sale.listeners.SimpleSaleFirerer;
import com.pqt.server.module.stock.StockService; import com.pqt.server.module.stock.StockService;
//TODO écrire Javadoc
//TODO ajouter logs //TODO ajouter logs
/**
* Cette classe correspond au service de validation des commandes de produits.
* <p/>
* Ce service est censé pouvoir déterminer si une commmande (classe {@link Sale}) est valide ou non, et doit le cas
* échéant effectuer les retraits de produits du stock. A chaque commande validée doit correspondre un identifiant
* unique, qui doit être renvoyé en réponse de la validation. Cet identifiant doit permettre de pouvoir annuler
* ultérieurement la commande correspondante via la méthode {@link #submitSaleRevert(long)}.
* <p/>
* Une commande est considérée comme valide si tous les produits composants la commande existent dans le stock et que
* les quantités demandées dans la commande sont disponibles en stock.
* <p/>
* Ce service met également à disposition la possibilité d'enregistrer des observateurs, qui seront utilisés pour
* exécuter des méthodes lors de certains événements, comme la validation d'une commande.
*
* @see ISaleListener
*/
public class SaleService { public class SaleService {
private ISaleDao dao; private ISaleDao dao;
@ -19,20 +35,57 @@ public class SaleService {
eventFirerer = new SimpleSaleFirerer(); eventFirerer = new SimpleSaleFirerer();
} }
public long submitSale(Sale sale) throws ServerQueryException { /**
* Soumet une commande au service pour validation. Si la commande est validée, les stocks seront débités et
* l'identifiant de la commande sera renvoyé. Si la commande n'est pas validée, la valeur {@value -1} sera renvoyée
* et les stocks resterons inchangés.
* @param sale commande à valider
* @return l'identifiant positif non-nul attribué à la commande si elle est validée, {@value -1} sinon.
*/
public long submitSale(Sale sale) {
long id = dao.submitSale(sale); long id = dao.submitSale(sale);
if(id!=-1) eventFirerer.fireSaleValidatedEvent(sale); if(id!=-1) eventFirerer.fireSaleValidatedEvent(sale);
return id; return id;
} }
public void submitSaleRevert(long id) throws ServerQueryException { /**
dao.submitSaleRevert(id); * Détermine si le rollback de commande est supporté par la configuration actuelle du serveur ou non.
* <p/>
* Tenter d'effectuer un rollback de commande alors que ce dernier n'est pas supporté lèvera une
* {@link UnsupportedOperationException}.
*
* @return {@code true} si le rollback de commande est supporté, {@code false} sinon.
*/
public boolean isSaleRevertSupported(){
return dao.isSaleRevertSupported();
}
/**
* Demande le rollback d'une commande en se basant sur l'identifiant.
* @param id identifiant de la commande à annuler
* @return {@code true} si la commande a bel et bien été annulée, {@code false} si aucun changement n'a été fait.
*/
public boolean submitSaleRevert(long id) {
if(isSaleRevertSupported())
return dao.submitSaleRevert(id);
else
throw new UnsupportedOperationException("Cette opération ('sale revert') n'est pas supportée par la configuration actuelle du serveur");
} }
/**
* Ajout un observateur au service, qui sera notifié lorsque certains événements auront lieu.
* @param l observateur à ajouter.
* @see ISaleListener
*/
public void addListener(ISaleListener l) { public void addListener(ISaleListener l) {
eventFirerer.addListener(l); eventFirerer.addListener(l);
} }
/**
* Retire un observateur du service.
* @param l observateur à retirer.
* @see ISaleListener
*/
public void removeListener(ISaleListener l){ public void removeListener(ISaleListener l){
eventFirerer.addListener(l); eventFirerer.addListener(l);
} }

View File

@ -33,4 +33,8 @@ public class FileUtil {
public static boolean exist(Path path) { public static boolean exist(Path path) {
return Files.exists(path); return Files.exists(path);
} }
public static boolean exist(String path) {
return Files.exists(Paths.get(path));
}
} }