Bug fixes

This commit is contained in:
Louis Calas 2019-10-04 10:49:13 +02:00
parent f367068e74
commit a1472c7b60
8 changed files with 77 additions and 50 deletions

1
NGCC/config.txt Normal file
View File

@ -0,0 +1 @@
Code : 8

View File

@ -41,7 +41,7 @@ public class Exec implements Callable <Void> {
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
// Système de subcommand semblable à celui de git permettant d'appeler les classes relatives // 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()) CommandLine cmd = new CommandLine (new Exec())
.addSubcommand("-r", new Read(System.out)) // nom commande, objet commande .addSubcommand("-r", new Read(System.out)) // nom commande, objet commande
.addSubcommand("-b", new Build(System.out)) .addSubcommand("-b", new Build(System.out))
@ -51,7 +51,7 @@ public class Exec implements Callable <Void> {
.addSubcommand("-e", new Evaluate(System.out)) .addSubcommand("-e", new Evaluate(System.out))
.addSubcommand("help", new HelpCommand()); // Aide générée automatiquement par l'API .addSubcommand("help", new HelpCommand()); // Aide générée automatiquement par l'API
cmd.execute(args); //t cmd.execute(t); //t
} }

View File

@ -137,10 +137,8 @@ public class Read implements Callable <Void> {
Config config = new Config(source_path); //Initialise le fichier de configuration selon le chemin donné Config config = new Config(source_path); //Initialise le fichier de configuration selon le chemin donné
config.readConfig(); config.readConfig();
GestionnaireCopies ocr = new GestionnaireCopies(directory_name); // Instantie l'ocr 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 csv.createFile(); //Génère le fichier csv à partir de la HMap retournée par l'OCR

View File

@ -30,38 +30,38 @@ public class Config {
public Config(String s) { public Config(String s) {
// Constructeur, prend en parametre le chemin vers le fichier source // Constructeur, prend en parametre le chemin vers le fichier source
source = s; source = s;
// Initialisation des parametres avec les valeurs par défaut. // Initialisation des parametres avec les valeurs par d<EFBFBD>faut.
// Les élements avec des placeholders en valeur sont des élements qui ne servent // Les <EFBFBD>lements avec des placeholders en valeur sont des <EFBFBD>lements qui ne servent
// pas pour le moment // pas pour le moment
param.put("PaperSize", "A4"); // A3 A4 A5 letter param.put("PaperSize", "A4"); // A3 A4 A5 letter
param.put("Title", "Placeholder"); // titre de l exam param.put("Title", "Placeholder"); // titre de l exam
param.put("Presentation", "Placeholder"); // texte de consignes param.put("Presentation", "Placeholder"); // texte de consignes
param.put("DocumentModel", "PlaceHolder"); // nom du fichier du modèle param.put("DocumentModel", "PlaceHolder"); // nom du fichier du mod<EFBFBD>le
param.put("ShuffleQuestions", "1"); // 1 = qt mélangées, 0 = non l param.put("ShuffleQuestions", "1"); // 1 = qt m<EFBFBD>lang<EFBFBD>es, 0 = non m<EFBFBD>l
param.put("ShuffleAnswers", "1"); // 1= proposition rép mélangées, 0= non param.put("ShuffleAnswers", "1"); // 1= proposition r<EFBFBD>p m<EFBFBD>lang<EFBFBD>es, 0= non
param.put("Code", "8"); // code étudiant = 8 chiffres (entre 1 et 16) param.put("Code", "8"); // code <EFBFBD>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("MarkFormat", "20/4"); // expl "20/4" pour des notes entre 0 et 20 not<EFBFBD>es <EFBFBD> 0.25 points
param.put("NameField", "Nom et Prénom"); // remplace le texte param.put("NameField", "Nom et Pr<EFBFBD>nom"); // remplace le texte
param.put("StudentField", 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"); "Veuillez coder votre num<EFBFBD>ro\r\n d<><64>tudiant ci-contre et <20>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 // sert <EFBFBD> remplacer le petit texte qui demande de coder son num<EFBFBD>ro d<EFBFBD><EFBFBD>tudiant et
// inscrire son nom // inscrire son nom
param.put("MarkField", "Veuillez coder le numéro de l'étudiant"); param.put("MarkField", "Veuillez coder le num<EFBFBD>ro de l'<27>tudiant");
param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de réponse séparée. param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de r<EFBFBD>ponse s<EFBFBD>par<EFBFBD>e.
param.put("AnswerSheetTitle", "Title"); // titre à inscrire en tete de la feuille de rép param.put("AnswerSheetTitle", "Title"); // titre <EFBFBD> inscrire en tete de la feuille de r<EFBFBD>p
param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de présentation de la feuille de réponse param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de pr<EFBFBD>sentation de la feuille de r<EFBFBD>ponse
param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de
// réponse // r<EFBFBD>ponse
param.put("DefaultScoringS", "Placeholder");// Donne le barème par faut pour les questions simples param.put("DefaultScoringS", "Placeholder");// Donne le bar<EFBFBD>me par d<EFBFBD>faut pour les questions simples
param.put("DefaultScoringM", "Placeholder");// Donne le barème par défaut pour les questions à choix multiple param.put("DefaultScoringM", "Placeholder");// Donne le bar<EFBFBD>me par d<EFBFBD>faut pour les questions <EFBFBD> choix multiple
param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre à la boite d'une question boite param.put("QuestionBlocks", "Placeholder");// prend 0 pour valeur pour permettre <EFBFBD> la boite d'une question boite
// d'etre coupé sur plusieurs pages, prend 1 sinon // d'etre coup<EFBFBD> sur plusieurs pages, prend 1 sinon
} }
public void readConfig() { public void readConfig() {
// Methode pour lire le fichier config en chemin dans la variable source // 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 <EFBFBD> un parametre, changer la valeur du
// parametre avec celle dans le fichier (si valeur valide) // parametre avec celle dans le fichier (si valeur valide)
// Gere aussi les questions dans le fichier source et les mets dans une liste de // Gere aussi les questions dans le fichier source et les mets dans une liste de
// questions. // questions.
@ -72,7 +72,7 @@ public class Config {
Question q; Question q;
ligne = scan.nextLine(); ligne = scan.nextLine();
// ligne pour gerer le code FEFF en UTF-8 BOM qui peut apparaitre si le fichier // 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<EFBFBD> avec windows notepad
// ce caractere apparait uniquement en debut de fichier // ce caractere apparait uniquement en debut de fichier
if (ligne.startsWith("\uFEFF")) if (ligne.startsWith("\uFEFF"))
ligne = ligne.substring(1); ligne = ligne.substring(1);
@ -86,7 +86,7 @@ public class Config {
{ {
q = makeQuestion(ligne); q = makeQuestion(ligne);
ligne = scan.nextLine(); // on scan la prochaine 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<EFBFBD>
// etre les reponses // etre les reponses
{ {
q.addReponse(ligne); q.addReponse(ligne);
@ -104,12 +104,12 @@ public class Config {
} }
scan.close(); scan.close();
} catch (Exception e) { } catch (Exception e) {
System.err.println(e.getMessage());
} }
} }
// methode pour creer une question // methode pour creer une question
// methode utilisée à partir d'un string supposé lu sur un fichier config // methode utilis<EFBFBD>e <EFBFBD> partir d'un string suppos<EFBFBD> lu sur un fichier config
// TODO : gestion des options telles que coeff et frozenanswer // TODO : gestion des options telles que coeff et frozenanswer
public Question makeQuestion(String ligne) { public Question makeQuestion(String ligne) {
Question q; Question q;
@ -117,7 +117,7 @@ public class Config {
switch (s) { switch (s) {
case "*": case "*":
// si c'est une * alors c'est une question à choix multiple // si c'est une * alors c'est une question <EFBFBD> choix multiple
q = new Question(ligne.substring(3, ligne.length()), true); q = new Question(ligne.substring(3, ligne.length()), true);
break; break;
@ -126,14 +126,14 @@ public class Config {
// si c'est une < alors c'est une question de type boite // 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 int debut = ligne.indexOf("="); // on cherche la position du =, le caractere apres le = sera le nb de lignes
// de la boite // 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<EFBFBD> de la
// question // question
int nblignes = Integer.parseInt(ligne.substring(debut + 1, fin)); int nblignes = Integer.parseInt(ligne.substring(debut + 1, fin));
q = new QuestionBoite(ligne.substring(fin + 2, ligne.length()), false, nblignes); q = new QuestionBoite(ligne.substring(fin + 2, ligne.length()), false, nblignes);
break; break;
default: default:
// si pas une des conditions citées en haut, alors c'est une question à choix // si pas une des conditions cit<EFBFBD>es en haut, alors c'est une question <EFBFBD> choix
// unique // unique
q = new Question(ligne.substring(2, ligne.length()), false); q = new Question(ligne.substring(2, ligne.length()), false);
} }
@ -141,7 +141,7 @@ public class Config {
} }
// modification des valeurs du hashmap param // modification des valeurs du hashmap param
// lecture d'un string supposé lu sur un fichier config // lecture d'un string suppos<EFBFBD> lu sur un fichier config
public void lireParam(String s) { public void lireParam(String s) {
int n = s.indexOf(":"); // recherche de position du premier ":" pour pouvoir separer le nom du param de int n = s.indexOf(":"); // recherche de position du premier ":" pour pouvoir separer le nom du param de
// sa valeur // sa valeur
@ -149,7 +149,7 @@ public class Config {
while (spl[1].substring(0, 1).equals(" ")) while (spl[1].substring(0, 1).equals(" "))
spl[1] = spl[1].substring(1, spl[1].length()); spl[1] = spl[1].substring(1, spl[1].length());
spl[0] = spl[0].toUpperCase(); // pour eviter la casse, on met tout en upper case 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 <EFBFBD> un parametre, pour le moment on ignore tout
// parametre qui n'est pas utile au programme. // parametre qui n'est pas utile au programme.
{ {
case "PAPERSIZE": case "PAPERSIZE":
@ -195,16 +195,16 @@ public class Config {
setAnswerSheetPresentation(spl[1]); setAnswerSheetPresentation(spl[1]);
break; break;
default: // parametre mal tapé ou non utile (pour le moment) au programme, on l'ignore default: // parametre mal tap<EFBFBD> ou non utile (pour le moment) au programme, on l'ignore
} }
} }
// liste des set de chaque valeur de parametre // 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'<EFBFBD>tape 1 sont trait<EFBFBD>s
// TODO // TODO
// possibilité d'afficher sur la console messages de valeur invalide et valeur // possibilit<EFBFBD> d'afficher sur la console messages de valeur invalide et valeur
// par défaut utilisée en cas d'erreur si verbose // par d<EFBFBD>faut utilis<EFBFBD>e en cas d'erreur si verbose
public void setPaperSize(String s) { public void setPaperSize(String s) {
s = s.toUpperCase(); s = s.toUpperCase();
s = s.trim(); s = s.trim();

View File

@ -5,29 +5,35 @@ import java.io.FileNotFoundException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.HashMap; import java.util.HashMap;
import org.apache.logging.log4j.Logger;
public class GenerateCSV { public class GenerateCSV {
HashMap<String,String> etudiants; HashMap<String,String> etudiants;
int numLength; int numLength;
String path = "../export"; String path = "../export";
Logger logger;
public GenerateCSV(HashMap<String,String> map, String length, String pth) { public GenerateCSV(HashMap<String,String> map, String length, String pth, Logger lg) {
this.etudiants = map; this.etudiants = map;
this.numLength = Integer.parseInt(length); this.numLength = Integer.parseInt(length);
this.path = path+"/"+pth; 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) { public boolean isValid(String s) {
int i = 0; int i = 0;
logger.debug("Checking string validity");
if (s.length() == this.numLength) { if (s.length() == this.numLength) {
while (i < s.length()) { while (i < s.length()) {
int nb = Character.getNumericValue(s.charAt(i)); int nb = Character.getNumericValue(s.charAt(i));
if (nb <= 0 || nb >= 9) { 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; return false;
} }
else { else {
@ -35,10 +41,11 @@ public class GenerateCSV {
} }
} }
logger.debug("String validity ok");
return true; return true;
} }
else { else {
System.err.println("Student id's length is not correct"); logger.fatal("Student id's length is not correct");
return false; return false;
} }
} }
@ -50,6 +57,7 @@ public class GenerateCSV {
public void createFile() { public void createFile() {
try (PrintWriter writer = new PrintWriter(new File(this.path))) { try (PrintWriter writer = new PrintWriter(new File(this.path))) {
logger.info("Creating csv file");
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append("Student number"); sb.append("Student number");
sb.append(';'); sb.append(';');
@ -58,15 +66,33 @@ public class GenerateCSV {
writer.write(sb.toString()); writer.write(sb.toString());
for (String etud : this.etudiants.keySet()) { if (!etudiants.isEmpty()) {
writer.write(etud+";"+etudiants.get(etud)+System.getProperty("line.separator")); 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) { } catch (FileNotFoundException e) {
System.err.println(e.getMessage()); logger.fatal(e.getMessage());
} }
} }

View File

@ -61,9 +61,10 @@ public class GestionnaireCopies {
HashMap<String,String> temp = new HashMap<>(); HashMap<String,String> temp = new HashMap<>();
for(Copie c : listeCopie) 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; return temp;
} }

View File

@ -3,6 +3,7 @@ package log4j;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;

Binary file not shown.