From d1563e180e6adb16849372e98efa63e6ac236a0c Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Tue, 15 Oct 2024 08:54:14 +0200 Subject: [PATCH 01/13] =?UTF-8?q?ITEM-241=20:=20Ajout=20appender=20personn?= =?UTF-8?q?alis=C3=A9=20R=C3=A9cup=C3=A9ration=20num=C3=A9ro=20et=20type?= =?UTF-8?q?=20demande=20et=20concat=C3=A9nation=20dans=20chaque=20message?= =?UTF-8?q?=20envoy=C3=A9=20dans=20les=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../traitement/LireLigneFichierTasklet.java | 3 ++ batch/src/main/resources/log4j2.xml | 3 +- .../core/configuration/ItemLogAppender.java | 40 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/LireLigneFichierTasklet.java b/batch/src/main/java/fr/abes/item/batch/traitement/LireLigneFichierTasklet.java index 04076f2e..05fb91ba 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/LireLigneFichierTasklet.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/LireLigneFichierTasklet.java @@ -11,6 +11,7 @@ import fr.abes.item.core.service.ILigneFichierService; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.ThreadContext; import org.hibernate.exception.ConstraintViolationException; import org.hibernate.exception.JDBCConnectionException; import org.springframework.batch.core.ExitStatus; @@ -110,6 +111,8 @@ public ExitStatus afterStep(StepExecution stepExecution) { stepExecution.getJobExecution().getExecutionContext().put("lignes", this.lignesFichier); stepExecution.getJobExecution().getExecutionContext().put("demandeId", this.demandeId); stepExecution.getJobExecution().getExecutionContext().put("typeDemande", this.typeDemande.toString()); + ThreadContext.put("demandeId", String.valueOf(this.demandeId)); + ThreadContext.put("typeDemande", this.typeDemande.toString()); } return stepExecution.getExitStatus(); } diff --git a/batch/src/main/resources/log4j2.xml b/batch/src/main/resources/log4j2.xml index b7907254..d6c18ce6 100644 --- a/batch/src/main/resources/log4j2.xml +++ b/batch/src/main/resources/log4j2.xml @@ -7,13 +7,14 @@ + - + diff --git a/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java new file mode 100644 index 00000000..c97ee378 --- /dev/null +++ b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java @@ -0,0 +1,40 @@ +package fr.abes.item.core.configuration; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.ThreadContext; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; + +@Plugin(name = "ItemLogAppender", category = "core", elementType = Appender.ELEMENT_TYPE) +public class ItemLogAppender extends AbstractAppender { + + protected ItemLogAppender(String name, Filter filter) { + super(name, filter, null); + } + + @Override + public void append(LogEvent event) { + if (event.getLevel().isMoreSpecificThan(Level.INFO)) { + String originalMessage = event.getMessage().getFormattedMessage(); + String demandeId = ThreadContext.get("demandeId"); + String typeDemande = ThreadContext.get("typeDemande"); + if (demandeId != null && typeDemande != null) { + System.out.println("DEM_" + typeDemande + "_" + demandeId + " : " + originalMessage); + } + } + } + + // Méthode statique pour créer l'instance de l'appender via le fichier de configuration + @PluginFactory + public static ItemLogAppender createAppender( + @PluginAttribute("name") String name, + @PluginElement("Filter") Filter filter) { + return new ItemLogAppender(name, filter); + } +} From 7e5e7fb4bb035a49f3f004527e9a6bac5d83f499 Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Tue, 15 Oct 2024 11:13:13 +0200 Subject: [PATCH 02/13] =?UTF-8?q?FEAT=20ITEM-269-back-modifier-lordre-de-t?= =?UTF-8?q?ri-du-fichier=20=20=20=20=20=20-=20ajout=20d'une=20m=C3=A9thode?= =?UTF-8?q?=20de=20tri=20dans=20Utilitaires.java=20=20=20=20=20=20-=20ajou?= =?UTF-8?q?t=20d'un=20appel=20=C3=A0=20la=20m=C3=A9thode=20de=20tri=20dans?= =?UTF-8?q?=20DownloadFichierRestService.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/FichierSauvegardeSuppCsv.java | 4 +- .../item/core/utilitaire/Utilitaires.java | 41 +++++++++++++++++-- .../item/web/DownloadFichierRestService.java | 9 ++-- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java index 7aa7a714..7210468e 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java @@ -42,7 +42,7 @@ public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageExce // ajout de la ligne out.println(ppn + ";" + gererZones(listDeReference, exemplaire)); } catch (IOException ex) { - throw new StorageException("Impossible d'écrire dans le fichier de sauvegarde txt"); + throw new StorageException("Impossible d'écrire dans le fichier de sauvegarde csv"); } } @@ -115,7 +115,7 @@ public void writeHeader() { // ajout de la ligne out.println(String.join(";", this.referenceService.constructHeaderCsv())); } catch (IOException ex) { - throw new StorageException("Impossible d'écrire dans le fichier de sauvegarde txt"); + throw new StorageException("Impossible d'écrire dans le fichier de sauvegarde csv"); } } } diff --git a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java index 42ac78a8..26d334d5 100644 --- a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java +++ b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java @@ -12,12 +12,13 @@ import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.core.io.ByteArrayResource; +import org.springframework.core.io.Resource; +import java.io.BufferedReader; +import java.io.FileReader; import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.PrimitiveIterator; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -369,4 +370,36 @@ public static String getLabelTypeDemande(TYPE_DEMANDE typeDemande) { case SUPP -> "suppression"; }; } + + /** + * Méthode qui permet de trier le contenu du fichier de correspondence + * @param file un fichier de type Resource + * @return un fichier de type Resource + * @throws IOException renvoi une exception si le fichier ne peut être lu + */ + public static Resource sortFichierCorrespondance(Resource file) throws IOException { + FileReader fileReader = new FileReader(String.valueOf(file.getURI()).substring(6)); + BufferedReader reader = new BufferedReader(fileReader); + List correspondenceUnsortList = new ArrayList<>(); + String result = null; + int i = 0; + for (String line = reader.readLine(); line != null; line = reader.readLine()) { + if (i == 0) { // stockage de la ligne d'en-tête + result = line + "\n"; + i++; + } else { + // stockage des lignes de correspondence + correspondenceUnsortList.add(line+"\n"); + } + } + reader.close(); + fileReader.close(); + // tri des lignes + Collections.sort(correspondenceUnsortList); + // assemblage de l'en-tête avec les lignes pour constituer le résultat final + List correspondenceSortList = new ArrayList<>(correspondenceUnsortList); + result = result + correspondenceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); + + return new ByteArrayResource(result.getBytes()); + } } diff --git a/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java b/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java index 22ad943c..73de34ad 100644 --- a/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java +++ b/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java @@ -4,6 +4,7 @@ import fr.abes.item.core.exception.ForbiddenException; import fr.abes.item.core.exception.UserExistException; import fr.abes.item.core.service.FileSystemStorageService; +import fr.abes.item.core.utilitaire.Utilitaires; import fr.abes.item.security.CheckAccessToServices; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; @@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.nio.file.Paths; @RestController @@ -43,7 +45,7 @@ public DownloadFichierRestService(FileSystemStorageService storageService, Check @Operation(summary = "permet de récupérer les fichiers relatifs à une demande") public ResponseEntity downloadFile( @PathVariable("filename") String filename, @PathVariable("id") Integer numDemande, @PathVariable("type") TYPE_DEMANDE type, HttpServletRequest request - ) throws UserExistException, ForbiddenException { + ) throws UserExistException, ForbiddenException, IOException { checkAccessToServices.autoriserAccesDemandeParIln(numDemande, request.getAttribute("userNum").toString(), type); if (numDemande != null && numDemande != 0) { @@ -52,9 +54,10 @@ public ResponseEntity downloadFile( } Resource file = storageService.loadAsResource(filename); + Resource bodyFile = Utilitaires.sortFichierCorrespondance(file); + return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"" + file.getFilename() + "\"") - .body(file); - + .body(bodyFile); } } From 017c2a89575ed927eac9519eb17f5a9e9e889783 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Tue, 15 Oct 2024 13:52:21 +0200 Subject: [PATCH 03/13] =?UTF-8?q?ITEM-282=20:=20v=C3=A9rification=20conten?= =?UTF-8?q?u=20fichiers=20suppression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/core/components/AbstractFichier.java | 54 ++++++++++++++++ .../core/components/FichierEnrichiModif.java | 61 ++----------------- .../core/components/FichierEnrichiSupp.java | 48 +++++++++++++++ .../item/core/components/FichierInitial.java | 4 +- .../core/components/FichierInitialSupp.java | 12 ++-- .../fr/abes/item/core/constant/Constant.java | 3 +- .../components/TestFichierEnrichiModif.java | 4 +- .../components/TestFichierEnrichiSupp.java | 53 ++++++++++++++++ .../resources/fichierEnrichiSupp/Nok3Cols.csv | 2 + 9 files changed, 173 insertions(+), 68 deletions(-) create mode 100644 core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java create mode 100644 core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv diff --git a/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java b/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java index df6dedea..ef00e45d 100644 --- a/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java +++ b/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java @@ -2,6 +2,7 @@ import fr.abes.item.core.constant.Constant; import fr.abes.item.core.entities.item.IndexRecherche; +import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.utilitaire.Utilitaires; import lombok.Getter; import lombok.Setter; @@ -79,4 +80,57 @@ protected int getIndexZone(IndexRecherche indexCourant, String[] tabLigne, int i return indexZone; } + /** + * Méthode de vérification de la première partie de la ligne du fichier enrichi. + * Les trois premières colonnes doivent être : ppn;rcr;epn; + * + * @param ligne : ligne à traiter + * @throws FileCheckingException : erreur dans le format de la ligne + */ + protected void check3Cols(String ligne, int maxSize, String errorMessage) throws FileCheckingException { + if (ligne.split(";").length < maxSize) { + throw new FileCheckingException(errorMessage); + } + if (ligne.length() < 12) { + throw new FileCheckingException(errorMessage); + } + if (!("ppn;rcr;epn").equalsIgnoreCase(ligne.substring(0, 11))) { + throw new FileCheckingException(errorMessage); + } + } + + /** + * Méthode permettant de vérifier que la valeur de la seconde colonne correspond au RCR de la demande + * @param rcrFichier : ligne du fichier + * @param rcr : rcr de la demande + * @throws FileCheckingException : erreur de format de fichier + */ + protected void checkRcr(String rcrFichier, String rcr, int ligneCourante) throws FileCheckingException { + if (!rcrFichier.equals(rcr)) { + throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGRCR); + } + } + + /** + * Méthode de vérification de la forme d'un ppn + * @param ppn ppn à vérifier + * @throws FileCheckingException : erreur de format de fichier + */ + protected void checkPpn(String ppn, int ligneCourante) throws FileCheckingException { + if (!ppn.matches("\\d{1,9}X?$")){ + throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGPPN); + } + } + + /** + * Méthode de vérification de la forme d'un epn + * @param epn epn à vérifier + * @throws FileCheckingException: erreur de format de l'epn + */ + protected void checkEpn(String epn, int ligneCourante) throws FileCheckingException { + if (!epn.matches("\\d{1,9}X?$")) { + throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGEPN); + } + } + } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java index 901738bf..332c943d 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java @@ -56,7 +56,7 @@ public void checkFileContent(Demande demande) throws FileCheckingException, IOEx throw new FileCheckingException(Constant.ERR_FILE_NOTRAIT); } String ligne = Utilitaires.checkBom(bufLecteur.readLine()); - check3Cols(ligne); + check3Cols(ligne, 4, Constant.ERR_FILE_3COL_MODIF); String tagSubTag = ligne.split(";")[3]; if (tagSubTag.matches("e\\d{2}\\$a")) { throw new FileCheckingException(Constant.ERR_FILE_4COLZONE + tagSubTag); @@ -83,25 +83,6 @@ public void checkFileContent(Demande demande) throws FileCheckingException, IOEx } - /** - * Méthode de vérification de la première partie de la ligne du fichier enrichi. - * Les trois premières colonnes doivent être : ppn;rcr;epn; - * - * @param ligne : ligne à traiter - * @throws FileCheckingException : erreur dans le format de la ligne - */ - private void check3Cols(String ligne) throws FileCheckingException { - if (ligne.split(";").length < 4) { - throw new FileCheckingException(Constant.ERR_FILE_3COL); - } - if (ligne.length() < 12) { - throw new FileCheckingException(Constant.ERR_FILE_3COL); - } - if (!("ppn;rcr;epn").equalsIgnoreCase(ligne.substring(0, 11))) { - throw new FileCheckingException(Constant.ERR_FILE_3COL); - } - } - /** * vérification de la validité de la zone de la quatrième colonne * sur la première ligne du fichier enrichi @@ -149,49 +130,15 @@ private void checkBodyLine(String ligne, DemandeModif demandeModif) throws FileC } try { String[] tabligne = ligne.split(";"); - checkRcr(tabligne[1], demandeModif.getRcr()); - checkPpn(tabligne[0]); - checkEpn(tabligne[2]); + checkRcr(tabligne[1], demandeModif.getRcr(), ligneCourante); + checkPpn(tabligne[0], ligneCourante); + checkEpn(tabligne[2], ligneCourante); check4cols(tabligne, demandeModif.getTraitement().getNomMethode()); }catch (IndexOutOfBoundsException e) { throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_LINELENGTH); } } - /** - * Méthode permettant de vérifier que la valeur de la seconde colonne correspond au RCR de la demande - * @param rcrFichier : ligne du fichier - * @param rcr : rcr de la demande - * @throws FileCheckingException : erreur de format de fichier - */ - private void checkRcr(String rcrFichier, String rcr) throws FileCheckingException { - if (!rcrFichier.equals(rcr)) { - throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGRCR); - } - } - - /** - * Méthode de vérification de la forme d'un ppn - * @param ppn ppn à vérifier - * @throws FileCheckingException : erreur de format de fichier - */ - private void checkPpn(String ppn) throws FileCheckingException { - if (!ppn.matches("\\d{1,9}X?$")){ - throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGPPN); - } - } - - /** - * Méthode de vérification de la forme d'un epn - * @param epn epn à vérifier - * @throws FileCheckingException: erreur de format de l'epn - */ - private void checkEpn(String epn) throws FileCheckingException { - if (!epn.matches("\\d{1,9}X?$")) { - throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGEPN); - } - } - /** * Méthode permettant de vérifier la valeur de la 4è colonne en fonction du traitement diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java index df3c5bc0..b1873e3a 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java @@ -3,13 +3,29 @@ import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; import fr.abes.item.core.entities.item.Demande; +import fr.abes.item.core.entities.item.DemandeSupp; import fr.abes.item.core.exception.FileCheckingException; +import fr.abes.item.core.utilitaire.Utilitaires; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.io.BufferedReader; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; @Component public class FichierEnrichiSupp extends AbstractFichier implements Fichier { + private int ligneCourante; + + @Autowired + public FichierEnrichiSupp(@Value("") final String filename) { + this.filename = filename; + this.ligneCourante=2; + } + @Override public int getType() { return Constant.ETATDEM_ACOMPLETER; @@ -27,6 +43,38 @@ public void generateFileName(Demande demande) { @Override public void checkFileContent(Demande d) throws FileCheckingException, IOException { + DemandeSupp demandeSupp = (DemandeSupp) d; + ligneCourante = 2; + try (FileInputStream fis = new FileInputStream(path.resolve(filename).toString()); + BufferedReader bufLecteur = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))) { + String ligne = Utilitaires.checkBom(bufLecteur.readLine()); + check3Cols(ligne, 3, Constant.ERR_FILE_3COL_SUPP); + while ((ligne = bufLecteur.readLine()) != null) { + checkBodyLine(ligne, demandeSupp); + ligneCourante++; + } + } + } + /** + * Méthode de vérification d'une ligne du corps du fichier enrichi + * + * @param ligne ligne du fichier à analyser + * @throws FileCheckingException : erreur de format de la ligne + */ + private void checkBodyLine(String ligne, DemandeSupp demandeSupp) throws FileCheckingException { + if (ligne.length() < 13) { + throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + + Constant.ERR_FILE_LINELENGTH); + } + try { + String[] tabligne = ligne.split(";"); + checkRcr(tabligne[1], demandeSupp.getRcr(), ligneCourante); + checkPpn(tabligne[0], ligneCourante); + if (!tabligne[2].isEmpty()) + checkEpn(tabligne[2], ligneCourante); + }catch (IndexOutOfBoundsException e) { + throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_LINELENGTH); + } } } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierInitial.java b/core/src/main/java/fr/abes/item/core/components/FichierInitial.java index b9bf9161..b51989cb 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierInitial.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierInitial.java @@ -14,7 +14,7 @@ @Component public class FichierInitial extends AbstractFichier implements Fichier { - private int ligneCourante; + protected int ligneCourante; @Autowired public FichierInitial(@Value("") final String filename) { @@ -59,7 +59,7 @@ public void checkFileContent(Demande demande) throws FileCheckingException, IOEx * @param ligne : ligne à vérifier * @throws FileCheckingException : erreur dans la format de la ligne */ - private void checkBodyLine(String ligne) throws FileCheckingException { + protected void checkBodyLine(String ligne) throws FileCheckingException { if (ligne.length() != 9) { throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_ONLYONEPPN); } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierInitialSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierInitialSupp.java index a824a5f2..c12e3590 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierInitialSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierInitialSupp.java @@ -6,6 +6,7 @@ import fr.abes.item.core.entities.item.Demande; import fr.abes.item.core.entities.item.DemandeSupp; import fr.abes.item.core.exception.FileCheckingException; +import fr.abes.item.core.utilitaire.Utilitaires; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -17,7 +18,6 @@ @Component public class FichierInitialSupp extends FichierInitial implements Fichier { - private int ligneCourante; public FichierInitialSupp(@Value("") final String filename) { super(filename); } @@ -37,14 +37,14 @@ public void generateFileName(Demande demande) { public void checkFileContent(Demande demande) throws FileCheckingException, IOException { try (FileInputStream fis = new FileInputStream(path.resolve(filename).toString()); BufferedReader bufLecteur = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))) { - this.ligneCourante = 0; - - while ((bufLecteur.readLine()) != null) { - ligneCourante++; + this.ligneCourante = 1; + String ligne; + while ((ligne = Utilitaires.checkBom(bufLecteur.readLine())) != null) { + checkBodyLine(ligne); } //cas ou il y a trop de lignes dans le fichier - if (ligneCourante > Constant.MAX_LIGNE_FICHIER_INIT_SUPP) { + if ((ligneCourante - 1) > Constant.MAX_LIGNE_FICHIER_INIT_SUPP) { throw new FileCheckingException(ligneCourante, Constant.ERR_FILE_TOOMUCH_SUPP); } } diff --git a/core/src/main/java/fr/abes/item/core/constant/Constant.java b/core/src/main/java/fr/abes/item/core/constant/Constant.java index bf8ce134..19ef065f 100644 --- a/core/src/main/java/fr/abes/item/core/constant/Constant.java +++ b/core/src/main/java/fr/abes/item/core/constant/Constant.java @@ -107,7 +107,8 @@ public class Constant implements Serializable { public static final String ERR_FILE_TOOMUCH_MODIF = Constant.ERR_FILE_TOOMUCH_START + Constant.MAX_LIGNE_FICHIER_INIT_MODIF + Constant.ERR_FILE_TOOMUCH_END; public static final String ERR_FILE_TOOMUCH_EXEMP = Constant.ERR_FILE_TOOMUCH_START + Constant.MAX_LIGNE_FICHIER_INIT_EXEMP + Constant.ERR_FILE_TOOMUCH_END; public static final String ERR_FILE_TOOMUCH_SUPP = Constant.ERR_FILE_TOOMUCH_START + Constant.MAX_LIGNE_FICHIER_INIT_SUPP + Constant.ERR_FILE_TOOMUCH_END; - public static final String ERR_FILE_3COL = "La première ligne du fichier doit contenir 4 colonnes (ppn;rcr;epn;zone)."; + public static final String ERR_FILE_3COL_MODIF = "La première ligne du fichier doit contenir 4 colonnes (ppn;rcr;epn;zone)."; + public static final String ERR_FILE_3COL_SUPP = "La première ligne du fichier doit contenir 3 colonnes (ppn;rcr;epn)"; public static final String ERR_FILE_ERRLINE = "Erreur ligne "; public static final String ERR_FILE_ONLYONEPPN = "la ligne ne doit contenir qu'un ppn (sur 9 caractères)."; public static final String ERR_FILE_HEAD4TH = "La valeur en-tête de la quatrieme colonne n'est pas valide."; diff --git a/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiModif.java b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiModif.java index 1909e721..e2d3b1f1 100644 --- a/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiModif.java +++ b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiModif.java @@ -17,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -@DisplayName("Test pour FichierEnrichi") +@DisplayName("Test pour FichierEnrichi modification") class TestFichierEnrichiModif { @DisplayName("checkNok3Cols") @@ -94,7 +94,7 @@ void checkColMissing() { DemandeModif demandeModif = new DemandeModif("341720001", new Date(), new Date(), "", "", "", new EtatDemande(1), new Utilisateur(1), new Traitement(1, "Ajout une sous-zone", "ajoutSousZone")); FichierEnrichiModif fic = new FichierEnrichiModif("colMissing.csv"); fic.setPath(Paths.get("src/test/resources/fichierEnrichiModif")); - assertThat(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeModif)).getMessage().contains(Constant.ERR_FILE_3COL)) + assertThat(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeModif)).getMessage().contains(Constant.ERR_FILE_3COL_MODIF)) .isTrue(); } diff --git a/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java new file mode 100644 index 00000000..7a049dee --- /dev/null +++ b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java @@ -0,0 +1,53 @@ +package fr.abes.item.core.components; + +import fr.abes.item.core.constant.TYPE_SUPPRESSION; +import fr.abes.item.core.entities.item.DemandeSupp; +import fr.abes.item.core.entities.item.EtatDemande; +import fr.abes.item.core.entities.item.Utilisateur; +import fr.abes.item.core.exception.FileCheckingException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.nio.file.Paths; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@DisplayName("Test pour FichierEnrichi Suppression") +public class TestFichierEnrichiSupp { + @DisplayName("checkNok3Cols") + @Test + void checkNok3Cols() { + DemandeSupp demandeSupp = new DemandeSupp("341720001", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("Nok3Cols.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + + assertThat(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains("La première ligne du fichier doit contenir 3 colonnes (ppn;rcr;epn)")) + .isTrue(); + } + + @DisplayName("checkOk3Cols") + @Test + void checkOk3Cols() {} + + @DisplayName("checkPpnNonOk") + @Test + void checkPpnNonOk() {} + + @DisplayName("checkRcrNonOk") + @Test + void checkRcrNonOk() {} + + @DisplayName("checkEpnVide") + @Test + void checkEpnVide() {} + + @DisplayName("checkEpnNonVideOk") + @Test + void checkEpnNonVideOk() {} + + @DisplayName("checkEpnNonVideNonOk") + @Test + void checkEpnNonVideNonOk() {} +} diff --git a/core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv b/core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv new file mode 100644 index 00000000..20a3a777 --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv @@ -0,0 +1,2 @@ +ppn;rcr; +test;test;test \ No newline at end of file From 982a9dba56ef869a7c8550032c7c881374af9dcd Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Tue, 15 Oct 2024 13:54:15 +0200 Subject: [PATCH 04/13] =?UTF-8?q?ITEM-241=20:=20Ajout=20classe=20et=20m?= =?UTF-8?q?=C3=A9thode=20dans=20sortie=20de=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/abes/item/core/configuration/ItemLogAppender.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java index c97ee378..143d49aa 100644 --- a/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java +++ b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java @@ -25,7 +25,7 @@ public void append(LogEvent event) { String demandeId = ThreadContext.get("demandeId"); String typeDemande = ThreadContext.get("typeDemande"); if (demandeId != null && typeDemande != null) { - System.out.println("DEM_" + typeDemande + "_" + demandeId + " : " + originalMessage); + System.out.println("DEM_" + typeDemande + "_" + demandeId + " / " + event.getSource().getClassName() + " / " + event.getSource().getMethodName() + " : " + originalMessage); } } } From a2e07a1dfa439cfb10f321118043380e08b33e99 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Tue, 15 Oct 2024 15:27:24 +0200 Subject: [PATCH 05/13] =?UTF-8?q?ITEM-282=20:=20Ajout=20TU=20sur=20v=C3=A9?= =?UTF-8?q?rification=20fichier=20enrichi=20suppression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/core/components/AbstractFichier.java | 22 +------ .../core/components/FichierEnrichiModif.java | 21 ++++++- .../core/components/FichierEnrichiSupp.java | 32 +++++++--- .../fr/abes/item/core/constant/Constant.java | 4 +- .../components/TestFichierEnrichiSupp.java | 58 ++++++++++++++++--- .../checkEpnNonVideNonOk.csv | 2 + .../fichierEnrichiSupp/checkEpnNonVideOk.csv | 2 + .../fichierEnrichiSupp/checkEpnVide.csv | 2 + .../{Nok3Cols.csv => checkNok3Cols.csv} | 0 .../fichierEnrichiSupp/checkOk3Cols.csv | 2 + .../fichierEnrichiSupp/checkPpnNonOk.csv | 2 + .../checkRcrDiffDemande.csv | 2 + .../fichierEnrichiSupp/checkRcrNonOk.csv | 2 + 13 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideNonOk.csv create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideOk.csv create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkEpnVide.csv rename core/src/test/resources/fichierEnrichiSupp/{Nok3Cols.csv => checkNok3Cols.csv} (100%) create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkOk3Cols.csv create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkPpnNonOk.csv create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkRcrDiffDemande.csv create mode 100644 core/src/test/resources/fichierEnrichiSupp/checkRcrNonOk.csv diff --git a/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java b/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java index ef00e45d..4fa2ff0e 100644 --- a/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java +++ b/core/src/main/java/fr/abes/item/core/components/AbstractFichier.java @@ -80,24 +80,6 @@ protected int getIndexZone(IndexRecherche indexCourant, String[] tabLigne, int i return indexZone; } - /** - * Méthode de vérification de la première partie de la ligne du fichier enrichi. - * Les trois premières colonnes doivent être : ppn;rcr;epn; - * - * @param ligne : ligne à traiter - * @throws FileCheckingException : erreur dans le format de la ligne - */ - protected void check3Cols(String ligne, int maxSize, String errorMessage) throws FileCheckingException { - if (ligne.split(";").length < maxSize) { - throw new FileCheckingException(errorMessage); - } - if (ligne.length() < 12) { - throw new FileCheckingException(errorMessage); - } - if (!("ppn;rcr;epn").equalsIgnoreCase(ligne.substring(0, 11))) { - throw new FileCheckingException(errorMessage); - } - } /** * Méthode permettant de vérifier que la valeur de la seconde colonne correspond au RCR de la demande @@ -117,7 +99,7 @@ protected void checkRcr(String rcrFichier, String rcr, int ligneCourante) throws * @throws FileCheckingException : erreur de format de fichier */ protected void checkPpn(String ppn, int ligneCourante) throws FileCheckingException { - if (!ppn.matches("\\d{1,9}X?$")){ + if (!ppn.matches("^\\d{8}[0-9X]$")){ throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGPPN); } } @@ -128,7 +110,7 @@ protected void checkPpn(String ppn, int ligneCourante) throws FileCheckingExcept * @throws FileCheckingException: erreur de format de l'epn */ protected void checkEpn(String epn, int ligneCourante) throws FileCheckingException { - if (!epn.matches("\\d{1,9}X?$")) { + if (!epn.matches("^\\d{8}[0-9X]$")) { throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_WRONGEPN); } } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java index 332c943d..de7ba550 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiModif.java @@ -56,7 +56,7 @@ public void checkFileContent(Demande demande) throws FileCheckingException, IOEx throw new FileCheckingException(Constant.ERR_FILE_NOTRAIT); } String ligne = Utilitaires.checkBom(bufLecteur.readLine()); - check3Cols(ligne, 4, Constant.ERR_FILE_3COL_MODIF); + check3Cols(ligne); String tagSubTag = ligne.split(";")[3]; if (tagSubTag.matches("e\\d{2}\\$a")) { throw new FileCheckingException(Constant.ERR_FILE_4COLZONE + tagSubTag); @@ -83,6 +83,25 @@ public void checkFileContent(Demande demande) throws FileCheckingException, IOEx } + /** + * Méthode de vérification de la première partie de la ligne du fichier enrichi. + * Les trois premières colonnes doivent être : ppn;rcr;epn; + * + * @param ligne : ligne à traiter + * @throws FileCheckingException : erreur dans le format de la ligne + */ + private void check3Cols(String ligne) throws FileCheckingException { + if (ligne.split(";").length < 4) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_MODIF); + } + if (ligne.length() < 12) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_MODIF); + } + if (!("ppn;rcr;epn").equalsIgnoreCase(ligne.substring(0, 11))) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_MODIF); + } + } + /** * vérification de la validité de la zone de la quatrième colonne * sur la première ligne du fichier enrichi diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java index b1873e3a..b96ab193 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java @@ -23,7 +23,7 @@ public class FichierEnrichiSupp extends AbstractFichier implements Fichier { @Autowired public FichierEnrichiSupp(@Value("") final String filename) { this.filename = filename; - this.ligneCourante=2; + this.ligneCourante = 2; } @Override @@ -48,7 +48,7 @@ public void checkFileContent(Demande d) throws FileCheckingException, IOExceptio try (FileInputStream fis = new FileInputStream(path.resolve(filename).toString()); BufferedReader bufLecteur = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8))) { String ligne = Utilitaires.checkBom(bufLecteur.readLine()); - check3Cols(ligne, 3, Constant.ERR_FILE_3COL_SUPP); + check3Cols(ligne); while ((ligne = bufLecteur.readLine()) != null) { checkBodyLine(ligne, demandeSupp); ligneCourante++; @@ -56,6 +56,25 @@ public void checkFileContent(Demande d) throws FileCheckingException, IOExceptio } } + /** + * Méthode de vérification de la première partie de la ligne du fichier enrichi. + * Les trois premières colonnes doivent être : ppn;rcr;epn; + * + * @param ligne : ligne à traiter + * @throws FileCheckingException : erreur dans le format de la ligne + */ + private void check3Cols(String ligne) throws FileCheckingException { + if (ligne.split(";").length < 3) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_SUPP); + } + if (ligne.length() < 11) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_SUPP); + } + if (!("ppn;rcr;epn").equalsIgnoreCase(ligne.substring(0, 11))) { + throw new FileCheckingException(Constant.ERR_FILE_3COL_SUPP); + } + } + /** * Méthode de vérification d'une ligne du corps du fichier enrichi * @@ -63,17 +82,14 @@ public void checkFileContent(Demande d) throws FileCheckingException, IOExceptio * @throws FileCheckingException : erreur de format de la ligne */ private void checkBodyLine(String ligne, DemandeSupp demandeSupp) throws FileCheckingException { - if (ligne.length() < 13) { - throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante - + Constant.ERR_FILE_LINELENGTH); - } try { String[] tabligne = ligne.split(";"); checkRcr(tabligne[1], demandeSupp.getRcr(), ligneCourante); checkPpn(tabligne[0], ligneCourante); - if (!tabligne[2].isEmpty()) + //cas ou l'epn est renseigné + if (tabligne.length > 2) checkEpn(tabligne[2], ligneCourante); - }catch (IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException e) { throw new FileCheckingException(Constant.ERR_FILE_ERRLINE + ligneCourante + Constant.ERR_FILE_LINELENGTH); } } diff --git a/core/src/main/java/fr/abes/item/core/constant/Constant.java b/core/src/main/java/fr/abes/item/core/constant/Constant.java index 19ef065f..e1ad5234 100644 --- a/core/src/main/java/fr/abes/item/core/constant/Constant.java +++ b/core/src/main/java/fr/abes/item/core/constant/Constant.java @@ -112,13 +112,13 @@ public class Constant implements Serializable { public static final String ERR_FILE_ERRLINE = "Erreur ligne "; public static final String ERR_FILE_ONLYONEPPN = "la ligne ne doit contenir qu'un ppn (sur 9 caractères)."; public static final String ERR_FILE_HEAD4TH = "La valeur en-tête de la quatrieme colonne n'est pas valide."; - public static final String ERR_FILE_LINELENGTH = "Il y a un problème lié à la longueur de la ligne."; + public static final String ERR_FILE_LINELENGTH = " : Il y a un problème lié à la longueur de la ligne."; public static final String ERR_FILE_TYPEFILE = "Type de fichier inconnu: "; public static final String ERR_FILE_TYPEDEMANDE = " pour le type de demande "; public static final String ERR_FILE_4COLNONVIDE = "La valeur de la 4è colonne ne doit pas être vide."; public static final String ERR_FILE_4COLZONE = "impossible de lancer un traitement sur la zone "; public static final String ERR_FILE_4COLVIDE = "La valeur de la 4è colonne doit être vide."; - public static final String ERR_FILE_WRONGRCR = "La valeur du rcr ne correspond pas au rcr de la demandeModif."; + public static final String ERR_FILE_WRONGRCR = "La valeur du rcr ne correspond pas au rcr de la demande."; public static final String ERR_FILE_WRONGPPN = "Le PPN n'est pas conforme."; public static final String ERR_FILE_WRONGEPN = "La valeur de l'epn n'est pas conforme."; diff --git a/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java index 7a049dee..3ee32424 100644 --- a/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java +++ b/core/src/test/java/fr/abes/item/core/components/TestFichierEnrichiSupp.java @@ -1,5 +1,6 @@ package fr.abes.item.core.components; +import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_SUPPRESSION; import fr.abes.item.core.entities.item.DemandeSupp; import fr.abes.item.core.entities.item.EtatDemande; @@ -8,19 +9,21 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.io.IOException; import java.nio.file.Paths; import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; @DisplayName("Test pour FichierEnrichi Suppression") public class TestFichierEnrichiSupp { @DisplayName("checkNok3Cols") @Test void checkNok3Cols() { - DemandeSupp demandeSupp = new DemandeSupp("341720001", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); - FichierEnrichiSupp fic = new FichierEnrichiSupp("Nok3Cols.csv"); + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkNok3Cols.csv"); fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); assertThat(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains("La première ligne du fichier doit contenir 3 colonnes (ppn;rcr;epn)")) @@ -29,25 +32,64 @@ void checkNok3Cols() { @DisplayName("checkOk3Cols") @Test - void checkOk3Cols() {} + void checkOk3Cols() throws IOException, FileCheckingException { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkOk3Cols.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + fic.checkFileContent(demandeSupp); + } @DisplayName("checkPpnNonOk") @Test - void checkPpnNonOk() {} + void checkPpnNonOk() { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkPpnNonOk.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + assertTrue(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains(Constant.ERR_FILE_WRONGPPN)); + } @DisplayName("checkRcrNonOk") @Test - void checkRcrNonOk() {} + void checkRcrNonOk() { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkRcrNonOk.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + assertTrue(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains(Constant.ERR_FILE_WRONGRCR)); + } @DisplayName("checkEpnVide") @Test - void checkEpnVide() {} + void checkEpnVide() throws IOException, FileCheckingException { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkEpnVide.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + fic.checkFileContent(demandeSupp); + } @DisplayName("checkEpnNonVideOk") @Test - void checkEpnNonVideOk() {} + void checkEpnNonVideOk() throws IOException, FileCheckingException { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkEpnNonVideOk.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + fic.checkFileContent(demandeSupp); + } @DisplayName("checkEpnNonVideNonOk") @Test - void checkEpnNonVideNonOk() {} + void checkEpnNonVideNonOk() { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkEpnNonVideNonOk.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + assertTrue(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains(Constant.ERR_FILE_WRONGEPN)); + } + + @DisplayName("checkRcrDiffDemande") + @Test + void checkRcrDiffDemande() { + DemandeSupp demandeSupp = new DemandeSupp("341725201", new Date(), new Date(), TYPE_SUPPRESSION.EPN, "", new EtatDemande(1), new Utilisateur(1)); + FichierEnrichiSupp fic = new FichierEnrichiSupp("checkRcrDiffDemande.csv"); + fic.setPath(Paths.get("src/test/resources/fichierEnrichiSupp")); + assertTrue(assertThrows(FileCheckingException.class, () -> fic.checkFileContent(demandeSupp)).getMessage().contains(Constant.ERR_FILE_WRONGRCR)); + } } diff --git a/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideNonOk.csv b/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideNonOk.csv new file mode 100644 index 00000000..81301c9a --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideNonOk.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +321654987;341725201;123 \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideOk.csv b/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideOk.csv new file mode 100644 index 00000000..562fb034 --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkEpnNonVideOk.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +321654987;341725201;123456789 \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/checkEpnVide.csv b/core/src/test/resources/fichierEnrichiSupp/checkEpnVide.csv new file mode 100644 index 00000000..baafbbee --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkEpnVide.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +123456789;341725201; \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv b/core/src/test/resources/fichierEnrichiSupp/checkNok3Cols.csv similarity index 100% rename from core/src/test/resources/fichierEnrichiSupp/Nok3Cols.csv rename to core/src/test/resources/fichierEnrichiSupp/checkNok3Cols.csv diff --git a/core/src/test/resources/fichierEnrichiSupp/checkOk3Cols.csv b/core/src/test/resources/fichierEnrichiSupp/checkOk3Cols.csv new file mode 100644 index 00000000..2110b66c --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkOk3Cols.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +123456789;341725201;321654987 \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/checkPpnNonOk.csv b/core/src/test/resources/fichierEnrichiSupp/checkPpnNonOk.csv new file mode 100644 index 00000000..6d32498a --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkPpnNonOk.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +123;341725201;123456789 \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/checkRcrDiffDemande.csv b/core/src/test/resources/fichierEnrichiSupp/checkRcrDiffDemande.csv new file mode 100644 index 00000000..fd950380 --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkRcrDiffDemande.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +123456789;341720001;456789321 \ No newline at end of file diff --git a/core/src/test/resources/fichierEnrichiSupp/checkRcrNonOk.csv b/core/src/test/resources/fichierEnrichiSupp/checkRcrNonOk.csv new file mode 100644 index 00000000..ad8a312b --- /dev/null +++ b/core/src/test/resources/fichierEnrichiSupp/checkRcrNonOk.csv @@ -0,0 +1,2 @@ +ppn;rcr;epn +123456789;12;123456789 \ No newline at end of file From 60f66f15366e35ed4f65383c472cbb7fab6995a4 Mon Sep 17 00:00:00 2001 From: Jerome Villiseck Date: Tue, 15 Oct 2024 17:45:49 +0200 Subject: [PATCH 06/13] =?UTF-8?q?-=20Ajout=20du=20calcul=20du=20temps=20d'?= =?UTF-8?q?execution=20des=20m=C3=A9thodes=20uniquement=20dans=20les=20m?= =?UTF-8?q?=C3=A9thodes=20choisies=20par=20le=20d=C3=A9veloppeur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/configuration/ItemLogAppender.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java index 143d49aa..d0c68d30 100644 --- a/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java +++ b/core/src/main/java/fr/abes/item/core/configuration/ItemLogAppender.java @@ -14,10 +14,29 @@ @Plugin(name = "ItemLogAppender", category = "core", elementType = Appender.ELEMENT_TYPE) public class ItemLogAppender extends AbstractAppender { + // Utilisation d'un ThreadLocal pour stocker l'heure de début de chaque méthode + private static final ThreadLocal startTime = new ThreadLocal<>(); + + // Seuil en ms au dessus duquel on veut afficher un message + private final int msSeuilDetection = 0; + protected ItemLogAppender(String name, Filter filter) { super(name, filter, null); } + // Méthode à appeler pour démarrer le chronométrage + public static void startMethodExecution() { + startTime.set(System.currentTimeMillis()); + } + + /** + * Appender permettant une normalisation des logs + * Pour obtenir le temps d'execution d'une méthode, ajoutez + * ItemLogAppender.startMethodExecution(); + * au début d'une méthode. L'appender calcule par méthode sans + * besoin d'une borne d'arrêt ou de fin + * @param event + */ @Override public void append(LogEvent event) { if (event.getLevel().isMoreSpecificThan(Level.INFO)) { @@ -25,7 +44,23 @@ public void append(LogEvent event) { String demandeId = ThreadContext.get("demandeId"); String typeDemande = ThreadContext.get("typeDemande"); if (demandeId != null && typeDemande != null) { - System.out.println("DEM_" + typeDemande + "_" + demandeId + " / " + event.getSource().getClassName() + " / " + event.getSource().getMethodName() + " : " + originalMessage); + // Calcul du temps d'exécution + Long startTimeValue = startTime.get(); + long executionTime = startTimeValue != null ? System.currentTimeMillis() - startTimeValue : -1; + + if (executionTime < msSeuilDetection) { + System.out.println("DEM_" + typeDemande + "_" + demandeId + " / " + + event.getSource().getClassName() + " / " + + event.getSource().getMethodName() + " : " + + originalMessage); + } + //Uniquement si un ItemLogAppender.startMethodExecution(); à été placé au début d'une méthode + else{ + System.out.println("DEM_" + typeDemande + "_" + demandeId + " / " + + event.getSource().getClassName() + " / " + + event.getSource().getMethodName() + " : " + + originalMessage + " / Execution time: " + executionTime + " ms"); + } } } } From 3cf94525b3e99c80ac3d858191c270e2154bfe71 Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Wed, 16 Oct 2024 10:07:09 +0200 Subject: [PATCH 07/13] =?UTF-8?q?FEAT=20ITEM-269-back-modifier-lordre-de-t?= =?UTF-8?q?ri-du-fichier=20=20=20=20=20=20-=20ajout=20d'une=20m=C3=A9thode?= =?UTF-8?q?=20de=20tri=20des=20correspondances=20dans=20Utilitaires.java?= =?UTF-8?q?=20=20=20=20=20=20-=20ajout=20d'une=20m=C3=A9thode=20d'inscript?= =?UTF-8?q?ion=20sur=20le=20fichier=20des=20correspondances=20tri=C3=A9es?= =?UTF-8?q?=20dans=20FichierPrepare.java=20=20=20=20=20=20-=20ajout=20d'un?= =?UTF-8?q?=20appel=20aux=20m=C3=A9thodes=20de=20tri=20des=20correspondanc?= =?UTF-8?q?es=20et=20d'=C3=A9criture=20sur=20le=20fichier=20dans=20Demande?= =?UTF-8?q?SuppService.java=20=20=20=20=20=20-=20ajout=20d'une=20constante?= =?UTF-8?q?=20en=20cas=20d'erreur=20d'inscription=20sur=20le=20fichier=20d?= =?UTF-8?q?es=20correspondances=20tri=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/core/components/FichierPrepare.java | 31 +++++++++++++------ .../fr/abes/item/core/constant/Constant.java | 1 + .../core/service/impl/DemandeSuppService.java | 1 + .../item/core/utilitaire/Utilitaires.java | 20 ++++++------ .../item/web/DownloadFichierRestService.java | 7 ++--- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java index 4c767206..c40d94f5 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java @@ -19,12 +19,12 @@ @Slf4j @Component public class FichierPrepare extends AbstractFichier implements Fichier { - + @Autowired public FichierPrepare(@Value("") final String filename) { this.filename = filename; } - + @Override public String getFilename() { return this.filename; @@ -34,7 +34,7 @@ public String getFilename() { public void setFilename(String filename) { this.filename = filename; } - + @Override public int getType() { return Constant.ETATDEM_PREPAREE; @@ -53,7 +53,7 @@ public void checkFileContent(Demande demandeModif) { public void generateFileName(Demande demande) { this.filename = Constant.FIC_PREPARE_NAME + demande.getId() + Constant.EXTENSIONCSV; } - + /** * Méthode d'écriture de la première ligne dans le fichier */ @@ -64,9 +64,9 @@ public void ecrireEnTete() { out.println("PPN;RCR;EPN;"); } catch (IOException ex) { log.error(Constant.ERROR_UNABLE_TO_CREATE_FILE); - } + } } - + /** * Méthode permetant d'alimenter le fichier à partir d'une chaine correspondant à une liste d'epn * @param input résultat de l'appel à la fonction Oracle @@ -88,8 +88,8 @@ public void alimenterEpn(String input, String listeppn, String rcr) { } } catch (IOException ex) { log.error(Constant.ERROR_UNABLE_TO_CREATE_FILE); - } - + } + } /** @@ -116,6 +116,19 @@ public void alimenterPpn(String input, String listeEpn, String rcr) { } } - + + /** + * Méthode permettant d'écrire sur le fichier la liste des correspondances triées + * @param sortedResult String contenant la liste des correspondances triées + */ + public void writeSortedFileToDisk(String sortedResult) { + try (FileWriter fw = new FileWriter(path.resolve(filename).toString()); + BufferedWriter bw = new BufferedWriter(fw); + PrintWriter out = new PrintWriter(bw)) { + out.println(sortedResult); + } catch (IOException ex) { + log.error(Constant.ERROR_UNABLE_TO_CREATE_SORTED_FILE); + } + } } diff --git a/core/src/main/java/fr/abes/item/core/constant/Constant.java b/core/src/main/java/fr/abes/item/core/constant/Constant.java index bf8ce134..7d27722c 100644 --- a/core/src/main/java/fr/abes/item/core/constant/Constant.java +++ b/core/src/main/java/fr/abes/item/core/constant/Constant.java @@ -231,6 +231,7 @@ public class Constant implements Serializable { public static final String ERROR_MONTH_RANGE = "Le mois doit être compris entre 1 et 12"; public static final String ERROR_YEAR_RANGE = "L'année ne peut pas être inférieure à l'année courante"; public static final String ERROR_UNABLE_TO_CREATE_FILE = "impossible de créer le fichier ppn;rcr;epn"; + public static final String ERROR_UNABLE_TO_CREATE_SORTED_FILE = "impossible de créer le fichier de correspondance trié"; public static final String ERROR_UNKNOWN_REST_CONTROLLER = "unknown error caught in RESTController, {}"; public static final String REST_RESPONDING_WITH_STATUS = "Response REST avec statut {}"; public static final String ERROR_FIRST_LINE_OF_FILE_NULL = "la première ligne du fichier est nulle"; diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java index c23101d9..693ab52d 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java @@ -181,6 +181,7 @@ private void preparerFichierEnPrep(DemandeSupp demande) throws IOException, Dema //Alimentation du fichier par appel à la procédure Oracle ppntoepn appelProcStockee(demande.getRcr(), demande.getTypeSuppression()); demande.setEtatDemande(new EtatDemande(Constant.ETATDEM_PREPAREE)); + fichierPrepare.writeSortedFileToDisk(Utilitaires.sortFichierCorrespondance(storageService.loadAsResource(fichierPrepare.getFilename()))); save(demande); checkEtatDemande(demande); } diff --git a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java index 26d334d5..83f73707 100644 --- a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java +++ b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java @@ -372,15 +372,15 @@ public static String getLabelTypeDemande(TYPE_DEMANDE typeDemande) { } /** - * Méthode qui permet de trier le contenu du fichier de correspondence + * Méthode qui permet de trier le contenu du fichier de correspondance * @param file un fichier de type Resource - * @return un fichier de type Resource + * @return une String contenant les correspondances triées * @throws IOException renvoi une exception si le fichier ne peut être lu */ - public static Resource sortFichierCorrespondance(Resource file) throws IOException { + public static String sortFichierCorrespondance(Resource file) throws IOException { FileReader fileReader = new FileReader(String.valueOf(file.getURI()).substring(6)); BufferedReader reader = new BufferedReader(fileReader); - List correspondenceUnsortList = new ArrayList<>(); + List correspondanceUnsortList = new ArrayList<>(); String result = null; int i = 0; for (String line = reader.readLine(); line != null; line = reader.readLine()) { @@ -388,18 +388,16 @@ public static Resource sortFichierCorrespondance(Resource file) throws IOExcepti result = line + "\n"; i++; } else { - // stockage des lignes de correspondence - correspondenceUnsortList.add(line+"\n"); + // stockage des lignes de correspondance + correspondanceUnsortList.add(line+"\n"); } } reader.close(); fileReader.close(); // tri des lignes - Collections.sort(correspondenceUnsortList); + Collections.sort(correspondanceUnsortList); // assemblage de l'en-tête avec les lignes pour constituer le résultat final - List correspondenceSortList = new ArrayList<>(correspondenceUnsortList); - result = result + correspondenceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); - - return new ByteArrayResource(result.getBytes()); + List correspondanceSortList = new ArrayList<>(correspondanceUnsortList); + return result + correspondanceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); } } diff --git a/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java b/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java index 73de34ad..44c05d3c 100644 --- a/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java +++ b/web/src/main/java/fr/abes/item/web/DownloadFichierRestService.java @@ -4,7 +4,6 @@ import fr.abes.item.core.exception.ForbiddenException; import fr.abes.item.core.exception.UserExistException; import fr.abes.item.core.service.FileSystemStorageService; -import fr.abes.item.core.utilitaire.Utilitaires; import fr.abes.item.security.CheckAccessToServices; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; @@ -45,7 +44,7 @@ public DownloadFichierRestService(FileSystemStorageService storageService, Check @Operation(summary = "permet de récupérer les fichiers relatifs à une demande") public ResponseEntity downloadFile( @PathVariable("filename") String filename, @PathVariable("id") Integer numDemande, @PathVariable("type") TYPE_DEMANDE type, HttpServletRequest request - ) throws UserExistException, ForbiddenException, IOException { + ) throws UserExistException, ForbiddenException { checkAccessToServices.autoriserAccesDemandeParIln(numDemande, request.getAttribute("userNum").toString(), type); if (numDemande != null && numDemande != 0) { @@ -54,10 +53,8 @@ public ResponseEntity downloadFile( } Resource file = storageService.loadAsResource(filename); - Resource bodyFile = Utilitaires.sortFichierCorrespondance(file); - return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=\"" + file.getFilename() + "\"") - .body(bodyFile); + .body(file); } } From e8bcd1be6ab4e3dff1a34b0609475ae21dcdc04e Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Wed, 16 Oct 2024 14:56:17 +0200 Subject: [PATCH 08/13] =?UTF-8?q?FEAT=20ITEM-269-back-modifier-lordre-de-t?= =?UTF-8?q?ri-du-fichier=20=20=20=20=20=20-=20d=C3=A9placement=20de=20la?= =?UTF-8?q?=20m=C3=A9thode=20sortFichierCorrespondance()=20de=20Utilitaire?= =?UTF-8?q?s.java=20vers=20FichierPrepare.java=20=20=20=20=20=20-=20renomm?= =?UTF-8?q?age=20de=20la=20m=C3=A9thode=20sortFichierCorrespondance()=20en?= =?UTF-8?q?=20sortOnFile()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/core/components/FichierPrepare.java | 43 +++++++++++++++---- .../core/service/impl/DemandeSuppService.java | 2 +- .../item/core/utilitaire/Utilitaires.java | 33 -------------- 3 files changed, 36 insertions(+), 42 deletions(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java index c40d94f5..901561de 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java @@ -11,10 +11,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; +import java.io.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; @Slf4j @Component @@ -89,7 +89,6 @@ public void alimenterEpn(String input, String listeppn, String rcr) { } catch (IOException ex) { log.error(Constant.ERROR_UNABLE_TO_CREATE_FILE); } - } /** @@ -114,18 +113,46 @@ public void alimenterPpn(String input, String listeEpn, String rcr) { } catch (IOException ex) { log.error(Constant.ERROR_UNABLE_TO_CREATE_FILE); } + } + /** + * Méthode qui permet de trier le contenu du fichier de correspondance + * @throws IOException renvoi une exception si le fichier ne peut être lu + */ + public void trierLignesDeCorrespondances() throws IOException { + FileReader fileReader = new FileReader(path.resolve(filename).toString()); + BufferedReader reader = new BufferedReader(fileReader); + List correspondanceUnsortList = new ArrayList<>(); + String result = null; + int i = 0; + for (String line = reader.readLine(); line != null; line = reader.readLine()) { + if (i == 0) { // stockage de la ligne d'en-tête + result = line + "\n"; + i++; + } else { + // stockage des lignes de correspondance + correspondanceUnsortList.add(line+"\n"); + } + } + reader.close(); + fileReader.close(); + // tri des lignes + Collections.sort(correspondanceUnsortList); + // assemblage de l'en-tête avec les lignes pour constituer le résultat final + List correspondanceSortList = new ArrayList<>(correspondanceUnsortList); + result = result + correspondanceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); + ecrireFichierTrie(result); } /** * Méthode permettant d'écrire sur le fichier la liste des correspondances triées - * @param sortedResult String contenant la liste des correspondances triées + * @param sortedLines String contenant la liste des correspondances triées */ - public void writeSortedFileToDisk(String sortedResult) { + public void ecrireFichierTrie(String sortedLines) { try (FileWriter fw = new FileWriter(path.resolve(filename).toString()); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { - out.println(sortedResult); + out.println(sortedLines); } catch (IOException ex) { log.error(Constant.ERROR_UNABLE_TO_CREATE_SORTED_FILE); } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java index 693ab52d..6b0f8cf2 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java @@ -181,7 +181,7 @@ private void preparerFichierEnPrep(DemandeSupp demande) throws IOException, Dema //Alimentation du fichier par appel à la procédure Oracle ppntoepn appelProcStockee(demande.getRcr(), demande.getTypeSuppression()); demande.setEtatDemande(new EtatDemande(Constant.ETATDEM_PREPAREE)); - fichierPrepare.writeSortedFileToDisk(Utilitaires.sortFichierCorrespondance(storageService.loadAsResource(fichierPrepare.getFilename()))); + fichierPrepare.trierLignesDeCorrespondances(); save(demande); checkEtatDemande(demande); } diff --git a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java index 83f73707..8d7c66a9 100644 --- a/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java +++ b/core/src/main/java/fr/abes/item/core/utilitaire/Utilitaires.java @@ -12,11 +12,7 @@ import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.core.io.ByteArrayResource; -import org.springframework.core.io.Resource; -import java.io.BufferedReader; -import java.io.FileReader; import java.io.IOException; import java.util.*; import java.util.regex.Matcher; @@ -371,33 +367,4 @@ public static String getLabelTypeDemande(TYPE_DEMANDE typeDemande) { }; } - /** - * Méthode qui permet de trier le contenu du fichier de correspondance - * @param file un fichier de type Resource - * @return une String contenant les correspondances triées - * @throws IOException renvoi une exception si le fichier ne peut être lu - */ - public static String sortFichierCorrespondance(Resource file) throws IOException { - FileReader fileReader = new FileReader(String.valueOf(file.getURI()).substring(6)); - BufferedReader reader = new BufferedReader(fileReader); - List correspondanceUnsortList = new ArrayList<>(); - String result = null; - int i = 0; - for (String line = reader.readLine(); line != null; line = reader.readLine()) { - if (i == 0) { // stockage de la ligne d'en-tête - result = line + "\n"; - i++; - } else { - // stockage des lignes de correspondance - correspondanceUnsortList.add(line+"\n"); - } - } - reader.close(); - fileReader.close(); - // tri des lignes - Collections.sort(correspondanceUnsortList); - // assemblage de l'en-tête avec les lignes pour constituer le résultat final - List correspondanceSortList = new ArrayList<>(correspondanceUnsortList); - return result + correspondanceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); - } } From 4b8769a34e07f0064080b51b17b35422e379a59e Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:20:53 +0200 Subject: [PATCH 09/13] =?UTF-8?q?FEAT=20ITEM-269-back-modifier-lordre-de-t?= =?UTF-8?q?ri-du-fichier=20=20=20=20=20=20-=20passage=20de=20la=20m=C3=A9t?= =?UTF-8?q?hode=20ecrireFichierTrie()=20en=20private?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/fr/abes/item/core/components/FichierPrepare.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java index 901561de..16e60c74 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java @@ -148,7 +148,7 @@ public void trierLignesDeCorrespondances() throws IOException { * Méthode permettant d'écrire sur le fichier la liste des correspondances triées * @param sortedLines String contenant la liste des correspondances triées */ - public void ecrireFichierTrie(String sortedLines) { + private void ecrireFichierTrie(String sortedLines) { try (FileWriter fw = new FileWriter(path.resolve(filename).toString()); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { From fe805970b67c005a662dfac45651e69e7a35d4a1 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Thu, 17 Oct 2024 08:49:26 +0200 Subject: [PATCH 10/13] =?UTF-8?q?ITEM-282=20:=20Gestion=20cas=20colonnes?= =?UTF-8?q?=20vides=20sur=20demande=20suppression=20avec=20types=20ppn=20o?= =?UTF-8?q?u=20epn.=20Gestion=20du=20cas=20ou=20colonne=20epn=20vide=20dan?= =?UTF-8?q?s=20traitement=20batch=20Homog=C3=A9n=C3=A9isation=20des=20buff?= =?UTF-8?q?eredReader=20dans=20les=20diff=C3=A9rents=20types=20de=20demand?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LignesFichierProcessor.java | 19 ++++++---- .../core/components/FichierEnrichiSupp.java | 5 ++- .../fr/abes/item/core/constant/Constant.java | 2 +- .../impl/LigneFichierExempService.java | 3 +- .../impl/LigneFichierModifService.java | 14 +------ .../service/impl/LigneFichierSuppService.java | 38 +++++++------------ 6 files changed, 33 insertions(+), 48 deletions(-) diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/traiterlignesfichierchunk/LignesFichierProcessor.java b/batch/src/main/java/fr/abes/item/batch/traitement/traiterlignesfichierchunk/LignesFichierProcessor.java index 72e2e756..1b456829 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/traiterlignesfichierchunk/LignesFichierProcessor.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/traiterlignesfichierchunk/LignesFichierProcessor.java @@ -155,14 +155,19 @@ private LigneFichierDtoSupp processDemandeSupp(LigneFichierDto ligneFichierDto) //récupération des exemplaires existants pour cette ligne List exemplairesExistants = ((DemandeSuppService) strategyFactory.getStrategy(IDemandeService.class, TYPE_DEMANDE.SUPP)) .getExemplairesExistants(ligneFichierDtoSupp.getPpn()); - Optional exemplaireASupprimerOpt = exemplairesExistants.stream().filter(exemplaire -> exemplaire.findZone("A99", 0).getValeur().equals(ligneFichierDtoSupp.getEpn())).findFirst(); - if (exemplaireASupprimerOpt.isPresent()){ - this.fichierSauvegardeSuppTxt.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get()); - this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get()); + if (ligneFichierDtoSupp.getEpn() != null) { + Optional exemplaireASupprimerOpt = exemplairesExistants.stream().filter(exemplaire -> exemplaire.findZone("A99", 0).getValeur().equals(ligneFichierDtoSupp.getEpn())).findFirst(); + if (exemplaireASupprimerOpt.isPresent()) { + this.fichierSauvegardeSuppTxt.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get()); + this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get()); + } + //supprimer l'exemplaire + this.proxyRetry.deleteExemplaire(demandeSupp, ligneFichierDtoSupp); + ligneFichierDtoSupp.setRetourSudoc(Constant.EXEMPLAIRE_SUPPRIME); + } else { + //si pas d'epn dans la ligne du fichier, on ne fait pas le traitement et on écrit directement le message dans le retour sudoc pour le fichier résultat + ligneFichierDtoSupp.setRetourSudoc("Exemplaire inexistant"); } - //supprimer l'exemplaire - this.proxyRetry.deleteExemplaire(demandeSupp, ligneFichierDtoSupp); - ligneFichierDtoSupp.setRetourSudoc(Constant.EXEMPLAIRE_SUPPRIME); return ligneFichierDtoSupp; } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java index b96ab193..e9999f47 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java @@ -2,6 +2,7 @@ import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; +import fr.abes.item.core.constant.TYPE_SUPPRESSION; import fr.abes.item.core.entities.item.Demande; import fr.abes.item.core.entities.item.DemandeSupp; import fr.abes.item.core.exception.FileCheckingException; @@ -84,8 +85,10 @@ private void check3Cols(String ligne) throws FileCheckingException { private void checkBodyLine(String ligne, DemandeSupp demandeSupp) throws FileCheckingException { try { String[] tabligne = ligne.split(";"); + if (demandeSupp.getTypeDemande().equals(TYPE_SUPPRESSION.EPN) && tabligne[0] != null) { + checkPpn(tabligne[0], ligneCourante); + } checkRcr(tabligne[1], demandeSupp.getRcr(), ligneCourante); - checkPpn(tabligne[0], ligneCourante); //cas ou l'epn est renseigné if (tabligne.length > 2) checkEpn(tabligne[2], ligneCourante); diff --git a/core/src/main/java/fr/abes/item/core/constant/Constant.java b/core/src/main/java/fr/abes/item/core/constant/Constant.java index e1ad5234..7396b209 100644 --- a/core/src/main/java/fr/abes/item/core/constant/Constant.java +++ b/core/src/main/java/fr/abes/item/core/constant/Constant.java @@ -95,7 +95,7 @@ public class Constant implements Serializable { public static final String LIGNE_FICHIER_SERVICE_PATTERN = "^(?\\d{1,9}X?);(?\\d{8,9});(?\\d{1,9}X?);(?.+)?"; - public static final String LIGNE_FICHIER_SERVICE_PATTERN_SANS_VALEUR = "^(?\\d{1,9}X?);(?\\d{8,9});(?\\d{1,9}X?)?"; + public static final String LIGNE_FICHIER_SERVICE_PATTERN_SANS_VALEUR = "(?\\d{1,9}X?)?;(?\\d{8,9});(?\\d{1,9}X?)?"; /**Specific errors on file format*/ public static final String ERR_FILE_NOT_FOUND = "Fichier introuvable."; diff --git a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierExempService.java b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierExempService.java index c84aa52f..2de9bd99 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierExempService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierExempService.java @@ -72,8 +72,7 @@ public void saveFile(File file, Demande demande) { LigneFichierExemp ligneFichierExemp = new LigneFichierExemp(indexRecherche.toString(), valeur.toString(), 0, position++, "", null, demandeExemp, null); dao.save(ligneFichierExemp); } - } catch ( - IOException e) { + } catch (IOException e) { log.error(e.getMessage()); } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierModifService.java b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierModifService.java index fb8bb607..bb41df7a 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierModifService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierModifService.java @@ -38,11 +38,7 @@ public LigneFichierModifService(ILigneFichierModifDao dao) { @SuppressWarnings("squid:S3776") public void saveFile(File file, Demande demande){ DemandeModif demandeModif = (DemandeModif) demande; - BufferedReader reader = null; - - try { - reader = ReaderFactory.createBufferedReader(file); - + try (BufferedReader reader = ReaderFactory.createBufferedReader(file)){ String line; String firstLine = reader.readLine(); //ne pas prendre en compte la première ligne avec les en-tête @@ -75,14 +71,6 @@ public void saveFile(File file, Demande demande){ } } catch (IOException e){ log.error(e.getMessage()); - } finally { - if (reader != null){ - try { - reader.close(); - } catch (IOException e) { - log.error(e.getMessage()); - } - } } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierSuppService.java b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierSuppService.java index 4628c41c..0221e57b 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierSuppService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierSuppService.java @@ -3,7 +3,10 @@ import fr.abes.item.core.configuration.factory.Strategy; import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; -import fr.abes.item.core.entities.item.*; +import fr.abes.item.core.entities.item.Demande; +import fr.abes.item.core.entities.item.DemandeSupp; +import fr.abes.item.core.entities.item.LigneFichier; +import fr.abes.item.core.entities.item.LigneFichierSupp; import fr.abes.item.core.repository.item.ILigneFichierSuppDao; import fr.abes.item.core.service.ILigneFichierService; import fr.abes.item.core.utilitaire.Utilitaires; @@ -21,7 +24,7 @@ import java.util.regex.Pattern; @Slf4j -@Strategy(type= ILigneFichierService.class, typeDemande = {TYPE_DEMANDE.SUPP}) +@Strategy(type = ILigneFichierService.class, typeDemande = {TYPE_DEMANDE.SUPP}) @Service public class LigneFichierSuppService implements ILigneFichierService { private final ILigneFichierSuppDao dao; @@ -32,23 +35,19 @@ public LigneFichierSuppService(ILigneFichierSuppDao dao) { @Override @Transactional - public void saveFile(File file, Demande demande){ + public void saveFile(File file, Demande demande) { DemandeSupp demandeSupp = (DemandeSupp) demande; - BufferedReader reader = null; - - try { - reader = ReaderFactory.createBufferedReader(file); - + try (BufferedReader reader = ReaderFactory.createBufferedReader(file)) { String line; String firstLine = reader.readLine(); //ne pas prendre en compte la première ligne avec les en-tête - if(firstLine == null){ + if (firstLine == null) { log.error(Constant.ERROR_FIRST_LINE_OF_FILE_NULL); } int position = 0; - - while ((line = reader.readLine()) != null){ + List listToSave = new ArrayList<>(); + while ((line = reader.readLine()) != null) { Pattern regexp = Pattern.compile(Constant.LIGNE_FICHIER_SERVICE_PATTERN_SANS_VALEUR); Matcher colsFinded = regexp.matcher(line); String ppn = ""; @@ -62,21 +61,12 @@ public void saveFile(File file, Demande demande){ if (colsFinded.group("epn") != null) epn = Utilitaires.addZeros(colsFinded.group("epn"), Constant.TAILLEMAX); } - if (!epn.isEmpty()) { - LigneFichierSupp lf = new LigneFichierSupp(ppn, rcr, epn, position++, 0, "", demandeSupp); - dao.save(lf); - } + LigneFichierSupp lf = new LigneFichierSupp(ppn, rcr, epn, position++, 0, "", demandeSupp); + listToSave.add(lf); } - } catch (IOException e){ + dao.saveAll(listToSave); + } catch (IOException e) { log.error(e.getMessage()); - } finally { - if (reader != null){ - try { - reader.close(); - } catch (IOException e) { - log.error(e.getMessage()); - } - } } } From cb7d442c3316c4b617aed338b89967331cd38ea5 Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Thu, 17 Oct 2024 08:59:42 +0200 Subject: [PATCH 11/13] =?UTF-8?q?FEAT=20ITEM-269-back-modifier-lordre-de-t?= =?UTF-8?q?ri-du-fichier=20=20=20=20=20=20-=20simplification=20du=20code?= =?UTF-8?q?=20de=20la=20m=C3=A9thode=20trierLignesDeCorrespondances()=20da?= =?UTF-8?q?ns=20FichierPrepare.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/core/components/FichierPrepare.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java index 16e60c74..d152a7d2 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierPrepare.java @@ -122,25 +122,16 @@ public void alimenterPpn(String input, String listeEpn, String rcr) { public void trierLignesDeCorrespondances() throws IOException { FileReader fileReader = new FileReader(path.resolve(filename).toString()); BufferedReader reader = new BufferedReader(fileReader); - List correspondanceUnsortList = new ArrayList<>(); - String result = null; - int i = 0; - for (String line = reader.readLine(); line != null; line = reader.readLine()) { - if (i == 0) { // stockage de la ligne d'en-tête - result = line + "\n"; - i++; - } else { - // stockage des lignes de correspondance - correspondanceUnsortList.add(line+"\n"); - } - } + + List correspondanceSortList = new ArrayList<>(); + String header = reader.readLine();//cette ligne enleve le header et le stock + correspondanceSortList.add(header + "\n"); + reader.lines().sorted().forEach(line -> { + correspondanceSortList.add(line+"\n"); + }); reader.close(); fileReader.close(); - // tri des lignes - Collections.sort(correspondanceUnsortList); - // assemblage de l'en-tête avec les lignes pour constituer le résultat final - List correspondanceSortList = new ArrayList<>(correspondanceUnsortList); - result = result + correspondanceSortList.toString().replaceAll(", ","").replaceAll("\\[", "").replaceAll("\\[", "").replaceAll("\\]", "").replaceAll("\\]", ""); + String result = String.join("", correspondanceSortList); ecrireFichierTrie(result); } From c3eabe5c715f657cd54b2c26816119ea4eb62744 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Thu, 17 Oct 2024 09:03:26 +0200 Subject: [PATCH 12/13] =?UTF-8?q?FIX=20:=20Correction=20condition=20dans?= =?UTF-8?q?=20v=C3=A9rification=20fichier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/fr/abes/item/core/components/FichierEnrichiSupp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java index e9999f47..e6a4bed8 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierEnrichiSupp.java @@ -85,7 +85,7 @@ private void check3Cols(String ligne) throws FileCheckingException { private void checkBodyLine(String ligne, DemandeSupp demandeSupp) throws FileCheckingException { try { String[] tabligne = ligne.split(";"); - if (demandeSupp.getTypeDemande().equals(TYPE_SUPPRESSION.EPN) && tabligne[0] != null) { + if (demandeSupp.getTypeSuppression().equals(TYPE_SUPPRESSION.EPN) && tabligne[0] != null) { checkPpn(tabligne[0], ligneCourante); } checkRcr(tabligne[1], demandeSupp.getRcr(), ligneCourante); From 939a2e35f2bf3a7b1968353e5879d88bb059b3d6 Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Thu, 17 Oct 2024 15:47:31 +0200 Subject: [PATCH 13/13] FEAT ITEM-295-le-shortname-du-rcr-ne-se-met-pas-a-jour-lors-dune-modification-du-rcr-a-letape-1-sur-le-front --- .../main/java/fr/abes/item/core/service/IDemandeService.java | 2 ++ .../fr/abes/item/core/service/impl/DemandeExempService.java | 5 +++++ .../fr/abes/item/core/service/impl/DemandeModifService.java | 5 +++++ .../fr/abes/item/core/service/impl/DemandeRecouvService.java | 5 +++++ .../fr/abes/item/core/service/impl/DemandeSuppService.java | 5 +++++ web/src/main/java/fr/abes/item/web/DemandeRestService.java | 1 + 6 files changed, 23 insertions(+) diff --git a/core/src/main/java/fr/abes/item/core/service/IDemandeService.java b/core/src/main/java/fr/abes/item/core/service/IDemandeService.java index ba11c28a..d3a9c175 100644 --- a/core/src/main/java/fr/abes/item/core/service/IDemandeService.java +++ b/core/src/main/java/fr/abes/item/core/service/IDemandeService.java @@ -21,6 +21,8 @@ public interface IDemandeService { Demande creerDemande(String rcr, Integer userNum); + void modifierShortNameDemande(Demande demande); + Demande archiverDemande(Demande demande) throws DemandeCheckingException; void deleteById(Integer id); diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeExempService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeExempService.java index f23a4463..fbefdb8d 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeExempService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeExempService.java @@ -751,4 +751,9 @@ public Demande archiverDemande(Demande demande) throws DemandeCheckingException ligneFichierService.deleteByDemande(demandeExemp); return changeState(demandeExemp, Constant.ETATDEM_ARCHIVEE); } + + @Override + public void modifierShortNameDemande(Demande demande) { + setIlnShortNameOnDemande(demande); + } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeModifService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeModifService.java index 75d0b02e..9e93d717 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeModifService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeModifService.java @@ -586,4 +586,9 @@ public Demande majTraitement(Integer demandeId, Integer traitementId) { } return null; } + + @Override + public void modifierShortNameDemande(Demande demande) { + setIlnShortNameOnDemande(demande); + } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeRecouvService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeRecouvService.java index 97f6e192..6214a375 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeRecouvService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeRecouvService.java @@ -356,4 +356,9 @@ public List getDemandesToDelete() { return listeDemandes; return null; } + + @Override + public void modifierShortNameDemande(Demande demande) { + setIlnShortNameOnDemande(demande); + } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java index 6b0f8cf2..a3a6746f 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/DemandeSuppService.java @@ -86,6 +86,11 @@ public Demande creerDemande(String rcr, Integer userNum) { return save(demandeSupp); } + @Override + public void modifierShortNameDemande(Demande demande) { + setIlnShortNameOnDemande(demande); + } + @Override public Demande archiverDemande(Demande demande) throws DemandeCheckingException { DemandeSupp demandeSupp = (DemandeSupp) demande; diff --git a/web/src/main/java/fr/abes/item/web/DemandeRestService.java b/web/src/main/java/fr/abes/item/web/DemandeRestService.java index c31a262c..f91215ee 100644 --- a/web/src/main/java/fr/abes/item/web/DemandeRestService.java +++ b/web/src/main/java/fr/abes/item/web/DemandeRestService.java @@ -125,6 +125,7 @@ public DemandeWebDto modifDemande(@PathVariable("type") TYPE_DEMANDE type, @Path if (demande != null) { if (rcr.isPresent()) { demande.setRcr(rcr.get()); + service.modifierShortNameDemande(demande); return builder.buildDemandeDto(service.save(demande), type); } if (type.equals(TYPE_DEMANDE.EXEMP) && typeExemp.isPresent()) {