From d3671f14d55af2c033c1b27eabdca7cf82e214fe Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Wed, 2 Oct 2024 16:01:59 +0200 Subject: [PATCH] =?UTF-8?q?FEAT=20ITEM-235-batch-alimenter-le-fichier-de-s?= =?UTF-8?q?auvegarde-csv=20=20=20=20=20=20-=20ajout=20des=20TUs=20pour=20l?= =?UTF-8?q?a=20m=C3=A9thode=20FichierSauvegardeSuppCsv=20=20=20=20=20=20-?= =?UTF-8?q?=20ajout=20du=20d=C3=A9but=20de=20l'algorithme=20d'alimentation?= =?UTF-8?q?=20du=20fichier=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/abes/item/batch/JobConfiguration.java | 7 +- .../CreerFichierSauvegardeTasklet.java | 1 - .../LignesFichierProcessor.java | 9 +- .../components/FichierSauvegardeSuppCsv.java | 82 +++++++++++-------- .../components/FichierSauvegardeSuppTxt.java | 3 +- .../item/core/service/ReferenceService.java | 8 +- .../FichierSauvegardeSuppCsvTest.java | 81 +++++++++++++----- 7 files changed, 126 insertions(+), 65 deletions(-) diff --git a/batch/src/main/java/fr/abes/item/batch/JobConfiguration.java b/batch/src/main/java/fr/abes/item/batch/JobConfiguration.java index 05c1b14b..21f19400 100644 --- a/batch/src/main/java/fr/abes/item/batch/JobConfiguration.java +++ b/batch/src/main/java/fr/abes/item/batch/JobConfiguration.java @@ -13,6 +13,7 @@ import fr.abes.item.core.configuration.factory.StrategyFactory; import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; +import fr.abes.item.core.service.ReferenceService; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; @@ -54,6 +55,7 @@ public class JobConfiguration { private final StrategyFactory strategyFactory; private final ProxyRetry proxyRetry; + private final ReferenceService referenceService; @Value("${batch.min.hour}") int minHour; @@ -69,9 +71,10 @@ public class JobConfiguration { private Integer nbPpnInFileResult; - public JobConfiguration(StrategyFactory strategyFactory, ProxyRetry proxyRetry) { + public JobConfiguration(StrategyFactory strategyFactory, ProxyRetry proxyRetry, ReferenceService referenceService) { this.strategyFactory = strategyFactory; this.proxyRetry = proxyRetry; + this.referenceService = referenceService; } @Bean @@ -88,7 +91,7 @@ public LignesFichierReader reader() { @Bean @StepScope public LignesFichierProcessor processor() { - return new LignesFichierProcessor(strategyFactory, proxyRetry); + return new LignesFichierProcessor(strategyFactory, proxyRetry, this.referenceService); } @Bean public LignesFichierWriter writer() { diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/CreerFichierSauvegardeTasklet.java b/batch/src/main/java/fr/abes/item/batch/traitement/CreerFichierSauvegardeTasklet.java index b91f961f..e6bbdd02 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/CreerFichierSauvegardeTasklet.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/CreerFichierSauvegardeTasklet.java @@ -53,7 +53,6 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon this.fichierCsv = (FichierSauvegardeSuppCsv) FichierFactory.getFichier(Constant.ETATDEM_ATTENTE_2, TYPE_DEMANDE.SUPP); fichierCsv.generateFileName(this.demande); fichierCsv.setPath(Paths.get(uploadPath + demande.getTypeDemande().toString().toLowerCase() + "/" + demande.getId())); - fichierCsv.initWriter(); fichierCsv.writeHeader(); return RepeatStatus.FINISHED; } 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 366dffda..13882bef 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 @@ -16,6 +16,7 @@ import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.exception.StorageException; import fr.abes.item.core.service.IDemandeService; +import fr.abes.item.core.service.ReferenceService; import fr.abes.item.core.service.impl.DemandeSuppService; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -38,14 +39,16 @@ public class LignesFichierProcessor implements ItemProcessor, StepExecutionListener { private final StrategyFactory strategyFactory; private final ProxyRetry proxyRetry; - private FichierSauvegardeSuppTxt fichierSauvegardeSuppTxt; + private final ReferenceService referenceService; + private FichierSauvegardeSuppTxt fichierSauvegardeSuppTxt; private FichierSauvegardeSuppCsv fichierSauvegardeSuppcsv; private Demande demande; - public LignesFichierProcessor(StrategyFactory strategyFactory, ProxyRetry proxyRetry) { + public LignesFichierProcessor(StrategyFactory strategyFactory, ProxyRetry proxyRetry,ReferenceService referenceService) { this.strategyFactory = strategyFactory; this.proxyRetry = proxyRetry; + this.referenceService = referenceService; } @@ -62,7 +65,7 @@ public void beforeStep(StepExecution stepExecution) { this.fichierSauvegardeSuppTxt.setPath(Path.of(String.valueOf(executionContext.get("fichierTxtPath")))); this.fichierSauvegardeSuppTxt.setFilename(String.valueOf(executionContext.get("fichierTxtName"))); - this.fichierSauvegardeSuppcsv = new FichierSauvegardeSuppCsv(); + this.fichierSauvegardeSuppcsv = new FichierSauvegardeSuppCsv(this.referenceService); this.fichierSauvegardeSuppcsv.setPath(Path.of(String.valueOf(executionContext.get("fichierCsvPath")))); this.fichierSauvegardeSuppcsv.setFilename(String.valueOf(executionContext.get("fichierCsvName"))); 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 58ace389..40741852 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 @@ -1,6 +1,5 @@ package fr.abes.item.core.components; -import com.opencsv.CSVWriter; import fr.abes.cbs.notices.Exemplaire; import fr.abes.cbs.notices.Zone; import fr.abes.item.core.constant.Constant; @@ -10,62 +9,72 @@ import fr.abes.item.core.exception.StorageException; import fr.abes.item.core.service.ReferenceService; import lombok.Getter; -import lombok.NoArgsConstructor; import lombok.Setter; import org.springframework.stereotype.Component; +import java.io.BufferedWriter; +import java.io.FileWriter; import java.io.IOException; -import java.nio.file.Files; +import java.io.PrintWriter; import java.nio.file.Path; import java.util.List; @Setter @Getter @Component -@NoArgsConstructor public class FichierSauvegardeSuppCsv extends AbstractFichier implements Fichier { - private ReferenceService referenceService; + private final ReferenceService referenceService; - private CSVWriter csvWriter; + public FichierSauvegardeSuppCsv(ReferenceService referenceService) { + this.referenceService = referenceService; + } public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { - // création de la liste de référence pour trouver l'emplacement de chaque zone et sous-zone - List listDeReference = referenceService.constructHeaderCsv(); - listDeReference.remove(0); - - String resultat = ""; + try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); + BufferedWriter bw = new BufferedWriter(fw); + PrintWriter out = new PrintWriter(bw)) { + // création de la liste de référence pour trouver l'emplacement de chaque zone et sous-zone + List listDeReference = referenceService.constructHeaderCsv(); + listDeReference.remove(0); + // 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"); + } - gererZones(listDeReference, exemplaire, resultat, null); // TODO passer une vrai Zone ou retirer le paramètre Zone dans l'appel de la méthode + } - // ajout de la ligne - this.csvWriter.writeNext(resultat.split(";")); + public String gererZones(List listeZonesEtSousZones, Exemplaire exemplaire) { + return gererZonesRecursif(listeZonesEtSousZones, 0, exemplaire, "", null); } - public String gererZones(List listeZonesEtSousZones, Exemplaire exemplaire, String resultat, Zone zone) { - if (listeZonesEtSousZones.isEmpty()) { - return resultat; + private String gererZonesRecursif(List listeZonesEtSousZones, int index, Exemplaire exemplaire, String resultat, Zone zone) { + if (index >= listeZonesEtSousZones.size()) { + if (resultat != null && !resultat.isEmpty()) { + return resultat.substring(0, resultat.length()-1); + } + return null; } - String zoneSousZone = listeZonesEtSousZones.remove(0); + String zoneSousZone = listeZonesEtSousZones.get(index); + if (zoneSousZone.startsWith("$")) { - return gererSousZone(listeZonesEtSousZones, exemplaire, resultat, zone, zoneSousZone); + if (zone != null) { + String sousZone = zone.findSubLabel(zoneSousZone); + if (sousZone != null) { + resultat += sousZone; + } + } } else { zone = exemplaire.findZone(zoneSousZone.split("\\$")[0],0); if (zone != null) { String sousZone = zone.findSubLabel(zoneSousZone.split("\\$")[1]); - resultat += sousZone; + if (sousZone != null) { + resultat += sousZone; + } } - resultat += ";"; - } - return gererZones(listeZonesEtSousZones, exemplaire, resultat, zone); - } - - private String gererSousZone(List listeZonesEtSousZones, Exemplaire exemplaire, String resultat, Zone zone, String sousZoneAChercher) { - if (zone != null) { - String sousZone = zone.findSubLabel(sousZoneAChercher); - resultat += sousZone + ";"; } - return gererZones(listeZonesEtSousZones, exemplaire, resultat, zone); + return gererZonesRecursif(listeZonesEtSousZones, index+1, exemplaire, resultat + ";", zone); } @Override @@ -98,11 +107,14 @@ public void checkFileContent(Demande d) throws FileCheckingException, IOExceptio //non implémentée } - public void initWriter() throws IOException { - this.csvWriter = new CSVWriter(Files.newBufferedWriter(this.path), ';', CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END); - } - public void writeHeader() { - this.csvWriter.writeNext((String[]) this.referenceService.constructHeaderCsv().toArray()); + try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); + BufferedWriter bw = new BufferedWriter(fw); + PrintWriter out = new PrintWriter(bw)) { + // 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"); + } } } diff --git a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java index d93b8956..25b64ba0 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java @@ -26,10 +26,9 @@ public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageExce BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { out.println(ppn); - out.println("\n"); + out.print("\n"); out.println(exemplaire); out.println("\n"); - out.println("\n"); } catch (IOException ex) { throw new StorageException("Impossible d'écrire dans le fichier de sauvegarde txt"); } diff --git a/core/src/main/java/fr/abes/item/core/service/ReferenceService.java b/core/src/main/java/fr/abes/item/core/service/ReferenceService.java index ac4f2e70..f449131a 100644 --- a/core/src/main/java/fr/abes/item/core/service/ReferenceService.java +++ b/core/src/main/java/fr/abes/item/core/service/ReferenceService.java @@ -69,9 +69,11 @@ public List constructHeaderCsv() { List headerCsv = new ArrayList<>(); headerCsv.add("PPN"); for (ZonesAutorisees zonesAutorisees: listZonesAutorisees) { - headerCsv.add(zonesAutorisees.getLabelZone()+zonesAutorisees.getSousZonesAutorisees().remove(0).getLibelle()); - for (SousZonesAutorisees sousZonesAutorisees : zonesAutorisees.getSousZonesAutorisees()) { - headerCsv.add(sousZonesAutorisees.getLibelle()); + if(!zonesAutorisees.getLabelZone().startsWith("L")){ + headerCsv.add(zonesAutorisees.getLabelZone()+zonesAutorisees.getSousZonesAutorisees().remove(0).getLibelle()); + for (SousZonesAutorisees sousZonesAutorisees : zonesAutorisees.getSousZonesAutorisees()) { + headerCsv.add(sousZonesAutorisees.getLibelle()); + } } } return headerCsv; diff --git a/core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java b/core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java index dcd2351e..5b373d0d 100644 --- a/core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java +++ b/core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java @@ -1,6 +1,6 @@ package fr.abes.item.core.components; -import com.opencsv.CSVWriter; +import com.google.common.collect.Lists; import fr.abes.cbs.exception.ZoneException; import fr.abes.cbs.notices.Exemplaire; import fr.abes.cbs.notices.TYPE_NOTICE; @@ -13,7 +13,8 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; @SpringBootTest(classes = {FichierSauvegardeSuppCsv.class}) class FichierSauvegardeSuppCsvTest { @@ -24,29 +25,71 @@ class FichierSauvegardeSuppCsvTest { @MockBean private ReferenceService referenceService; - CSVWriter csvWriter; + @Test + void gererZonesAvec1Exemplaire() throws ZoneException { + List listZoneSousZone = List.of("930$c;$d;991$a".split(";")); + + Exemplaire exemplaire = new Exemplaire(); + Zone zone930 = new Zone("930", TYPE_NOTICE.EXEMPLAIRE); + zone930.addSubLabel("$c", "test 930$c"); + zone930.addSubLabel("$d", "test 930$d"); + + exemplaire.addZone(zone930); + exemplaire.addZone("991", "$a", "test 991$a"); + + String result = fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire); + + assertEquals("test 930$c;test 930$d;test 991$a", result); + } @Test - void gererZones() throws ZoneException { - List listZoneSousZone = List.of("917$a;930$a;$c;$d;$e;$i;$j;$v;$2;$l;$k;991$a;915$a;$b;$f;955$a;$k;$4;920$a;$b;$c".split(";")); + void gererZonesAvec1ExemplaireEtListeLongue() throws ZoneException { + List listZoneSousZone = List.of("915$a;917$a;930$a;$c;$d;$i;$j;991$a".split(";")); + + Exemplaire exemplaire = new Exemplaire(); + Zone zone930 = new Zone("930", TYPE_NOTICE.EXEMPLAIRE); + zone930.addSubLabel("$c", "test 930$c"); + zone930.addSubLabel("$d", "test 930$d"); + + exemplaire.addZone(zone930); + exemplaire.addZone("991", "$a", "test 991$a"); - String resultat = ""; + String result = fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire); + + assertEquals(";;;test 930$c;test 930$d;;;test 991$a", result); + } + + @Test + void gererZonesAvec1ExemplaireLong() throws ZoneException { + List listZoneSousZone = List.of("930$c;$i;$d".split(";")); + + Exemplaire exemplaire = new Exemplaire(); + Zone zone930 = new Zone("930", TYPE_NOTICE.EXEMPLAIRE); + zone930.addSubLabel("$c", "test 930$c"); + zone930.addSubLabel("$d", "test 930$d"); + + exemplaire.addZone(zone930); + exemplaire.addZone("991", "$a", "test 991$a"); + + String result = fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire); + + assertEquals("test 930$c;;test 930$d", result); + } + + @Test + void gereZonesAvecListeVide() throws ZoneException { + List listZoneSousZone = Lists.newArrayList(); - Exemplaire exemplaire1 = new Exemplaire(); - exemplaire1.addZone("930", "$c", "test 930$c"); - exemplaire1.addZone("930", "$d", "test 930$d"); - exemplaire1.addZone("991", "$a", "test 930$a"); + Exemplaire exemplaire = new Exemplaire(); + Zone zone930 = new Zone("930", TYPE_NOTICE.EXEMPLAIRE); + zone930.addSubLabel("$c", "test 930$c"); + zone930.addSubLabel("$d", "test 930$d"); - Zone zone1 = new Zone("917", TYPE_NOTICE.EXEMPLAIRE); + exemplaire.addZone(zone930); + exemplaire.addZone("991", "$a", "test 991$a"); - assertEquals(listZoneSousZone, fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire1, resultat, null)); + String result = fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire); -// Exemplaire exemplaire2 = new Exemplaire(); -// exemplaire2.addZone("917", "$a", "test 917$a"); -// exemplaire2.addZone("991", "$a", "test 930$a"); -// exemplaire2.addZone("915", "$a", "test 915$a"); -// exemplaire2.addZone("915", "$c", "test 915$c"); -// -// assertEquals(, exemplaire2.getListeZones()); + assertNull(result); } }