Skip to content

Commit

Permalink
FIX : Récupération des notices imprimées dans catalogue général
Browse files Browse the repository at this point in the history
Ajustement mapper pour exclusion des expensions, et prise en compte des $3 répétées en 6XX
  • Loading branch information
pierre-maraval committed Nov 6, 2024
1 parent f169649 commit 31c902a
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 33 deletions.
88 changes: 68 additions & 20 deletions src/main/java/fr/abes/kafkatosudoc/kafka/KbartListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
@Service
@Slf4j
public class KbartListener {
private static final String ERROR_COMM = "erreur de communication avec le Sudoc, tentative de reconnexion";
private static final String ERROR_DECO = "Erreur de déconnexion du Sudoc";

@Value("${sudoc.serveur}")
private String serveurSudoc;
Expand Down Expand Up @@ -176,7 +178,7 @@ private void traiterPackageDansSudoc(List<LigneKbartConnect> listeNotices, Strin
try {
service.disconnect();
} catch (CBSException e) {
log.warn("Erreur de déconnexion du Sudoc");
log.warn("traiterPackageDansSudoc" + ERROR_DECO);
}
}
}
Expand All @@ -190,7 +192,7 @@ private String getNoticeBouquet(SudocService service, String provider, String pa
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("erreur de communication avec le Sudoc, tentative de reconnexion");
log.debug("getNoticeBouquet" + ERROR_COMM);
service.disconnect();
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
} catch (CBSException ex) {
Expand Down Expand Up @@ -221,7 +223,7 @@ private void ajout469(String ppnNoticeBouquet, String ppn, LigneKbartConnect lig
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.error("erreur de communication avec le Sudoc, tentative de reconnexion");
log.error("ajout469" + ERROR_COMM);
service.disconnect();
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
} catch (CBSException ex) {
Expand Down Expand Up @@ -287,7 +289,7 @@ public void listenKbartToDeleteFromKafka(ConsumerRecord<String, GenericRecord> p
try {
service.disconnect();
} catch (CBSException e) {
log.warn("Erreur de déconnexion du Sudoc");
log.warn("listenKbartToDeleteFromKafka" + ERROR_DECO);
}
}
}
Expand Down Expand Up @@ -395,7 +397,7 @@ public void listenKbartFromKafkaExNihilo(ConsumerRecord<String, LigneKbartConnec
emailService.sendErrorMessagesExNihilo(filename, this.workInProgressMapExNihilo.get(filename));
this.workInProgressMapExNihilo.remove(filename);
} catch (CBSException | IOException e) {
log.warn("Erreur de déconnexion du Sudoc");
log.warn("listenKbartFromKafkaExNihilo" + ERROR_DECO);
}
}
}
Expand All @@ -416,7 +418,7 @@ private void creerNoticeExNihilo(LigneKbartConnect ligneKbartConnect, String pro
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("erreur de communication avec le Sudoc, tentative de reconnexion");
log.debug("creerNoticeExNihilo" + ERROR_COMM);
service.disconnect();
service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
} catch (CBSException | IOException ex) {
Expand Down Expand Up @@ -454,17 +456,21 @@ public void listenKbartFromKafkaImprime(ConsumerRecord<String, LigneKbartImprime
SudocService service = new SudocService();
try {
//authentification sur la base maitre du sudoc pour récupérer la notice imprimée
service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
//service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
if (this.workInProgressMapImprime.get(filename).getListeNotices() != null && !this.workInProgressMapImprime.get(filename).getListeNotices().isEmpty()) {
Map<String, NoticeConcrete> mapNoticesImprimees = getNoticesImprimeesFromCatalogue(filename, service);
service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
for (LigneKbartImprime ligneKbartImprime : this.workInProgressMapImprime.get(filename).getListeNotices()) {
creerNoticeAPartirImprime(ligneKbartImprime, provider, filename, service);
KbartAndImprimeDto kbartAndImprimeDto = new KbartAndImprimeDto();
kbartAndImprimeDto.setKbart(mapper.map(ligneKbartImprime, LigneKbartImprime.class));
kbartAndImprimeDto.setNotice(mapNoticesImprimees.get(ligneKbartImprime.getPpn().toString()));
creerNoticeAPartirImprime(kbartAndImprimeDto, provider, filename, ligneKbartImprime.getPpn().toString(), service);
}
}
}
catch (IOException e) {
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("erreur de communication avec le Sudoc, tentative de reconnexion");
log.debug("listenKbartFromKafkaImprime : " + ERROR_COMM);
service.disconnect();
service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
} catch (CBSException | IOException ex) {
Expand All @@ -480,21 +486,63 @@ public void listenKbartFromKafkaImprime(ConsumerRecord<String, LigneKbartImprime
emailService.sendErrorMessagesImprime(filename, this.workInProgressMapImprime.get(filename));
this.workInProgressMapImprime.remove(filename);
} catch (CBSException | IOException e) {
log.warn("Erreur de déconnexion du Sudoc");
log.warn("listenKbartFromKafkaImprime : " + ERROR_DECO);
}
}
}

}

