diff --git a/src/GenerateurPdf/SubjectGenerator.java b/src/GenerateurPdf/SubjectGenerator.java index 1e713a4..c43003f 100644 --- a/src/GenerateurPdf/SubjectGenerator.java +++ b/src/GenerateurPdf/SubjectGenerator.java @@ -14,10 +14,49 @@ import org.apache.pdfbox.pdmodel.font.PDType1Font; import config.Config; import config.Question; -// infor concernant strok, fill, ... : https://stackoverflow.com/a/27959484 +// infos concernant strok, fill, ... : https://stackoverflow.com/a/27959484 + +// TODO: voir ouverture puis fermeture de stream dans chaque méthode +// ou ouverture de stream à l'instanciation puis fermeture dans save public class SubjectGenerator { + private Config config; + private PDDocument pdDocument; + + public SubjectGenerator(Config c, PDDocument doc) { + this.config = c; + this.pdDocument = doc; + } + + public SubjectGenerator(Config c, int nbPages, PDRectangle format) { + this.config = c; + this.pdDocument = new PDDocument(); + for (int i = 0; i < nbPages; i++) { + this.pdDocument.addPage(new PDPage(format)); + } + } + + public SubjectGenerator() { + this(null, null); + } + + public Config getConfig() { + return this.config; + } + + public void setConfig(Config config) { + this.config = config; + } + + public PDDocument getPdDocument() { + return this.pdDocument; + } + + public void setPdDocument(PDDocument pdDocument) { + this.pdDocument = pdDocument; + } + private static void drawDotedLine(PDPageContentStream contentStream, int xi, int yi, int xf, int yf) throws IOException { contentStream.moveTo(xi, yi); @@ -40,13 +79,13 @@ public class SubjectGenerator { contentStream.fill(); } - public static PDDocument generateFooter(PDDocument pdDocument) { - int nbTotal = pdDocument.getNumberOfPages(); + public void generateFooter() { + int nbTotal = this.pdDocument.getNumberOfPages(); int count = 1; try { - for (PDPage page : pdDocument.getPages()) { - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + for (PDPage page : this.pdDocument.getPages()) { + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; int width = (int) page.getMediaBox().getWidth(); @@ -65,14 +104,14 @@ public class SubjectGenerator { } catch (IOException ioe) { ioe.printStackTrace(); } - return pdDocument; - } - public static PDDocument generateMarks(PDDocument pdDocument) { - for (PDPage page : pdDocument.getPages()) { + public void generateMarks() { + // TODO: divide generateMarks to avoid header's generation for all pages + // the header part should be added to generateHeader + for (PDPage page : this.pdDocument.getPages()) { try { - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; @@ -174,19 +213,16 @@ public class SubjectGenerator { ioe.printStackTrace(); } } - return pdDocument; } /* - * public static PDDocument generateIDPageArea(PDDocument pdDocument) { - * - * } + * public static PDDocument generateIDPageArea(PDDocument pdDocument) { } */ - public static PDDocument generateNameArea(PDDocument pdDocument) { + public void generateNameArea() { try { - PDPage page = pdDocument.getPage(0); - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPage page = this.pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; @@ -199,7 +235,7 @@ public class SubjectGenerator { int width = (int) page.getMediaBox().getWidth(); // generate rectangle nom - + pdPageContentStream.addRect(width - 238, height - 196, 155, 50); // RECT // text pdPageContentStream.beginText(); @@ -224,13 +260,12 @@ public class SubjectGenerator { } catch (IOException ioe) { ioe.printStackTrace(); } - return pdDocument; } - public static PDDocument generateNumEtudAreaBis(PDDocument pdDocument) { + public void generateNumEtudAreaBis() { try { - PDPage page = pdDocument.getPage(0); - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPage page = this.pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; @@ -268,13 +303,12 @@ public class SubjectGenerator { } catch (IOException ioe) { ioe.printStackTrace(); } - return pdDocument; } - public static PDDocument generateNumEtudArea(PDDocument pdDocument) { + public void generateNumEtudArea() { try { - PDPage page = pdDocument.getPage(0); - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, page, + PDPage page = this.pdDocument.getPage(0); + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, page, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; @@ -307,78 +341,78 @@ public class SubjectGenerator { } catch (IOException ioe) { ioe.printStackTrace(); } - return pdDocument; } - public void generateHeader(PDDocument pdDocument) { + public void generateHeader() { try { - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(0)); + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, + this.pdDocument.getPage(0)); PDFont font = PDType1Font.HELVETICA_BOLD; } catch (IOException ioe) { ioe.printStackTrace(); } } - - public static PDDocument generateBody(PDDocument pdDocument) { + + public void generateBody() { try { - PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(0), - PDPageContentStream.AppendMode.APPEND, true); + PDPageContentStream pdPageContentStream = new PDPageContentStream(this.pdDocument, + this.pdDocument.getPage(0), PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.HELVETICA_BOLD; - + // Boucle sur les questions int qIndex = 1; int heightOffset = 265; int pageIndex = 0; - for (Question q : Config.getQuestions()) { - int height = (int) pdDocument.getPage(0).getMediaBox().getHeight(); - PDPage page = pdDocument.getPage(pageIndex); - SubjectGenerator.generateQ(q, qIndex, pdDocument, page, 25, heightOffset); + System.out.println(this.config.getQuestions()); + for (Question q : this.config.getQuestions()) { + q.setTitre(q.getTitre().replace("\n", "")); // /\ TODO: must be done in Config /\ + int height = (int) this.pdDocument.getPage(0).getMediaBox().getHeight(); + PDPage page = this.pdDocument.getPage(pageIndex); + this.generateQ(q, qIndex, this.pdDocument, page, 25, heightOffset); qIndex++; heightOffset += 100; - - if (heightOffset > height - 10) { + + if (heightOffset > (height - 10)) { heightOffset = 265; pageIndex++; } } - + pdPageContentStream.close(); - } - + } + catch (IOException ioe) { ioe.printStackTrace(); } - - return pdDocument; } - - public static void generateQ(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset, int heightOffset) { - try { - // Il faut rendre plus générale la génération des Q (en fonction du nombre de réponses, recycler le heightOffset) - - + + public void generateQ(Question q, int qIndex, PDDocument pdDocument, PDPage curPage, int widthOffset, + int heightOffset) { + try { + // Il faut rendre plus générale la génération des Q (en fonction du nombre de + // réponses, recycler le heightOffset) + int width = (int) pdDocument.getPage(0).getMediaBox().getWidth(); int height = (int) pdDocument.getPage(0).getMediaBox().getHeight(); - - + PDPageContentStream pdPageContentStream = new PDPageContentStream(pdDocument, curPage, PDPageContentStream.AppendMode.APPEND, true); PDFont font = PDType1Font.TIMES_ROMAN; int fontSize = 10; pdPageContentStream.setFont(font, fontSize); - float titleLength = (font.getStringWidth(q.getTitre()) / 1000)* fontSize; - - System.out.println(qIndex + ". " + q.getTitre() + " - Width: " + titleLength + "/" + width + " - " + height + " - NbRep: " + q.getReponses().size() + "\n"); - + float titleLength = (font.getStringWidth(q.getTitre()) / 1000) * fontSize; + + System.out.println(qIndex + ". " + q.getTitre() + " - Width: " + titleLength + "/" + width + " - " + height + + " - NbRep: " + q.getReponses().size() + "\n"); // Titre // Si titre plus long que largeur page -> mise sur plusieurs lignes - if (titleLength > width - 20) { + if (titleLength > (width - 20)) { pdPageContentStream.beginText(); pdPageContentStream.newLineAtOffset(widthOffset, height - heightOffset); pdPageContentStream.showText("Q." + qIndex + " -"); pdPageContentStream.endText(); - + for (String line : setTextOnMultLines(q.getTitre(), widthOffset, pdDocument, font, fontSize)) { pdPageContentStream.beginText(); pdPageContentStream.newLineAtOffset(widthOffset + 22, height - heightOffset); @@ -393,17 +427,13 @@ public class SubjectGenerator { pdPageContentStream.showText("Q." + qIndex + " - " + q.getTitre()); pdPageContentStream.endText(); } - - - - - // Reponses (QCM) /// Rectangle - //pdPageContentStream.addRect(widthOffset + 20, height - heightOffset - 15, 100, 100); - - /// Texte + // pdPageContentStream.addRect(widthOffset + 20, height - heightOffset - 15, + // 100, 100); + + /// Texte for (int i = 0; i < q.getReponses().size(); i++) { pdPageContentStream.beginText(); pdPageContentStream.newLineAtOffset(widthOffset + 40, height - heightOffset - 15); @@ -411,63 +441,67 @@ public class SubjectGenerator { pdPageContentStream.endText(); heightOffset += 17.5; } - + pdPageContentStream.close(); - - - + /* - pdPageContentStream.beginText(); - pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 105); - pdPageContentStream.showText(String.valueOf(i)); - pdPageContentStream.endText(); - // draw second range of rectangles - pdPageContentStream.addRect(80 + (22 * i), height - 124, 11, 11); - // write second range of numbers - pdPageContentStream.beginText(); - pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 122); - pdPageContentStream.showText(String.valueOf(i)); - pdPageContentStream.endText();*/ + * pdPageContentStream.beginText(); pdPageContentStream.newLineAtOffset(80 + (22 + * * i) + 12, height - 105); pdPageContentStream.showText(String.valueOf(i)); + * pdPageContentStream.endText(); // draw second range of rectangles + * pdPageContentStream.addRect(80 + (22 * i), height - 124, 11, 11); // write + * second range of numbers pdPageContentStream.beginText(); + * pdPageContentStream.newLineAtOffset(80 + (22 * i) + 12, height - 122); + * pdPageContentStream.showText(String.valueOf(i)); + * pdPageContentStream.endText(); + */ } catch (IOException ioe) { ioe.printStackTrace(); } } - - public static ArrayList setTextOnMultLines (String text, int widthOffset, PDDocument pdDocument, PDFont font, int fontSize){ + + public static ArrayList setTextOnMultLines(String text, int widthOffset, PDDocument pdDocument, PDFont font, + int fontSize) { + // TODO: voir si l'on laisse en static ou non int width = (int) pdDocument.getPage(0).getMediaBox().getWidth(); float subStrLength = 0; - + ArrayList lines = new ArrayList(); int widthMargin = 60; int lastSpace = -2; int spaceIndex = 0; - while (text.length() > 0) { - //System.out.println("1. Si: " + spaceIndex + " - Ls: " + lastSpace + " TxtL: " + text.length()); + while (text.length() > 0) { + // System.out.println("1. Si: " + spaceIndex + " - Ls: " + lastSpace + " TxtL: " + // + text.length()); spaceIndex = text.indexOf(' ', lastSpace + 2); - //System.out.println("2. Si: " + spaceIndex + " - Ls: " + lastSpace + " : " + text + "\n"); + // System.out.println("2. Si: " + spaceIndex + " - Ls: " + lastSpace + " : " + + // text + "\n"); String subStr = ""; - //System.out.println("1. SubL: " + subStrLength + " - W: " + (width - widthOffset)); - + // System.out.println("1. SubL: " + subStrLength + " - W: " + (width - + // widthOffset)); + if (spaceIndex == -1) { lines.add(text); text = ""; - } - else + } else { subStr = text.substring(0, spaceIndex); - + } + try { - subStrLength = (font.getStringWidth(subStr) / 1000)* fontSize; + subStrLength = (font.getStringWidth(subStr) / 1000) * fontSize; } catch (IOException ioe) { System.err.print(ioe.getMessage()); } - - //System.out.println("2. SubL: " + subStrLength + " - W: " + (width - widthOffset)); - - if (subStrLength > width - widthOffset - widthMargin) { - if (lastSpace > 0) + + // System.out.println("2. SubL: " + subStrLength + " - W: " + (width - + // widthOffset)); + + if (subStrLength > (width - widthOffset - widthMargin)) { + if (lastSpace > 0) { lastSpace = spaceIndex; - - //System.out.println("[IF] SubL: " + subStrLength + " - W: " + (width - widthOffset)); + } + + // System.out.println("[IF] SubL: " + subStrLength + " - W: " + (width - + // widthOffset)); subStr = text.substring(0, lastSpace); lines.add(subStr); text = text.substring(lastSpace).trim(); @@ -475,47 +509,57 @@ public class SubjectGenerator { } else if (spaceIndex == lastSpace) { lines.add(text); text = ""; - //System.out.println("LTxt: " + text.length()); + // System.out.println("LTxt: " + text.length()); } else { lastSpace = spaceIndex; } - + } - + return lines; } + public void save(String dest) { + try { + this.pdDocument.save(dest); + this.pdDocument.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + public static void main(String args[]) throws IOException { - // Create a Document object. - PDDocument pdDocument = new PDDocument(); - // Create a Page object - PDPage pdPage1 = new PDPage(PDRectangle.A4); - // System.out.println("Height : " + pdPage1.getMediaBox().getHeight()); - // System.out.println("Width : " + pdPage1.getMediaBox().getWidth()); - PDPage pdPage2 = new PDPage(PDRectangle.A4); - PDPage pdPage3 = new PDPage(PDRectangle.A4); - PDPage pdPage4 = new PDPage(PDRectangle.A4); - PDPage pdPage5 = new PDPage(PDRectangle.A4); - - // Add the page to the document and save the document to a desired file. - pdDocument.addPage(pdPage1); - pdDocument.addPage(pdPage2); - pdDocument.addPage(pdPage3); - pdDocument.addPage(pdPage4); - pdDocument.addPage(pdPage5); - - Config c = new Config("E:\\sourceB.txt"); // SourceB ne contient auucn '\n' + // config initialization + // Config c = new Config("E:\\sourceB.txt"); // SourceB ne contient aucun '\n' + Config c = new Config("E:\\source.txt"); c.readConfig(); + // Create a Document object. + /** + * PDDocument pdDocument = new PDDocument(); // Create a Page object PDPage + * pdPage1 = new PDPage(PDRectangle.A4); // System.out.println("Height : " + + * pdPage1.getMediaBox().getHeight()); // System.out.println("Width : " + + * pdPage1.getMediaBox().getWidth()); PDPage pdPage2 = new + * PDPage(PDRectangle.A4); PDPage pdPage3 = new PDPage(PDRectangle.A4); PDPage + * pdPage4 = new PDPage(PDRectangle.A4); PDPage pdPage5 = new + * PDPage(PDRectangle.A4); + * + * // Add the page to the document pdDocument.addPage(pdPage1); + * pdDocument.addPage(pdPage2); pdDocument.addPage(pdPage3); + * pdDocument.addPage(pdPage4); pdDocument.addPage(pdPage5); + */ - pdDocument = SubjectGenerator.generateMarks(pdDocument); - pdDocument = SubjectGenerator.generateNumEtudAreaBis(pdDocument); - pdDocument = SubjectGenerator.generateNameArea(pdDocument); - pdDocument = SubjectGenerator.generateFooter(pdDocument); - pdDocument = SubjectGenerator.generateBody(pdDocument); + // instanciate a new SubjectGenerator + // TODO: change PDRectangle.A4 to the format specified in the config + SubjectGenerator subjectGenerator = new SubjectGenerator(c, 5, PDRectangle.A4); + + subjectGenerator.generateMarks(); + subjectGenerator.generateNumEtudAreaBis(); + subjectGenerator.generateNameArea(); + subjectGenerator.generateFooter(); + subjectGenerator.generateBody(); + + subjectGenerator.save("E:\\testPDFMarks.pdf"); - // pdDocument.save("C:\\Users\\Nico\\Desktop\\testPDFMarks.pdf"); - pdDocument.save("E:\\testPDFMarks.pdf"); - pdDocument.close(); System.out.println("PDF saved to the location !!!"); } } diff --git a/src/config/Config.java b/src/config/Config.java index 1fe0dd9..0c2dcfb 100644 --- a/src/config/Config.java +++ b/src/config/Config.java @@ -1,9 +1,12 @@ package config; -import java.io.*; -import java.util.*; +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Scanner; public class Config { + private HashMap param = new HashMap(); // Hashmap des parametres de config, Key = // nom paramn, private ArrayList questions = new ArrayList(); @@ -12,7 +15,7 @@ public class Config { // Getters et setters public HashMap getParam() { - return param; + return this.param; } public void setParam(HashMap param) { @@ -20,7 +23,7 @@ public class Config { } public ArrayList getQuestions() { - return questions; + return this.questions; } public void setQuestions(ArrayList questions) { @@ -36,35 +39,55 @@ public class Config { } } + public static String clearString(String string) { + // Sources : + // https://howtodoinjava.com/regex/java-clean-ascii-text-non-printable-chars/ + // https://stackoverflow.com/a/52559280 + // https://docs.oracle.com/javase/10/docs/api/java/lang/String.html#trim() + // https://stackoverflow.com/a/33724262 + + // strips off all non-ASCII characters + string = string.replace("\n", ""); + string = string.replaceAll("[^\\x00-\\xFF]", " "); + // erases all the ASCII control characters + string = string.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", ""); + // removes non-printable characters from Unicode + string = string.replaceAll("\\p{C}", ""); + return string.trim(); // trim() : eliminates leading and trailing spaces + } + public Config(String s) { // Constructeur, prend en parametre le chemin vers le fichier source - source = s; + this.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"); // expl "20" 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", + this.param.put("PaperSize", "A4"); // A3 A4 A5 letter + this.param.put("Title", "Placeholder"); // titre de l exam + this.param.put("Presentation", "Placeholder"); // texte de consignes + this.param.put("DocumentModel", "PlaceHolder"); // nom du fichier du modéle + this.param.put("ShuffleQuestions", "1"); // 1 = qt mélangées, 0 = non mél + this.param.put("ShuffleAnswers", "1"); // 1= proposition rép mélangées, 0= non + this.param.put("Code", "8"); // code étudiant = 8 chiffres (entre 1 et 16) + this.param.put("MarkFormat", "20"); // expl "20" pour des notes entre 0 et 20 notées é 0.25 points + this.param.put("NameField", "Nom et Prénom"); // remplace le texte + this.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 + this.param.put("MarkField", "Veuillez coder le numéro de l'étudiant"); + this.param.put("SeparateAnswerSheet", "1"); // si 1 = feuille de réponse séparée. + this.param.put("AnswerSheetTitle", "Title"); // titre é inscrire en tete de la feuille de rép + this.param.put("AnswerSheetPresentation", "Presentation"); // Donne le texte de présentation de la feuille de + // réponse + this.param.put("SingleSided", "Placeholder");// si valeur = 1, aucune page blanche entre feuille de sujet et de + // réponse + this.param.put("DefaultScoringS", "Placeholder");// Donne le baréme par défaut pour les questions simples + this.param.put("DefaultScoringM", "Placeholder");// Donne le baréme par défaut pour les questions é choix + // multiple + this.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 } @@ -76,15 +99,16 @@ public class Config { // questions. // Gestion de questions mais actuellement inutile pour le programme try { - Scanner scan = new Scanner(new File(source), "UTF-8"); + Scanner scan = new Scanner(new File(this.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")) + 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 @@ -93,25 +117,26 @@ public class Config { { 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 + q = this.makeQuestion(Config.clearString(ligne)); + ligne = scan.nextLine(); while (!ligne.equals("")) // tant que la ligne n'est pas vide, on lit la suite qui est - // supposé + // supposée // etre les reponses { - q.addReponse(ligne); + q.addReponse(Config.clearString(ligne)); ligne = scan.nextLine(); } - questions.add(q); + this.questions.add(q); } else // si c'est pas une *, alors c'est un parametre (on ignore les lignes vides) { - lireParam(ligne); + this.lireParam(ligne); } } } ligne = scan.nextLine(); - while (ligne.equals("")) // on saute les lignes vides avant de recommencer la boucle while + while (ligne.equals("")) { ligne = scan.nextLine(); + } } scan.close(); } catch (Exception e) { @@ -158,54 +183,55 @@ public class Config { 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(" ")) + 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]); + this.setPaperSize(spl[1]); break; case "CODE": - setCode(spl[1]); + this.setCode(spl[1]); break; case "MARKFORMAT": - setMarkFormat(spl[1]); + this.setMarkFormat(spl[1]); break; case "NAMEFIELD": - setNameField(spl[1]); + this.setNameField(spl[1]); break; case "STUDENTIDFIELD": - setStudentIdField(spl[1]); + this.setStudentIdField(spl[1]); break; case "MARKFIELD": - setMarkField(spl[1]); + this.setMarkField(spl[1]); break; case "SEPARATEANSWERSHEET": - setSeparateAnswerSheet(spl[1]); + this.setSeparateAnswerSheet(spl[1]); break; case "ANSWERSHEETTITLE": - setAnswerSheetTitle(spl[1]); + this.setAnswerSheetTitle(spl[1]); break; case "ANSWERSHEETPRESENTATION": - setAnswerSheetPresentation(spl[1]); + this.setAnswerSheetPresentation(spl[1]); break; default: // parametre mal tapé ou non utile (pour le moment) au programme, on l'ignore @@ -223,16 +249,16 @@ public class Config { s = s.toUpperCase(); s = s.trim(); if (s.equals("A3") || s.equals("A4") || s.equals("A5") || s.equals("LETTER")) { - param.replace("PaperSize", s); + this.param.replace("PaperSize", s); } } public void setCode(String s) { s = s.trim(); - if (isParsable(s)) { + if (this.isParsable(s)) { int n = Integer.parseInt(s); - if (n >= 1 && n <= 16) { - param.replace("Code", s); + if ((n >= 1) && (n <= 16)) { + this.param.replace("Code", s); } } } @@ -240,47 +266,47 @@ public class Config { public void setMarkFormat(String s) { s = s.trim(); if (s.equals("20/4") || s.equals("100")) { - param.replace("MarkFormat", s); + this.param.replace("MarkFormat", s); } } public void setNameField(String s) { if (!s.equals("")) { - param.replace("NameField", s); + this.param.replace("NameField", s); } } public void setStudentIdField(String s) { if (!s.equals("")) { - param.replace("StudentIdField", s); + this.param.replace("StudentIdField", s); } } public void setMarkField(String s) { if (!s.equals("")) { - param.replace("MarkField", s); + this.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); + if ((n == 0) || (n == 1)) { + this.param.replace("SeparateAnswerSheet", s); } } public void setAnswerSheetTitle(String s) { if (!s.equals("")) { - param.replace("AnswerSheetTitle", s); + this.param.replace("AnswerSheetTitle", s); } } public void setAnswerSheetPresentation(String s) { if (!s.equals("")) { - param.replace("AnswerSheetPresentation", s); + this.param.replace("AnswerSheetPresentation", s); } } -} \ No newline at end of file +} diff --git a/tests/config/TestConfig.java b/tests/config/TestConfig.java index bc3cf05..7c7c493 100644 --- a/tests/config/TestConfig.java +++ b/tests/config/TestConfig.java @@ -8,18 +8,41 @@ public class TestConfig { @Test void testMakeQuestion() { - Config c=new Config("test"); - Question q=new Question("Je suis le titre",false); - q=c.makeQuestion("* Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); - assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",q.getTitre()); - - Question q2=new Question("Selon la serie diffusée en 1991 sur TF1, où le petit Nicolas doit il travailler et s'appliquer ?",false); - q2=c.makeQuestion("** Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); - assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?",q2.getTitre()); - - Question q3=new Question("Quelles sont les bonnes réponses",false); - q3=c.makeQuestion("* Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?"); - assertEquals("Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?",q3.getTitre()); - + Config c = new Config("test"); + Question q = new Question("Je suis le titre", false); + q = c.makeQuestion( + "* Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); + assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?", + q.getTitre()); + + Question q2 = new Question( + "Selon la serie diffusée en 1991 sur TF1, où le petit Nicolas doit il travailler et s'appliquer ?", + false); + q2 = c.makeQuestion( + "** Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?"); + assertEquals("Dans M.A.S.K. qui sont les pilotes ou copilote de Rhino (un camion tracteur Kenworth w900)?", + q2.getTitre()); + + Question q3 = new Question("Quelles sont les bonnes réponses", false); + q3 = c.makeQuestion( + "* Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?"); + assertEquals( + "Cette jeune fille vient d'emménager à Sunnydale avec sa mère et rencontre son nouvel observateur. Quel est le nom de ce dernier ?", + q3.getTitre()); + + } + + @Test + void testClearString() { + String string = " \ntest \r testù "; + assertEquals("test testù", Config.clearString(string)); + + // TODO: improve tests with a string containing + // all non desired characters + /** + * String string2 = "\n\r\\u000A\\uFFFF"; assertEquals("", + * Config.clearString(string2)); + * assertTrue(Config.clearString(string2).isEmpty()); + */ } }