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");
}
}
}