private Map<String, NoticeConcrete> getNoticesImprimeesFromCatalogue(String filename, SudocService service) throws IOException, CBSException {
String ppn;
try {
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
Map<String, NoticeConcrete> noticeConcreteMap = new HashMap<>();
for (LigneKbartImprime ligneKbartImprime : this.workInProgressMapImprime.get(filename).getListeNotices()) {
ppn = ligneKbartImprime.getPpn().toString();
feedMapWithNotices(ppn, filename, noticeConcreteMap, service);
}
return noticeConcreteMap;
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("getNoticesImprimeesFromCatalogue" + ERROR_COMM);
service.disconnect();
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
} catch (CBSException ex) {
log.error(ex.getMessage());
}
throw e;
}
}

@Retryable(maxAttempts = 4, retryFor = IOException.class, noRetryFor = {CBSException.class, ZoneException.class}, backoff = @Backoff(delay = 1000, multiplier = 2))
private void feedMapWithNotices(String ppn, String filename, Map<String, NoticeConcrete> noticeConcreteMap, SudocService service) throws IOException {
try {
noticeConcreteMap.put(ppn, service.getNoticeFromPpn(ppn));
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("feedMapWithNotices" + ERROR_COMM);
service.disconnect();
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
} catch (CBSException ex) {
log.error(ex.getMessage());
}
throw e;
} catch (CBSException | ZoneException e) {
log.error("Erreur dans la récupération de la notice imprimée pour le ppn {}", ppn);
this.workInProgressMapImprime.get(filename).addErrorMessagesImprime(ppn, e.getMessage());
}

}

