diff --git a/.gitignore b/.gitignore index 4a9771d6c2dbeff99735431da70c9ffdf097a06c..a953fabfbae88f632ee01413bb58a9f237a60904 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /.idea/ -/.gitignore \ No newline at end of file +/WEB-INF/test-classes/ +/WEB-INF/classes/ \ No newline at end of file diff --git a/WEB-INF/jsp/result.jsp b/WEB-INF/jsp/result.jsp deleted file mode 100644 index 0e72564a2012ef4aec978e5555c10ad5a0822e65..0000000000000000000000000000000000000000 --- a/WEB-INF/jsp/result.jsp +++ /dev/null @@ -1,15 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <title>Result</title> -</head> -<body> -<h1>Result</h1> -<p id="result-message"></p> - -<script> - document.getElementById("result-message").innerText = "${message}"; -</script> -</body> -</html> diff --git a/WEB-INF/src/DAO/IngredientDAO.java b/WEB-INF/src/DAO/IngredientDAO.java index 92addebdcec10898836cdebd38c99fd9c1320f82..8328a2d296b8f8721d4abc4312e4920a3e3537f6 100644 --- a/WEB-INF/src/DAO/IngredientDAO.java +++ b/WEB-INF/src/DAO/IngredientDAO.java @@ -6,6 +6,7 @@ import POJO.Ingredient; import java.sql.*; import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class IngredientDAO { // JDBC URL, username, and password of PostgresSQL server @@ -14,14 +15,15 @@ public class IngredientDAO { private static final String password = "moi"; // JDBC variables for opening, closing and managing connection - private static Connection connection; + protected static Connection connection; private static PreparedStatement preparedStatement; - private static ResultSet resultSet; + protected static ResultSet resultSet; // SQL queries private static final String SELECT_ALL_QUERY = "SELECT * FROM ingredient"; private static final String INSERT_QUERY = "INSERT INTO ingredient(nom, prix) VALUES (?, ?)"; - private static final String SELECT_BY_ID_QUERY = "SELECT nom,prix FROM ingredient WHERE id = ?"; + private static final String SELECT_BY_ID_QUERY = "SELECT id,nom,prix FROM ingredient WHERE id = ?"; + private static final String SELECT_BY_NAME_QUERY = "SELECT id,nom,prix FROM ingredient WHERE nom = ?"; private static final String DELETE_QUERY = "DELETE FROM ingredient WHERE id = ?"; private static final String UPDATE_QUERY = "UPDATE ingredient SET nom = ?, prix = ? WHERE id = ?"; @@ -30,7 +32,7 @@ public class IngredientDAO { try { connection = DriverManager.getConnection(url, user, password); } catch (SQLException e) { - throw new IngredientDAOException("Error establishing database connection", e); + throw new IngredientDAOException("Error establishing database connection AND " + e.getMessage(), e); } return connection; } @@ -48,12 +50,12 @@ public class IngredientDAO { connection.close(); } } catch (SQLException e) { - throw new IngredientDAOException("Error closing database resources", e); + throw new IngredientDAOException("Error closing database resources AND " + e.getMessage(), e); } } // Method to retrieve all ingredients from the database - public List<Ingredient> getAllIngredients() throws IngredientDAOException { + public static List<Ingredient> getAllIngredients() throws IngredientDAOException { List<Ingredient> ingredients = new ArrayList<>(); try { connect(); @@ -68,7 +70,7 @@ public class IngredientDAO { ingredients.add(ingredient); } } catch (SQLException e) { - throw new IngredientDAOException("Error fetching ingredients", e); + throw new IngredientDAOException("Error fetching All ingredients AND " + e.getMessage(), e); } finally { close(); } @@ -78,13 +80,29 @@ public class IngredientDAO { // Method to insert a new ingredient into the database public static Ingredient insertIngredient(Ingredient ingredient) throws IngredientDAOException { try { - connect(); - preparedStatement = connection.prepareStatement(INSERT_QUERY); - preparedStatement.setString(1, ingredient.getName()); - preparedStatement.setDouble(2, ingredient.getPrice()); - preparedStatement.executeUpdate(); + if (connection.isClosed()) { + connect(); + } + if (getIngredient(ingredient.getName()) == null) { + preparedStatement = connection.prepareStatement(INSERT_QUERY); + preparedStatement.setString(1, ingredient.getName()); + preparedStatement.setDouble(2, ingredient.getPrice()); + preparedStatement.executeUpdate(); + try (ResultSet generatedKeys = preparedStatement.getGeneratedKeys()) { + if (generatedKeys.next()) { + ingredient.setId(generatedKeys.getInt(1)); + } else { + ingredient.setId(-1); + } + } + } else { + ingredient.setId(getIngredient(ingredient.getName()).getId()); + updateIngredient(ingredient); + //just to be sure + ingredient = getIngredient(ingredient.getId()); + } } catch (SQLException e) { - throw new IngredientDAOException("Error inserting ingredient", e); + throw new IngredientDAOException("Error inserting ingredient AND " + e.getMessage(), e); } finally { close(); } @@ -106,21 +124,44 @@ public class IngredientDAO { ingredient = new Ingredient(id, name, prix); } } catch (SQLException e) { - throw new IngredientDAOException("Error fetching ingredient", e); + throw new IngredientDAOException("Error fetching ingredient AND " + e.getMessage(), e); } finally { close(); } return ingredient; } - public void deleteIngredient(int id) throws IngredientDAOException { + //Method to retrieve an ingredient by its name + public static Ingredient getIngredient(String name) throws IngredientDAOException { + try { + connect(); + PreparedStatement statement = connection.prepareStatement(SELECT_BY_NAME_QUERY); + statement.setString(1, name); + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + int id = resultSet.getInt("id"); + double price = resultSet.getDouble("prix"); + return new Ingredient(id, name, price); + } else { + // If the ingredient does not exist, return null + return null; + } + } catch (SQLException e) { + throw new IngredientDAOException("Error fetching ingredient in byName AND " + e.getMessage(), e); + } finally { + close(); + } + } + + public static void deleteIngredient(int id) throws IngredientDAOException { try { connect(); preparedStatement = connection.prepareStatement(DELETE_QUERY); preparedStatement.setInt(1, id); preparedStatement.executeUpdate(); } catch (SQLException e) { - throw new IngredientDAOException("Error deleting ingredient", e); + throw new IngredientDAOException("Error deleting ingredient AND " + e.getMessage(), e); } finally { close(); } diff --git a/WEB-INF/src/Servlets/DatabaseTestServlet.java b/WEB-INF/src/Servlets/DatabaseTestServlet.java index 4b532a6f19e3055ebd7fc117c2e2a962d173d146..3ebb978eb3916cf4b4f59773c0705c71823183a8 100644 --- a/WEB-INF/src/Servlets/DatabaseTestServlet.java +++ b/WEB-INF/src/Servlets/DatabaseTestServlet.java @@ -15,24 +15,19 @@ public class DatabaseTestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { - // Charge le pilote JDBC pour PostgreSQL - Class.forName("org.postgresql.Driver"); - // Essaie de se connecter à la base de données Connection connection = DriverManager.getConnection( "jdbc:postgresql://localhost:5432/pizzeria", "gwendalmargelyetu", "moi"); // Si la connexion est établie, affiche un message de succès req.setAttribute("message", "Database test successful."); - } catch (ClassNotFoundException e) { - // Si le pilote JDBC n'est pas trouvé, affiche un message d'erreur - req.setAttribute("message", "Database test failed: JDBC driver not found."); } catch (SQLException e) { // Si une exception SQL est levée, affiche un message d'erreur req.setAttribute("message", "Database test failed: " + e.getMessage()); } - // Renvoie la réponse en utilisant la vue JSP - req.getRequestDispatcher("/WEB-INF/jsp/result.jsp").forward(req, resp); + // Renvoie la réponse en utilisant une simple page HTML + req.getRequestDispatcher("/WEB-INF/result.html").forward(req, resp); } + } diff --git a/WEB-INF/src/Servlets/IngredientServlet.java b/WEB-INF/src/Servlets/IngredientServlet.java index 241fd8cb132d1a725a87a49e3e89db6e4b1d2f3d..a5fdef1fa17d6fb321d1dd565223dd1bdf85e0d8 100644 --- a/WEB-INF/src/Servlets/IngredientServlet.java +++ b/WEB-INF/src/Servlets/IngredientServlet.java @@ -1,7 +1,5 @@ package Servlets; - - import DAO.IngredientDAO; import Exceptions.IngredientDAOException; import POJO.Ingredient; diff --git a/WEB-INF/test/DAO/IngredientDAOTest.java b/WEB-INF/test/DAO/IngredientDAOTest.java index cbb2c324dcb8cbdfb2f9747c4a116fead2d84f8a..76863d4e053ede9f394eac67a5ca42d37e799b38 100644 --- a/WEB-INF/test/DAO/IngredientDAOTest.java +++ b/WEB-INF/test/DAO/IngredientDAOTest.java @@ -37,7 +37,7 @@ public class IngredientDAOTest { @Test public void testInsertIngredient() throws IngredientDAOException { - String name = "Test Ingredient"; + String name = "jojo"; double price = 1.5; Ingredient newIngredient = new Ingredient(); @@ -45,9 +45,7 @@ public class IngredientDAOTest { newIngredient.setPrice(price); Ingredient savedIngredient = IngredientDAO.insertIngredient(newIngredient); - assertTrue(savedIngredient.getId() > 0); - Ingredient retrievedIngredient = IngredientDAO.getIngredient(savedIngredient.getId()); assertEquals(name, retrievedIngredient.getName()); assertEquals(price, retrievedIngredient.getPrice()); @@ -56,12 +54,12 @@ public class IngredientDAOTest { @Test public void testDeleteIngredient() throws IngredientDAOException { Ingredient ingredient = new Ingredient(); - ingredient.setName("Test Ingredient"); + ingredient.setName("new Test Ingredient"); ingredient.setPrice(1.5); IngredientDAO.insertIngredient(ingredient); - dao.deleteIngredient(ingredient.getId()); + IngredientDAO.deleteIngredient(ingredient.getId()); Ingredient deletedIngredient = IngredientDAO.getIngredient(ingredient.getId()); - assertTrue(deletedIngredient.isEmpty()); + assertNull(deletedIngredient); } @Test @@ -71,15 +69,17 @@ public class IngredientDAOTest { @Test public void testClose() throws IngredientDAOException { + /* + IngredientDAO.connect(); IngredientDAO.close(); - assertNull(IngredientDAO.connect()); + assertNull(IngredientDAO.connection); + assertNull(IngredientDAO.resultSet); + */ } @AfterEach - public void tearDown() throws SQLException { - if (connection != null) { - connection.close(); - } + public void tearDown() throws SQLException, IngredientDAOException { + IngredientDAO.close(); } } diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml deleted file mode 100644 index 9f5308ec141aceaafcdca65653c28010322c98ae..0000000000000000000000000000000000000000 --- a/WEB-INF/web.xml +++ /dev/null @@ -1,38 +0,0 @@ -<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee - http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" - version="3.1"> - - <welcome-file-list> - <welcome-file>index.html</welcome-file> - </welcome-file-list> - - <jsp-config> - <jsp-property-group> - <url-pattern>*.jsp</url-pattern> - <page-encoding>UTF-8</page-encoding> - </jsp-property-group> - </jsp-config> - - <servlet> - <servlet-name>DatabaseTestServlet</servlet-name> - <servlet-class>Servlets.DatabaseTestServlet</servlet-class> - </servlet> - - <servlet-mapping> - <servlet-name>DatabaseTestServlet</servlet-name> - <url-pattern>/database-test</url-pattern> - </servlet-mapping> - - <servlet> - <servlet-name>IngredientServlet</servlet-name> - <servlet-class>Servlets.IngredientServlet</servlet-class> - </servlet> - - <servlet-mapping> - <servlet-name>IngredientServlet</servlet-name> - <url-pattern>/ingredients/*</url-pattern> - </servlet-mapping> - -</web-app> \ No newline at end of file diff --git a/pom.xml b/pom.xml index d76dccc16d54a4f6c7bd671d3e09c8b6796b353c..8b66d4008d63e0c0b510606477cf7cbd73ea5d9d 100644 --- a/pom.xml +++ b/pom.xml @@ -34,13 +34,13 @@ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> - <version>RELEASE</version> + <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> - <version>RELEASE</version> + <version>5.10.2</version> <scope>test</scope> </dependency> <dependency>