Quelques corrections de bug

This commit is contained in:
Marino Benassai 2021-02-15 22:12:16 +01:00
parent 05138211a3
commit 09f20b72d9
23 changed files with 157 additions and 204 deletions

View file

@ -1,6 +1,7 @@
package bdd;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -46,7 +47,9 @@ public class GestionnaireHistorique {
String id = combiner(id1, id2);
Statement st = null;
Statement st1 = null;
Statement st2 = null;
int rs1;
ResultSet rs2 = null;
Connection con = null;
@ -65,11 +68,12 @@ public class GestionnaireHistorique {
try {
con = Liaison.getConnection();
st = con.createStatement();
rs1 = st.executeUpdate(query1);
rs2 = st.executeQuery(query2);
st1 = con.createStatement();
st2 = con.createStatement();
rs1 = st1.executeUpdate(query1);
rs2 = st2.executeQuery(query2);
@ -80,9 +84,7 @@ public class GestionnaireHistorique {
}
// à mettre dans un finally
rs2.close();
st.close();
con.close();
}
@ -90,6 +92,32 @@ public class GestionnaireHistorique {
System.out.println("Erreur : Historic BDD");
e.printStackTrace();
}
finally {
try {
if (rs2 != null) rs2.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (st1 != null) st1.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (st2 != null) st2.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (con != null) con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return history.toString();
@ -101,28 +129,39 @@ public class GestionnaireHistorique {
String id = combiner(id1, id2);
Statement st;
int rs;
Connection con = null;
PreparedStatement st = null;
int rs = 0;
String query = "INSERT INTO " + id
+ " (expediteur, msg) VALUES ('" + expediteur + "', '" + msg + "');"; //à réécrire pour éviter les injections
String query = "INSERT INTO " + id + " (expediteur, msg) VALUES (?, ?);";
try {
Connection con = Liaison.getConnection();
con = Liaison.getConnection();
st = con.createStatement();
rs = st.executeUpdate(query);
st = con.prepareStatement(query);
st.setString(1, expediteur);
st.setString(2, msg);
rs = st.executeUpdate();
// à mettre dans un finally
st.close();
con.close();
} catch (SQLException e) {
System.out.println("Erreur : Historic BDD");
e.printStackTrace();
}
finally
{
try {
if (st != null) st.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

View file

@ -8,7 +8,7 @@ import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import data.ServletResponse;
import defaut.Constantes;
import defaut.Constante;
import data.Message;
public class EnvoiMessageDistance {
@ -31,7 +31,7 @@ public class EnvoiMessageDistance {
//URL url = new URL("http://localhost:8080/Servlet_MBP/messageServlet");
URL url = new URL(Constantes.URL_SERVLET_MESSAGES);
URL url = new URL(Constante.URL_SERVLET_MESSAGES);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//On configure la requête POST

View file

@ -13,8 +13,8 @@ public class GestionnaireSessionsLocales implements Runnable{
public static final int BACKLOG = 10;
private static GestionnaireSessionsLocales uniqueInstance = null;
private ConcurrentHashMap <String, SessionClavardageLocale> sessions = new ConcurrentHashMap <String, SessionClavardageLocale>();
private TCPServer requestServer;
private Thread thread;
private TCPServer requestServer = null;
private Thread thread = null;
public static GestionnaireSessionsLocales instance() {
if (uniqueInstance == null) {
@ -23,13 +23,15 @@ public class GestionnaireSessionsLocales implements Runnable{
return GestionnaireSessionsLocales.uniqueInstance;
}
//TODO Ajouter la suppression des sessions de la liste après déconnexion
private GestionnaireSessionsLocales(int backlog) {
GestionnaireNom gn = GestionnaireNom.instance();
System.out.print(gn.getIp());
this.requestServer = new TCPServer(gn.getIp(), backlog, PORT_REQUETE_NOUVELLE_SESSION + Integer.parseInt(gn.getId()));
this.thread = new Thread(this);
this.thread.start();
//On ne lance le serveur que si le client est local
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireNom gn = GestionnaireNom.instance();
System.out.print(gn.getIp());
this.requestServer = new TCPServer(gn.getIp(), backlog, PORT_REQUETE_NOUVELLE_SESSION + Integer.parseInt(gn.getId()));
this.thread = new Thread(this);
this.thread.start();
}
}
public void createSession(String name) {
@ -66,6 +68,7 @@ public class GestionnaireSessionsLocales implements Runnable{
public void run() {
GestionnaireNom gn = GestionnaireNom.instance();
//On ne lance pas le thread pour les clients à distance
while (gn.getDansReseau()) {
Socket ssocket = this.requestServer.accept();

View file

@ -52,6 +52,7 @@ public class SessionClavardageLocale extends SessionClavardage{
}
public void sendObject(Message message) throws IOException {
System.out.println("L'envoi de l'objet se fait en local");
this.clientEmission.sendObject(message);
}

View file

@ -1,23 +0,0 @@
package data;
import java.time.*;
import javax.swing.JLabel;
public abstract class AbstractData {//TODO Etendre Abstractdata à imagedata et filedata et utiliser ces objets au lieu des strings lors des échanges en local, comme pour le servlet
private Instant dateEnvoi;
private String expediteur;
private String data;
public AbstractData(Instant dateEnvoi, String expediteur, String data) {
this.dateEnvoi = dateEnvoi;
this.expediteur = expediteur;
this.data = data;
}
public String getData() {
return this.data;
}
public abstract JLabel afficher();
}

View file

@ -1,17 +0,0 @@
package data;
import java.time.Instant;
import javax.swing.JLabel;
public class StringData extends AbstractData {
public StringData(Instant dateEnvoi, String expediteur, String string) {
super(dateEnvoi, expediteur, string);
}
public JLabel afficher() {
return new JLabel(this.getData());
}
}

View file

@ -1,10 +1,19 @@
package defaut;
public class Constantes {
public class Constante {
public static final String IP_BROADCAST = "255.255.255.255";
public static final int SIZE_ORDRE = 100;
public static final int NUM_PORT_SERVER_UDP = 2000;
public static final String URL_SERVLET_MESSAGES = "https://srv-gei-tomcat.insa-toulouse.fr/Servlet_MBP/messageServlet";
public static final String URL_SERVLET_PRESENCE = "https://srv-gei-tomcat.insa-toulouse.fr/Servlet_MBP/Servlet";
//Intervalle, en seconde, entre les requêtes envoyés périodiquement par chaque client au servlet
public static final float POLL_FREQUENCY = 1;
public static final boolean debug = true; // indique si l'on debug en local sur un seul ordinateur
}

View file

@ -1,52 +1,18 @@
package defaut;
import java.io.IOException;
import liste.GestionnaireListeUtilisateur;
import ui.Login_RegisterUI;
import servlet.Get;
import servlet.Notify;
public class Main {
public static final int UDP_SERVER_PORT_DEBUG = 2004;
public static void main(String[] args) {
// les méthode finnissant par 2 sont le double de celle sans 2, servant à tester en local
if (liste.Constante.debug) {
// les méthode finissant par 2 sont le double de celle sans 2, servant à tester en local.
//Elles sont utilisés lorsque la constante debug vaut true
//on lance le server d'écoute de cmd
//GestionnaireListeUtilisateur.instance().ecoute2(2001);
//on crée manuellement des utilisateurs //debug1
//GestionnaireListeUtilisateur.instance().envoie2("add$$$77$$$Moidebug$$$LocalHost$$$true");
//on met à jour notre liste
//GestionnaireListeUtilisateur.instance().majListe2();
//J'ai le déplacer après l'identification
} else {
//on lance le server d'écoute de cmd
GestionnaireListeUtilisateur.instance().ecoute();
//on crée manuellement des utilisateurs
//GestionnaireListeUtilisateur.instance().envoie("add$$$77$$$Moi$$$LocalHost$$$true");
//on met à jour notre liste
//GestionnaireListeUtilisateur.instance().majListe();
//idem
}
/*// on Subscribe à la servlet
try {
Get.sendGET();
} catch (IOException e) {
e.printStackTrace();
};*/
//on lance le UI
Thread t = new Thread(new Login_RegisterUI());

View file

@ -1,16 +0,0 @@
package liste;
public class Constante {
public static final String IP_BROADCAST = "255.255.255.255";
public static final int SIZE_ORDRE = 100;
public static final int NUM_PORT_SERVER = 2000;
public static final String URL_SERVLET = "https://srv-gei-tomcat.insa-toulouse.fr/Servlet_MBP3/";
public static final String URL_SERVLET2 = "http://localhost:8080/Servlet_MBP/test";
public static final boolean debug = true; // indique si l'on debug en local sur un seul ordinateur
}

View file

@ -3,6 +3,7 @@ package liste;
import java.io.IOException;
import java.util.ArrayList;
import defaut.Constante;
import nom.GestionnaireNom;
import servlet.Post;
@ -48,7 +49,7 @@ public class GestionnaireListeUtilisateur {
//Demande à tout le monde d'envoyer leur infos (TypeListeUtilisateur) --> Uniquement lors de la connexion
public void majListe() {
if (GestionnaireNom.instance().getDansReseau()) {
envoie("listRequest"+ "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " ");
envoie("listRequest"+ "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " ");
}
try {
Post.sendPOST("listRequest$$$" + GestionnaireNom.instance().getId() + "$$$" + GestionnaireNom.instance().getNom()+ "$$$"
@ -63,7 +64,7 @@ public class GestionnaireListeUtilisateur {
//debug local
public void majListe2() {
if (GestionnaireNom.instance().getDansReseau()) {
envoie2("listRequest"+ "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " ");
envoie2("listRequest"+ "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " " + "$$$" + " ");
}
try {
Post.sendPOST("listRequest$$$" + GestionnaireNom.instance().getId() + "$$$" + GestionnaireNom.instance().getNom()+ "$$$"
@ -77,7 +78,7 @@ public class GestionnaireListeUtilisateur {
//ecoute le port de broadcast pour recevoir le message personnalisé
public void ecoute() { //static ??
Thread ecouteThread = new Thread(new UdpBroadcastServer(Constante.NUM_PORT_SERVER));
Thread ecouteThread = new Thread(new UdpBroadcastServer(Constante.NUM_PORT_SERVER_UDP));
ecouteThread.start();
}
@ -89,14 +90,14 @@ public class GestionnaireListeUtilisateur {
//envoie en Broadcast aux autres liste les infos sur cet utilisateur
public void envoie(String message) {
Thread envoieThread = new Thread(new UdpBroadcastClient(Constante.NUM_PORT_SERVER, message));
Thread envoieThread = new Thread(new UdpBroadcastClient(Constante.NUM_PORT_SERVER_UDP, message));
envoieThread.start();
}
//debug local
public void envoie2(String message) {
for(int i=0; i<10; i++) {
Thread envoieThread = new Thread(new UdpUnicastClient(Constante.NUM_PORT_SERVER + i, "LocalHost", message));
Thread envoieThread = new Thread(new UdpUnicastClient(Constante.NUM_PORT_SERVER_UDP + i, "LocalHost", message));
envoieThread.start();
}
}

View file

@ -8,16 +8,16 @@ import ui.ListUI;
public class TraitementCmdListe implements Runnable{
private String[] cmd; //ordre$$$id$$$nom$$$ip$$$statut
private String[] cmd; //ordre$$$id$$$nom$$$ip$$$statut$$$local
private Semaphore semaphore;
//Constructeur
public TraitementCmdListe(String message, Semaphore semaphore) {
this.cmd = message.split("\\$\\$\\$", 0);
this.semaphore = semaphore;
if(cmd.length != 5) {
if(cmd.length != 6) {
System.out.println("Erreur nombre d'arguments");
this.cmd = new String[] {"", "", "", "", ""};
this.cmd = new String[] {"", "", "", "", "", ""};
}
}
@ -31,10 +31,11 @@ public class TraitementCmdListe implements Runnable{
String id = cmd[1];
String nom = cmd[2];
String ip = cmd[3];
String statut = cmd[4];
String local = cmd[4];
String statut = cmd[5];
if (ordre.equals("listRequest")) {
if (liste.Constante.debug) {
if (ordre.equals("listRequest") && GestionnaireNom.instance().getNom() != null) {
if (defaut.Constante.debug) {
for (int i = 2000; i<2010; i++) envoyerNom2(i);
} else {
envoyerNom();
@ -43,7 +44,6 @@ public class TraitementCmdListe implements Runnable{
}
semaphore.acquireUninterruptibly();
//System.out.println("bloqué");
if (ordre.equals("delete")) {
supprimeUtilisateur(id);
@ -51,7 +51,7 @@ public class TraitementCmdListe implements Runnable{
if (ordre.equals("add") && !nom.equals("null")) {
ajouteUtilisateur(id, nom, ip, statut); //TODO
ajouteUtilisateur(id, nom, ip, statut, Boolean.parseBoolean(local)); //TODO
//debug
@ -99,7 +99,7 @@ public class TraitementCmdListe implements Runnable{
//Ajoute les utilisateurs à la listeUtilisateur
private void ajouteUtilisateur(String id, String nom, String ip, String statut) {
private void ajouteUtilisateur(String id, String nom, String ip, String statut, boolean local) {
boolean inListe = false;
ArrayList<TypeListeUtilisateur> listeUtilisateur = GestionnaireListeUtilisateur.instance().getListeUtilisateur();
@ -117,7 +117,7 @@ public class TraitementCmdListe implements Runnable{
//s'il n'est pas dans la liste on la rajoute
if (!inListe) {
listeUtilisateur.add(new TypeListeUtilisateur(id, nom, ip, statut));
listeUtilisateur.add(new TypeListeUtilisateur(id, nom, ip, statut, local));
}

View file

@ -6,12 +6,14 @@ public class TypeListeUtilisateur {
public String id;
public String ip;
public String statut;
public boolean local;
public TypeListeUtilisateur(String id, String nom, String ip, String statut) {
public TypeListeUtilisateur(String id, String nom, String ip, String statut, boolean local) {
this.id = id;
this.nom = nom;
this.ip = ip;
this.statut = statut;
this.local = local;
}
}

View file

@ -7,6 +7,8 @@ import java.io.IOException;
import java.net.DatagramPacket;
import java.net.UnknownHostException;
import defaut.Constante;
public class UdpBroadcastClient implements Runnable{
private final int serverPort;

View file

@ -6,6 +6,8 @@ import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.concurrent.Semaphore;
import defaut.Constante;
public class UdpBroadcastServer implements Runnable{

View file

@ -23,6 +23,7 @@ public class UdpUnicastClient implements Runnable{
public void run() {
System.out.println("Le client envoie" + message);
try(DatagramSocket serverSocket = new DatagramSocket()){
DatagramPacket datagramPacket = new DatagramPacket(

View file

@ -161,7 +161,7 @@ public class GestionnaireNom{
public void nommer(String nom) {
setNom(nom);
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireListeUtilisateur.instance().envoie("add"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau());
GestionnaireListeUtilisateur.instance().envoie("add"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau() + "$$$" + getStatut());
}
try {
@ -177,7 +177,7 @@ public class GestionnaireNom{
public void nommer2(String nom) {
setNom(nom);
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireListeUtilisateur.instance().envoie2("add"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau());
GestionnaireListeUtilisateur.instance().envoie2("add"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau() + "$$$" + getStatut());
}
try {
@ -194,7 +194,7 @@ public class GestionnaireNom{
// Supprime l'utilisateur et prévient les autres.
public void supprimer() {
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireListeUtilisateur.instance().envoie("delete"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau());
GestionnaireListeUtilisateur.instance().envoie("delete"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau() + "$$$" + getStatut());
}
try {
Post.sendPOST("delete$$$" + GestionnaireNom.instance().getId() + "$$$" + GestionnaireNom.instance().getNom()+ "$$$"
@ -210,7 +210,7 @@ public class GestionnaireNom{
//debug
public void supprimer2() {
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireListeUtilisateur.instance().envoie2("delete"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau());
GestionnaireListeUtilisateur.instance().envoie2("delete"+ "$$$" + getId() + "$$$" + getNom() + "$$$" + getIp() + "$$$" + getDansReseau() + "$$$" + getStatut());
}
try {
Post.sendPOST("delete$$$" + GestionnaireNom.instance().getId() + "$$$" + GestionnaireNom.instance().getNom()+ "$$$"

View file

@ -1,31 +0,0 @@
package servlet;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class Get {
//private static final String USER_AGENT = "Mozilla/5.0";
private static final String GET_URL = defaut.Constantes.URL_SERVLET_PRESENCE;
public static void sendGET() throws IOException { // SUbscribe
URL obj = new URL(GET_URL);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
//con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();
System.out.println("GET Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
System.out.println("Get success");
} else {
System.out.println("GET request not worked");
}
}
}

View file

@ -5,7 +5,7 @@ import java.io.IOException;
import clavardage.EnvoiMessageDistance;
import nom.GestionnaireNom;
public class Notify {
public class Notif {
public static void notifier () {
//On indique au servlet que l'on est disponible pour recevoire des messages

View file

@ -7,7 +7,7 @@ import java.net.URL;
public class Post {
private static final String POST_URL = defaut.Constantes.URL_SERVLET_PRESENCE;
private static final String POST_URL = defaut.Constante.URL_SERVLET_PRESENCE;
public static void sendPOST(String msg) throws IOException { // Publish cmd : change$$$id$$$nom$$$ip$$$dedans$$$statut
URL obj = new URL(POST_URL);

View file

@ -46,7 +46,7 @@ public class DiscussionUI extends JFrame implements PropertyChangeListener{
*/
public void setSession(SessionClavardageLocale session) {
public void setSession(SessionClavardage session) {
this.session = session;
}
@ -84,7 +84,6 @@ public class DiscussionUI extends JFrame implements PropertyChangeListener{
message.setRecipient(this.session.getIdDestination());
textField.setText("");
historicField.append(GestionnaireNom.instance().nomFromId(message.getSender()) +": " + message.getBody() + System.lineSeparator());
//session.send(GestionnaireNom.instance().nomFromId(session.getIdSource()) + ": " + message+System.lineSeparator());
try {
session.sendObject(message);
} catch (IOException e) {
@ -95,7 +94,7 @@ public class DiscussionUI extends JFrame implements PropertyChangeListener{
}
private void récupérerHistorique() {
historicField.append(GestionnaireHistorique.instance().recuperer(this.session.getIdSource(), this.session.getIdDestination()));
//TODO à Décommenter historicField.append(GestionnaireHistorique.instance().recuperer(this.session.getIdSource(), this.session.getIdDestination()));
}
/**
* Create the frame.

View file

@ -206,7 +206,7 @@ public class ListUI extends JFrame implements Runnable{
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
ListUI window = (ListUI) windowEvent.getSource();
if (liste.Constante.debug) {
if (defaut.Constante.debug) {
GestionnaireNom.instance().supprimer2();
}
else {
@ -243,15 +243,16 @@ public class ListUI extends JFrame implements Runnable{
if(!list.getSelectedValue().statut.equals("invisible")) {
//TODO Que faire si le nom change entre temps ?
String nom = list.getSelectedValue().nom;
String statut = null;
boolean local = false;
ArrayList<TypeListeUtilisateur> listeUtilisateur = GestionnaireListeUtilisateur.instance().getListeUtilisateur();
for (TypeListeUtilisateur user : listeUtilisateur) {
if (user.nom.equals(nom)) {
statut = user.statut;
local = user.local;
}
}
if (GestionnaireNom.instance().getDansReseau() && statut.equals("true")) {
System.out.println("GetDansReseau: " + GestionnaireNom.instance().getDansReseau());
System.out.println("Local: " + local );
if (GestionnaireNom.instance().getDansReseau() && local) {
GestionnaireSessionsLocales gc = GestionnaireSessionsLocales.instance();
gc.createSession(nom);
}

View file

@ -30,9 +30,11 @@ import bdd.Liaison;
import clavardage.GestionnaireMessagesDistants;
import clavardage.GestionnaireSessionsDistantes;
import clavardage.GestionnaireSessionsLocales;
import defaut.Constante;
import defaut.Main;
import liste.GestionnaireListeUtilisateur;
import nom.GestionnaireNom;
import servlet.Notify;
import servlet.Notif;
import javax.swing.JCheckBox;
@ -239,12 +241,7 @@ public class Login_RegisterUI extends JFrame implements Runnable{
GestionnaireMessagesDistants.instance();
dispose();
//1er Méthode sans Thread
//NomUI nom = new NomUI();
//nom.setLocationRelativeTo(null);
//nom.setVisible(true);
//2eme Méthode avec Thread
Thread t = new Thread(new NomUI());
@ -280,23 +277,40 @@ public class Login_RegisterUI extends JFrame implements Runnable{
System.out.println("BDD SUCCESS");
GestionnaireNom.instance().setId(id);
Notify.notifier();
//On a maintenant les informations nécessaires pour initialiser l'application
//on lance le server d'écoute de cmd pour les clients locaux
if (GestionnaireNom.instance().getDansReseau()) {
if (defaut.Constante.debug) {
GestionnaireListeUtilisateur.instance().ecoute2(Main.UDP_SERVER_PORT_DEBUG);
} else {
GestionnaireListeUtilisateur.instance().ecoute();
}
}
//On indique au servlet qu'on va l'utiliser pour envoyer et recevoir des messages
Notif.notifier();
//Instantiation des gestionnaires
GestionnaireSessionsLocales.instance();
if (GestionnaireNom.instance().getDansReseau()) {
GestionnaireSessionsLocales.instance();
}
GestionnaireSessionsDistantes.instance();
GestionnaireMessagesDistants.instance();
GestionnaireListeUtilisateur.instance().majListe();
//On met à jour la liste des utilisateurs
if (Constante.debug) {
GestionnaireListeUtilisateur.instance().majListe2();
}
else {
GestionnaireListeUtilisateur.instance().majListe();
}
dispose();
//1er Méthode sans Thread
//NomUI nom = new NomUI();
//nom.setLocationRelativeTo(null);
//nom.setVisible(true);
//2eme Méthode avec Thread
Thread t = new Thread(new NomUI());
t.start();
}

View file

@ -134,7 +134,7 @@ public class NomUI extends JFrame implements Runnable{
//Celui-ci ne peut pas être "vide" + protection cmd
if (!nom.isBlank() && !nom.contains("$$$")) {
if (liste.Constante.debug) {
if (defaut.Constante.debug) {
GestionnaireNom.instance().nommer2(nom);
} else {
GestionnaireNom.instance().nommer(nom);