From 143fe391d7cebd407d3a40840dda28ea8a9b8951 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 10 Aug 2017 10:22:58 +0200 Subject: [PATCH] Module Server : Ajout Javadoc pour StockService; MAJ javadoc clss ServerStateService --- .../module/state/ServerStateService.java | 2 + .../pqt/server/module/stock/FileStockDao.java | 62 +++++++++++++++---- .../pqt/server/module/stock/IStockDao.java | 58 ++++++++++++++--- .../pqt/server/module/stock/StockService.java | 22 +++++-- 4 files changed, 122 insertions(+), 22 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java index 3e32ed93..107394e6 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java @@ -13,6 +13,8 @@ import java.util.Date; * ce serveur dans les messages, soit comme émetteur, soit comme destinataire. * * @see com.pqt.core.entities.messages.Message + * + * @author Guillaume "Cess" Prost */ public class ServerStateService { diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java index 8248719a..97cbfac7 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java @@ -5,9 +5,18 @@ import com.pqt.server.tools.entities.SaleContent; import com.pqt.server.tools.io.ISerialFileManager; import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; +import java.lang.IllegalStateException; import java.util.*; -//TODO écrire Javadoc +/** + * Implémentation de l'interface {@link IStockDao} utilisant un fichier de sauvegarde pour assurer la persistance des + * données liées aux produits vendus. + *

+ * Les données sont écrites et lues dans le fichier grâce au méchanisme de sérialisation/désérialisation. Elles ne sont + * pas faites pour être lisibles directement par un humain. + * + * @author Guillaume "Cess" Prost + */ public class FileStockDao implements IStockDao { private static final String STOCK_FILE_NAME = "stock.pqt"; @@ -17,7 +26,7 @@ public class FileStockDao implements IStockDao { private Map products; - public FileStockDao() { + FileStockDao() { random = new Random(); fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME); loadFromFile(); @@ -41,7 +50,7 @@ public class FileStockDao implements IStockDao { private List copyOfProductList() { List copy = new ArrayList<>(); - products.values().stream().forEach(p->copy.add(new Product(p))); + products.values().forEach(p->copy.add(new Product(p))); return copy; } @@ -55,11 +64,13 @@ public class FileStockDao implements IStockDao { /** * @see com.pqt.server.module.stock.IStockDao#addProduct(com.pqt.core.entities.product.Product) */ - public void addProduct(Product product) { + public long addProduct(Product product) { product.setId(nextProductId); this.products.put(nextProductId, product); + long reply = nextProductId; generateNextProductId(); saveToFile(); + return reply; } /** @@ -68,7 +79,7 @@ public class FileStockDao implements IStockDao { public void removeProduct(long id) { Product product = getProduct(id); if(product!=null){ - this.products.remove(product); + this.products.remove(product.getId()); saveToFile(); } } @@ -86,11 +97,14 @@ public class FileStockDao implements IStockDao { @Override public void applySale(SaleContent saleContent) throws IllegalArgumentException { + if(saleContent==null) + return; + try { - saleContent.getProductList().forEach(product -> { + for(Product product : saleContent.getProductList()){ applyRecursiveStockRemoval(product, saleContent.getProductAmount(product)); applySoldCounterIncrease(product, saleContent.getProductAmount(product)); - }); + } saveToFile(); }catch (IllegalStateException e){ loadFromFile(); @@ -98,35 +112,61 @@ public class FileStockDao implements IStockDao { } } - private void applySoldCounterIncrease(Product product, Integer amount) { + /** + * Cette méthode augmente le compteur de vente pour un produit donné dans la BDD. + * + * @param product données à utiliser pour déterminer le produit correspondant dans la BDD dont les données doivent + * être manipulées. + * @param amount montant à ajouter + * @throws IllegalStateException exception levée si le produit donné ne peut pas être trouvé dans la base de donnée. + */ + private void applySoldCounterIncrease(Product product, Integer amount) throws IllegalStateException{ Product correspondingProduct = getProduct(product.getId()); if(correspondingProduct!=null){ correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount); }else{ - StringBuffer sb = new StringBuffer("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); + StringBuilder sb = new StringBuilder("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")"); throw new IllegalStateException(sb.toString()); } } - private void applyRecursiveStockRemoval(Product product, int amount)throws IllegalStateException{ + /** + * Cette méthode retire à un produit donné de la BDD le montant spécifié (diminue la valeur de + * {@link Product#amountRemaining}), puis effectue récursivement la même opération pour tous les composants de ce + * produit. + * + * @param product données à utiliser pour déterminer le produit correspondant dans la BDD dont les données doivent + * être manipulées. + * @param amount montant à déduire + * @throws IllegalStateException exception levée si le produit donné ne peut pas être trouvé dans la base de donnée. + */ + private void applyRecursiveStockRemoval(Product product, int amount) throws IllegalStateException { Product correspondingProduct = getProduct(product.getId()); if(correspondingProduct!=null) { correspondingProduct.setAmountRemaining(correspondingProduct.getAmountRemaining() - amount); correspondingProduct.getComponents().forEach(component -> applyRecursiveStockRemoval(component, amount)); }else{ - StringBuffer sb = new StringBuffer("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); + StringBuilder sb = new StringBuilder("StockService>StockDao : Un produit vendu ne correspond pas à un produit connu : "); sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")"); throw new IllegalStateException(sb.toString()); } } + /** + * Cette méthode charge les données relatives aux produits depuis le fichier de sauvegarde. Si ce fichier n'existe + * pas, il est créé et la liste des produits est vidée. + */ private void loadFromFile() { Map loadedData = new HashMap<>(); fileManager.loadListFromFile().forEach(product -> loadedData.put(product.getId(), product)); products = new HashMap<>(loadedData); } + /** + * Cette méthode écrit les données relatives aux produits dans le fichier de sauvegarde, écrasant le contenu + * précédent. + */ private void saveToFile() { fileManager.saveListToFile(new ArrayList<>(products.values())); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java index 0cc9e1f8..1eff2683 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java @@ -6,18 +6,62 @@ import com.pqt.server.tools.entities.SaleContent; import java.util.List; import java.util.Map; -//TODO écrire javadoc +/** + * Interface définissant les méthodes requises pour tout DAO du service de gestion des commandes {@link StockService}. + *

+ * Les implémentations doivent assurer une persistance des données relatives aux produits vendus, et doivent assurer + * les modifications et les applications de ventes. + * + * @see StockService pour de plus amples détails sur le fonctionnement attendu des méthodes + * + * @author Guillaume "Cess" Prost + */ public interface IStockDao { - public List getProductList(); + /** + * Renvoie une copie de la liste des produits contenus dans la base de donnée. + * @return copie de la liste des produits. + */ + List getProductList(); - public Product getProduct(long id); + /** + * Renvoie le produit correspondant à l'identifiant donné. + * @param id identifiant du produit à récupérer + * @return Produit correspondant, ou {@code null} si aucun produit ne correspond + */ + Product getProduct(long id); - public void addProduct(Product product); + /** + * Ajoute un produit dans la base de donnée. Son identifiant sera éventuellement modifié pour éviter les conflits. + * Dans tous les cas, l'identifiant final du produit est renvoyé une fois l'ajout effectué. + * @param product produit à ajouter$ + * @return identifiant du produit ajouté. + */ + long addProduct(Product product); - public void removeProduct(long id); + /** + * Supprime le produit correspondant à l'identifiant donné. + * @param id identifiant du produit à supprimer. + */ + void removeProduct(long id); - public void modifyProduct(long id, Product product); - void applySale(SaleContent productAmounts) throws IllegalArgumentException; + /** + * Modifie le produit correspondant à l'identifiant donné en le remplaçant par {@code product}. L'identifiant + * reste inchangé. + *

+ * Si {@code id} ne correspond à aucun produit, aucune modification n'est effectué. Cela signifie que + * {@code product} n'est pas ajouté à la BDD. + * @param id identifiant du produit à modifier + * @param product nouvelle version du produit + */ + void modifyProduct(long id, Product product); + + /** + * Applique les modifications de stocks liées à une commande validée, représenté par {@code saleContent}. + *

+ * @param saleContent détail des produits et quantités de la commande validée. + * @throws IllegalArgumentException Exception levée si une erreur liée au contenu de {@code saleContent} survient. + */ + void applySale(SaleContent saleContent) throws IllegalArgumentException; } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java index 03ebefa1..fe184569 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java @@ -8,8 +8,22 @@ import com.pqt.server.tools.entities.SaleContent; import java.util.List; import java.util.Map; -//TODO écrire Javadoc //TODO ajouter logs + +/** + * Cette classe correspond au service de gestion du stock de produits. Il est en charge de la persistance des + * données liées aux produits, de founir un accès centralisé à ces données et se charge également d'appliquer les + * mises à jour de stock (ajout, modif ou suppr de produits) et les ventes de produits issues des commandes + * (modification des quantités). + *

+ * Attention : ce service ne se charge pas de valider les commandes, il ne fait que modifier les quantités comme si + * la commande avait été validé + * + * @see Product + * @see ProductUpdate + * @see SaleContent + * @author Guillaume "Cess" Prost + */ public class StockService { private IStockDao dao; @@ -26,8 +40,8 @@ public class StockService { return dao.getProduct(id); } - public void applySale(SaleContent productAmounts) { - dao.applySale(productAmounts); + public void applySale(SaleContent saleContent) { + dao.applySale(saleContent); } public void applyUpdateList(List updates) throws ServerQueryException{ @@ -39,7 +53,7 @@ public class StockService { }else if(upd.getOldVersion()!=null && upd.getNewVersion()!=null){ modifyProduct(upd.getOldVersion().getId(), upd.getNewVersion()); }else{ - //TODO écrit le throw d'une ServerQueryException + throw new ServerQueryException("Object ProductUpdate invalide : old et new vallent tous les deux null"); } } }