From 3325bd22805bdb9169475972ef00b96413944858 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Mon, 2 Dec 2024 13:47:58 +0100 Subject: [PATCH 1/2] =?UTF-8?q?Refactor=20:=20d=C3=A9placement=20de=20cert?= =?UTF-8?q?aines=20m=C3=A9thodes=20de=20la=20couche=20service=20demande=20?= =?UTF-8?q?vers=20lignefichier=20Fix=20sur=20la=20r=C3=A9cup=C3=A9ration?= =?UTF-8?q?=20de=20la=20008=20pour=20le=20fichier=20de=20sauvegarde=20csv?= =?UTF-8?q?=20en=20une=20seule=20requ=C3=AAte.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../traitement/GenererFichierTasklet.java | 4 +- .../item/batch/traitement/ProxyRetry.java | 54 +-- .../LignesFichierProcessor.java | 24 +- .../item/core/dto/ExemplaireWithTypeDto.java | 17 + .../item/core/service/IDemandeService.java | 8 +- .../core/service/ILigneFichierService.java | 9 + .../service/impl/DemandeExempService.java | 306 +---------------- .../service/impl/DemandeModifService.java | 81 +---- .../service/impl/DemandeRecouvService.java | 38 +-- .../core/service/impl/DemandeSuppService.java | 89 +---- .../impl/LigneFichierExempService.java | 310 +++++++++++++++++- .../impl/LigneFichierModifService.java | 76 ++++- .../impl/LigneFichierRecouvService.java | 43 ++- .../service/impl/LigneFichierSuppService.java | 94 +++++- .../impl/DemandeRecouvServiceTest.java | 41 --- ...java => LigneFichierExempServiceTest.java} | 68 ++-- .../fr/abes/item/web/DemandeRestService.java | 3 +- .../item/web/impl/DemandeRestServiceTest.java | 2 +- 18 files changed, 633 insertions(+), 634 deletions(-) create mode 100644 core/src/main/java/fr/abes/item/core/dto/ExemplaireWithTypeDto.java delete mode 100644 core/src/test/java/fr/abes/item/core/service/impl/DemandeRecouvServiceTest.java rename core/src/test/java/fr/abes/item/core/service/impl/{DemandeExempServiceTest.java => LigneFichierExempServiceTest.java} (74%) diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/GenererFichierTasklet.java b/batch/src/main/java/fr/abes/item/batch/traitement/GenererFichierTasklet.java index 06685ea7..e57c079e 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/GenererFichierTasklet.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/GenererFichierTasklet.java @@ -127,7 +127,7 @@ private String genererFichier() throws IOException, FileTypeException, QueryToSu DemandeExemp demandeExemp = (DemandeExemp) demande; LigneFichierDtoExemp ligneFichierDtoExemp = new LigneFichierDtoExemp((LigneFichierExemp) ligne); log.warn(ligneFichierDtoExemp.getIndexRecherche()); - ligneFichierDtoExemp.setRequete(demandeService.getQueryToSudoc(demandeExemp.getIndexRecherche().getCode(), demandeExemp.getTypeExemp().getNumTypeExemp(), ligneFichierDtoExemp.getIndexRecherche().split(";"))); + ligneFichierDtoExemp.setRequete(this.ligneFichierService.getQueryToSudoc(demandeExemp.getIndexRecherche().getCode(), demandeExemp.getTypeExemp().getNumTypeExemp(), ligneFichierDtoExemp.getIndexRecherche().split(";"))); out.println(ligneFichierDtoExemp.getValeurToWriteInFichierResultat(demande, nbPpnInFileResult)); } case MODIF -> { @@ -141,7 +141,7 @@ private String genererFichier() throws IOException, FileTypeException, QueryToSu default -> { DemandeRecouv demandeRecouv = (DemandeRecouv) demande; LigneFichierDtoRecouv ligneFichierDtoRecouv = new LigneFichierDtoRecouv((LigneFichierRecouv) ligne); - ligneFichierDtoRecouv.setRequete(demandeService.getQueryToSudoc(demandeRecouv.getIndexRecherche().getCode(), null, ligneFichierDtoRecouv.getIndexRecherche().split(";"))); + ligneFichierDtoRecouv.setRequete(this.ligneFichierService.getQueryToSudoc(demandeRecouv.getIndexRecherche().getCode(), null, ligneFichierDtoRecouv.getIndexRecherche().split(";"))); out.println(ligneFichierDtoRecouv.getValeurToWriteInFichierResultat(demande, nbPpnInFileResult)); } } diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/ProxyRetry.java b/batch/src/main/java/fr/abes/item/batch/traitement/ProxyRetry.java index 7bdc85ba..5c1ea91f 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/ProxyRetry.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/ProxyRetry.java @@ -15,9 +15,9 @@ import fr.abes.item.core.entities.item.DemandeSupp; import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.service.TraitementService; -import fr.abes.item.core.service.impl.DemandeExempService; -import fr.abes.item.core.service.impl.DemandeModifService; -import fr.abes.item.core.service.impl.DemandeRecouvService; +import fr.abes.item.core.service.impl.LigneFichierExempService; +import fr.abes.item.core.service.impl.LigneFichierModifService; +import fr.abes.item.core.service.impl.LigneFichierRecouvService; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataAccessException; import org.springframework.retry.annotation.Backoff; @@ -33,17 +33,17 @@ public class ProxyRetry { private final StrategyFactory factory; private final TraitementService traitementService; - private final DemandeModifService demandeModifService; - private final DemandeExempService demandeExempService; - private final DemandeRecouvService demandeRecouvService; + private final LigneFichierModifService ligneFichierModifService; + private final LigneFichierExempService ligneFichierExempService; + private final LigneFichierRecouvService ligneFichierRecouvService; - public ProxyRetry(TraitementService traitementService, StrategyFactory strategyFactory, DemandeModifService demandeModifService, DemandeExempService demandeExempService, DemandeRecouvService demandeRecouvService) { + public ProxyRetry(TraitementService traitementService, StrategyFactory strategyFactory, LigneFichierModifService ligneFichierModifService, LigneFichierExempService ligneFichierExempService, LigneFichierRecouvService ligneFichierRecouvService) { this.traitementService = traitementService; this.factory = strategyFactory; - this.demandeModifService = demandeModifService; - this.demandeExempService = demandeExempService; - this.demandeRecouvService = demandeRecouvService; + this.ligneFichierModifService = ligneFichierModifService; + this.ligneFichierExempService = ligneFichierExempService; + this.ligneFichierRecouvService = ligneFichierRecouvService; } /** @@ -55,7 +55,7 @@ public ProxyRetry(TraitementService traitementService, StrategyFactory strategyF */ @Retryable(retryFor = IOException.class, noRetryFor = CBSException.class, backoff = @Backoff(delay = 1000, multiplier = 2)) public void authenticate(String login) throws CBSException, IOException { - log.warn(Constant.PROXY_AUTHENTICATION_WITH_LOGIN + login); + log.warn(Constant.PROXY_AUTHENTICATION_WITH_LOGIN + "{}", login); traitementService.authenticate(login); } @@ -78,10 +78,10 @@ public void saveExemplaire(DemandeModif demande, LigneFichierDtoModif ligneFichi //récupération de la exemplaire correpondant à la ligne du fichier en cours String exemplaire = traitementService.getNoticeFromEPN(ligneFichierDtoModif.getEpn()); //modification de la exemplaire d'exemplaire - Exemplaire noticeTraitee = demandeModifService.getNoticeTraitee(demande, exemplaire, ligneFichierDtoMapper.getLigneFichierEntity(ligneFichierDtoModif)); + Exemplaire noticeTraitee = ligneFichierModifService.getNoticeTraitee(demande, exemplaire, ligneFichierDtoMapper.getLigneFichierEntity(ligneFichierDtoModif)); traitementService.saveExemplaire(noticeTraitee.toString(), ligneFichierDtoModif.getEpn()); } catch (IOException ex) { - log.error("Erreur de communication avec le CBS sur demande modif " + demande.getId() + " / ligne fichier n°" + ligneFichierDtoModif.getNumLigneFichier() + " / epn : " + ligneFichierDtoModif.getEpn()); + log.error("Erreur de communication avec le CBS sur demande modif {} / ligne fichier n°{} / epn : {}", demande.getId(), ligneFichierDtoModif.getNumLigneFichier(), ligneFichierDtoModif.getEpn()); //si un pb de communication avec le CBS est détecté, on se reconnecte, et on renvoie l'exception pour que le retry retente la méthode this.disconnect(); this.authenticate("M" + demande.getRcr()); @@ -101,23 +101,23 @@ public void saveExemplaire(DemandeModif demande, LigneFichierDtoModif ligneFichi noRetryFor = {CBSException.class, ZoneException.class}, backoff = @Backoff(delay = 1000, multiplier = 2) ) public void newExemplaire(DemandeExemp demande, LigneFichierDtoExemp ligneFichierDtoExemp) throws CBSException, ZoneException, IOException { try { - ligneFichierDtoExemp.setRequete(demandeExempService.getQueryToSudoc(demande.getIndexRecherche().getCode(), demande.getTypeExemp().getNumTypeExemp(), ligneFichierDtoExemp.getIndexRecherche().split(";"))); + ligneFichierDtoExemp.setRequete(ligneFichierExempService.getQueryToSudoc(demande.getIndexRecherche().getCode(), demande.getTypeExemp().getNumTypeExemp(), ligneFichierDtoExemp.getIndexRecherche().split(";"))); //lancement de la requête de récupération de la notice dans le CBS - String numEx = demandeExempService.launchQueryToSudoc(demande, ligneFichierDtoExemp.getIndexRecherche()); - ligneFichierDtoExemp.setNbReponses(demandeExempService.getNbReponses()); + String numEx = ligneFichierExempService.launchQueryToSudoc(demande, ligneFichierDtoExemp.getIndexRecherche()); + ligneFichierDtoExemp.setNbReponses(ligneFichierExempService.getNbReponses()); if (ligneFichierDtoExemp.getNbReponses() == 1) { ligneFichierDtoExemp.setListePpn(traitementService.getCbs().getPpnEncours()); } else { ligneFichierDtoExemp.setListePpn(traitementService.getCbs().getListePpn().toString()); } - String exemplaire = demandeExempService.creerExemplaireFromHeaderEtValeur(demande.getListeZones(), ligneFichierDtoExemp.getValeurZone(), demande.getRcr(), numEx); - String donneeLocale = demandeExempService.creerDonneesLocalesFromHeaderEtValeur(demande.getListeZones(), ligneFichierDtoExemp.getValeurZone()); + String exemplaire = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(demande.getListeZones(), ligneFichierDtoExemp.getValeurZone(), demande.getRcr(), numEx); + String donneeLocale = ligneFichierExempService.creerDonneesLocalesFromHeaderEtValeur(demande.getListeZones(), ligneFichierDtoExemp.getValeurZone()); traitementService.getCbs().creerExemplaire(numEx); traitementService.getCbs().newExemplaire(exemplaire); if (!donneeLocale.isEmpty()) { //s'il y a des données locales existantes, on modifie - if (demandeExempService.hasDonneeLocaleExistante()) { + if (ligneFichierExempService.hasDonneeLocaleExistante()) { traitementService.getCbs().modLoc(donneeLocale); } else { //s'il n'y a pas de donnée locale dans la notice, on crée le bloc @@ -129,16 +129,16 @@ public void newExemplaire(DemandeExemp demande, LigneFichierDtoExemp ligneFichie ligneFichierDtoExemp.setL035(getL035fromDonneesLocales(donneeLocale)); ligneFichierDtoExemp.setRetourSudoc(Constant.EXEMPLAIRE_CREE); } catch (QueryToSudocException e) { - ligneFichierDtoExemp.setNbReponses(demandeExempService.getNbReponses()); + ligneFichierDtoExemp.setNbReponses(ligneFichierExempService.getNbReponses()); ligneFichierDtoExemp.setListePpn(traitementService.getCbs().getListePpn().toString().replace(';', ',')); ligneFichierDtoExemp.setRetourSudoc(""); } catch (DataAccessException d) { if (d.getRootCause() instanceof SQLException sqlEx) { - log.error("Erreur SQL : " + sqlEx.getErrorCode()); - log.error(sqlEx.getSQLState() + "|" + sqlEx.getMessage() + "|" + sqlEx.getLocalizedMessage()); + log.error("Erreur SQL : {}", sqlEx.getErrorCode()); + log.error("{}|{}|{}", sqlEx.getSQLState(), sqlEx.getMessage(), sqlEx.getLocalizedMessage()); } } catch (IOException ex) { - log.error("Erreur de communication avec le CBS sur demande exemp " + demande.getId() + " / ligne fichier n°" + ligneFichierDtoExemp.getNumLigneFichier()); + log.error("Erreur de communication avec le CBS sur demande exemp {} / ligne fichier n°{}", demande.getId(), ligneFichierDtoExemp.getNumLigneFichier()); //si un pb de communication avec le CBS est détecté, on se reconnecte, et on renvoie l'exception pour que le retry retente la méthode this.disconnect(); this.authenticate("M" + demande.getRcr()); @@ -166,9 +166,9 @@ private String getL035fromDonneesLocales(String donneeLocale) throws ZoneExcepti @Retryable(maxAttempts = 4, retryFor = IOException.class, noRetryFor = {CBSException.class, QueryToSudocException.class}, backoff = @Backoff(delay = 1000, multiplier = 2) ) public void recouvExemplaire(DemandeRecouv demande, LigneFichierDtoRecouv ligneFichierDtoRecouv) throws IOException, QueryToSudocException, CBSException { - ligneFichierDtoRecouv.setRequete(demandeRecouvService.getQueryToSudoc(demande.getIndexRecherche().getCode(), null, ligneFichierDtoRecouv.getIndexRecherche().split(";"))); + ligneFichierDtoRecouv.setRequete(ligneFichierRecouvService.getQueryToSudoc(demande.getIndexRecherche().getCode(), null, ligneFichierDtoRecouv.getIndexRecherche().split(";"))); try { - ligneFichierDtoRecouv.setNbReponses(demandeRecouvService.launchQueryToSudoc(demande.getIndexRecherche().getCode(), ligneFichierDtoRecouv.getIndexRecherche())); + ligneFichierDtoRecouv.setNbReponses(ligneFichierRecouvService.launchQueryToSudoc(demande.getIndexRecherche().getCode(), ligneFichierDtoRecouv.getIndexRecherche())); switch (ligneFichierDtoRecouv.getNbReponses()) { case 0 -> ligneFichierDtoRecouv.setListePpn(""); case 1 -> ligneFichierDtoRecouv.setListePpn(traitementService.getCbs().getPpnEncours()); @@ -176,7 +176,7 @@ public void recouvExemplaire(DemandeRecouv demande, LigneFichierDtoRecouv ligneF ligneFichierDtoRecouv.setListePpn(traitementService.getCbs().getListePpn().toString().replace(';', ',')); } } catch (IOException ex) { - log.error("Erreur de communication avec le CBS sur demande recouv " + demande.getId() + " / ligne fichier n°" + ligneFichierDtoRecouv.getNumLigneFichier()); + log.error("Erreur de communication avec le CBS sur demande recouv {} / ligne fichier n°{}", demande.getId(), ligneFichierDtoRecouv.getNumLigneFichier()); //si un pb de communication avec le CBS est détecté, on se reconnecte, et on renvoie l'exception pour que le retry retente la méthode this.disconnect(); this.authenticate("M" + demande.getRcr()); @@ -189,7 +189,7 @@ public void deleteExemplaire(DemandeSupp demandeSupp, LigneFichierDtoSupp ligneF try { traitementService.deleteExemplaire(ligneFichierDtoSupp.getEpn()); } catch (IOException e) { - log.error("Erreur de communication avec le CBS sur demande de suppression " + demandeSupp.getId() + " / ligne fichier n°" + ligneFichierDtoSupp.getNumLigneFichier() + " / epn : " + ligneFichierDtoSupp.getEpn()); + log.error("Erreur de communication avec le CBS sur demande de suppression {} / ligne fichier n°{} / epn : {}", demandeSupp.getId(), ligneFichierDtoSupp.getNumLigneFichier(), ligneFichierDtoSupp.getEpn()); this.disconnect(); this.authenticate("M"+ demandeSupp.getRcr()); throw e; 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 943f6cdb..50b37684 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 @@ -12,12 +12,14 @@ 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.dto.ExemplaireWithTypeDto; import fr.abes.item.core.entities.item.*; 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.ILigneFichierService; import fr.abes.item.core.service.ReferenceService; -import fr.abes.item.core.service.impl.DemandeSuppService; +import fr.abes.item.core.service.impl.LigneFichierSuppService; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.hibernate.exception.ConstraintViolationException; @@ -45,7 +47,7 @@ public class LignesFichierProcessor implements ItemProcessor exemplairesExistants = ((DemandeSuppService) strategyFactory.getStrategy(IDemandeService.class, TYPE_DEMANDE.SUPP)) - .getExemplairesExistants(ligneFichierDtoSupp.getPpn()); + LigneFichierSuppService service = ((LigneFichierSuppService) strategyFactory.getStrategy(ILigneFichierService.class, TYPE_DEMANDE.SUPP)); + ExemplaireWithTypeDto exemplaireWithType = service.getExemplairesAndTypeDoc(ligneFichierDtoSupp.getPpn()); if (ligneFichierDtoSupp.getEpn() != null) { - Optional exemplaireASupprimerOpt = exemplairesExistants.stream().filter(exemplaire -> exemplaire.findZone("A99", 0).getValeur().equals(ligneFichierDtoSupp.getEpn())).findFirst(); + Optional exemplaireASupprimerOpt = exemplaireWithType.getExemplaires().stream().filter(exemplaire -> exemplaire.findZone("A99", 0).getValeur().equals(ligneFichierDtoSupp.getEpn())).findFirst(); if (exemplaireASupprimerOpt.isPresent()) { //Type de document non présent dans le fichier de sauvegarde txt, seulement dans le csv this.fichierSauvegardeSuppTxt.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get()); - try{ - String typeDoc = ((DemandeSuppService) strategyFactory.getStrategy(IDemandeService.class, TYPE_DEMANDE.SUPP)) - .getTypeDocumentFromPpn(ligneFichierDtoSupp.getPpn()); - this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get(), typeDoc); - } catch (CBSException | IOException | ZoneException | QueryToSudocException e) { - if(e.getClass().equals(QueryToSudocException.class)){ - this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get(), e.getMessage()); - }else{ - this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get(), ""); - } - } + this.fichierSauvegardeSuppcsv.writePpnInFile(ligneFichierDtoSupp.getPpn(), exemplaireASupprimerOpt.get(), exemplaireWithType.getType()); } //supprimer l'exemplaire this.proxyRetry.deleteExemplaire(demandeSupp, ligneFichierDtoSupp); diff --git a/core/src/main/java/fr/abes/item/core/dto/ExemplaireWithTypeDto.java b/core/src/main/java/fr/abes/item/core/dto/ExemplaireWithTypeDto.java new file mode 100644 index 00000000..655d1aec --- /dev/null +++ b/core/src/main/java/fr/abes/item/core/dto/ExemplaireWithTypeDto.java @@ -0,0 +1,17 @@ +package fr.abes.item.core.dto; + +import fr.abes.cbs.notices.Exemplaire; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class ExemplaireWithTypeDto { + private List exemplaires = new ArrayList<>(); + private String type; + + public void addExemplaires(List exemplaires) { + this.exemplaires.addAll(exemplaires); + } +} 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 6f888d1a..7f67232a 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 @@ -1,14 +1,10 @@ package fr.abes.item.core.service; -import fr.abes.cbs.exception.CBSException; -import fr.abes.cbs.exception.ZoneException; import fr.abes.item.core.dto.DemandeDto; import fr.abes.item.core.entities.item.Demande; -import fr.abes.item.core.entities.item.LigneFichier; import fr.abes.item.core.exception.DemandeCheckingException; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.FileTypeException; -import fr.abes.item.core.exception.QueryToSudocException; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -56,11 +52,9 @@ public interface IDemandeService { Demande returnState(Integer etape, Demande demande) throws DemandeCheckingException; - String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, ZoneException, IOException; - List getDemandesToArchive(); List getDemandesToPlaceInDeletedStatus(); List getDemandesToDelete(); - String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException; + } diff --git a/core/src/main/java/fr/abes/item/core/service/ILigneFichierService.java b/core/src/main/java/fr/abes/item/core/service/ILigneFichierService.java index d34be508..4667f4be 100644 --- a/core/src/main/java/fr/abes/item/core/service/ILigneFichierService.java +++ b/core/src/main/java/fr/abes/item/core/service/ILigneFichierService.java @@ -1,9 +1,13 @@ 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.Demande; import fr.abes.item.core.entities.item.LigneFichier; +import fr.abes.item.core.exception.QueryToSudocException; import java.io.File; +import java.io.IOException; import java.util.List; public interface ILigneFichierService { @@ -38,4 +42,9 @@ public interface ILigneFichierService { LigneFichier getLigneFichierbyDemandeEtPos(Demande demande, Integer numLigne); int getNbLigneFichierNonTraitee(Demande demande); + + String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException; + + String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, ZoneException, IOException; + } 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 7461d4ae..a49cfe68 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 @@ -1,12 +1,5 @@ package fr.abes.item.core.service.impl; -import fr.abes.cbs.exception.CBSException; -import fr.abes.cbs.exception.ZoneException; -import fr.abes.cbs.notices.DonneeLocale; -import fr.abes.cbs.notices.Exemplaire; -import fr.abes.cbs.notices.Zone; -import fr.abes.cbs.notices.ZoneEtatColl; -import fr.abes.cbs.utilitaire.Constants; import fr.abes.item.core.components.Fichier; import fr.abes.item.core.components.FichierEnrichiExemp; import fr.abes.item.core.configuration.factory.FichierFactory; @@ -14,31 +7,28 @@ import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; import fr.abes.item.core.dto.DemandeDto; -import fr.abes.item.core.entities.item.*; +import fr.abes.item.core.entities.item.Demande; +import fr.abes.item.core.entities.item.DemandeExemp; +import fr.abes.item.core.entities.item.EtatDemande; +import fr.abes.item.core.entities.item.TypeExemp; import fr.abes.item.core.exception.DemandeCheckingException; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.FileTypeException; -import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.baseXml.ILibProfileDao; import fr.abes.item.core.repository.item.IDemandeExempDao; import fr.abes.item.core.repository.item.ILigneFichierExempDao; import fr.abes.item.core.repository.item.IZonesAutoriseesDao; import fr.abes.item.core.service.*; import fr.abes.item.core.utilitaire.Utilitaires; -import lombok.Getter; import lombok.ToString; -import org.apache.logging.log4j.Level; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Paths; -import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Service @ToString @@ -59,15 +49,6 @@ public class DemandeExempService extends DemandeService implements IDemandeServi @Value("${files.upload.path}") private String uploadPath; - @Getter - private String exemplairesExistants; - - @Getter - private String donneeLocaleExistante; - - @Getter - private int nbReponses; - public DemandeExempService(ILibProfileDao libProfileDao, IDemandeExempDao demandeExempDao, FileSystemStorageService storageService, LigneFichierExempService ligneFichierExempService, ReferenceService referenceService, JournalService journalService, TraitementService traitementService, UtilisateurService utilisateurService, IZonesAutoriseesDao zonesAutoriseesDao, ILigneFichierExempDao ligneFichierExempDao) { super(libProfileDao); this.demandeExempDao = demandeExempDao; @@ -145,10 +126,6 @@ public List getActiveDemandesForUser(String iln) { return listeDemandeDto; } - public boolean hasDonneeLocaleExistante() { - return !donneeLocaleExistante.isEmpty(); - } - /** * mise à jour du type d'exemplarisation en fonction de l'option choisie coté front * @@ -355,76 +332,7 @@ public Demande closeDemande(Demande demande) throws DemandeCheckingException { return changeState(demande, Constant.ETATDEM_TERMINEE); } - /** - * Méthode permettant d'interroger le Sudoc, de créer un exemplaire et de le retourner pour la simulation - * - * @param demandeExemp demande d'exemplarisation concernée - * @param ligneFichierExemp ligneFichier à traiter - * @return la chaine de l'exemplaire construit, ou message d'erreur - */ - @Override - public String[] getNoticeExemplaireAvantApres(Demande demandeExemp, LigneFichier ligneFichierExemp) throws CBSException, IOException, ZoneException { - try { - DemandeExemp demande = (DemandeExemp) demandeExemp; - LigneFichierExemp ligneFichier = (LigneFichierExemp) ligneFichierExemp; - traitementService.authenticate("M" + demande.getRcr()); - String numEx = launchQueryToSudoc(demande, ligneFichier.getIndexRecherche()); - //Retourne le tableau exemplaires existants / Exemplaire à créer - return new String[]{ - //L'indice 0 retourne le PPN de la notice - traitementService.getCbs().getPpnEncours(), - //L'indice 1 retourne les données locales et les exemplaires existants tous ensemble sous forme d'une chaine - Utilitaires.removeNonPrintableCharacters(donneeLocaleExistante).replace("\r", "\r\n") + "\r\n" + exemplairesExistants.replace("\r", "\r\n"), //2*r\n\ comptent pour un saut de ligne - //L'indice 2 retourne le bloc de données locales et l'exemplaire à créer - creerDonneesLocalesFromHeaderEtValeur(demande.getListeZones(), ligneFichier.getValeurZone()).replace("\r", "\r\n") + "\r\n" + - creerExemplaireFromHeaderEtValeur(demande.getListeZones(), ligneFichier.getValeurZone(), demande.getRcr(), numEx).replace("\r", "\r\n"), - }; - //Si l'utilisateur n'a pas autorisé la création d'exemplaires multiples sur les notices de cette demande associée à ce RCR en cas d'exemplaires déjà présents - - } catch (QueryToSudocException e) { - throw new CBSException(Level.ERROR, e.getMessage()); - } finally { - traitementService.disconnect(); - } - } - /** - * @param demande : la demande à partir de laquelle on va construire la requête - * @param valeurs : tableau des valeurs des index de recherche - * @return le numéro du prochain exemplaire à créer dans la notice au format "xx" - */ - public String launchQueryToSudoc(DemandeExemp demande, String valeurs) throws CBSException, QueryToSudocException, IOException { - String[] tabvaleurs = valeurs.split(";"); - String query = getQueryToSudoc(demande.getIndexRecherche().getCode(), demande.getTypeExemp().getNumTypeExemp(), tabvaleurs); - - if (!query.isEmpty()) { - try { - traitementService.getCbs().search(query); - nbReponses = traitementService.getCbs().getNbNotices(); - } catch (IOException e) { - nbReponses = 0; - } - switch (nbReponses) { - //Le sudoc n'a pas trouvé de notice correspondant au PPN ou autre critère de recherche - case 0: - throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); - case 1: - //Le sudoc à trouvé une notice correspondant au critère - String notice = traitementService.getCbs().getClientCBS().mod("1", String.valueOf(traitementService.getCbs().getLotEncours())); - String numExStr = Utilitaires.getLastNumExempFromNotice(notice); - //On controle ici pour la notice trouvée dans le sudoc le nombre d'exemplaires déjà présents sur ce RCR - donneeLocaleExistante = Utilitaires.getDonneeLocaleExistante(notice); - exemplairesExistants = Utilitaires.getExemplairesExistants(notice); - int numEx = Integer.parseInt(numExStr); - numEx++; - return (numEx < 10) ? "0" + numEx : Integer.toString(numEx); //On retourne le numero d'exemplaire ou sera enregistré le nouvel exemplaire - default: - throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); - } - } else { - throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_NOT_COMPLIANT); - } - } /** * Récupération de la prochaine demande en attente à traiter @@ -496,164 +404,6 @@ public DemandeExemp creerDemande(String rcr, Integer userNum) { return demToReturn; } - /** - * Méthode de construction d'un exemplaire à partir de l'en tête du fichier et des valeurs associées - * - * @param header : chaine contenant la liste des zones à créer (séparées par des ;) - * @param valeurZones : chaine contenant les valeurs des zones à créer (séparées par des ;) - * @return l'exemplaire sous forme de chaine - */ - public String creerExemplaireFromHeaderEtValeur(String header, String valeurZones, String rcr, String numExemp) throws ZoneException { - String[] listeHeader = header.split(";"); - String[] listeValeur = valeurZones.split(";"); - String zonePrecedente = ""; - //variable permettant de déterminer si une 930 a été ajoutée dans l'exemplaire - boolean added930 = false; - boolean zonePrecedenteVide = false; - //Création d'un exemplaire vide - Exemplaire exemp = new Exemplaire(); - //le fichier ayant été vérifié les deux tableaux ont la même taille - for (int i = 0; i < listeHeader.length; i++) { - String headerEnCours = listeHeader[i]; //entête en cours (une zone, une zone avec sous zone, ou une sous zone) - String valeurEnCours = listeValeur[i]; //valeur en cours, associée à l'entête juste avant - if (!Utilitaires.isDonneeLocale(listeHeader[i], zonePrecedente)) { - Pattern patternHeader = Pattern.compile(Constant.REG_EXP_ZONE_SOUS_ZONE); - Matcher matcher = patternHeader.matcher(headerEnCours); - if (matcher.find()) { - //cas où on ajoute une zone + sous zone - String labelZone = matcher.group("zone"); - if (labelZone.equals("930") && !("").equals(valeurEnCours)) { - added930 = true; - } - if (Utilitaires.isEtatCollection(labelZone)) { - //cas d'une zone d'état de collection - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - exemp.addZoneEtatCollection(labelZone, matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(labelZone).toCharArray()); - } else { - zonePrecedenteVide = true; - } - } else { - //cas ou le header en cours est une zone + indicateur + sous zone classique - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - exemp.addZone(labelZone, matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(labelZone).toCharArray()); - } else { - zonePrecedenteVide = true; - } - } - zonePrecedente = matcher.group("zone"); - } else { - //cas où on ajoute une sous zone à une zone déjà insérée - if (zonePrecedenteVide) { - if (Utilitaires.isEtatCollection(zonePrecedente)) { - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - exemp.addZoneEtatCollection(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); - } - } else { - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - if (!added930) - exemp.addZone(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); - else - exemp.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); - if (zonePrecedente.equals("930")) { - added930 = true; - } - } - } - zonePrecedenteVide = false; - } else { - if (Utilitaires.isEtatCollection(zonePrecedente)) { - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - List listezone = exemp.findZones(zonePrecedente); - if (!listezone.isEmpty()) { - ZoneEtatColl zone = (ZoneEtatColl) listezone.get(0); - zone.addSousZone(headerEnCours, valeurEnCours, 0); - } else { - if (headerEnCours.equals("$4")) { - //cas où on essaie d'ajouter une $4 seule dans la 955 - exemp.addZoneEtatCollection(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); - ZoneEtatColl zone = (ZoneEtatColl) exemp.findZones(zonePrecedente).get(0); - zone.addSousZone(headerEnCours, valeurEnCours, 0); - } - } - } - } else { - if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { - //cas ou le header en cours est une sous zone seule - if (!exemp.findZones(zonePrecedente).isEmpty()) { - exemp.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); - } else { - exemp.addZone(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); - if (zonePrecedente.equals("930")) { - added930 = true; - } - } - } - } - } - } - } - } - if (added930) { - //une 930 a été rajoutée, on rajoute juste une sous zone $b - exemp.addSousZone("930", "$b", rcr); - } else { - //pas de 930 ajoutée par l'utilisateur, on la crée avec une $b - exemp.addZone("930", "$b", rcr, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone("930").toCharArray()); - } - //ajout de la exx - exemp.addZone("e" + numExemp, "$b", "x"); - //ajout de la 991 $a - ajout991(exemp); - return exemp.toString(); - } - - - /** - * Méthode d'ajout d'une zone 991 prédéfinie dans l'exemplaire - * - * @param exemp : exemplaire sur lequel rajouter la 991 - */ - private void ajout991(Exemplaire exemp) throws ZoneException { - String datePattern = "dd-MM-yyyy HH:mm"; - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern); - String date = simpleDateFormat.format(Calendar.getInstance().getTime()); - String valeur991 = Constant.TEXTE_991_CREA + " le " + date; - char[] indicateurs = {'#', '#'}; - exemp.addZone("991", "$a", valeur991, indicateurs); - } - - /** - * Méthode de création des données locales à partir de l'en tête du fichier et des valeurs associées - * - * @param header : header du fichier - * @param valeurZones : valeurs des zones à ajouter dans les données locales - * @return les données locales de la notice - */ - public String creerDonneesLocalesFromHeaderEtValeur(String header, String valeurZones) throws ZoneException { - String[] listeHeader = header.split(";"); - String[] listeValeur = valeurZones.split(";"); - String zonePrecedente = ""; - DonneeLocale donneeLocale = new DonneeLocale(Constants.STR_1F + this.donneeLocaleExistante + Constants.STR_1E); - for (int i = 0; i < listeHeader.length; i++) { - if (Utilitaires.isDonneeLocale(listeHeader[i], zonePrecedente)) { - String headerEnCours = listeHeader[i]; - String valeurEnCours = listeValeur[i]; - Pattern patternHeader = Pattern.compile(Constant.REG_EXP_DONNEELOCALE); - Matcher matcher = patternHeader.matcher(headerEnCours); - - if (matcher.find()) { - donneeLocale.addZone(matcher.group("zone"), matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(matcher.group("zone")).toCharArray()); - zonePrecedente = matcher.group("zone"); - } else { - donneeLocale.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); - } - } - } - - //replaceAll -> retire les caractères ASCII Printables sur des plages définies - return donneeLocale.toString(); - } - /** * Méthode de génération de la première ligne d'en tête du fichier résultat @@ -681,54 +431,6 @@ public List getAllArchivedDemandesAllIln() { return listeDemandeDto; } - - /** - * Méthode construisant la requête che en fonction des paramètres d'une demande d'exemplarisation - * - * @param codeIndex code de l'index de la recherche - * @param valeur tableau des valeurs utilisées pour construire la requête - * @return requête che prête à être lancée vers le CBS - */ - @Override - public String getQueryToSudoc(String codeIndex, Integer typeExemp, String[] valeur) throws QueryToSudocException { - switch (typeExemp) { - case Constant.TYPEEXEMP_MONOELEC: - switch (codeIndex) { - case "ISBN": - return "tno t; tdo o; che isb " + valeur[0]; - case "PPN": - return "che ppn " + valeur[0]; - case "SOU": - return "tno t; tdo o; che sou " + valeur[0]; - } - case Constant.TYPEEXEMP_PERIO: - switch (codeIndex) { - case "ISSN": - return "tno t; tdo t; che isn " + valeur[0]; - case "PPN": - return "che ppn " + valeur[0]; - case "SOU": - return "tno t; tdo t; che sou " + valeur[0]; - } - case Constant.TYPEEXEMP_AUTRE: - switch (codeIndex) { - case "ISBN": - return "tno t; tdo b; che isb " + valeur[0]; - case "PPN": - return "che ppn " + valeur[0]; - case "SOU": - return "tno t; tdo b; che sou " + valeur[0]; - case "DAT": - if (valeur[1].isEmpty()) { - return "tno t; tdo b; apu " + valeur[0] + "; che mti " + Utilitaires.replaceDiacritical(valeur[2]); - } - return "tno t; tdo b; apu " + valeur[0] + "; che aut " + Utilitaires.replaceDiacritical(valeur[1]) + " et mti " + Utilitaires.replaceDiacritical(valeur[2]); - } - default: - throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_NOT_RECOGNIZED_FOR_DEMANDE); - } - } - /** * méthode d'archivage d'une demande * supprime les lignes fichiers au moment de l'archivage 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 5c3f8336..51eb6d43 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 @@ -1,19 +1,18 @@ package fr.abes.item.core.service.impl; -import fr.abes.cbs.exception.CBSException; -import fr.abes.cbs.exception.ZoneException; -import fr.abes.cbs.notices.Exemplaire; import fr.abes.item.core.components.*; import fr.abes.item.core.configuration.factory.FichierFactory; 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.dto.DemandeDto; -import fr.abes.item.core.entities.item.*; +import fr.abes.item.core.entities.item.Demande; +import fr.abes.item.core.entities.item.DemandeModif; +import fr.abes.item.core.entities.item.EtatDemande; +import fr.abes.item.core.entities.item.Traitement; import fr.abes.item.core.exception.DemandeCheckingException; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.FileTypeException; -import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.baseXml.ILibProfileDao; import fr.abes.item.core.repository.item.IDemandeModifDao; import fr.abes.item.core.service.*; @@ -26,7 +25,10 @@ import java.io.IOException; import java.nio.file.Paths; import java.time.LocalDateTime; -import java.util.*; +import java.util.Calendar; +import java.util.List; +import java.util.Objects; +import java.util.Optional; @Slf4j @Service @@ -35,7 +37,6 @@ public class DemandeModifService extends DemandeService implements IDemandeServi private final IDemandeModifDao demandeModifDao; private final FileSystemStorageService storageService; private final ILigneFichierService ligneFichierService; - private final TraitementService traitementService; private final JournalService journalService; private final ReferenceService referenceService; private final UtilisateurService utilisateurService; @@ -48,12 +49,11 @@ public class DemandeModifService extends DemandeService implements IDemandeServi private FichierInitial fichierInit; private FichierPrepare fichierPrepare; - public DemandeModifService(ILibProfileDao libProfileDao, IDemandeModifDao demandeModifDao, FileSystemStorageService storageService, LigneFichierModifService ligneFichierModifService, TraitementService traitementService, JournalService journalService, ReferenceService referenceService, UtilisateurService utilisateurService, Ppntoepn procStockee) { + public DemandeModifService(ILibProfileDao libProfileDao, IDemandeModifDao demandeModifDao, FileSystemStorageService storageService, LigneFichierModifService ligneFichierModifService, JournalService journalService, ReferenceService referenceService, UtilisateurService utilisateurService, Ppntoepn procStockee) { super(libProfileDao); this.demandeModifDao = demandeModifDao; this.storageService = storageService; this.ligneFichierService = ligneFichierModifService; - this.traitementService = traitementService; this.journalService = journalService; this.referenceService = referenceService; this.utilisateurService = utilisateurService; @@ -266,53 +266,6 @@ private void appelProcStockee(String rcr) throws IOException { } } - /** - * Méthode de récupération d'une notice par son EPN - * - * @param demandeModif utilisée pour récupérer le RCR qui servira pour la construction du login Manager CBS - * @param epn epn de la notice à chercher - * @return La notice trouvée dans le CBS - * @throws CBSException : erreur CBS - */ - public String getNoticeInitiale(Demande demandeModif, String epn) throws CBSException, IOException { - try { - traitementService.authenticate('M' + demandeModif.getRcr()); - // appel getNoticeFromEPN sur EPN récupéré - String notice = traitementService.getNoticeFromEPN(epn); - return notice.substring(1, notice.length() - 1); - } finally { - // déconnexion du CBS après avoir lancé la requête - traitementService.disconnect(); - } - } - - /** - * Méthode de modification d'une notice en fonction du traitement - * - * @param demande permet de récupérer le traitement à lancer sur la notice - * @param exemplaire notice récupérée du Sudoc sur laquelle on effectue le traitement - * @param ligneFichier informations à intégrer à la notice à traiter - * @return la notice modifiée - */ - public Exemplaire getNoticeTraitee(Demande demande, String exemplaire, LigneFichier ligneFichier) throws ZoneException { - DemandeModif demandeModif = (DemandeModif) demande; - LigneFichierModif ligneFichierModif = (LigneFichierModif) ligneFichier; - String exempStr = Utilitaires.getExempFromNotice(exemplaire, ligneFichierModif.getEpn()); - switch (demandeModif.getTraitement().getNomMethode()) { - case "creerNouvelleZone": - return traitementService.creerNouvelleZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); - case "supprimerZone": - return traitementService.supprimerZone(exempStr, demandeModif.getZone()); - case "supprimerSousZone": - return traitementService.supprimerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone()); - case "ajoutSousZone": - return traitementService.creerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); - case "remplacerSousZone": - return traitementService.remplacerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); - default: - } - return null; - } /** * Lance une requête pour récupérer l'ensemble des demandeModifs @@ -391,17 +344,7 @@ public Demande closeDemande(Demande demande) throws DemandeCheckingException { return changeState(demande, Constant.ETATDEM_TERMINEE); } - public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, IOException, ZoneException { - LigneFichierModif ligneFichierModif = (LigneFichierModif) ligneFichier; - String noticeInit = getNoticeInitiale(this.findById(demande.getId()), ligneFichierModif.getEpn()); - Exemplaire noticeTraitee = getNoticeTraitee(findById(demande.getId()), noticeInit, ligneFichier); - return new String[]{ - traitementService.getCbs().getPpnEncours(), - noticeInit.replace("\r", "\r\n"), - noticeTraitee.toString().replace("\r", "\r\n") - }; - } /** * Permet de changer l'état d'une demandeModif @@ -563,12 +506,6 @@ public List getDemandesToDelete() { return null; } - @Override - public String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException { - //not implemented - return null; - } - public Demande majTraitement(Integer demandeId, Integer traitementId) { DemandeModif demandeModif = this.findById(demandeId); Traitement traitement = referenceService.findTraitementById(traitementId); 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 6a17f62c..ad54515a 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 @@ -10,11 +10,9 @@ import fr.abes.item.core.entities.item.Demande; import fr.abes.item.core.entities.item.DemandeRecouv; import fr.abes.item.core.entities.item.EtatDemande; -import fr.abes.item.core.entities.item.LigneFichier; import fr.abes.item.core.exception.DemandeCheckingException; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.FileTypeException; -import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.baseXml.ILibProfileDao; import fr.abes.item.core.repository.item.IDemandeRecouvDao; import fr.abes.item.core.service.*; @@ -165,11 +163,6 @@ public Demande closeDemande(Demande demande) throws DemandeCheckingException { return changeState(demande, Constant.ETATDEM_TERMINEE); } - @Override - public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) { - return new String[]{"Simulation impossible pour le recouvrement", ""}; - } - @Override public Demande getIdNextDemandeToProceed(int minHour, int maxHour) { int currentHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); @@ -290,36 +283,9 @@ private List getListDemandeDtoFromListDemandeRecouv(List "che isb " + valeur[0]; - case "ISSN" -> "tno t; tdo t; che isn " + valeur[0]; - case "PPN" -> "che ppn " + valeur[0]; - case "SOU" -> "tno t; tdo b; che sou " + valeur[0]; - case "DAT" -> { - if (valeur[1].isEmpty()) { - yield "tno t; tdo b; apu " + valeur[0] + "; che mti " + Utilitaires.replaceDiacritical(valeur[2]); - } - yield "tno t; tdo b; apu " + valeur[0] + "; che aut " + Utilitaires.replaceDiacritical(valeur[1]) + " et mti " + Utilitaires.replaceDiacritical(valeur[2]); - } - default -> throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_CODE_NOT_COMPLIANT); - }; - } + + /** méthode d'archivage d'une demande * supprime les lignes fichiers au moment de l'archivage 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 3e4c4f33..c92b9c53 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 @@ -1,9 +1,5 @@ package fr.abes.item.core.service.impl; -import fr.abes.cbs.exception.CBSException; -import fr.abes.cbs.exception.ZoneException; -import fr.abes.cbs.notices.Exemplaire; -import fr.abes.cbs.notices.NoticeConcrete; import fr.abes.item.core.components.*; import fr.abes.item.core.configuration.factory.FichierFactory; import fr.abes.item.core.configuration.factory.Strategy; @@ -11,17 +7,17 @@ import fr.abes.item.core.constant.TYPE_DEMANDE; import fr.abes.item.core.constant.TYPE_SUPPRESSION; import fr.abes.item.core.dto.DemandeDto; -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.EtatDemande; import fr.abes.item.core.exception.DemandeCheckingException; import fr.abes.item.core.exception.FileCheckingException; import fr.abes.item.core.exception.FileTypeException; -import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.baseXml.ILibProfileDao; import fr.abes.item.core.repository.item.IDemandeSuppDao; import fr.abes.item.core.service.*; import fr.abes.item.core.utilitaire.Utilitaires; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.Level; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -29,8 +25,10 @@ import java.io.IOException; import java.nio.file.Paths; import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; +import java.util.Calendar; +import java.util.List; +import java.util.Objects; +import java.util.Optional; @Slf4j @Service @@ -349,76 +347,7 @@ public Demande returnState(Integer etape, Demande demande) throws DemandeCheckin return save(demandeSupp); } - @Override - public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, ZoneException, IOException { - LigneFichierSupp ligneFichierSupp = (LigneFichierSupp) ligneFichier; - DemandeSupp demandeSupp = (DemandeSupp) demande; - try { - traitementService.authenticate("M" + demandeSupp.getRcr()); - List exemplairesExistants = getExemplairesExistants(ligneFichierSupp.getPpn()); - //On ne conserve que les EPN de son RCR - exemplairesExistants = exemplairesExistants.stream().filter(exemplaire -> exemplaire.findZone("930", 0).findSubLabel("$b").equals(demandeSupp.getRcr())).toList(); - if (exemplairesExistants.isEmpty()) { - return new String[] { - ligneFichierSupp.getPpn(), - "Pas d'exemplaire pour ce RCR", - "Pas d'exemplaire pour ce RCR" - }; - } - List exemplairesRestants = suppExemlaire(exemplairesExistants, ligneFichierSupp.getEpn()); - - return new String[]{ - ligneFichierSupp.getPpn(), - exemplairesExistants.stream().map(exemplaire -> exemplaire.toString().replace("\r", "\r\n")).collect(Collectors.joining("\r\n\r\n")), - exemplairesRestants.stream().map(exemplaire -> exemplaire.toString().replace("\r", "\r\n")).collect(Collectors.joining("\r\n\r\n")) - }; - }catch (QueryToSudocException ex) { - throw new CBSException(Level.ERROR, ex.getMessage()); - } finally { - traitementService.disconnect(); - } - } - - public String getTypeDocumentFromPpn(String ppn) throws CBSException, IOException, QueryToSudocException, ZoneException { - String query = "che ppn " + ppn; - traitementService.getCbs().search(query); - int nbReponses = traitementService.getCbs().getNbNotices(); - return switch (nbReponses) { - case 0 -> throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); - case 1 -> { - NoticeConcrete notice = traitementService.getCbs().editerNoticeConcrete("1"); - yield notice.getNoticeBiblio().findZone("008", 0).findSubLabel("$a").substring(0,2); - } - default -> throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); - }; - } - - public List getExemplairesExistants(String ppn) throws IOException, QueryToSudocException, CBSException, ZoneException { - String query = "che ppn " + ppn; - traitementService.getCbs().search(query); - int nbReponses = traitementService.getCbs().getNbNotices(); - return switch (nbReponses) { - case 0 -> throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); - case 1 -> { - String notice = traitementService.getCbs().getClientCBS().mod("1", String.valueOf(traitementService.getCbs().getLotEncours())); - String exemplaires = Utilitaires.getExemplairesExistants(notice); - List exempList = new ArrayList<>(); - if (!exemplaires.isEmpty()) { - for (String s : exemplaires.split("\r\r\r")) { - if (!s.isEmpty()) - exempList.add(new Exemplaire(s)); - } - } - yield exempList; - } - default -> - throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); - }; - } - private List suppExemlaire(List exemplairesExistants, String epn) { - return exemplairesExistants.stream().filter(exemplaire -> !exemplaire.findZone("A99", 0).getValeur().equals(epn)).collect(Collectors.toList()); - } @Override public List getDemandesToArchive() { @@ -444,10 +373,6 @@ public List getDemandesToDelete() { return null; } - @Override - public String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException { - return null; - } public Demande majTypeSupp(Integer demandeId, TYPE_SUPPRESSION typeSuppression) { DemandeSupp demandeSupp = this.findById(demandeId); 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 2de9bd99..bffef91c 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 @@ -1,14 +1,28 @@ package fr.abes.item.core.service.impl; +import fr.abes.cbs.exception.CBSException; +import fr.abes.cbs.exception.ZoneException; +import fr.abes.cbs.notices.DonneeLocale; +import fr.abes.cbs.notices.Exemplaire; +import fr.abes.cbs.notices.Zone; +import fr.abes.cbs.notices.ZoneEtatColl; +import fr.abes.cbs.utilitaire.Constants; 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.Demande; import fr.abes.item.core.entities.item.DemandeExemp; import fr.abes.item.core.entities.item.LigneFichier; import fr.abes.item.core.entities.item.LigneFichierExemp; +import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.item.ILigneFichierExempDao; +import fr.abes.item.core.repository.item.IZonesAutoriseesDao; import fr.abes.item.core.service.ILigneFichierService; +import fr.abes.item.core.service.TraitementService; +import fr.abes.item.core.utilitaire.Utilitaires; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.Level; import org.mozilla.universalchardet.ReaderFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,17 +30,31 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Calendar; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; @Slf4j @Strategy(type= ILigneFichierService.class, typeDemande = {TYPE_DEMANDE.EXEMP}) @Service public class LigneFichierExempService implements ILigneFichierService { private final ILigneFichierExempDao dao; + private final TraitementService traitementService; + private final IZonesAutoriseesDao zonesAutoriseesDao; + @Getter + private String exemplairesExistants; + @Getter + private String donneeLocaleExistante; + @Getter + private int nbReponses; - public LigneFichierExempService(ILigneFichierExempDao dao) { + public LigneFichierExempService(ILigneFichierExempDao dao, TraitementService traitementService, IZonesAutoriseesDao zonesAutoriseesDao) { this.dao = dao; + this.traitementService = traitementService; + this.zonesAutoriseesDao = zonesAutoriseesDao; } @Override @@ -145,4 +173,284 @@ public int getNbZeroReponseByDemande(Demande demande) { public int getNbReponseMultipleByDemande(Demande demande) { return dao.getNbReponseMultipleByDemande(demande.getId()); } + + /** + * Méthode permettant d'interroger le Sudoc, de créer un exemplaire et de le retourner pour la simulation + * + * @param demandeExemp demande d'exemplarisation concernée + * @param ligneFichierExemp ligneFichier à traiter + * @return la chaine de l'exemplaire construit, ou message d'erreur + */ + @Override + public String[] getNoticeExemplaireAvantApres(Demande demandeExemp, LigneFichier ligneFichierExemp) throws CBSException, IOException, ZoneException { + try { + DemandeExemp demande = (DemandeExemp) demandeExemp; + LigneFichierExemp ligneFichier = (LigneFichierExemp) ligneFichierExemp; + traitementService.authenticate("M" + demande.getRcr()); + String numEx = launchQueryToSudoc(demande, ligneFichier.getIndexRecherche()); + //Retourne le tableau exemplaires existants / Exemplaire à créer + return new String[]{ + //L'indice 0 retourne le PPN de la notice + traitementService.getCbs().getPpnEncours(), + //L'indice 1 retourne les données locales et les exemplaires existants tous ensemble sous forme d'une chaine + Utilitaires.removeNonPrintableCharacters(donneeLocaleExistante).replace("\r", "\r\n") + "\r\n" + exemplairesExistants.replace("\r", "\r\n"), //2*r\n\ comptent pour un saut de ligne + //L'indice 2 retourne le bloc de données locales et l'exemplaire à créer + creerDonneesLocalesFromHeaderEtValeur(demande.getListeZones(), ligneFichier.getValeurZone()).replace("\r", "\r\n") + "\r\n" + + creerExemplaireFromHeaderEtValeur(demande.getListeZones(), ligneFichier.getValeurZone(), demande.getRcr(), numEx).replace("\r", "\r\n"), + }; + //Si l'utilisateur n'a pas autorisé la création d'exemplaires multiples sur les notices de cette demande associée à ce RCR en cas d'exemplaires déjà présents + + } catch (QueryToSudocException e) { + throw new CBSException(Level.ERROR, e.getMessage()); + } finally { + traitementService.disconnect(); + } + } + + /** + * @param demande : la demande à partir de laquelle on va construire la requête + * @param valeurs : tableau des valeurs des index de recherche + * @return le numéro du prochain exemplaire à créer dans la notice au format "xx" + */ + public String launchQueryToSudoc(DemandeExemp demande, String valeurs) throws CBSException, QueryToSudocException, IOException { + String[] tabvaleurs = valeurs.split(";"); + String query = getQueryToSudoc(demande.getIndexRecherche().getCode(), demande.getTypeExemp().getNumTypeExemp(), tabvaleurs); + + if (!query.isEmpty()) { + try { + traitementService.getCbs().search(query); + nbReponses = traitementService.getCbs().getNbNotices(); + } catch (IOException e) { + nbReponses = 0; + } + switch (nbReponses) { + //Le sudoc n'a pas trouvé de notice correspondant au PPN ou autre critère de recherche + case 0: + throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); + case 1: + //Le sudoc à trouvé une notice correspondant au critère + String notice = traitementService.getCbs().getClientCBS().mod("1", String.valueOf(traitementService.getCbs().getLotEncours())); + String numExStr = Utilitaires.getLastNumExempFromNotice(notice); + //On controle ici pour la notice trouvée dans le sudoc le nombre d'exemplaires déjà présents sur ce RCR + donneeLocaleExistante = Utilitaires.getDonneeLocaleExistante(notice); + exemplairesExistants = Utilitaires.getExemplairesExistants(notice); + int numEx = Integer.parseInt(numExStr); + numEx++; + return (numEx < 10) ? "0" + numEx : Integer.toString(numEx); //On retourne le numero d'exemplaire ou sera enregistré le nouvel exemplaire + default: + throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); + } + } else { + throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_NOT_COMPLIANT); + } + } + + /** + * Méthode de création des données locales à partir de l'en tête du fichier et des valeurs associées + * + * @param header : header du fichier + * @param valeurZones : valeurs des zones à ajouter dans les données locales + * @return les données locales de la notice + */ + public String creerDonneesLocalesFromHeaderEtValeur(String header, String valeurZones) throws ZoneException { + String[] listeHeader = header.split(";"); + String[] listeValeur = valeurZones.split(";"); + String zonePrecedente = ""; + DonneeLocale donneeLocale = new DonneeLocale(Constants.STR_1F + this.donneeLocaleExistante + Constants.STR_1E); + for (int i = 0; i < listeHeader.length; i++) { + if (Utilitaires.isDonneeLocale(listeHeader[i], zonePrecedente)) { + String headerEnCours = listeHeader[i]; + String valeurEnCours = listeValeur[i]; + Pattern patternHeader = Pattern.compile(Constant.REG_EXP_DONNEELOCALE); + Matcher matcher = patternHeader.matcher(headerEnCours); + + if (matcher.find()) { + donneeLocale.addZone(matcher.group("zone"), matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(matcher.group("zone")).toCharArray()); + zonePrecedente = matcher.group("zone"); + } else { + donneeLocale.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); + } + } + } + + //replaceAll -> retire les caractères ASCII Printables sur des plages définies + return donneeLocale.toString(); + } + + /** + * Méthode de construction d'un exemplaire à partir de l'en tête du fichier et des valeurs associées + * + * @param header : chaine contenant la liste des zones à créer (séparées par des ;) + * @param valeurZones : chaine contenant les valeurs des zones à créer (séparées par des ;) + * @return l'exemplaire sous forme de chaine + */ + public String creerExemplaireFromHeaderEtValeur(String header, String valeurZones, String rcr, String numExemp) throws ZoneException { + String[] listeHeader = header.split(";"); + String[] listeValeur = valeurZones.split(";"); + String zonePrecedente = ""; + //variable permettant de déterminer si une 930 a été ajoutée dans l'exemplaire + boolean added930 = false; + boolean zonePrecedenteVide = false; + //Création d'un exemplaire vide + Exemplaire exemp = new Exemplaire(); + //le fichier ayant été vérifié les deux tableaux ont la même taille + for (int i = 0; i < listeHeader.length; i++) { + String headerEnCours = listeHeader[i]; //entête en cours (une zone, une zone avec sous zone, ou une sous zone) + String valeurEnCours = listeValeur[i]; //valeur en cours, associée à l'entête juste avant + if (!Utilitaires.isDonneeLocale(listeHeader[i], zonePrecedente)) { + Pattern patternHeader = Pattern.compile(Constant.REG_EXP_ZONE_SOUS_ZONE); + Matcher matcher = patternHeader.matcher(headerEnCours); + if (matcher.find()) { + //cas où on ajoute une zone + sous zone + String labelZone = matcher.group("zone"); + if (labelZone.equals("930") && !("").equals(valeurEnCours)) { + added930 = true; + } + if (Utilitaires.isEtatCollection(labelZone)) { + //cas d'une zone d'état de collection + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + exemp.addZoneEtatCollection(labelZone, matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(labelZone).toCharArray()); + } else { + zonePrecedenteVide = true; + } + } else { + //cas ou le header en cours est une zone + indicateur + sous zone classique + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + exemp.addZone(labelZone, matcher.group("sousZone"), valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(labelZone).toCharArray()); + } else { + zonePrecedenteVide = true; + } + } + zonePrecedente = matcher.group("zone"); + } else { + //cas où on ajoute une sous zone à une zone déjà insérée + if (zonePrecedenteVide) { + if (Utilitaires.isEtatCollection(zonePrecedente)) { + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + exemp.addZoneEtatCollection(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); + } + } else { + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + if (!added930) + exemp.addZone(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); + else + exemp.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); + if (zonePrecedente.equals("930")) { + added930 = true; + } + } + } + zonePrecedenteVide = false; + } else { + if (Utilitaires.isEtatCollection(zonePrecedente)) { + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + List listezone = exemp.findZones(zonePrecedente); + if (!listezone.isEmpty()) { + ZoneEtatColl zone = (ZoneEtatColl) listezone.get(0); + zone.addSousZone(headerEnCours, valeurEnCours, 0); + } else { + if (headerEnCours.equals("$4")) { + //cas où on essaie d'ajouter une $4 seule dans la 955 + exemp.addZoneEtatCollection(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); + ZoneEtatColl zone = (ZoneEtatColl) exemp.findZones(zonePrecedente).get(0); + zone.addSousZone(headerEnCours, valeurEnCours, 0); + } + } + } + } else { + if (!((("").equals(valeurEnCours)) || (valeurEnCours.charAt(0) == (char) 0))) { + //cas ou le header en cours est une sous zone seule + if (!exemp.findZones(zonePrecedente).isEmpty()) { + exemp.addSousZone(zonePrecedente, headerEnCours, valeurEnCours); + } else { + exemp.addZone(zonePrecedente, headerEnCours, valeurEnCours, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone(zonePrecedente).toCharArray()); + if (zonePrecedente.equals("930")) { + added930 = true; + } + } + } + } + } + } + } + } + if (added930) { + //une 930 a été rajoutée, on rajoute juste une sous zone $b + exemp.addSousZone("930", "$b", rcr); + } else { + //pas de 930 ajoutée par l'utilisateur, on la crée avec une $b + exemp.addZone("930", "$b", rcr, zonesAutoriseesDao.getIndicateursByTypeExempAndLabelZone("930").toCharArray()); + } + //ajout de la exx + exemp.addZone("e" + numExemp, "$b", "x"); + //ajout de la 991 $a + ajout991(exemp); + return exemp.toString(); + } + + + /** + * Méthode d'ajout d'une zone 991 prédéfinie dans l'exemplaire + * + * @param exemp : exemplaire sur lequel rajouter la 991 + */ + private void ajout991(Exemplaire exemp) throws ZoneException { + String datePattern = "dd-MM-yyyy HH:mm"; + SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern); + String date = simpleDateFormat.format(Calendar.getInstance().getTime()); + String valeur991 = Constant.TEXTE_991_CREA + " le " + date; + char[] indicateurs = {'#', '#'}; + exemp.addZone("991", "$a", valeur991, indicateurs); + } + + /** + * Méthode construisant la requête che en fonction des paramètres d'une demande d'exemplarisation + * + * @param codeIndex code de l'index de la recherche + * @param valeur tableau des valeurs utilisées pour construire la requête + * @return requête che prête à être lancée vers le CBS + */ + @Override + public String getQueryToSudoc(String codeIndex, Integer typeExemp, String[] valeur) throws QueryToSudocException { + switch (typeExemp) { + case Constant.TYPEEXEMP_MONOELEC: + switch (codeIndex) { + case "ISBN": + return "tno t; tdo o; che isb " + valeur[0]; + case "PPN": + return "che ppn " + valeur[0]; + case "SOU": + return "tno t; tdo o; che sou " + valeur[0]; + } + case Constant.TYPEEXEMP_PERIO: + switch (codeIndex) { + case "ISSN": + return "tno t; tdo t; che isn " + valeur[0]; + case "PPN": + return "che ppn " + valeur[0]; + case "SOU": + return "tno t; tdo t; che sou " + valeur[0]; + } + case Constant.TYPEEXEMP_AUTRE: + switch (codeIndex) { + case "ISBN": + return "tno t; tdo b; che isb " + valeur[0]; + case "PPN": + return "che ppn " + valeur[0]; + case "SOU": + return "tno t; tdo b; che sou " + valeur[0]; + case "DAT": + if (valeur[1].isEmpty()) { + return "tno t; tdo b; apu " + valeur[0] + "; che mti " + Utilitaires.replaceDiacritical(valeur[2]); + } + return "tno t; tdo b; apu " + valeur[0] + "; che aut " + Utilitaires.replaceDiacritical(valeur[1]) + " et mti " + Utilitaires.replaceDiacritical(valeur[2]); + } + default: + throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_NOT_RECOGNIZED_FOR_DEMANDE); + } + } + + public boolean hasDonneeLocaleExistante() { + return !donneeLocaleExistante.isEmpty(); + } } 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 bb41df7a..4817ee8e 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 @@ -1,5 +1,8 @@ package fr.abes.item.core.service.impl; +import fr.abes.cbs.exception.CBSException; +import fr.abes.cbs.exception.ZoneException; +import fr.abes.cbs.notices.Exemplaire; import fr.abes.item.core.configuration.factory.Strategy; import fr.abes.item.core.constant.Constant; import fr.abes.item.core.constant.TYPE_DEMANDE; @@ -7,8 +10,10 @@ import fr.abes.item.core.entities.item.DemandeModif; import fr.abes.item.core.entities.item.LigneFichier; import fr.abes.item.core.entities.item.LigneFichierModif; +import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.item.ILigneFichierModifDao; import fr.abes.item.core.service.ILigneFichierService; +import fr.abes.item.core.service.TraitementService; import fr.abes.item.core.utilitaire.Utilitaires; import lombok.extern.slf4j.Slf4j; import org.mozilla.universalchardet.ReaderFactory; @@ -28,9 +33,11 @@ @Service public class LigneFichierModifService implements ILigneFichierService { private final ILigneFichierModifDao dao; + private final TraitementService traitementService; - public LigneFichierModifService(ILigneFichierModifDao dao) { + public LigneFichierModifService(ILigneFichierModifDao dao, TraitementService traitementService) { this.dao = dao; + this.traitementService = traitementService; } @Override @@ -152,4 +159,71 @@ public int getNbReponseMultipleByDemande(Demande demande) { public void deleteByDemande(Demande demande) { dao.deleteByDemandeModif((DemandeModif) demande); } + + @Override + public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, IOException, ZoneException { + LigneFichierModif ligneFichierModif = (LigneFichierModif) ligneFichier; + String noticeInit = getNoticeInitiale(demande, ligneFichierModif.getEpn()); + Exemplaire noticeTraitee = getNoticeTraitee(demande, noticeInit, ligneFichier); + + return new String[]{ + traitementService.getCbs().getPpnEncours(), + noticeInit.replace("\r", "\r\n"), + noticeTraitee.toString().replace("\r", "\r\n") + }; + } + + @Override + public String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException { + //not implemented + return null; + } + + /** + * Méthode de récupération d'une notice par son EPN + * + * @param demandeModif utilisée pour récupérer le RCR qui servira pour la construction du login Manager CBS + * @param epn epn de la notice à chercher + * @return La notice trouvée dans le CBS + * @throws CBSException : erreur CBS + */ + public String getNoticeInitiale(Demande demandeModif, String epn) throws CBSException, IOException { + try { + traitementService.authenticate('M' + demandeModif.getRcr()); + // appel getNoticeFromEPN sur EPN récupéré + String notice = traitementService.getNoticeFromEPN(epn); + return notice.substring(1, notice.length() - 1); + } finally { + // déconnexion du CBS après avoir lancé la requête + traitementService.disconnect(); + } + } + + /** + * Méthode de modification d'une notice en fonction du traitement + * + * @param demande permet de récupérer le traitement à lancer sur la notice + * @param exemplaire notice récupérée du Sudoc sur laquelle on effectue le traitement + * @param ligneFichier informations à intégrer à la notice à traiter + * @return la notice modifiée + */ + public Exemplaire getNoticeTraitee(Demande demande, String exemplaire, LigneFichier ligneFichier) throws ZoneException { + DemandeModif demandeModif = (DemandeModif) demande; + LigneFichierModif ligneFichierModif = (LigneFichierModif) ligneFichier; + String exempStr = Utilitaires.getExempFromNotice(exemplaire, ligneFichierModif.getEpn()); + switch (demandeModif.getTraitement().getNomMethode()) { + case "creerNouvelleZone": + return traitementService.creerNouvelleZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); + case "supprimerZone": + return traitementService.supprimerZone(exempStr, demandeModif.getZone()); + case "supprimerSousZone": + return traitementService.supprimerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone()); + case "ajoutSousZone": + return traitementService.creerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); + case "remplacerSousZone": + return traitementService.remplacerSousZone(exempStr, demandeModif.getZone(), demandeModif.getSousZone(), ligneFichierModif.getValeurZone()); + default: + } + return null; + } } diff --git a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierRecouvService.java b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierRecouvService.java index c583671c..e764c37d 100644 --- a/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierRecouvService.java +++ b/core/src/main/java/fr/abes/item/core/service/impl/LigneFichierRecouvService.java @@ -1,13 +1,16 @@ package fr.abes.item.core.service.impl; 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.Demande; import fr.abes.item.core.entities.item.DemandeRecouv; import fr.abes.item.core.entities.item.LigneFichier; import fr.abes.item.core.entities.item.LigneFichierRecouv; +import fr.abes.item.core.exception.QueryToSudocException; import fr.abes.item.core.repository.item.ILigneFichierRecouvDao; import fr.abes.item.core.service.ILigneFichierService; +import fr.abes.item.core.service.TraitementService; import fr.abes.item.core.utilitaire.Utilitaires; import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; @@ -25,9 +28,11 @@ @Strategy(type= ILigneFichierService.class, typeDemande = {TYPE_DEMANDE.RECOUV}) public class LigneFichierRecouvService implements ILigneFichierService { private final ILigneFichierRecouvDao dao; + private final TraitementService traitementService; - public LigneFichierRecouvService(ILigneFichierRecouvDao dao) { + public LigneFichierRecouvService(ILigneFichierRecouvDao dao, TraitementService traitementService) { this.dao = dao; + this.traitementService = traitementService; } @@ -138,4 +143,40 @@ public int getNbUneReponseByDemande(Demande demande) { public int getNbReponseMultipleByDemande(Demande demande) { return 0; } + + public int launchQueryToSudoc(String codeIndex, String valeurs) throws IOException, QueryToSudocException { + String[] tabvaleurs = valeurs.split(";"); + String query = getQueryToSudoc(codeIndex, null, tabvaleurs); + traitementService.getCbs().search(query); + return traitementService.getCbs().getNbNotices(); + } + + /** + * Méthode construisant la requête che en fonction des paramètres d'une demande d'exemplarisation + * @param codeIndex code de l'index de la recherche + * @param type : non utilisé dans cette implementation + * @param valeur tableau des valeurs utilisées pour construire la requête + * @return requête che prête à être lancée vers le CBS + */ + @Override + public String getQueryToSudoc(String codeIndex, Integer type, String[] valeur) throws QueryToSudocException { + return switch (codeIndex) { + case "ISBN" -> "che isb " + valeur[0]; + case "ISSN" -> "tno t; tdo t; che isn " + valeur[0]; + case "PPN" -> "che ppn " + valeur[0]; + case "SOU" -> "tno t; tdo b; che sou " + valeur[0]; + case "DAT" -> { + if (valeur[1].isEmpty()) { + yield "tno t; tdo b; apu " + valeur[0] + "; che mti " + Utilitaires.replaceDiacritical(valeur[2]); + } + yield "tno t; tdo b; apu " + valeur[0] + "; che aut " + Utilitaires.replaceDiacritical(valeur[1]) + " et mti " + Utilitaires.replaceDiacritical(valeur[2]); + } + default -> throw new QueryToSudocException(Constant.ERR_FILE_SEARCH_INDEX_CODE_NOT_COMPLIANT); + }; + } + + @Override + public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) { + return new String[]{"Simulation impossible pour le recouvrement", ""}; + } } 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 0221e57b..541376dc 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 @@ -1,16 +1,24 @@ package fr.abes.item.core.service.impl; +import fr.abes.cbs.exception.CBSException; +import fr.abes.cbs.exception.ZoneException; +import fr.abes.cbs.notices.Exemplaire; +import fr.abes.cbs.notices.NoticeConcrete; 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.dto.ExemplaireWithTypeDto; 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.exception.QueryToSudocException; import fr.abes.item.core.repository.item.ILigneFichierSuppDao; import fr.abes.item.core.service.ILigneFichierService; +import fr.abes.item.core.service.TraitementService; import fr.abes.item.core.utilitaire.Utilitaires; import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.Level; import org.mozilla.universalchardet.ReaderFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,15 +30,18 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; @Slf4j @Strategy(type = ILigneFichierService.class, typeDemande = {TYPE_DEMANDE.SUPP}) @Service public class LigneFichierSuppService implements ILigneFichierService { private final ILigneFichierSuppDao dao; + private final TraitementService traitementService; - public LigneFichierSuppService(ILigneFichierSuppDao dao) { + public LigneFichierSuppService(ILigneFichierSuppDao dao, TraitementService traitementService) { this.dao = dao; + this.traitementService = traitementService; } @Override @@ -148,4 +159,85 @@ public int getNbReponseMultipleByDemande(Demande demande) { public void deleteByDemande(Demande demande) { dao.deleteByDemandeSupp((DemandeSupp) demande); } + + @Override + public String[] getNoticeExemplaireAvantApres(Demande demande, LigneFichier ligneFichier) throws CBSException, ZoneException, IOException { + LigneFichierSupp ligneFichierSupp = (LigneFichierSupp) ligneFichier; + DemandeSupp demandeSupp = (DemandeSupp) demande; + try { + traitementService.authenticate("M" + demandeSupp.getRcr()); + List exemplairesExistants = getExemplairesExistants(ligneFichierSupp.getPpn()); + //On ne conserve que les EPN de son RCR + exemplairesExistants = exemplairesExistants.stream().filter(exemplaire -> exemplaire.findZone("930", 0).findSubLabel("$b").equals(demandeSupp.getRcr())).toList(); + if (exemplairesExistants.isEmpty()) { + return new String[] { + ligneFichierSupp.getPpn(), + "Pas d'exemplaire pour ce RCR", + "Pas d'exemplaire pour ce RCR" + }; + } + List exemplairesRestants = suppExemlaire(exemplairesExistants, ligneFichierSupp.getEpn()); + + return new String[]{ + ligneFichierSupp.getPpn(), + exemplairesExistants.stream().map(exemplaire -> exemplaire.toString().replace("\r", "\r\n")).collect(Collectors.joining("\r\n\r\n")), + exemplairesRestants.stream().map(exemplaire -> exemplaire.toString().replace("\r", "\r\n")).collect(Collectors.joining("\r\n\r\n")) + }; + }catch (QueryToSudocException ex) { + throw new CBSException(Level.ERROR, ex.getMessage()); + } finally { + traitementService.disconnect(); + } + } + + + private List suppExemlaire(List exemplairesExistants, String epn) { + return exemplairesExistants.stream().filter(exemplaire -> !exemplaire.findZone("A99", 0).getValeur().equals(epn)).collect(Collectors.toList()); + } + + public List getExemplairesExistants(String ppn) throws IOException, QueryToSudocException, CBSException, ZoneException { + String query = "che ppn " + ppn; + traitementService.getCbs().search(query); + int nbReponses = traitementService.getCbs().getNbNotices(); + return switch (nbReponses) { + case 0 -> throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); + case 1 -> { + String notice = traitementService.getCbs().getClientCBS().mod("1", String.valueOf(traitementService.getCbs().getLotEncours())); + String exemplaires = Utilitaires.getExemplairesExistants(notice); + List exempList = new ArrayList<>(); + if (!exemplaires.isEmpty()) { + for (String s : exemplaires.split("\r\r\r")) { + if (!s.isEmpty()) + exempList.add(new Exemplaire(s)); + } + } + yield exempList; + } + default -> + throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); + }; + } + + public ExemplaireWithTypeDto getExemplairesAndTypeDoc(String ppn) throws QueryToSudocException, IOException, CBSException, ZoneException { + String query = "che ppn " + ppn; + traitementService.getCbs().search(query); + int nbReponses = traitementService.getCbs().getNbNotices(); + ExemplaireWithTypeDto exempWithTypeDto = new ExemplaireWithTypeDto(); + return switch (nbReponses) { + case 0 -> throw new QueryToSudocException(Constant.ERR_FILE_NOTICE_NOT_FOUND); + case 1 -> { + NoticeConcrete notice = traitementService.getCbs().editerNoticeConcrete("1"); + exempWithTypeDto.setType(notice.getNoticeBiblio().findZone("008", 0).findSubLabel("$a").substring(0,2)); + exempWithTypeDto.addExemplaires(notice.getExemplaires()); + yield exempWithTypeDto; + } + default -> + throw new QueryToSudocException(Constant.ERR_FILE_MULTIPLES_NOTICES_FOUND + traitementService.getCbs().getListePpn()); + }; + } + + @Override + public String getQueryToSudoc(String code, Integer type, String[] valeurs) throws QueryToSudocException { + return null; + } } diff --git a/core/src/test/java/fr/abes/item/core/service/impl/DemandeRecouvServiceTest.java b/core/src/test/java/fr/abes/item/core/service/impl/DemandeRecouvServiceTest.java deleted file mode 100644 index da6c6771..00000000 --- a/core/src/test/java/fr/abes/item/core/service/impl/DemandeRecouvServiceTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package fr.abes.item.core.service.impl; - -import fr.abes.item.core.exception.QueryToSudocException; -import fr.abes.item.core.repository.baseXml.ILibProfileDao; -import fr.abes.item.core.repository.item.IDemandeRecouvDao; -import fr.abes.item.core.repository.item.ILigneFichierRecouvDao; -import fr.abes.item.core.service.FileSystemStorageService; -import fr.abes.item.core.service.ReferenceService; -import fr.abes.item.core.service.TraitementService; -import fr.abes.item.core.service.UtilisateurService; -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; - -@SpringBootTest(classes = {DemandeRecouvService.class}) -class DemandeRecouvServiceTest { - @Autowired - DemandeRecouvService service; - @MockBean - ILigneFichierRecouvDao ligneFichierRecouvDao; - @MockBean - IDemandeRecouvDao demandeRecouvDao; - @MockBean - FileSystemStorageService storageService; - @MockBean - ReferenceService referenceService; - @MockBean - TraitementService traitementService; - @MockBean - LigneFichierRecouvService ligneFichierRecouvService; - @MockBean - UtilisateurService utilisateurService; - @MockBean - ILibProfileDao libProfileDao; - @Test - void getQueryToSudoc() throws QueryToSudocException { - String result = service.getQueryToSudoc("DAT", null, new String[]{"a", "Téoàrtü", "ÛioëÂÄ"}); - System.out.printf(result); - } -} \ No newline at end of file diff --git a/core/src/test/java/fr/abes/item/core/service/impl/DemandeExempServiceTest.java b/core/src/test/java/fr/abes/item/core/service/impl/LigneFichierExempServiceTest.java similarity index 74% rename from core/src/test/java/fr/abes/item/core/service/impl/DemandeExempServiceTest.java rename to core/src/test/java/fr/abes/item/core/service/impl/LigneFichierExempServiceTest.java index 26cd1862..beb4d807 100644 --- a/core/src/test/java/fr/abes/item/core/service/impl/DemandeExempServiceTest.java +++ b/core/src/test/java/fr/abes/item/core/service/impl/LigneFichierExempServiceTest.java @@ -1,13 +1,10 @@ package fr.abes.item.core.service.impl; -import fr.abes.cbs.exception.CBSException; import fr.abes.cbs.exception.ZoneException; import fr.abes.item.core.constant.Constant; -import fr.abes.item.core.repository.baseXml.ILibProfileDao; -import fr.abes.item.core.repository.item.IDemandeExempDao; import fr.abes.item.core.repository.item.ILigneFichierExempDao; import fr.abes.item.core.repository.item.IZonesAutoriseesDao; -import fr.abes.item.core.service.*; +import fr.abes.item.core.service.TraitementService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -23,31 +20,18 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -@SpringBootTest(classes = {DemandeExempService.class}) +@SpringBootTest(classes = {LigneFichierExempService.class}) @ExtendWith({SpringExtension.class}) -class DemandeExempServiceTest { - @MockBean - IDemandeExempDao demandeExempDao; - @MockBean - FileSystemStorageService storageService; - @MockBean - LigneFichierExempService ligneFichierExempService; - @MockBean - ReferenceService referenceService; - @MockBean - JournalService journalService; - @MockBean - TraitementService traitementService; - @MockBean - UtilisateurService utilisateurService; +class LigneFichierExempServiceTest { @MockBean IZonesAutoriseesDao zonesAutoriseesDao; @MockBean - ILigneFichierExempDao ligneFichierExempDao; + TraitementService traitementService; @MockBean - ILibProfileDao libProfileDao; + ILigneFichierExempDao iligneFichierExempDao; @Autowired - DemandeExempService demandeExempService; + LigneFichierExempService ligneFichierExempService; + final String RCR = "341725201"; final String NUMEXEMP = "01"; String dateToInsert; @@ -61,30 +45,30 @@ void init() { } @Test - void getExempWithOneValue() throws ZoneException, CBSException { + void getExempWithOneValue() throws ZoneException { String header = "930 $c"; String valeur = "test"; - assertThat(demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP).contains("e01 $bx\r" + + assertThat(ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains("e01 $bx\r" + "930 ##$b341725201$ctest\r" + - "991 ##$a" + Constant.TEXTE_991_CREA + " le " + dateToInsert + "\r")); + "991 ##$a" + Constant.TEXTE_991_CREA + " le " + dateToInsert + "\r"); } @Test - void getExempWithOneZoneAndTwoSousZones() throws ZoneException, CBSException { + void getExempWithOneZoneAndTwoSousZones() throws ZoneException { String header = "930 $d;$c"; String valeur = "testd;testc"; - assertThat(demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( + assertThat(ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( "e01 $bx\r" + "930 ##$b341725201$ctestc$dtestd\r" + "991 ##$a" + Constant.TEXTE_991_CREA + " le " + dateToInsert + "\r"); } @Test - void getExempWithTwoZonesAndOneSousZone() throws ZoneException, CBSException { + void getExempWithTwoZonesAndOneSousZone() throws ZoneException { String header = "930 $d;915 $a"; String valeur = "testd;testa"; - assertThat(demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( + assertThat(ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( "e01 $bx\r" + "915 ##$atesta\r" + "930 ##$b341725201$dtestd\r" + @@ -92,10 +76,10 @@ void getExempWithTwoZonesAndOneSousZone() throws ZoneException, CBSException { } @Test - void getExempWithTwoZonesAndTwoSousZone() throws ZoneException, CBSException { + void getExempWithTwoZonesAndTwoSousZone() throws ZoneException { String header = "930 $d;$c;915 $a;$b"; String valeur = "testd;testc;test2;test3"; - assertThat(demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( + assertThat(ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP)).contains( "e01 $bx\r" + "915 ##$atest2$btest3\r" + "930 ##$b341725201$ctestc$dtestd\r" + @@ -103,10 +87,10 @@ void getExempWithTwoZonesAndTwoSousZone() throws ZoneException, CBSException { } @Test - void getExempWithThreeZonesAndTwoSousZone() throws ZoneException, CBSException { + void getExempWithThreeZonesAndTwoSousZone() throws ZoneException { String header = "E317 $a;E856 $u;$9;930 $j"; String valeur = "DeGruyter LN;http://buadistant;2018-145;g;"; - String notice = demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); + String notice = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); assertThat(notice).contains( "e01 $bx\r" + "930 ##$b341725201$jg\r" + @@ -116,10 +100,10 @@ void getExempWithThreeZonesAndTwoSousZone() throws ZoneException, CBSException { } @Test - void getExempWithALotOfEverything() throws ZoneException, CBSException { + void getExempWithALotOfEverything() throws ZoneException { String header = "930 $d;$c;915 $a;$b"; String valeur = "testd;testc;test2;test3"; - String notice = demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); + String notice = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); assertThat(notice).isEqualTo( "e01 $bx\r" + "915 ##$atest2$btest3\r" + @@ -128,10 +112,10 @@ void getExempWithALotOfEverything() throws ZoneException, CBSException { } @Test - void getExempWithALotOfEverything2() throws ZoneException, CBSException { + void getExempWithALotOfEverything2() throws ZoneException { String header = "E856$u;$l;$z;930$a;$j;955 41$a;$k;$4;991$a;E702$3"; String valeur = "https://federation.unimes.fr:8443/login?url=https://rd.springer.com/journal/766;UN | DIP;[Springer Journal Archives - Licence Nationale - Accès UNîmes] (1996)-(2014);Springer Journal Archives;g;1996;2014;Springer Journal Archives;Springer-revues-UN;test"; - String notice = demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); + String notice = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); assertThat(notice).isEqualTo( "e01 $bx\r" + "930 ##$b341725201$aSpringer Journal Archives$jg\r" + @@ -143,13 +127,13 @@ void getExempWithALotOfEverything2() throws ZoneException, CBSException { } @Test - void getExempWithMaxZonesAndSouszones() throws ZoneException, CBSException { + void getExempWithMaxZonesAndSouszones() throws ZoneException { // GIVEN String header = "915 $a;$b;917 $a;930 $c;$d;$e;$a;$i;$v;$2;991 $a;999 $a;$b;$c;$i;$o;$s;$z;E316 $a;E317 $a;E319 $a;$b;$c;$d;$x"; String valeur = "915a;915b;917a;930c;930d;930e;930a;930i;930v;9302;991a;999a;999b;999c;999i;999o;999s;999z;E316a;E317a;E319a;E319b;E319c;E319d;E319x"; // WHEN - String notice = demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); + String notice = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); // THEN assertThat(notice).isEqualTo( "e01 $bx\r" + @@ -165,11 +149,11 @@ void getExempWithMaxZonesAndSouszones() throws ZoneException, CBSException { } @Test - void getExempWithSomeEmptyTag() throws ZoneException, CBSException { + void getExempWithSomeEmptyTag() throws ZoneException { String header = "915 $a;930 $c;$d;$a;$j"; String valeur = ";DROIT;SDR;M31733;a"; - String notice = demandeExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); + String notice = ligneFichierExempService.creerExemplaireFromHeaderEtValeur(header, valeur, RCR, NUMEXEMP); assertThat(notice).isEqualTo( "e01 $bx\r" + "930 ##$b341725201$cDROIT$dSDR$aM31733$ja\r" + 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 9b756eb2..9223db9c 100644 --- a/web/src/main/java/fr/abes/item/web/DemandeRestService.java +++ b/web/src/main/java/fr/abes/item/web/DemandeRestService.java @@ -187,7 +187,6 @@ public String getTypeExemplarisationDemande(@PathVariable("id") Integer id, Http * @param type type de demande concernée par le webservice * @param file : fichier à uploader * @param numDemande : demandeModif à laquelle rattacher le fichier - * @return : messager indiquant le résultat de l'upload * @throws ForbiddenException accès interdit à l'utilisateur (mauvaise authentification) * @throws UserExistException utilisateur non présent dans la base de donnée (id inconnu) * @throws FileTypeException le type de fichier est incorrect, non supporté pour le traitement @@ -228,7 +227,7 @@ public String[] simulerLigne(@PathVariable("type") TYPE_DEMANDE type, @PathVaria try { Demande demande = service.findById(numDemande); LigneFichier ligneFichier = ligneFichierService.getLigneFichierbyDemandeEtPos(demande, numLigne); - return service.getNoticeExemplaireAvantApres(demande, ligneFichier); + return ligneFichierService.getNoticeExemplaireAvantApres(demande, ligneFichier); } catch (CBSException e) { //adaptation du message en cas de login manager manquant if (e.getMessage().equals("Code d'accès non reconnu")) diff --git a/web/src/test/java/fr/abes/item/web/impl/DemandeRestServiceTest.java b/web/src/test/java/fr/abes/item/web/impl/DemandeRestServiceTest.java index 7754c134..92dfa123 100644 --- a/web/src/test/java/fr/abes/item/web/impl/DemandeRestServiceTest.java +++ b/web/src/test/java/fr/abes/item/web/impl/DemandeRestServiceTest.java @@ -305,7 +305,7 @@ void testSimulerLigne() throws Exception { Mockito.doNothing().when(checkAccessToServices).autoriserAccesDemandeParIln(1, "1", TYPE_DEMANDE.EXEMP); Mockito.when(demandeExempService.findById(1)).thenReturn((DemandeExemp) this.demandeDto.get(0).getDemande()); Mockito.when(ligneFichierExempService.getLigneFichierbyDemandeEtPos(Mockito.any(), Mockito.anyInt())).thenReturn(new LigneFichierExemp()); - Mockito.when(demandeExempService.getNoticeExemplaireAvantApres(Mockito.any(), Mockito.any())).thenReturn(new String[]{"avant", "après"}); + Mockito.when(ligneFichierExempService.getNoticeExemplaireAvantApres(Mockito.any(), Mockito.any())).thenReturn(new String[]{"avant", "après"}); this.mockMvc.perform(get("/api/v1/simulerLigne/EXEMP/1/1").requestAttr("userNum", "1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.[0]").value("avant")) From cabe0920ecc963236b7b8c6eeccdc66219cbbbf5 Mon Sep 17 00:00:00 2001 From: pierre-maraval Date: Tue, 3 Dec 2024 11:15:39 +0100 Subject: [PATCH 2/2] Refactor : LigneFichierDtoExemp --- .../item/batch/traitement/model/LigneFichierDtoExemp.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/batch/src/main/java/fr/abes/item/batch/traitement/model/LigneFichierDtoExemp.java b/batch/src/main/java/fr/abes/item/batch/traitement/model/LigneFichierDtoExemp.java index 9d26f1ea..df6791be 100644 --- a/batch/src/main/java/fr/abes/item/batch/traitement/model/LigneFichierDtoExemp.java +++ b/batch/src/main/java/fr/abes/item/batch/traitement/model/LigneFichierDtoExemp.java @@ -51,9 +51,6 @@ public TYPE_DEMANDE getTypeDemande() { } public Integer getNbReponses() { - if(nbReponses==null){ - return 0; - } - return nbReponses; + return (nbReponses==null) ? 0 : nbReponses; } }