diff --git a/AoU-Admin/src/main/java/ch/unige/aou/controller/admin/ExternalDataController.java b/AoU-Admin/src/main/java/ch/unige/aou/controller/admin/ExternalDataController.java index 3cf66aa5cf27ca44fd11b31c287415108e105b69..8eb07fac737853448676e7a9e35cecfcc24f7e97 100644 --- a/AoU-Admin/src/main/java/ch/unige/aou/controller/admin/ExternalDataController.java +++ b/AoU-Admin/src/main/java/ch/unige/aou/controller/admin/ExternalDataController.java @@ -117,13 +117,20 @@ public class ExternalDataController { @GetMapping(AouActionName.GET_JOURNAL_TITLES) public HttpEntity<Collection<JournalTitleDTO>> getJournalTitlesByISSN(@RequestParam(required = false) String issn, - @RequestParam(required = false) String title, - Pageable page) { + @RequestParam(required = false) String title, + @RequestParam(required=false, defaultValue = "false") boolean extendedSearch, + Pageable page) { if (!StringTool.isNullOrEmpty(title)) { SearchDTO search = new SearchDTO(); search.setPage(page.getPageNumber()); search.setSize(page.getPageSize()); - String[] searchArray = new String[] { "title=" + title + "*" }; + + String[] searchArray; + if(extendedSearch) { + searchArray = new String[]{"title=" + title, "MUST=medium=cr"}; + } else { + searchArray = new String[]{"title=" + title, "MUST=medium=cr,ta"}; + } search.setSearch(searchArray); return new ResponseEntity<>(this.journalTitleService.getJournalTitlesByTitle(search), HttpStatus.OK); } else if (!StringTool.isNullOrEmpty(issn)) { diff --git a/AoU-Admin/src/test/java/ch/unige/aou/test/storage/StorageServiceTest.java b/AoU-Admin/src/test/java/ch/unige/aou/test/storage/StorageServiceTest.java index 7b5f96e57e343621895eeadbcfd8695fc9504bc1..3782d7348198d11a2f722580ed4d5030273e9947 100644 --- a/AoU-Admin/src/test/java/ch/unige/aou/test/storage/StorageServiceTest.java +++ b/AoU-Admin/src/test/java/ch/unige/aou/test/storage/StorageServiceTest.java @@ -3,6 +3,7 @@ package ch.unige.aou.test.storage; import java.nio.file.Path; import java.nio.file.Paths; +import ch.unige.aou.service.rest.JournalTitleRemoteService; import org.junit.jupiter.api.AfterEach; import org.mockito.Mock; @@ -50,6 +51,8 @@ public abstract class StorageServiceTest { private ContributorService contributorService; @Mock private LanguageService languageService; + @Mock + private JournalTitleRemoteService journalTitleRemoteService; protected Path storageDir = Paths.get("src", "test", "resources", "storage"); @@ -99,7 +102,8 @@ public abstract class StorageServiceTest { aouProperties.getStorage().setUrl(this.storageDir.toAbsolutePath().toUri().toString()); this.metadataService = new MetadataService(aouProperties, this.messageService, this.publicationTypeService, this.publicationSubtypeService, - this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService); + this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService, + this.journalTitleRemoteService); if (!FileTool.ensureFolderExists(this.storageDir)) { throw new SolidifyRuntimeException("Cannot create " + this.storageDir); diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/business/PublicationService.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/business/PublicationService.java index 42070ada4676db957041e92b227af2884dcee796..9df65d591cb5946e90560bc243e159beabe02d84 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/business/PublicationService.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/business/PublicationService.java @@ -198,6 +198,9 @@ public class PublicationService extends AouResourceService<Publication> { // publication's classification metadata are completed with structures Dewey codes metadataExtractor.completeClassificationsMetadataWithDeweyCodes(publication); + if(publication.getFormStep().equals(Publication.DepositFormStep.DESCRIPTION)) { + metadataExtractor.replaceISSNByISSNL(publication); + } // (re)generate Json form data from XML metadata to ensure they are synchronized metadataExtractor.setFormDataFromMetadata(publication); } diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/MetadataService.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/MetadataService.java index bc814093e6c3576dbb76e412a243a86b38af587c..8f39adca941480f4b7fd387109efac3dbc2428b9 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/MetadataService.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/MetadataService.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; +import ch.unige.aou.service.rest.JournalTitleRemoteService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; @@ -52,11 +53,13 @@ public class MetadataService extends AouService { private ResearchGroupService researchGroupService; private ContributorService contributorService; private LanguageService languageService; + private JournalTitleRemoteService journalTitleRemoteService; public MetadataService(AouProperties aouProperties, MessageService messageService, PublicationTypeService publicationTypeService, PublicationSubtypeService publicationSubtypeService, PublicationSubSubtypeService publicationSubSubtypeService, StructureService structureService, - ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService) { + ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService, + JournalTitleRemoteService journalTitleRemoteService) { super(messageService); this.aouProperties = aouProperties; this.publicationTypeService = publicationTypeService; @@ -66,6 +69,7 @@ public class MetadataService extends AouService { this.researchGroupService = researchGroupService; this.contributorService = contributorService; this.languageService = languageService; + this.journalTitleRemoteService = journalTitleRemoteService; } public Object getOaiDcMetadata(PublicationMetadata archive) { @@ -83,11 +87,11 @@ public class MetadataService extends AouService { case V1_0: return new MetadataExtractorV1(this.aouProperties, this.publicationTypeService, this.publicationSubtypeService, this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, - this.languageService); + this.languageService, this.journalTitleRemoteService); case V2_0: return new MetadataExtractorV2(this.aouProperties, this.publicationTypeService, this.publicationSubtypeService, this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, - this.languageService); + this.languageService, this.journalTitleRemoteService); default: throw new SolidifyProcessingException(this.messageService.get("metadata.error.version", new Object[] { version })); } diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractor.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractor.java index fb9db5e2da1fc5c3f77ba6ffaced9ee75689db16..3233a176c61e4a21d8042a111089376e247d67b7 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractor.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractor.java @@ -10,6 +10,8 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import ch.unige.aou.model.rest.JournalTitleDTO; +import ch.unige.aou.service.rest.JournalTitleRemoteService; import org.json.JSONArray; import org.json.JSONObject; @@ -53,6 +55,7 @@ public abstract class MetadataExtractor { protected ResearchGroupService researchGroupService; protected ContributorService contributorService; protected LanguageService languageService; + protected JournalTitleRemoteService journalTitleRemoteService; private String[] metadataOutputDateFormat; private String[] frontendEnterDateFormat; @@ -61,7 +64,8 @@ public abstract class MetadataExtractor { protected MetadataExtractor(AouProperties aouProperties, PublicationTypeService publicationTypeService, PublicationSubtypeService publicationSubtypeService, PublicationSubSubtypeService publicationSubSubtypeService, StructureService structureService, - ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService) { + ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService, + JournalTitleRemoteService journalTitleRemoteService) { this.publicationTypeService = publicationTypeService; this.publicationSubtypeService = publicationSubtypeService; this.publicationSubSubtypeService = publicationSubSubtypeService; @@ -69,6 +73,7 @@ public abstract class MetadataExtractor { this.researchGroupService = researchGroupService; this.contributorService = contributorService; this.languageService = languageService; + this.journalTitleRemoteService = journalTitleRemoteService; this.metadataOutputDateFormat = aouProperties.getParameters().getMetadataOutputDateFormat(); this.frontendEnterDateFormat = aouProperties.getParameters().getFrontendEnterDateFormat(); @@ -284,6 +289,26 @@ public abstract class MetadataExtractor { this.formatDepositDocDatesToFrontendFormat(depositDocObj); } + public void replaceISSNByISSNL(Publication publication) { + Object depositDocObj = this.createDepositDocObjectFromXml(publication.getMetadata()); + + String issn = this.getISSN(depositDocObj); + if (!StringTool.isNullOrEmpty(issn)) { + //Find issn-l related with the issn using journalService + ch.unige.solidify.rest.Collection<JournalTitleDTO> journalTitles = this.journalTitleRemoteService.getJournalTitlesByISSN(issn); + if (journalTitles.get_data() != null && journalTitles.get_data().iterator().hasNext()) { + JournalTitleDTO journalTitleDTO = journalTitles.get_data().iterator().next(); + String issnl = journalTitleDTO.getIssnl(); + if (!issn.equals(issnl)) { + this.setISSN(depositDocObj, issnl); + } + } + String metadata = this.serializeDepositDocToXml(depositDocObj); + publication.setMetadata(metadata); + } +} + + /** * Set the publication properties that exists in metadata with the values in metadata * @@ -445,6 +470,10 @@ public abstract class MetadataExtractor { abstract String getISBN(Object depositDocObj); + abstract String getISSN(Object depositDocObj); + + abstract void setISSN(Object depositDocObj, String value); + abstract String getArxivId(Object depositDocObj); abstract String getURN(Object depositDocObj); diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV1.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV1.java index b199a537ba50b6c490ac69bbd2ec3740e2e93398..4b284e4f1e660c88cda8d38587a0f2c753b34218 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV1.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV1.java @@ -14,6 +14,8 @@ import javax.xml.bind.Marshaller; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; +import ch.unige.aou.service.rest.JournalTitleRemoteService; + import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; @@ -144,9 +146,10 @@ public class MetadataExtractorV1 extends MetadataExtractor { public MetadataExtractorV1(AouProperties aouProperties, PublicationTypeService publicationTypeService, PublicationSubtypeService publicationSubtypeService, PublicationSubSubtypeService publicationSubSubtypeService, StructureService structureService, - ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService) { + ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService, + JournalTitleRemoteService journalTitleRemoteService) { super(aouProperties, publicationTypeService, publicationSubtypeService, publicationSubSubtypeService, structureService, researchGroupService, - contributorService, languageService); + contributorService, languageService, journalTitleRemoteService); } @Override @@ -433,6 +436,23 @@ public class MetadataExtractorV1 extends MetadataExtractor { depositDoc.getTitle().setLang(value); } + @Override + public void setISSN(Object depositDocObj, String value) { + DepositDoc depositDoc = (DepositDoc) depositDocObj; + if (depositDoc.getContainer() == null){ + depositDoc.setContainer(new Container()); + } + if (depositDoc.getContainer().getTitle() == null) { + depositDoc.getContainer().setTitle(this.factory.createText()); + } + depositDoc.getContainer().getTitle().setContent(value); + } + + @Override + public String getISSN(Object depositDocObj) { + return this.getContainerISSN(depositDocObj); + } + public String getContainerISSN(Object depositDocObj) { DepositDoc depositDoc = (DepositDoc) depositDocObj; if (depositDoc.getContainer() != null && depositDoc.getContainer().getIdentifiers() != null) { diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV2.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV2.java index 78ce27ade6e4da9ab91423776670b4a2f330e875..1f3dd3f9b90247d5ee94591ed852d904162c9907 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV2.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/metadata/MetadataExtractorV2.java @@ -15,6 +15,7 @@ import javax.xml.bind.Marshaller; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; +import ch.unige.aou.service.rest.JournalTitleRemoteService; import org.springframework.stereotype.Service; import com.fasterxml.jackson.core.JsonProcessingException; @@ -141,9 +142,10 @@ public class MetadataExtractorV2 extends MetadataExtractor { public MetadataExtractorV2(AouProperties aouProperties, PublicationTypeService publicationTypeService, PublicationSubtypeService publicationSubtypeService, PublicationSubSubtypeService publicationSubSubtypeService, StructureService structureService, - ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService) { + ResearchGroupService researchGroupService, ContributorService contributorService, LanguageService languageService, + JournalTitleRemoteService journalTitleRemoteService) { super(aouProperties, publicationTypeService, publicationSubtypeService, publicationSubSubtypeService, structureService, researchGroupService, - contributorService, languageService); + contributorService, languageService, journalTitleRemoteService); } @Override @@ -184,6 +186,7 @@ public class MetadataExtractorV2 extends MetadataExtractor { public void replaceFormValuesByMetadataValues(Object depositDocObj) { super.replaceFormValuesByMetadataValues(depositDocObj); this.completeResearchGroups(depositDocObj); + } private void completeResearchGroups(Object depositDocObj) { @@ -449,6 +452,15 @@ public class MetadataExtractorV2 extends MetadataExtractor { depositDoc.getTitle().setLang(value); } + @Override + public void setISSN(Object depositDocObj, String value) { + DepositDoc depositDoc = (DepositDoc) depositDocObj; + if (depositDoc.getIdentifiers() == null){ + depositDoc.setIdentifiers(new DepositIdentifiers()); + } + depositDoc.getIdentifiers().setIssn(value); + } + @Override public String getISBN(Object depositDocObj) { DepositDoc depositDoc = (DepositDoc) depositDocObj; diff --git a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/rest/JournalTitleRemoteService.java b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/rest/JournalTitleRemoteService.java index 3e111ad2c830951d2a246ab269456d8a4f2fc0a6..041daeffaf94e4bda14046b502b793ce5a8a8465 100644 --- a/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/rest/JournalTitleRemoteService.java +++ b/AoU-ResourceServerCommon/src/main/java/ch/unige/aou/service/rest/JournalTitleRemoteService.java @@ -42,6 +42,9 @@ public class JournalTitleRemoteService { private static final String AUTHENTICATE = "authenticate"; private static final String NOTICE = "notice"; private static final String SEARCH = "search"; + private static final String PATH_SPATIAL = "spatial"; + private static final String PATH_ISSN = "resource/ISSN/"; + private static final String PATH_PUBLISHER = "publisher"; private String remoteServiceUrl; private String user; @@ -155,7 +158,7 @@ public class JournalTitleRemoteService { JsonNode graphNodes = neoJsonNode.get("@graph"); if (graphNodes instanceof ArrayNode) { for (JsonNode element : graphNodes) { - if (element.get("@id").asText().equals("resource/ISSN/" + issn)) { + if (element.get("@id").asText().equals(JournalTitleRemoteService.PATH_ISSN + issn)) { journalTitle .setMainTitle(this.cleanField( this.nodeHasTextValue(element.get("mainTitle")) ? element.get("mainTitle").asText().replace(".", "") : null)); @@ -177,24 +180,24 @@ public class JournalTitleRemoteService { } else { journalTitle.setUrl(null); } - if (element.get("spatial").isArray()) { - for (JsonNode coutryNode : element.get("spatial")) { + if (element.get(JournalTitleRemoteService.PATH_SPATIAL).isArray()) { + for (JsonNode coutryNode : element.get(JournalTitleRemoteService.PATH_SPATIAL)) { if (coutryNode.asText().contains("https://www.iso.org/obp/ui/#iso:code:3166:")) { - journalTitle.setCountryCode(coutryNode.asText().substring(coutryNode.asText().lastIndexOf(":") + 1)); + journalTitle.setCountryCode(coutryNode.asText().substring(coutryNode.asText().lastIndexOf(':') + 1)); } } } - if (this.nodeHasTextValue(element.get("publisher"))) { - publisher = element.get("publisher").asText(); + if (this.nodeHasTextValue(element.get(JournalTitleRemoteService.PATH_PUBLISHER))) { + publisher = element.get(JournalTitleRemoteService.PATH_PUBLISHER).asText(); } - for (JsonNode coutryNode : element.get("spatial")) { + for (JsonNode coutryNode : element.get(JournalTitleRemoteService.PATH_SPATIAL)) { if (coutryNode.asText().contains("https://www.iso.org/obp/ui/#iso:code:3166:")) { - journalTitle.setCountryCode(this.cleanField(coutryNode.asText().substring(coutryNode.asText().lastIndexOf(":") + 1))); + journalTitle.setCountryCode(this.cleanField(coutryNode.asText().substring(coutryNode.asText().lastIndexOf(':') + 1))); } } - } else if (element.get("@id").asText().equals("resource/ISSN/" + issn + "#KeyTitle")) { + } else if (element.get("@id").asText().equals(JournalTitleRemoteService.PATH_ISSN + issn + "#KeyTitle")) { journalTitle.setKeytitle(this.getTextValue(element, "value")); - } else if (element.get("@id").asText().equals("resource/ISSN/" + issn + "#ISSN-L")) { + } else if (element.get("@id").asText().equals(JournalTitleRemoteService.PATH_ISSN + issn + "#ISSN-L")) { journalTitle.setIssnl(this.getTextValue(element, "value")); } else if (element.get("@id").asText().equals(publisher)) { journalTitle.setPublisher(this.getTextValue(element, "name")); diff --git a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV1Test.java b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV1Test.java index e7b231b49051b30c95d876a1acae165de2316a4e..72966d35c184135b0c2f5248ae0f3420716e196d 100644 --- a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV1Test.java +++ b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV1Test.java @@ -18,7 +18,7 @@ class MetadataExtractorV1Test extends MetadataTest { public void setUp() { super.setUp(); this.metadataExtractor = new MetadataExtractorV1(this.aouProperties, this.publicationTypeService, this.publicationSubtypeService, - this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService); + this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService, this.journalTitleRemoteService); } @Test diff --git a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV2Test.java b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV2Test.java index ecf1c6730c0cd4eafc4c2398195136ae7af03d16..724385d0a37caea067dddfd4a5d969f8403634a8 100644 --- a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV2Test.java +++ b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataExtractorV2Test.java @@ -25,7 +25,8 @@ class MetadataExtractorV2Test extends MetadataTest { public void setUp() { super.setUp(); this.metadataExtractor = new MetadataExtractorV2(this.aouProperties, this.publicationTypeService, this.publicationSubtypeService, - this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService); + this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService, + this.journalTitleRemoteService); } @Test diff --git a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataTest.java b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataTest.java index 55c5a32ab1f7a786a6497a5701ab7d45d2a032ad..9d6c4ad953dad6129e05d60c7e9e62edd7aa822d 100644 --- a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataTest.java +++ b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataTest.java @@ -17,6 +17,7 @@ import java.util.Optional; import java.util.stream.Collectors; import javax.xml.bind.JAXBElement; +import ch.unige.aou.service.rest.JournalTitleRemoteService; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.springframework.context.annotation.Profile; @@ -120,6 +121,9 @@ public class MetadataTest { @Mock protected MessageService messageService; + @Mock + protected JournalTitleRemoteService journalTitleRemoteService; + public void setUp() { // Mock the findById method for PublicationTypeService diff --git a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataUpgradeTest.java b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataUpgradeTest.java index cbbac686c36078c1ae129b6d847915010d82ec27..c475f7512cc4879aaa3bec3f959f48a32db545c3 100644 --- a/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataUpgradeTest.java +++ b/AoU-ResourceServerCommon/src/test/java/ch/unige/aou/test/MetadataUpgradeTest.java @@ -23,7 +23,7 @@ class MetadataUpgradeTest extends MetadataTest { public void setUp() { super.setUp(); this.metadataService = new MetadataService(this.aouProperties, this.messageService, this.publicationTypeService, this.publicationSubtypeService, - this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService); + this.publicationSubSubtypeService, this.structureService, this.researchGroupService, this.contributorService, this.languageService, this.journalTitleRemoteService); } @Test