From 32d654614765349aeb130bb75e6f7e1f443a079d Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 24 Jul 2017 19:22:32 +0200 Subject: [PATCH 01/49] Ajout module Server au workspace java --- Workspace/.idea/compiler.xml | 3 ++- Workspace/.idea/modules.xml | 1 + Workspace/pom.xml | 1 + Workspace/server/pom.xml | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Workspace/server/pom.xml diff --git a/Workspace/.idea/compiler.xml b/Workspace/.idea/compiler.xml index e4c04dd0..63c22bca 100644 --- a/Workspace/.idea/compiler.xml +++ b/Workspace/.idea/compiler.xml @@ -8,12 +8,13 @@ + - + diff --git a/Workspace/.idea/modules.xml b/Workspace/.idea/modules.xml index 464e4d5d..1796f0ba 100644 --- a/Workspace/.idea/modules.xml +++ b/Workspace/.idea/modules.xml @@ -5,6 +5,7 @@ + \ No newline at end of file diff --git a/Workspace/pom.xml b/Workspace/pom.xml index b882372d..015073f8 100644 --- a/Workspace/pom.xml +++ b/Workspace/pom.xml @@ -10,6 +10,7 @@ core client + server pom diff --git a/Workspace/server/pom.xml b/Workspace/server/pom.xml new file mode 100644 index 00000000..6d6622dc --- /dev/null +++ b/Workspace/server/pom.xml @@ -0,0 +1,15 @@ + + + + Main + com.pqt + 1.0-SNAPSHOT + + 4.0.0 + + server + + + \ No newline at end of file From f193e1d087ec74431ca642d6a03d0c13b3114b98 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 24 Jul 2017 19:22:43 +0200 Subject: [PATCH 02/49] Update diagrammes --- Documentation/Diagrammes/diagrammes.asta | Bin 111687 -> 108178 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/Diagrammes/diagrammes.asta b/Documentation/Diagrammes/diagrammes.asta index 06c8e081789686f5eb2fb4e26c4845c646e1862b..d43a96cd83914d70d38a9c45d1a9456272820da5 100644 GIT binary patch literal 108178 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�OUWtG`!rwlWbH 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 Date: Tue, 25 Jul 2017 19:09:35 +0200 Subject: [PATCH 03/49] Ajouts des classes de services du serveur; Update diagrammes de classe; Ajout TODO --- Documentation/Diagrammes/diagrammes.asta | Bin 108178 -> 118331 bytes .../src/main/java/com/pqt/server/Server.java | 7 +++ .../server/module/account/AccountService.java | 23 ++++++++ .../server/module/account/IAccountDao.java | 13 +++++ .../server/module/client/ClientService.java | 37 +++++++++++++ .../com/pqt/server/module/sale/ISaleDao.java | 13 +++++ .../pqt/server/module/sale/SaleService.java | 22 ++++++++ .../pqt/server/module/state/ServerState.java | 43 +++++++++++++++ .../module/state/ServerStateService.java | 40 ++++++++++++++ .../module/statistics/StatisticsService.java | 46 ++++++++++++++++ .../module/stock/HibernateStockDao.java | 50 ++++++++++++++++++ .../pqt/server/module/stock/IStockDao.java | 20 +++++++ .../pqt/server/module/stock/StockService.java | 36 +++++++++++++ 13 files changed, 350 insertions(+) create mode 100644 Workspace/server/src/main/java/com/pqt/server/Server.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/account/AccountService.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/account/IAccountDao.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/client/ClientService.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java create mode 100644 Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java diff --git a/Documentation/Diagrammes/diagrammes.asta b/Documentation/Diagrammes/diagrammes.asta index d43a96cd83914d70d38a9c45d1a9456272820da5..b16a0a47c75ee13c5a5f0fa572d4c4b71b5dc787 100644 GIT binary patch literal 118331 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äVR$xK1=@mb;sbNFKX&A;H&zJOMzoq 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 literal 108178 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 clientCache; + + public ClientService(){ + clientCache = new HashSet<>(); + } + + public boolean isClientRegistered(Client client) { + return clientCache.contains(client); + } + + public void registerClient(Client client) { + if(clientCache.contains(client)){ + refreshClientTimestamp(client); + clientCache.add(client); + } + } + + public Date getLastClientAction(Client client) { + return client.getLastUpdate(); + } + + public void refreshClientTimestamp(Client client) { + client.setLastUpdate(new Date()); + } +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java b/Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java new file mode 100644 index 00000000..6d7e6948 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java @@ -0,0 +1,13 @@ +package com.pqt.server.module.sale; + +import com.pqt.core.entities.sale.Sale; + +//TODO écrire Javadoc +//TODO Créer implémentation +public interface ISaleDao { + + long submitSale(Sale sale); + + void submitSaleRevert(long id); + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java new file mode 100644 index 00000000..f6fd3c56 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java @@ -0,0 +1,22 @@ +package com.pqt.server.module.sale; + +import com.pqt.core.entities.sale.Sale; + +//TODO écrire Javadoc +//TODO ajouter logs +public class SaleService { + + private ISaleDao dao; + + public SaleService() { + } + + public long submitSale(Sale sale) { + return dao.submitSale(sale); + } + + public void submitSaleRevert(long id) { + dao.submitSaleRevert(id); + } + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java b/Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java new file mode 100644 index 00000000..96cd1190 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java @@ -0,0 +1,43 @@ +package com.pqt.server.module.state; + +public class ServerState { + + private int port; + + private boolean serverState; + + public ServerState() { + port = -1; + serverState = false; + } + + public ServerState(int port) { + this.port = port; + serverState = false; + } + + public ServerState(ServerState clone){ + this.serverState = clone.serverState; + this.port = clone.port; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public boolean isServerState() { + return serverState; + } + + public void setServerState(boolean serverState) { + this.serverState = serverState; + } + + public ServerState copy() { + return new ServerState(this); + } +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java b/Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java new file mode 100644 index 00000000..0eea3c32 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java @@ -0,0 +1,40 @@ +package com.pqt.server.module.state; + +import com.pqt.core.entities.members.DataServer; + +import java.util.Date; + +//TODO écrire Javadoc +//TODO Ajouter logs +public class ServerStateService { + + private ServerState serverState; + private DataServer server; + + public ServerStateService() { + this.server = new DataServer(); + this.serverState = new ServerState(); + + //TODO config adresse IP + //this.server.setAddress(...); + + this.server.setLastUpdate(new Date()); + } + + public void startServer() { + serverState.setServerState(true); + } + + public void stopServer() { + serverState.setServerState(false); + } + + public void changeConnectionPort(int port) { + serverState.setPort(port); + } + + public ServerState getServerStateCopy() { + return serverState.copy(); + } + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java b/Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java new file mode 100644 index 00000000..262792fa --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java @@ -0,0 +1,46 @@ +package com.pqt.server.module.statistics; + +import com.pqt.core.entities.product.Product; +import com.pqt.server.module.stock.StockService; +import com.pqt.server.module.sale.SaleService; + +import java.util.List; + +//TODO écrire Javadoc +//TODO Ajouter logs +//TODO écrire contenu méthodes +public class StatisticsService { + + private StockService stockService; + private SaleService saleService; + + public StatisticsService(StockService stockService, SaleService saleService) { + this.stockService = stockService; + this.saleService = saleService; + } + + public int getTotalAmountSale() { + return 0; + } + + public double getTotalMoneyMade() { + return 0; + } + + public double getTotalSaleWorth() { + return 0; + } + + public List getTopPopularProducts(int amount) { + return null; + } + + public int getTotalAmountStaffSales() { + return 0; + } + + public int getTotalAmountGuestSale() { + return 0; + } + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java b/Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java new file mode 100644 index 00000000..cbe9ba2f --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java @@ -0,0 +1,50 @@ +package com.pqt.server.module.stock; + +import com.pqt.core.entities.product.Product; + +import java.util.List; + +//TODO écrire contenu méthodes +public class HibernateStockDao implements IStockDao { + + + /** + * @see com.pqt.server.module.stock.IStockDao#getProductList() + */ + public List getProductList() { + return null; + } + + + /** + * @see com.pqt.server.module.stock.IStockDao#getProduct(long) + */ + public Product getProduct(long id) { + return null; + } + + + /** + * @see com.pqt.server.module.stock.IStockDao#addProduct(com.pqt.core.entities.product.Product) + */ + public void addProduct(Product product) { + + } + + + /** + * @see com.pqt.server.module.stock.IStockDao#removeProduct(long) + */ + public void removeProduct(long id) { + + } + + + /** + * @see com.pqt.server.module.stock.IStockDao#modifyProduct(long, com.pqt.core.entities.product.Product) + */ + public void modifyProduct(long id, Product product) { + + } + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java b/Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java new file mode 100644 index 00000000..6016c44d --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java @@ -0,0 +1,20 @@ +package com.pqt.server.module.stock; + +import com.pqt.core.entities.product.Product; + +import java.util.List; + +//TODO écrire javadoc +public interface IStockDao { + + public List getProductList(); + + public Product getProduct(long id); + + public void addProduct(Product product); + + public void removeProduct(long id); + + public void modifyProduct(long id, Product product); + +} diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java b/Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java new file mode 100644 index 00000000..a4cb6ec8 --- /dev/null +++ b/Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java @@ -0,0 +1,36 @@ +package com.pqt.server.module.stock; + +import com.pqt.core.entities.product.Product; + +import java.util.List; + +//TODO écrire Javadoc +//TODO ajouter logs +public class StockService { + + private IStockDao dao; + + public StockService() { + dao = new HibernateStockDao(); + } + + public List getProductList() { + return dao.getProductList(); + } + + public Product getProduct(long id) { + return dao.getProduct(id); + } + + public void addProduct(Product product) { + dao.addProduct(product); + } + + public void removeProduct(long id) { + dao.removeProduct(id); + } + + public void modifyProduct(long id, Product product) { + dao.modifyProduct(id, product); + } +} From e6eacf4ea873d5075118ec6ea2e3b5a6af4d2dbe Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 15:28:15 +0200 Subject: [PATCH 04/49] Refactor module "server" -> structure de webapp --- Workspace/.idea/artifacts/server_war.xml | 8 ++++++++ .../.idea/artifacts/server_war_exploded.xml | 16 ++++++++++++++++ Workspace/.idea/misc.xml | 9 ++++----- Workspace/.idea/modules.xml | 1 + Workspace/pom.xml | 2 +- Workspace/server/pom.xml | 1 + .../classes}/com/pqt/server/Server.java | 0 .../server/module/account/AccountService.java | 0 .../pqt/server/module/account/IAccountDao.java | 0 .../pqt/server/module/client/ClientService.java | 0 .../com/pqt/server/module/sale/ISaleDao.java | 0 .../com/pqt/server/module/sale/SaleService.java | 0 .../com/pqt/server/module/state/ServerState.java | 0 .../server/module/state/ServerStateService.java | 2 +- .../module/statistics/StatisticsService.java | 0 .../server/module/stock/HibernateStockDao.java | 0 .../com/pqt/server/module/stock/IStockDao.java | 0 .../pqt/server/module/stock/StockService.java | 0 Workspace/server/src/main/WEB-INF/web.xml | 0 19 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 Workspace/.idea/artifacts/server_war.xml create mode 100644 Workspace/.idea/artifacts/server_war_exploded.xml rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/Server.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/account/AccountService.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/account/IAccountDao.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/client/ClientService.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/sale/ISaleDao.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/sale/SaleService.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/state/ServerState.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/state/ServerStateService.java (94%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/statistics/StatisticsService.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/stock/HibernateStockDao.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/stock/IStockDao.java (100%) rename Workspace/server/src/main/{java => WEB-INF/classes}/com/pqt/server/module/stock/StockService.java (100%) create mode 100644 Workspace/server/src/main/WEB-INF/web.xml diff --git a/Workspace/.idea/artifacts/server_war.xml b/Workspace/.idea/artifacts/server_war.xml new file mode 100644 index 00000000..0f04e2c1 --- /dev/null +++ b/Workspace/.idea/artifacts/server_war.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/server/target + + + + + \ No newline at end of file diff --git a/Workspace/.idea/artifacts/server_war_exploded.xml b/Workspace/.idea/artifacts/server_war_exploded.xml new file mode 100644 index 00000000..25d49d27 --- /dev/null +++ b/Workspace/.idea/artifacts/server_war_exploded.xml @@ -0,0 +1,16 @@ + + + $PROJECT_DIR$/server/target/server-1.0-SNAPSHOT + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace/.idea/misc.xml b/Workspace/.idea/misc.xml index 82ba6c90..769b4698 100644 --- a/Workspace/.idea/misc.xml +++ b/Workspace/.idea/misc.xml @@ -1,15 +1,14 @@ + + + - diff --git a/Workspace/.idea/modules.xml b/Workspace/.idea/modules.xml index 1796f0ba..6af297d4 100644 --- a/Workspace/.idea/modules.xml +++ b/Workspace/.idea/modules.xml @@ -6,6 +6,7 @@ + \ No newline at end of file diff --git a/Workspace/pom.xml b/Workspace/pom.xml index 015073f8..8064626c 100644 --- a/Workspace/pom.xml +++ b/Workspace/pom.xml @@ -10,7 +10,7 @@ core client - server + com.pqt.server pom diff --git a/Workspace/server/pom.xml b/Workspace/server/pom.xml index 6d6622dc..12bd3dbc 100644 --- a/Workspace/server/pom.xml +++ b/Workspace/server/pom.xml @@ -8,6 +8,7 @@ 1.0-SNAPSHOT 4.0.0 + war server diff --git a/Workspace/server/src/main/java/com/pqt/server/Server.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/Server.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/account/AccountService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/account/IAccountDao.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/client/ClientService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/client/ClientService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/sale/ISaleDao.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/sale/SaleService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerState.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/state/ServerState.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerState.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java similarity index 94% rename from Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java index 0eea3c32..1d6f8878 100644 --- a/Workspace/server/src/main/java/com/pqt/server/module/state/ServerStateService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/state/ServerStateService.java @@ -16,7 +16,7 @@ public class ServerStateService { this.serverState = new ServerState(); //TODO config adresse IP - //this.server.setAddress(...); + //this.com.pqt.server.setAddress(...); this.server.setLastUpdate(new Date()); } diff --git a/Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/statistics/StatisticsService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/stock/HibernateStockDao.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/stock/IStockDao.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/IStockDao.java diff --git a/Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java similarity index 100% rename from Workspace/server/src/main/java/com/pqt/server/module/stock/StockService.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/StockService.java diff --git a/Workspace/server/src/main/WEB-INF/web.xml b/Workspace/server/src/main/WEB-INF/web.xml new file mode 100644 index 00000000..e69de29b From f7efd3bd105250e3ecd5979243c7b31c4dc962b5 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 15:29:04 +0200 Subject: [PATCH 05/49] Correction nom package dans pom principal --- Workspace/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Workspace/pom.xml b/Workspace/pom.xml index 8064626c..015073f8 100644 --- a/Workspace/pom.xml +++ b/Workspace/pom.xml @@ -10,7 +10,7 @@ core client - com.pqt.server + server pom From 1ab1a1656ca65aa1d4338241a633da3fd04c596b Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 16:32:48 +0200 Subject: [PATCH 06/49] =?UTF-8?q?Ajout=20d=C3=A9pendances=20au=20module=20?= =?UTF-8?q?Server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Workspace/.idea/artifacts/server_war_exploded.xml | 6 ++++++ Workspace/server/pom.xml | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Workspace/.idea/artifacts/server_war_exploded.xml b/Workspace/.idea/artifacts/server_war_exploded.xml index 25d49d27..b6a9ebaa 100644 --- a/Workspace/.idea/artifacts/server_war_exploded.xml +++ b/Workspace/.idea/artifacts/server_war_exploded.xml @@ -6,6 +6,12 @@ + + + + + + diff --git a/Workspace/server/pom.xml b/Workspace/server/pom.xml index 12bd3dbc..b2df5dad 100644 --- a/Workspace/server/pom.xml +++ b/Workspace/server/pom.xml @@ -12,5 +12,19 @@ server + + + + javax + javaee-api + 7.0 + provided + + + com.pqt + core + 1.0-SNAPSHOT + + \ No newline at end of file From 76048e9b41fb4aae1e3e684704ea36fc8331ca0a Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 16:33:31 +0200 Subject: [PATCH 07/49] Module Server : ajout servlet web + gestionnaire de messsage --- .../server/controller/IMessageHandler.java | 8 +++ .../controller/SimpleMessageHandler.java | 51 +++++++++++++++++++ .../com/pqt/server/servlets/QueryServlet.java | 37 ++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/servlets/QueryServlet.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java new file mode 100644 index 00000000..ce4cec02 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java @@ -0,0 +1,8 @@ +package com.pqt.server.controller; + +import com.pqt.core.entities.messages.Message; + +//TODO écrire Javadoc +public interface IMessageHandler { + Message handleMessage(Message message); +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java new file mode 100644 index 00000000..67de608e --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -0,0 +1,51 @@ +package com.pqt.server.controller; + +import com.pqt.core.entities.messages.Message; +import com.pqt.core.entities.messages.MessageType; +import com.pqt.server.module.account.AccountService; +import com.pqt.server.module.client.ClientService; +import com.pqt.server.module.sale.SaleService; +import com.pqt.server.module.state.ServerStateService; +import com.pqt.server.module.statistics.StatisticsService; +import com.pqt.server.module.stock.StockService; + +import java.util.HashMap; +import java.util.Map; + +public class SimpleMessageHandler implements IMessageHandler { + + private AccountService accountService; + private SaleService saleService; + private StatisticsService statisticsService; + private StockService stockService; + private ClientService clientService; + private ServerStateService serverStateService; + + private Map queryHandlers; + + public SimpleMessageHandler() { + serverStateService = new ServerStateService(); + accountService = new AccountService(); + clientService = new ClientService(); + saleService = new SaleService(); + stockService = new StockService(); + statisticsService = new StatisticsService(stockService, saleService); + + queryHandlers = new HashMap<>(); + //TODO ajouter callables à la map + } + + @Override + public Message handleMessage(Message message) { + + if(queryHandlers.containsKey(message.getType())) + return queryHandlers.get(message.getType()).execute(message); + + return null; + } + + //TODO ajouter Javadoc + private interface IMessageProcess{ + Message execute(Message request); + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/servlets/QueryServlet.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/servlets/QueryServlet.java new file mode 100644 index 00000000..e8626bf6 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/servlets/QueryServlet.java @@ -0,0 +1,37 @@ +package com.pqt.server.servlets; + +import com.pqt.core.communication.GSonMessageToolFactory; +import com.pqt.core.communication.IMessageToolFactory; +import com.pqt.core.entities.messages.Message; +import com.pqt.server.controller.IMessageHandler; +import com.pqt.server.controller.SimpleMessageHandler; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +//TODO ajouter logs +@WebServlet(name = "QueryServlet", urlPatterns = "/") +public class QueryServlet extends HttpServlet { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + executeServletProcess(request, response); + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + executeServletProcess(request, response); + } + + private void executeServletProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + IMessageToolFactory messageToolFactory = new GSonMessageToolFactory(); + IMessageHandler msgHandler = new SimpleMessageHandler(); + + if (request.getParameter("message") != null) { + Message resp = msgHandler.handleMessage(messageToolFactory.getObjectParser(Message.class).parse(request.getParameter("message"))); + + response.getWriter().write(messageToolFactory.getObjectFormatter(Message.class).format(resp)); + } + } +} From 99093a39c76139164cc3feaea3af700f7f468702 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 19:51:29 +0200 Subject: [PATCH 08/49] Maj types messages + uupdates tableur interactions client-server --- .../Interactions_serveur-clients.ods | Bin 17234 -> 15649 bytes .../core/entities/messages/MessageType.java | 19 ++++-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Documentation/Interactions_serveur-clients.ods b/Documentation/Interactions_serveur-clients.ods index 3757740bfff8df14faa782da69026043470f0df0..b9561dc4798ce5e79d2c409550088d5e7a2b42f0 100644 GIT binary patch delta 13614 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 delta 15207 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 Date: Wed, 26 Jul 2017 19:52:04 +0200 Subject: [PATCH 09/49] Clss Message : ajout attribut user et replyTo --- .../pqt/core/entities/messages/Message.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/messages/Message.java b/Workspace/core/src/main/java/com/pqt/core/entities/messages/Message.java index 78080326..e6f83a95 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/messages/Message.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/messages/Message.java @@ -1,6 +1,7 @@ package com.pqt.core.entities.messages; import com.pqt.core.entities.members.PqtMember; +import com.pqt.core.entities.user_account.Account; import java.util.ArrayList; import java.util.HashMap; @@ -12,15 +13,19 @@ public class Message { private Map fields; private MessageType type; private PqtMember emitter, receiver; + private Account user; + private Message replyTo; - public Message(MessageType type, PqtMember emitter, PqtMember receiver) { - this(type, emitter, receiver, null); + public Message(MessageType type, PqtMember emitter, PqtMember receiver, Account user, Message replyTo) { + this(type, emitter, receiver, user, replyTo, null); } - public Message(MessageType type, PqtMember emitter, PqtMember receiver, Map fields) { + public Message(MessageType type, PqtMember emitter, PqtMember receiver, Account user, Message replyTo, Map fields) { this.emitter = emitter; this.receiver = receiver; this.type = type; + this.user = user; + this.replyTo = replyTo; this.fields = new HashMap<>(); if(fields!=null) for(String key : fields.keySet()){ @@ -51,4 +56,12 @@ public class Message { public MessageType getType() { return type; } + + public Account getUser() { + return user; + } + + public Message getReplyTo() { + return replyTo; + } } From a11b85eccd2ab32fb33003661200ce22145de851 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 19:53:11 +0200 Subject: [PATCH 10/49] =?UTF-8?q?module=20Server=20:=20d=C3=A9but=20de=20l?= =?UTF-8?q?'impl=C3=A9mentation=20du=20support=20des=20query=20dans=20clss?= =?UTF-8?q?=20SimpleMessageHandler;=20Ajout=20clss=20"ServerQueryException?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Workspace/.idea/modules.xml | 1 - .../controller/SimpleMessageHandler.java | 101 +++++++++++++++++- .../exception/ServerQueryException.java | 4 + .../pqt/server/module/sale/SaleService.java | 5 +- .../module/state/ServerStateService.java | 8 ++ .../module/statistics/StatisticsService.java | 18 +++- 6 files changed, 125 insertions(+), 12 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java diff --git a/Workspace/.idea/modules.xml b/Workspace/.idea/modules.xml index 6af297d4..1796f0ba 100644 --- a/Workspace/.idea/modules.xml +++ b/Workspace/.idea/modules.xml @@ -6,7 +6,6 @@ - \ No newline at end of file diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 67de608e..008640c3 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -1,7 +1,13 @@ package com.pqt.server.controller; +import com.pqt.core.communication.GSonMessageToolFactory; +import com.pqt.core.communication.IMessageToolFactory; import com.pqt.core.entities.messages.Message; import com.pqt.core.entities.messages.MessageType; +import com.pqt.core.entities.product.LightweightProduct; +import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.sale.Sale; +import com.pqt.server.exception.ServerQueryException; import com.pqt.server.module.account.AccountService; import com.pqt.server.module.client.ClientService; import com.pqt.server.module.sale.SaleService; @@ -14,12 +20,16 @@ import java.util.Map; public class SimpleMessageHandler implements IMessageHandler { + private final String header_ref_query = "Detail_refus"; + private final String header_err_query = "Detail_erreur"; + private AccountService accountService; private SaleService saleService; private StatisticsService statisticsService; private StockService stockService; private ClientService clientService; private ServerStateService serverStateService; + private IMessageToolFactory messageToolFactory; private Map queryHandlers; @@ -30,22 +40,105 @@ public class SimpleMessageHandler implements IMessageHandler { saleService = new SaleService(); stockService = new StockService(); statisticsService = new StatisticsService(stockService, saleService); + messageToolFactory = new GSonMessageToolFactory(); queryHandlers = new HashMap<>(); - //TODO ajouter callables à la map + + queryHandlers.put(MessageType.QUERY_STOCK, (message)->{ + Map fields = new HashMap<>(); + fields.put("stock", messageToolFactory.getListFormatter(Product.class).format(stockService.getProductList())); + return new Message(MessageType.MSG_STOCK, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + }); + queryHandlers.put(MessageType.QUERY_SALE, (message)->{ + Map fields = new HashMap<>(); + try { + long saleId = saleService.submitSale(messageToolFactory.getObjectParser(Sale.class).parse(message.getField("sale"))); + fields.put("saleId", Long.toString(saleId)); + return new Message(MessageType.ACK_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + }catch(ServerQueryException e){ + fields.put(header_ref_query, e.toString()); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + }); + queryHandlers.put(MessageType.QUERY_REVERT_SALE, (message)->{ + try{ + saleService.submitSaleRevert(messageToolFactory.getObjectParser(Long.class).parse(message.getField("saleId"))); + return new Message(MessageType.ACK_REVERT_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); + }catch(ServerQueryException e){ + Map fields = new HashMap<>(); + fields.put(header_err_query, e.toString()); + return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + }); + queryHandlers.put(MessageType.QUERY_STAT, (message)->{ + Map fields = new HashMap<>(); + fields.put("total_sale_worth", Double.toString(statisticsService.getTotalSaleWorth())); + fields.put("total_sale_amount", Integer.toString(statisticsService.getTotalAmountSale())); + fields.put("total_money_made", Double.toString(statisticsService.getTotalMoneyMade())); + fields.put("top_popular_products", messageToolFactory.getListFormatter(LightweightProduct.class).format(statisticsService.getTopPopularProducts(5))); + fields.put("staff_sale_worth",Double.toString(statisticsService.getStaffSaleWorth())); + fields.put("staff_sale_amount",Integer.toString(statisticsService.getStaffSaleAmount())); + fields.put("guest_sale_worth",Double.toString(statisticsService.getGuestSaleAmount())); + fields.put("guest_sale_amount",Integer.toString(statisticsService.getStaffSaleAmount())); + + return new Message(MessageType.MSG_STAT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + }); + queryHandlers.put(MessageType.QUERY_UPDATE, (message)->{ + //TODO Supporter les query update + return null; + }); + queryHandlers.put(MessageType.QUERY_CONNECT, (message)->{ + //TODO Supporter les query client + return null; + }); + queryHandlers.put(MessageType.QUERY_LOGIN, (message)->{ + //TODO Supporter les query account + return null; + }); } @Override public Message handleMessage(Message message) { - if(queryHandlers.containsKey(message.getType())) - return queryHandlers.get(message.getType()).execute(message); + Map fields = new HashMap<>(); - return null; + if(!checkClient(message)){ + fields.put(header_ref_query, "client non enregistré sur le serveur"); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + if(!isAccountRegistered(message)){ + fields.put(header_ref_query, "Compte utilisateur inconnu"); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + if(!checkAccountPermission(message)){ + fields.put(header_ref_query, "Compte utilisateur avec permission trop faible"); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + if(queryHandlers.containsKey(message.getType())){ + return queryHandlers.get(message.getType()).execute(message); + } + + fields.put(header_err_query, "Type requête non pris en charge par ce serveur"); + return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } //TODO ajouter Javadoc private interface IMessageProcess{ Message execute(Message request); } + + private boolean checkClient(Message message){ + //TODO faire ça + return false; + } + + private boolean isAccountRegistered(Message message){ + //TODO faire ça + return false; + } + + private boolean checkAccountPermission(Message message){ + //TODO faire ça + return false; + } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java new file mode 100644 index 00000000..c3fb5f6d --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java @@ -0,0 +1,4 @@ +package com.pqt.server.exception; + +public class ServerQueryException extends Exception { +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java index f6fd3c56..4057c88f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java @@ -1,6 +1,7 @@ package com.pqt.server.module.sale; import com.pqt.core.entities.sale.Sale; +import com.pqt.server.exception.ServerQueryException; //TODO écrire Javadoc //TODO ajouter logs @@ -11,11 +12,11 @@ public class SaleService { public SaleService() { } - public long submitSale(Sale sale) { + public long submitSale(Sale sale) throws ServerQueryException { return dao.submitSale(sale); } - public void submitSaleRevert(long id) { + public void submitSaleRevert(long id) throws ServerQueryException { dao.submitSaleRevert(id); } 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 1d6f8878..4e2d63c7 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 @@ -33,6 +33,14 @@ public class ServerStateService { serverState.setPort(port); } + public DataServer getServer() { + return server; + } + + public void setServer(DataServer server) { + this.server = server; + } + public ServerState getServerStateCopy() { return serverState.copy(); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java index 262792fa..5c7cfef9 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java @@ -1,5 +1,6 @@ package com.pqt.server.module.statistics; +import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; import com.pqt.server.module.stock.StockService; import com.pqt.server.module.sale.SaleService; @@ -31,16 +32,23 @@ public class StatisticsService { return 0; } - public List getTopPopularProducts(int amount) { + public List getTopPopularProducts(int amount) { return null; } - public int getTotalAmountStaffSales() { + public int getStaffSaleAmount() { return 0; } - public int getTotalAmountGuestSale() { - return 0; - } + public double getStaffSaleWorth() { + return 0; + } + public int getGuestSaleAmount() { + return 0; + } + + public double getGuestSaleWorth() { + return 0; + } } From 80ba949505d0da126a78b012b2e0bd34a4deb183 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 21:41:09 +0200 Subject: [PATCH 11/49] =?UTF-8?q?Module=20Server=20:=20fin=20de=20l'impl?= =?UTF-8?q?=C3=A9mentation=20du=20support=20des=20query;=20Suppression=20d?= =?UTF-8?q?es=20queryLogin=20et=20queryConnect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.~lock.Interactions_serveur-clients.ods# | 1 + .../Interactions_serveur-clients.ods | Bin 15649 -> 16020 bytes .../pqt/core/entities/query/ConnectQuery.java | 19 --------- .../com/pqt/core/entities/query/LogQuery.java | 32 --------------- .../classes/com/pqt/server/Server.java | 7 ---- .../controller/SimpleMessageHandler.java | 37 ++++++++---------- .../server/module/account/AccountService.java | 3 ++ .../server/module/account/IAccountDao.java | 1 + .../pqt/server/module/stock/StockService.java | 22 +++++++++-- 9 files changed, 40 insertions(+), 82 deletions(-) create mode 100644 Documentation/.~lock.Interactions_serveur-clients.ods# delete mode 100644 Workspace/core/src/main/java/com/pqt/core/entities/query/ConnectQuery.java delete mode 100644 Workspace/core/src/main/java/com/pqt/core/entities/query/LogQuery.java delete mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java diff --git a/Documentation/.~lock.Interactions_serveur-clients.ods# b/Documentation/.~lock.Interactions_serveur-clients.ods# new file mode 100644 index 00000000..2af99208 --- /dev/null +++ b/Documentation/.~lock.Interactions_serveur-clients.ods# @@ -0,0 +1 @@ +,Notmoo-PC/Guillaume,Notmoo-PC,26.07.2017 21:36,file:///C:/Users/Guillaume/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/Documentation/Interactions_serveur-clients.ods b/Documentation/Interactions_serveur-clients.ods index b9561dc4798ce5e79d2c409550088d5e7a2b42f0..4c2525176df9a8504a2647c3320b4efdea9e148e 100644 GIT binary patch delta 14089 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 delta 13778 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 W0I9+S-sZ*u`w6~>E#&^I_kRF>c53wi diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/query/ConnectQuery.java b/Workspace/core/src/main/java/com/pqt/core/entities/query/ConnectQuery.java deleted file mode 100644 index f5caa308..00000000 --- a/Workspace/core/src/main/java/com/pqt/core/entities/query/ConnectQuery.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pqt.core.entities.query; - -public class ConnectQuery extends SimpleQuery { - - private String serverAddress; - - public ConnectQuery(String serverAddress) { - super(QueryType.CONNECT); - this.serverAddress = serverAddress; - } - - public String getServerAddress() { - return serverAddress; - } - - public void setServerAddress(String serverAddress) { - this.serverAddress = serverAddress; - } -} diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/query/LogQuery.java b/Workspace/core/src/main/java/com/pqt/core/entities/query/LogQuery.java deleted file mode 100644 index 106d5fd7..00000000 --- a/Workspace/core/src/main/java/com/pqt/core/entities/query/LogQuery.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pqt.core.entities.query; - -import com.pqt.core.entities.user_account.Account; - -public class LogQuery extends SimpleQuery { - - private Account account; - - private boolean newDesiredState; - - public LogQuery(Account account, boolean newDesiredState) { - super(QueryType.LOG); - this.account = account; - this.newDesiredState = newDesiredState; - } - - public Account getAccount() { - return account; - } - - public void setAccount(Account account) { - this.account = account; - } - - public boolean isNewDesiredState() { - return newDesiredState; - } - - public void setNewDesiredState(boolean newDesiredState) { - this.newDesiredState = newDesiredState; - } -} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java deleted file mode 100644 index 7e88ea10..00000000 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/Server.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.pqt.server; - -public class Server { - public static void main(String[] args){ - - } -} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 008640c3..db41df3f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -2,11 +2,14 @@ package com.pqt.server.controller; import com.pqt.core.communication.GSonMessageToolFactory; import com.pqt.core.communication.IMessageToolFactory; +import com.pqt.core.entities.members.Client; import com.pqt.core.entities.messages.Message; import com.pqt.core.entities.messages.MessageType; import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.product.ProductUpdate; import com.pqt.core.entities.sale.Sale; +import com.pqt.core.entities.user_account.Account; import com.pqt.server.exception.ServerQueryException; import com.pqt.server.module.account.AccountService; import com.pqt.server.module.client.ClientService; @@ -16,8 +19,10 @@ import com.pqt.server.module.statistics.StatisticsService; import com.pqt.server.module.stock.StockService; import java.util.HashMap; +import java.util.List; import java.util.Map; +//TODO ajouter des messages d'erreur spécifiques pour les NullPointerException si le param du message vaut null public class SimpleMessageHandler implements IMessageHandler { private final String header_ref_query = "Detail_refus"; @@ -55,7 +60,7 @@ public class SimpleMessageHandler implements IMessageHandler { long saleId = saleService.submitSale(messageToolFactory.getObjectParser(Sale.class).parse(message.getField("sale"))); fields.put("saleId", Long.toString(saleId)); return new Message(MessageType.ACK_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - }catch(ServerQueryException e){ + }catch(ServerQueryException | NullPointerException e){ fields.put(header_ref_query, e.toString()); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } @@ -64,7 +69,7 @@ public class SimpleMessageHandler implements IMessageHandler { try{ saleService.submitSaleRevert(messageToolFactory.getObjectParser(Long.class).parse(message.getField("saleId"))); return new Message(MessageType.ACK_REVERT_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); - }catch(ServerQueryException e){ + }catch(ServerQueryException | NullPointerException e){ Map fields = new HashMap<>(); fields.put(header_err_query, e.toString()); return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); @@ -84,16 +89,15 @@ public class SimpleMessageHandler implements IMessageHandler { return new Message(MessageType.MSG_STAT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); }); queryHandlers.put(MessageType.QUERY_UPDATE, (message)->{ - //TODO Supporter les query update - return null; - }); - queryHandlers.put(MessageType.QUERY_CONNECT, (message)->{ - //TODO Supporter les query client - return null; - }); - queryHandlers.put(MessageType.QUERY_LOGIN, (message)->{ - //TODO Supporter les query account - return null; + try{ + List updates = messageToolFactory.getListParser(ProductUpdate.class).parse(message.getField("updates")); + stockService.applyUpdateList(updates); + return new Message(MessageType.ACK_UPDATE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); + }catch (ServerQueryException | NullPointerException e){ + Map fields = new HashMap<>(); + fields.put(header_err_query, e.toString()); + return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } }); } @@ -102,10 +106,6 @@ public class SimpleMessageHandler implements IMessageHandler { Map fields = new HashMap<>(); - if(!checkClient(message)){ - fields.put(header_ref_query, "client non enregistré sur le serveur"); - return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - } if(!isAccountRegistered(message)){ fields.put(header_ref_query, "Compte utilisateur inconnu"); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); @@ -127,11 +127,6 @@ public class SimpleMessageHandler implements IMessageHandler { Message execute(Message request); } - private boolean checkClient(Message message){ - //TODO faire ça - return false; - } - private boolean isAccountRegistered(Message message){ //TODO faire ça return false; diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index 3c7c6abb..c7eb5548 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -20,4 +20,7 @@ public class AccountService { return dao.setAccountConnected(acc, connected); } + public boolean isAccountRegistered(Account acc){ + return dao.isAccountRegistered(acc); + } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index 61a76a54..2160d2df 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -10,4 +10,5 @@ public interface IAccountDao { boolean setAccountConnected(Account acc, boolean connected); + boolean isAccountRegistered(Account acc); } 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 a4cb6ec8..a5e08643 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 @@ -1,6 +1,8 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.product.ProductUpdate; +import com.pqt.server.exception.ServerQueryException; import java.util.List; @@ -22,15 +24,29 @@ public class StockService { return dao.getProduct(id); } - public void addProduct(Product product) { + public void applyUpdateList(List updates) throws ServerQueryException{ + for(ProductUpdate upd : updates){ + if(upd.getOldVersion()==null){ + addProduct(upd.getNewVersion()); + }else if(upd.getNewVersion()==null){ + removeProduct(upd.getOldVersion().getId()); + }else if(upd.getOldVersion()!=null && upd.getNewVersion()!=null){ + modifyProduct(upd.getOldVersion().getId(), upd.getNewVersion()); + }else{ + //TODO écrit le throw d'une ServerQueryException + } + } + } + + private void addProduct(Product product) { dao.addProduct(product); } - public void removeProduct(long id) { + private void removeProduct(long id) { dao.removeProduct(id); } - public void modifyProduct(long id, Product product) { + private void modifyProduct(long id, Product product) { dao.modifyProduct(id, product); } } From decb9f05f3d449531f8766787f8d94fa76a8f604 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 26 Jul 2017 21:43:39 +0200 Subject: [PATCH 12/49] Clss SimpleMessageHandler : suppressions d'import inutiles --- .../classes/com/pqt/server/controller/SimpleMessageHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index db41df3f..cbbaef1c 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -2,14 +2,12 @@ package com.pqt.server.controller; import com.pqt.core.communication.GSonMessageToolFactory; import com.pqt.core.communication.IMessageToolFactory; -import com.pqt.core.entities.members.Client; import com.pqt.core.entities.messages.Message; import com.pqt.core.entities.messages.MessageType; import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; import com.pqt.core.entities.product.ProductUpdate; import com.pqt.core.entities.sale.Sale; -import com.pqt.core.entities.user_account.Account; import com.pqt.server.exception.ServerQueryException; import com.pqt.server.module.account.AccountService; import com.pqt.server.module.client.ClientService; From 6ae7954683e5645fdbd163fbec8a49b05fb2ec53 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 27 Jul 2017 15:20:07 +0200 Subject: [PATCH 13/49] =?UTF-8?q?Arr=C3=AAt=20du=20tracking=20du=20lock=20?= =?UTF-8?q?de=20fichier=20Open=20Office?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentation/.~lock.Interactions_serveur-clients.ods# | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Documentation/.~lock.Interactions_serveur-clients.ods# diff --git a/Documentation/.~lock.Interactions_serveur-clients.ods# b/Documentation/.~lock.Interactions_serveur-clients.ods# deleted file mode 100644 index 2af99208..00000000 --- a/Documentation/.~lock.Interactions_serveur-clients.ods# +++ /dev/null @@ -1 +0,0 @@ -,Notmoo-PC/Guillaume,Notmoo-PC,26.07.2017 21:36,file:///C:/Users/Guillaume/AppData/Roaming/LibreOffice/4; \ No newline at end of file From 79d531273a18804b370ec43225fe947fb04cb466 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 27 Jul 2017 16:29:28 +0200 Subject: [PATCH 14/49] =?UTF-8?q?Correction=20probl=C3=A8me=20build=20mave?= =?UTF-8?q?n=20module=20Server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Workspace/.idea/artifacts/server_war_exploded.xml | 11 +++++++++++ Workspace/pom.xml | 7 +++++++ Workspace/server/src/main/WEB-INF/web.xml | 0 3 files changed, 18 insertions(+) delete mode 100644 Workspace/server/src/main/WEB-INF/web.xml diff --git a/Workspace/.idea/artifacts/server_war_exploded.xml b/Workspace/.idea/artifacts/server_war_exploded.xml index b6a9ebaa..c41d4bfa 100644 --- a/Workspace/.idea/artifacts/server_war_exploded.xml +++ b/Workspace/.idea/artifacts/server_war_exploded.xml @@ -11,6 +11,17 @@ + + + + + + + + + + + diff --git a/Workspace/pom.xml b/Workspace/pom.xml index 015073f8..3bda6309 100644 --- a/Workspace/pom.xml +++ b/Workspace/pom.xml @@ -23,6 +23,13 @@ 1.8 + + org.apache.maven.plugins + maven-war-plugin + + false + + \ No newline at end of file diff --git a/Workspace/server/src/main/WEB-INF/web.xml b/Workspace/server/src/main/WEB-INF/web.xml deleted file mode 100644 index e69de29b..00000000 From 0b8bb4e183689d8051ab33afacf14ff26bf5e335 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 13:27:09 +0200 Subject: [PATCH 15/49] =?UTF-8?q?Module=20Core,=20clss=20Product=20:=20Ajo?= =?UTF-8?q?ut=20constructeur=20de=20copie=20+=20modif=20m=C3=A9thode=20de?= =?UTF-8?q?=20copie=20du=20contenu=20(utilisation=20des=20streams)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/pqt/core/entities/product/Product.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/product/Product.java b/Workspace/core/src/main/java/com/pqt/core/entities/product/Product.java index 2f72df2b..72fe0f8c 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/product/Product.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/product/Product.java @@ -33,10 +33,14 @@ public class Product implements ILoggable, Serializable{ this.category = category; this.components = new ArrayList<>(); if(components!=null){ - this.components.addAll(components); + components.stream().forEach(p->this.components.add(new Product(p))); } } + public Product(Product p) { + this(p.id, p.name, p.amountRemaining, p.amountSold, p.sellable, p.price, p.components, p.category); + } + public long getId() { return id; } From 60935bf45e237ce490c256137c9c8bc98713e5d4 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 13:27:59 +0200 Subject: [PATCH 16/49] Module Server : suppr clss HibernateStockDao, ajout clss FileStockDao --- .../.idea/artifacts/server_war_exploded.xml | 11 -- .../pqt/server/module/stock/FileStockDao.java | 123 ++++++++++++++++++ .../module/stock/HibernateStockDao.java | 50 ------- .../pqt/server/module/stock/StockService.java | 2 +- 4 files changed, 124 insertions(+), 62 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java delete mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java diff --git a/Workspace/.idea/artifacts/server_war_exploded.xml b/Workspace/.idea/artifacts/server_war_exploded.xml index c41d4bfa..b6a9ebaa 100644 --- a/Workspace/.idea/artifacts/server_war_exploded.xml +++ b/Workspace/.idea/artifacts/server_war_exploded.xml @@ -11,17 +11,6 @@ - - - - - - - - - - - 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 new file mode 100644 index 00000000..6f8c42a1 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/FileStockDao.java @@ -0,0 +1,123 @@ +package com.pqt.server.module.stock; + +import com.pqt.core.entities.product.Product; + +import java.io.*; +import java.util.*; + +//TODO écrire Javadoc +public class FileStockDao implements IStockDao { + + private static final String STOCK_FILE_NAME = "stock.pqt"; + private long nextProductId; + private Random random; + + private Map products; + + public FileStockDao() { + random = new Random(); + products = new HashMap<>(); + load(); + generateNextProductId(); + } + + private void generateNextProductId() { + Long newId; + do{ + newId = random.nextLong(); + }while (products.containsKey(newId)); + nextProductId = newId; + } + + /** + * @see com.pqt.server.module.stock.IStockDao#getProductList() + */ + public List getProductList() { + return copyOfProductList(); + } + + private List copyOfProductList() { + List copy = new ArrayList<>(); + products.values().stream().forEach(p->copy.add(new Product(p))); + return copy; + } + + /** + * @see com.pqt.server.module.stock.IStockDao#getProduct(long) + */ + public Product getProduct(long id) { + return products.get(id); + } + + /** + * @see com.pqt.server.module.stock.IStockDao#addProduct(com.pqt.core.entities.product.Product) + */ + public void addProduct(Product product) { + product.setId(nextProductId); + this.products.put(nextProductId, product); + generateNextProductId(); + save(this.products); + } + + /** + * @see com.pqt.server.module.stock.IStockDao#removeProduct(long) + */ + public void removeProduct(long id) { + Product product = getProduct(id); + if(product!=null){ + this.products.remove(product); + save(this.products); + } + } + + /** + * @see com.pqt.server.module.stock.IStockDao#modifyProduct(long, com.pqt.core.entities.product.Product) + */ + public void modifyProduct(long id, Product product) { + if(this.products.containsKey(id)){ + product.setId(id); + this.products.put(id, product); + } + } + + private Map load(){ + Map loadedData = new HashMap<>(); + try(FileInputStream fis = new FileInputStream(STOCK_FILE_NAME); + ObjectInputStream ois = new ObjectInputStream(fis)){ + + boolean end = false; + do{ + try{ + Object obj = ois.readObject(); + if(Product.class.isInstance(obj)){ + Product p = Product.class.cast(obj); + loadedData.put(p.getId(), p); + } + }catch (EOFException e){ + end = true; + }catch(ClassNotFoundException | InvalidClassException e){ + e.printStackTrace(); + } + }while(!end); + }catch( IOException e){ + e.printStackTrace(); + } + return loadedData; + } + + private void save(Map products){ + try(FileOutputStream fos = new FileOutputStream(STOCK_FILE_NAME); + ObjectOutputStream oos = new ObjectOutputStream(fos)){ + + products.values().stream().forEach(p -> { + try { + oos.writeObject(p); + } catch (IOException e) { + e.printStackTrace(); + } + }); + }catch(IOException e){ + e.printStackTrace(); + } + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java deleted file mode 100644 index cbe9ba2f..00000000 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/stock/HibernateStockDao.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pqt.server.module.stock; - -import com.pqt.core.entities.product.Product; - -import java.util.List; - -//TODO écrire contenu méthodes -public class HibernateStockDao implements IStockDao { - - - /** - * @see com.pqt.server.module.stock.IStockDao#getProductList() - */ - public List getProductList() { - return null; - } - - - /** - * @see com.pqt.server.module.stock.IStockDao#getProduct(long) - */ - public Product getProduct(long id) { - return null; - } - - - /** - * @see com.pqt.server.module.stock.IStockDao#addProduct(com.pqt.core.entities.product.Product) - */ - public void addProduct(Product product) { - - } - - - /** - * @see com.pqt.server.module.stock.IStockDao#removeProduct(long) - */ - public void removeProduct(long id) { - - } - - - /** - * @see com.pqt.server.module.stock.IStockDao#modifyProduct(long, com.pqt.core.entities.product.Product) - */ - public void modifyProduct(long id, Product product) { - - } - -} 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 a5e08643..867ad057 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 @@ -13,7 +13,7 @@ public class StockService { private IStockDao dao; public StockService() { - dao = new HibernateStockDao(); + dao = new FileStockDao(); } public List getProductList() { From 57757fe10b33c1d9fededf2537012dbe318f4c53 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 14:07:50 +0200 Subject: [PATCH 17/49] =?UTF-8?q?Module=20Server=20:=20ajout=20clss=20File?= =?UTF-8?q?Util,=20ajout=20v=C3=A9rif=20existance=20fichier=20dans=20clss?= =?UTF-8?q?=20FileStockDao?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/module/stock/FileStockDao.java | 16 ++++++++++++ .../com/pqt/server/utils/FileUtil.java | 26 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java 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 6f8c42a1..37824cee 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 @@ -1,6 +1,7 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; +import com.pqt.server.utils.FileUtil; import java.io.*; import java.util.*; @@ -82,6 +83,15 @@ public class FileStockDao implements IStockDao { private Map load(){ Map loadedData = new HashMap<>(); + try{ + if(FileUtil.createFileIfNotExist(STOCK_FILE_NAME)){ + return loadedData; + } + }catch(IOException e){ + e.printStackTrace(); + return loadedData; + } + try(FileInputStream fis = new FileInputStream(STOCK_FILE_NAME); ObjectInputStream ois = new ObjectInputStream(fis)){ @@ -106,6 +116,12 @@ public class FileStockDao implements IStockDao { } private void save(Map products){ + try{ + FileUtil.createFileIfNotExist(STOCK_FILE_NAME); + }catch (IOException e){ + e.printStackTrace(); + return; + } try(FileOutputStream fos = new FileOutputStream(STOCK_FILE_NAME); ObjectOutputStream oos = new ObjectOutputStream(fos)){ diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java new file mode 100644 index 00000000..08fddf40 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java @@ -0,0 +1,26 @@ +package com.pqt.server.utils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class FileUtil { + + /** + * Check if the given file path correspond to an existing file, and create it if it doesn't. + * + * @param filePath the file path to check + * + * @return {@code true} if the file has been created, {@code false} if it already existed. + * @throws IOException if any IOException happend during this method's execution. + */ + public static boolean createFileIfNotExist(String filePath) throws IOException { + Path path = Paths.get(filePath); + if(!Files.exists(path)){ + Files.createFile(path); + return true; + } + return false; + } +} From e3c0e510bfe41b3e184d899b68d3ca5ec0042e7e Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 16:03:34 +0200 Subject: [PATCH 18/49] =?UTF-8?q?Module=20Server=20:=20Ajout=20d=C3=A9p=20?= =?UTF-8?q?mvn=20Apache=20commons=20io,=20ajout=20clss=20NoRevertFileSaleD?= =?UTF-8?q?ao,=20ajout=20m=C3=A9thd=20applySale()=20aux=20clss=20StockServ?= =?UTF-8?q?ice=20et=20IStockDao=20+=20impl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.idea/artifacts/server_war_exploded.xml | 1 + Workspace/server/pom.xml | 7 + .../module/sale/NoRevertFileSaleDao.java | 132 ++++++++++++++++++ .../pqt/server/module/sale/SaleService.java | 4 +- .../pqt/server/module/stock/FileStockDao.java | 5 + .../pqt/server/module/stock/IStockDao.java | 2 + .../pqt/server/module/stock/StockService.java | 5 + .../com/pqt/server/utils/FileUtil.java | 8 +- 8 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java diff --git a/Workspace/.idea/artifacts/server_war_exploded.xml b/Workspace/.idea/artifacts/server_war_exploded.xml index b6a9ebaa..ac4990b5 100644 --- a/Workspace/.idea/artifacts/server_war_exploded.xml +++ b/Workspace/.idea/artifacts/server_war_exploded.xml @@ -11,6 +11,7 @@ + diff --git a/Workspace/server/pom.xml b/Workspace/server/pom.xml index b2df5dad..53fc9c3a 100644 --- a/Workspace/server/pom.xml +++ b/Workspace/server/pom.xml @@ -25,6 +25,13 @@ core 1.0-SNAPSHOT + + + commons-io + commons-io + 2.4 + + \ No newline at end of file diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java new file mode 100644 index 00000000..62578ea3 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java @@ -0,0 +1,132 @@ +package com.pqt.server.module.sale; + +import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.sale.Sale; +import com.pqt.server.module.stock.StockService; +import com.pqt.server.utils.FileUtil; +import org.apache.commons.io.input.ReversedLinesFileReader; + +import java.io.*; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Iterator; + +public class NoRevertFileSaleDao implements ISaleDao { + + private static final String SALE_LOG_FILE_NAME = "sale_log.txt"; + private StockService stockService; + private long nextSaleId; + private ISaleRenderer renderer; + + NoRevertFileSaleDao(StockService stockService) { + this.stockService = stockService; + this.renderer = getRenderer(); + nextSaleId = readLastSaleIdFromFile()+1; + } + + @Override + public long submitSale(Sale sale) { + boolean valid = true; + Iterator it = sale.getProducts().keySet().iterator(); + while(valid && it.hasNext()){ + Product p = it.next(); + Product product = stockService.getProduct(p.getId()); + valid = product!=null + && p.equals(product) + && product.isSellable() + && product.getAmountRemaining()>=sale.getProducts().get(p); + } + + if(!valid) + return -1; + + long saleId = nextSaleId; + stockService.applySale(sale.getProducts()); + logSale(sale, saleId); + generateNextSaleId(); + return saleId; + } + + private void generateNextSaleId() { + nextSaleId++; + } + + /** + * Read the last sale id written in the log file with title {@link #SALE_LOG_FILE_NAME} or a default value if such id has not been found. + *

