Update arborescence 2

This commit is contained in:
Louis Calas
2019-10-10 18:01:08 +02:00
parent 29dba04efb
commit a0b8e315db
167 changed files with 3 additions and 5 deletions

0
src/config/.gitkeep Normal file
View File

286
src/config/Config.java Normal file
View File

@@ -0,0 +1,286 @@
package config;
import java.io.*;
import java.util.*;
public class Config {
private HashMap<String, String> param = new HashMap<String, String>(); // Hashmap des parametres de config, Key =
// nom paramn,
private ArrayList<Question> questions = new ArrayList<Question>();
private String source; // Chemin vers le fichier source
// Getters et setters
public HashMap<String, String> getParam() {
return param;
}
public void setParam(HashMap<String, String> param) {
this.param = param;
}
public ArrayList<Question> getQuestions() {
return questions;
}
public void setQuestions(ArrayList<Question> questions) {
this.questions = questions;
}
public boolean isParsable(String s) {
try {
Integer.valueOf(s);
return true;
} catch (NumberFormatException e) {
return false;
}
}
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
// 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("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
// 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("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
}
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
// 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.
// Gestion de questions mais actuellement inutile pour le programme
try {
Scanner scan = new Scanner(new File(source), "UTF-8");
String ligne;
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
// ce caractere apparait uniquement en debut de fichier
if (ligne.startsWith("\uFEFF"))
ligne = ligne.substring(1);
while (scan.hasNext() || !ligne.isEmpty() || ligne.equals(System.lineSeparator())) {
if (!ligne.equals("")) {
if (!(ligne.substring(0, 1).equals("#"))) // si ligne commence par un # c'est un commentaire, donc
// on
// l'ignore
{
if (ligne.substring(0, 1).equals("*")) // si ligne commence par une *, c'est une question
{
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é
// etre les reponses
{
q.addReponse(ligne);
ligne = scan.nextLine();
}
questions.add(q);
} else // si c'est pas une *, alors c'est un parametre (on ignore les lignes vides)
{
lireParam(ligne);
}
}
}
ligne = scan.nextLine();
while (ligne.equals("")) // on saute les lignes vides avant de recommencer la boucle while
ligne = scan.nextLine();
}
scan.close();
} catch (Exception e) {
}
}
// methode pour creer une question
// 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;
String s = ligne.substring(1, 2); // on lit le caractere qui differencie chaque type de question
switch (s) {
case "*":
// si c'est une * alors c'est une question é choix multiple
q = new Question(ligne.substring(3, ligne.length()), true);
break;
case "<":
// 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
// 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
// unique
q = new Question(ligne.substring(2, ligne.length()), false);
}
return q;
}
// modification des valeurs du hashmap param
// 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
if (n != -1) // si -1 alors il n'y a pas de : et donc ce n'est pas un paramètre
{
String spl[] = { s.substring(0, n), s.substring(n + 1, s.length()) };
while (spl[1].substring(0, 1).equals(" "))
spl[1] = spl[1].substring(1, spl[1].length());
spl[0] = spl[0].toUpperCase().trim(); // pour eviter la casse, on met tout en upper case
switch (spl[0]) // chaque case correspond é un parametre, pour le moment on ignore tout
// parametre qui n'est pas utile au programme.
{
case "PAPERSIZE":
setPaperSize(spl[1]);
break;
case "CODE":
setCode(spl[1]);
break;
case "MARKFORMAT":
setMarkFormat(spl[1]);
break;
case "NAMEFIELD":
setNameField(spl[1]);
break;
case "STUDENTIDFIELD":
setStudentIdField(spl[1]);
break;
case "MARKFIELD":
setMarkField(spl[1]);
break;
case "SEPARATEANSWERSHEET":
setSeparateAnswerSheet(spl[1]);
break;
case "ANSWERSHEETTITLE":
setAnswerSheetTitle(spl[1]);
break;
case "ANSWERSHEETPRESENTATION":
setAnswerSheetPresentation(spl[1]);
break;
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
// TODO
// 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();
if (s.equals("A3") || s.equals("A4") || s.equals("A5") || s.equals("LETTER")) {
param.replace("PaperSize", s);
}
}
public void setCode(String s) {
s = s.trim();
if (isParsable(s)) {
int n = Integer.parseInt(s);
if (n >= 1 && n <= 16) {
param.replace("Code", s);
}
}
}
public void setMarkFormat(String s) {
s = s.trim();
if (s.equals("20/4") || s.equals("100")) {
param.replace("MarkFormat", s);
}
}
public void setNameField(String s) {
if (!s.equals("")) {
param.replace("NameField", s);
}
}
public void setStudentIdField(String s) {
if (!s.equals("")) {
param.replace("StudentIdField", s);
}
}
public void setMarkField(String s) {
if (!s.equals("")) {
param.replace("MarkField", s);
}
}
public void setSeparateAnswerSheet(String s) {
s = s.trim();
int n = Integer.parseInt(s);
if (n == 0 || n == 1) {
param.replace("SeparateAnswerSheet", s);
}
}
public void setAnswerSheetTitle(String s) {
if (!s.equals("")) {
param.replace("AnswerSheetTitle", s);
}
}
public void setAnswerSheetPresentation(String s) {
if (!s.equals("")) {
param.replace("AnswerSheetPresentation", s);
}
}
}

