package com.example.dao;

// Importations nécessaires pour la manipulation de SQL, les requêtes HTTP et l'écriture de réponses
import java.sql.*;
import javax.servlet.http.*;

import com.example.util.ResultSetTableDisplay;
import com.example.util.ServletUtils;

import javax.json.JsonObject;

// Classe CouleurDAO implémente l'interface IGenericCRUD pour gérer les opérations CRUD sur les couleurs
public class CouleurDAO implements IGenericCRUD {

    private DatabaseConnection dbConnection;

    // Constructeur pour initialiser avec une instance de DatabaseConnection
    public CouleurDAO(DatabaseConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    // Méthode pour gérer les requêtes GET et renvoyer une réponse HTML
    public void handleGetHTML(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        dbConnection.connect();  // Connexion à la base de données

        response.setContentType("text/html");  // Définit le type de contenu de la réponse

        PrintWriter out = response.getWriter();  // Obtient un PrintWriter pour écrire la réponse

        // Appelle une méthode utilitaire pour afficher les résultats sous forme de tableau HTML
        ResultSetTableDisplay.displayHtmlTable(listAllCouleurs(), out);

        // Convertit les résultats en HTML pour un affichage ultérieur ou pour le débogage
        String couleurHtml = ResultSetTableDisplay.toHtmlTable(listAllCouleurs());
        System.out.println(couleurHtml);

        dbConnection.disconnect();  // Déconnexion de la base de données
    }

    // Méthode pour gérer les requêtes GET et renvoyer une réponse JSON
    @Override
    public void handleGet(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            dbConnection.connect();  // Connexion à la base de données
            ResultSet resultSet = listAllCouleurs();  // Exécute une requête pour lister toutes les couleurs

            // Convertit le résultat en JSON
            String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);

            // Envoie la réponse JSON
            ServletUtils.sendJsonResponse(response, jsonResponse);

            resultSet.close();  // Ferme le ResultSet
            dbConnection.disconnect();  // Déconnexion de la base de données
        } catch (SQLException ex) {
            // Gère les exceptions SQL et envoie une réponse d'erreur
            ServletUtils.handleSqlException(response, ex);
        } catch (Exception ex) {
            // Gère les autres exceptions et envoie une réponse d'erreur
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
        }
    }

    // Méthode pour gérer les requêtes POST (création de couleur) et renvoyer une réponse JSON
    @Override
    public void handlePost(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            JsonObject jsonObject = ServletUtils.parseJsonRequest(request);  // Parse le corps JSON de la requête

            // Récupère les valeurs 'nom' et 'hexadecimal_rvb' du JSON
            String nom = jsonObject.getString("nom", "");
            String hexadecimal_rvb = jsonObject.getString("hexadecimal_rvb", "");

            ServletUtils.validateRequestData(jsonObject, "nom", "hexadecimal_rvb");  // Valide les données

            // Insère la nouvelle couleur et obtient un ResultSet pour la couleur insérée
            ResultSet resultSet = insertCouleurAndGet(nom, hexadecimal_rvb);

            // Convertit le ResultSet en JSON
            String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);

            // Envoie la réponse JSON
            ServletUtils.sendJsonResponse(response, jsonResponse);
        } catch (SQLException ex) {
            // Gère les exceptions SQL
            ServletUtils.handleSqlException(response, ex);
        } catch (IOException ex) {
            // Gère les exceptions d'entrée/sortie
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
        } catch (Exception ex) {
            // Gère les autres exceptions
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error inserting color: " + ex.getMessage());
        }
    }

    // Méthode pour gérer les requêtes PUT (mise à jour de couleur) et renvoyer une réponse JSON
    @Override
    public void handlePut(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            JsonObject jsonObject = ServletUtils.parseJsonRequest(request);  // Parse le corps JSON de la requête

            // Récupère les données 'id', 'nom', et 'hexadecimal_rvb' du JSON
            int id = jsonObject.getInt("id");
            String nomCouleur = jsonObject.getString("nom", "");
            String hexadecimal_rvb = jsonObject.getString("hexadecimal_rvb", "");

            // Validation des données
            if (nomCouleur.isEmpty() || hexadecimal_rvb.isEmpty()) {
                ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Missing required fields");
                return;
            }

            // Mise à jour de la couleur
            boolean updated = updateCouleur(id, nomCouleur, hexadecimal_rvb);

            // Envoie une réponse en fonction du succès de la mise à jour
            if (updated) {
                ServletUtils.sendJsonResponse(response, "{\"message\": \"Color updated successfully.\"}");
            } else {
                ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, "Color not found or not updated");
            }
        } catch (NumberFormatException ex) {
            // Gère les exceptions de format de nombre
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid format for ID");
        } catch (SQLException ex) {
            // Gère les exceptions SQL
            ServletUtils.handleSqlException(response, ex);
        } catch (Exception ex) {
            // Gère les autres exceptions
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
        }
    }

    // Méthode pour gérer les requêtes DELETE (suppression de couleur) et renvoyer une réponse JSON
    @Override
    public void handleDelete(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            JsonObject jsonObject = ServletUtils.parseJsonRequest(request);  // Parse le corps JSON de la requête

            // Récupère l'ID de la couleur à supprimer
            int id = jsonObject.getInt("id");

            // Supprime la couleur
            boolean deleted = deleteCouleur(id);

            // Envoie une réponse en fonction du succès de la suppression
            if (deleted) {
                ServletUtils.sendJsonResponse(response, "{\"message\": \"Color deleted successfully.\"}");
            } else {
                ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, "Color not found or not deleted");
            }
        } catch (NumberFormatException ex) {
            // Gère les exceptions de format de nombre
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid format for ID");
        } catch (SQLException ex) {
            // Gère les exceptions SQL
            ServletUtils.handleSqlException(response, ex);
        } catch (Exception ex) {
            // Gère les autres exceptions
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
        }
    }

    // Méthode pour traiter les requêtes GET avec un paramètre ID spécifique
    @Override
    public void handleFindById(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            // Extrayez l'ID de la couleur à partir des paramètres de la requête
            int id = Integer.parseInt(request.getParameter("id"));

            // Récupérez la couleur par son ID
            ResultSet resultSet = findById(id);

            // Convertissez le ResultSet en JSON
            String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);

            // Envoyez la réponse JSON
            ServletUtils.sendJsonResponse(response, jsonResponse);

            // Fermez le ResultSet et déconnectez-vous de la base de données
            resultSet.close();
            dbConnection.disconnect();
        } catch (NumberFormatException ex) {
            // Gérez les exceptions de format de nombre
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_BAD_REQUEST, "Invalid ID format");
        } catch (SQLException ex) {
            // Gérez les exceptions SQL
            ServletUtils.handleSqlException(response, ex);
        } catch (Exception ex) {
            // Gérez les autres exceptions
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
        }
    }

    // Méthode pour traiter les requêtes GET avec un paramètre 'name' spécifique
    @Override
    public void handleFindByName(HttpServletRequest request, HttpServletResponse response) throws SQLException, IOException {
        try {
            String name = request.getParameter("name");
            ResultSet resultSet = findByName(name);

            String jsonResponse = ServletUtils.convertResultSetToJson(resultSet);
            ServletUtils.sendJsonResponse(response, jsonResponse);

            resultSet.close();
            dbConnection.disconnect();
        } catch (SQLException ex) {
            // Gérez les exceptions SQL
            ServletUtils.handleSqlException(response, ex);
        } catch (Exception ex) {
            // Gérez les autres exceptions
            ServletUtils.sendErrorResponse(response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server error: " + ex.getMessage());
        }
    }

    // Insère une couleur dans la base de données et renvoie un ResultSet avec la couleur insérée
    public ResultSet insertCouleurAndGet(String nom, String hexadecimal_rvb) throws SQLException {
        String insertSql = "INSERT INTO couleur (nom, hexadecimal_rvb) VALUES (?, ?)";
        String selectSql = "SELECT * FROM couleur WHERE id = ?";

        dbConnection.connect();  // Établissement de la connexion

        // Préparation de la requête d'insertion avec récupération des clés générées
        PreparedStatement insertStatement = dbConnection.getJdbcConnection().prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
        insertStatement.setString(1, nom);  // Paramètre 'nom'
        insertStatement.setString(2, hexadecimal_rvb);  // Paramètre 'hexadecimal_rvb'
        insertStatement.executeUpdate();  // Exécution de la requête d'insertion

        // Récupération de l'identifiant généré pour la nouvelle couleur
        ResultSet generatedKeys = insertStatement.getGeneratedKeys();
        if (!generatedKeys.next()) {
            throw new SQLException("Creating color failed, no ID obtained.");
        }
        int newColorId = generatedKeys.getInt(1);  // ID de la nouvelle couleur
        insertStatement.close();  // Fermeture de la déclaration d'insertion

        // Récupération de la couleur insérée en utilisant l'ID généré
        PreparedStatement selectStatement = dbConnection.getJdbcConnection().prepareStatement(selectSql);
        selectStatement.setInt(1, newColorId);  // Paramètre 'id'
        ResultSet resultSet = selectStatement.executeQuery();  // Exécution de la requête de sélection

        return resultSet;  // Retourne le ResultSet contenant la couleur insérée
    }

    // Liste toutes les couleurs présentes dans la base de données
    public ResultSet listAllCouleurs() throws SQLException {
        String sql = "SELECT * FROM couleur";  // Requête SQL pour sélectionner toutes les couleurs
        dbConnection.connect();  // Établissement de la connexion

        Statement statement = dbConnection.getJdbcConnection().createStatement();
        ResultSet resultSet = statement.executeQuery(sql);  // Exécution de la requête

        return resultSet;  // Retourne le ResultSet avec toutes les couleurs
    }

    // Met à jour une couleur spécifiée par son ID dans la base de données
    public boolean updateCouleur(int id, String nomCouleur, String hexadecimal_rvb) throws SQLException {
        String sql = "UPDATE couleur SET nom = ?, hexadecimal_rvb = ? WHERE id = ?";
        dbConnection.connect();  // Établissement de la connexion

        PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
        statement.setString(1, nomCouleur);  // Paramètre 'nom'
        statement.setString(2, hexadecimal_rvb);  // Paramètre 'hexadecimal_rvb'
        statement.setInt(3, id);  // Paramètre 'id'

        boolean rowUpdated = statement.executeUpdate() > 0;  // Exécution de la mise à jour et vérification du succès
        statement.close();  // Fermeture de la déclaration
        dbConnection.disconnect();  // Déconnexion de la base de données

        return rowUpdated;  // Retourne vrai si la mise à jour a réussi
    }

    // Supprime une couleur spécifiée par son ID de la base de données
    public boolean deleteCouleur(int id) throws SQLException {
        String sql = "DELETE FROM couleur WHERE id = ?";

        dbConnection.connect();  // Établissement de la connexion

        PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
        statement.setInt(1, id);  // Paramètre 'id'

        boolean rowDeleted = statement.executeUpdate() > 0;  // Exécution de la suppression et vérification du succès
        statement.close();  // Fermeture de la déclaration
        dbConnection.disconnect();  // Déconnexion de la base de données

        return rowDeleted;  // Retourne vrai si la suppression a réussi
    }

    // Récupère la dernière couleur insérée dans la base de données
    public ResultSet getLastInsertedColor() throws SQLException {
        String sql = "SELECT * FROM couleur ORDER BY id DESC LIMIT 1";

        // Établissement de la connexion non nécessaire ici car déjà connecté

        Statement statement = dbConnection.getJdbcConnection().createStatement();
        ResultSet resultSet = statement.executeQuery(sql);  // Exécution de la requête

        return resultSet;  // Retourne le ResultSet contenant la dernière couleur insérée
    }

    // Recherche une couleur par son ID
    public ResultSet findById(int id) throws SQLException {
        String sql = "SELECT * FROM couleur WHERE id = ?";
        dbConnection.connect();  // Établissement de la connexion

        PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
        statement.setInt(1, id);  // Paramètre 'id'

        ResultSet resultSet = statement.executeQuery();  // Exécution de la requête

        return resultSet;  // Retourne le ResultSet contenant la couleur recherchée
    }

    // Recherche une couleur par son nom
    public ResultSet findByName(String name) throws SQLException {
        String sql = "SELECT * FROM couleur WHERE nom = ?";
        dbConnection.connect();  // Établissement de la connexion

        PreparedStatement statement = dbConnection.getJdbcConnection().prepareStatement(sql);
        statement.setString(1, name);  // Paramètre 'nom'

        return statement.executeQuery();  // Exécution de la requête et retourne le ResultSet
    }
}

 

