📚 Documentation MateZone

Documentation technique complète basée sur le code source du projet.

📁 Structure du projet

Organisation des packages dans /src

💻

client/

Application cliente JavaFX avec architecture MVC.

  • MainClient.java
  • controleur/
  • ihm/
  • metier/
  • infrastructure/
🖥️

server/

Serveur WebSocket avec couche métier et accès BD.

  • MainServer.java
  • Protocol/webSocket/
  • metier/service/
  • bd/repository/
🔗

common/

Éléments partagés entre client et serveur.

  • dto/ChatEventDTO.java
  • protocol/EventEnum.java

💻 Client - Architecture MVC

Classes principales de l'application cliente

🚀 MainClient

Point d'entrée de l'application cliente. Charge la configuration depuis config.properties et lance le contrôleur.

// src/client/MainClient.java
public static void main(String[] args) {
    // Chargement config
    Properties props = new Properties();
    props.load(new FileInputStream("src/client/config.properties"));
    
    ADRESSE  = props.getProperty("server.URL");
    CHATPORT = Integer.parseInt(props.getProperty("serverChat.PORT"));
    IMGPORT  = Integer.parseInt(props.getProperty("serverImg.PORT"));
    
    // Lancement
    Controleur controleur = new Controleur(ADRESSE, CHATPORT, IMGPORT);
    controleur.lancerApp();
}
📖 Javadoc

🎮 Controleur

Contrôleur principal implémentant INotifieur. Orchestre l'IHM, le métier et la connexion WebSocket.

// src/client/controleur/Controleur.java
public class Controleur implements INotifieur {
    private IhmGui ihmGui;
    private Metier metier;
    
    public Controleur(String ADRESSE, int CHATPORT, int IMGPORT) {
        this.ihmGui = new IhmGui(this);
        
        INotifieur iNotifieur = this;
        IEnvoyeur iEnvoyeur = new WebSocketChatAdapter(
            "ws://" + ADRESSE + CHATPORT, iNotifieur
        );
        iEnvoyeur.connecter();
        
        this.metier = new Metier(iEnvoyeur, iNotifieur);
    }
    
    public void lancerApp() {
        this.ihmGui.lancerConnexionFrame();
    }
}
📖 Javadoc

⚙️ Metier

Couche métier gérant la logique business, l'état du client connecté et la création des ChatEventDTO.

// src/client/metier/Metier.java
public class Metier {
    private final IEnvoyeur iEnvoyeur;
    private final INotifieur iNotifieur;
    private int idChannel, idClient;
    private String pseudoClient;
    
    public void connecterAuClient(String pseudo, String mdp) {
        ChatEventDTO event = new ChatEventDTO(EventEnum.LOGIN)
            .add(EventEnum.LOGIN.getKeyIndex(0), pseudo)
            .add(EventEnum.LOGIN.getKeyIndex(1), mdp);
        
        this.iEnvoyeur.envoyer(event);
    }
    
    public void setClient(int idClient, String pseudoClient) {
        this.idClient = idClient;
        this.pseudoClient = pseudoClient;
        this.iNotifieur.succesLogin(this.pseudoClient);
    }
}
📖 Javadoc

🖼️ IhmGui

Gestion de l'interface graphique JavaFX via JavaFXApplicationManager. Affiche les fenêtres et notifie les événements.

// src/client/ihm/IhmGui.java
public class IhmGui {
    private Controleur controleur;
    private MateZoneFrame mateZoneFrame;
    private JavaFXApplicationManager javaFXManager;
    
    public void lancerConnexionFrame() {
        this.javaFXManager.creerEtAfficherConnexion(this.controleur);
    }
    
    public void lancerMateZoneFrame(String pseudo) {
        Platform.runLater(() -> {
            this.javaFXManager.fermerConnexion();
            this.mateZoneFrame = new MateZoneFrame(this.controleur);
            this.mateZoneFrame.afficherFrame();
        });
    }
    