80
src/config/Question.java Normal file
View File

@@ -0,0 +1,80 @@
package config;
import java.util.ArrayList;
public class Question {
private String titre; // intitulé de la question
private int coeff; // coefficient de la question, vide par défaut mais c'est une option possible
private boolean multiple = false; // boolean pour savoir si c'est une question choix multiple
private ArrayList<Reponse> reponses = new ArrayList<Reponse>(); // liste des reponses
//constructeur d'une question sans coeff
public Question(String t, boolean b) {
titre = t;
multiple = b;
}
//constructeur d'une question avec coeff
public Question(String t, boolean b, int n) {
titre = t;
multiple = b;
coeff = n;
}
public ArrayList<Reponse> getReponses() {
return reponses;
}
public void setReponses(ArrayList<Reponse> reponses) {
this.reponses = reponses;
}
public int getCoeff() {
return coeff;
}
public void setCoeff(int n) {
this.coeff = n;
}
public String getTitre() {
return titre;
}
public void setTitre(String titre) {
this.titre = titre;
}
public boolean isMultiple() {
return multiple;
}
public void setMultiple(boolean multiple) {
this.multiple = multiple;
}
//rajout des reponses a la question
//prend en parametre un string qui commence par + ou -
//si le string commence pas par + ou - alors c'est la suite du titre
public void addReponse(String ligne) {
switch (ligne.substring(0, 1)) {
case "+":
// reponse correcte
reponses.add(new Reponse(ligne.substring(2, ligne.length()), true));
break;
case "-":
// reponse fausse
reponses.add(new Reponse(ligne.substring(2, ligne.length()), false));
break;
default:
// si pas + ou - alors c'est la suite a la ligne du titre
titre = (titre + "\n" + ligne);
}
}
// TODO : methode pour verifier si la question a au moins une bonne reponse ET une mauvaise reponse
}

View File

@@ -0,0 +1,19 @@
package config;
public class QuestionBoite extends Question {
// Type de question differente du normal, c'est une question avec une boite de texte où l'étudiant saisira du texte
private int nbligne; // nb de lignes dans la boite
public QuestionBoite(String t, boolean b, int nb) {
super(t, b);
nbligne = nb;
}
public int getNbligne() {
return nbligne;
}
public void setNbligne(int nbligne) {
this.nbligne = nbligne;
}
}

27
src/config/Reponse.java Normal file
View File

@@ -0,0 +1,27 @@
package config;
public class Reponse {
private String intitule;
private boolean juste = false;
public String getIntitule() {
return intitule;
}
public Reponse(String t, boolean b) {
intitule = t;
juste = b;
}
public void setIntitule(String intitule) {
this.intitule = intitule;
}
public boolean isJuste() {
return juste;
}
public void setJuste(boolean juste) {
this.juste = juste;
}
}