Le contrôleur CouleurDAO (Data Access Object) dans Java est un composant clé dans l'architecture de développement d'applications web qui interagit avec une base de données pour effectuer des opérations CRUD (Create, Read, Update, Delete) sur les données de couleur. Voici une explication détaillée adaptée à un cours Java :

Rôle et Fonctionnalité de CouleurDAO

  1. Interaction avec la Base de Données :

    • CouleurDAO sert de pont entre l'application Java et la base de données.
    • Il utilise JDBC (Java Database Connectivity) pour se connecter à la base de données et exécuter des requêtes SQL.
  2. Opérations CRUD :

    • Create (Créer) : Insère de nouvelles données de couleur dans la base de données.
    • Read (Lire) : Récupère les informations des couleurs depuis la base de données.
    • Update (Mettre à jour) : Modifie les données existantes de couleur dans la base de données.
    • Delete (Supprimer) : Efface les données de couleur de la base de données.
  3. Gestion des Requêtes HTTP :

    • CouleurDAO gère les requêtes HTTP envoyées par les clients (comme un navigateur web ou une application mobile).
    • Pour chaque type de requête (GET, POST, PUT, DELETE), il y a une méthode correspondante dans CouleurDAO qui traite la requête et génère une réponse.
  4. Conversion des Données :

    • Les données récupérées de la base de données sont converties en format JSON pour être facilement transmises et interprétées par le client.
    • Pour les requêtes GET spécifiques, il peut également convertir les résultats en un tableau HTML.
  5. Sécurité et Gestion des Exceptions :

    • CouleurDAO intègre des mesures pour gérer les exceptions SQL et les erreurs de connexion à la base de données.
    • Il assure la sécurité des données en empêchant les injections SQL et en gérant correctement les entrées utilisateurs.