@Retryable(maxAttempts = 4, retryFor = IOException.class, backoff = @Backoff(delay = 1000, multiplier = 2))
private void creerNoticeAPartirImprime(LigneKbartImprime ligneKbartImprime, String provider, String filename, SudocService service) throws IOException {
private void creerNoticeAPartirImprime(KbartAndImprimeDto kbartAndImprimeDto, String provider, String
filename, String ppn, SudocService service) throws IOException {
String packageName = CheckFiles.getPackageFromFilename(filename);
NoticeConcrete noticeElec = new NoticeConcrete();
KbartAndImprimeDto kbartAndImprimeDto = new KbartAndImprimeDto();
kbartAndImprimeDto.setKbart(mapper.map(ligneKbartImprime, LigneKbartImprime.class));
try {
kbartAndImprimeDto.setNotice(service.getNoticeFromPpn(ligneKbartImprime.getPpn().toString()));
noticeElec = mapper.map(kbartAndImprimeDto, NoticeConcrete.class);
//Ajout provider display name en 214 $c 2è occurrence
String providerDisplay = baconService.getProviderDisplayName(provider);
Expand All @@ -508,13 +556,13 @@ private void creerNoticeAPartirImprime(LigneKbartImprime ligneKbartImprime, Stri
log.debug("Création notice à partir de l'imprimée terminée");
} catch (CBSException | ZoneException e) {
log.error(e.getMessage());
this.workInProgressMapImprime.get(filename).addErrorMessagesImprime(ligneKbartImprime.getPpn().toString(), (noticeElec.getNoticeBiblio() != null) ? noticeElec.getNoticeBiblio().toString() : "Notice non récupérée", e.getMessage());
} catch (IOException e) {
this.workInProgressMapImprime.get(filename).addErrorMessagesImprime(ppn, (noticeElec.getNoticeBiblio() != null) ? noticeElec.getNoticeBiblio().toString() : "Notice non récupérée", e.getMessage());
} catch (IOException e) {
//cas d'une erreur de communication avec le Sudoc, on se relogge au cbs, et on retry la méthode
try {
log.debug("erreur de communication avec le Sudoc, tentative de reconnexion");
log.debug("creerNoticeAPartirImprime" + ERROR_COMM);
service.disconnect();
service.authenticate(serveurSudoc, portSudoc, loginSudoc, passwordSudoc);
service.authenticateBaseSignal(serveurSudoc, portSudoc, loginSudoc, passwordSudoc, signalDb);
} catch (CBSException ex) {
log.error(ex.getMessage());
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/fr/abes/kafkatosudoc/kafka/WorkInProgress.java
Original file line number Diff line number Diff line change
Expand Up @@ -70,4 +70,8 @@ public void addErrorMessagesImprime(String ppn, String notice, String erreur) {
this.errorMessages.add(new ErrorMessage(ERROR_TYPE.FROMIMPRIME, "{Ppn : " + ppn + ", Erreur : " + erreur +", Notice : " + notice + "}"));
}

public void addErrorMessagesImprime(String ppn,String erreur) {
this.errorMessages.add(new ErrorMessage(ERROR_TYPE.FROMIMPRIME, "{Ppn : " + ppn + ", Erreur : " + erreur + "}"));
}

}
24 changes: 14 additions & 10 deletions src/main/java/fr/abes/kafkatosudoc/utils/NoticeMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;

@Component
public class NoticeMapper {
Expand Down Expand Up @@ -287,45 +284,52 @@ public NoticeConcrete convert(MappingContext<KbartAndImprimeDto, NoticeConcrete>
List<Zone> zones500 = noticeImprimee.getNoticeBiblio().getListeZones().values().stream().filter(zone -> zone.getLabel().startsWith("5")).filter(zone -> (!zone.getLabel().equals("579") && !zone.getLabel().equals("512") && !zone.getLabel().equals("516"))).toList();
for (Zone zone1 : zones500) {
if (zone1.findSubLabel("$3") != null) {
zone1.addSubLabel("$5", zone1.findSubLabel("$3"));
zone1.addSubLabel("$5", zone1.findSubLabel("$3").substring(0,9));
zone1.deleteSubLabel("$3");
}
}
zones500.forEach(noticeElec::addZone);

List<Zone> zones600 = noticeImprimee.getNoticeBiblio().getListeZones().values().stream().filter(zone -> zone.getLabel().startsWith("6")).toList();

for (Zone zone1 : zones600) {
List<String> listeSousZones = new ArrayList<>();
if (zone1.findSubLabel("$3") != null) {
zone1.addSubLabel("$5", zone1.findSubLabel("$3"));
for (String ssZone : zone1.getSubLabelTable().columnMap().get("$3").values()){
listeSousZones.add(ssZone.substring(0,9));
}
zone1.deleteSubLabel("$3");
for (String ssZone : listeSousZones) {
zone1.addSubLabel("$5", ssZone);
}
}
}
zones600.forEach(noticeElec::addZone);

for (Zone zone700 : noticeImprimee.getNoticeBiblio().findZones("700")) {
if (zone700.findSubLabel("$3") != null) {
zone700.addSubLabel("$5", zone700.findSubLabel("$3"));
zone700.addSubLabel("$5", zone700.findSubLabel("$3").substring(0,9));
zone700.deleteSubLabel("$3");
}
noticeElec.addZone(zone700);
}
for (Zone zone701 : noticeImprimee.getNoticeBiblio().findZones("701")) {
if (zone701.findSubLabel("$3") != null) {
zone701.addSubLabel("$5", zone701.findSubLabel("$3"));
zone701.addSubLabel("$5", zone701.findSubLabel("$3").substring(0,9));
zone701.deleteSubLabel("$3");
}
noticeElec.addZone(zone701);
}
for (Zone zone710 : noticeImprimee.getNoticeBiblio().findZones("710")) {
if (zone710.findSubLabel("$3") != null) {
zone710.addSubLabel("$5", zone710.findSubLabel("$3"));
zone710.addSubLabel("$5", zone710.findSubLabel("$3").substring(0,9));
zone710.deleteSubLabel("$3");
}
noticeElec.addZone(zone710);
}
for (Zone zone711 : noticeImprimee.getNoticeBiblio().findZones("711")) {
if (zone711.findSubLabel("$3") != null) {
zone711.addSubLabel("$5", zone711.findSubLabel("$3"));
zone711.addSubLabel("$5", zone711.findSubLabel("$3").substring(0,9));
zone711.deleteSubLabel("$3");
}
noticeElec.addZone(zone711);
Expand Down
29 changes: 26 additions & 3 deletions src/test/java/fr/abes/kafkatosudoc/utils/NoticeMapperTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -209,19 +209,19 @@ void testMapperNoticeFromKbartAndImprimeCas0() throws ZoneException {
}

@Test
@DisplayName("Test création notice from Kbart & notice imprimée cas 0 : ajout isbn ")
@DisplayName("Test création notice from Kbart & notice imprimée : gestion zones 500 ")
void testMapperNoticeFromKbartAndImprimeZones500() throws ZoneException {
KbartAndImprimeDto kbartAndImprimeDto = getKbartAndImprimeDto();
Zone zone500 = new Zone("500", TYPE_NOTICE.BIBLIOGRAPHIQUE);
zone500.addSubLabel("$3", "test");
zone500.addSubLabel("$3", "123456789");
zone500.addSubLabel("$k", "testk");
kbartAndImprimeDto.getNotice().getNoticeBiblio().addZone(zone500);

NoticeConcrete noticeResult = mapper.map(kbartAndImprimeDto, NoticeConcrete.class);
Biblio biblio = noticeResult.getNoticeBiblio();
Assertions.assertEquals(16, biblio.getListeZones().size());
Assertions.assertEquals("0-415-11262-8", biblio.findZone("010", 0).findSubLabel("$a"));
Assertions.assertEquals("test", biblio.findZone("500", 0).findSubLabel("$5"));
Assertions.assertEquals("123456789", biblio.findZone("500", 0).findSubLabel("$5"));
Assertions.assertEquals("testk", biblio.findZone("500", 0).findSubLabel("$k"));
Assertions.assertNull(biblio.findZone("500", 0).findSubLabel("$3"));

Expand All @@ -231,6 +231,29 @@ void testMapperNoticeFromKbartAndImprimeZones500() throws ZoneException {
Assertions.assertEquals(15, biblio.getListeZones().size());
}

@Test
@DisplayName("Test création notice from Kbart & notice imprimée : gestion zones 600")
void testMapperNoticeFromKbartAndImprimeZones600() throws ZoneException {
KbartAndImprimeDto kbartAndImprimeDto = getKbartAndImprimeDto();
Zone zone600 = new Zone("600", TYPE_NOTICE.BIBLIOGRAPHIQUE);
zone600.addSubLabel("$3", "123456789");
zone600.addSubLabel("$3", "987654321");
zone600.addSubLabel("$2", "rameau");
kbartAndImprimeDto.getNotice().getNoticeBiblio().addZone(zone600);

NoticeConcrete noticeResult = mapper.map(kbartAndImprimeDto, NoticeConcrete.class);
Biblio biblio = noticeResult.getNoticeBiblio();
Assertions.assertEquals(16, biblio.getListeZones().size());
Assertions.assertEquals("0-415-11262-8", biblio.findZone("010", 0).findSubLabel("$a"));
Assertions.assertEquals("600 $5123456789$5987654321$2rameau\r", biblio.findZone("600", 0).toString());
Assertions.assertNull(biblio.findZone("600", 0).findSubLabel("$3"));

kbartAndImprimeDto.getKbart().setOnlineIdentifier(null);
noticeResult = mapper.map(kbartAndImprimeDto, NoticeConcrete.class);
biblio = noticeResult.getNoticeBiblio();
Assertions.assertEquals(15, biblio.getListeZones().size());
}

@Test
@DisplayName("Test création notice from Kbart & notice imprimée cas 0 : ajout isbn ")
void testMapperNoticeFromKbartAndImprimeZones454() throws ZoneException {
Expand Down

0 comments on commit 31c902a

Please sign in to comment.