diff --git a/NGCC/config.txt b/NGCC/config.txt new file mode 100644 index 0000000..4bd14e0 --- /dev/null +++ b/NGCC/config.txt @@ -0,0 +1 @@ +Code : 8 \ No newline at end of file diff --git a/NGCC/src/Exec.java b/NGCC/src/Exec.java index 8223bb1..9530201 100644 --- a/NGCC/src/Exec.java +++ b/NGCC/src/Exec.java @@ -41,7 +41,7 @@ public class Exec implements Callable { public static void main(String[] args) throws InterruptedException { // Système de subcommand semblable à celui de git permettant d'appeler les classes relatives - //String[] t = {"-r","-v9","-d","pdf"}; + String[] t = {"-r","-v9","-d","pdf","config.txt"}; CommandLine cmd = new CommandLine (new Exec()) .addSubcommand("-r", new Read(System.out)) // nom commande, objet commande .addSubcommand("-b", new Build(System.out)) @@ -51,7 +51,7 @@ public class Exec implements Callable { .addSubcommand("-e", new Evaluate(System.out)) .addSubcommand("help", new HelpCommand()); // Aide générée automatiquement par l'API - cmd.execute(args); //t + cmd.execute(t); //t } diff --git a/NGCC/src/commands/Read.java b/NGCC/src/commands/Read.java index 08aaa8c..4bce10a 100644 --- a/NGCC/src/commands/Read.java +++ b/NGCC/src/commands/Read.java @@ -137,10 +137,8 @@ public class Read implements Callable { Config config = new Config(source_path); //Initialise le fichier de configuration selon le chemin donné config.readConfig(); - GestionnaireCopies ocr = new GestionnaireCopies(directory_name); // Instantie l'ocr - GenerateCSV csv = new GenerateCSV(ocr.createHashMapforCSV(),config.getParam().get("Code"), result_name); - + GenerateCSV csv = new GenerateCSV(ocr.createHashMapforCSV(),config.getParam().get("Code"), result_name, logger); csv.createFile(); //Génère le fichier csv à partir de la HMap retournée par l'OCR diff --git a/NGCC/src/config/Config.java b/NGCC/src/config/Config.java index 7e6679a..c8ec60d 100644 --- a/NGCC/src/config/Config.java +++ b/NGCC/src/config/Config.java @@ -30,38 +30,38 @@ public class Config { public Config(String s) { // Constructeur, prend en parametre le chemin vers le fichier source source = s; - // Initialisation des parametres avec les valeurs par défaut. - // Les élements avec des placeholders en valeur sont des élements qui ne servent + // Initialisation des parametres avec les valeurs par d�faut. + // Les �lements avec des placeholders en valeur sont des �lements qui ne servent // pas pour le moment param.put("PaperSize", "A4"); // A3 A4 A5 letter param.put("Title", "Placeholder"); // titre de l exam param.put("Presentation", "Placeholder"); // texte de consignes - param.put("DocumentModel", "PlaceHolder"); // nom du fichier du modèle - param.put("ShuffleQuestions", "1"); // 1 = qt mélangées, 0 = non mél - param.put("ShuffleAnswers", "1"); // 1= proposition rép mélangées, 0= non - param.put("Code", "8"); // code étudiant = 8 chiffres (entre 1 et 16) - param.put("MarkFormat", "20/4"); // expl "20/4" pour des notes entre 0 et 20 notées à 0.25 points - param.put("NameField", "Nom et Prénom"); // remplace le texte + param.put("DocumentModel", "PlaceHolder"); // nom du fichier du mod�le + param.put("ShuffleQuestions", "1"); // 1 = qt m�lang�es, 0 = non m�l + param.put("ShuffleAnswers", "1"); // 1= proposition r�p m�lang�es, 0= non + param.put("Code", "8"); // code �tudiant = 8 chiffres (entre 1 et 16) + param.put("MarkFormat", "20/4"); // expl "20/4" pour des notes entre 0 et 20 not�es � 0.25 points + param.put("NameField", "Nom et Pr�nom"); // remplace le texte param.put("StudentField", - "Veuillez coder votre numéro\r\n d’étudiant ci-contre et écrire votre nom \r\n dans la case ci-dessous"); - // sert à remplacer le petit texte qui demande de coder son numéro d’étudiant et + "Veuillez coder votre num�ro\r\n d��tudiant ci-contre et �crire votre nom \r\n dans la case ci-dessous"); + // sert � remplacer le petit texte qui demande de coder son num�ro d��tudiant et // inscrire son nom - param.put("MarkField", "Veuillez coder le numéro de l'étudiant"); - param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de réponse séparée. - param.put("AnswerSheetTitle", "Title"); // titre à inscrire en tete de la feuille de rép - param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de présentation de la feuille de réponse + param.put("MarkField", "Veuillez coder le num�ro de l'�tudiant"); + param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de r�ponse s�par�e. + param.put("AnswerSheetTitle", "Title"); // titre � inscrire en tete de la feuille de r�p + param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de pr�sentation de la feuille de r�ponse param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de - // réponse - param.put("DefaultScoringS", "Placeholder");// Donne le barème par défaut pour les questions simples - param.put("DefaultScoringM", "Placeholder");// Donne le barème par défaut pour les questions à choix multiple - param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre à la boite d'une question boite - // d'etre coupé sur plusieurs pages, prend 1 sinon + // r�ponse + param.put("DefaultScoringS", "Placeholder");// Donne le bar�me par d�faut pour les questions simples + param.put("DefaultScoringM", "Placeholder");// Donne le bar�me par d�faut pour les questions � choix multiple + param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre � la boite d'une question boite + // d'etre coup� sur plusieurs pages, prend 1 sinon } public void readConfig() { // Methode pour lire le fichier config en chemin dans la variable source - // Si une ligne du fichier correspond à un parametre, changer la valeur du + // Si une ligne du fichier correspond � un parametre, changer la valeur du // parametre avec celle dans le fichier (si valeur valide) // Gere aussi les questions dans le fichier source et les mets dans une liste de // questions. @@ -72,7 +72,7 @@ public class Config { Question q; ligne = scan.nextLine(); // ligne pour gerer le code FEFF en UTF-8 BOM qui peut apparaitre si le fichier - // txt est edité avec windows notepad + // txt est edit� avec windows notepad // ce caractere apparait uniquement en debut de fichier if (ligne.startsWith("\uFEFF")) ligne = ligne.substring(1); @@ -86,7 +86,7 @@ public class Config { { q = makeQuestion(ligne); ligne = scan.nextLine(); // on scan la prochaine ligne - while (!ligne.equals("")) // tant que la ligne n'est pas vide, on lit la suite qui est supposé + while (!ligne.equals("")) // tant que la ligne n'est pas vide, on lit la suite qui est suppos� // etre les reponses { q.addReponse(ligne); @@ -104,12 +104,12 @@ public class Config { } scan.close(); } catch (Exception e) { - + System.err.println(e.getMessage()); } } // methode pour creer une question - // methode utilisée à partir d'un string supposé lu sur un fichier config + // methode utilis�e � partir d'un string suppos� lu sur un fichier config // TODO : gestion des options telles que coeff et frozenanswer public Question makeQuestion(String ligne) { Question q; @@ -117,7 +117,7 @@ public class Config { switch (s) { case "*": - // si c'est une * alors c'est une question à choix multiple + // si c'est une * alors c'est une question � choix multiple q = new Question(ligne.substring(3, ligne.length()), true); break; @@ -126,14 +126,14 @@ public class Config { // si c'est une < alors c'est une question de type boite int debut = ligne.indexOf("="); // on cherche la position du =, le caractere apres le = sera le nb de lignes // de la boite - int fin = ligne.indexOf(">"); // on cherce la position du >, la suite de ce caractere sera l'intitulé de la + int fin = ligne.indexOf(">"); // on cherce la position du >, la suite de ce caractere sera l'intitul� de la // question int nblignes = Integer.parseInt(ligne.substring(debut + 1, fin)); q = new QuestionBoite(ligne.substring(fin + 2, ligne.length()), false, nblignes); break; default: - // si pas une des conditions citées en haut, alors c'est une question à choix + // si pas une des conditions cit�es en haut, alors c'est une question � choix // unique q = new Question(ligne.substring(2, ligne.length()), false); } @@ -141,7 +141,7 @@ public class Config { } // modification des valeurs du hashmap param - // lecture d'un string supposé lu sur un fichier config + // lecture d'un string suppos� lu sur un fichier config public void lireParam(String s) { int n = s.indexOf(":"); // recherche de position du premier ":" pour pouvoir separer le nom du param de // sa valeur @@ -149,7 +149,7 @@ public class Config { while (spl[1].substring(0, 1).equals(" ")) spl[1] = spl[1].substring(1, spl[1].length()); spl[0] = spl[0].toUpperCase(); // pour eviter la casse, on met tout en upper case - switch (spl[0]) // chaque case correspond à un parametre, pour le moment on ignore tout + switch (spl[0]) // chaque case correspond � un parametre, pour le moment on ignore tout // parametre qui n'est pas utile au programme. { case "PAPERSIZE": @@ -195,16 +195,16 @@ public class Config { setAnswerSheetPresentation(spl[1]); break; - default: // parametre mal tapé ou non utile (pour le moment) au programme, on l'ignore + default: // parametre mal tap� ou non utile (pour le moment) au programme, on l'ignore } } // liste des set de chaque valeur de parametre - // actuellement, uniquement les parametres de l'étape 1 sont traités + // actuellement, uniquement les parametres de l'�tape 1 sont trait�s // TODO - // possibilité d'afficher sur la console messages de valeur invalide et valeur - // par défaut utilisée en cas d'erreur si verbose + // possibilit� d'afficher sur la console messages de valeur invalide et valeur + // par d�faut utilis�e en cas d'erreur si verbose public void setPaperSize(String s) { s = s.toUpperCase(); s = s.trim(); diff --git a/NGCC/src/csv/GenerateCSV.java b/NGCC/src/csv/GenerateCSV.java index d30a8ea..81deae7 100644 --- a/NGCC/src/csv/GenerateCSV.java +++ b/NGCC/src/csv/GenerateCSV.java @@ -5,29 +5,35 @@ import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.HashMap; +import org.apache.logging.log4j.Logger; + public class GenerateCSV { HashMap etudiants; int numLength; String path = "../export"; + Logger logger; - public GenerateCSV(HashMap map, String length, String pth) { + public GenerateCSV(HashMap map, String length, String pth, Logger lg) { this.etudiants = map; this.numLength = Integer.parseInt(length); this.path = path+"/"+pth; + this.logger = lg; } - // TO DO : exploiter dans generation + // Teste validité du numero etudiant (selon param de la config passé : numLength) + public boolean isValid(String s) { int i = 0; + logger.debug("Checking string validity"); if (s.length() == this.numLength) { while (i < s.length()) { int nb = Character.getNumericValue(s.charAt(i)); if (nb <= 0 || nb >= 9) { - System.err.println("Student id's characters are not recognized"); + logger.fatal("Student id's characters are not recognized"); return false; } else { @@ -35,10 +41,11 @@ public class GenerateCSV { } } + logger.debug("String validity ok"); return true; } - else { - System.err.println("Student id's length is not correct"); + else { + logger.fatal("Student id's length is not correct"); return false; } } @@ -50,6 +57,7 @@ public class GenerateCSV { public void createFile() { try (PrintWriter writer = new PrintWriter(new File(this.path))) { + logger.info("Creating csv file"); StringBuilder sb = new StringBuilder(); sb.append("Student number"); sb.append(';'); @@ -58,15 +66,33 @@ public class GenerateCSV { writer.write(sb.toString()); - for (String etud : this.etudiants.keySet()) { - - writer.write(etud+";"+etudiants.get(etud)+System.getProperty("line.separator")); + if (!etudiants.isEmpty()) { + + for (String etud : this.etudiants.keySet()) { + // Si etudiant HashMap est null, pas ecrit + if (!(etud == null)) { + + if (this.isValid(etud)) { + writer.write(etud+";"+etudiants.get(etud)+System.getProperty("line.separator")); + } + + } + else { + logger.debug("Null id not added to csv"); + } + + } + + logger.info("File creation succeed"); } - System.out.println("Create File Done!"); + else { + logger.fatal("Students list for csv generation is empty"); + } + } catch (FileNotFoundException e) { - System.err.println(e.getMessage()); + logger.fatal(e.getMessage()); } } diff --git a/NGCC/src/ocr/GestionnaireCopies.java b/NGCC/src/ocr/GestionnaireCopies.java index 07fa53b..57308dc 100644 --- a/NGCC/src/ocr/GestionnaireCopies.java +++ b/NGCC/src/ocr/GestionnaireCopies.java @@ -61,9 +61,10 @@ public class GestionnaireCopies { HashMap temp = new HashMap<>(); for(Copie c : listeCopie) - { - temp.put(c.getBase().gethMapImgs().get("NumEtu").getDescription(), c.getBase().gethMapImgs().get("Note").getDescription()); + { + temp.put(c.getBase().gethMapImgs().get("NumEtu").getDescription(), c.getBase().gethMapImgs().get("Note").getDescription()); } + return temp; } diff --git a/NGCC/tests/log4j/TestLog4j.java b/NGCC/tests/log4j/TestLog4j.java index d011163..da8f510 100644 --- a/NGCC/tests/log4j/TestLog4j.java +++ b/NGCC/tests/log4j/TestLog4j.java @@ -3,6 +3,7 @@ package log4j; import static org.junit.jupiter.api.Assertions.*; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; diff --git a/pdf/testPDFMarks.pdf b/pdf/testPDFMarks.pdf index 4e1d787..c45ef74 100644 Binary files a/pdf/testPDFMarks.pdf and b/pdf/testPDFMarks.pdf differ