    public void afficherNvMessage(ChatEventDTO eventDTO) {
        if (this.mateZoneFrame != null)
            Platform.runLater(() -> 
                this.mateZoneFrame.afficherNvMessage(eventDTO)
            );
    }
}
📖 Javadoc

🔌 Interfaces Client

IEnvoyeur

Interface d'envoi vers le serveur.

// src/client/metier/interfaces/IEnvoyeur.java
public interface IEnvoyeur {
    void envoyer(ChatEventDTO event);
    void connecter();
}

INotifieur

Interface de notification vers l'IHM.

// src/client/metier/interfaces/INotifieur.java
public interface INotifieur {
    void succesLogin(String pseudo);
    void afficherErreur(String message);
    void recevoirMessage(ChatEventDTO event);
    // ...
}

🌐 WebSocketChatAdapter

Adaptateur WebSocket implémentant IEnvoyeur. Gère la connexion et la sérialisation JSON via Gson.

// src/client/infrastructure/websocket/WebSocketChatAdapter.java
public class WebSocketChatAdapter extends WebSocketClient implements IEnvoyeur {
    private final INotifieur iNotifieur;
    private Gson gson = new Gson();
    
    public WebSocketChatAdapter(String serverUri, INotifieur iNotifieur) throws Exception {
        super(new URI(serverUri));
        this.iNotifieur = iNotifieur;
    }
    
    @Override
    public void envoyer(ChatEventDTO event) {
        if (!this.isOpen()) {
            System.err.println("Erreur serveur");
            return;
        }
        String json = gson.toJson(event);
        this.send(json);
    }
    
    @Override
    public void connecter() {
        if (!this.isOpen())
            this.connectBlocking();
    }
}

🖥️ Serveur - Architecture en couches

Classes principales du serveur MateZone

🚀 MainServer

Point d'entrée serveur. Initialise la BD, les repositories, les services et démarre les serveurs WebSocket et HTTP.

// src/server/MainServer.java
public static void main(String[] args) throws Exception {
    // 1) Connexion BD
    ConnexionBD bd = ConnexionBD.getInstance();
    
    // 2) Repositories
    IMessageRepository messageRepo = new MessageRepository();
    IUtilisateurRepository userRepo = new UtilisateurRepository();
    
    // 3) Services Métier
    ClientService userService = new ClientService(userRepo, messageRepo);
    
    // 4) Serveur WebSocket
    WebSocketMateZone wsServer = new WebSocketMateZone(PORTMESS, userService);
    wsServer.start();
    userService.setIWebSocketMateZone(wsServer);
    
    // 5) Serveur HTTP avatar
    MainServer.startAvatarServer(userRepo);
}
📖 Javadoc

🔌 WebSocketMateZone

Serveur WebSocket principal implémentant IWebSocketMateZone. Gère les connexions et dispatch vers ClientService.

// src/server/Protocol/webSocket/WebSocketMateZone.java
public class WebSocketMateZone extends WebSocketServer 
                               implements IWebSocketMateZone {
    private ClientService clientService;
    private HashMap<WebSocket, Integer> hsClientChannel;
    
    @Override
    public void onMessage(WebSocket client, String message) {
        ChatEventDTO event = ChatEventDTO.jsonToEventDTO(message);
        
        switch (event.getType()) {
            case LOGIN:
                clientService.handleLogin(client, event);
                break;
            case SIGNUP:
                clientService.handleSignup(client, event);
                break;
            case NEW_MESSAGE:
                clientService.handleNewMessage(client, event);
                break;
            case NEW_CHANNEL:
                clientService.handleNewChannel(client, event);
                break;
        }
    }
    
    public void broadcast(int idChannel, ChatEventDTO event) {
        for (WebSocket client : hsClientChannel.keySet()) {
            if (hsClientChannel.get(client) == idChannel)
                client.send(event.toJson());
        }
    }
}
📖 Javadoc

👤 ClientService

Service métier gérant l'authentification, l'inscription, l'envoi de messages et la gestion des canaux.

