package fr.iutfbleau.projetIHM2022FI2.MNP; import fr.iutfbleau.projetIHM2022FI2.API.*; import java.sql.Connection; import org.mariadb.jdbc.*; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.PreparedStatement; import java.sql.SQLException; import javax.swing.JFrame; import javax.swing.JOptionPane; import java.util.*; /** * Usine abstraite gérant l'ensemble des changements. * */ public class AbstractChangementFactoryNP implements AbstractChangementFactory { // l'usine à groupe travaillant en tandem avec cette usine. private AbstractGroupeFactory agf; private JFrame fenetre; // On utilise une table de hachage pour retrouver facilement un changement (à partir de son id). // Si il y a beaucoup de changements c'est plus rapide que de parcourir toute une liste. private HashMap brain; public AbstractChangementFactoryNP(AbstractGroupeFactory agf, JFrame fenetre){ Objects.requireNonNull(agf,"On ne peut pas créer une usine à changement dont l'usine à groupe parternaire est null"); this.agf=agf; this.fenetre=fenetre; this.brain=new HashMap(); } /** * permet de récupérer l'usine abstraite pour les groupes qui fonctionne en tandem avec cette usine abstraite * @return cette usine abstraite pour les groupes */ public AbstractGroupeFactory getGroupeFactory(){ return this.agf; } /** * permet de récupérer les changements * @return l'ensemble de tous les changements en attente */ public Set getAllChangements(){ // la méthode value() d'un hashmap retourne la collection des valeurs. // Il faut transformer la collection en Set. // Un constructeur de HashSet permet de faire cette opération. Set out = new HashSet(this.brain.values()); return out; } /** * permet de mettre en oeuvre un changement connu de l'usine abstraite. * * @throws java.lang.NullPointerException si un argument est null * @throws java.lang.IllegalStateException si le changement n'a pas de sens en l'état actuel (e.g. étudiant pas dans le groupe de départ a, groupe b inconnu, groupe a inconnu, etc). * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite */ public void applyChangement(Changement c){ Objects.requireNonNull(c,"On ne peut pas appliquer un changement qui est null"); Etudiant e = c.getEtu(); Groupe a = c.getA(); Groupe b = c.getB(); if (!agf.knows(a)) throw new IllegalStateException("Le groupe de départ du changement est inconnu. Impossible à mettre en oeuvre."); if (!agf.knows(b)) throw new IllegalStateException("Le groupe d'arrivée du changement est inconnu. Impossible à mettre en oeuvre."); // pas encore implanté. // if(!agf.getGroupesOfEtudiant(e).contains(a)) throw new IllegalStateException("Le groupe de départ ne contient pas l'étudiant. Impossible à mettre en oeuvre."); agf.dropFromGroupe(a,e); agf.addToGroupe(b,e); // En cas de succès, on enlève le changement du cerveau this.brain.remove(Integer.valueOf(c.getId())); } /** * permet de supprimer un changement connu de l'usine abstraite. * * @throws java.lang.NullPointerException si un argument est null * @throws java.lang.IllegalArgumentException si inconnu de l'usine abstraite */ public void deleteChangement(Changement c){ Objects.requireNonNull(c,"On ne peut pas demander la suppression d'un changement qui est null"); this.brain.remove(Integer.valueOf(c.getId())); } /** * permet d'ajouter un nouveau changement. * * @param A groupe actuel * @param B groupe demandé * @param e étudiant concerné par le changement * * @throws java.lang.NullPointerException si un argument est null * @throws java.lang.IllegalArgumentException si les groupes ou l'étudiant ne sont pas connus de la factory partenaire, ou e n'appartient pas à A ou A et B ne sont pas frères dans l'arbre des groupes. * */ public void createChangement(Groupe A, Etudiant e, Groupe B){ Objects.requireNonNull(A,"Le groupe d'origine ne peut pas être null"); Objects.requireNonNull(B,"Le groupe d'arrivée ne peut pas être null"); Objects.requireNonNull(e,"L'étudiant ne peut pas être null"); Changement c = new ChangementNP(A,e,B); this.brain.put(Integer.valueOf(c.getId()),c); Connection cnx=this.cnx(); try{ PreparedStatement pst=cnx.prepareStatement("INSERT INTO `Changement` (`idGroupeA`, `idGroupeB`, `idEtudiant`) VALUES (?, ?, ?);"); pst.setInt(1, A.getId()); pst.setInt(2, B.getId()); pst.setInt(3, e.getId()); pst.executeUpdate(); pst.close(); }catch(SQLException er){ if(this.erreurSQL()){ this.createChangement(A, e, B); }else{ return; } } this.close(cnx); } // ********************** // FONCTION POUR SIMPLIFIER LES Modification BD // *********************** private Connection cnx(){ //On se Connecte a la BD try{ Class.forName("org.mariadb.jdbc.Driver"); Connection cnx = DriverManager.getConnection( "jdbc:mariadb://dwarves.iut-fbleau.fr/chaignea", "chaignea", "Chaigneauphpmyadmin"); return cnx; }catch(Exception e){ if(this.erreurCO()==true){ return this.cnx(); } } return null; } private boolean erreurCO(){ if(JOptionPane.showConfirmDialog(this.fenetre, "erreur connection a la BD reassayer?", "erreur connection", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ return true; }else{ this.fenetre.dispose(); return false; } } private boolean erreurSQL(){ if(JOptionPane.showConfirmDialog(this.fenetre, "erreur lors de la modification, reasssayer?", "erreur SQL", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION){ return true; }else{ return false; } } private void close(AutoCloseable clos){ try{ clos.close(); }catch(Exception e){ if(this.erreurCO()==true) this.close(clos); } } }