Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import fr.insee.rmes.magma.diffusion.model.LocalisedLabel;
import fr.insee.rmes.magma.diffusion.model.NearbyConcept;
import fr.insee.rmes.magma.diffusion.queries.parameters.ConceptsRequestParametizer;
import fr.insee.rmes.magma.diffusion.services.ConceptService;
import fr.insee.rmes.magma.diffusion.services.RapportQualiteService;
import fr.insee.rmes.magma.diffusion.utils.ConceptDTO;
import fr.insee.rmes.magma.diffusion.utils.EndpointsUtils;
import io.micrometer.common.util.StringUtils;
Expand All @@ -19,9 +21,11 @@
public class ConceptsEndpoints implements ConceptsApi {

private final RequestProcessor requestProcessor;
private final ConceptService conceptService;

public ConceptsEndpoints(RequestProcessor requestProcessor) {
public ConceptsEndpoints(RequestProcessor requestProcessor, ConceptService conceptService) {
this.requestProcessor = requestProcessor;
this.conceptService = conceptService;
}

@Override
Expand All @@ -34,24 +38,24 @@ public ResponseEntity<Concept> getconcept(String id) {
if (conceptDTO != null) {
if (Boolean.TRUE.equals(conceptDTO.getHasLink())) {
List<NearbyConcept> nearbyConceptList = requestProcessor.queryToFindNearbyConcepts()
.with(ConceptsRequestParametizer.ofUri(conceptDTO.getUri()))
.with(ConceptsRequestParametizer.ofUri(conceptDTO.uri()))
.executeQuery()
.listResult(NearbyConcept.class).result();
conceptDTO.setNearbyConcepts(nearbyConceptList);
conceptDTO = conceptDTO.withNearbyConcepts(nearbyConceptList);
}

if (Boolean.TRUE.equals(conceptDTO.getHasIntitulesAlternatifs())){
List<LocalisedLabel> intitulesAlternatifs = requestProcessor.queryToFindConceptIntitulesAlternatifs()
.with(ConceptsRequestParametizer.ofUri(conceptDTO.getUri()))
.with(ConceptsRequestParametizer.ofUri(conceptDTO.uri()))
.executeQuery()
.listResult(LocalisedLabel.class)
.result();

conceptDTO.setIntitulesAlternatifs(intitulesAlternatifs);
conceptDTO = conceptDTO.withIntitulesAlternatifs(intitulesAlternatifs);

}

Concept concept = conceptDTO.transformDTOenConcept();
Concept concept = conceptService.transformDTOenConcept(conceptDTO);

return EndpointsUtils.toResponseEntity(concept);

Expand All @@ -71,23 +75,25 @@ public ResponseEntity<List<ConceptForList>> getconceptsliste(String label, Strin
.listResult(ConceptDTO.class)
.result();

listConceptDTOs.forEach(conceptDto -> {
if (Boolean.TRUE.equals(conceptDto.getHasLink())){
List<NearbyConcept> nearbyConceptList = requestProcessor.queryToFindNearbyConcepts()
.with(ConceptsRequestParametizer.ofUri(conceptDto.getUri()))
.executeQuery()
.listResult(NearbyConcept.class).result();
conceptDto.setNearbyConcepts(nearbyConceptList);
}
});

List<ConceptForList> concepts = listConceptDTOs.stream()
.map(ConceptDTO::transformDTOenDefinition)
List<ConceptDTO> listConceptDTOsWithLinks = listConceptDTOs.stream()
.map(conceptDto -> {
if (Boolean.TRUE.equals(conceptDto.getHasLink())) {
List<NearbyConcept> nearbyConceptList = requestProcessor.queryToFindNearbyConcepts()
.with(ConceptsRequestParametizer.ofUri(conceptDto.uri()))
.executeQuery()
.listResult(NearbyConcept.class).result();
return conceptDto.withNearbyConcepts(nearbyConceptList);
}
return conceptDto;
})
.toList();
List<ConceptForList> concepts = listConceptDTOsWithLinks.stream()
.map(conceptService::transformDTOenDefinition)
.toList();

return EndpointsUtils.toResponseEntity(concepts);

}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.insee.rmes.magma.diffusion.services;


import fr.insee.rmes.magma.diffusion.model.Concept;
import fr.insee.rmes.magma.diffusion.model.ConceptForList;
import fr.insee.rmes.magma.diffusion.utils.ConceptDTO;

public interface ConceptService {
Concept transformDTOenConcept(ConceptDTO conceptDTO);
ConceptForList transformDTOenDefinition(ConceptDTO conceptDTO);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package fr.insee.rmes.magma.diffusion.services;

import fr.insee.rmes.magma.diffusion.model.Concept;
import fr.insee.rmes.magma.diffusion.model.ConceptForList;
import fr.insee.rmes.magma.diffusion.model.LocalisedLabel;
import fr.insee.rmes.magma.diffusion.model.NearbyConcept;
import fr.insee.rmes.magma.diffusion.utils.ConceptDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.net.URI;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static fr.insee.rmes.magma.diffusion.utils.LocalisedLabelUtils.createLangueContenu;
import static fr.insee.rmes.magma.diffusion.utils.LocalisedLabelUtils.createListLangueContenu;

@Service
@Slf4j
public class ConceptServiceImpl implements ConceptService{

public Concept transformDTOenConcept(ConceptDTO conceptDTO) {
Concept concept = new Concept();
concept.setId(conceptDTO.id());
concept.setUri(URI.create(conceptDTO.uri()));

concept.setIntitule(buildLocalisedLabels(conceptDTO.intituleFr(), conceptDTO.intituleEn()));
concept.setDefinition(buildLocalisedLabels(conceptDTO.definitionFr(), conceptDTO.definitionEn()));
concept.setDefinitionCourte(buildLocalisedLabels(conceptDTO.scopeNoteFr(), conceptDTO.scopeNoteEn()));
concept.setNoteEditoriale(buildLocalisedLabels(conceptDTO.noteEditorialeFr(), conceptDTO.noteEditorialeEn()));


if (Boolean.TRUE.equals(conceptDTO.hasIntitulesAlternatifs())) {
addIntitulesAlternatifs(conceptDTO,concept);
}
else concept.setIntitulesAlternatifs(null);

addNearByConcepts(conceptDTO,concept);

//Dates
concept.setDateMiseAJour(tryParseDateToLocalDate(conceptDTO.dateMiseAJour()));
concept.setDateCreation(tryParseDateToLocalDate(conceptDTO.dateCreation()));
concept.setDateFinDeValidite(tryParseDateToLocalDate(conceptDTO.dateFinDeValidite()));

return concept;
}


private static List<LocalisedLabel> buildLocalisedLabels(String frField, String enField) {
if (frField == null && enField == null) return null;
return createListLangueContenu(createLangueContenu(frField, "fr"), createLangueContenu(enField, "en"));
}


private static LocalDate tryParseDateToLocalDate(String dateString) {
if (dateString == null || dateString.isEmpty()) {
return null;
}
// Try first to parse as Instant
try {
return Instant.parse(dateString)
.atZone(ZoneId.systemDefault())
.toLocalDate();
} catch (DateTimeParseException e1) {
// If failed, try to parse as LocalDateTime
try {
return LocalDateTime.parse(dateString).toLocalDate();
} catch (DateTimeParseException e2) {
log.error("IMPOSSIBLE TO PARSE THE DATE '{}' : {}", dateString, e2.getMessage());
return null;
}
}
}


private void addNearByConcepts(ConceptDTO conceptDTO, Concept concept) {
concept.setConceptsSuivants(null);
concept.setConceptsPrecedents(null);
concept.setConceptsLies(null);
concept.setConceptsProches(null);
concept.setConceptsPlusGeneriques(null);
concept.setConceptsPlusSpecifiques(null);
concept.setConceptsReferences(null);
if (conceptDTO.nearbyConcepts() != null) {
conceptDTO.nearbyConcepts().forEach(nearbyConcept -> {
switch (nearbyConcept.getTypeOfLink()) {
case "isReplacedBy" -> concept.setConceptsSuivants(addToList(nearbyConcept, concept.getConceptsSuivants()));
case "replaces" -> concept.setConceptsPrecedents(addToList(nearbyConcept, concept.getConceptsPrecedents()));
case "related" -> concept.setConceptsLies(addToList(nearbyConcept, concept.getConceptsLies()));
case "closeMatch" -> concept.setConceptsProches(addToList(nearbyConcept, concept.getConceptsProches()));
case "broader" -> concept.setConceptsPlusGeneriques(addToList(nearbyConcept, concept.getConceptsPlusGeneriques()));
case "narrower" -> concept.setConceptsPlusSpecifiques(addToList(nearbyConcept, concept.getConceptsPlusSpecifiques()));
case "references" -> concept.setConceptsReferences(addToList(nearbyConcept, concept.getConceptsReferences()));
case null, default -> log.warn("typeOfLink unknown or null : {}", nearbyConcept.getTypeOfLink());
}
});
}
}

private List<NearbyConcept> addToList(NearbyConcept nearbyConcept, List<NearbyConcept> conceptsList) {
ArrayList<NearbyConcept> result = conceptsList == null ? new ArrayList<>() : new ArrayList<>(conceptsList);
result.add(nearbyConcept);
return result;
}

private void addNearByConcepts(ConceptDTO conceptDTO, ConceptForList concept) {
concept.setConceptsSuivants(null);
concept.setConceptsPrecedents(null);
concept.setConceptsLies(null);
concept.setConceptsProches(null);
concept.setConceptsPlusGeneriques(null);
concept.setConceptsPlusSpecifiques(null);
concept.setConceptsReferences(null);
if (conceptDTO.nearbyConcepts() != null) {
conceptDTO.nearbyConcepts().forEach(nearbyConcept -> {
switch (nearbyConcept.getTypeOfLink()) {
case "isReplacedBy" -> concept.setConceptsSuivants(addToList(nearbyConcept, concept.getConceptsSuivants()));
case "replaces" -> concept.setConceptsPrecedents(addToList(nearbyConcept, concept.getConceptsPrecedents()));
case "related" -> concept.setConceptsLies(addToList(nearbyConcept, concept.getConceptsLies()));
case "closeMatch" -> concept.setConceptsProches(addToList(nearbyConcept, concept.getConceptsProches()));
case "broader" -> concept.setConceptsPlusGeneriques(addToList(nearbyConcept, concept.getConceptsPlusGeneriques()));
case "narrower" -> concept.setConceptsPlusSpecifiques(addToList(nearbyConcept, concept.getConceptsPlusSpecifiques()));
case "references" -> concept.setConceptsReferences(addToList(nearbyConcept, concept.getConceptsReferences()));
case null, default -> log.warn("typeOfLink unknown or null : {}", nearbyConcept.getTypeOfLink());
}
});
}
}


private void addIntitulesAlternatifs(ConceptDTO conceptDTO, Concept concept) {
for (LocalisedLabel item : conceptDTO.intitulesAlternatifs()) {
LocalisedLabel newIntitule = createLangueContenu(item.getContenu(), item.getLangue());
concept.addIntitulesAlternatifsItem(newIntitule);
}
}


public ConceptForList transformDTOenDefinition(ConceptDTO conceptDTO) {
ConceptForList concept = new ConceptForList();
concept.setId(conceptDTO.id());
concept.setUri(URI.create(conceptDTO.uri()));
concept.setIntitule(conceptDTO.intituleFr());

addNearByConcepts(conceptDTO, concept);

return concept;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ private void addRichText(RubriqueDTO rubriqueDTO, Rubrique rubrique, RapportQual
}
rubrique.addContenusItem(contenuLg1);

if (rubriqueDTO.isDocLg2NotEmpty() && (StringUtils.isNotEmpty(rubriqueDTO.labelLg2())||rubriqueDTO.hasDocLg2())){
if (isConditionForContenuLg2(rubriqueDTO)){
Contenu contenuLg2 = new Contenu();
contenuLg2.setDocuments(null);// will be valued only if a document exists
if (StringUtils.isNotEmpty(rubriqueDTO.labelLg2())) {
Expand All @@ -153,6 +153,10 @@ private void addRichText(RubriqueDTO rubriqueDTO, Rubrique rubrique, RapportQual

}

private static boolean isConditionForContenuLg2(RubriqueDTO rubriqueDTO) {
return rubriqueDTO.hasDocLg2() != null && (StringUtils.isNotEmpty(rubriqueDTO.labelLg2()) || rubriqueDTO.hasDocLg2());
}

private List<Document> findDocuments(String rapportQualiteId, String rubriqueDTOId, String lang) {
List<DocumentDTO> documentsDTO = this.requestProcessor.queryToFindDocuments()
.with(new OperationsDocumentsRequestParametizer(rapportQualiteId, rubriqueDTOId, lang))
Expand Down
Loading