// src/server/metier/service/ClientService.java
public class ClientService {
    private final IUtilisateurRepository iUserRep;
    private final IMessageRepository iMesRep;
    private IWebSocketMateZone iWebSocketMateZone;
    
    public void handleLogin(WebSocket client, ChatEventDTO eventRec) {
        String pseudo = (String) eventRec.getDataIndex(0);
        String mdp = (String) eventRec.getDataIndex(1);
        
        int idClient = this.iUserRep.authenticate(pseudo, mdp);
        
        if (idClient == -1) {
            ChatEventDTO error = new ChatEventDTO(EventEnum.ERROR)
                .add(EventEnum.ERROR.getKeyIndex(0), "Client introuvable");
            client.send(error.toJson());
        } else {
            ChatEventDTO success = new ChatEventDTO(EventEnum.SUCCESS_LOGIN)
                .add(EventEnum.SUCCESS_LOGIN.getKeyIndex(0), idClient)
                .add(EventEnum.SUCCESS_LOGIN.getKeyIndex(1), pseudo);
            client.send(success.toJson());
        }
    }
}
📖 Javadoc

🗄️ ConnexionBD

Singleton gérant la connexion MySQL. Charge la configuration depuis config.properties.

// src/server/bd/ConnexionBD.java
public class ConnexionBD {
    private static ConnexionBD instance;
    private static String URL, USERNAME, PASSWORD;
    private Connection connection;
    
    static {
        Properties props = new Properties();
        props.load(new FileInputStream("src/server/config.properties"));
        URL = props.getProperty("db.url");
        USERNAME = props.getProperty("db.username");
        PASSWORD = props.getProperty("db.password");
    }
    
    private ConnexionBD() {
        Class.forName("com.mysql.cj.jdbc.Driver");
        this.connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }
    
    public static ConnexionBD getInstance() {
        if (instance == null)
            instance = new ConnexionBD();
        return instance;
    }
    
    public Connection getConnection() {
        return this.connection;
    }
}
📖 Javadoc

📦 Repositories

UtilisateurRepository

Implémente IUtilisateurRepository. Gère CRUD et authentification des clients.

// src/server/bd/repository/UtilisateurRepository.java
public class UtilisateurRepository implements IUtilisateurRepository {
    private ConnexionBD connexionBD;
    
    public int authenticate(String pseudo, String mdp) {
        String sql = "SELECT id, mdp FROM clients WHERE pseudo = ?";
        // Vérifie le hash avec PasswordUtil
    }
    
    public Client getClientById(int id) { ... }
    public void createClient(String pseudo, String mdp) { ... }
}

MessageRepository

Implémente IMessageRepository. Gère l'envoi et la récupération des messages.

// src/server/bd/repository/MessageRepository.java
public class MessageRepository implements IMessageRepository {
    private ConnexionBD connexionBD;
    
    public int sendMessage(int groupe_id, int idUser, String message) {
        String sql = "INSERT INTO messages " +
            "(groupe_id, expediteur_id, contenu) VALUES (?, ?, ?)";
        // Exécute et retourne l'ID du message
    }
    
    public List<Message> getMessages(int groupeId) { ... }
}

🔗 Common - Éléments partagés

Classes utilisées par le client ET le serveur

📦 ChatEventDTO

DTO (Data Transfer Object) standardisant les échanges JSON entre client et serveur.

// src/common/dto/ChatEventDTO.java
public class ChatEventDTO {
    private EventEnum type;
    private Map<String, Object> data;
    private List<ChatEventDTO> lstEventDTO;
    
    // Constructeurs
    public ChatEventDTO() { this.data = new HashMap<>(); }
    public ChatEventDTO(EventEnum type) { this(); this.type = type; }
    public ChatEventDTO(EventEnum type, List<ChatEventDTO> lst) { ... }
    
    // Builder pattern
    public ChatEventDTO add(String key, Object value) {
        this.data.put(key, value);
        return this;
    }
    
    // Sérialisation JSON (Gson)
    public String toJson() {
        return new Gson().toJson(this);
    }
    
