mirror of
				https://github.com/klmp200/PQT_Gestionnaire_vente_stock.git
				synced 2025-10-30 08:33:57 +00:00 
			
		
		
		
	[SERVEUR] #13 : Les fichiers de ressources peuvent désormais être stoqués dans les dossiers de la webapp du serveur; Ajout d'un test permettant de s'assurer que la wepapp a bien été unpack
This commit is contained in:
		| @@ -18,6 +18,7 @@ | ||||
|     <content url="file://$MODULE_DIR$"> | ||||
|       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> | ||||
|       <sourceFolder url="file://$MODULE_DIR$/src/main/WEB-INF/classes" isTestSource="false" /> | ||||
|       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> | ||||
|       <excludeFolder url="file://$MODULE_DIR$/target" /> | ||||
|     </content> | ||||
|     <orderEntry type="inheritedJdk" /> | ||||
|   | ||||
| @@ -18,6 +18,8 @@ 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 com.pqt.server.tools.io.ISerialFileManager; | ||||
| import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; | ||||
|  | ||||
| import java.util.*; | ||||
|  | ||||
| @@ -66,12 +68,13 @@ public class SimpleMessageHandler implements IMessageHandler { | ||||
|  | ||||
|     private MessageManager manager; | ||||
|  | ||||
|     public SimpleMessageHandler() { | ||||
|     public SimpleMessageHandler(String ressourceFolderPathStr) { | ||||
|  | ||||
|         serverStateService = new ServerStateService(); | ||||
|         accountService = new AccountService(); | ||||
|         accountService = new AccountService(ressourceFolderPathStr); | ||||
|         //clientService = new ClientService(); | ||||
|         stockService = new StockService(); | ||||
|         saleService = new SaleService(stockService); | ||||
|         stockService = new StockService(ressourceFolderPathStr); | ||||
|         saleService = new SaleService(stockService, ressourceFolderPathStr); | ||||
|         statisticsService = new StatisticsService(stockService, saleService); | ||||
|         messageToolFactory = new GSonMessageToolFactory(); | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import com.pqt.core.entities.user_account.AccountLevel; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| //TODO ajouter logs | ||||
| //TODO Issue #6 : 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. | ||||
| @@ -18,8 +18,8 @@ public class AccountService { | ||||
|  | ||||
| 	private IAccountDao dao; | ||||
|  | ||||
|     public AccountService() { | ||||
| 		dao = new FileAccountDao(); | ||||
|     public AccountService(String ressourceFolderPathStr) { | ||||
| 		dao = new FileAccountDao(ressourceFolderPathStr); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|   | ||||
| @@ -8,10 +8,11 @@ import com.pqt.server.tools.security.IHashTool; | ||||
| import com.pqt.server.tools.security.RandomString; | ||||
| import com.pqt.server.tools.security.SHA256HashTool; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.util.*; | ||||
| import java.util.stream.Collectors; | ||||
|  | ||||
| //TODO ajouter logs | ||||
| //TODO Issue #6 : ajouter logs | ||||
|  | ||||
| /** | ||||
|  * Implémentation de l'interface {@link IAccountDao} utilisant un fichier contenant des objets sérialisés comme | ||||
| @@ -25,8 +26,8 @@ import java.util.stream.Collectors; | ||||
|  */ | ||||
| public class FileAccountDao implements IAccountDao { | ||||
|  | ||||
|     //TODO to modify | ||||
|     private static final String ACCOUNT_FILE_NAME = "G:\\temp\\acc.pqt"; | ||||
|     private static final String ACCOUNT_FILE_NAME = "acc.pqt"; | ||||
|     private final String ACCOUNT_FILE_FOLDER_PATH; | ||||
|  | ||||
|     private Set<AccountEntry> accountEntries; | ||||
|     private Set<AccountEntry> connectedAccount; | ||||
| @@ -34,15 +35,20 @@ public class FileAccountDao implements IAccountDao { | ||||
|     private RandomString randomString; | ||||
|     private ISerialFileManager<AccountEntry> fileManager; | ||||
|  | ||||
|     public FileAccountDao() { | ||||
|     public FileAccountDao(String ressourceFolderPathStr) { | ||||
|         ACCOUNT_FILE_FOLDER_PATH = ressourceFolderPathStr; | ||||
|         accountEntries = new HashSet<>(); | ||||
|         connectedAccount = new HashSet<>(); | ||||
|         hashTool = new SHA256HashTool(); | ||||
|         randomString = new RandomString(10); | ||||
|         fileManager = SimpleSerialFileManagerFactory.getFileManager(AccountEntry.class, ACCOUNT_FILE_NAME); | ||||
|         fileManager = SimpleSerialFileManagerFactory.getFileManager(AccountEntry.class, getAccountFilePathStr()); | ||||
|         loadFromFile(); | ||||
|     } | ||||
|  | ||||
|     private String getAccountFilePathStr(){ | ||||
|         return ACCOUNT_FILE_FOLDER_PATH + File.separator + ACCOUNT_FILE_NAME; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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()} | ||||
|   | ||||
| @@ -30,12 +30,14 @@ import java.util.Map; | ||||
| public class NoRevertFileSaleDao implements ISaleDao { | ||||
|  | ||||
|     private static final String SALE_LOG_FILE_NAME = "sale_log.txt"; | ||||
|     private final String SALE_LOG_FILE_FOLDER_PATH; | ||||
|     private static final long DEFAULT_SALE_ID = 0; //équivaut à la valeur du premier id - 1 | ||||
|     private StockService stockService; | ||||
|     private long nextSaleId; | ||||
|     private ISaleRenderer renderer; | ||||
|  | ||||
|     NoRevertFileSaleDao(StockService stockService) { | ||||
|     NoRevertFileSaleDao(StockService stockService, String ressourceFolderPathStr) { | ||||
|         SALE_LOG_FILE_FOLDER_PATH = ressourceFolderPathStr; | ||||
|         this.stockService = stockService; | ||||
|         this.renderer = getRenderer(); | ||||
|         nextSaleId = readLastSaleIdFromFile()+1; | ||||
| @@ -96,7 +98,7 @@ public class NoRevertFileSaleDao implements ISaleDao { | ||||
|      */ | ||||
|     private long readLastSaleIdFromFile(){ | ||||
|         long id  = DEFAULT_SALE_ID; | ||||
|         if(FileUtil.exist(SALE_LOG_FILE_NAME)){ | ||||
|         if(FileUtil.exist(getLogFilePath())){ | ||||
|             try(ReversedLinesFileReader rlfr = new ReversedLinesFileReader(new File("SALE_LOG_FILE_NAME"))){ | ||||
|                 boolean stop = false; | ||||
|                 do{ | ||||
| @@ -131,7 +133,7 @@ public class NoRevertFileSaleDao implements ISaleDao { | ||||
|     } | ||||
|  | ||||
|     private void logSale(Sale sale, Date date, long saleId){ | ||||
|         try(FileOutputStream fos = new FileOutputStream(SALE_LOG_FILE_NAME); | ||||
|         try(FileOutputStream fos = new FileOutputStream(getLogFilePath()); | ||||
|             PrintWriter pw = new PrintWriter(fos)){ | ||||
|  | ||||
|             pw.append(renderer.render(sale, date, saleId)); | ||||
| @@ -166,4 +168,8 @@ public class NoRevertFileSaleDao implements ISaleDao { | ||||
|     private interface ISaleRenderer{ | ||||
|         String render(Sale sale, Date date, long saleId); | ||||
|     } | ||||
|  | ||||
|     private String getLogFilePath(){ | ||||
|         return SALE_LOG_FILE_FOLDER_PATH + File.separator + SALE_LOG_FILE_NAME; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import com.pqt.server.module.stock.StockService; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| //TODO ajouter logs | ||||
| //TODO Issue #6 : ajouter logs | ||||
|  | ||||
| /** | ||||
|  * Cette classe correspond au service de validation des commandes de produits. | ||||
| @@ -34,8 +34,8 @@ public class SaleService { | ||||
|     private ISaleDao dao; | ||||
|     private ISaleFirerer eventFirerer; | ||||
|  | ||||
|     public SaleService(StockService stockService) { | ||||
|         dao = new NoRevertFileSaleDao(stockService); | ||||
|     public SaleService(StockService stockService, String ressourceFolderPathStr) { | ||||
|         dao = new NoRevertFileSaleDao(stockService, ressourceFolderPathStr); | ||||
|         eventFirerer = new SimpleSaleFirerer(); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import com.pqt.server.tools.entities.SaleContent; | ||||
| import com.pqt.server.tools.io.ISerialFileManager; | ||||
| import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; | ||||
|  | ||||
| import java.io.File; | ||||
| import java.lang.IllegalStateException; | ||||
| import java.util.*; | ||||
|  | ||||
| @@ -19,17 +20,22 @@ import java.util.*; | ||||
|  */ | ||||
| public class FileStockDao implements IStockDao { | ||||
|  | ||||
|     //TODO to modify | ||||
|     private static final String STOCK_FILE_NAME = "G:\\temp\\stock.pqt"; | ||||
|     private static final String STOCK_FILE_NAME = "stock.pqt"; | ||||
|     private final String STOCK_FILE_FOLDER_PATH; | ||||
|     private ISerialFileManager<Product> fileManager; | ||||
|     private long nextProductId; | ||||
|     private Random random; | ||||
|  | ||||
| 	private Map<Long, Product> products; | ||||
|  | ||||
|     public FileStockDao() { | ||||
| 	private String getStockFilePathStr(){ | ||||
| 	    return STOCK_FILE_FOLDER_PATH + File.separator + STOCK_FILE_NAME; | ||||
|     } | ||||
|  | ||||
|     public FileStockDao(String ressourceFolderPathStr) { | ||||
|         STOCK_FILE_FOLDER_PATH = ressourceFolderPathStr; | ||||
|         random = new Random(); | ||||
|         fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, STOCK_FILE_NAME); | ||||
|         fileManager = SimpleSerialFileManagerFactory.getFileManager(Product.class, getStockFilePathStr()); | ||||
|         loadFromFile(); | ||||
|         generateNextProductId(); | ||||
|     } | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import com.pqt.server.tools.entities.SaleContent; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| //TODO ajouter logs | ||||
| //TODO Issue #6 : ajouter logs | ||||
|  | ||||
| /** | ||||
|  *  Cette classe correspond au service de gestion du stock de produits. Il est en charge de la persistance des | ||||
| @@ -27,8 +27,8 @@ public class StockService { | ||||
|  | ||||
|     private IStockDao dao; | ||||
|  | ||||
|     public StockService() { | ||||
|         dao = new FileStockDao(); | ||||
|     public StockService(String ressourceFolderPathStr) { | ||||
|         dao = new FileStockDao(ressourceFolderPathStr); | ||||
|     } | ||||
|  | ||||
|     public List<Product> getProductList() { | ||||
|   | ||||
| @@ -5,6 +5,9 @@ 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 com.pqt.server.servlets.exceptions.BadPqtServerSetupException; | ||||
| import com.pqt.server.tools.io.ISerialFileManager; | ||||
| import com.pqt.server.tools.io.SimpleSerialFileManagerFactory; | ||||
|  | ||||
| import javax.servlet.ServletException; | ||||
| import javax.servlet.annotation.WebServlet; | ||||
| @@ -13,18 +16,15 @@ import javax.servlet.http.HttpServletRequest; | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| import java.io.IOException; | ||||
|  | ||||
| //TODO ajouter logs | ||||
| //TODO Issue #6 : ajouter logs | ||||
| @WebServlet(name = "QueryServlet", urlPatterns = "/") | ||||
| public class QueryServlet extends HttpServlet { | ||||
|  | ||||
|     private final IMessageToolFactory messageToolFactory; | ||||
|     private final IMessageHandler msgHandler; | ||||
|     private IMessageToolFactory messageToolFactory; | ||||
|     private IMessageHandler msgHandler; | ||||
|  | ||||
|     public QueryServlet() { | ||||
|         super(); | ||||
|  | ||||
|         this.messageToolFactory = new GSonMessageToolFactory(); | ||||
|         this.msgHandler = new SimpleMessageHandler(); | ||||
|     } | ||||
|  | ||||
|     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | ||||
| @@ -36,20 +36,38 @@ public class QueryServlet extends HttpServlet { | ||||
|     } | ||||
|  | ||||
|     private void executeServletProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | ||||
|         try { | ||||
|             if (this.getServletContext().getRealPath("/WEB-INF/classes") == null) { | ||||
|                 response.getWriter().write(new BadPqtServerSetupException("Real path of ressource folder is null. Current PQT server only works with web server that unpack webapps' WAR files.").toString()); | ||||
|             } else { | ||||
|                 if (messageToolFactory == null) | ||||
|                     this.messageToolFactory = new GSonMessageToolFactory(); | ||||
|  | ||||
|         if (request.getQueryString() != null && !request.getQueryString().isEmpty() && request.getParameter("message")!=null) { | ||||
|             try { | ||||
|                 Message resp = msgHandler.handleMessage(messageToolFactory.getObjectParser(Message.class).parse(request.getParameter("message"))); | ||||
|                 if (msgHandler == null) { | ||||
|                     /* | ||||
|                      * Le chemin passé en paramètre correspond au chemin réel vers le dossier contenant tous les fichiers de ressources | ||||
|                      * Cela ne fonctionne que si le webserver utilisé unpackage le war du serveur. | ||||
|                      */ | ||||
|                     this.msgHandler = new SimpleMessageHandler(this.getServletContext().getRealPath("/WEB-INF/classes")); | ||||
|                 } | ||||
|                 if (request.getQueryString() != null && !request.getQueryString().isEmpty() && request.getParameter("message") != null) { | ||||
|                     try { | ||||
|                         Message resp = msgHandler.handleMessage(messageToolFactory.getObjectParser(Message.class).parse(request.getParameter("message"))); | ||||
|  | ||||
|                 response.getWriter().write(messageToolFactory.getObjectFormatter(Message.class).format(resp)); | ||||
|             }catch(Exception e){ | ||||
|                 e.printStackTrace(); | ||||
|                 response.getWriter().write(String.format("%s : %s", e.getClass().getName(), e.getMessage())); | ||||
|                 response.getWriter().write("StackTrace :"); | ||||
|                 e.printStackTrace(response.getWriter()); | ||||
|                         response.getWriter().write(messageToolFactory.getObjectFormatter(Message.class).format(resp)); | ||||
|                     } catch (Exception e) { | ||||
|                         e.printStackTrace(); | ||||
|                         response.getWriter().write(String.format("%s : %s", e.getClass().getName(), e.getMessage())); | ||||
|                         response.getWriter().write("StackTrace :"); | ||||
|                         e.printStackTrace(response.getWriter()); | ||||
|                     } | ||||
|                 } else { | ||||
|                     response.getWriter().write("Query message was not correctly made : " + request.getQueryString()); | ||||
|                 } | ||||
|             } | ||||
|         }else{ | ||||
|             response.getWriter().write("Query message was not correctly made : "+request.getQueryString()); | ||||
|         }catch (Throwable e){ | ||||
|             e.printStackTrace(); | ||||
|             response.getWriter().write(e.toString()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user