fix(DevWeb): Add Javadoc

This commit is contained in:
Lucàs
2024-03-20 17:18:44 +01:00
parent 6229718c4f
commit 07b5bdd926
18 changed files with 656 additions and 130 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
version: '2' version: '2'
services: services:
db: mysql-db:
image: mysql:latest image: mysql:latest
volumes: volumes:
- ./mysql:/docker-entrypoint-initdb.d - ./mysql:/docker-entrypoint-initdb.d
@@ -10,9 +10,19 @@ import uppa.project.dao.jpa.Game_JPA_DAO_Factory;
/** /**
* Factory renvoyant une factory de DAO en fonction du support de persistance choisi * Factory renvoyant une factory de DAO en fonction du support de persistance choisi
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/ */
public class AbstractDAOFactory { public class AbstractDAOFactory {
/**
* Renvoie une factory de DAO en fonction du support de persistance choisi
*
* @param type le support de persistance
* @return la factory de DAO
* @see PersistenceKind
*/
public static GameDAOFactory getDAOFactory(PersistenceKind type) { public static GameDAOFactory getDAOFactory(PersistenceKind type) {
if (type.equals(PersistenceKind.JPA)) return new Game_JPA_DAO_Factory(); if (type.equals(PersistenceKind.JPA)) return new Game_JPA_DAO_Factory();
return null; return null;
@@ -6,56 +6,86 @@
package uppa.project.dao; package uppa.project.dao;
import jakarta.persistence.TypedQuery; import jakarta.persistence.EntityManager;
import java.util.List;
import uppa.project.pojo.User;
/** /**
* DAO abstrait et générique pour tout type de données * DAO abstrait et générique pour tout type de données
* *
* @param <D> la classe paramétrant le DAO * @param <D> la classe paramétrant le DAO
* @author Kevin Mitressé
* @author Lucàs Vabre
*/ */
public abstract class DAO<D> { public abstract class DAO<D> {
public void DAO() throws DAOException { /**
* Gestionnaire d'entités
*/
protected EntityManager entityManager;
/**
* Constructeur par défaut
*
* @throws DAOException si une erreur survient lors de la création du DAO
*/
public DAO() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance();
} }
/** /**
* Retourne à partir du support de persistance un objet en fonction de son identifiant * Retourne l'objet {@link D} en fonction de son identifiant
* *
* @param id identifiant de l'objet * @param id identifiant de l'objet
* @return l'instance de l'objet * @return l'instance de l'objet {@link D}
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D
*/ */
public abstract D findById(int id) throws DAOException; public abstract D findById(int id) throws DAOException;
/**
* Retourne tous les objets {@link D} paramétrant le DAO
*
* @return un tableau d'objets {@link D}
* @throws DAOException en cas de problème
* @see D
*/
public abstract D[] findAll() throws DAOException; public abstract D[] findAll() throws DAOException;
/** /**
* Rend persistant un objet qui n'avait pas encore de réprésentation sur le support de persistance * Rend persistant un objet {@link D} qui n'avait pas encore de réprésentation sur le support de persistance
* *
* @param data l'objet à rendre persistant * @param data l'objet {@link D} à rendre persistant
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D
*/ */
public abstract void create(D data) throws DAOException; public abstract void create(D data) throws DAOException;
/** /**
* Met à jour le contenu correspondant à l'objet sur le support persistant (l'objet * Met à jour le contenu correspondant à l'objet {@link D} sur le support persistant (l'objet
* avait déjà une représentation sur le support persistant) * avait déjà une représentation sur le support persistant)
* *
* @param data l'objet modifié dont le contenu est à mettre à jour * @param data l'objet {@link D} modifié dont le contenu est à mettre à jour
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D
*/ */
public abstract void update(D data) throws DAOException; public abstract void update(D data) throws DAOException;
/** /**
* Efface du support persistant le contenu équivalent à l'objet * Efface du support persistant le contenu équivalent à l'objet {@link D}
* *
* @param data l'objet à supprimer * @param data l'objet {@link D} à supprimer
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see D
*/ */
public abstract void delete(D data) throws DAOException; public abstract void delete(D data) throws DAOException;
/**
* Retourne les objets {@link D} paramétrant le DAO en fonction d'un champ et d'une valeur
*
* @param field le champ à rechercher
* @param value la valeur à rechercher
* @return un tableau d'objets {@link D}
* @throws DAOException en cas de problème
* @see D
*/
public abstract D[] findByField(String field, String value) throws DAOException; public abstract D[] findByField(String field, String value) throws DAOException;
} }
@@ -8,13 +8,25 @@ package uppa.project.dao;
/** /**
* Exception spécifique aux problèmes d'accès aux données via un DAO * Exception spécifique aux problèmes d'accès aux données via un DAO
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see DAO
*/ */
public class DAOException extends Exception { public class DAOException extends Exception {
/**
* Constructeur par défaut
*/
public DAOException() { public DAOException() {
super(); super();
} }
/**
* Constructeur avec message
*
* @param message le message de l'exception
*/
public DAOException(String message) { public DAOException(String message) {
super(message); super(message);
} }
@@ -1,14 +1,27 @@
package uppa.project; /*
* EntityManagerProvider.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence; import jakarta.persistence.Persistence;
/**
* Fournisseur d'EntityManager
* Permet de récupérer une instance d'EntityManager
* pour les DAO
*
* @see jakarta.persistence.EntityManager
*/
public final class EntityManagerProvider { public final class EntityManagerProvider {
private final static String PERSISTANCE_UNIT_NAME = "db";
private static EntityManager instance; private static EntityManager instance;
private static EntityManagerFactory factory; private static EntityManagerFactory factory;
private final static String PERSISTANCE_UNIT_NAME = "db";
public static EntityManager getInstance() { public static EntityManager getInstance() {
if (factory == null) { if (factory == null) {
@@ -1,33 +1,41 @@
/* /*
* SportsDAOFactory.java, 09/02/2024 * GameDAOFactory.java, 20/03/2024
* UPPA M1 TI 2023-2024 * UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits * Pas de copyright, aucun droits
*/ */
package uppa.project.dao; package uppa.project.dao;
import uppa.project.pojo.*; import uppa.project.pojo.Game;
import uppa.project.pojo.Player;
import uppa.project.pojo.User;
/** /**
* Fabrique abstraite de DAO pour le schéma sports * Fabrique abstraite de DAO pour le schéma du jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/ */
public abstract class GameDAOFactory { public abstract class GameDAOFactory {
/** /**
* @return le DAO pour la classe/table User * @return le DAO pour la classe/table User
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see User
*/ */
public abstract DAO<User> getDAOUser() throws DAOException; public abstract DAO<User> getDAOUser() throws DAOException;
/** /**
* @return le DAO pour la classe/table Game * @return le DAO pour la classe/table Game
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see Game
*/ */
public abstract DAO<Game> getDAOGame() throws DAOException; public abstract DAO<Game> getDAOGame() throws DAOException;
/** /**
* @return le DAO pour la classe/table Player * @return le DAO pour la classe/table Player
* @throws DAOException en cas de problème * @throws DAOException en cas de problème
* @see Player
*/ */
public abstract DAO<Player> getDAOPlayer() throws DAOException; public abstract DAO<Player> getDAOPlayer() throws DAOException;
@@ -1,5 +1,5 @@
/* /*
* PersistenceKind.java, 09/02/2024 * PersistenceKind.java, 20/03/2024
* UPPA M1 TI 2023-2024 * UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits * Pas de copyright, aucun droits
*/ */
@@ -8,7 +8,12 @@ package uppa.project.dao;
/** /**
* Type de support de persistance pour les données * Type de support de persistance pour les données
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*
* @see AbstractDAOFactory
*/ */
public enum PersistenceKind { public enum PersistenceKind {
JDBC, JPA, XML JPA
} }
@@ -1,21 +1,35 @@
/**
* DAO_JPA_Game.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa; package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery; import jakarta.persistence.TypedQuery;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import uppa.project.EntityManagerProvider;
import uppa.project.dao.DAO; import uppa.project.dao.DAO;
import uppa.project.dao.DAOException; import uppa.project.dao.DAOException;
import uppa.project.pojo.Game; import uppa.project.pojo.Game;
import uppa.project.pojo.User;
/**
* DAO pour les parties de jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see Game
* @see DAO
*/
public class DAO_JPA_Game extends DAO<Game> { public class DAO_JPA_Game extends DAO<Game> {
private final EntityManager entityManager; /**
* Constructeur par défaut
*
* @throws DAOException si une erreur survient lors de la création du DAO
*/
public DAO_JPA_Game() throws DAOException { public DAO_JPA_Game() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance(); super();
} }
@Override @Override
@@ -25,6 +39,7 @@ public class DAO_JPA_Game extends DAO<Game> {
return result; return result;
} }
@Override
public Game[] findByField(String field, String value) throws DAOException { public Game[] findByField(String field, String value) throws DAOException {
TypedQuery<Game> query = entityManager.createQuery("SELECT u FROM Game u WHERE ?1=?2", Game.class); TypedQuery<Game> query = entityManager.createQuery("SELECT u FROM Game u WHERE ?1=?2", Game.class);
query.setParameter(1, field); query.setParameter(1, field);
@@ -1,21 +1,30 @@
/*
* DAO_JPA_Player.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa; package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery; import jakarta.persistence.TypedQuery;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import uppa.project.EntityManagerProvider;
import uppa.project.dao.DAO; import uppa.project.dao.DAO;
import uppa.project.dao.DAOException; import uppa.project.dao.DAOException;
import uppa.project.pojo.Player; import uppa.project.pojo.Player;
import uppa.project.pojo.User;
/**
* DAO pour les joueurs
*
* @author Kévin Mitresse
* @author Lucàs Vabre
* @see Player
* @see DAO
*/
public class DAO_JPA_Player extends DAO<Player> { public class DAO_JPA_Player extends DAO<Player> {
private final EntityManager entityManager;
public DAO_JPA_Player() throws DAOException { public DAO_JPA_Player() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance(); super();
} }
@Override @Override
@@ -25,6 +34,7 @@ public class DAO_JPA_Player extends DAO<Player> {
return result; return result;
} }
@Override
public Player[] findByField(String field, String value) throws DAOException { public Player[] findByField(String field, String value) throws DAOException {
TypedQuery<Player> query = entityManager.createQuery("SELECT p FROM Player p WHERE ?1=?2", Player.class); TypedQuery<Player> query = entityManager.createQuery("SELECT p FROM Player p WHERE ?1=?2", Player.class);
query.setParameter(1, field); query.setParameter(1, field);
@@ -1,20 +1,30 @@
/*
* DAO_JPA_User.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.dao.jpa; package uppa.project.dao.jpa;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery; import jakarta.persistence.TypedQuery;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import uppa.project.dao.DAO; import uppa.project.dao.DAO;
import uppa.project.dao.DAOException; import uppa.project.dao.DAOException;
import uppa.project.EntityManagerProvider;
import uppa.project.pojo.User; import uppa.project.pojo.User;
/**
* DAO pour les utilisateurs
*
* @author Kévin Mitresse
* @author Lucàs Vabre
* @see User
* @see DAO
*/
public class DAO_JPA_User extends DAO<User> { public class DAO_JPA_User extends DAO<User> {
private final EntityManager entityManager;
public DAO_JPA_User() throws DAOException { public DAO_JPA_User() throws DAOException {
this.entityManager = EntityManagerProvider.getInstance(); super();
} }
@Override @Override
@@ -13,13 +13,26 @@ import uppa.project.dao.GameDAOFactory;
/** /**
* Fabrique concrète de DAO pour le schéma relationnel sports avec une implémentation en JDBC. * Fabrique concrète de DAO pour le schéma relationnel sports avec une implémentation en JDBC.
*
* @author Kevin Mitressé
* @author Lucàs Vabre
* @see GameDAOFactory
*/ */
public class Game_JPA_DAO_Factory extends GameDAOFactory { public class Game_JPA_DAO_Factory extends GameDAOFactory {
/**
* DAO pour les utilisateurs
*/
private DAO_JPA_User daoUser = null; private DAO_JPA_User daoUser = null;
/**
* DAO pour les parties
*/
private DAO_JPA_Game daoGame = null; private DAO_JPA_Game daoGame = null;
/**
* DAO pour les joueurs
*/
private DAO_JPA_Player daoPlayer = null; private DAO_JPA_Player daoPlayer = null;
@Override @Override
@@ -1,29 +1,63 @@
/*
* Card.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo; package uppa.project.pojo;
public class Card {
/** /**
* The color of the card: * Représentation d'une carte
* Heart -> Coeur *
* Clubs -> Trèfle * @author Kevin Mitressé
* Spades -> Pique * @author Lucàs Vabre
* Diamonds -> Carreau */
public class Card {
/**
* Couleurs disponibles pour les cartes
*/ */
public enum Color{HEART, CLUBS, SPADES, DIAMONDS} public enum Color{HEART, CLUBS, SPADES, DIAMONDS}
/**
* Valeurs disponibles pour les cartes
*/
public enum Value{ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING} public enum Value{ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING}
/**
* Couleur de la carte
*/
private final Color color; private final Color color;
/**
* Valeur de la carte
*/
private final Value value; private final Value value;
/**
* Constructeur par défaut
*
* @param color couleur de la carte
* @param value valeur de la carte
*
* @see Color
* @see Value
*/
public Card(Color color, Value value) { public Card(Color color, Value value) {
this.color = color; this.color = color;
this.value = value; this.value = value;
} }
/**
* @return la couleur de la carte
*/
public Color getColor() { public Color getColor() {
return color; return color;
} }
/**
* @return la valeur de la carte
*/
public Value getValue() { public Value getValue() {
return value; return value;
} }
@@ -1,3 +1,9 @@
/*
* Deck.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo; package uppa.project.pojo;
import java.util.ArrayList; import java.util.ArrayList;
@@ -6,26 +12,81 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
/**
* Représentation d'un paquet de cartes
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class Deck { public class Deck {
/**
* Ensemble de cartes du paquet
* @see Card
*/
private Set<Card> cards; private Set<Card> cards;
/**
* Constructeur par défaut
*
* @param nbColors nombre de couleurs (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @see Card.Color
* @see Card.Value
*/
public Deck(int nbColors, int nbValues) { public Deck(int nbColors, int nbValues) {
cards = new HashSet<>(); cards = initializeDeck(nbColors, nbValues);
initializeDeck(nbColors, nbValues); }
shuffleDeck();
/**
* Créé un paquet de cartes mélangé avec un nombre de couleurs et de valeurs donné
*
* @param nbColors nombre de couleurs (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @return un ensemble de cartes mélangées
*/
private static Set<Card> initializeDeck(int nbColors, int nbValues) {
Set<Card> cards = createSetOfCard(nbColors, nbValues);
return shuffleSetOfCard(cards);
}
/**
* Créé un ensemble de cartes avec un nombre de couleurs et de valeurs donné
*
* @param nbColors nombre de couleurs à utiliser pour créer les cartes (doit être compris entre 1 et le nombre de couleurs de {@link Card.Color})
* @param nbValues nombre de valeurs à utiliser pour créer les cartes (doit être compris entre 1 et le nombre de valeurs de {@link Card.Value})
* @see Card.Color
* @see Card.Value
* @throws IllegalArgumentException si le nombre de couleurs ou de valeurs est incorrect
* @return un ensemble de cartes
*/
private static Set<Card> createSetOfCard(int nbColors, int nbValues) throws IllegalArgumentException {
Set<Card> cards = new HashSet<>();
if (nbColors < 1 || nbColors > Card.Color.values().length) {
throw new IllegalArgumentException("Le nombre de couleurs doit être compris entre 1 et " + Card.Color.values().length);
}
if (nbValues < 1 || nbValues > Card.Value.values().length) {
throw new IllegalArgumentException("Le nombre de valeurs doit être compris entre 1 et " + Card.Value.values().length);
} }
private void initializeDeck(int nbColors, int nbValues){
for (int i = 0; i < nbColors; i++) { for (int i = 0; i < nbColors; i++) {
for (int j = 0; j < nbValues; j++) { for (int j = 0; j < nbValues; j++) {
cards.add(new Card(Card.Color.values()[i], Card.Value.values()[j])); cards.add(new Card(Card.Color.values()[i], Card.Value.values()[j]));
} }
} }
return cards;
} }
private void shuffleDeck() { /**
* Mélange les cartes d'un paquet
*
* @param cards ensemble de cartes à mélanger
* @return un ensemble de cartes mélangées
*/
private static HashSet<Card> shuffleSetOfCard(Set<Card> cards) {
List<Card> cardList = new ArrayList<>(cards); List<Card> cardList = new ArrayList<>(cards);
Collections.shuffle(cardList); Collections.shuffle(cardList);
cards = new HashSet<>(cardList); return new HashSet<>(cardList);
} }
} }
@@ -1,3 +1,9 @@
/*
* Game.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo; package uppa.project.pojo;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
@@ -15,11 +21,16 @@ import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType; import jakarta.persistence.TemporalType;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date; import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
/**
* Représentation d'une partie de jeu
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity @Entity
@Table(name = "game") @Table(name = "game")
public class Game implements Serializable { public class Game implements Serializable {
@@ -36,19 +47,36 @@ public class Game implements Serializable {
@Column(name = "difficulty") @Column(name = "difficulty")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private User.Gender difficulty; private Difficulty difficulty;
@OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "game", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> players; private Set<Player> players;
/**
* Constructeur par défaut
*/
public Game() { public Game() {
} }
public Game(User.Gender difficulty) { /**
* Constructeur avec la difficulté
*
* @param difficulty la difficulté de la partie
* @see Difficulty
*/
public Game(Difficulty difficulty) {
this.difficulty = difficulty; this.difficulty = difficulty;
} }
public Game(BigDecimal id, Date createdAt, User.Gender difficulty, Set<Player> players) { /**
* Constructeur d'une partie de jeu
*
* @param id l'identifiant de la partie
* @param createdAt la date de création de la partie
* @param difficulty la difficulté de la partie
* @param players les joueurs de la partie
*/
public Game(BigDecimal id, Date createdAt, Difficulty difficulty, Set<Player> players) {
this.id = id; this.id = id;
this.createdAt = createdAt; this.createdAt = createdAt;
this.difficulty = difficulty; this.difficulty = difficulty;
@@ -59,41 +87,68 @@ public class Game implements Serializable {
public int hashCode() { public int hashCode() {
return Objects.hash(id, createdAt, players); return Objects.hash(id, createdAt, players);
} }
/**
* @return l'identifiant de la partie
*/
public BigDecimal getId() { public BigDecimal getId() {
return id; return id;
} }
/**
* @return la date de création de la partie
*/
public Date getCreatedAt() { public Date getCreatedAt() {
return createdAt; return createdAt;
} }
public User.Gender getDifficulty() { /**
* @return la difficulté de la partie
*/
public Difficulty getDifficulty() {
return difficulty; return difficulty;
} }
public void setDifficulty(User.Gender difficulty) { /**
* @param difficulty la nouvelle difficulté de la partie
* @see Difficulty
*/
public void setDifficulty(Difficulty difficulty) {
this.difficulty = difficulty; this.difficulty = difficulty;
} }
/**
* @return les joueurs de la partie
*/
public Set<Player> getPlayers() { public Set<Player> getPlayers() {
return players; return players;
} }
/**
* Modifie les joueurs de la partie
*
* @param players les nouveaux joueurs
*/
public void setPlayers(Set<Player> players) { public void setPlayers(Set<Player> players) {
this.players = players; this.players = players;
} }
public void addPlayers(Player player) { /**
* Ajoute un joueur à la partie
*
* @param player le joueur à ajouter
*/
public void addPlayer(Player player) {
this.players.add(player); this.players.add(player);
} }
@Override @Override
public String toString() { public String toString() {
return String.format("Game{id=%s, createdAt=%s, players=%s}", id.toString(), createdAt, players); return String.format("Game{id=%s, createdAt=%s, players=%s}", id.toString(), createdAt, players);
} }
/**
public static enum difficulty {EASY, HARD} * Difficulté possible d'une partie
*/
public enum Difficulty {EASY, HARD}
} }
@@ -1,3 +1,9 @@
/*
* Player.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo; package uppa.project.pojo;
import jakarta.persistence.Column; import jakarta.persistence.Column;
@@ -12,6 +18,12 @@ import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Objects; import java.util.Objects;
/**
* Représentation d'un joueur
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity @Entity
@Table(name = "player") @Table(name = "player")
public class Player implements Serializable { public class Player implements Serializable {
@@ -44,10 +56,16 @@ public class Player implements Serializable {
@Column(name = "rapid_click_count") @Column(name = "rapid_click_count")
private int rapidClickCount; private int rapidClickCount;
public Player() { /**
* Constructeur par défaut
} */
public Player() {}
/**
* Constructeur d'un joueur
* @param game la partie de jeu
* @param user l'utilisateur
*/
public Player(Game game, User user) { public Player(Game game, User user) {
this.game = game; this.game = game;
this.user = user; this.user = user;
@@ -58,6 +76,16 @@ public class Player implements Serializable {
this.rapidClickCount = 0; this.rapidClickCount = 0;
} }
/**
* Constructeur d'un joueur
* @param game la partie de jeu
* @param user l'utilisateur
* @param score le score
* @param winner si le joueur est gagnant
* @param clickCount le nombre de clics
* @param rightClickCount le nombre de clics corrects
* @param rapidClickCount le nombre de clics rapides
*/
public Player(Game game, User user, int score, boolean winner, int clickCount, int rightClickCount, int rapidClickCount) { public Player(Game game, User user, int score, boolean winner, int clickCount, int rightClickCount, int rapidClickCount) {
this.game = game; this.game = game;
this.user = user; this.user = user;
@@ -73,71 +101,140 @@ public class Player implements Serializable {
return Objects.hash(game, user, score, winner, clickCount, rightClickCount, rapidClickCount); return Objects.hash(game, user, score, winner, clickCount, rightClickCount, rapidClickCount);
} }
/**
* @return La partie de jeu du joueur
*/
public Game getGame() { public Game getGame() {
return game; return game;
} }
/**
* Modifie la partie de jeu du joueur
*
* @param game le nouveau jeu
*/
public void setGame(Game game) { public void setGame(Game game) {
this.game = game; this.game = game;
} }
/**
* @return l'utilisateur
*/
public User getUser() { public User getUser() {
return user; return user;
} }
/**
* Modifie l'utilisateur
*
* @param user le nouvel utilisateur
*/
public void setUser(User user) { public void setUser(User user) {
this.user = user; this.user = user;
} }
/**
* @return l'identifiant
*/
public int getScore() { public int getScore() {
return score; return score;
} }
/**
* Modifie le score
*
* @param score le nouveau score
*/
public void setScore(int score) { public void setScore(int score) {
this.score = score; this.score = score;
} }
/**
* Ajoute des points au score
*
* @param points les points à ajouter
*/
public void updateScore(int points) { this.score += points; } public void updateScore(int points) { this.score += points; }
/**
* @return si le joueur est gagnant
*/
public boolean isWinner() { public boolean isWinner() {
return winner; return winner;
} }
/**
* Déclare le joueur comme gagnant
*/
public void setWinner() { public void setWinner() {
this.winner = true; this.winner = true;
} }
/**
* @return le nombre de clics
*/
public int getClickCount() { public int getClickCount() {
return clickCount; return clickCount;
} }
/**
* Modifie le nombre de clics
*
* @param clickCount le nouveau nombre de clics
*/
public void setClickCount(int clickCount) { public void setClickCount(int clickCount) {
this.clickCount = clickCount; this.clickCount = clickCount;
} }
/**
* Incrémente de 1 le nombre de clics
*/
public void incrementClickCount() { public void incrementClickCount() {
clickCount++; clickCount++;
} }
/**
* @return le nombre de clics corrects
*/
public int getRightClickCount() { public int getRightClickCount() {
return rightClickCount; return rightClickCount;
} }
/**
* Modifie le nombre de clics corrects
*
* @param rightClickCount le nouveau nombre de clics corrects
*/
public void setRightClickCount(int rightClickCount) { public void setRightClickCount(int rightClickCount) {
this.rightClickCount = rightClickCount; this.rightClickCount = rightClickCount;
} }
/**
* Incrémente de 1 le nombre de clics corrects
*/
public void incrementRightClickCount() { public void incrementRightClickCount() {
rightClickCount++; rightClickCount++;
} }
/**
* @return le nombre de clics rapides
*/
public int getRapidClickCount() { public int getRapidClickCount() {
return rapidClickCount; return rapidClickCount;
} }
/**
* Modifie le nombre de clics rapides
*
* @param rapidClickCount le nouveau nombre de clics rapides
*/
public void setRapidClickCount(int rapidClickCount) { public void setRapidClickCount(int rapidClickCount) {
this.rapidClickCount = rapidClickCount; this.rapidClickCount = rapidClickCount;
} }
/**
* Incrémente de 1 le nombre de clics rapides
*/
public void incrementRapidClickCount() { public void incrementRapidClickCount() {
rapidClickCount++; rapidClickCount++;
} }
@@ -1,3 +1,9 @@
/*
* User.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.pojo; package uppa.project.pojo;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
@@ -21,6 +27,12 @@ import java.util.Date;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
/**
* Représentation d'un utilisateur
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
@Entity @Entity
@Table(name = "user") @Table(name = "user")
public class User implements Serializable { public class User implements Serializable {
@@ -29,29 +41,36 @@ public class User implements Serializable {
@Column(name = "id") @Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private BigDecimal id; private BigDecimal id;
@Column(name = "username") @Column(name = "username")
private String username; private String username;
@Column(name = "email") @Column(name = "email")
private String email; private String email;
@Column(name = "password") @Column(name = "password")
private String password; private String password;
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)
@Column(name = "birth") @Column(name = "birth")
private Date birth; private Date birth;
@Column(name = "gender") @Column(name = "gender")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private Gender gender; private Gender gender;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Player> playedGame; private Set<Player> playedGame;
/**
* Constructeur par défaut
*/
public User() { public User() {
} }
/**
* Constructeur d'un utilisateur
*
* @param username le pseudonyme
* @param email l'adresse email
* @param password le mot de passe
* @param birth la date de naissance
* @param gender le genre
*/
public User(String username, String email, String password, Date birth, Gender gender) { public User(String username, String email, String password, Date birth, Gender gender) {
this.username = username; this.username = username;
this.email = email; this.email = email;
@@ -60,6 +79,16 @@ public class User implements Serializable {
this.gender = gender; this.gender = gender;
} }
/**
* Constructeur d'un utilisateur
*
* @param id l'identifiant
* @param username le pseudonyme
* @param email l'adresse email
* @param password le mot de passe
* @param birth la date de naissance
* @param gender le genre
*/
public User(BigDecimal id, String username, String email, String password, Date birth, Gender gender) { public User(BigDecimal id, String username, String email, String password, Date birth, Gender gender) {
this.id = id; this.id = id;
this.username = username; this.username = username;
@@ -69,63 +98,13 @@ public class User implements Serializable {
this.gender = gender; this.gender = gender;
} }
@Override /**
public int hashCode() { * Hash le mot de passe en SHA-256
return Objects.hash(id, username, email, password, birth, gender); *
} * @param password le mot de passe à hasher
* @return le mot de passe hashé
public BigDecimal getId() { */
return id; private static String hashPassword(String password) {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = hashPassword(password);
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public int getAge() {
Date currentDate = new Date();
long diff = currentDate.getTime() - birth.getTime();
long diffDays = diff / (24 * 60 * 60 * 1000);
return (int) (diffDays / 365);
}
public static String hashPassword(String password) {
try { try {
MessageDigest digest = MessageDigest.getInstance("SHA-256"); MessageDigest digest = MessageDigest.getInstance("SHA-256");
@@ -144,6 +123,114 @@ public class User implements Serializable {
} }
} }
@Override
public int hashCode() {
return Objects.hash(id, username, email, password, birth, gender);
}
/**
* @return l'identifiant de l'utilisateur
*/
public BigDecimal getId() {
return id;
}
/**
* @return le pseudonyme de l'utilisateur
*/
public String getUsername() {
return username;
}
/**
* Modifie le pseudonyme de l'utilisateur
*
* @param username le nouveau pseudonyme
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return l'adresse email de l'utilisateur
*/
public String getEmail() {
return email;
}
/**
* Modifie l'adresse email de l'utilisateur
*
* @param email la nouvelle adresse email
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return le mot de passe hashé de l'utilisateur
*/
public String getPassword() {
return password;
}
/**
* Modifie le mot de passe de l'utilisateur
*
* @param password le nouveau mot de passe
*/
public void setPassword(String password) {
this.password = hashPassword(password);
}
/**
* @return la date de naissance de l'utilisateur
*/
public Date getBirth() {
return birth;
}
/**
* Modifie la date de naissance de l'utilisateur
*
* @param birth la nouvelle date de naissance
*/
public void setBirth(Date birth) {
this.birth = birth;
}
/**
* @return le genre de l'utilisateur
*/
public Gender getGender() {
return gender;
}
/**
* Modifie le genre de l'utilisateur
*/
public void setGender(Gender gender) {
this.gender = gender;
}
/**
* Calcule l'âge de l'utilisateur
*
* @return l'âge de l'utilisateur en années
*/
public int getAge() {
Date currentDate = new Date();
long diff = currentDate.getTime() - birth.getTime();
long diffDays = diff / (24 * 60 * 60 * 1000);
return (int) (diffDays / 365);
}
/**
* Prédicat qui vérifie si le mot de passe fourni est correct
*
* @param password le mot de passe à vérifier
* @return true si le prédicat est vérifié, false sinon
*/
public boolean verifyPassword(String password) { public boolean verifyPassword(String password) {
String hashedPassword = hashPassword(password); String hashedPassword = hashPassword(password);
return hashedPassword != null && hashedPassword.equals(this.password); return hashedPassword != null && hashedPassword.equals(this.password);
@@ -154,5 +241,8 @@ public class User implements Serializable {
return String.format("User{id=%s, username='%s', birth=%s, gender=%s}", id.toString(), username, birth.toString(), gender.toString()); return String.format("User{id=%s, username='%s', birth=%s, gender=%s}", id.toString(), username, birth.toString(), gender.toString());
} }
public static enum Gender {MALE, FEMALE, OTHER} /**
* Enumération des genres possibles
*/
public enum Gender {MALE, FEMALE, OTHER}
} }
@@ -1,30 +1,73 @@
/*
* ErrorApi.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.servlet.json; package uppa.project.servlet.json;
import com.google.gson.Gson; import com.google.gson.Gson;
/**
* Classe représentant une erreur pour l'API
*
* @author Kevin Mitresse
* @author Lucàs Vabre
*/
public class ErrorApi { public class ErrorApi {
/**
* Code HTTP de l'erreur
*/
private final int status; private final int status;
/**
* Type de l'erreur
*/
private final String error; private final String error;
/**
* Message d'erreur
*/
private final String message; private final String message;
/**
* Constructeur
*
* @param status code HTTP de l'erreur
* @param error type de l'erreur
* @param message message d'erreur
*/
public ErrorApi(int status, String error, String message) { public ErrorApi(int status, String error, String message) {
this.status = status; this.status = status;
this.error = error; this.error = error;
this.message = message; this.message = message;
} }
/**
* @return le code HTTP de l'erreur
*/
public int getStatus() { public int getStatus() {
return status; return status;
} }
/**
* @return le type de l'erreur
*/
public String getError() { public String getError() {
return error; return error;
} }
/**
* @return le message d'erreur
*/
public String getMessage() { public String getMessage() {
return message; return message;
} }
/**
* @return la représentation JSON de l'erreur
*/
public String toJson() { public String toJson() {
Gson gson = new Gson(); Gson gson = new Gson();
return gson.toJson(this); return gson.toJson(this);
@@ -1,10 +1,30 @@
/*
* RequestUtils.java, 20/03/2024
* UPPA M1 TI 2023-2024
* Pas de copyright, aucun droits
*/
package uppa.project.servlet.utils; package uppa.project.servlet.utils;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
public class RequestUtils { /**
* Classe utilitaire pour les requêtes HTTP
*
* @author Kevin Mitressé
* @author Lucàs Vabre
*/
public class HttpRequestUtils {
/**
* Récupère le corps de la requête HTTP
*
* @param request la requête HTTP
* @return le corps de la requête
* @throws IOException en cas de problème
*/
public static String getRequestBody(HttpServletRequest request) throws IOException { public static String getRequestBody(HttpServletRequest request) throws IOException {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
BufferedReader reader = request.getReader(); BufferedReader reader = request.getReader();