Avantages de l'Utilisation de CouleurDAO

  • Modularité : Sépare la logique d'accès aux données de la logique métier de l'application.
  • Réutilisabilité : Peut être utilisé par différentes parties de l'application pour effectuer des opérations sur les données de couleur.
  • Maintenabilité : Facilite la maintenance et les mises à jour du code, car les modifications de la base de données ne nécessitent des changements que dans CouleurDAO.

Méthodes Appelées par les Gestionnaires dans CouleurDAO

  1. insertCouleur(String nom, String hexadecimal_rvb)

    • Fonction : Insère une nouvelle couleur dans la base de données.
    • Processus : Prend le nom de la couleur et sa valeur hexadécimale comme paramètres, puis exécute une requête SQL INSERT pour ajouter ces données dans la base.
  2. insertCouleurAndGet(String nom, String hexadecimal_rvb)

    • Fonction : Insère une couleur et récupère les informations de cette couleur insérée.
    • Processus :
      • Insère la couleur comme dans insertCouleur.
      • Récupère l'ID généré automatiquement lors de l'insertion.
      • Utilise cet ID pour récupérer et retourner les données de la couleur insérée.
  3. listAllCouleurs()

    • Fonction : Récupère toutes les couleurs de la base de données.
    • Processus : Exécute une requête SQL SELECT * pour récupérer toutes les entrées de la table des couleurs.
  4. updateCouleur(int id, String nomCouleur, String hexadecimal_rvb)

    • Fonction : Met à jour les informations d'une couleur spécifique dans la base de données.
    • Processus :
      • Reçoit l'ID de la couleur à mettre à jour, le nouveau nom et la valeur hexadécimale.
      • Exécute une requête SQL UPDATE pour appliquer ces mises à jour.
  5. deleteCouleur(int id)

    • Fonction : Supprime une couleur spécifique de la base de données.
    • Processus : Reçoit l'ID de la couleur à supprimer et exécute une requête SQL DELETE.
  6. findById(int id) et findByName(String name)

    • Fonction : Récupèrent respectivement une couleur par son ID ou son nom.
    • Processus : Exécutent des requêtes SQL SELECT basées sur l'ID ou le nom pour retourner la ou les couleurs correspondantes.
  7. getLastInsertedColor()

    • Fonction : Récupère la dernière couleur insérée dans la base de données.
    • Processus : Exécute une requête SQL SELECT avec ORDER BY id DESC LIMIT 1 pour récupérer la couleur la plus récemment ajoutée.

Conclusion

CouleurDAO est un élément crucial dans l'architecture MVC (Modèle-Vue-Contrôleur) des applications Java, assurant une interaction efficace et sécurisée entre l'application et la base de données. Son utilisation favorise un code propre, organisé et facile à gérer.

Chaque méthode dans CouleurDAO est conçue pour effectuer une tâche spécifique liée à la gestion des données de couleur. Ces méthodes sont appelées par les gestionnaires handleXXX en fonction du type de requête HTTP reçue (GET, POST, PUT, DELETE, etc.), permettant ainsi une gestion centralisée et efficace des opérations sur les données. La modularité et la clarté des méthodes dans CouleurDAO rendent le code plus lisible, maintenable et réutilisable, conformément aux bonnes pratiques de la programmation orientée objet en Java.

Modifié le: mercredi 22 novembre 2023, 05:56