From 596473a1af476aa1756c8f9a726fbffa06a8dccd Mon Sep 17 00:00:00 2001 From: southeo Date: Wed, 11 Oct 2023 13:31:19 +0200 Subject: [PATCH 1/3] Align with handle vocab --- .../service/FdoRecordService.java | 15 ++++----------- .../service/FdoRecordServiceTest.java | 14 ++++++-------- .../digitalspecimenprocessor/utils/TestUtils.java | 11 +++++------ 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java b/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java index a0e0209..a1b3b13 100644 --- a/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java +++ b/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java @@ -15,7 +15,6 @@ import eu.dissco.core.digitalspecimenprocessor.domain.DigitalSpecimenWrapper; import eu.dissco.core.digitalspecimenprocessor.domain.FdoProfileAttributes; import eu.dissco.core.digitalspecimenprocessor.domain.FdoProfileConstants; -import eu.dissco.core.digitalspecimenprocessor.exception.PidCreationException; import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; @@ -33,8 +32,7 @@ private static boolean isEqualString(String currentValue, String newValue) { return currentValue != null && !currentValue.equals(newValue); } - public List buildPostHandleRequest(List digitalSpecimens) - throws PidCreationException { + public List buildPostHandleRequest(List digitalSpecimens) { List requestBody = new ArrayList<>(); for (var specimen : digitalSpecimens) { requestBody.add(buildSinglePostHandleRequest(specimen)); @@ -43,8 +41,7 @@ public List buildPostHandleRequest(List digita } public List buildRollbackUpdateRequest( - List digitalSpecimenRecords) - throws PidCreationException { + List digitalSpecimenRecords) { List requestBody = new ArrayList<>(); for (var specimen : digitalSpecimenRecords) { requestBody.add(buildSingleRollbackUpdateRequest(specimen)); @@ -98,7 +95,7 @@ private JsonNode genRequestAttributes(DigitalSpecimenWrapper specimen) { attributes.put(FdoProfileAttributes.NORMALISED_PRIMARY_SPECIMEN_OBJECT_ID.getAttribute(), specimen.attributes().getOdsNormalisedPhysicalSpecimenId()); attributes.put(FdoProfileAttributes.PRIMARY_SPECIMEN_OBJECT_ID_TYPE.getAttribute(), - specimen.attributes().getOdsPhysicalSpecimenIdType().value().toLowerCase()); + specimen.attributes().getOdsPhysicalSpecimenIdType().value()); attributes.put(SPECIMEN_HOST.getAttribute(), specimen.attributes().getDwcInstitutionId()); addOptionalAttributes(specimen, attributes); @@ -107,10 +104,6 @@ private JsonNode genRequestAttributes(DigitalSpecimenWrapper specimen) { } private void addOptionalAttributes(DigitalSpecimenWrapper specimen, ObjectNode attributes) { - if (specimen.attributes().getOdsSourceSystem() != null) { - attributes.put(FdoProfileAttributes.SOURCE_SYSTEM_ID.getAttribute(), - specimen.attributes().getOdsSourceSystem()); - } if (specimen.attributes().getDwcInstitutionName() != null) { attributes.put(SPECIMEN_HOST_NAME.getAttribute(), specimen.attributes().getDwcInstitutionName()); @@ -124,7 +117,7 @@ private void addOptionalAttributes(DigitalSpecimenWrapper specimen, ObjectNode a } if (specimen.attributes().getOdsLivingOrPreserved() != null) { attributes.put(LIVING_OR_PRESERVED.getAttribute(), - specimen.attributes().getOdsLivingOrPreserved().value().toLowerCase()); + specimen.attributes().getOdsLivingOrPreserved().value()); } if (specimen.attributes().getOdsMarkedAsType() != null) { attributes.put(MARKED_AS_TYPE.getAttribute(), specimen.attributes().getOdsMarkedAsType()); diff --git a/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java b/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java index 9e8ee63..edcba27 100644 --- a/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java +++ b/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java @@ -154,7 +154,7 @@ void testRollbackUpdate() throws Exception { "issuedForAgent": "https://ror.org/0566bfb96", "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "normalisedPrimarySpecimenObjectId":"https://geocollections.info/specimen/23602", - "primarySpecimenObjectIdType":"local", + "primarySpecimenObjectIdType":"Local", "specimenHost": "https://ror.org/0443cwa12" } } @@ -252,7 +252,7 @@ private JsonNode getExpectedJson(Boolean markedAsType) throws Exception { if (markedAsType != null && markedAsType) { return givenHandleRequestFullTypeStatus(); } - if (markedAsType != null && !markedAsType) { + if (markedAsType != null) { return MAPPER.readTree(""" { "data": { @@ -263,13 +263,12 @@ private JsonNode getExpectedJson(Boolean markedAsType) throws Exception { "issuedForAgent": "https://ror.org/0566bfb96", "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "normalisedPrimarySpecimenObjectId":"https://geocollections.info/specimen/23602", - "primarySpecimenObjectIdType": "global", + "primarySpecimenObjectIdType": "Global", "specimenHost": "https://ror.org/0443cwa12", - "sourceSystemId":"20.5000.1025/MN0-5XP-FFD", "specimenHostName": "National Museum of Natural History", "topicDiscipline": "Botany", "referentName": "Biota", - "livingOrPreserved": "preserved", + "livingOrPreserved": "Preserved", "markedAsType": false } } @@ -286,13 +285,12 @@ private JsonNode getExpectedJson(Boolean markedAsType) throws Exception { "issuedForAgent": "https://ror.org/0566bfb96", "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "normalisedPrimarySpecimenObjectId":"https://geocollections.info/specimen/23602", - "primarySpecimenObjectIdType": "global", + "primarySpecimenObjectIdType": "Global", "specimenHost": "https://ror.org/0443cwa12", - "sourceSystemId":"20.5000.1025/MN0-5XP-FFD", "specimenHostName": "National Museum of Natural History", "topicDiscipline": "Botany", "referentName": "Biota", - "livingOrPreserved": "preserved" + "livingOrPreserved": "Preserved" } } }"""); diff --git a/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java b/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java index c9f8e02..34fca0a 100644 --- a/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java +++ b/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java @@ -237,13 +237,12 @@ public static JsonNode givenHandleRequestFullTypeStatus() throws Exception { "issuedForAgent": "https://ror.org/0566bfb96", "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "normalisedPrimarySpecimenObjectId":"https://geocollections.info/specimen/23602", - "primarySpecimenObjectIdType": "global", + "primarySpecimenObjectIdType": "Global", "specimenHost": "https://ror.org/0443cwa12", - "sourceSystemId": "20.5000.1025/MN0-5XP-FFD", "specimenHostName": "National Museum of Natural History", "topicDiscipline": "Botany", "referentName": "Biota", - "livingOrPreserved": "preserved", + "livingOrPreserved": "Preserved", "markedAsType":true } } @@ -261,7 +260,7 @@ public static JsonNode givenHandleRequestMin() throws Exception { "issuedForAgent": "https://ror.org/0566bfb96", "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "normalisedPrimarySpecimenObjectId": "https://geocollections.info/specimen/23602", - "primarySpecimenObjectIdType":"local", + "primarySpecimenObjectIdType":"Local", "specimenHost": "https://ror.org/0443cwa12" } } @@ -284,10 +283,10 @@ public static JsonNode givenHandleRequest() throws Exception { "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", "specimenHost": "https://ror.org/0443cwa12", "specimenHostName": "National Museum of Natural History", - "primarySpecimenObjectIdType": "cetaf", + "primarySpecimenObjectIdType": "Global", "referentName": "Biota", "topicDiscipline": "Earth Systems", - "livingOrPreserved": "living", + "livingOrPreserved": "Living", "markedAsType": true } } From b7915ad3ac5524232a99676d5f4ef291818ce7de Mon Sep 17 00:00:00 2001 From: southeo Date: Tue, 19 Mar 2024 17:00:23 +0100 Subject: [PATCH 2/3] other specimen ids in fdo profile --- .../service/FdoRecordService.java | 9 ++++ .../service/FdoRecordServiceTest.java | 44 +++++++++++++++++++ .../utils/TestUtils.java | 6 +++ 3 files changed, 59 insertions(+) diff --git a/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java b/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java index 5eabce3..7f64b7e 100644 --- a/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java +++ b/src/main/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordService.java @@ -140,6 +140,15 @@ private void addOptionalAttributes(DigitalSpecimenWrapper specimen, ObjectNode a if (specimen.attributes().getOdsMarkedAsType() != null) { attributes.put(MARKED_AS_TYPE.getAttribute(), specimen.attributes().getOdsMarkedAsType()); } + if (specimen.attributes().getIdentifiers() != null && !specimen.attributes().getIdentifiers().isEmpty()){ + var idNodeArr = mapper.createArrayNode(); + for (var id: specimen.attributes().getIdentifiers()){ + idNodeArr.add(mapper.createObjectNode() + .put("identifierType", id.getIdentifierType()) + .put("identifierValue", id.getIdentifierValue())); + } + attributes.set("otherSpecimenIds", idNodeArr); + } } public boolean handleNeedsUpdate(DigitalSpecimenWrapper currentDigitalSpecimenWrapper, diff --git a/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java b/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java index f53ed03..43c568d 100644 --- a/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java +++ b/src/test/java/eu/dissco/core/digitalspecimenprocessor/service/FdoRecordServiceTest.java @@ -10,6 +10,7 @@ import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.TYPE; import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.generateSpecimenOriginalData; import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.givenAttributes; +import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.givenAttributesPlusIdentifier; import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.givenDigitalSpecimenEvent; import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.givenDigitalSpecimenWrapper; import static eu.dissco.core.digitalspecimenprocessor.utils.TestUtils.givenDigitalSpecimenRecord; @@ -202,6 +203,49 @@ void testGenRequestFull(boolean markedAsType) throws Exception { assertThat(response).isEqualTo(expected); } + @Test + void testGenRequestIdentifiers() throws Exception { + // Given + var markedAsType = false; + var specimen = new DigitalSpecimenWrapper(PHYSICAL_SPECIMEN_ID, TYPE, + givenAttributesPlusIdentifier(SPECIMEN_NAME, ORGANISATION_ID, markedAsType), + givenDigitalSpecimenAttributesFull(markedAsType)); + var expectedJson = MAPPER.readTree( + """ + { + "data": { + "type": "digitalSpecimen", + "attributes": { + "fdoProfile": "https://hdl.handle.net/21.T11148/d8de0819e144e4096645", + "digitalObjectType": "https://hdl.handle.net/21.T11148/894b1e6cad57e921764e", + "issuedForAgent": "https://ror.org/0566bfb96", + "primarySpecimenObjectId": "https://geocollections.info/specimen/23602", + "normalisedPrimarySpecimenObjectId":"https://geocollections.info/specimen/23602", + "primarySpecimenObjectIdType": "Global", + "specimenHost": "https://ror.org/0443cwa12", + "specimenHostName": "National Museum of Natural History", + "topicDiscipline": "Botany", + "referentName": "Biota", + "livingOrPreserved": "Preserved", + "markedAsType": false, + "otherSpecimenIds": [{ + "identifierType": "Specimen label", + "identifierValue": "20.5000.1025/V1Z-176-LL4" + }] + } + } + } + """ + ); + var expected = new ArrayList<>(List.of(expectedJson)); + + // When + var response = builder.buildPostHandleRequest(List.of(specimen)); + + // Then + assertThat(response).isEqualTo(expected); + } + @Test void testGenRequestFullTypeIsNull() throws Exception { // Given diff --git a/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java b/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java index a794ab0..f0fe302 100644 --- a/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java +++ b/src/test/java/eu/dissco/core/digitalspecimenprocessor/utils/TestUtils.java @@ -16,6 +16,7 @@ import eu.dissco.core.digitalspecimenprocessor.schema.DigitalSpecimen.OdsPhysicalSpecimenIdType; import eu.dissco.core.digitalspecimenprocessor.schema.DigitalSpecimen.OdsTopicDiscipline; import eu.dissco.core.digitalspecimenprocessor.schema.EntityRelationships; +import eu.dissco.core.digitalspecimenprocessor.schema.Identifiers; import java.time.Instant; import java.util.HashMap; import java.util.List; @@ -340,4 +341,9 @@ public static DigitalSpecimen givenAttributes( .withDctermsModified("2017-09-26T12:27:21.000+00:00"); } + public static DigitalSpecimen givenAttributesPlusIdentifier(String specimenName, String organisation, Boolean markedAsType){ + return givenAttributes(specimenName, organisation, markedAsType) + .withIdentifiers(List.of(new Identifiers("Specimen label", HANDLE, false, null, true))); + } + } From 2bdce5f8bd0f7bbc2986bdd47e51bd8ee3aa780f Mon Sep 17 00:00:00 2001 From: southeo Date: Thu, 21 Mar 2024 14:35:16 +0100 Subject: [PATCH 3/3] trivy --- .github/workflows/.trivyignore | 7 ++++++- pom.xml | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/.trivyignore b/.github/workflows/.trivyignore index 4fa570b..ced0006 100644 --- a/.github/workflows/.trivyignore +++ b/.github/workflows/.trivyignore @@ -1,4 +1,9 @@ # Date: Mar 5, 2024 # Notes: Issue with libexpat, parsing large tokens can trigger a denial of service # Needs to be fixed in Docker Image. -CVE-2023-52425 \ No newline at end of file +CVE-2023-52425 + +# Date: March 21, 2024 +# Issue: Vulnerability in spring-web +# Solution: Spring boot needs to update its version of spring +CVE-2024-22259 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 60bb43f..ecea079 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 5.2.0 1.19.5 2.3.0 + 6.2.3 dissco https://sonarcloud.io ../app-it/target/site/jacoco-aggregate/jacoco.xml