    public static ChatEventDTO jsonToEventDTO(String json) {
        return new Gson().fromJson(json, ChatEventDTO.class);
    }
    
    // Accès par index selon EventEnum
    public Object getDataIndex(int index) {
        String key = this.type.getRequiredKeys().get(index);
        return this.data.get(key);
    }
}
📖 Javadoc

🏷️ EventEnum

Énumération définissant tous les types d'événements et leurs clés requises.

// src/common/protocol/EventEnum.java
public enum EventEnum {
    LOGIN(List.of("pseudo", "mdp")),
    SIGNUP(List.of("pseudo", "mdp")),
    SUCCESS_LOGIN(List.of("id", "pseudo")),
    SUCCESS_SIGNUP(List.of("id", "pseudo")),
    NEW_CHANNEL(List.of("idChannel")),
    MESSAGE(List.of("idClient", "pseudo", "contenu", "date")),
    MESSAGE_LIST(List.of()),
    NEW_MESSAGE(List.of("idClient", "idChannel", "contenu")),
    NEW_MESSAGE_IMG(List.of("IdGroupe", "idClient", "byte")),
    SUCCESS(List.of("message")),
    ERROR(List.of("message")),
    PERMS_CHANNELS(List.of()),
    PERM_CHANNEL(List.of("idChannel", "nomChannel")),
    CHANGER_CHANNEL(List.of("idChannel"));
    
    private final List<String> composants;
    
    public List<String> getRequiredKeys() {
        return this.composants;
    }
    
    public String getKeyIndex(int index) {
        if (index >= this.composants.size()) return null;
        return this.composants.get(index);
    }
}
📖 Javadoc

⚙️ Fichiers de configuration

Paramétrage du client et du serveur

📄 Client - config.properties

Configuration de la connexion au serveur.

# src/client/config.properties

# Adresse du serveur WebSocket
server.URL=127.0.0.1:

# Port du serveur de chat
serverChat.PORT=8080

# Port du serveur d'images
serverImg.PORT=8081

📄 Server - config.properties

Configuration du serveur et de la base de données.

# src/server/config.properties

# Base de données MySQL
db.url=jdbc:mysql://localhost:3306/matezone
db.username=root
db.password=votre_mot_de_passe

# Port du serveur WebSocket
server.port=8080

# Port du serveur HTTP (avatars)
web.port=8081

⚠️ Sécurité

Ne committez jamais vos identifiants réels dans config.properties. Utilisez des variables d'environnement ou un fichier .env ignoré par Git.

📋 Récapitulatif des classes

Vue d'ensemble de toutes les classes du projet

Classe Package Responsabilité Javadoc
MainClient client Point d'entrée client, charge config et lance Controleur 📖
Controleur client.controleur Contrôleur MVC, implémente INotifieur 📖
Metier client.metier Logique métier client, création des ChatEventDTO 📖
IhmGui client.ihm Gestionnaire de l'interface JavaFX 📖
WebSocketChatAdapter client.infrastructure.websocket Adaptateur WebSocket implémentant IEnvoyeur 📖
MainServer server Point d'entrée serveur, initialise BD et services 📖
WebSocketMateZone server.Protocol.webSocket Serveur WebSocket, dispatch vers ClientService 📖
ClientService server.metier.service Service métier (login, signup, messages, canaux) 📖
ConnexionBD server.bd Singleton de connexion MySQL 📖
UtilisateurRepository server.bd.repository CRUD et authentification des clients 📖
MessageRepository server.bd.repository Gestion des messages en BD 📖
ChatEventDTO common.dto DTO standardisé pour échanges JSON 📖
EventEnum common.protocol Énumération des types d'événements et clés requises 📖

📚 Ressources complémentaires

Documentation et liens utiles

📖

Javadoc complète

Documentation générée automatiquement de toutes les classes, méthodes et interfaces.

Consulter la Javadoc
🔌

Protocole WebSocket

Documentation détaillée du protocole de communication avec exemples JSON.

Voir le protocole
🗄️

Base de données

Structure des tables MySQL, relations et exemples de requêtes.

Voir la BDD