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