From 2b769df357b3e20b53b48ceb174acaa9cf272e88 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Mon, 30 Sep 2024 15:09:41 +0200 Subject: [PATCH 1/9] =?UTF-8?q?FIX=20:=20Ajout=20fichier=20Sauvegarde=20CS?= =?UTF-8?q?V=20pour=20demande=20suppression=20Modification=20tasklet=20cr?= =?UTF-8?q?=C3=A9ation=20des=20fichiers=20de=20sauvegarde=20Modification?= =?UTF-8?q?=20du=20processor=20pour=20=C3=A9criture=20dans=20fichier=20csv?= =?UTF-8?q?=20Ajout=20etat=20fictif=20pour=20instanciation=20du=20fichier?= =?UTF-8?q?=20sauvegarde=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreerFichierSauvegardeTasklet.java | 22 ++++--- .../LignesFichierProcessor.java | 20 +++++-- .../components/FichierSauvegardeSuppCsv.java | 59 +++++++++++++++++++ ...upp.java => FichierSauvegardeSuppTxt.java} | 2 +- .../fr/abes/item/core/constant/Constant.java | 3 +- 5 files changed, 91 insertions(+), 15 deletions(-) create mode 100644 core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java rename core/src/main/java/fr/abes/item/core/components/{FichierSauvegardeSupp.java => FichierSauvegardeSuppTxt.java} (95%) 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 79916edc..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 @@ -1,6 +1,7 @@ package fr.abes.item.batch.traitement; -import fr.abes.item.core.components.FichierSauvegardeSupp; +import fr.abes.item.core.components.FichierSauvegardeSuppCsv; +import fr.abes.item.core.components.FichierSauvegardeSuppTxt; import fr.abes.item.core.configuration.factory.FichierFactory; import fr.abes.item.core.configuration.factory.StrategyFactory; import fr.abes.item.core.constant.Constant; @@ -25,7 +26,8 @@ public class CreerFichierSauvegardeTasklet implements Tasklet, StepExecutionList private final StrategyFactory factory; private final String uploadPath; private Demande demande; - private FichierSauvegardeSupp fichier; + private FichierSauvegardeSuppTxt fichierTxt; + private FichierSauvegardeSuppCsv fichierCsv; public CreerFichierSauvegardeTasklet(StrategyFactory factory, String uploadPath) { this.factory = factory; @@ -45,17 +47,23 @@ public void beforeStep(@NonNull StepExecution stepExecution) { } @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { - this.fichier = (FichierSauvegardeSupp) FichierFactory.getFichier(Constant.ETATDEM_ATTENTE, TYPE_DEMANDE.SUPP); - fichier.generateFileName(this.demande); - fichier.setPath(Paths.get(uploadPath + demande.getTypeDemande().toString().toLowerCase() + "/" + demande.getId())); + this.fichierTxt = (FichierSauvegardeSuppTxt) FichierFactory.getFichier(Constant.ETATDEM_ATTENTE, TYPE_DEMANDE.SUPP); + fichierTxt.generateFileName(this.demande); + fichierTxt.setPath(Paths.get(uploadPath + demande.getTypeDemande().toString().toLowerCase() + "/" + demande.getId())); + 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.writeHeader(); return RepeatStatus.FINISHED; } @Override public ExitStatus afterStep(StepExecution stepExecution) { if (stepExecution.getExitStatus().equals(ExitStatus.COMPLETED)) { - stepExecution.getJobExecution().getExecutionContext().put("fichierTxtPath", this.fichier.getPath().toString()); - stepExecution.getJobExecution().getExecutionContext().put("fichierTxtName", this.fichier.getFilename()); + stepExecution.getJobExecution().getExecutionContext().put("fichierTxtPath", this.fichierTxt.getPath().toString()); + stepExecution.getJobExecution().getExecutionContext().put("fichierTxtName", this.fichierTxt.getFilename()); + stepExecution.getJobExecution().getExecutionContext().put("fichierCsvPath", this.fichierCsv.getPath().toString()); + stepExecution.getJobExecution().getExecutionContext().put("fichierCsvName", this.fichierCsv.getFilename()); } return stepExecution.getExitStatus(); } 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 f8a2b4c2..d7f667e2 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 @@ -7,7 +7,8 @@ import fr.abes.cbs.notices.Zone; import fr.abes.item.batch.traitement.ProxyRetry; import fr.abes.item.batch.traitement.model.*; -import fr.abes.item.core.components.FichierSauvegardeSupp; +import fr.abes.item.core.components.FichierSauvegardeSuppCsv; +import fr.abes.item.core.components.FichierSauvegardeSuppTxt; import fr.abes.item.core.configuration.factory.StrategyFactory; import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; @@ -36,7 +37,8 @@ public class LignesFichierProcessor implements ItemProcessor, StepExecutionListener { private final StrategyFactory strategyFactory; private final ProxyRetry proxyRetry; - private FichierSauvegardeSupp fichierSauvegardeSupp; + private FichierSauvegardeSuppTxt fichierSauvegardeSuppTxt; + private FichierSauvegardeSuppCsv fichierSauvegardeSuppcsv; private Demande demande; @@ -55,9 +57,14 @@ public void beforeStep(StepExecution stepExecution) { IDemandeService demandeService = strategyFactory.getStrategy(IDemandeService.class, typeDemande); Integer demandeId = (Integer) executionContext.get("demandeId"); this.demande = demandeService.findById(demandeId); - this.fichierSauvegardeSupp = new FichierSauvegardeSupp(); - this.fichierSauvegardeSupp.setPath(Path.of(String.valueOf(executionContext.get("fichierTxtPath")))); - this.fichierSauvegardeSupp.setFilename(String.valueOf(executionContext.get("fichierTxtName"))); + this.fichierSauvegardeSuppTxt = new FichierSauvegardeSuppTxt(); + this.fichierSauvegardeSuppTxt.setPath(Path.of(String.valueOf(executionContext.get("fichierTxtPath")))); + this.fichierSauvegardeSuppTxt.setFilename(String.valueOf(executionContext.get("fichierTxtName"))); + + this.fichierSauvegardeSuppcsv = new FichierSauvegardeSuppCsv(); + this.fichierSauvegardeSuppcsv.setPath(Path.of(String.valueOf(executionContext.get("fichierCsvPath")))); + this.fichierSauvegardeSuppcsv.setFilename(String.valueOf(executionContext.get("fichierCsvName"))); + log.info(Constant.POUR_LA_DEMANDE + this.demande.getNumDemande()); } @@ -145,7 +152,8 @@ private LigneFichierDtoSupp processDemandeSupp(LigneFichierDto ligneFichierDto) List exemplairesExistants = ((DemandeSuppService) strategyFactory.getStrategy(IDemandeService.class, TYPE_DEMANDE.SUPP)) .getExemplairesExistants(ligneFichierDtoSupp.getPpn()); if (!exemplairesExistants.isEmpty()){ - this.fichierSauvegardeSupp.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplairesExistants); + this.fichierSauvegardeSuppTxt.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplairesExistants); + this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplairesExistants); } //supprimer l'exemplaire this.proxyRetry.deleteExemplaire(demandeSupp, ligneFichierDtoSupp); 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 new file mode 100644 index 00000000..1781b292 --- /dev/null +++ b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java @@ -0,0 +1,59 @@ +package fr.abes.item.core.components; + +import fr.abes.cbs.notices.Exemplaire; +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.exception.FileCheckingException; +import fr.abes.item.core.exception.StorageException; +import lombok.Getter; +import lombok.Setter; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +@Setter +@Getter +@Component +public class FichierSauvegardeSuppCsv extends AbstractFichier implements Fichier { + + public void writePpnInFile(String ppn, List exemplaires) throws StorageException { + + } + + @Override + public String getFilename() { + return this.filename; + } + + @Override + public void setPath(Path path) { + this.path = path; + } + + @Override + public int getType() { + return Constant.ETATDEM_ATTENTE_2; + } + + @Override + public TYPE_DEMANDE getDemandeType() { + return TYPE_DEMANDE.SUPP; + } + + @Override + public void generateFileName(Demande demande) { + this.filename = Constant.FIC_SAUVEGARDE_NAME + demande.getId() + Constant.EXTENSIONCSV; + } + + @Override + public void checkFileContent(Demande d) throws FileCheckingException, IOException { + //non implémentée + } + + public void writeHeader() { + + } +} diff --git a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSupp.java b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java similarity index 95% rename from core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSupp.java rename to core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java index 79acf377..d4dac8b4 100644 --- a/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSupp.java +++ b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppTxt.java @@ -20,7 +20,7 @@ @Setter @Getter @Component -public class FichierSauvegardeSupp extends AbstractFichier implements Fichier { +public class FichierSauvegardeSuppTxt extends AbstractFichier implements Fichier { public void writePpnInFile(String ppn, List exemplaires) throws StorageException { try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); 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 2f287a5c..bf8ce134 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 @@ -25,6 +25,8 @@ public class Constant implements Serializable { public static final int ETATDEM_SIMULATION = 4; //Simulation terminée, demandeModif en attente de traitement par le batch public static final int ETATDEM_ATTENTE = 5; + //Etat en attente fictif pour gérer les 2 fichiers de sauvegardes pour les demandes de SUPP + public static final int ETATDEM_ATTENTE_2 = 11; //DemandeModif en cours de traitement par le batch public static final int ETATDEM_ENCOURS = 6; //DemandeModif traiteée et terminée @@ -50,7 +52,6 @@ public class Constant implements Serializable { public static final String TEXTE_991_CREA = "Exemplaire créé en masse par ITEM"; public static final String AUCUNE_DEMANDE = "AUCUNE DEMANDE"; public static final String DEFAULT = "default"; - public static final String DEMANDE = "La demande "; /**Authentication failed*/ public static final String UTILISATEUR_ABSENT_BASE = "Cet utilisateur n'existe pas dans la base de données."; From 70dfded58b6c8c6e563a893573a2dcd9466add1b Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:18:58 +0200 Subject: [PATCH 2/9] =?UTF-8?q?FEAT=20ITEM-235-batch-alimenter-le-fichier-?= =?UTF-8?q?de-sauvegarde-csv=20=20=20=20=20=20-=20ajout=20d'une=20m=C3=A9t?= =?UTF-8?q?hode=20de=20construction=20du=20header=20du=20fichier=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/FichierSauvegardeSuppCsv.java | 13 +++++++-- .../core/entities/item/ZonesAutorisees.java | 2 +- .../item/core/service/ReferenceService.java | 27 +++++++++++++------ 3 files changed, 31 insertions(+), 11 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 1781b292..5c4216dd 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 @@ -6,6 +6,7 @@ import fr.abes.item.core.entities.item.Demande; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.StorageException; +import fr.abes.item.core.service.ReferenceService; import lombok.Getter; import lombok.Setter; import org.springframework.stereotype.Component; @@ -19,8 +20,16 @@ @Component public class FichierSauvegardeSuppCsv extends AbstractFichier implements Fichier { - public void writePpnInFile(String ppn, List exemplaires) throws StorageException { + private ReferenceService referenceService; + + private StringBuilder csvContent; + + public FichierSauvegardeSuppCsv() { + this.csvContent = new StringBuilder(); + } + public void writePpnInFile(String ppn, List exemplaires) throws StorageException { + // TODO coder l'algo de remplissage du fichier csv (hors en-tête) } @Override @@ -54,6 +63,6 @@ public void checkFileContent(Demande d) throws FileCheckingException, IOExceptio } public void writeHeader() { - + this.csvContent.append(this.referenceService.constructHeaderCsv()); } } diff --git a/core/src/main/java/fr/abes/item/core/entities/item/ZonesAutorisees.java b/core/src/main/java/fr/abes/item/core/entities/item/ZonesAutorisees.java index 9aa1f208..0613194d 100644 --- a/core/src/main/java/fr/abes/item/core/entities/item/ZonesAutorisees.java +++ b/core/src/main/java/fr/abes/item/core/entities/item/ZonesAutorisees.java @@ -27,7 +27,7 @@ public class ZonesAutorisees implements Serializable, GenericEntity { @Column(name = "INDICATEURS") private String indicateurs; - @OneToMany(mappedBy = "zone", fetch = FetchType.LAZY) + @OneToMany(mappedBy = "zone", fetch = FetchType.EAGER) private List sousZonesAutorisees; @ManyToMany 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 f66fa3af..c1db2d2c 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 @@ -1,12 +1,7 @@ package fr.abes.item.core.service; -import fr.abes.item.core.entities.item.EtatDemande; -import fr.abes.item.core.entities.item.IndexRecherche; -import fr.abes.item.core.entities.item.Traitement; -import fr.abes.item.core.entities.item.TypeExemp; -import fr.abes.item.core.repository.item.IEtatDemandeDao; -import fr.abes.item.core.repository.item.ITraitementDao; -import fr.abes.item.core.repository.item.ITypeExempDao; +import fr.abes.item.core.entities.item.*; +import fr.abes.item.core.repository.item.*; import org.springframework.stereotype.Service; import java.util.List; @@ -18,11 +13,13 @@ public class ReferenceService { private final IEtatDemandeDao etatDemandeDao; private final ITypeExempDao typeExempDao; private final ITraitementDao traitementDao; + private final IZonesAutoriseesDao iZonesAutoriseesDao; - public ReferenceService(IEtatDemandeDao etatDemandeDao, ITypeExempDao typeExempDao, ITraitementDao traitementDao) { + public ReferenceService(IEtatDemandeDao etatDemandeDao, ITypeExempDao typeExempDao, ITraitementDao traitementDao, IZonesAutoriseesDao iZonesAutoriseesDao) { this.etatDemandeDao = etatDemandeDao; this.typeExempDao = typeExempDao; this.traitementDao = traitementDao; + this.iZonesAutoriseesDao = iZonesAutoriseesDao; } @@ -65,4 +62,18 @@ public Traitement findTraitementById(Integer id) { public Integer findTraitementByDemandeId(Integer id) { return traitementDao.findTraitementByDemandeModifId(id); } + + public String constructHeaderCsv() { + List listZonesAutorisees = this.iZonesAutoriseesDao.findAll(); + StringBuilder headerCsv = new StringBuilder(); + headerCsv.append("PPN").append(";"); + for (ZonesAutorisees zonesAutorisees: listZonesAutorisees) { + headerCsv.append(zonesAutorisees.getLabelZone()); + for (SousZonesAutorisees sousZonesAutorisees : zonesAutorisees.getSousZonesAutorisees()) { + headerCsv.append(sousZonesAutorisees.getLibelle()).append(";"); + } + } + headerCsv.append("\n"); + return headerCsv.toString(); + } } From 03b9e3716ad9e8e244d51015877cd64d523841f6 Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Tue, 1 Oct 2024 14:12:26 +0200 Subject: [PATCH 3/9] =?UTF-8?q?FEAT=20ITEM-235-batch-alimenter-le-fichier-?= =?UTF-8?q?de-sauvegarde-csv=20=20=20=20=20=20-=20ajout=20d'un=20TU=20pour?= =?UTF-8?q?=20la=20m=C3=A9thode=20ConstructHeaderCsv=20=20=20=20=20=20-=20?= =?UTF-8?q?ajout=20du=20d=C3=A9but=20de=20l'algorithme=20d'alimentation=20?= =?UTF-8?q?du=20fichier=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/FichierSauvegardeSuppCsv.java | 16 ++++- .../core/service/ReferenceServiceTest.java | 71 +++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java 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 5c4216dd..97c6c306 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,7 @@ package fr.abes.item.core.components; import fr.abes.cbs.notices.Exemplaire; +import fr.abes.cbs.notices.Zone; import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; import fr.abes.item.core.entities.item.Demande; @@ -29,7 +30,20 @@ public FichierSauvegardeSuppCsv() { } public void writePpnInFile(String ppn, List exemplaires) throws StorageException { - // TODO coder l'algo de remplissage du fichier csv (hors en-tête) + // TODO boucler sur chaque exemplaire et rechercher une correspondance entre une zone de l'exemplaire et la première zone du header, si correspondance alors mettre la zone exemplaire au bon index dans le csvContent + for (Exemplaire exemplaire : exemplaires) { + this.csvContent.append(ppn).append(";"); // ajout du ppn + for (String zoneAChercher : this.csvContent.toString().split(";")) { + List listZones = exemplaire.getListeZones().values().stream().filter(exemp -> exemp.getLabel().equals(zoneAChercher)).toList(); // getLabel renvoi le numéro d'exemplaire (exemple e01) + for (Zone zone : listZones) { + // TODO la zone et l'inclure dans le csvContent à la bonne place + + } + } + + + this.csvContent.append("\n"); // retour à la ligne + } } @Override diff --git a/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java b/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java new file mode 100644 index 00000000..5656f756 --- /dev/null +++ b/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java @@ -0,0 +1,71 @@ +package fr.abes.item.core.service; + +import fr.abes.cbs.exception.CBSException; +import fr.abes.cbs.exception.ZoneException; +import fr.abes.item.core.entities.item.SousZonesAutorisees; +import fr.abes.item.core.entities.item.ZonesAutorisees; +import fr.abes.item.core.exception.QueryToSudocException; +import fr.abes.item.core.repository.item.IEtatDemandeDao; +import fr.abes.item.core.repository.item.ITraitementDao; +import fr.abes.item.core.repository.item.ITypeExempDao; +import fr.abes.item.core.repository.item.IZonesAutoriseesDao; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest(classes = {ReferenceService.class}) +class ReferenceServiceTest { + @Autowired + private ReferenceService referenceService; + @MockBean + private IEtatDemandeDao etatDemandeDao; + @MockBean + private ITypeExempDao typeExempDao; + @MockBean + private ITraitementDao traitementDao; + @MockBean + private IZonesAutoriseesDao iZonesAutoriseesDao; + + @Test + void constructHeaderCsv() { + // création de la zonesAutorisées1 + SousZonesAutorisees sousZonesAutorisees1 = new SousZonesAutorisees(); + sousZonesAutorisees1.setLibelle("$a"); + List sousZonesAutoriseesList1 = new ArrayList<>(); + sousZonesAutoriseesList1.add(sousZonesAutorisees1); + ZonesAutorisees zonesAutorisees1 = new ZonesAutorisees(); + zonesAutorisees1.setLabelZone("917"); + zonesAutorisees1.setSousZonesAutorisees(sousZonesAutoriseesList1); + + // création de la zoneAutorisées2 + SousZonesAutorisees sousZonesAutorisees2 = new SousZonesAutorisees(); + sousZonesAutorisees2.setLibelle("$c"); + SousZonesAutorisees sousZonesAutorisees3 = new SousZonesAutorisees(); + sousZonesAutorisees3.setLibelle("$d"); + List sousZonesAutorisees2List = new ArrayList<>(); + sousZonesAutorisees2List.add(sousZonesAutorisees2); + sousZonesAutorisees2List.add(sousZonesAutorisees3); + ZonesAutorisees zonesAutorisees2 = new ZonesAutorisees(); + zonesAutorisees2.setLabelZone("930"); + zonesAutorisees2.setSousZonesAutorisees(sousZonesAutorisees2List); + + // création de la liste de test + List zonesAutoriseesList = new ArrayList<>(); + zonesAutoriseesList.add(zonesAutorisees1); + zonesAutoriseesList.add(zonesAutorisees2); + + Mockito.when(iZonesAutoriseesDao.findAll()).thenReturn(zonesAutoriseesList); + + String test = referenceService.constructHeaderCsv(); + assertEquals("PPN;917$a;930$c;$d;\n",test); + + } +} From ac656a91554ced80b88b667d3f9f1fee6449fe0d Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Wed, 2 Oct 2024 09:37:38 +0200 Subject: [PATCH 4/9] =?UTF-8?q?FIX=20:=20Modification=20=C3=A9criture=20da?= =?UTF-8?q?ns=20fichier=20de=20sauvegarde=20Ecriture=20d'un=20seul=20exemp?= =?UTF-8?q?laire=20au=20lieu=20d'une=20liste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LignesFichierProcessor.java | 8 +++++--- .../components/FichierSauvegardeSuppCsv.java | 16 +++++++--------- .../components/FichierSauvegardeSuppTxt.java | 9 +++------ 3 files changed, 15 insertions(+), 18 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 d7f667e2..366dffda 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 @@ -32,6 +32,7 @@ import java.nio.file.Path; import java.sql.SQLException; import java.util.List; +import java.util.Optional; @Slf4j public class LignesFichierProcessor implements ItemProcessor, StepExecutionListener { @@ -151,9 +152,10 @@ 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()); - if (!exemplairesExistants.isEmpty()){ - this.fichierSauvegardeSuppTxt.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplairesExistants); - this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplairesExistants); + 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); 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 97c6c306..f876a1b5 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 @@ -29,16 +29,14 @@ public FichierSauvegardeSuppCsv() { this.csvContent = new StringBuilder(); } - public void writePpnInFile(String ppn, List exemplaires) throws StorageException { + public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { // TODO boucler sur chaque exemplaire et rechercher une correspondance entre une zone de l'exemplaire et la première zone du header, si correspondance alors mettre la zone exemplaire au bon index dans le csvContent - for (Exemplaire exemplaire : exemplaires) { - this.csvContent.append(ppn).append(";"); // ajout du ppn - for (String zoneAChercher : this.csvContent.toString().split(";")) { - List listZones = exemplaire.getListeZones().values().stream().filter(exemp -> exemp.getLabel().equals(zoneAChercher)).toList(); // getLabel renvoi le numéro d'exemplaire (exemple e01) - for (Zone zone : listZones) { - // TODO la zone et l'inclure dans le csvContent à la bonne place - - } + this.csvContent.append(ppn).append(";"); // ajout du ppn + for (String zoneAChercher : this.csvContent.toString().split(";")) { + List listZones = exemplaire.getListeZones().values().stream().filter(exemp -> exemp.getLabel().equals(zoneAChercher)).toList(); // getLabel renvoi le numéro d'exemplaire (exemple e01) + for (Zone zone : listZones) { + // TODO la zone et l'inclure dans le csvContent à la bonne place + } 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 d4dac8b4..d93b8956 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 @@ -15,23 +15,20 @@ import java.io.IOException; import java.io.PrintWriter; import java.nio.file.Path; -import java.util.List; @Setter @Getter @Component public class FichierSauvegardeSuppTxt extends AbstractFichier implements Fichier { - public void writePpnInFile(String ppn, List exemplaires) throws StorageException { + public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { out.println(ppn); out.println("\n"); - exemplaires.forEach(exemplaire -> { - out.println(exemplaire); - out.println("\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"); From b669c1b2fb3ca3fa85e55ef80a8fc53545f2726f Mon Sep 17 00:00:00 2001 From: EryneKL <97091460+EryneKL@users.noreply.github.com> Date: Wed, 2 Oct 2024 14:20:37 +0200 Subject: [PATCH 5/9] =?UTF-8?q?FEAT=20ITEM-235-batch-alimenter-le-fichier-?= =?UTF-8?q?de-sauvegarde-csv=20=20=20=20=20=20-=20ajout=20d'un=20TU=20pour?= =?UTF-8?q?=20la=20m=C3=A9thode=20ConstructHeaderCsv=20=20=20=20=20=20-=20?= =?UTF-8?q?ajout=20du=20d=C3=A9but=20de=20l'algorithme=20d'alimentation=20?= =?UTF-8?q?du=20fichier=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreerFichierSauvegardeTasklet.java | 1 + .../components/FichierSauvegardeSuppCsv.java | 56 ++++++++++++++----- .../item/core/service/ReferenceService.java | 14 ++--- .../FichierSauvegardeSuppCsvTest.java | 52 +++++++++++++++++ .../core/service/ReferenceServiceTest.java | 6 +- pom.xml | 6 ++ 6 files changed, 112 insertions(+), 23 deletions(-) create mode 100644 core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java 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 e6bbdd02..b91f961f 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,6 +53,7 @@ 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/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java b/core/src/main/java/fr/abes/item/core/components/FichierSauvegardeSuppCsv.java index f876a1b5..58ace389 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,5 +1,6 @@ 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; @@ -9,39 +10,62 @@ 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.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @Setter @Getter @Component +@NoArgsConstructor public class FichierSauvegardeSuppCsv extends AbstractFichier implements Fichier { private ReferenceService referenceService; - private StringBuilder csvContent; - - public FichierSauvegardeSuppCsv() { - this.csvContent = new StringBuilder(); - } + private CSVWriter csvWriter; public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { - // TODO boucler sur chaque exemplaire et rechercher une correspondance entre une zone de l'exemplaire et la première zone du header, si correspondance alors mettre la zone exemplaire au bon index dans le csvContent - this.csvContent.append(ppn).append(";"); // ajout du ppn - for (String zoneAChercher : this.csvContent.toString().split(";")) { - List listZones = exemplaire.getListeZones().values().stream().filter(exemp -> exemp.getLabel().equals(zoneAChercher)).toList(); // getLabel renvoi le numéro d'exemplaire (exemple e01) - for (Zone zone : listZones) { - // TODO la zone et l'inclure dans le csvContent à la bonne place + // 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 = ""; + + 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, String resultat, Zone zone) { + if (listeZonesEtSousZones.isEmpty()) { + return resultat; + } + String zoneSousZone = listeZonesEtSousZones.remove(0); + if (zoneSousZone.startsWith("$")) { + return gererSousZone(listeZonesEtSousZones, exemplaire, resultat, zone, zoneSousZone); + } else { + zone = exemplaire.findZone(zoneSousZone.split("\\$")[0],0); + if (zone != null) { + String sousZone = zone.findSubLabel(zoneSousZone.split("\\$")[1]); + resultat += sousZone; + } + resultat += ";"; + } + return gererZones(listeZonesEtSousZones, exemplaire, resultat, zone); + } - this.csvContent.append("\n"); // retour à la ligne + 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); } @Override @@ -74,7 +98,11 @@ 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.csvContent.append(this.referenceService.constructHeaderCsv()); + this.csvWriter.writeNext((String[]) this.referenceService.constructHeaderCsv().toArray()); } } 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 c1db2d2c..ac4f2e70 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 @@ -4,6 +4,7 @@ import fr.abes.item.core.repository.item.*; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; @@ -63,17 +64,16 @@ public Integer findTraitementByDemandeId(Integer id) { return traitementDao.findTraitementByDemandeModifId(id); } - public String constructHeaderCsv() { + public List constructHeaderCsv() { List listZonesAutorisees = this.iZonesAutoriseesDao.findAll(); - StringBuilder headerCsv = new StringBuilder(); - headerCsv.append("PPN").append(";"); + List headerCsv = new ArrayList<>(); + headerCsv.add("PPN"); for (ZonesAutorisees zonesAutorisees: listZonesAutorisees) { - headerCsv.append(zonesAutorisees.getLabelZone()); + headerCsv.add(zonesAutorisees.getLabelZone()+zonesAutorisees.getSousZonesAutorisees().remove(0).getLibelle()); for (SousZonesAutorisees sousZonesAutorisees : zonesAutorisees.getSousZonesAutorisees()) { - headerCsv.append(sousZonesAutorisees.getLibelle()).append(";"); + headerCsv.add(sousZonesAutorisees.getLibelle()); } } - headerCsv.append("\n"); - return headerCsv.toString(); + 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 new file mode 100644 index 00000000..dcd2351e --- /dev/null +++ b/core/src/test/java/fr/abes/item/core/components/FichierSauvegardeSuppCsvTest.java @@ -0,0 +1,52 @@ +package fr.abes.item.core.components; + +import com.opencsv.CSVWriter; +import fr.abes.cbs.exception.ZoneException; +import fr.abes.cbs.notices.Exemplaire; +import fr.abes.cbs.notices.TYPE_NOTICE; +import fr.abes.cbs.notices.Zone; +import fr.abes.item.core.service.ReferenceService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = {FichierSauvegardeSuppCsv.class}) +class FichierSauvegardeSuppCsvTest { + + @Autowired + private FichierSauvegardeSuppCsv fichierSauvegardeSuppCsv; + + @MockBean + private ReferenceService referenceService; + + CSVWriter csvWriter; + + @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(";")); + + String resultat = ""; + + 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"); + + Zone zone1 = new Zone("917", TYPE_NOTICE.EXEMPLAIRE); + + assertEquals(listZoneSousZone, fichierSauvegardeSuppCsv.gererZones(listZoneSousZone, exemplaire1, resultat, null)); + +// 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()); + } +} diff --git a/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java b/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java index 5656f756..585c6277 100644 --- a/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java +++ b/core/src/test/java/fr/abes/item/core/service/ReferenceServiceTest.java @@ -64,8 +64,10 @@ void constructHeaderCsv() { Mockito.when(iZonesAutoriseesDao.findAll()).thenReturn(zonesAutoriseesList); - String test = referenceService.constructHeaderCsv(); - assertEquals("PPN;917$a;930$c;$d;\n",test); + List test = referenceService.constructHeaderCsv(); + List reference = List.of("PPN;917$a;930$c;$d;".split(";")); + + assertEquals(reference,test); } } diff --git a/pom.xml b/pom.xml index f200ed7d..73adca4d 100644 --- a/pom.xml +++ b/pom.xml @@ -147,6 +147,12 @@ maven-model 3.6.3 + + + com.opencsv + opencsv + 5.9 + 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 6/9] =?UTF-8?q?FEAT=20ITEM-235-batch-alimenter-le-fichier-?= =?UTF-8?q?de-sauvegarde-csv=20=20=20=20=20=20-=20ajout=20des=20TUs=20pour?= =?UTF-8?q?=20la=20m=C3=A9thode=20FichierSauvegardeSuppCsv=20=20=20=20=20?= =?UTF-8?q?=20-=20ajout=20du=20d=C3=A9but=20de=20l'algorithme=20d'alimenta?= =?UTF-8?q?tion=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); } } From 793fd897a54e1114c511024bb48f641e9d58f54a Mon Sep 17 00:00:00 2001 From: Jerome Villiseck Date: Thu, 3 Oct 2024 10:56:18 +0200 Subject: [PATCH 7/9] - Ajout de logs sur FichierProcessor --- .../traiterlignesfichierchunk/LignesFichierProcessor.java | 2 +- .../abes/item/core/components/FichierSauvegardeSuppCsv.java | 4 +++- .../abes/item/core/components/FichierSauvegardeSuppTxt.java | 3 +++ 3 files changed, 7 insertions(+), 2 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 13882bef..72e2e756 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 @@ -40,7 +40,7 @@ public class LignesFichierProcessor implements ItemProcessor listeZonesEtSousZones, Exemplaire exemplaire) { 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 25b64ba0..39478c63 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 @@ -8,6 +8,7 @@ import fr.abes.item.core.exception.StorageException; import lombok.Getter; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.io.BufferedWriter; @@ -19,9 +20,11 @@ @Setter @Getter @Component +@Slf4j public class FichierSauvegardeSuppTxt extends AbstractFichier implements Fichier { public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { + log.info("Ecriture du fichier sur chemin: " + this.getPath().resolve(this.getFilename())); try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { From 1d3d1803546c78604fa7ac29574d676c5f08f687 Mon Sep 17 00:00:00 2001 From: Jerome Villiseck Date: Thu, 3 Oct 2024 11:08:12 +0200 Subject: [PATCH 8/9] - Ajout de logs sur FichierProcessor --- .../traiterlignesfichierchunk/LignesFichierProcessor.java | 2 ++ 1 file changed, 2 insertions(+) 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..c4e25719 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 @@ -64,10 +64,12 @@ public void beforeStep(StepExecution stepExecution) { this.fichierSauvegardeSuppTxt = new FichierSauvegardeSuppTxt(); this.fichierSauvegardeSuppTxt.setPath(Path.of(String.valueOf(executionContext.get("fichierTxtPath")))); this.fichierSauvegardeSuppTxt.setFilename(String.valueOf(executionContext.get("fichierTxtName"))); + log.info("Initialisation fichier txt: " + this.fichierSauvegardeSuppTxt.getPath() + this.fichierSauvegardeSuppTxt.getFilename()); this.fichierSauvegardeSuppcsv = new FichierSauvegardeSuppCsv(this.referenceService); this.fichierSauvegardeSuppcsv.setPath(Path.of(String.valueOf(executionContext.get("fichierCsvPath")))); this.fichierSauvegardeSuppcsv.setFilename(String.valueOf(executionContext.get("fichierCsvName"))); + log.info("Initialisation fichier csv: " + this.fichierSauvegardeSuppTxt.getPath() + this.fichierSauvegardeSuppTxt.getFilename()); log.info(Constant.POUR_LA_DEMANDE + this.demande.getNumDemande()); } From ef0a7c41a8c05c6fdf7b210f6f6828d9af6b9c8e Mon Sep 17 00:00:00 2001 From: Jerome Villiseck Date: Thu, 3 Oct 2024 11:25:01 +0200 Subject: [PATCH 9/9] - Suppression logs pour debug --- .../traiterlignesfichierchunk/LignesFichierProcessor.java | 2 -- .../fr/abes/item/core/components/FichierSauvegardeSuppCsv.java | 1 - .../fr/abes/item/core/components/FichierSauvegardeSuppTxt.java | 1 - 3 files changed, 4 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 c4e25719..72e2e756 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 @@ -64,12 +64,10 @@ public void beforeStep(StepExecution stepExecution) { this.fichierSauvegardeSuppTxt = new FichierSauvegardeSuppTxt(); this.fichierSauvegardeSuppTxt.setPath(Path.of(String.valueOf(executionContext.get("fichierTxtPath")))); this.fichierSauvegardeSuppTxt.setFilename(String.valueOf(executionContext.get("fichierTxtName"))); - log.info("Initialisation fichier txt: " + this.fichierSauvegardeSuppTxt.getPath() + this.fichierSauvegardeSuppTxt.getFilename()); this.fichierSauvegardeSuppcsv = new FichierSauvegardeSuppCsv(this.referenceService); this.fichierSauvegardeSuppcsv.setPath(Path.of(String.valueOf(executionContext.get("fichierCsvPath")))); this.fichierSauvegardeSuppcsv.setFilename(String.valueOf(executionContext.get("fichierCsvName"))); - log.info("Initialisation fichier csv: " + this.fichierSauvegardeSuppTxt.getPath() + this.fichierSauvegardeSuppTxt.getFilename()); log.info(Constant.POUR_LA_DEMANDE + this.demande.getNumDemande()); } 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 4e61f218..7aa7a714 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 @@ -33,7 +33,6 @@ public FichierSauvegardeSuppCsv(ReferenceService referenceService) { } public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { - log.debug("Ecriture du fichier sur chemin: " + this.getPath().resolve(this.getFilename())); try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) { 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 39478c63..ee008613 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 @@ -24,7 +24,6 @@ public class FichierSauvegardeSuppTxt extends AbstractFichier implements Fichier { public void writePpnInFile(String ppn, Exemplaire exemplaire) throws StorageException { - log.info("Ecriture du fichier sur chemin: " + this.getPath().resolve(this.getFilename())); try (FileWriter fw = new FileWriter(this.getPath().resolve(this.getFilename()).toString(), true); BufferedWriter bw = new BufferedWriter(fw); PrintWriter out = new PrintWriter(bw)) {