+ * Different reasons why this method may not find any id :
+ * - file does not exist
+ * - file is empty
+ * - file does not respect the expected syntax for writing sales' data
+ *

+ * The log file with title {@link #SALE_LOG_FILE_NAME} is not created by this method if it doesn't exist yet. + * @return last sale id used in the log file, or -1 if none was found. + */ + private long readLastSaleIdFromFile(){ + long id = -1; + if(FileUtil.exist(SALE_LOG_FILE_NAME)){ + try(ReversedLinesFileReader rlfr = new ReversedLinesFileReader(new File("SALE_LOG_FILE_NAME"))){ + boolean stop = false; + do{ + try { + String line = rlfr.readLine(); + if(line.matches("^[0-9]+$")){ + id = Long.parseLong(line.substring(1)); + stop = true; + } + }catch (EOFException e){ + stop = true; + } + }while(!stop); + } catch (IOException e) { + e.printStackTrace(); + } + return id; + }else{ + return id; + } + } + + @Override + public void submitSaleRevert(long id) { + //TODO Créer un nouveau dao qui supporte le revert + throw new UnsupportedOperationException("Le revert de commandes n'est pas supporté"); + } + + private void logSale(Sale sale, long saleId){ + try(FileOutputStream fos = new FileOutputStream(SALE_LOG_FILE_NAME); + PrintWriter pw = new PrintWriter(fos)){ + + pw.append(renderer.render(sale, saleId)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private ISaleRenderer getRenderer(){ + return(sale, id)->{ + StringBuffer sb = new StringBuffer("\n#").append(id).append("\n"); + String separator = "-----"; + DateFormat dateFormat = new SimpleDateFormat("

"); + + sb.append("type : ").append(sale.getType().name()).append("\n"); + sb.append("at : ").append(dateFormat.format(sale.getOrderedAt())).append("\n"); + if(sale.getOrderedBy()!=null) + sb.append("by : ").append(sale.getOrderedBy().getUsername()).append("(").append(sale.getOrderedBy().getPermissionLevel().name()).append(")").append("\n"); + if(sale.getOrderedFor()!=null) + sb.append("for : ").append(sale.getOrderedFor().getUsername()).append("(").append(sale.getOrderedFor().getPermissionLevel().name()).append(")").append("\n"); + sb.append(separator).append("\n"); + sb.append("Products : \n"); + sale.getProducts().keySet().forEach(p->{ + int productAmount = sale.getProducts().get(p); + sb.append(String.format(" * %s (%du, %f€) : %d remaining in stock", p.getName(), productAmount, p.getPrice()*(double)productAmount, p.getAmountRemaining()-productAmount)).append("\n"); + }); + sb.append(separator); + return sb.toString(); + }; + } + + private interface ISaleRenderer{ + String render(Sale sale, long saleId); + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java index 4057c88f..15817c8a 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java @@ -2,6 +2,7 @@ package com.pqt.server.module.sale; import com.pqt.core.entities.sale.Sale; import com.pqt.server.exception.ServerQueryException; +import com.pqt.server.module.stock.StockService; //TODO écrire Javadoc //TODO ajouter logs @@ -9,7 +10,8 @@ public class SaleService { private ISaleDao dao; - public SaleService() { + public SaleService(StockService stockService) { + dao = new NoRevertFileSaleDao(stockService); } public long submitSale(Sale sale) throws ServerQueryException { 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 37824cee..658f9c24 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 @@ -81,6 +81,11 @@ public class FileStockDao implements IStockDao { } } + @Override + public void applySale(Map productAmounts) { + //TODO faire ça + } + private Map load(){ Map loadedData = new HashMap<>(); try{ 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 6016c44d..3a8f7698 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 @@ -3,6 +3,7 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; import java.util.List; +import java.util.Map; //TODO écrire javadoc public interface IStockDao { @@ -17,4 +18,5 @@ public interface IStockDao { public void modifyProduct(long id, Product product); + void applySale(Map productAmounts); } 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 867ad057..3f538db2 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 @@ -5,6 +5,7 @@ import com.pqt.core.entities.product.ProductUpdate; import com.pqt.server.exception.ServerQueryException; import java.util.List; +import java.util.Map; //TODO écrire Javadoc //TODO ajouter logs @@ -24,6 +25,10 @@ public class StockService { return dao.getProduct(id); } + public void applySale(Map productAmounts) { + dao.applySale(productAmounts); + } + public void applyUpdateList(List updates) throws ServerQueryException{ for(ProductUpdate upd : updates){ if(upd.getOldVersion()==null){ diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java index 08fddf40..5964ab4f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java @@ -16,11 +16,15 @@ public class FileUtil { * @throws IOException if any IOException happend during this method's execution. */ public static boolean createFileIfNotExist(String filePath) throws IOException { - Path path = Paths.get(filePath); - if(!Files.exists(path)){ + if(FileUtil.exist(filePath)){ + Path path = Paths.get(filePath); Files.createFile(path); return true; } return false; } + + public static boolean exist(String filePath) { + return Files.exists(Paths.get(filePath)); + } } From dfc2ec93c216f599f4e7cbf4f3c669f173b279cc Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 17:43:33 +0200 Subject: [PATCH 19/49] Module Server : modif nom packg (utils -> tools) et ajout clss SaleContent dans le packg tools.entities --- .../pqt/server/{utils => tools}/FileUtil.java | 2 +- .../server/tools/entities/SaleContent.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) rename Workspace/server/src/main/WEB-INF/classes/com/pqt/server/{utils => tools}/FileUtil.java (96%) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/entities/SaleContent.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java similarity index 96% rename from Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java rename to Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java index 5964ab4f..1a0fc195 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/utils/FileUtil.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java @@ -1,4 +1,4 @@ -package com.pqt.server.utils; +package com.pqt.server.tools; import java.io.IOException; import java.nio.file.Files; diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/entities/SaleContent.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/entities/SaleContent.java new file mode 100644 index 00000000..aeb2e7d8 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/entities/SaleContent.java @@ -0,0 +1,43 @@ +package com.pqt.server.tools.entities; + +import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.sale.Sale; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class SaleContent { + private Map content; + + public SaleContent() { + content = new HashMap<>(); + } + + public SaleContent(Sale sale){ + content = new HashMap<>(sale.getProducts()); + } + + public void addProduct(Product product, Integer amount){ + if(content.containsKey(product)){ + content.replace(product, content.get(product)+amount); + }else{ + content.put(product, amount); + } + } + + public Collection getProductList(){ + return content.keySet(); + } + + public boolean contains(Product product){ + return content.containsKey(product); + } + + public Integer getProductAmount(Product product){ + if(content.containsKey(product)) + return content.get(product); + + return null; + } +} From ac51f3952d5ef350cc9d1732f934a22d303e6880 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 17:44:31 +0200 Subject: [PATCH 20/49] Module Server : utilisation clss SaleContent dans process d'application d'une sale. Impl de ce process dans le StockService --- .../module/sale/NoRevertFileSaleDao.java | 5 +-- .../pqt/server/module/stock/FileStockDao.java | 32 ++++++++++++++++--- .../pqt/server/module/stock/IStockDao.java | 3 +- .../pqt/server/module/stock/StockService.java | 3 +- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java index 62578ea3..ef6d6db4 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java @@ -3,7 +3,8 @@ package com.pqt.server.module.sale; import com.pqt.core.entities.product.Product; import com.pqt.core.entities.sale.Sale; import com.pqt.server.module.stock.StockService; -import com.pqt.server.utils.FileUtil; +import com.pqt.server.tools.FileUtil; +import com.pqt.server.tools.entities.SaleContent; import org.apache.commons.io.input.ReversedLinesFileReader; import java.io.*; @@ -41,7 +42,7 @@ public class NoRevertFileSaleDao implements ISaleDao { return -1; long saleId = nextSaleId; - stockService.applySale(sale.getProducts()); + stockService.applySale(new SaleContent(sale)); logSale(sale, saleId); generateNextSaleId(); return saleId; 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 658f9c24..d4c5f599 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 @@ -1,7 +1,8 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; -import com.pqt.server.utils.FileUtil; +import com.pqt.server.tools.FileUtil; +import com.pqt.server.tools.entities.SaleContent; import java.io.*; import java.util.*; @@ -17,8 +18,7 @@ public class FileStockDao implements IStockDao { public FileStockDao() { random = new Random(); - products = new HashMap<>(); - load(); + loadFromFile(); generateNextProductId(); } @@ -82,8 +82,30 @@ public class FileStockDao implements IStockDao { } @Override - public void applySale(Map productAmounts) { - //TODO faire ça + public void applySale(SaleContent saleContent) throws IllegalArgumentException { + try { + saleContent.getProductList().forEach(product -> applyRecursiveStockRemoval(product, saleContent.getProductAmount(product))); + }catch (IllegalStateException e){ + loadFromFile(); + throw new IllegalArgumentException(e); + } + } + + private void applyRecursiveStockRemoval(Product product, int amount)throws IllegalStateException{ + Product correspondingProduct = getProduct(product.getId()); + if(correspondingProduct!=null) { + correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount); + 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 : "); + sb.append(product.getId()).append(" - ").append(product.getName()).append("(").append(product.getCategory()).append(")"); + throw new IllegalStateException(sb.toString()); + } + } + + private void loadFromFile() { + products = new HashMap<>(load()); } private Map load(){ 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 3a8f7698..0cc9e1f8 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 @@ -1,6 +1,7 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; +import com.pqt.server.tools.entities.SaleContent; import java.util.List; import java.util.Map; @@ -18,5 +19,5 @@ public interface IStockDao { public void modifyProduct(long id, Product product); - void applySale(Map productAmounts); + void applySale(SaleContent productAmounts) 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 3f538db2..03ebefa1 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 @@ -3,6 +3,7 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; import com.pqt.core.entities.product.ProductUpdate; import com.pqt.server.exception.ServerQueryException; +import com.pqt.server.tools.entities.SaleContent; import java.util.List; import java.util.Map; @@ -25,7 +26,7 @@ public class StockService { return dao.getProduct(id); } - public void applySale(Map productAmounts) { + public void applySale(SaleContent productAmounts) { dao.applySale(productAmounts); } From 064b35aaea99c0e475a00f818433f74f1f3cdbe9 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 17:45:45 +0200 Subject: [PATCH 21/49] Module Server, clsss ISaleDao : suppr d'un TODO (fait) --- .../WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java index 6d7e6948..b28a279f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java @@ -3,7 +3,6 @@ package com.pqt.server.module.sale; import com.pqt.core.entities.sale.Sale; //TODO écrire Javadoc -//TODO Créer implémentation public interface ISaleDao { long submitSale(Sale sale); From 5a84ed76a1851bc63861c1060ccac32f0018807c Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 21:14:30 +0200 Subject: [PATCH 22/49] =?UTF-8?q?Module=20Core,=20clss=20Sale=20:=20ajout?= =?UTF-8?q?=20m=C3=A9thd=20getTotalPrice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/pqt/core/entities/sale/Sale.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java b/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java index 1da9bd55..47adb233 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java @@ -100,4 +100,12 @@ public class Sale implements ILoggable, Serializable{ public void setStatus(SaleStatus status) { this.status = status; } + + public double getTotalPrice() { + double totalPrice = 0; + for(Product product : this.products.keySet()){ + totalPrice+=product.getPrice()*(double)this.products.get(product); + } + return totalPrice; + } } From ee6aa6e70b3b4a199e7968debd50e2cb6eeddbd7 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 21:27:44 +0200 Subject: [PATCH 23/49] =?UTF-8?q?Module=20Core=20:=20ajout=20du=20coeffici?= =?UTF-8?q?ent=20multiplicateur=20de=20prix=20=C3=A0=20chaque=20valeur=20d?= =?UTF-8?q?e=20l'enum=20SaleType;=20ajout=20m=C3=A9thd=20getTotalWorth=20?= =?UTF-8?q?=C3=A0=20la=20clss=20Sale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/pqt/core/entities/sale/Sale.java | 12 +++++++++--- .../java/com/pqt/core/entities/sale/SaleType.java | 12 +++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java b/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java index 47adb233..dcaded4a 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/sale/Sale.java @@ -102,10 +102,16 @@ public class Sale implements ILoggable, Serializable{ } public double getTotalPrice() { - double totalPrice = 0; + if(type.getPriceMultiplier()==0) + return 0; + return getTotalWorth()*type.getPriceMultiplier(); + } + + public double getTotalWorth(){ + double totalWorth = 0; for(Product product : this.products.keySet()){ - totalPrice+=product.getPrice()*(double)this.products.get(product); + totalWorth+=product.getPrice()*(double)this.products.get(product); } - return totalPrice; + return totalWorth; } } diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/sale/SaleType.java b/Workspace/core/src/main/java/com/pqt/core/entities/sale/SaleType.java index 7dbf33c8..415738dc 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/sale/SaleType.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/sale/SaleType.java @@ -4,5 +4,15 @@ package com.pqt.core.entities.sale; * Created by Notmoo on 18/07/2017. */ public enum SaleType { - CASH, BANK_CHECK, STUDENT_ASSOCIATION_ACCOUNT, OFFERED_GUEST, OFFERED_STAFF_MEMBER + CASH(1), BANK_CHECK(1), STUDENT_ASSOCIATION_ACCOUNT(1), OFFERED_GUEST(0), OFFERED_STAFF_MEMBER(0); + + private double priceMultiplier; + + SaleType(double priceMultiplier) { + this.priceMultiplier = priceMultiplier; + } + + public double getPriceMultiplier() { + return priceMultiplier; + } } From f76808245011479bdaee411f7392478ab2e65541 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 22:19:15 +0200 Subject: [PATCH 24/49] =?UTF-8?q?Module=20Server,=20clss=20SimpleMessageHa?= =?UTF-8?q?ndler=20:=20correction=20r=C3=A9ponse=20queryStat=20+=20update?= =?UTF-8?q?=20instantiation=20des=20services?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pqt/server/controller/SimpleMessageHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index cbbaef1c..4269be93 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -40,8 +40,8 @@ public class SimpleMessageHandler implements IMessageHandler { serverStateService = new ServerStateService(); accountService = new AccountService(); clientService = new ClientService(); - saleService = new SaleService(); stockService = new StockService(); + saleService = new SaleService(stockService); statisticsService = new StatisticsService(stockService, saleService); messageToolFactory = new GSonMessageToolFactory(); @@ -81,8 +81,8 @@ public class SimpleMessageHandler implements IMessageHandler { fields.put("top_popular_products", messageToolFactory.getListFormatter(LightweightProduct.class).format(statisticsService.getTopPopularProducts(5))); fields.put("staff_sale_worth",Double.toString(statisticsService.getStaffSaleWorth())); fields.put("staff_sale_amount",Integer.toString(statisticsService.getStaffSaleAmount())); - fields.put("guest_sale_worth",Double.toString(statisticsService.getGuestSaleAmount())); - fields.put("guest_sale_amount",Integer.toString(statisticsService.getStaffSaleAmount())); + fields.put("guest_sale_worth",Double.toString(statisticsService.getGuestSaleWorth())); + fields.put("guest_sale_amount",Integer.toString(statisticsService.getGuestSaleAmount())); return new Message(MessageType.MSG_STAT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); }); From ee38eb526388a51a2123aa0abb91585365755d94 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 22:20:32 +0200 Subject: [PATCH 25/49] =?UTF-8?q?Module=20Server=20:=20ajout=20de=20listen?= =?UTF-8?q?ers=20=C3=A0=20SaleService;=20Ajout=20d'un=20package=20contenan?= =?UTF-8?q?t=20les=20clss=20et=20intrfc=20d=C3=A9di=C3=A9es=20aux=20listen?= =?UTF-8?q?ers=20du=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/module/sale/SaleService.java | 16 +++++++++- .../module/sale/listeners/ISaleFirerer.java | 11 +++++++ .../module/sale/listeners/ISaleListener.java | 9 ++++++ .../sale/listeners/SaleListenerAdapter.java | 10 ++++++ .../sale/listeners/SimpleSaleFirerer.java | 31 +++++++++++++++++++ 5 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleFirerer.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleListener.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SaleListenerAdapter.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SimpleSaleFirerer.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java index 15817c8a..9a21205a 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java @@ -2,6 +2,9 @@ package com.pqt.server.module.sale; import com.pqt.core.entities.sale.Sale; import com.pqt.server.exception.ServerQueryException; +import com.pqt.server.module.sale.listeners.ISaleFirerer; +import com.pqt.server.module.sale.listeners.ISaleListener; +import com.pqt.server.module.sale.listeners.SimpleSaleFirerer; import com.pqt.server.module.stock.StockService; //TODO écrire Javadoc @@ -9,17 +12,28 @@ import com.pqt.server.module.stock.StockService; public class SaleService { private ISaleDao dao; + private ISaleFirerer eventFirerer; public SaleService(StockService stockService) { dao = new NoRevertFileSaleDao(stockService); + eventFirerer = new SimpleSaleFirerer(); } public long submitSale(Sale sale) throws ServerQueryException { - return dao.submitSale(sale); + long id = dao.submitSale(sale); + if(id!=-1) eventFirerer.fireSaleValidatedEvent(sale); + return id; } public void submitSaleRevert(long id) throws ServerQueryException { dao.submitSaleRevert(id); } + public void addListener(ISaleListener l) { + eventFirerer.addListener(l); + } + + public void removeListener(ISaleListener l){ + eventFirerer.addListener(l); + } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleFirerer.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleFirerer.java new file mode 100644 index 00000000..d8b34efb --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleFirerer.java @@ -0,0 +1,11 @@ +package com.pqt.server.module.sale.listeners; + +import com.pqt.core.entities.sale.Sale; + +public interface ISaleFirerer { + + void addListener(ISaleListener l); + void removeListener(ISaleListener l); + + void fireSaleValidatedEvent(Sale sale); +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleListener.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleListener.java new file mode 100644 index 00000000..11b70979 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/ISaleListener.java @@ -0,0 +1,9 @@ +package com.pqt.server.module.sale.listeners; + +import com.pqt.core.entities.sale.Sale; + +import java.util.EventListener; + +public interface ISaleListener extends EventListener{ + void onSaleValidatedEvent(Sale sale); +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SaleListenerAdapter.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SaleListenerAdapter.java new file mode 100644 index 00000000..6315b70d --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SaleListenerAdapter.java @@ -0,0 +1,10 @@ +package com.pqt.server.module.sale.listeners; + +import com.pqt.core.entities.sale.Sale; + +public class SaleListenerAdapter implements ISaleListener { + @Override + public void onSaleValidatedEvent(Sale sale) { + + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SimpleSaleFirerer.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SimpleSaleFirerer.java new file mode 100644 index 00000000..1c94abdb --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/listeners/SimpleSaleFirerer.java @@ -0,0 +1,31 @@ +package com.pqt.server.module.sale.listeners; + +import com.pqt.core.entities.sale.Sale; + +import javax.swing.event.EventListenerList; + +public class SimpleSaleFirerer implements ISaleFirerer { + + private EventListenerList listeners; + + public SimpleSaleFirerer() { + listeners = new EventListenerList(); + } + + @Override + public void addListener(ISaleListener l) { + listeners.add(ISaleListener.class, l); + } + + @Override + public void removeListener(ISaleListener l) { + listeners.remove(ISaleListener.class, l); + } + + @Override + public void fireSaleValidatedEvent(Sale sale) { + for(ISaleListener l : listeners.getListeners(ISaleListener.class)){ + l.onSaleValidatedEvent(sale); + } + } +} From 6e593ec188762c363780aad8d34b8994ac4ca815 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 22:22:11 +0200 Subject: [PATCH 26/49] =?UTF-8?q?Module=20Server,=20clss=20StatisticsServi?= =?UTF-8?q?ce=20:=20ajout=20du=20contenu=20des=20m=C3=A9thodes;=20Suppress?= =?UTF-8?q?ion=20du=20TODO=20associ=C3=A9=20(fait)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/statistics/StatisticsService.java | 61 +++++++++++++++---- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java index 5c7cfef9..ff36f5d7 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java @@ -2,53 +2,92 @@ package com.pqt.server.module.statistics; import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; +import com.pqt.core.entities.sale.Sale; +import com.pqt.server.module.sale.listeners.ISaleListener; +import com.pqt.server.module.sale.listeners.SaleListenerAdapter; import com.pqt.server.module.stock.StockService; import com.pqt.server.module.sale.SaleService; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; //TODO écrire Javadoc //TODO Ajouter logs -//TODO écrire contenu méthodes public class StatisticsService { private StockService stockService; - private SaleService saleService; + + private int totalSaleAmount, staffSaleAmount, guestSaleAmount; + private double totalMoneyMade, totalSaleWorth, staffSaleWorth, guestSaleWorth; public StatisticsService(StockService stockService, SaleService saleService) { this.stockService = stockService; - this.saleService = saleService; + + totalSaleAmount = 0; + staffSaleAmount = 0; + guestSaleAmount = 0; + + totalMoneyMade = 0; + totalSaleWorth = 0; + staffSaleWorth = 0; + guestSaleWorth = 0; + + saleService.addListener(new SaleListenerAdapter() { + @Override + public void onSaleValidatedEvent(Sale sale) { + double price = sale.getTotalPrice(), worth = sale.getTotalWorth(); + totalSaleWorth+=worth; + totalMoneyMade+=price; + totalSaleAmount++; + switch (sale.getType()){ + case OFFERED_GUEST: + guestSaleAmount++; + guestSaleWorth+=worth; + break; + case OFFERED_STAFF_MEMBER: + staffSaleAmount++; + staffSaleWorth+=price; + break; + } + } + }); } public int getTotalAmountSale() { - return 0; + return totalSaleAmount; } public double getTotalMoneyMade() { - return 0; + return totalMoneyMade; } public double getTotalSaleWorth() { - return 0; + return totalSaleWorth; } public List getTopPopularProducts(int amount) { - return null; + return stockService.getProductList().stream() + .sorted(Comparator.comparingInt(Product::getAmountSold)) + .limit(amount) + .map(LightweightProduct::new) + .collect(Collectors.toList()); } public int getStaffSaleAmount() { - return 0; + return staffSaleAmount; } public double getStaffSaleWorth() { - return 0; + return staffSaleWorth; } public int getGuestSaleAmount() { - return 0; + return guestSaleAmount; } public double getGuestSaleWorth() { - return 0; + return guestSaleWorth; } } From 8d2d46d45343377ddf9420cc4011f7855e890e74 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Sun, 30 Jul 2017 22:25:40 +0200 Subject: [PATCH 27/49] =?UTF-8?q?Module=20Server,=20clss=20FileStockDao=20?= =?UTF-8?q?:=20centralisation=20du=20code=20de=20sauvegarde=20des=20donn?= =?UTF-8?q?=C3=A9es,=20modif=20algo=20m=C3=A9thd=20applySale=20(voir=20des?= =?UTF-8?q?c)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modif de l'algo de la méthode FileStockDao::applySale : L'attribut Product::amountSold n'est modifié que pour les produits directement contenu dans la commande, et n'est donc plus appliqué récursivement aux composants de ces produits. --- .../pqt/server/module/stock/FileStockDao.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) 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 d4c5f599..5095676c 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 @@ -57,7 +57,7 @@ public class FileStockDao implements IStockDao { product.setId(nextProductId); this.products.put(nextProductId, product); generateNextProductId(); - save(this.products); + saveToFile(); } /** @@ -67,7 +67,7 @@ public class FileStockDao implements IStockDao { Product product = getProduct(id); if(product!=null){ this.products.remove(product); - save(this.products); + saveToFile(); } } @@ -78,23 +78,38 @@ public class FileStockDao implements IStockDao { if(this.products.containsKey(id)){ product.setId(id); this.products.put(id, product); + saveToFile(); } } @Override public void applySale(SaleContent saleContent) throws IllegalArgumentException { try { - saleContent.getProductList().forEach(product -> applyRecursiveStockRemoval(product, saleContent.getProductAmount(product))); + saleContent.getProductList().forEach(product -> { + applyRecursiveStockRemoval(product, saleContent.getProductAmount(product)); + applySoldCounterIncrease(product, saleContent.getProductAmount(product)); + }); + saveToFile(); }catch (IllegalStateException e){ loadFromFile(); throw new IllegalArgumentException(e); } } + private void applySoldCounterIncrease(Product product, Integer amount) { + 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 : "); + 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{ Product correspondingProduct = getProduct(product.getId()); if(correspondingProduct!=null) { - correspondingProduct.setAmountSold(correspondingProduct.getAmountSold() + amount); correspondingProduct.setAmountRemaining(correspondingProduct.getAmountRemaining() - amount); correspondingProduct.getComponents().forEach(component -> applyRecursiveStockRemoval(component, amount)); }else{ @@ -142,6 +157,10 @@ public class FileStockDao implements IStockDao { return loadedData; } + private void saveToFile() { + save(this.products); + } + private void save(Map products){ try{ FileUtil.createFileIfNotExist(STOCK_FILE_NAME); From b2f1acfdc7601003c86dcfbb4c3e1255eeb27753 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 18:56:08 +0200 Subject: [PATCH 28/49] Module Core, clss Account : ajout attr password; suppr attr id, passwordHash et creationDate --- .../core/entities/user_account/Account.java | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/user_account/Account.java b/Workspace/core/src/main/java/com/pqt/core/entities/user_account/Account.java index 687fab3f..204d0852 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/user_account/Account.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/user_account/Account.java @@ -9,31 +9,19 @@ import java.util.Date; * Created by Notmoo on 18/07/2017. */ public class Account implements ILoggable, Serializable { - private int id; private String username; - private String passwordHash; - private Date creationDate; + private String password; private AccountLevel permissionLevel; public Account() { } - public Account(int id, String username, String passwordHash, Date creationDate, AccountLevel permissionLevel) { - this.id = id; + public Account(String username, String password, AccountLevel permissionLevel) { this.username = username; - this.passwordHash = passwordHash; - this.creationDate = creationDate; + this.password = password; this.permissionLevel = permissionLevel; } - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - public String getUsername() { return username; } @@ -42,20 +30,12 @@ public class Account implements ILoggable, Serializable { this.username = username; } - public String getPasswordHash() { - return passwordHash; + public String getPassword() { + return password; } - public void setPasswordHash(String passwordHash) { - this.passwordHash = passwordHash; - } - - public Date getCreationDate() { - return creationDate; - } - - public void setCreationDate(Date creationDate) { - this.creationDate = creationDate; + public void setPassword(String password) { + this.password = password; } public AccountLevel getPermissionLevel() { From dce4d4a4d2afe02c7e35051acd09ac492a49b18c Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 18:57:32 +0200 Subject: [PATCH 29/49] =?UTF-8?q?Module=20Server,=20packg=20tools=20:=20cr?= =?UTF-8?q?=C3=A9ation=20packg=20io,=20cr=C3=A9ation=20clss=20ISerialFileM?= =?UTF-8?q?anager,=20SimpleSerialFileManager=20et=20SimpleSerialFileManage?= =?UTF-8?q?rFactory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/tools/io/ISerialFileManager.java | 12 ++ .../tools/io/SimpleSerialFileManager.java | 108 ++++++++++++++++++ .../io/SimpleSerialFileManagerFactory.java | 15 +++ 3 files changed, 135 insertions(+) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/ISerialFileManager.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManager.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManagerFactory.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/ISerialFileManager.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/ISerialFileManager.java new file mode 100644 index 00000000..66c65e08 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/ISerialFileManager.java @@ -0,0 +1,12 @@ +package com.pqt.server.tools.io; + +import java.util.List; +import java.util.Set; + +//TODO écrire javadoc +public interface ISerialFileManager { + List loadListFromFile(); + Set loadSetFromFile(); + void saveListToFile(List list); + void saveSetToFile(Set set); +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManager.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManager.java new file mode 100644 index 00000000..619532c6 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManager.java @@ -0,0 +1,108 @@ +package com.pqt.server.tools.io; + +import com.pqt.server.tools.FileUtil; + +import java.io.*; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.*; + +//TODO vérifier que le save écrase bien le contenu précédent du fichier +public class SimpleSerialFileManager implements ISerialFileManager { + + private Path filePath; + private Class clazz; + + SimpleSerialFileManager(String filePath, Class clazz){ + this(Paths.get(filePath), clazz); + } + + SimpleSerialFileManager(Path filePath, Class clazz){ + this.filePath = filePath; + this.clazz = clazz; + try{ + FileUtil.createFileIfNotExist(filePath); + }catch (IOException e){ + e.printStackTrace(); + } + } + + @Override + public List loadListFromFile() { + try{ + if(!FileUtil.createFileIfNotExist(filePath)){ + List loadedEntries = new ArrayList<>(); + fillCollection(loadedEntries); + return loadedEntries; + } + }catch(IOException | ClassNotFoundException e){ + e.printStackTrace(); + } + return null; + } + + @Override + public Set loadSetFromFile() { + try{ + if(!FileUtil.createFileIfNotExist(filePath)){ + Set loadedEntries = new HashSet<>(); + fillCollection(loadedEntries); + return loadedEntries; + } + }catch(IOException | ClassNotFoundException e){ + e.printStackTrace(); + } + return null; + } + + private void fillCollection(Collection collection) throws IOException, ClassNotFoundException { + if(collection==null) return; + try(FileInputStream fis = new FileInputStream(filePath.toString()); + ObjectInputStream ois = new ObjectInputStream(fis)){ + boolean end = false; + do{ + try{ + Object obj = ois.readObject(); + if(clazz.isInstance(obj)){ + T ae = clazz.cast(obj); + collection.add(ae); + } + }catch (EOFException e){ + end = true; + } + }while(!end); + } + } + + @Override + public void saveListToFile(List list) { + save(list); + } + + @Override + public void saveSetToFile(Set set) { + save(set); + } + + private void save(Collection collection){ + try{ + FileUtil.createFileIfNotExist(filePath); + }catch (IOException e){ + e.printStackTrace(); + return; + } + try(FileOutputStream fos = new FileOutputStream(filePath.toString()); + ObjectOutputStream oos = new ObjectOutputStream(fos)){ + + collection.forEach(p -> { + try { + oos.writeObject(p); + } catch (IOException e) { + e.printStackTrace(); + } + }); + }catch(IOException e){ + e.printStackTrace(); + } + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManagerFactory.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManagerFactory.java new file mode 100644 index 00000000..2ebecb47 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/io/SimpleSerialFileManagerFactory.java @@ -0,0 +1,15 @@ +package com.pqt.server.tools.io; + +import java.nio.file.Path; + +public class SimpleSerialFileManagerFactory { + protected SimpleSerialFileManagerFactory(){} + + public static ISerialFileManager getFileManager(Class clazz, String filePath){ + return new SimpleSerialFileManager<>(filePath, clazz); + } + + public static ISerialFileManager getFileManager(Class clazz, Path filePath){ + return new SimpleSerialFileManager<>(filePath, clazz); + } +} From a6415ac494916a0191e2b5e34595f9dd5db4a65c Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 18:58:16 +0200 Subject: [PATCH 30/49] =?UTF-8?q?Module=20Server,=20packg=20tools=20:=20cr?= =?UTF-8?q?=C3=A9ation=20packg=20security;=20ajout=20clss=20IHashTool=20et?= =?UTF-8?q?=20MD5HashTool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/tools/security/IHashTool.java | 5 ++++ .../server/tools/security/MD5HashTool.java | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/IHashTool.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/MD5HashTool.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/IHashTool.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/IHashTool.java new file mode 100644 index 00000000..57cee938 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/IHashTool.java @@ -0,0 +1,5 @@ +package com.pqt.server.tools.security; + +public interface IHashTool { + String hashAndSalt(String str, String salt); +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/MD5HashTool.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/MD5HashTool.java new file mode 100644 index 00000000..ffb2ebca --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/security/MD5HashTool.java @@ -0,0 +1,30 @@ +package com.pqt.server.tools.security; + +import java.math.BigInteger; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class MD5HashTool implements IHashTool{ + @Override + public String hashAndSalt(String input, String salt) { + String md5 = null; + + if(input == null || salt == null) return null; + + try { + String str = salt+input; + //Create MessageDigest object for MD5 + MessageDigest digest = MessageDigest.getInstance("MD5"); + + //Update input string in message digest + digest.update(str.getBytes(), 0, str.length()); + + //Converts message digest value in base 16 (hex) + md5 = new BigInteger(1, digest.digest()).toString(16); + + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return md5; + } +} From adf55b68a027053bffebd92aac4ba5c1187697f3 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 18:58:56 +0200 Subject: [PATCH 31/49] =?UTF-8?q?Module=20Server,=20clss=20FileUtil=20:=20?= =?UTF-8?q?r=C3=A9arrangement=20contenu=20de=20la=20clss=20+=20javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pqt/server/tools/FileUtil.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java index 1a0fc195..54a5d349 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java @@ -7,6 +7,13 @@ import java.nio.file.Paths; public class FileUtil { + /** + * @see #createFileIfNotExist(Path) + */ + public static boolean createFileIfNotExist(String filePath) throws IOException { + return createFileIfNotExist(Paths.get(filePath)); + } + /** * Check if the given file path correspond to an existing file, and create it if it doesn't. * @@ -15,16 +22,15 @@ public class FileUtil { * @return {@code true} if the file has been created, {@code false} if it already existed. * @throws IOException if any IOException happend during this method's execution. */ - public static boolean createFileIfNotExist(String filePath) throws IOException { + public static boolean createFileIfNotExist(Path filePath) throws IOException { if(FileUtil.exist(filePath)){ - Path path = Paths.get(filePath); - Files.createFile(path); + Files.createFile(filePath); return true; } return false; } - public static boolean exist(String filePath) { - return Files.exists(Paths.get(filePath)); + public static boolean exist(Path path) { + return Files.exists(path); } } From c10c91ec1e883c75784951b95dfa4026757f1bd2 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 18:59:47 +0200 Subject: [PATCH 32/49] =?UTF-8?q?Module=20Server,=20clss=20FileStockDao=20?= =?UTF-8?q?:=20utilisation=20d'un=20ISerialFileManager=20pour=20g=C3=A9rer?= =?UTF-8?q?=20les=20IO=20du=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/module/stock/FileStockDao.java | 66 ++----------------- 1 file changed, 7 insertions(+), 59 deletions(-) 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 5095676c..8248719a 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 @@ -1,16 +1,17 @@ package com.pqt.server.module.stock; import com.pqt.core.entities.product.Product; -import com.pqt.server.tools.FileUtil; import com.pqt.server.tools.entities.SaleContent; +import com.pqt.server.tools.io.ISerialFileManager; +import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; -import java.io.*; import java.util.*; //TODO écrire Javadoc public class FileStockDao implements IStockDao { private static final String STOCK_FILE_NAME = "stock.pqt"; + private ISerialFileManager fileManager; private long nextProductId; private Random random; @@ -18,6 +19,7 @@ public class FileStockDao implements IStockDao { public FileStockDao() { random = new Random(); + fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME); loadFromFile(); generateNextProductId(); } @@ -120,66 +122,12 @@ public class FileStockDao implements IStockDao { } private void loadFromFile() { - products = new HashMap<>(load()); - } - - private Map load(){ Map loadedData = new HashMap<>(); - try{ - if(FileUtil.createFileIfNotExist(STOCK_FILE_NAME)){ - return loadedData; - } - }catch(IOException e){ - e.printStackTrace(); - return loadedData; - } - - try(FileInputStream fis = new FileInputStream(STOCK_FILE_NAME); - ObjectInputStream ois = new ObjectInputStream(fis)){ - - boolean end = false; - do{ - try{ - Object obj = ois.readObject(); - if(Product.class.isInstance(obj)){ - Product p = Product.class.cast(obj); - loadedData.put(p.getId(), p); - } - }catch (EOFException e){ - end = true; - }catch(ClassNotFoundException | InvalidClassException e){ - e.printStackTrace(); - } - }while(!end); - }catch( IOException e){ - e.printStackTrace(); - } - return loadedData; + fileManager.loadListFromFile().forEach(product -> loadedData.put(product.getId(), product)); + products = new HashMap<>(loadedData); } private void saveToFile() { - save(this.products); - } - - private void save(Map products){ - try{ - FileUtil.createFileIfNotExist(STOCK_FILE_NAME); - }catch (IOException e){ - e.printStackTrace(); - return; - } - try(FileOutputStream fos = new FileOutputStream(STOCK_FILE_NAME); - ObjectOutputStream oos = new ObjectOutputStream(fos)){ - - products.values().stream().forEach(p -> { - try { - oos.writeObject(p); - } catch (IOException e) { - e.printStackTrace(); - } - }); - }catch(IOException e){ - e.printStackTrace(); - } + fileManager.saveListToFile(new ArrayList<>(products.values())); } } From 713517724e30af0656bb4f903ca51614c3f8d19f Mon Sep 17 00:00:00 2001 From: Notmoo Date: Mon, 31 Jul 2017 19:01:39 +0200 Subject: [PATCH 33/49] =?UTF-8?q?Module=20Server,=20packg=20module.account?= =?UTF-8?q?=20:=20cr=C3=A9ation=20impl=20IAccountDao=20nomm=C3=A9e=20FileA?= =?UTF-8?q?ccountDao,=20suppr=20TODO=20associ=C3=A9s=20(fait);=20cr=C3=A9a?= =?UTF-8?q?tion=20clss=20AccountEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/module/account/AccountEntry.java | 58 ++++++++++++ .../server/module/account/AccountService.java | 14 +-- .../server/module/account/FileAccountDao.java | 93 +++++++++++++++++++ .../server/module/account/IAccountDao.java | 7 +- 4 files changed, 161 insertions(+), 11 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java new file mode 100644 index 00000000..9e7fcd05 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountEntry.java @@ -0,0 +1,58 @@ +package com.pqt.server.module.account; + +import com.pqt.core.entities.user_account.AccountLevel; + +import java.io.Serializable; + +public class AccountEntry implements Serializable{ + private String username, passwordHash, salt; + private AccountLevel level; + + public AccountEntry() { + } + + public AccountEntry(String username, String passwordHash, String salt, AccountLevel level) { + this.username = username; + this.passwordHash = passwordHash; + this.salt = salt; + this.level = level; + } + + String getUsername() { + return username; + } + + String getPasswordHash() { + return passwordHash; + } + + String getSalt() { + return salt; + } + + AccountLevel getLevel() { + return level; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + AccountEntry that = (AccountEntry) o; + + if (!username.equals(that.username)) return false; + if (!passwordHash.equals(that.passwordHash)) return false; + if (!salt.equals(that.salt)) return false; + return level == that.level; + } + + @Override + public int hashCode() { + int result = username.hashCode(); + result = 31 * result + passwordHash.hashCode(); + result = 31 * result + salt.hashCode(); + result = 31 * result + level.hashCode(); + return result; + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index c7eb5548..f941abb6 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -9,18 +9,18 @@ public class AccountService { private IAccountDao dao; public AccountService() { - //TODO add dao instanciation + dao = new FileAccountDao(); } - public boolean isAccountConnected(Account acc) { - return dao.isAccountConnected(acc); + public boolean isAccountConnected(Account account) { + return dao.isAccountConnected(account); } - public boolean setAccountConnected(Account acc, boolean connected) { - return dao.setAccountConnected(acc, connected); + public boolean submitAccountCredentials(Account acc, boolean desiredState) { + return dao.submitAccountCredentials(acc, desiredState); } - public boolean isAccountRegistered(Account acc){ - return dao.isAccountRegistered(acc); + public boolean isAccountRegistered(Account account){ + return dao.isAccountRegistered(account); } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java new file mode 100644 index 00000000..cd370aa0 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java @@ -0,0 +1,93 @@ +package com.pqt.server.module.account; + +import com.pqt.core.entities.user_account.Account; +import com.pqt.server.tools.io.ISerialFileManager; +import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; +import com.pqt.server.tools.security.IHashTool; +import com.pqt.server.tools.security.MD5HashTool; + +import java.util.*; + +//TODO écrire Javadoc +//TODO ajouter logs +public class FileAccountDao implements IAccountDao { + + private static final String ACCOUNT_FILE_NAME = "acc.pqt"; + + private Set accountEntries; + private Set connectedAccount; + private IHashTool hashTool; + private ISerialFileManager fileManager; + + public FileAccountDao() { + accountEntries = new HashSet<>(); + connectedAccount = new HashSet<>(); + hashTool = new MD5HashTool(); + fileManager = SimpleSerialFileManagerFactory.getFileManager(AccountEntry.class, ACCOUNT_FILE_NAME); + loadFromFile(); + } + + private AccountEntry lookupMatchingEntry(Account account, Collection entries){ + return entries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst().orElse(null); + } + + @Override + public boolean isAccountConnected(Account account) { + return lookupMatchingEntry(account, connectedAccount)!=null; + } + + @Override + public boolean submitAccountCredentials(Account acc, boolean desiredState) { + if(isAccountRegistered(acc)){ + if(desiredState!=isAccountConnected(acc)){ + if(desiredState) + return connect(acc); + else + return disconnect(acc); + } + } + + return false; + } + + private boolean connect(Account account){ + Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); + if(!entry.isPresent()) + return false; + else{ + String expectedUsername = entry.get().getUsername(); + String expectedPasswordHash = entry.get().getPasswordHash(); + String salt = entry.get().getSalt(); + + if(expectedUsername.equals(account.getUsername()) && hashTool.hashAndSalt(account.getPassword(), salt).equals(expectedPasswordHash)){ + connectedAccount.add(entry.get()); + return true; + }else + return false; + } + } + + private boolean disconnect(Account account){ + Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); + if(entry.isPresent() && connectedAccount.contains(entry.get())){ + connectedAccount.remove(entry.get()); + return true; + } + return false; + } + + @Override + public boolean isAccountRegistered(Account account) { + return lookupMatchingEntry(account, accountEntries)!=null; + } + + private void saveToFile(){ + fileManager.saveSetToFile(accountEntries); + } + + private void loadFromFile(){ + this.accountEntries = new HashSet<>(fileManager.loadSetFromFile()); + //TODO faire check des comptes au lieu de tout déconnecter? + this.connectedAccount.clear(); + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index 2160d2df..480c9e5f 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -3,12 +3,11 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; //TODO écrire Javadoc -//TODO créer implémentaiton public interface IAccountDao { - boolean isAccountConnected(Account acc); + boolean isAccountConnected(Account account); - boolean setAccountConnected(Account acc, boolean connected); + boolean submitAccountCredentials(Account acc, boolean desiredState); - boolean isAccountRegistered(Account acc); + boolean isAccountRegistered(Account account); } From 5a2168c46dbb4654966108a028097a68feb1ff1d Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 16:27:30 +0200 Subject: [PATCH 34/49] =?UTF-8?q?Module=20Server,=20clss=20SimpleMessageHa?= =?UTF-8?q?ndler=20:=20impl=20v=C3=A9rification=20compte=20user=20=C3=A9me?= =?UTF-8?q?tteur=20de=20la=20query;=20Ajout=20javadoc;=20Association=20ent?= =?UTF-8?q?re=20query=20et=20niveau=20de=20permission=20de=20compte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SimpleMessageHandler.java | 116 ++++++++++++++---- .../server/module/account/AccountService.java | 5 + .../server/module/account/FileAccountDao.java | 8 ++ .../server/module/account/IAccountDao.java | 3 + 4 files changed, 105 insertions(+), 27 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 4269be93..7221d457 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -8,6 +8,7 @@ import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; import com.pqt.core.entities.product.ProductUpdate; import com.pqt.core.entities.sale.Sale; +import com.pqt.core.entities.user_account.AccountLevel; import com.pqt.server.exception.ServerQueryException; import com.pqt.server.module.account.AccountService; import com.pqt.server.module.client.ClientService; @@ -21,11 +22,34 @@ import java.util.List; import java.util.Map; //TODO ajouter des messages d'erreur spécifiques pour les NullPointerException si le param du message vaut null +//TODO mettre à jour la liste des query supportées lorsque la version du serveur sera proche de la release +//TODO ne pas oublier de préciser le niveau de permission requis pour chaque requête +//TODO Paramétrer les supports de query et leurs permissions via un meilleur système (config file, etc ...) +/** + * Implémentation de l'interface {@link IMessageHandler}. Cette classe définit le gestionnaire de message par défaut du + * serveur de données du projet PQT. + *

+ * Liste des requêtes supportées :
+ *

    + * + *
+ *

+ * Liste des requêtes non-supportées :
+ *

    + * + *
+ * @see IMessageHandler + * @version 1.0 + * @author Guillaume "Cess" Prost + */ public class SimpleMessageHandler implements IMessageHandler { private final String header_ref_query = "Detail_refus"; private final String header_err_query = "Detail_erreur"; + /* + * Liste des services du serveur + */ private AccountService accountService; private SaleService saleService; private StatisticsService statisticsService; @@ -34,7 +58,7 @@ public class SimpleMessageHandler implements IMessageHandler { private ServerStateService serverStateService; private IMessageToolFactory messageToolFactory; - private Map queryHandlers; + private MessageManager manager; public SimpleMessageHandler() { serverStateService = new ServerStateService(); @@ -45,14 +69,14 @@ public class SimpleMessageHandler implements IMessageHandler { statisticsService = new StatisticsService(stockService, saleService); messageToolFactory = new GSonMessageToolFactory(); - queryHandlers = new HashMap<>(); + manager = new MessageManager(); - queryHandlers.put(MessageType.QUERY_STOCK, (message)->{ + manager.support(MessageType.QUERY_STOCK, (message)->{ Map fields = new HashMap<>(); fields.put("stock", messageToolFactory.getListFormatter(Product.class).format(stockService.getProductList())); return new Message(MessageType.MSG_STOCK, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - }); - queryHandlers.put(MessageType.QUERY_SALE, (message)->{ + }, AccountLevel.WAITER); + manager.support(MessageType.QUERY_SALE, (message)->{ Map fields = new HashMap<>(); try { long saleId = saleService.submitSale(messageToolFactory.getObjectParser(Sale.class).parse(message.getField("sale"))); @@ -62,18 +86,8 @@ public class SimpleMessageHandler implements IMessageHandler { fields.put(header_ref_query, e.toString()); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } - }); - queryHandlers.put(MessageType.QUERY_REVERT_SALE, (message)->{ - try{ - saleService.submitSaleRevert(messageToolFactory.getObjectParser(Long.class).parse(message.getField("saleId"))); - return new Message(MessageType.ACK_REVERT_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); - }catch(ServerQueryException | NullPointerException e){ - Map fields = new HashMap<>(); - fields.put(header_err_query, e.toString()); - return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - } - }); - queryHandlers.put(MessageType.QUERY_STAT, (message)->{ + }, AccountLevel.WAITER); + manager.support(MessageType.QUERY_STAT, (message)->{ Map fields = new HashMap<>(); fields.put("total_sale_worth", Double.toString(statisticsService.getTotalSaleWorth())); fields.put("total_sale_amount", Integer.toString(statisticsService.getTotalAmountSale())); @@ -85,8 +99,8 @@ public class SimpleMessageHandler implements IMessageHandler { fields.put("guest_sale_amount",Integer.toString(statisticsService.getGuestSaleAmount())); return new Message(MessageType.MSG_STAT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - }); - queryHandlers.put(MessageType.QUERY_UPDATE, (message)->{ + }, AccountLevel.WAITER); + manager.support(MessageType.QUERY_UPDATE, (message)->{ try{ List updates = messageToolFactory.getListParser(ProductUpdate.class).parse(message.getField("updates")); stockService.applyUpdateList(updates); @@ -96,7 +110,20 @@ public class SimpleMessageHandler implements IMessageHandler { fields.put(header_err_query, e.toString()); return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } - }); + }, AccountLevel.MASTER); + /* + manager.support(MessageType.QUERY_REVERT_SALE, (message)->{ + + try{ + saleService.submitSaleRevert(messageToolFactory.getObjectParser(Long.class).parse(message.getField("saleId"))); + return new Message(MessageType.ACK_REVERT_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); + }catch(ServerQueryException | NullPointerException e){ + Map fields = new HashMap<>(); + fields.put(header_err_query, e.toString()); + return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + }, AccountLevel.MASTER); + */ } @Override @@ -104,7 +131,7 @@ public class SimpleMessageHandler implements IMessageHandler { Map fields = new HashMap<>(); - if(!isAccountRegistered(message)){ + if(!isAccountRegisteredAndConnected(message)){ fields.put(header_ref_query, "Compte utilisateur inconnu"); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } @@ -120,18 +147,53 @@ public class SimpleMessageHandler implements IMessageHandler { return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } - //TODO ajouter Javadoc + /** + * Interface interne utilisé pour encapsuler le traitement des messages dans un objet + */ private interface IMessageProcess{ Message execute(Message request); } - private boolean isAccountRegistered(Message message){ - //TODO faire ça - return false; + private class MessageManager{ + private Map processes; + private Map levels; + + MessageManager(){ + processes = new HashMap<>(); + levels = new HashMap<>(); + } + + void support(MessageType type, IMessageProcess process, AccountLevel permissionLevel){ + processes.put(type, process); + levels.put(type, permissionLevel); + } + + IMessageProcess getProcess(MessageType messageType){ + return processes.get(messageType); + } + + AccountLevel getLevel(MessageType messageType){ + return levels.get(messageType); + } } + /** + * Vérifie si le compte utilisé pour émettre la query contenu dans le message est enregistré et connecté. + * @param message message dont l'expéditeur doit être vérifié + * @return true si le compte est existant et connecté, false si au moins une des conditions est fausse. + */ + private boolean isAccountRegisteredAndConnected(Message message){ + return accountService.isAccountRegistered(message.getUser()) && accountService.isAccountConnected(message.getUser()); + } + + /** + * Vérifie si le compte émetteur de la query a les autorisations suffisantes pour effectuer la query. + *

+ * Attention : tenter cette vérification sur un compte inexistant lèvera une {@link NullPointerException}. + * @param message message dont le niveau de permission de l'expéditeur doit être vérifié + * @return true si l'expéditeur a les autorisations suffisantes, false sinon. + */ private boolean checkAccountPermission(Message message){ - //TODO faire ça - return false; + return accountService.getAccountPermissionLevel(message.getUser()).compareTo(manager.getLevel(message.getType()))>=0; } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index f941abb6..4e2e53d0 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -1,6 +1,7 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; +import com.pqt.core.entities.user_account.AccountLevel; //TODO écrire Javadoc //TODO ajouter logs @@ -23,4 +24,8 @@ public class AccountService { public boolean isAccountRegistered(Account account){ return dao.isAccountRegistered(account); } + + public AccountLevel getAccountPermissionLevel(Account account){ + return dao.getAccountPermissionLevel(account); + } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java index cd370aa0..f4dd0bbc 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java @@ -1,6 +1,7 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; +import com.pqt.core.entities.user_account.AccountLevel; import com.pqt.server.tools.io.ISerialFileManager; import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; import com.pqt.server.tools.security.IHashTool; @@ -81,6 +82,13 @@ public class FileAccountDao implements IAccountDao { return lookupMatchingEntry(account, accountEntries)!=null; } + @Override + public AccountLevel getAccountPermissionLevel(Account account) { + if(isAccountRegistered(account)) + return lookupMatchingEntry(account, accountEntries).getLevel(); + return null; + } + private void saveToFile(){ fileManager.saveSetToFile(accountEntries); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index 480c9e5f..bce955e2 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -1,6 +1,7 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; +import com.pqt.core.entities.user_account.AccountLevel; //TODO écrire Javadoc public interface IAccountDao { @@ -10,4 +11,6 @@ public interface IAccountDao { boolean submitAccountCredentials(Account acc, boolean desiredState); boolean isAccountRegistered(Account account); + + AccountLevel getAccountPermissionLevel(Account account); } From da6aafc6240b4ab4ac4a83a909a5025392484630 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 16:27:53 +0200 Subject: [PATCH 35/49] Module Server, interface IMessageHandler : Ajout javadoc --- .../server/controller/IMessageHandler.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java index ce4cec02..37abc1ad 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/IMessageHandler.java @@ -2,7 +2,27 @@ package com.pqt.server.controller; import com.pqt.core.entities.messages.Message; -//TODO écrire Javadoc +/** + * Cette interface définit le type général correspondant à un élément censé traiter les objets de la classe {@link Message} arrivant au serveur. + * + * @author Guillaume "Cess" Prost + */ public interface IMessageHandler { + /** + * Traite le message {@code message} passé en paramètre. Renvoie un message de réponse en tant que retour de méthode. + *

+ * Cette méthode doit toujours renvoyer un objet message autre que {@code null}. Un message de type + * {@link com.pqt.core.entities.messages.MessageType#ERROR_QUERY} ou de type + * {@link com.pqt.core.entities.messages.MessageType#REFUSED_QUERY} doit-être renvoyé si le message donné ne peut + * être pris en charge.
+ * Cela signifie aussi que cette méthode ne doit pas lever d'exception, et que ces dernières doivent être + * gérées en interne. + *

+ * Pour plus de détail sur les messages, leurs significations et les réponses attendues, voir la documentation du + * projet. + * @param message Objet de la classe {@link Message} à traiter. + * + * @return Objet de la classe {@link Message} correspondant à la réponse au paramètre {@code message}. + */ Message handleMessage(Message message); } From 00313858b00814401ae1360bf42c10d6be88bee6 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 16:29:44 +0200 Subject: [PATCH 36/49] Module Server, clss SimpleMessageHandler : correction erreurs de compilation --- .../com/pqt/server/controller/SimpleMessageHandler.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 7221d457..1d22eb37 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -139,8 +139,8 @@ public class SimpleMessageHandler implements IMessageHandler { fields.put(header_ref_query, "Compte utilisateur avec permission trop faible"); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } - if(queryHandlers.containsKey(message.getType())){ - return queryHandlers.get(message.getType()).execute(message); + if(manager.contains(message.getType())){ + return manager.getProcess(message.getType()).execute(message); } fields.put(header_err_query, "Type requête non pris en charge par ce serveur"); @@ -175,6 +175,10 @@ public class SimpleMessageHandler implements IMessageHandler { AccountLevel getLevel(MessageType messageType){ return levels.get(messageType); } + + public boolean contains(MessageType type) { + return processes.containsKey(type); + } } /** From 9b0a55953068c3014b62b5e745bad9c1f9dbb994 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 16:29:56 +0200 Subject: [PATCH 37/49] Ajout fichier suite MAJ Intellij --- Workspace/.idea/codeStyleSettings.xml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Workspace/.idea/codeStyleSettings.xml diff --git a/Workspace/.idea/codeStyleSettings.xml b/Workspace/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..5555dd26 --- /dev/null +++ b/Workspace/.idea/codeStyleSettings.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file From 183ee248ce3c833de694cd4a9416a3e9b3ef5161 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 18:24:52 +0200 Subject: [PATCH 38/49] =?UTF-8?q?Module=20Server,=20clss=20SimpleMessageHa?= =?UTF-8?q?ndler=20:=20Correction=20warning,=20modif=20fonctionnement=20m?= =?UTF-8?q?=C3=A9thd=20checkAccountPermission,=20ajout=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/controller/SimpleMessageHandler.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 1d22eb37..182100a5 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -54,7 +54,8 @@ public class SimpleMessageHandler implements IMessageHandler { private SaleService saleService; private StatisticsService statisticsService; private StockService stockService; - private ClientService clientService; + //TODO faire qqch de clientService + //private ClientService clientService; private ServerStateService serverStateService; private IMessageToolFactory messageToolFactory; @@ -63,7 +64,7 @@ public class SimpleMessageHandler implements IMessageHandler { public SimpleMessageHandler() { serverStateService = new ServerStateService(); accountService = new AccountService(); - clientService = new ClientService(); + //clientService = new ClientService(); stockService = new StockService(); saleService = new SaleService(stockService); statisticsService = new StatisticsService(stockService, saleService); @@ -71,6 +72,7 @@ public class SimpleMessageHandler implements IMessageHandler { manager = new MessageManager(); + //TODO ajouter support des query de connexion de compte utilisateur manager.support(MessageType.QUERY_STOCK, (message)->{ Map fields = new HashMap<>(); fields.put("stock", messageToolFactory.getListFormatter(Product.class).format(stockService.getProductList())); @@ -176,7 +178,7 @@ public class SimpleMessageHandler implements IMessageHandler { return levels.get(messageType); } - public boolean contains(MessageType type) { + boolean contains(MessageType type) { return processes.containsKey(type); } } @@ -193,11 +195,10 @@ public class SimpleMessageHandler implements IMessageHandler { /** * Vérifie si le compte émetteur de la query a les autorisations suffisantes pour effectuer la query. *

- * Attention : tenter cette vérification sur un compte inexistant lèvera une {@link NullPointerException}. * @param message message dont le niveau de permission de l'expéditeur doit être vérifié - * @return true si l'expéditeur a les autorisations suffisantes, false sinon. + * @return true si l'expéditeur correspond à un compte et qu'il a les autorisations suffisantes, false sinon. */ private boolean checkAccountPermission(Message message){ - return accountService.getAccountPermissionLevel(message.getUser()).compareTo(manager.getLevel(message.getType()))>=0; + return accountService.isAccountRegistered(message.getUser()) && accountService.getAccountPermissionLevel(message.getUser()).compareTo(manager.getLevel(message.getType()))>=0; } } From 60fb6a069cfca0155ac307c3bdb19aec18474624 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Tue, 1 Aug 2017 18:33:57 +0200 Subject: [PATCH 39/49] =?UTF-8?q?Module=20Server=20:=20ajout=20javadoc=20c?= =?UTF-8?q?lss=20AccountService,=20ajout=20=C3=A9mthd=20getAccountList()?= =?UTF-8?q?=20aux=20clss=20AccountService=20et=20Dao=20associ=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/module/account/AccountService.java | 95 ++++++++++++++++++- .../server/module/account/FileAccountDao.java | 8 +- .../server/module/account/IAccountDao.java | 4 + 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index 4e2e53d0..68a5a0ff 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -3,8 +3,17 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; import com.pqt.core.entities.user_account.AccountLevel; -//TODO écrire Javadoc +import java.util.List; + //TODO ajouter logs +/** + * Cette classe correspond au service de gestion des comptes utilisateurs. Il permet la vérification de l'existance + * d'un compte, de son état (connecté/déconnecté), de changer son état ainsi que de récupérer son niveau d'accréditation. + * + * @author Guillaume "Cess" Prost + * @see AccountLevel + * @see Account + */ public class AccountService { private IAccountDao dao; @@ -13,19 +22,99 @@ public class AccountService { dao = new FileAccountDao(); } + /** + * Vérifie si un compte utilisateur donné est actuellement connecté. Le compte utilisateur doit être existant + * pour être connecté. + *

+ * Les informations contenues dans l'objet {@code account} passé en paramètre ne sont pas directements utilisées, + * elles servent juste à déterminer le compte utilisateur réel correspondant. Il est nécessaire de s'assurer + * que les données passées en paramètres soient justes avant de faire appel à cette méthode. + *

+ * Pour cette méthode, seul le nom d'utilisateur est pris en compte pour établir une correspondance. + *

+ * Dans le cas où aucune correspondance ne peut être faite entre les informations fournies et les données + * enregistrées, la valeur {@code false} sera renvoyée. + * + * @param account Objet {@link Account} dont les informations seront utilisées pour déterminer le compte concerné. + * + * @return {@code true} si une correspondance a pû être établie et que le compte correspondant est connecté, + * {@code false} sinon. + */ public boolean isAccountConnected(Account account) { return dao.isAccountConnected(account); } - public boolean submitAccountCredentials(Account acc, boolean desiredState) { - return dao.submitAccountCredentials(acc, desiredState); + /** + * Soumet une demande de changement d'état pour un compte utilisateur. Les états possibles sont "connecté" ({@code true}) + * et "déconnecté" ({@code false}). + *

+ * Les informations contenues dans l'objet {@code account} passé en paramètre ne sont pas directements utilisées, + * elles servent juste à déterminer le compte utilisateur réel correspondant. Il est nécessaire de s'assurer + * que les données passées en paramètres soient justes avant de faire appel à cette méthode. + *

+ * Pour cette méthode, seul le nom d'utilisateur est pris en compte pour établir une correspondance. Le mot de passe + * est uniquement requis pour une connexion, et pas pour une déconnexion. + *

+ * Une fois la correspondance effectuée, une tentative de changement d'état sera faite pour le compte correspondant. + * Cette tentative peut échouer si : + *

    + *
  • Le compte est déjà dans l'état désiré
  • + *
  • Le mot de passe ne correspond pas (uniquement pour une connexion)
  • + *
+ * Dans le cas d'un échec, l'état du compte reste inchangé et la valeur booléenne {@code false} est renvoyée, + * sans plus de détails. Si le changement d'état a eu lieu, la valeur booléenne {@code true} est renvoyée. + * + * @param account Objet {@link Account} dont les informations seront utilisées pour déterminer le compte concerné. + * @param desiredState L'état dans lequel le compte doit se trouver une fois le changement fait. + * @return {@code true} si le changement d'état a eu lieu, {@code false} sinon. + */ + public boolean submitAccountCredentials(Account account, boolean desiredState) { + return dao.submitAccountCredentials(account, desiredState); } + /** + * Vérifie si un compte utilisateur donné existe dans la base de donnée du serveur. + *

+ * Les informations contenues dans l'objet {@code account} passé en paramètre ne sont pas directements utilisées, + * elles servent juste à déterminer le compte utilisateur réel correspondant. Il est nécessaire de s'assurer + * que les données passées en paramètres soient justes avant de faire appel à cette méthode. + *

+ * Pour cette méthode, seul le nom d'utilisateur est pris en compte pour établir une correspondance. + * + * @param account Objet {@link Account} dont les informations seront utilisées pour déterminer le compte concerné. + * @return {@code true} si une correspondance a pû être établie entre les données fournies et un compte dans la base + * de données, {@code false} sinon. + */ public boolean isAccountRegistered(Account account){ return dao.isAccountRegistered(account); } + /** + * Récupère le niveau de permission du compte utilisateur correspondant aux informations fournies en paramètre. + *

+ * Les informations contenues dans l'objet {@code account} passé en paramètre ne sont pas directements utilisées, + * elles servent juste à déterminer le compte utilisateur réel correspondant. Il est nécessaire de s'assurer + * que les données passées en paramètres soient justes avant de faire appel à cette méthode. + *

+ * Pour cette méthode, seul le nom d'utilisateur est pris en compte pour établir une correspondance. + * + * @param account Objet {@link Account} dont les informations seront utilisées pour déterminer le compte concerné. + * @return Le niveau de permission {@link AccountLevel} du compte correspondant aux informations si une correspondance + * a pû être établie entre {@code account} et un compte utilisateur de la base de donnée, et {@code null} si aucune + * correspondance n'a pû être faite. + */ public AccountLevel getAccountPermissionLevel(Account account){ return dao.getAccountPermissionLevel(account); } + + /** + * Renvoie la liste des comptes utilisateurs contenus dans la base de données sous forme d'une liste d'objets + * {@link Account}. Seuls les noms d'utilisateurs ainsi que les niveaux de permissions sont récupérés, les + * autres champs étant volontairement initialisés avec une valeur {@code null}. + * @return Une liste d'objet {@link Account} représsentant les différents comptes utilisateurs existant dans la base + * de données. + */ + public List getAccountList(){ + return dao.getAccountList(); + } } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java index f4dd0bbc..f0c96a68 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java @@ -8,6 +8,7 @@ import com.pqt.server.tools.security.IHashTool; import com.pqt.server.tools.security.MD5HashTool; import java.util.*; +import java.util.stream.Collectors; //TODO écrire Javadoc //TODO ajouter logs @@ -20,7 +21,7 @@ public class FileAccountDao implements IAccountDao { private IHashTool hashTool; private ISerialFileManager fileManager; - public FileAccountDao() { + FileAccountDao() { accountEntries = new HashSet<>(); connectedAccount = new HashSet<>(); hashTool = new MD5HashTool(); @@ -89,6 +90,11 @@ public class FileAccountDao implements IAccountDao { return null; } + @Override + public List getAccountList() { + return accountEntries.stream().map(accountEntry -> new Account(accountEntry.getUsername(), null, accountEntry.getLevel())).collect(Collectors.toList()); + } + private void saveToFile(){ fileManager.saveSetToFile(accountEntries); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index bce955e2..3c9302a7 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -3,6 +3,8 @@ package com.pqt.server.module.account; import com.pqt.core.entities.user_account.Account; import com.pqt.core.entities.user_account.AccountLevel; +import java.util.List; + //TODO écrire Javadoc public interface IAccountDao { @@ -13,4 +15,6 @@ public interface IAccountDao { boolean isAccountRegistered(Account account); AccountLevel getAccountPermissionLevel(Account account); + + List getAccountList(); } From 5e5a1140856b615e886f023118e8ce926552c12e Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 2 Aug 2017 17:00:07 +0200 Subject: [PATCH 40/49] Module Server, packg account : ajout javadoc --- .../server/module/account/AccountService.java | 2 +- .../server/module/account/FileAccountDao.java | 81 ++++++++++++++----- .../server/module/account/IAccountDao.java | 48 ++++++++++- 3 files changed, 107 insertions(+), 24 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java index 68a5a0ff..5a7c7ce3 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/AccountService.java @@ -111,7 +111,7 @@ public class AccountService { * Renvoie la liste des comptes utilisateurs contenus dans la base de données sous forme d'une liste d'objets * {@link Account}. Seuls les noms d'utilisateurs ainsi que les niveaux de permissions sont récupérés, les * autres champs étant volontairement initialisés avec une valeur {@code null}. - * @return Une liste d'objet {@link Account} représsentant les différents comptes utilisateurs existant dans la base + * @return Une liste d'objet {@link Account} représentant les différents comptes utilisateurs existant dans la base * de données. */ public List getAccountList(){ diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java index f0c96a68..3695b015 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/FileAccountDao.java @@ -10,9 +10,19 @@ import com.pqt.server.tools.security.MD5HashTool; import java.util.*; import java.util.stream.Collectors; -//TODO écrire Javadoc //TODO ajouter logs -public class FileAccountDao implements IAccountDao { + +/** + * Implémentation de l'interface {@link IAccountDao} utilisant un fichier contenant des objets sérialisés comme + * source de persistance de données. + *

+ * Cette classe n'est pas faite pour gérer les accès concurentiels au fichier assurant la persistance, et n'est donc pas + * thread-safe. Elle est conçue pour que tous les accès soient effectués depuis un même thread et depuis un unique objet. + *

+ * Cette classe manipule les mot de passe sous forme chiffrée via un système de hash (md5) + salt, et ne fait pas + * persister les mots de passes non-chiffrées. Les noms d'utilisateurs sont stockés sans chiffrage. + */ +class FileAccountDao implements IAccountDao { private static final String ACCOUNT_FILE_NAME = "acc.pqt"; @@ -29,76 +39,107 @@ public class FileAccountDao implements IAccountDao { loadFromFile(); } + /** + * Recherche une correspondance entre un objet {@link Account} et les objets {@link AccountEntry} contenu dans + * la collection {@code entries}. La correspondance se base sur la valeur renvoyée par {@link Account#getUsername()} + * et sur {@link AccountEntry#getUsername()}. + * @param account données à utiliser pour rechercher la correspondance. + * @param entries collection de données à utiliser pour rechercher la correspondance + * @return La première correspondance trouvée, ou {@code null} si aucune correspondance n'a pu être faite. + */ private AccountEntry lookupMatchingEntry(Account account, Collection entries){ return entries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst().orElse(null); } @Override - public boolean isAccountConnected(Account account) { + public synchronized boolean isAccountConnected(Account account) { return lookupMatchingEntry(account, connectedAccount)!=null; } @Override - public boolean submitAccountCredentials(Account acc, boolean desiredState) { - if(isAccountRegistered(acc)){ - if(desiredState!=isAccountConnected(acc)){ + public synchronized boolean submitAccountCredentials(Account account, boolean desiredState) { + if(isAccountRegistered(account)){ + if(desiredState!=isAccountConnected(account)){ if(desiredState) - return connect(acc); + return connect(account); else - return disconnect(acc); + return disconnect(account); } } return false; } + /** + * Passe un compte déconnecté dans l'état connecté. N'effecctue le changement que si un compte déconnecté correspond + * aux données fournies et que le mot de passe fournit par {@code account.getPassword()} corresspond à celui du + * compte correspondant. + * + * @param account données à utiliser pour effectuer la correspondance et l'identification + * @return {@code true} si le changement d'état a eu lieu, {@code false sinon} + */ private boolean connect(Account account){ - Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); - if(!entry.isPresent()) + AccountEntry entry = lookupMatchingEntry(account, accountEntries); + if(entry==null) return false; else{ - String expectedUsername = entry.get().getUsername(); - String expectedPasswordHash = entry.get().getPasswordHash(); - String salt = entry.get().getSalt(); + String expectedUsername = entry.getUsername(); + String expectedPasswordHash = entry.getPasswordHash(); + String salt = entry.getSalt(); if(expectedUsername.equals(account.getUsername()) && hashTool.hashAndSalt(account.getPassword(), salt).equals(expectedPasswordHash)){ - connectedAccount.add(entry.get()); + connectedAccount.add(entry); return true; }else return false; } } + /** + * Passe un comtpe connecté dans l'état déconnecté. N'effectue le changement que si un compte connecté correspond + * aux données fournies. + * @param account données à utiliser pour efffectuer la correspondance avec un compte + * @return {@code true} si le changement d'état a eu lieu, {@code false sinon} + */ private boolean disconnect(Account account){ - Optional entry = accountEntries.stream().filter(accountEntry -> accountEntry.getUsername().equals(account.getUsername())).findFirst(); - if(entry.isPresent() && connectedAccount.contains(entry.get())){ - connectedAccount.remove(entry.get()); + AccountEntry entry = lookupMatchingEntry(account, accountEntries); + if(entry!=null && connectedAccount.contains(entry)){ + connectedAccount.remove(entry); return true; } return false; } @Override - public boolean isAccountRegistered(Account account) { + public synchronized boolean isAccountRegistered(Account account) { return lookupMatchingEntry(account, accountEntries)!=null; } @Override - public AccountLevel getAccountPermissionLevel(Account account) { + public synchronized AccountLevel getAccountPermissionLevel(Account account) { if(isAccountRegistered(account)) return lookupMatchingEntry(account, accountEntries).getLevel(); return null; } @Override - public List getAccountList() { + public synchronized List getAccountList() { return accountEntries.stream().map(accountEntry -> new Account(accountEntry.getUsername(), null, accountEntry.getLevel())).collect(Collectors.toList()); } + /** + * Sauvegarde les données des comptes dans le fichier de sauvegarde. + */ private void saveToFile(){ fileManager.saveSetToFile(accountEntries); } + /** + * Charge les données des comptes depuis le fichier de sauvegarde. + *

+ * Attention : pour des raisons de cohérence des données, tous les comptes connectés sont repassés dans l'état + * déconnectés une fois le chargement fait. + */ private void loadFromFile(){ this.accountEntries = new HashSet<>(fileManager.loadSetFromFile()); //TODO faire check des comptes au lieu de tout déconnecter? diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java index 3c9302a7..04c70f81 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/account/IAccountDao.java @@ -5,16 +5,58 @@ import com.pqt.core.entities.user_account.AccountLevel; import java.util.List; -//TODO écrire Javadoc -public interface IAccountDao { +/** + * Cette interface définit les méthodes de base que doivent avoir les classes de DAO du service {@link AccountService}. + *

+ * Les implémentations de cette interface sont censé assurer la persistance des donnéess de connexions des comptes + * utilisateurs et doit également garder une trace niveau runtime de l'état des comptes (état connecté ou état + * déconnecté). Enfin, les implémentations doivent pouvoir déterminer une correspondance entre un nom d'utilisateur et + * un compte, et doit pouvoir effectuer les changements d'état sur la base d'un mot de passe non-chiffré fournit grâce + * à une instance {@link Account} (voir {@link #submitAccountCredentials(Account, boolean)}). + * + * @author Guillaume "Cess" Prost + */ +interface IAccountDao { + /** + * @see AccountService#isAccountConnected(Account) + * + * @param account données à utiliser + * @return {@code true} si les données correspondent à un compte et que ce dernier est connecté, {@code false} + * sinon. + */ boolean isAccountConnected(Account account); - boolean submitAccountCredentials(Account acc, boolean desiredState); + /** + * @see AccountService#submitAccountCredentials(Account, boolean) + * + * @param account données à utiliser + * @param desiredState état désiré pour le compte + * @return {@code true} si les données correspondent à un compte et que le changement d'état a eu lieu, + * {@code false} sinon. + */ + boolean submitAccountCredentials(Account account, boolean desiredState); + /** + * @see AccountService#isAccountRegistered(Account) + * + * @param account données à utiliser + * @return {@code true} si les données correspondent à un compte, {@code false} sinon. + */ boolean isAccountRegistered(Account account); + /** + * @see AccountService#getAccountPermissionLevel(Account) + * @param account données à utiliser + * @return Le niveau d'accréditation du compte utilisateur correspondant aux données, ou {@code null} si aucun + * compte ne correspond. + */ AccountLevel getAccountPermissionLevel(Account account); + /** + * @see AccountService#getAccountList() + * @return Une liste d'objet {@link Account} représentant les différents comptes utilisateurs existant dans la base + * de données. + */ List getAccountList(); } From fad322552437ccbd639d214b39e7b5468701a515 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 2 Aug 2017 17:31:35 +0200 Subject: [PATCH 41/49] =?UTF-8?q?Module=20Core=20:=20passage=20des=20attr?= =?UTF-8?q?=20de=20la=20clss=20PqtMember=20de=20private=20=C3=A0=20protect?= =?UTF-8?q?ed;=20suppr=20des=20attr=20Date=20des=20clss=20Client=20et=20Da?= =?UTF-8?q?taServer;=20Ajout=20m=C3=A9thds=20equals()=20et=20hashCode()=20?= =?UTF-8?q?=C3=A0=20la=20clss=20Client?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pqt/core/entities/members/Client.java | 26 +++++++++---------- .../pqt/core/entities/members/DataServer.java | 16 ------------ .../pqt/core/entities/members/PqtMember.java | 4 +-- 3 files changed, 14 insertions(+), 32 deletions(-) diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/members/Client.java b/Workspace/core/src/main/java/com/pqt/core/entities/members/Client.java index 0d667489..980d0be3 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/members/Client.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/members/Client.java @@ -1,6 +1,5 @@ package com.pqt.core.entities.members; -import java.io.Serializable; import java.util.Date; /** @@ -9,22 +8,14 @@ import java.util.Date; public class Client extends PqtMember{ private String address; - private Date lastUpdate; public Client() { super(-1, PqtMemberType.CLIENT); } - public Client(int id, String address) { + public Client(long id, String address) { super(id, PqtMemberType.CLIENT); this.address = address; - this.lastUpdate = new Date(); - } - - public Client(int id, String address, Date lastUpdate) { - super(id, PqtMemberType.CLIENT); - this.address = address; - this.lastUpdate = lastUpdate; } public String getAddress() { @@ -35,11 +26,18 @@ public class Client extends PqtMember{ this.address = address; } - public Date getLastUpdate() { - return lastUpdate; + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Client client = (Client) o; + + return address.equals(client.address) && id==client.id && type.equals(client.type); } - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = lastUpdate; + @Override + public int hashCode() { + return address.hashCode() + type.hashCode() + Integer.class.cast(id); } } diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/members/DataServer.java b/Workspace/core/src/main/java/com/pqt/core/entities/members/DataServer.java index 9804f487..ffa4dfda 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/members/DataServer.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/members/DataServer.java @@ -1,12 +1,10 @@ package com.pqt.core.entities.members; -import java.io.Serializable; import java.util.Date; public class DataServer extends PqtMember{ private String address; - private Date lastUpdate; public DataServer() { super(-1, PqtMemberType.DATA_SERVER); @@ -15,15 +13,8 @@ public class DataServer extends PqtMember{ public DataServer(long id, String address) { super(id, PqtMemberType.DATA_SERVER); this.address = address; - this.lastUpdate = new Date(); } - public DataServer(long id, String address, Date lastUpdate) { - super(id, PqtMemberType.DATA_SERVER); - this.address = address; - this.lastUpdate = lastUpdate; - } - public String getAddress() { return address; } @@ -32,11 +23,4 @@ public class DataServer extends PqtMember{ this.address = address; } - public Date getLastUpdate() { - return lastUpdate; - } - - public void setLastUpdate(Date lastUpdate) { - this.lastUpdate = lastUpdate; - } } diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/members/PqtMember.java b/Workspace/core/src/main/java/com/pqt/core/entities/members/PqtMember.java index 94399c6b..cc5cb4a9 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/members/PqtMember.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/members/PqtMember.java @@ -6,8 +6,8 @@ import java.io.Serializable; public class PqtMember implements ILoggable, Serializable { - private long id; - private PqtMemberType type; + protected long id; + protected PqtMemberType type; public PqtMember() { } From d9462b4a13cc3254a572c7476356a98d3b2d41e4 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 2 Aug 2017 17:32:07 +0200 Subject: [PATCH 42/49] =?UTF-8?q?Module=20Server,=20Service=20Client=20:?= =?UTF-8?q?=20rework=20contenu=20m=C3=A9thds=20clss=20ClientService,=20ajo?= =?UTF-8?q?ut=20clss=20ClientEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pqt/server/module/client/ClientEntry.java | 58 +++++++++++++++ .../server/module/client/ClientService.java | 70 ++++++++++++++++--- 2 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientEntry.java diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientEntry.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientEntry.java new file mode 100644 index 00000000..2f577782 --- /dev/null +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientEntry.java @@ -0,0 +1,58 @@ +package com.pqt.server.module.client; + +import com.pqt.core.entities.members.Client; + +import java.util.Date; + +public class ClientEntry { + private Client client; + private Date timestamp; + + public ClientEntry(Client client) { + this.client = client; + timestamp = new Date(); + } + + public ClientEntry(Client client, Date timestamp) { + this.client = client; + this.timestamp = timestamp; + } + + public Client getClient() { + return client; + } + + public void setClient(Client client) { + this.client = client; + } + + public Date getTimestamp() { + return timestamp; + } + + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + public boolean check(Client client){ + return this.client.equals(client); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ClientEntry that = (ClientEntry) o; + + if (client != null ? !client.equals(that.client) : that.client != null) return false; + return timestamp != null ? timestamp.equals(that.timestamp) : that.timestamp == null; + } + + @Override + public int hashCode() { + int result = client != null ? client.hashCode() : 0; + result = 31 * result + (timestamp != null ? timestamp.hashCode() : 0); + return result; + } +} diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java index 94665ef1..26a03396 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/client/ClientService.java @@ -4,34 +4,88 @@ import com.pqt.core.entities.members.Client; import java.util.Date; import java.util.HashSet; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; -//TODO écrire javadoc //TODO ajouter logs + +/** + * Cette classe correspond au service de gestion des clients. + *

+ * Un client est une instance du logiciel de composition des commandes, ce dernier étant la principale entitée capable + * d'envoyer des requêtes aux serveurs de données. + *

+ * Ce service est censé permettre la tracabilité des clients se connectant au serveur, en gardant en cache tous les + * clients avec des horodateurs représentant la date et l'heure de la dernière requête reçue de chaque client. + */ public class ClientService { - private Set clientCache; + private Set clientCache; public ClientService(){ clientCache = new HashSet<>(); } + private ClientEntry lookupClientEntry(Client client){ + return clientCache.stream().filter(clientEntry -> clientEntry.check(client)).findFirst().orElse(null); + } + /** + * Vérifie si le client donné est connu. + * @param client client à vérifier + * @return {@code true} si le client donné correspond à une entrée du cache, {@code false} sinon. + */ public boolean isClientRegistered(Client client) { return clientCache.contains(client); } + /** + * Enregistre un client dans le cache du service. Si le client existe déjà dans la base, rafraichit l'horodateur + * associé. + * @param client client à enregistrer + */ public void registerClient(Client client) { - if(clientCache.contains(client)){ + if(lookupClientEntry(client)==null){ + clientCache.add(new ClientEntry(client)); + }else{ refreshClientTimestamp(client); - clientCache.add(client); } } - public Date getLastClientAction(Client client) { - return client.getLastUpdate(); + /** + * Etabit une correspondance entre {@code client} et une entrée du cache du service, et renvoie l'horodateur associé + * à la correspondance. Renvoie {@code null} si aucune correspondance n'a pû être faite. + * @param client données à utiliser pour établir la correspondance + * @return l'horodateur associé à la correspondance, ou {@code null} si aucune correspondance ne peut être faite. + */ + public Date getClientTimestamp(Client client) { + ClientEntry entry = lookupClientEntry(client); + return entry!=null? entry.getTimestamp() : null; } - public void refreshClientTimestamp(Client client) { - client.setLastUpdate(new Date()); + /** + * Récupère la liste des clients actuellement dans le cache du service + * @return Liste des clients dans le cache + */ + public List getClientList(){ + return clientCache.stream().map(ClientEntry::getClient).collect(Collectors.toList()); + } + + /** + * Vide le cache du service. + */ + public void clear(){ + clientCache.clear(); + } + + /** + * Met à jour l'horodateur associé au client donné. + * @param client données à utiliser pour établir la correspondance + */ + private void refreshClientTimestamp(Client client) { + ClientEntry entry = lookupClientEntry(client); + if(entry!=null){ + entry.setTimestamp(new Date()); + } } } From 9a756238259244b507643900c2639e0e083f757f Mon Sep 17 00:00:00 2001 From: Notmoo Date: Wed, 2 Aug 2017 18:20:51 +0200 Subject: [PATCH 43/49] =?UTF-8?q?Module=20Server,=20Service=20Sale=20:=20a?= =?UTF-8?q?jout=20m=C3=A9thd=20isSaleRevertSupported();=20Ajout=20Javadoc;?= =?UTF-8?q?=20Correction=20erreur=20compilation=20li=C3=A9e=20=C3=A0=20la?= =?UTF-8?q?=20classe=20FileUtil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pqt/server/module/sale/ISaleDao.java | 17 +++++- .../module/sale/NoRevertFileSaleDao.java | 21 ++++++- .../pqt/server/module/sale/SaleService.java | 61 +++++++++++++++++-- .../com/pqt/server/tools/FileUtil.java | 4 ++ 4 files changed, 94 insertions(+), 9 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java index b28a279f..c26d7c86 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/ISaleDao.java @@ -2,11 +2,22 @@ package com.pqt.server.module.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}. + *

+ * 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. + *

+ * 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)}. Le support de cette fonctionnalité + * est optionnel. + * + * @see SaleService pour de plus amples détails sur le fonctionnement attendu des méthodes + */ public interface ISaleDao { long submitSale(Sale sale); - void submitSaleRevert(long id); - + boolean isSaleRevertSupported(); + boolean submitSaleRevert(long id); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java index ef6d6db4..96e34d11 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/NoRevertFileSaleDao.java @@ -12,9 +12,21 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; 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. Cette implémentation ne supporte pas le rollback de commandes. + *

. + * 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. + *

+ * 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 positifs et non-nuls. + */ public class NoRevertFileSaleDao implements ISaleDao { 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 long nextSaleId; 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. */ private long readLastSaleIdFromFile(){ - long id = -1; + long id = DEFAULT_SALE_ID; if(FileUtil.exist(SALE_LOG_FILE_NAME)){ try(ReversedLinesFileReader rlfr = new ReversedLinesFileReader(new File("SALE_LOG_FILE_NAME"))){ boolean stop = false; @@ -89,7 +101,12 @@ public class NoRevertFileSaleDao implements ISaleDao { } @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 throw new UnsupportedOperationException("Le revert de commandes n'est pas supporté"); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java index 9a21205a..54b31fc3 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/sale/SaleService.java @@ -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.stock.StockService; -//TODO écrire Javadoc //TODO ajouter logs + +/** + * Cette classe correspond au service de validation des commandes de produits. + *

+ * 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)}. + *

+ * 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. + *

+ * 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 { private ISaleDao dao; @@ -19,20 +35,57 @@ public class SaleService { 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); if(id!=-1) eventFirerer.fireSaleValidatedEvent(sale); 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. + *

+ * 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) { eventFirerer.addListener(l); } + /** + * Retire un observateur du service. + * @param l observateur à retirer. + * @see ISaleListener + */ public void removeListener(ISaleListener l){ eventFirerer.addListener(l); } diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java index 54a5d349..26cc83d0 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/tools/FileUtil.java @@ -33,4 +33,8 @@ public class FileUtil { public static boolean exist(Path path) { return Files.exists(path); } + + public static boolean exist(String path) { + return Files.exists(Paths.get(path)); + } } From 156d912ababc3cde0af6bb43871a1c32e926d6c4 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 3 Aug 2017 12:58:45 +0200 Subject: [PATCH 44/49] Module Server, clss ServerStateService et StatisticsService : ajout javadoc --- .../pqt/server/module/state/ServerStateService.java | 12 ++++++++---- .../server/module/statistics/StatisticsService.java | 6 +++++- 2 files changed, 13 insertions(+), 5 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 4e2d63c7..6a49d4b8 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 @@ -4,8 +4,14 @@ import com.pqt.core.entities.members.DataServer; import java.util.Date; -//TODO écrire Javadoc -//TODO Ajouter logs +/** + * Cette classe correspond au service interne du serveur, chargé de conserver les données propres au serveur, comme + * son adresse IP ou encore les différents aspects de la configuration actuelle. Il permet également de récupérer un + * objet {@link DataServer}, implémentation de {@link com.pqt.core.entities.members.PqtMember}, qui sert à représenter + * ce serveur dans les messages, soit comme émetteur, soit comme destinataire. + * + * @see com.pqt.core.entities.messages.Message + */ public class ServerStateService { private ServerState serverState; @@ -17,8 +23,6 @@ public class ServerStateService { //TODO config adresse IP //this.com.pqt.server.setAddress(...); - - this.server.setLastUpdate(new Date()); } public void startServer() { diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java index ff36f5d7..8d925c90 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/module/statistics/StatisticsService.java @@ -13,8 +13,12 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -//TODO écrire Javadoc //TODO Ajouter logs + +/** + * Cette classe correspond au sservices de statistiques du serveur, chargé de calculer et de mettre à disposition + * diverses données concernant les ventes effectuées et les produits vendus. + */ public class StatisticsService { private StockService stockService; From 0ceb0d72cda5467e884e85d16a60ab6c95170a70 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 10 Aug 2017 09:25:55 +0200 Subject: [PATCH 45/49] Module Core : ajout clss config serveur, update enum MessageType & AccountLevel --- .../core/entities/messages/MessageType.java | 21 +++++--- .../entities/server_config/ConfigFields.java | 12 +++++ .../entities/server_config/ServerConfig.java | 53 +++++++++++++++++++ .../entities/user_account/AccountLevel.java | 15 +++++- 4 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 Workspace/core/src/main/java/com/pqt/core/entities/server_config/ConfigFields.java create mode 100644 Workspace/core/src/main/java/com/pqt/core/entities/server_config/ServerConfig.java diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/messages/MessageType.java b/Workspace/core/src/main/java/com/pqt/core/entities/messages/MessageType.java index 0455c219..14d4a887 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/messages/MessageType.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/messages/MessageType.java @@ -4,24 +4,33 @@ public enum MessageType { ERROR_QUERY, REFUSED_QUERY, - QUERY_CONNECT, - ACK_CONNECT, - QUERY_SALE, ACK_SALE, QUERY_REVERT_SALE, ACK_REVERT_SALE, + QUERY_LAST_SALES_LIST, + MSG_LAST_SALES_LIST, + QUERY_STAT, MSG_STAT, QUERY_STOCK, MSG_STOCK, - QUERY_LOGIN, - ACK_LOGIN, + QUERY_ACCOUNT_LIST, + MSG_ACCOUNT_LIST, + + QUERY_CONNECT_ACCOUNT, + ACK_CONNECT_ACCOUNT, QUERY_UPDATE, - ACK_UPDATE + ACK_UPDATE, + + QUERY_PING, + ACK_PING, + + QUERY_CONFIG_LIST, + MSG_CONFIG_LIST } diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ConfigFields.java b/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ConfigFields.java new file mode 100644 index 00000000..a17de0cb --- /dev/null +++ b/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ConfigFields.java @@ -0,0 +1,12 @@ +package com.pqt.core.entities.server_config; + +public enum ConfigFields { + ALLOW_SALE_COMMIT, + ALLOW_SALE_REVERT, + + ALLOW_STOCK_VIEW, + ALLOW_STOCK_UPDATE, + + ALLOW_ACCOUNT_CONNECT, + ALLOW_ACCOUNT_MODIFICATION +} diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ServerConfig.java b/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ServerConfig.java new file mode 100644 index 00000000..1111a8df --- /dev/null +++ b/Workspace/core/src/main/java/com/pqt/core/entities/server_config/ServerConfig.java @@ -0,0 +1,53 @@ +package com.pqt.core.entities.server_config; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; + +public class ServerConfig { + + private Map fields; + + public ServerConfig() { + } + + public ServerConfig(Map fields) { + this.fields = fields; + } + + public ServerConfig(ConfigFields... configFields) { + fields = new HashMap<>(); + Arrays.stream(configFields).forEach(field->fields.put(field, true)); + + EnumSet.allOf(ConfigFields.class).stream().filter(field->!fields.containsKey(field)).forEach(field->fields.put(field, false)); + } + + public Map getFields() { + return fields; + } + + public void setFields(Map fields) { + this.fields = fields; + } + + public boolean isSupported(ConfigFields field){ + return fields.containsKey(field) && fields.get(field); + } + + public void switchFieldValue(ConfigFields field){ + if(fields.containsKey(field)){ + fields.replace(field, !fields.get(field)); + }else{ + fields.put(field, true); + } + } + + public boolean add(ConfigFields field, boolean value){ + if(!fields.containsKey(field)){ + fields.put(field, value); + return true; + } + return false; + } +} diff --git a/Workspace/core/src/main/java/com/pqt/core/entities/user_account/AccountLevel.java b/Workspace/core/src/main/java/com/pqt/core/entities/user_account/AccountLevel.java index dd068a72..8875aecd 100644 --- a/Workspace/core/src/main/java/com/pqt/core/entities/user_account/AccountLevel.java +++ b/Workspace/core/src/main/java/com/pqt/core/entities/user_account/AccountLevel.java @@ -1,8 +1,21 @@ package com.pqt.core.entities.user_account; +import java.util.Arrays; +import java.util.Comparator; +import java.util.stream.Collector; +import java.util.stream.Collectors; + /** * Created by Notmoo on 18/07/2017. */ public enum AccountLevel { - GUEST, STAFF, WAITER, MASTER + LOWEST, GUEST, STAFF, WAITER, MASTER; + + public static AccountLevel getLowest(){ + return Arrays.stream(AccountLevel.values()).sorted(Comparator.naturalOrder()).findFirst().orElse(null); + } + + public static AccountLevel getHighest(){ + return Arrays.stream(AccountLevel.values()).sorted(Comparator.reverseOrder()).findFirst().orElse(null); + } } From 4e14dea618dce1c3d48882e2b8e316b05ea8866d Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 10 Aug 2017 09:27:19 +0200 Subject: [PATCH 46/49] Module Server : ajout support nouvelles query; MAJ Javadoc; Suppr TODO --- .../controller/SimpleMessageHandler.java | 243 ++++++++++++++---- .../module/state/ServerStateService.java | 11 + 2 files changed, 205 insertions(+), 49 deletions(-) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java index 182100a5..e60176bd 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/controller/SimpleMessageHandler.java @@ -8,22 +8,18 @@ import com.pqt.core.entities.product.LightweightProduct; import com.pqt.core.entities.product.Product; import com.pqt.core.entities.product.ProductUpdate; import com.pqt.core.entities.sale.Sale; +import com.pqt.core.entities.server_config.ServerConfig; +import com.pqt.core.entities.user_account.Account; import com.pqt.core.entities.user_account.AccountLevel; import com.pqt.server.exception.ServerQueryException; import com.pqt.server.module.account.AccountService; -import com.pqt.server.module.client.ClientService; import com.pqt.server.module.sale.SaleService; import com.pqt.server.module.state.ServerStateService; import com.pqt.server.module.statistics.StatisticsService; import com.pqt.server.module.stock.StockService; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; -//TODO ajouter des messages d'erreur spécifiques pour les NullPointerException si le param du message vaut null -//TODO mettre à jour la liste des query supportées lorsque la version du serveur sera proche de la release -//TODO ne pas oublier de préciser le niveau de permission requis pour chaque requête //TODO Paramétrer les supports de query et leurs permissions via un meilleur système (config file, etc ...) /** * Implémentation de l'interface {@link IMessageHandler}. Cette classe définit le gestionnaire de message par défaut du @@ -31,12 +27,20 @@ import java.util.Map; *

* Liste des requêtes supportées :
*

    - * + *
  • QUERY_STOCK (WAITER)
  • + *
  • QUERY_SALE (WAITER)
  • + *
  • QUER_STAT (WAITER)
  • + *
  • QUERY_UPDATE (MASTER)
  • + *
  • QUERY_ACCOUNT_LIST (NONE)
  • + *
  • QUERY_CONNECT_ACCOUNT (NONE)
  • + *
  • QUERY_PING (NONE)
  • + *
  • QUERY_CONFIG_LIST (NONE)
  • *
*

* Liste des requêtes non-supportées :
*

    - * + *
  • QUERY_REVERT_SALE
  • + *
  • QUERY_LAST_SALES_LIST
  • *
* @see IMessageHandler * @version 1.0 @@ -72,24 +76,26 @@ public class SimpleMessageHandler implements IMessageHandler { manager = new MessageManager(); - //TODO ajouter support des query de connexion de compte utilisateur - manager.support(MessageType.QUERY_STOCK, (message)->{ + /* + WAITER-restricted queries + */ + manager.supportForConnectedAccounts(MessageType.QUERY_STOCK, (message)->{ Map fields = new HashMap<>(); fields.put("stock", messageToolFactory.getListFormatter(Product.class).format(stockService.getProductList())); return new Message(MessageType.MSG_STOCK, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); }, AccountLevel.WAITER); - manager.support(MessageType.QUERY_SALE, (message)->{ + manager.supportForConnectedAccounts(MessageType.QUERY_SALE, (message)->{ Map fields = new HashMap<>(); try { long saleId = saleService.submitSale(messageToolFactory.getObjectParser(Sale.class).parse(message.getField("sale"))); fields.put("saleId", Long.toString(saleId)); return new Message(MessageType.ACK_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - }catch(ServerQueryException | NullPointerException e){ + }catch(NullPointerException e){ fields.put(header_ref_query, e.toString()); return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } }, AccountLevel.WAITER); - manager.support(MessageType.QUERY_STAT, (message)->{ + manager.supportForConnectedAccounts(MessageType.QUERY_STAT, (message)->{ Map fields = new HashMap<>(); fields.put("total_sale_worth", Double.toString(statisticsService.getTotalSaleWorth())); fields.put("total_sale_amount", Integer.toString(statisticsService.getTotalAmountSale())); @@ -102,7 +108,11 @@ public class SimpleMessageHandler implements IMessageHandler { return new Message(MessageType.MSG_STAT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); }, AccountLevel.WAITER); - manager.support(MessageType.QUERY_UPDATE, (message)->{ + + /* + MASTER-restricted queries + */ + manager.supportForConnectedAccounts(MessageType.QUERY_UPDATE, (message)->{ try{ List updates = messageToolFactory.getListParser(ProductUpdate.class).parse(message.getField("updates")); stockService.applyUpdateList(updates); @@ -113,19 +123,82 @@ public class SimpleMessageHandler implements IMessageHandler { return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); } }, AccountLevel.MASTER); - /* - manager.support(MessageType.QUERY_REVERT_SALE, (message)->{ - try{ - saleService.submitSaleRevert(messageToolFactory.getObjectParser(Long.class).parse(message.getField("saleId"))); - return new Message(MessageType.ACK_REVERT_SALE, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); - }catch(ServerQueryException | NullPointerException e){ - Map fields = new HashMap<>(); - fields.put(header_err_query, e.toString()); - return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - } - }, AccountLevel.MASTER); + /* + Queries without account connection requirements */ + manager.support(MessageType.QUERY_ACCOUNT_LIST, (message)->{ + Map fields = new HashMap<>(); + fields.put("accounts", messageToolFactory.getListFormatter(Account.class).format(accountService.getAccountList())); + return new Message(MessageType.MSG_ACCOUNT_LIST, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + }, AccountLevel.getLowest(), false); + manager.support(MessageType.QUERY_CONNECT_ACCOUNT, (message)->{ + final String desiredStateFieldHeader = "desired_state", + accountCredentialsFieldHeader = "account"; + + if(message.getFields().containsKey(desiredStateFieldHeader)){ + if(message.getFields().containsKey(accountCredentialsFieldHeader)){ + boolean desiredState = messageToolFactory.getObjectParser(Boolean.class).parse(message.getField(desiredStateFieldHeader)); + Account accountCredentials = messageToolFactory.getObjectParser(Account.class).parse(message.getField(accountCredentialsFieldHeader)); + + if(accountService.submitAccountCredentials(accountCredentials, desiredState)){ + return new Message(MessageType.ACK_CONNECT_ACCOUNT, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null); + }else{ + Map fields = new HashMap<>(); + fields.put(header_ref_query, "Impossible d'effectuer l'action : identifiants invalides ou état désiré déjà atteint"); + + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + }else{ + return getMissingArgumentQueryReplyMessage(message, accountCredentialsFieldHeader); + } + }else{ + return getMissingArgumentQueryReplyMessage(message, desiredStateFieldHeader); + } + }, AccountLevel.getLowest(), false); + manager.support(MessageType.QUERY_PING, (message)->new Message(MessageType.ACK_PING, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, null), AccountLevel.getLowest(), false); + manager.support(MessageType.QUERY_CONFIG_LIST, (message)->{ + Map fields = new HashMap<>(); + fields.put("config", messageToolFactory.getObjectFormatter(ServerConfig.class).format(serverStateService.getConfig())); + return new Message(MessageType.MSG_CONFIG_LIST, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + }, AccountLevel.getLowest(), false); + } + + private Message getUnsupportedQueryReplyMessage(Message message){ + final String msg_ref_unsupported_query = "Ce type de requêtes n'est actuellement pas supportée par ce serveur."; + Map fields = new HashMap<>(); + fields.put(header_ref_query, msg_ref_unsupported_query); + + return new Message(MessageType.REFUSED_QUERY, + serverStateService.getServer(), + message.getEmitter(), + message.getUser(), + message, + fields); + } + + private Message getMissingArgumentQueryReplyMessage(Message message, String missingArgumentHeader){ + Map fields = new HashMap<>(); + fields.put(header_err_query, "The following required header is missing : "+missingArgumentHeader); + + return new Message(MessageType.ERROR_QUERY, + serverStateService.getServer(), + message.getEmitter(), + message.getUser(), + message, + fields); + } + + private Message getExceptionOccuredQueryReplyMessage(Message message, Exception exception){ + Map fields = new HashMap<>(); + fields.put(header_err_query, exception.getMessage()); + + return new Message(MessageType.ERROR_QUERY, + serverStateService.getServer(), + message.getEmitter(), + message.getUser(), + message, + fields); } @Override @@ -133,20 +206,25 @@ public class SimpleMessageHandler implements IMessageHandler { Map fields = new HashMap<>(); - if(!isAccountRegisteredAndConnected(message)){ - fields.put(header_ref_query, "Compte utilisateur inconnu"); - return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - } - if(!checkAccountPermission(message)){ - fields.put(header_ref_query, "Compte utilisateur avec permission trop faible"); - return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); - } if(manager.contains(message.getType())){ - return manager.getProcess(message.getType()).execute(message); + if(manager.isQueryRestrictedToConnectedAccount(message.getType())) { + if (!isAccountRegisteredAndConnected(message)) { + fields.put(header_ref_query, "Compte utilisateur inconnu ou déconnecté."); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + if (!checkAccountPermission(message)) { + fields.put(header_ref_query, "Compte utilisateur avec permission trop faible"); + return new Message(MessageType.REFUSED_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + } + } + try{ + return manager.getProcess(message.getType()).execute(message); + }catch(Exception e){ + return getExceptionOccuredQueryReplyMessage(message, e); + } } - fields.put(header_err_query, "Type requête non pris en charge par ce serveur"); - return new Message(MessageType.ERROR_QUERY, serverStateService.getServer(), message.getEmitter(), message.getUser(), message, fields); + return getUnsupportedQueryReplyMessage(message); } /** @@ -156,30 +234,97 @@ public class SimpleMessageHandler implements IMessageHandler { Message execute(Message request); } - private class MessageManager{ - private Map processes; - private Map levels; + private class MessageTypeEntry{ + private MessageType type; + private IMessageProcess process; + private AccountLevel level; + private boolean connectedAccountRestriction; - MessageManager(){ - processes = new HashMap<>(); - levels = new HashMap<>(); + MessageTypeEntry(MessageType type, IMessageProcess process, AccountLevel level, boolean connectedAccountRestriction) { + this.type = type; + this.process = process; + this.level = level; + this.connectedAccountRestriction = connectedAccountRestriction; } - void support(MessageType type, IMessageProcess process, AccountLevel permissionLevel){ - processes.put(type, process); - levels.put(type, permissionLevel); + IMessageProcess getProcess() { + return process; + } + + AccountLevel getLevel() { + return level; + } + + boolean isConnectedAccountRestriction() { + return connectedAccountRestriction; + } + + boolean matches(MessageType type){ + return type.equals(this.type); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MessageTypeEntry that = (MessageTypeEntry) o; + + return connectedAccountRestriction == that.connectedAccountRestriction && type == that.type && process.equals(that.process) && level == that.level; + } + + @Override + public int hashCode() { + int result = type.hashCode(); + result = 31 * result + process.hashCode(); + result = 31 * result + level.hashCode(); + result = 31 * result + (connectedAccountRestriction ? 1 : 0); + return result; + } + } + + private class MessageManager{ + private Set entries; + + MessageManager(){ + entries = new HashSet<>(); + } + + void supportForConnectedAccounts(MessageType type, IMessageProcess process, AccountLevel permissionLevel){ + support(type, process, permissionLevel, true); + } + + void support(MessageType type, IMessageProcess process, AccountLevel permissionLevel, boolean accountConnectionRequired){ + entries.add(new MessageTypeEntry(type, process, permissionLevel, accountConnectionRequired)); + } + + private MessageTypeEntry getFirstMatch(MessageType type){ + return entries.stream().filter(entry->entry.matches(type)).findFirst().orElse(null); } IMessageProcess getProcess(MessageType messageType){ - return processes.get(messageType); + MessageTypeEntry entry = getFirstMatch(messageType); + if(entry!=null) + return entry.getProcess(); + + return null; } AccountLevel getLevel(MessageType messageType){ - return levels.get(messageType); + MessageTypeEntry entry = getFirstMatch(messageType); + if(entry!=null) + return entry.getLevel(); + + return null; } boolean contains(MessageType type) { - return processes.containsKey(type); + return getFirstMatch(type)!=null; + } + + boolean isQueryRestrictedToConnectedAccount(MessageType type) { + MessageTypeEntry entry = getFirstMatch(type); + return entry != null && entry.isConnectedAccountRestriction(); } } 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 6a49d4b8..3e32ed93 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 @@ -1,6 +1,8 @@ package com.pqt.server.module.state; import com.pqt.core.entities.members.DataServer; +import com.pqt.core.entities.server_config.ConfigFields; +import com.pqt.core.entities.server_config.ServerConfig; import java.util.Date; @@ -16,10 +18,16 @@ public class ServerStateService { private ServerState serverState; private DataServer server; + private ServerConfig config; public ServerStateService() { this.server = new DataServer(); this.serverState = new ServerState(); + this.config = new ServerConfig( + ConfigFields.ALLOW_ACCOUNT_CONNECT, + ConfigFields.ALLOW_SALE_COMMIT, + ConfigFields.ALLOW_STOCK_UPDATE, + ConfigFields.ALLOW_STOCK_VIEW); //TODO config adresse IP //this.com.pqt.server.setAddress(...); @@ -49,4 +57,7 @@ public class ServerStateService { return serverState.copy(); } + public ServerConfig getConfig() { + return config; + } } From 66e1e7e19b9e933827d204291edbc6c2b35ca113 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 10 Aug 2017 09:28:50 +0200 Subject: [PATCH 47/49] =?UTF-8?q?Update=20documentation=20des=20requ=C3=AA?= =?UTF-8?q?tes=20suite=20=C3=A0=20l'ajout=20de=20nouvelles=20requ=C3=AAtes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interactions_serveur-clients.ods | Bin 16020 -> 16389 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Documentation/Interactions_serveur-clients.ods b/Documentation/Interactions_serveur-clients.ods index 4c2525176df9a8504a2647c3320b4efdea9e148e..7b99c96b08da329acc6c6a40081845b75a7cb9aa 100644 GIT binary patch delta 14453 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 delta 14048 zcmaKTWmwou({6AmTC_-UcXxMp*A}O^JHe&67k8K9?ykk9SaEl2@zdv(?|kRa$zIu= zote#*WH-4dn|nk2A(DJil;xnHF#!M`075b!W#dtlq5mlp-$4*3zVac($H4!q9-q$n z?{c2?zjpTjD2NjY1>PmvK>XK{IPn_<_W#(b|Jv66V@o`Q;Q4QB;zS8Z%zsx5AnC!} ztm(8bjdalH#Oj;IOzQ)q+T4z&-hN{gQ}s%XN_E4Er=u6_4fMGNvKn|#e8V|YIk9Y= zEo%q!KaCmT=~C>t5%uA4SmdPR8P-uRa=Z`D_l{E$Q;NxlRQk3RVi1oIJjH4qgj>*5 zI9gq}I>JAoi;KgI)rOlA)S}}^Qhx#S$vV|J@{<*?mNttU2E2JRv_I?B9eO>E;jJYp za<3?0X=>M4sqvesh5QcmqPa0nNtI4Oi4>q194=~4sf+Rfn^z~@O4x?jg!JjLyRsXD zO(N;IGQX&!KYcT9{C3%|bBJ#fLyk~RR^9?;7MIe@ zef@6B$@w2K4>-1DP0~ld9IKqgRGVC>Z0`xkMb^d={t(!;7yq|jm@|^ z3)SAPt>$4dzsZEE2Bb!vb=wWG$Ens7^6fdb&v3**2SjXapNY7MwPOk@F0w-&Dm<#a z#t1&URtDk1^T0uislG1h(XBBEx0tr7ZZMu1Q&OJJF&#xUN{o4!`54y}$G(xWxh_+Y z^0E1?ZzXxq6xcyTH7^*GC2ejZ0S$>OyxD!ksKu?E&sp@F-=`DszD+u6SWbYX)hF zY-SE$im8VT15Ic(aWn?&`xWmhr5V??pvOu!I&M&~&Xu_|j5|QIhwi@TBNazfLB|#I{7I_lV)JLX>;;yYS9m0fNas;fI`fys*%JA_e2qFU zn2+-@xx;}3W+5}3GvUL|-LgjPgot=6udmUV$g76jgwVgp>JmE>s zM8{eF5TE~y`J-DfiAj8c3w{2=BF7rbc?KPQO#4u+Z>F!#VdJ_NISa?|V-|6MHC{xt zAabZT$$k>%@+as5a@>GZ>3qZN+-Os>@HV7FiMxyHy_$Y?#vP@vcB#uH`FK%y26=Vlo}+C-%pI5qsfrA{dto~=DTt+7slKBM>hzzZ zD1g@VW=LyGj^B9i78@~s+(s+Jl4kcp57HpPorxF*@D(h{%ih^dZ9G0Z3Ub8T|9H<> z>Kkaw>NoX@@yz))^+!QLpDnvI7Gb}BI1>H7{J6y#{g4TnT1C|t4Qry$nJjoawp@Z1 zU9C+C+!lVRFSa7ig&22W68Bnto-sKbW?wwJI*rvV^&*w(D@P0SQ$wXy80PIWheg6{ z`uch-3hrtxzD05jVR^ZFdU|fT!=1#}nFPnICSy##SAf3#&DAMZT^DWeQne!Yl545e zc}dHD!ZGB98C9M#6RUdZ?bb2bpmjHlFGbG>Ug#`l-ly?4VdgQhH{I0q$&gxMs0s)j zXi3B%-J! zeuYq$gM+`rxEKk81%P>C0Qfg9!o$P=3m5AN5cnYe4Oe>a2*5dJ%#h#DUq@;bo=566 z(|?j+6UQBf?~T;jN0Kzst)?Y`N`wkld5Cp4t-tPgy4;RSZfYY9dp&I@v1fvF;iDR4 zGy1UwE;fd-yuNJAyLB(2x75`M1tMI%4-6mD+<8!4$=|@W3t7s>cZ8k_+P#N1x7})H z&xyv~TeG@xjs&~H9JW88_QxSv8LvakO_~QC9Dk+t+*9m4F_)D=`Y4Y=I2XK~oQ3{s zUmDRFZCcfdr|<{etH~tT)I;a{Z7 zzUVq~LGcK9e)e&#Jzn>T+aG6q6OL5EeeiPp6V_s%)NKmaC3Dk# z8QImdgrjrX-x7wZD_Kt{zA8d*Yv1QVXZfDOWxYK4lyt={{Rb^Za0cEl17g41diL&r z^(@{2zHc=I0DOV^Z_oZW;&~ydx^*A`fPeN6Kq8S4UZN!u1~?4>z#IHuZ=l(~v_c2_&@;=as!mK04*25#luL$%*f8eMor1XLdVa=4lqaojH&>)6u_?u2z=(| z6a^&Y05NqyTo;g41LX7pRV6@O9}qPGB&-2B6F}~7?gXeB18O#at|_2r4QP7+CSO3n z+#PWA;@tSfW&?vaTLfJ0MaLbjCr7B1jq;Hfr3?_Y!0Yg18T>ChIycF z6=+=m+Sh>c9iV;(XgC4dcY*d}pzRvy+XebgfRPiR{{|R%1V(Rx@mIsJc$Knl8~dd7buozlJ`k(PPEcHFC?Y(YgR*2Mqx&7 zc2r(dW>`E8^=bFis+ zu(Nr(vuwPtd9lB0X|#EBqG4ycqqnzrU~+MCesW}fbzx#~=EwBv?8ws6($Mn${QB0novhZv?zaJ0JH`cwE0;@5J zim){`b;X6z)-~3u7j!XC$Y#&3a#SA5Z zMcZ*o9EV_DQ(Cmvo$L6NNihppJ|7j{%_br%NHgse=jE?LCGQ_m%i$B&3R8k@=fdd{=Yh+8F zqA)ssM2o3YmiE|3=|D6%PaXnxWjtCD{W-~>V?#-Mv`&58JmJeZ8FZ5TXzmtKfqA4j z@!jck=?12ItcbZb@1?e&Nq0c)`lGf?a{rj|+5qxkC{hz06+(zipV9V;CXo%Eb_t1EaW(WkePrup8Xo+DMiLGI`{PrwejF*rwnS%Cgjb{7)_NmTj*SE{5D%l zSK=({5;q{88|xg;V4Pze6pPiqTdSkqA)r>d4H5zFW`FoX?~#$xkD;kmSWX%-@A|wqjFH zN=uWWqAsnc$kXO5h6aDW%k6MZ=?y7{@x^l+DQA?X(&0Gs}N{%X1 zqRbD7U@9eLlmXgJ=;Pk!QzQ@Y==od%2ic-4m=`qCCB{n@tlsa`x|pc4>=?N?aL01Y zZ7o+=*vp{!DQ%QkiGP{`=oH1|g3CoT1C(+}V}!O51%BQhiXZ_WC*M`f8irX!MC>>z z=;`1kjvJBxrxr_q1#F0&AR<%riW9n$(b&B&yd+k@;}k)X5hJ@%5Q32h5~hZ1!dI_9(HsG)5q$tQ zW>hP6QL8F6I3ljCjHdFPm-<^9@@ViCvD7zc@?J+`Dnm@Dra(v?{e}ccFk#i2)RIrkuBoOVHJu^Dw4cnV_9@IHd1 z^EAyXg0+5H_XSQyM#P%c;0##u-&$m|!m;{IeFE!@pxQGdTnQq)^T+JF-C1L5h}y_T zvafF6L=>q9T1aT>c}Ql3`7n|5Tv``Sg%^-WxE8Q0SANuru7^J*Ml5rOjN7h>wh^QY zLS-6nR@N5%aINf0BwXj<7v*LcTfh*z`$LpJ%k}EQn&VpTY{zbjEAIR|~ zSS7{|O_8wj%Mhd|Y&>l^1NYV1)@ap(?I}=5-Yc>0!I#Sm2XZ2meSoB!X}o5LZ;c2? z!+|(zDmg$Y>G6Oky1V{h09Fu~^`j&5fwWPB-HJm|fP^dZ12?z{mHsx3%5-y@eP( zT~~M%wxgJ`xKL8t0XYtFr%0NshmF^u;3(XgPJ>b!{W<(!$+Dc8Jr|cN*Do3c4-OF!HQ`=!|NUw=SzLd?TI zOqyOV@k)T#oN#PjwVSq27;G+T1~Q`8VsB^Ti8qHqxBu{X`KJPi4Fgr@$AR-|2?IWw zRb?&i(>H)h)_%NDo^4 zeAFL~agq>`Ho~w^aC%>f47h9Lat-{ZE52If;_p2kO0))axg$ZXka%=20j@QCna|{n z;?#$1x2U%my@9-A@0VN$ikEsx`qsE9pFV_!j*P#+mQpbyWuV+4e|QA5-<(SyM=j=! zip{*<$twl?XOJ8|O)7h4n3dI4+pd*$%+x)*CZ}jJFW|PBdBV(D?>EFpI8Cf^_D=^h zyOdX^5h#CL)J3r@_0kH-bM>gPw#o2^J82ZaAyPutXPJg}vF&uE3D~>rv$q0R7YWN+ z>MCAltG$-nD$c>70CSJ4-OTkGFEOdf*b8MAm!ebh`BNbTYgDbC>_juHP*}0IpP|Q! z?^5|R7M)zDl4H*6Olqn>r|$m}${UaC>J5W_gZL=?s0Ek8;m)wt%lq=&i(1Y&DfAN} z)%{+5&HIVyga+5^=GBbBsQIEV^Tx;EDAN5)IdoffmfQ&lr@%IkC5Som=yzn~u>!?_ zc&`6EpeKbBcSYHq$Vsg9=ZWvPPpr4!T0Qildhdo>V1YN^1%j;KJ$tT->w-tu(wl1V zCO_(8=GIh%_RMb8$;wMiOy6GkEJ7;X%eWi`-H*#HEve3L!Y~b-ed&;v# ztDg;%E7=9?sdn||6S6&iOv4Rb`Eiy7IDsG#L z@4N1b6CPGpQN&Vr=ixJQAtWQPOS#qnOMc=3)dr6 zX-Wuy)#w@0!soC128zil;aL8Vxd~9pami9X@bRyXYvhjb)Wko~ED*CqIAMqz37`mE zDT(DZXn6>6g^!$QNt<=CEgar8g#4#-5VHPPZOSFXU; zh*m67>nk!sb8li2FOuTqdEkFiL&U=R39~zDgso$?vaO$KOX0F+6LCE&3GK_XlsO&` z`X`t}EFA*$O14nD;b;Tzam^!|t2U69@tgf8L{r8`REI`T(e8g1a;5~S=B<5$=8jKN zRRt33ci~eEOc6;XUTx@6>*2Pwy;p3*Va2{QO?&a_4UFyPzJAdIDw~5Waq{$31ASrP z5a`K&VE>@48I*6&teB2SO8DyLJWBon+?KYzq5eSY@}9IM(!p&;UimU;Ex9ytR%0Z( z@#V*7?^|bh1-N4=x*zI{fBKubJzTI$Vw{fS5f>f&RhXK4B@YM%0|X8Zl>6Yj#9Q}m zaO1JeLvYCI`ly){UN-Im%9oq$w@i&!MjZAE9t zHqB#kv}Bc*c52l6IwMaksTOGns==k1OOr-HI=NuLO9qK(ejCOk9&+9;&{U;ilE@#O zRgO@N2@RmGRkp*D#EFv{y9^HWG$3l^_@VH_sc9G^K+KPwv=;RTbo?qhBy&bEnvKGi zJo_X&F=tA6t>bU@6Bm>i-MvUIzW6b@GR!f#SwLU>_;GoYa8>6a{x&%kL=V2!`9>pL zaMyGOk**gW&Lf(MT!)q`?T8q$*6{`Z69ydha{xogxD5AeIj$)AB({zGwsye?HVz~j zet`qel{ut(xYQ#Orc9%>rwk!|-Kg5MvE_$2XMP72bfigAeuYr+t_-wXV=CxUi4Zn2 zF$LDb7`W={ zNm_>kkc%ze^h@BLbq^ywEBQe(bm3tbpCOHp!XWFJlV)(dNn7JAcBzGp*e_RkcO^IY z-1#9@J+p54w#*$jYjow(0w>abw}xqkBctoyFLliZpI#w2&Rzw{!K|-HEM$wL*{M$# zzjRXkUb?&S-Rl~v-<}#nU`w{xl2c2AQ}L`%vNO5p+S!ZO$jFqwHRhFcuphq;6?L$u z83CDgV{#M5DCVumH&vfPN&cq1E6DPqQRS>IKh+Pk5!%K)xv1woBvWCCd>*?~auyS; z; z6YX8|B}$vkz2stp_|Uw5N`G)5d$TYEDYl5{XH}UCaZY~+jFb69wMoa$(|j&Ff8 z&tSQ=fZ*kmdsRa9In`qQ>;5bSa-{VJT~70F?W?xq_0E4CJL;L&kg9v?_n+SFlyviv zC#S5Gz&yWh-dA74b>kPk%MH1M6e0{4uPl8@BTrBUl(VizKKh=TebPC@mfJ1($tFxW z*Y}ggijObgw_fo#;%G7JC?l&*w-FN)cZ;rt@>@rFig3Ryj`^BrxLtQuyeOSXey`U# zfPCxzCEI$ri`#h5*6OBU-#zPyhFJjSUqj;WptxWXbL~twl)E3&`zUbMx!$?M&5K75 zvUe^l+og$ogecV%D>Phr`o-96#lC(vkZ09=dsy8#eXD8U-Y(%fA2Yo7_$@+`l3HFb z^uq&$n!ndr7>6Ieiwguo_)Zfv~%s?s!sjsUT(em)%BSjDzq2GEX zk|Ow^Q~JGsH&>f?|<;fU?`u!_616NPeRhpc({65$K-%F*LE!q zXiew(E4O=I-%p4_jlS?2x^^5@+%@~kvksh8EnacZb)~6|FMR}Si*6f)mm0l~K$0x0 z)b{r3;nexNt2PxMi_ha%LLGB57}Ked4Tj{{H=+_a{RjHQ7MKSeUPO%KxVps)Oxw8C zXB}q;jR$jVMcMBoV(4B)0qm`QNLnr4kIVwV0rkB!*b}Ma9t2oNs z_7kGgunahM953G=Y%WGd4qs4j!Q)^mL7m65&Ot_aW zT)UGETusB-`v!08?v>FJ$lC=%kJe;$L)Nv$Yhv21jz?7uIi6hEUF9lL(|=Cpkz7RKRc#7&x4 z4vV2ZO2oL#K$2Eo6V|`60(kq0j=`Zdx)hESzmt>lowV|8Kni-8@fj4H_rz*UA%a=B z34$2ms>q^cMAk>q9>^Xqk3sCzzP%PQ&6Gh!Q)S^B1;~V82+epl?MBz8F_vM?Nea6$ zv4&By0TwQ&vvT$;R80Jx>G_YZ#Nk23kP(3uo6;fg!b%M6;NBJXi-HoK3Br!_4!PL0 zv`)&Hm~Ev5h=wG`&ZamXg>C*LRrGECU(GXOoVF+Z4Gxj`2fjnY?03Lw4k19`(be}> zEkPHJhA^@P2F}j7cmh4bq5W<@@J@VUO!w12J<|xQ&XOPq7p~VQr%JMrJBt-o_T=`Z z^^gtzq@||zrVNiNU;x#V(7y0eOUEP8VbM)7E(oGBIKc8~uKu0M32UQ-D}rL&PH1BN zCEz<;38`tGZGy+w&$})-&ZGB-T}@*9<|MRJ z1$me}YLNk9s$lL%Pt2*js*L3pdij(btZ!wCq&V9UX^@{BwOv4d$GKM8?R`^OVnr=z zn1jH9Z&8Jq#HbVAlK5lq6rm!t%XK?oMs7qpXt{H~<_+Y^$0-nqQ_QrGa$}i7k2~+= zs4Zu|m|o?KF{B;Q$nOSHn~$zEoMf_!N~o>veY^TQ87Qy(0XbaN^XP~{h2S?cUs>ht zp$BOL`?gsU-rOaK@V@bKwv=ul<(htvLiUWpS*`aEG%QS}WYwHfFjx*{TpWliJOx`Q zD-$2jz!oW~ObnN=LsQ4nFTw#kUk6t&EYUmlb5H!5A=VzV1g@0Wk4_GuXABp!oP`$G zbLw3WERXE)a+Te{H#Vg#Wc7EDdT#e)agc8M^YW}(B#?C=TlQd_Y>E*7?BtITSZxR^ z*m=*NKe@4plaaLe%C2SV2||#hxMo~igBu4>qbddz?lDidPXqd~n*y^0@ZARj)TxnN z6!!cVG_6}(W5TV4IU`#PqOf-K{iWj$H5PSo+#k0C2$PQBn6KK4l z%b&Jwg=1FWMH(*mLJ zMcXIOAHM!1Y-NWy^T=&ffUpc>`*cQ}DbuU_!00dlV%e-gsL>RO21nC5a55^65lc?R zT)_{~3QwQqZsH=9-4HmPi9pyPno=8w(J{xU$}*@!lP(1!K`O&%FpD{BKoe&Y<_0t8 zVh3tyN~hBZhtR*L`}xtaZ@GtL2?8#jWTrmLiKRlFrEkMALn>I@cV);>m+Qa-w@5Gb>=kp~sJyQM$pYIIel`OSH)X z_L}VPee-MuMe%t>-{BzJA4okT-VP005b1kX+Rl4a+TC)Q5gryAAJ!+B7i`+yoP~>Bs%QOrC=v{60J2I0!J-4p zs!LMUtE|O!oPPVMxd|$;Y#lk(-2*ShwPU3>Xq>O?gKn-h{w6YkW!l_%72l=t@SqU9 ziveG16Ot;kiz^p>_l2h`s(tS5TG!m~l%&@XLNOc$h}${j_Zm2F(>rYJNTqgM`ffK1 z;aH$IqMwJP@Xt_21fM6vmB#!K5Kf8RbLuCW3X{hd74uANE43YuS)j2a>I1FuYK0 zDc_x(JZ(zBRlt2eEvK45$jLW7R3BjRXfN#3M%a=%6L>;J*@!8v_|B;;*&3Q)?r}xRMRpPTH~R7A`Jd>AOblCLUl6^M=)k-+ zAfy#R*de{h3hwaT8^n~Ihb=DDCz(Wl>VMOz64R*(K>c;QoffRF3pIGdT+4v?y>9M^ z3{#a)wTD1reil(~r)eQs#z)!txTLJLI}Wd<@!}<4sBW2@!m!8sU1>ueRef`=USgB@ zu-%gW{#c?|Oe0^Ah}jxhRF%*Wb*O))CvbX?5IJ=zh$#nbV1oVi>-qTWlc4M8Ek`aC zV)dqRP%Pw4Z<#kKvfgBLi>a+S-9F{x3Q6CxT8waq$@e%->O=M&IG+itkD{2En6e6+fKzNY6?$#sy;c-va5_lFf}en|)fV{r_s5y-cw8TM3)IXC zhj=_yJsv`wWngm!RK0=J9%u3&T_!!LC9j{G=I#>WC){#T6?v?8D`8{vbj`@&x*QW1 zAqu*Ci+gs2@R%;t<2Q{j5RZdprtH#fG4q(*Ri49H>)m9w(%OJyoTYu|EX(U)AFG2>{s*0yj`14iQ5~wWiSHD>A$c<#D z^5gyc8!4%!pI)m2(Iog~>*>oHg+LUTAu?(c#)3}y;4x!vld&Z_cgnH?6$W!*$M-oe4rfw4Saq{3c-E6t| z5i}i@)fnibP^Auk&d7SVy7%+a$q9*b2Gc&!{@(wy46cT55u%oGD%~3S5SX|nkLvfq zfxdS?J|E({F$X`&8K6 zc;Z&}?@(_}e!hi#^}=lV>po!Wn)o!FzE@H284!#}TWK$ueJPB#n*XKMx z_pPlJ`pL)cBezj~CiJzO$N4_eKt0KE2J`)RvFR~&DA#w8cn^x*<(Jf!*)U6uZ*U< zDBmX5H+Mghch_SdJwJo+EN1eNR}BsP?vLCmR%v^ZU*r=TblfzhE%>u`z9OH`DW1Gi z3jEgElq2#tFP>F|g6lXD`9-FvcgrP|-~Dq`fR!+sDVvQt`;)cgd|9=C!?M;#_Kz_S zP{@78H49>eseC))8rBIq<2jfDje}b*5-x15PIXFJKLi66zZIf`E$>cPOkH8Z?ODRZ zl!5~gKIu!wx62EYid2$dujk40i9J9-qI-SX5@Ihn5|i-VyUs1`UGIr3n!=xHWsKQ}QLd>Y2P8$1 zb{{j48m4m<+j^SJ8rI3{$)s4hAIzKZ8rD(ILiM}D%`F*%b01~wx4aiiOlRodORY+& z#Dx#{qos)orS!4NVErhu!DL*#&(Ws3(oS=Y(=_MOqqC;3gI#*Jt2#U)H=2H~==F;U zrW0*xqRnxV1tsl1Po=GY1acUfx|89k%cB}Dde(PqEilQnY)XjtyCfRc9JFc?mIRyb zjC_M{lDC%xNaVAP#sk$gI70a8uBFVSyC3R!*We`@Z{Pz{ymDHjDis^XfDg9x+RGQn z^ya9s_-k<{x=cQ+_gaHJhO*x_(afpz4bQd?gJqJ_aAlJDbLD%kQ#3q7jcICs)Or=A zT7fD<9$M}>`*YIPSkB@xW*f4D6AE!pG9JDW{4PZZpu(KIjj!9x?4(tFDc=i|QlXB5hS zqgOK9GbHp-mLS6Y`@SRs1$UwXh5Y8jDDhmUXNOx-a=3Hlz9f&t< z=E*TM873XvtUI|$_6C%nSk5y|`&ja2sYeJ_r9gKWyQZ;s`Ee{7Fut3G`9uuvPehHr zl^Se6$K6J0CmR)Hg-B3Dpk6eT5T2NuObQ5>OP(g?FBOubX#L8%4kDXV+Jw zl!SHT9HJBmg*;30geu1f-VM~%F+-i2MkA^5yOF9JyZ3eB(w3IaI}8Q5Zo(yW#!d* z46Gg_;@A&4$`RPtdNMNgz7hI|>bH!W^umS!00>(DC4~K#>i3u6@;@8WU&-0b#l_0b z!kN*-*5(Y~whdfdXdj@4xjRd+Fido9kzCp`?Sv_bJuKSBt!6TBDuO05bWi|_} z!w{Yw42rms$3?0sW=3_#ICxJ*PF0$83^{gfZAtQwppiz!#*~JNEJ%kANoSHWMw{TG zqq~lSXib*WTC8eg^IYTkGBl~%dwfCqi5jzurZOYMs#&7CP7qP~e${%=z=_H1lo){^ zN;nG4l_}WXC(#ps{w%CrOR}D17}SCIhbq11h8PtxR>56FtGY<`%<>QCyXPatx$%Ya zTUVp!NHj?th^uJ=&(${NChw#aR{pN-K|$<-${pLZw3=^W!nGuj`Ol1UFo!8wl)HqU zFL4cLWt6he~=JQoETzRQ&POkphE}h5oozc9d-D&uIAXQM6ON zEWLqZc0tk+l?lk-`iFXp_5?0tGLLJoY@1N2Fl-ItOC(p$Yic}5J|-6t5!O%@2eo7I zEhQ9}$mR051zQLK!%3l(Qao1Th|2ieF8Hp4i?exx{(|VIk5ac4P`%MKle&&I3Tr4} z(FYM#n;LG3_IP)8!6_Wi*wlfpi+NpDKSjl#4o@??J42Wza6_%09r_P$pYYzI>c9ed z>bM85{aPZjTEdaY7K8yA#gVfD^C;uC1|d&S`XcC8!Kwaq*kpfm9L$$QV?28i6IyeX zRws=r^)AD#Px@1v$(-^nM^@4<>5cEfTMu6+Y>FXFlA+Okq{FOT60?qCu_00yYDJ`m zELWv`Q`~FY?77;JlT2bP(iS$Z?3iz6Sp&q(tYs(|p-lzHnC~=up0hM1rhl>@Qg8Jp zx33+jdl9eO_Fw4V5Fy$Z#^6i@k}o}D1YB^wPEYIf26@JPK-^X|kqs<)rWSYrk4+4K zi}N_*rZ>Xja+2u051YSj+%i+`eq`qV$TAR8+dQGUff|G+hai7RYM~F|`?@?g{Rl^1 zo&(|8K#Izm)ScyUXg(rUi6!X#%i{cL%K4XGy6~7KhB4QmPj(iB;MdDOS!EwMTz&zc zoYdcI3IcwKY7g#EhILdfeee3aK$R9fqCiYo7P!b*)iEBX^^Gp4Pl45pd;UEhDmJB` z{>0Yb3-&G${mCE|E zD5{w$`~4K@G-*}PMT|Z=?Bk3p;15aYV@p;JFmnua4})!HFTFn`d**lH!G^Y;yFFY> z_khGv5=-k`sNMI<5H+luP!bqt-NLJoF_b3LZO{b$aOHHnq%&aU=+tw8gFy_U`Ws48 zb!vHrE(T{#!;cRDuD`XNehJNr)*E1n7biFn(7jG_3T!iIRztW`IG!b`+0`3)HuBv_nLcDaEt6SW zdS!GdtD7T}D9J^|a!S?mkZe~IGhE|vEi88DqVGQ8{zLU2ma{Tri?5rM0qb10I!z1d z#;ZUh`-6q%REX-JJrj%i2Y?7#@VAlQdCz;{#q#%VN7Zaeruh zeB+uFpA(_#y%UQ?!3~i>zs)1kC{L9p1M(^rIs5VP5mb1laHkD7ROk>7FiFTQaaW<+ zPO?j;pIS0Pn>FXTrQe^;^t+(EC$WNjqBEvMMY?*lm1RCN$UE1DYm&}@lm2_&N_3ml zCloS6ROw)WiNb?#L#bY-M#m1{=X9#BvoaXvT3uG#?!j*YVJ487n=6G)TqYEg&M2;SRYra2ruytMnM^k3$AFy;Rbj Date: Thu, 10 Aug 2017 10:21:50 +0200 Subject: [PATCH 48/49] Module Server, clss ServerQueryException : ajout constructeurs --- .../server/exception/ServerQueryException.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java index c3fb5f6d..314e5f46 100644 --- a/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java +++ b/Workspace/server/src/main/WEB-INF/classes/com/pqt/server/exception/ServerQueryException.java @@ -1,4 +1,19 @@ package com.pqt.server.exception; public class ServerQueryException extends Exception { + + public ServerQueryException() { + } + + public ServerQueryException(String message) { + super(message); + } + + public ServerQueryException(String message, Throwable cause) { + super(message, cause); + } + + public ServerQueryException(Throwable cause) { + super(cause); + } } From 143fe391d7cebd407d3a40840dda28ea8a9b8951 Mon Sep 17 00:00:00 2001 From: Notmoo Date: Thu, 10 Aug 2017 10:22:58 +0200 Subject: [PATCH 49/49] 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"); } } }