Skip to content
Snippets Groups Projects

fix: [AOU-1851] complete language mapping during metadata imports from external sources

Merged Nicolas.Rod requested to merge rodn-1851-check-language-mapping-during-import into master
Files
11
@@ -30,6 +30,7 @@ import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -51,6 +52,7 @@ import ch.unige.solidify.model.xml.orcid.v3_0.work.WorkSummary;
import ch.unige.solidify.service.OrcidService;
import ch.unige.solidify.util.StringTool;
import ch.unige.aou.config.AouProperties;
import ch.unige.aou.controller.AdminController;
import ch.unige.aou.exception.AouRuntimeException;
import ch.unige.aou.model.ExistingPublicationInfo;
@@ -60,6 +62,7 @@ import ch.unige.aou.model.notification.EventType;
import ch.unige.aou.model.orcid.ExternalIdentifiers;
import ch.unige.aou.model.orcid.ImportedIdentifiers;
import ch.unige.aou.model.orcid.OrcidSynchronization;
import ch.unige.aou.model.publication.ContributorDTO;
import ch.unige.aou.model.publication.Publication;
import ch.unige.aou.model.settings.Person;
import ch.unige.aou.repository.OrcidSynchronizationRepository;
@@ -91,9 +94,11 @@ public class OrcidSynchronizationService extends AouResourceService<OrcidSynchro
private final OrcidWorkAdapter orcidWorkAdapter;
public OrcidSynchronizationService(PersonService personService, OrcidService orcidService, DuplicateService duplicateService,
PublicationService publicationService, MetadataImportWorkFlowService metadataImportWorkFlowService, EventService eventService,
MetadataService metadataService, OrcidWorkAdapter orcidWorkAdapter) {
private final List<String> rolesToSendToOrcidProfile;
public OrcidSynchronizationService(AouProperties properties, PersonService personService, OrcidService orcidService,
DuplicateService duplicateService, PublicationService publicationService, MetadataImportWorkFlowService metadataImportWorkFlowService,
EventService eventService, MetadataService metadataService, OrcidWorkAdapter orcidWorkAdapter) {
this.personService = personService;
this.orcidService = orcidService;
this.duplicateService = duplicateService;
@@ -102,6 +107,7 @@ public class OrcidSynchronizationService extends AouResourceService<OrcidSynchro
this.eventService = eventService;
this.metadataService = metadataService;
this.orcidWorkAdapter = orcidWorkAdapter;
this.rolesToSendToOrcidProfile = List.of(properties.getOrcid().getRolesToSendToOrcidProfile());
}
@Override
@@ -408,6 +414,7 @@ public class OrcidSynchronizationService extends AouResourceService<OrcidSynchro
List<OrcidSynchronization> orcidSynchronizationsToNotify = new ArrayList<>();
if (person.getOrcidToken() != null) {
Set<Publication> publications = this.publicationService.findCompletedPublicationsAsContributor(person, lastCheckDate);
publications = this.filterByContributorRole(person, publications);
for (Publication publication : publications) {
try {
OrcidSynchronization newOrcidSynchronization = this.sendToOrcidProfile(person, publication.getResId());
@@ -428,9 +435,38 @@ public class OrcidSynchronizationService extends AouResourceService<OrcidSynchro
}
}
private Set<Publication> filterByContributorRole(Person person, Set<Publication> publications) {
Set<Publication> publicationsFilteredByRole = new HashSet<>();
for (Publication publication : publications) {
if (this.roleCanBeSendToOrcidProfile(person, publication)) {
publicationsFilteredByRole.add(publication);
}
}
return publicationsFilteredByRole;
}
public boolean roleCanBeSendToOrcidProfile(Person person, Publication publication) {
// A person may be linked to many users -> many cnIndividu
List<String> cnIndividus = this.personService.getUnigeCnIndividus(person);
final MetadataExtractor metadataExtractor = this.metadataService.getMetadataExtractor(publication.getMetadataVersion());
final Object depositDoc = metadataExtractor.createDepositDocObjectFromXml(publication.getMetadata());
return metadataExtractor.getContributors(depositDoc).stream().anyMatch(
abstractContributor -> abstractContributor instanceof ContributorDTO contributorDTO
&& cnIndividus.contains(contributorDTO.getCnIndividu())
&& this.rolesToSendToOrcidProfile.contains(contributorDTO.getRole()));
}
public OrcidSynchronization sendToOrcidProfile(Person person, String publicationId) {
if (person.getOrcidToken() != null) {
final Publication publication = this.publicationService.findOne(publicationId);
if (!this.roleCanBeSendToOrcidProfile(person, publication)) {
throw new SolidifyRuntimeException(
"The person " + person + " has no contributor role on publication " + publicationId + " that can be send to his ORCID profile");
}
// Check if the publication already exists in ORCID profile. If this is the case, we don't upload it again
boolean doUpload = true;
List<OrcidSynchronization> orcidSynchronizations = this.findByPersonResIdAndPublicationResId(person.getResId(), publicationId);
@@ -448,8 +484,6 @@ public class OrcidSynchronizationService extends AouResourceService<OrcidSynchro
}
}
final Publication publication = this.publicationService.findOne(publicationId);
if (doUpload) {
final MetadataExtractor metadataExtractor = this.metadataService.getMetadataExtractor(publication.getMetadataVersion());
final Object depositDoc = metadataExtractor.createDepositDocObjectFromXml(publication.getMetadata());
Loading