mirror of
https://github.com/klmp200/PQT_Gestionnaire_vente_stock.git
synced 2024-12-22 15:31:08 +00:00
Module Server : Ajout Javadoc pour StockService; MAJ javadoc clss ServerStateService
This commit is contained in:
parent
7de32786ab
commit
143fe391d7
@ -13,6 +13,8 @@ import java.util.Date;
|
|||||||
* ce serveur dans les messages, soit comme émetteur, soit comme destinataire.
|
* ce serveur dans les messages, soit comme émetteur, soit comme destinataire.
|
||||||
*
|
*
|
||||||
* @see com.pqt.core.entities.messages.Message
|
* @see com.pqt.core.entities.messages.Message
|
||||||
|
*
|
||||||
|
* @author Guillaume "Cess" Prost
|
||||||
*/
|
*/
|
||||||
public class ServerStateService {
|
public class ServerStateService {
|
||||||
|
|
||||||
|
@ -5,9 +5,18 @@ import com.pqt.server.tools.entities.SaleContent;
|
|||||||
import com.pqt.server.tools.io.ISerialFileManager;
|
import com.pqt.server.tools.io.ISerialFileManager;
|
||||||
import com.pqt.server.tools.io.SimpleSerialFileManagerFactory;
|
import com.pqt.server.tools.io.SimpleSerialFileManagerFactory;
|
||||||
|
|
||||||
|
import java.lang.IllegalStateException;
|
||||||
import java.util.*;
|
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.
|
||||||
|
* <p/>
|
||||||
|
* 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 {
|
public class FileStockDao implements IStockDao {
|
||||||
|
|
||||||
private static final String STOCK_FILE_NAME = "stock.pqt";
|
private static final String STOCK_FILE_NAME = "stock.pqt";
|
||||||
@ -17,7 +26,7 @@ public class FileStockDao implements IStockDao {
|
|||||||
|
|
||||||
private Map<Long, Product> products;
|
private Map<Long, Product> products;
|
||||||
|
|
||||||
public FileStockDao() {
|
FileStockDao() {
|
||||||
random = new Random();
|
random = new Random();
|
||||||
fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME);
|
fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME);
|
||||||
loadFromFile();
|
loadFromFile();
|
||||||
@ -41,7 +50,7 @@ public class FileStockDao implements IStockDao {
|
|||||||
|
|
||||||
private List<Product> copyOfProductList() {
|
private List<Product> copyOfProductList() {
|
||||||
List<Product> copy = new ArrayList<>();
|
List<Product> copy = new ArrayList<>();
|
||||||
products.values().stream().forEach(p->copy.add(new Product(p)));
|
products.values().forEach(p->copy.add(new Product(p)));
|
||||||
return copy;
|
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)
|
* @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);
|
product.setId(nextProductId);
|
||||||
this.products.put(nextProductId, product);
|
this.products.put(nextProductId, product);
|
||||||
|
long reply = nextProductId;
|
||||||
generateNextProductId();
|
generateNextProductId();
|
||||||
saveToFile();
|
saveToFile();
|
||||||
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -68,7 +79,7 @@ public class FileStockDao implements IStockDao {
|
|||||||
public void removeProduct(long id) {
|
public void removeProduct(long id) {
|
||||||
Product product = getProduct(id);
|
Product product = getProduct(id);
|
||||||
if(product!=null){
|
if(product!=null){
|
||||||
this.products.remove(product);
|
this.products.remove(product.getId());
|
||||||
saveToFile();
|
saveToFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -86,11 +97,14 @@ public class FileStockDao implements IStockDao {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void applySale(SaleContent saleContent) throws IllegalArgumentException {
|
public void applySale(SaleContent saleContent) throws IllegalArgumentException {
|
||||||
|
if(saleContent==null)
|
||||||
|
return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
saleContent.getProductList().forEach(product -> {
|
for(Product product : saleContent.getProductList()){
|
||||||
applyRecursiveStockRemoval(product, saleContent.getProductAmount(product));
|
applyRecursiveStockRemoval(product, saleContent.getProductAmount(product));
|
||||||
applySoldCounterIncrease(product, saleContent.getProductAmount(product));
|
applySoldCounterIncrease(product, saleContent.getProductAmount(product));
|
||||||
});
|
}
|
||||||
saveToFile();
|
saveToFile();
|
||||||
}catch (IllegalStateException e){
|
}catch (IllegalStateException e){
|
||||||
loadFromFile();
|
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());
|
Product correspondingProduct = getProduct(product.getId());
|
||||||
if(correspondingProduct!=null){
|
if(correspondingProduct!=null){
|
||||||
correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount);
|
correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount);
|
||||||
}else{
|
}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(")");
|
sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")");
|
||||||
throw new IllegalStateException(sb.toString());
|
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());
|
Product correspondingProduct = getProduct(product.getId());
|
||||||
if(correspondingProduct!=null) {
|
if(correspondingProduct!=null) {
|
||||||
correspondingProduct.setAmountRemaining(correspondingProduct.getAmountRemaining() - amount);
|
correspondingProduct.setAmountRemaining(correspondingProduct.getAmountRemaining() - amount);
|
||||||
correspondingProduct.getComponents().forEach(component -> applyRecursiveStockRemoval(component, amount));
|
correspondingProduct.getComponents().forEach(component -> applyRecursiveStockRemoval(component, amount));
|
||||||
}else{
|
}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(")");
|
sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")");
|
||||||
throw new IllegalStateException(sb.toString());
|
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() {
|
private void loadFromFile() {
|
||||||
Map<Long, Product> loadedData = new HashMap<>();
|
Map<Long, Product> loadedData = new HashMap<>();
|
||||||
fileManager.loadListFromFile().forEach(product -> loadedData.put(product.getId(), product));
|
fileManager.loadListFromFile().forEach(product -> loadedData.put(product.getId(), product));
|
||||||
products = new HashMap<>(loadedData);
|
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() {
|
private void saveToFile() {
|
||||||
fileManager.saveListToFile(new ArrayList<>(products.values()));
|
fileManager.saveListToFile(new ArrayList<>(products.values()));
|
||||||
}
|
}
|
||||||
|
@ -6,18 +6,62 @@ import com.pqt.server.tools.entities.SaleContent;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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}.
|
||||||
|
* <p/>
|
||||||
|
* 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 interface IStockDao {
|
||||||
|
|
||||||
public List<Product> getProductList();
|
/**
|
||||||
|
* Renvoie une copie de la liste des produits contenus dans la base de donnée.
|
||||||
|
* @return copie de la liste des produits.
|
||||||
|
*/
|
||||||
|
List<Product> 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é.
|
||||||
|
* <p/>
|
||||||
|
* <b>Si {@code id} ne correspond à aucun produit, aucune modification n'est effectué. Cela signifie que
|
||||||
|
* {@code product} n'est pas ajouté à la BDD.</b>
|
||||||
|
* @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}.
|
||||||
|
* <p/>
|
||||||
|
* @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;
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,22 @@ import com.pqt.server.tools.entities.SaleContent;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
//TODO écrire Javadoc
|
|
||||||
//TODO ajouter logs
|
//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).
|
||||||
|
* <p/>
|
||||||
|
* <b>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é</b>
|
||||||
|
*
|
||||||
|
* @see Product
|
||||||
|
* @see ProductUpdate
|
||||||
|
* @see SaleContent
|
||||||
|
* @author Guillaume "Cess" Prost
|
||||||
|
*/
|
||||||
public class StockService {
|
public class StockService {
|
||||||
|
|
||||||
private IStockDao dao;
|
private IStockDao dao;
|
||||||
@ -26,8 +40,8 @@ public class StockService {
|
|||||||
return dao.getProduct(id);
|
return dao.getProduct(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applySale(SaleContent productAmounts) {
|
public void applySale(SaleContent saleContent) {
|
||||||
dao.applySale(productAmounts);
|
dao.applySale(saleContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyUpdateList(List<ProductUpdate> updates) throws ServerQueryException{
|
public void applyUpdateList(List<ProductUpdate> updates) throws ServerQueryException{
|
||||||
@ -39,7 +53,7 @@ public class StockService {
|
|||||||
}else if(upd.getOldVersion()!=null && upd.getNewVersion()!=null){
|
}else if(upd.getOldVersion()!=null && upd.getNewVersion()!=null){
|
||||||
modifyProduct(upd.getOldVersion().getId(), upd.getNewVersion());
|
modifyProduct(upd.getOldVersion().getId(), upd.getNewVersion());
|
||||||
}else{
|
}else{
|
||||||
//TODO écrit le throw d'une ServerQueryException
|
throw new ServerQueryException("Object ProductUpdate invalide : old et new vallent tous les deux null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user