From 3d09bd1fc345183d31f4ced210eee816b3acac2f Mon Sep 17 00:00:00 2001 From: Andrei Bordak Date: Tue, 31 Dec 2024 15:18:50 +0400 Subject: [PATCH 1/3] MODLD-516: Update API to support IllustrativeContent of the Work --- .../instance/InstanceMapperUnit.java | 2 + .../instance/sub/IllustrationsMapperUnit.java | 48 +++++++++++++++++ .../resource/request/InstanceRequest.json | 8 +++ .../resource/response/InstanceResponse.json | 8 +++ .../resource/ResourceControllerITBase.java | 52 ++++++++++++++++--- .../linked/data/test/MonographTestUtil.java | 12 +++++ .../data/test/resource/ResourceJsonPath.java | 13 +++++ .../samples/instance_and_work_ref.json | 13 +++++ 8 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java index 31ca7c38..4d7d2b28 100644 --- a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java @@ -4,6 +4,7 @@ import static org.folio.ld.dictionary.PredicateDictionary.ACCESS_LOCATION; import static org.folio.ld.dictionary.PredicateDictionary.CARRIER; import static org.folio.ld.dictionary.PredicateDictionary.COPYRIGHT; +import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.INSTANTIATES; import static org.folio.ld.dictionary.PredicateDictionary.MAP; import static org.folio.ld.dictionary.PredicateDictionary.MEDIA; @@ -109,6 +110,7 @@ public Resource toEntity(Object dto, Resource parentEntity) { coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getCarrier(), CARRIER); coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getCopyright(), COPYRIGHT); coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getWorkReference(), INSTANTIATES); + coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getIllustrations(), ILLUSTRATIONS); instance.setFolioMetadata(new FolioMetadata(instance).setSource(LINKED_DATA)); instance.setId(hashService.hash(instance)); return instance; diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java new file mode 100644 index 00000000..d8be3fe5 --- /dev/null +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java @@ -0,0 +1,48 @@ +package org.folio.linked.data.mapper.dto.monograph.instance.sub; + +import static org.folio.ld.dictionary.ResourceTypeDictionary.CATEGORY; + +import org.folio.ld.dictionary.PredicateDictionary; +import org.folio.linked.data.domain.dto.Category; +import org.folio.linked.data.domain.dto.CategoryResponse; +import org.folio.linked.data.domain.dto.InstanceResponse; +import org.folio.linked.data.mapper.dto.common.CoreMapper; +import org.folio.linked.data.mapper.dto.common.MapperUnit; +import org.folio.linked.data.mapper.dto.monograph.common.CategoryMapperUnit; +import org.folio.linked.data.service.resource.hash.HashService; +import org.springframework.stereotype.Component; + +@Component +@MapperUnit(type = CATEGORY, predicate = PredicateDictionary.ILLUSTRATIONS, requestDto = Category.class) +public class IllustrationsMapperUnit extends CategoryMapperUnit { + + private static final String LABEL = "Illustrative Content"; + private static final String LINK = "http://id.loc.gov/vocabulary/millus"; + private static final String LINK_PREFIX = "http://id.loc.gov/vocabulary/millus/"; + + public IllustrationsMapperUnit(HashService hashService, CoreMapper coreMapper) { + super(hashService, coreMapper); + } + + @Override + protected void addToParent(CategoryResponse category, Object parentDto) { + if (parentDto instanceof InstanceResponse instance) { + instance.addIllustrationsItem(category); + } + } + + @Override + protected String getCategorySetLabel() { + return LABEL; + } + + @Override + protected String getCategorySetLink() { + return LINK; + } + + @Override + public String getLinkPrefix() { + return LINK_PREFIX; + } +} diff --git a/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json b/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json index befc9bae..cc970f29 100644 --- a/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json +++ b/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json @@ -165,6 +165,14 @@ }, "x-json-property": "http://bibfra.me/vocab/marc/dimensions" }, + "illustrations": { + "type": "array", + "items": { + "type": "object", + "$ref": "../common/Category.json" + }, + "x-json-property": "http://bibfra.me/vocab/marc/illustrations" + }, "projectProvisionDate": { "type": "array", "items": { diff --git a/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json b/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json index b66cf920..85468c06 100644 --- a/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json +++ b/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json @@ -167,6 +167,14 @@ }, "x-json-property": "http://bibfra.me/vocab/marc/dimensions" }, + "illustrations": { + "type": "array", + "items": { + "type": "object", + "$ref": "CategoryResponse.json" + }, + "x-json-property": "http://bibfra.me/vocab/marc/illustrations" + }, "projectProvisionDate": { "type": "array", "items": { diff --git a/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java b/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java index e059d72c..80b8eebe 100644 --- a/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java +++ b/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java @@ -20,6 +20,7 @@ import static org.folio.ld.dictionary.PredicateDictionary.GENRE; import static org.folio.ld.dictionary.PredicateDictionary.GEOGRAPHIC_COVERAGE; import static org.folio.ld.dictionary.PredicateDictionary.GOVERNMENT_PUBLICATION; +import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.INSTANTIATES; import static org.folio.ld.dictionary.PredicateDictionary.IS_DEFINED_BY; import static org.folio.ld.dictionary.PredicateDictionary.LANGUAGE; @@ -152,6 +153,9 @@ import static org.folio.linked.data.test.resource.ResourceJsonPath.toEditionStatement; import static org.folio.linked.data.test.resource.ResourceJsonPath.toExtent; import static org.folio.linked.data.test.resource.ResourceJsonPath.toId; +import static org.folio.linked.data.test.resource.ResourceJsonPath.toIllustrationsCode; +import static org.folio.linked.data.test.resource.ResourceJsonPath.toIllustrationsLink; +import static org.folio.linked.data.test.resource.ResourceJsonPath.toIllustrationsTerm; import static org.folio.linked.data.test.resource.ResourceJsonPath.toInstance; import static org.folio.linked.data.test.resource.ResourceJsonPath.toInstanceNotesTypes; import static org.folio.linked.data.test.resource.ResourceJsonPath.toInstanceNotesValues; @@ -614,8 +618,8 @@ void deleteResourceById_shouldDeleteRootInstanceAndRootEdges_reindexWork() throw var work = getSampleWork(null); var instance = resourceTestService.saveGraph(getSampleInstanceResource(null, work)); assertThat(resourceTestService.findById(instance.getId())).isPresent(); - assertThat(resourceTestService.countResources()).isEqualTo(57); - assertThat(resourceTestService.countEdges()).isEqualTo(59); + assertThat(resourceTestService.countResources()).isEqualTo(58); + assertThat(resourceTestService.countEdges()).isEqualTo(60); var requestBuilder = delete(RESOURCE_URL + "/" + instance.getId()) .contentType(APPLICATION_JSON) .headers(defaultHeaders(env)); @@ -626,7 +630,7 @@ void deleteResourceById_shouldDeleteRootInstanceAndRootEdges_reindexWork() throw // then resultActions.andExpect(status().isNoContent()); assertThat(resourceTestService.existsById(instance.getId())).isFalse(); - assertThat(resourceTestService.countResources()).isEqualTo(56); + assertThat(resourceTestService.countResources()).isEqualTo(57); assertThat(resourceTestService.findEdgeById(instance.getOutgoingEdges().iterator().next().getId())).isNotPresent(); assertThat(resourceTestService.countEdges()).isEqualTo(41); checkSearchIndexMessage(work.getId(), UPDATE); @@ -638,8 +642,8 @@ void deleteResourceById_shouldDeleteRootWorkAndRootEdges() throws Exception { // given var existed = resourceTestService.saveGraph(getSampleWork(getSampleInstanceResource(null, null))); assertThat(resourceTestService.findById(existed.getId())).isPresent(); - assertThat(resourceTestService.countResources()).isEqualTo(57); - assertThat(resourceTestService.countEdges()).isEqualTo(59); + assertThat(resourceTestService.countResources()).isEqualTo(58); + assertThat(resourceTestService.countEdges()).isEqualTo(60); var requestBuilder = delete(RESOURCE_URL + "/" + existed.getId()) .contentType(APPLICATION_JSON) .headers(defaultHeaders(env)); @@ -650,9 +654,9 @@ void deleteResourceById_shouldDeleteRootWorkAndRootEdges() throws Exception { // then resultActions.andExpect(status().isNoContent()); assertThat(resourceTestService.existsById(existed.getId())).isFalse(); - assertThat(resourceTestService.countResources()).isEqualTo(56); + assertThat(resourceTestService.countResources()).isEqualTo(57); assertThat(resourceTestService.findEdgeById(existed.getOutgoingEdges().iterator().next().getId())).isNotPresent(); - assertThat(resourceTestService.countEdges()).isEqualTo(30); + assertThat(resourceTestService.countEdges()).isEqualTo(31); checkSearchIndexMessage(existed.getId(), DELETE); } @@ -698,6 +702,9 @@ private void validateInstanceResponse(ResultActions resultActions, String instan .andExpect(jsonPath(toCarrierCode(instanceBase), equalTo("ha"))) .andExpect(jsonPath(toCarrierLink(instanceBase), equalTo("http://id.loc.gov/vocabulary/carriers/ha"))) .andExpect(jsonPath(toCarrierTerm(instanceBase), equalTo("carrier term"))) + .andExpect(jsonPath(toIllustrationsCode(instanceBase), equalTo("code"))) + .andExpect(jsonPath(toIllustrationsLink(instanceBase), equalTo("http://id.loc.gov/vocabulary/millus/code"))) + .andExpect(jsonPath(toIllustrationsTerm(instanceBase), equalTo("illustrations term"))) .andExpect(jsonPath(toPrimaryTitlePartName(instanceBase), equalTo(List.of("Primary: partName")))) .andExpect(jsonPath(toPrimaryTitlePartNumber(instanceBase), equalTo(List.of("Primary: partNumber")))) .andExpect(jsonPath(toPrimaryTitleMain(instanceBase), equalTo(List.of("Primary: mainTitle")))) @@ -902,12 +909,16 @@ private void validateInstance(Resource instance, boolean validateFullWork) { validateLiteral(instance, REPRODUCTION_NOTE.getValue(), "reproduction note"); validateLiteral(instance, TYPE_OF_REPORT.getValue(), "type of report"); validateLiteral(instance, WITH_NOTE.getValue(), "with note"); - assertThat(instance.getOutgoingEdges()).hasSize(18); + assertThat(instance.getOutgoingEdges()).hasSize(19); var edgeIterator = instance.getOutgoingEdges().iterator(); validateParallelTitle(edgeIterator.next(), instance); validateCategory(edgeIterator.next(), instance, CARRIER, "http://id.loc.gov/vocabulary/carriers/ha", "ha"); validateCategory(edgeIterator.next(), instance, MEDIA, "http://id.loc.gov/vocabulary/mediaTypes/s", "s"); + validateCategory(edgeIterator.next(), instance, ILLUSTRATIONS, "illustrations term", + Map.of(LINK.getValue(), "http://id.loc.gov/vocabulary/millus/code", CODE.getValue(), "code"), + "Illustrative Content" + ); validateLccn(edgeIterator.next(), instance); var edge = edgeIterator.next(); assertThat(edge.getId()).isNotNull(); @@ -1188,6 +1199,27 @@ private void validateAccessLocation(ResourceEdge edge, Resource source) { assertThat(locator.getOutgoingEdges()).isEmpty(); } + private void validateCategory(ResourceEdge edge, + Resource source, + PredicateDictionary pred, + String label, + Map doc, + String categorySetLabel) { + assertThat(edge.getId()).isNotNull(); + assertThat(edge.getSource()).isEqualTo(source); + assertThat(edge.getPredicate().getUri()).isEqualTo(pred.getUri()); + var category = edge.getTarget(); + assertThat(category.getLabel()).isEqualTo(label); + assertThat(category.getTypes().iterator().next().getUri()).isEqualTo(CATEGORY.getUri()); + assertThat(category.getId()).isEqualTo(hashService.hash(category)); + doc.forEach((key, value) -> validateLiteral(category, key, value)); + if (category.getOutgoingEdges().isEmpty()) { + return; + } + assertCategorySetIsDefinedBy(category); + assertEquals(category.getOutgoingEdges().iterator().next().getTarget().getLabel(), categorySetLabel); + } + private void validateCategory(ResourceEdge edge, Resource source, PredicateDictionary pred, String expectedLink, String expectedCode) { var prefix = pred.getUri().substring(pred.getUri().lastIndexOf("/") + 1); @@ -1206,6 +1238,10 @@ private void validateCategory(ResourceEdge edge, Resource source, PredicateDicti if (category.getOutgoingEdges().isEmpty()) { return; } + assertCategorySetIsDefinedBy(category); + } + + private void assertCategorySetIsDefinedBy(Resource category) { assertThat(category.getOutgoingEdges()) .extracting(ResourceEdge::getPredicate) .extracting(PredicateEntity::getUri) diff --git a/src/test/java/org/folio/linked/data/test/MonographTestUtil.java b/src/test/java/org/folio/linked/data/test/MonographTestUtil.java index 80180a76..14e3aa56 100644 --- a/src/test/java/org/folio/linked/data/test/MonographTestUtil.java +++ b/src/test/java/org/folio/linked/data/test/MonographTestUtil.java @@ -18,6 +18,7 @@ import static org.folio.ld.dictionary.PredicateDictionary.GENRE; import static org.folio.ld.dictionary.PredicateDictionary.GOVERNMENT_PUBLICATION; import static org.folio.ld.dictionary.PredicateDictionary.GRANTING_INSTITUTION; +import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.INSTANTIATES; import static org.folio.ld.dictionary.PredicateDictionary.IS_DEFINED_BY; import static org.folio.ld.dictionary.PredicateDictionary.LANGUAGE; @@ -230,6 +231,16 @@ public static Resource getSampleInstanceResource(Long id, Resource linkedWork) { emptyMap() ).setLabel("carrier term"); + var illustrations = createResource( + Map.of( + CODE, List.of("code"), + TERM, List.of("illustrations term"), + LINK, List.of("http://id.loc.gov/vocabulary/millus/code") + ), + Set.of(CATEGORY), + emptyMap() + ).setLabel("illustrations term"); + var copyrightEvent = createResource( Map.of( DATE, List.of("copyright date value") @@ -249,6 +260,7 @@ public static Resource getSampleInstanceResource(Long id, Resource linkedWork) { pred2OutgoingResources.put(MAP, List.of(lccn, isbn, ean, localId, otherId)); pred2OutgoingResources.put(MEDIA, List.of(media)); pred2OutgoingResources.put(CARRIER, List.of(carrier)); + pred2OutgoingResources.put(ILLUSTRATIONS, List.of(illustrations)); pred2OutgoingResources.put(COPYRIGHT, List.of(copyrightEvent)); var instance = createResource( diff --git a/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java b/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java index 29935e57..ecc2e15c 100644 --- a/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java +++ b/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java @@ -9,6 +9,7 @@ import static org.folio.ld.dictionary.PredicateDictionary.COPYRIGHT; import static org.folio.ld.dictionary.PredicateDictionary.DISSERTATION; import static org.folio.ld.dictionary.PredicateDictionary.GOVERNMENT_PUBLICATION; +import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.LANGUAGE; import static org.folio.ld.dictionary.PredicateDictionary.MAP; import static org.folio.ld.dictionary.PredicateDictionary.MEDIA; @@ -351,6 +352,18 @@ public static String toCarrierTerm(String instanceBase) { return join(".", instanceBase, arrayPath(CARRIER.getUri()), arrayPath(TERM.getValue())); } + public static String toIllustrationsCode(String instanceBase) { + return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(CODE.getValue())); + } + + public static String toIllustrationsLink(String instanceBase) { + return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(LINK.getValue())); + } + + public static String toIllustrationsTerm(String instanceBase) { + return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(TERM.getValue())); + } + public static String toCopyrightDate() { return join(".", toInstance(), arrayPath(COPYRIGHT.getUri()), arrayPath(DATE.getValue())); } diff --git a/src/test/resources/samples/instance_and_work_ref.json b/src/test/resources/samples/instance_and_work_ref.json index 407ba39c..1ab4ea77 100644 --- a/src/test/resources/samples/instance_and_work_ref.json +++ b/src/test/resources/samples/instance_and_work_ref.json @@ -252,6 +252,19 @@ ] } ], + "http://bibfra.me/vocab/marc/illustrations": [ + { + "http://bibfra.me/vocab/lite/link": [ + "http://id.loc.gov/vocabulary/millus/code" + ], + "http://bibfra.me/vocab/marc/term": [ + "illustrations term" + ], + "http://bibfra.me/vocab/marc/code": [ + "code" + ] + } + ], "http://bibfra.me/vocab/marc/accessLocation": [ { "http://bibfra.me/vocab/lite/link": [ From 89e28ebf546b53056b8ecbb476461ea77ba5a583 Mon Sep 17 00:00:00 2001 From: Andrei Bordak Date: Fri, 3 Jan 2025 12:13:02 +0400 Subject: [PATCH 2/3] MODLD-516: Review fixes --- .../instance/InstanceMapperUnit.java | 2 -- .../instance/sub/IllustrationsMapperUnit.java | 6 ++--- .../dto/monograph/work/WorkMapperUnit.java | 3 +++ .../resource/request/InstanceRequest.json | 8 ------- .../schema/resource/request/WorkRequest.json | 8 +++++++ .../resource/response/InstanceResponse.json | 8 ------- .../resource/response/WorkResponse.json | 8 +++++++ .../resource/ResourceControllerITBase.java | 22 +++++++++---------- .../linked/data/test/MonographTestUtil.java | 22 +++++++++---------- .../data/test/resource/ResourceJsonPath.java | 12 +++++----- .../samples/instance_and_work_ref.json | 13 ----------- .../samples/work_and_instance_ref.json | 13 +++++++++++ 12 files changed, 63 insertions(+), 62 deletions(-) diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java index 4d7d2b28..31ca7c38 100644 --- a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/InstanceMapperUnit.java @@ -4,7 +4,6 @@ import static org.folio.ld.dictionary.PredicateDictionary.ACCESS_LOCATION; import static org.folio.ld.dictionary.PredicateDictionary.CARRIER; import static org.folio.ld.dictionary.PredicateDictionary.COPYRIGHT; -import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.INSTANTIATES; import static org.folio.ld.dictionary.PredicateDictionary.MAP; import static org.folio.ld.dictionary.PredicateDictionary.MEDIA; @@ -110,7 +109,6 @@ public Resource toEntity(Object dto, Resource parentEntity) { coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getCarrier(), CARRIER); coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getCopyright(), COPYRIGHT); coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getWorkReference(), INSTANTIATES); - coreMapper.addOutgoingEdges(instance, InstanceRequest.class, instanceDto.getIllustrations(), ILLUSTRATIONS); instance.setFolioMetadata(new FolioMetadata(instance).setSource(LINKED_DATA)); instance.setId(hashService.hash(instance)); return instance; diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java index d8be3fe5..0b247a90 100644 --- a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java @@ -5,7 +5,7 @@ import org.folio.ld.dictionary.PredicateDictionary; import org.folio.linked.data.domain.dto.Category; import org.folio.linked.data.domain.dto.CategoryResponse; -import org.folio.linked.data.domain.dto.InstanceResponse; +import org.folio.linked.data.domain.dto.WorkResponse; import org.folio.linked.data.mapper.dto.common.CoreMapper; import org.folio.linked.data.mapper.dto.common.MapperUnit; import org.folio.linked.data.mapper.dto.monograph.common.CategoryMapperUnit; @@ -26,8 +26,8 @@ public IllustrationsMapperUnit(HashService hashService, CoreMapper coreMapper) { @Override protected void addToParent(CategoryResponse category, Object parentDto) { - if (parentDto instanceof InstanceResponse instance) { - instance.addIllustrationsItem(category); + if (parentDto instanceof WorkResponse work) { + work.addIllustrationsItem(category); } } diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/WorkMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/WorkMapperUnit.java index e3850dc4..10b21ea8 100644 --- a/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/WorkMapperUnit.java +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/WorkMapperUnit.java @@ -9,6 +9,7 @@ import static org.folio.ld.dictionary.PredicateDictionary.GENRE; import static org.folio.ld.dictionary.PredicateDictionary.GEOGRAPHIC_COVERAGE; import static org.folio.ld.dictionary.PredicateDictionary.GOVERNMENT_PUBLICATION; +import static org.folio.ld.dictionary.PredicateDictionary.ILLUSTRATIONS; import static org.folio.ld.dictionary.PredicateDictionary.INSTANTIATES; import static org.folio.ld.dictionary.PredicateDictionary.LANGUAGE; import static org.folio.ld.dictionary.PredicateDictionary.ORIGIN_PLACE; @@ -88,6 +89,8 @@ public Resource toEntity(Object dto, Resource parentEntity) { coreMapper.addOutgoingEdges(work, WorkRequest.class, workDto.getTargetAudience(), TARGET_AUDIENCE); coreMapper.addOutgoingEdges(work, WorkRequest.class, workDto.getLanguage(), LANGUAGE); coreMapper.addIncomingEdges(work, WorkRequest.class, workDto.getInstanceReference(), INSTANTIATES); + coreMapper.addOutgoingEdges(work, WorkRequest.class, workDto.getIllustrations(), ILLUSTRATIONS); + work.setId(hashService.hash(work)); return work; } diff --git a/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json b/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json index cc970f29..befc9bae 100644 --- a/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json +++ b/src/main/resources/swagger.api/schema/resource/request/InstanceRequest.json @@ -165,14 +165,6 @@ }, "x-json-property": "http://bibfra.me/vocab/marc/dimensions" }, - "illustrations": { - "type": "array", - "items": { - "type": "object", - "$ref": "../common/Category.json" - }, - "x-json-property": "http://bibfra.me/vocab/marc/illustrations" - }, "projectProvisionDate": { "type": "array", "items": { diff --git a/src/main/resources/swagger.api/schema/resource/request/WorkRequest.json b/src/main/resources/swagger.api/schema/resource/request/WorkRequest.json index 09abfb15..a130537d 100644 --- a/src/main/resources/swagger.api/schema/resource/request/WorkRequest.json +++ b/src/main/resources/swagger.api/schema/resource/request/WorkRequest.json @@ -142,6 +142,14 @@ "$ref": "../common/Dissertation.json" }, "x-json-property": "http://bibfra.me/vocab/scholar/dissertation" + }, + "illustrations": { + "type": "array", + "items": { + "type": "object", + "$ref": "../common/Category.json" + }, + "x-json-property": "http://bibfra.me/vocab/marc/illustrations" } } } diff --git a/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json b/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json index 85468c06..b66cf920 100644 --- a/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json +++ b/src/main/resources/swagger.api/schema/resource/response/InstanceResponse.json @@ -167,14 +167,6 @@ }, "x-json-property": "http://bibfra.me/vocab/marc/dimensions" }, - "illustrations": { - "type": "array", - "items": { - "type": "object", - "$ref": "CategoryResponse.json" - }, - "x-json-property": "http://bibfra.me/vocab/marc/illustrations" - }, "projectProvisionDate": { "type": "array", "items": { diff --git a/src/main/resources/swagger.api/schema/resource/response/WorkResponse.json b/src/main/resources/swagger.api/schema/resource/response/WorkResponse.json index dcb71034..77d7d308 100644 --- a/src/main/resources/swagger.api/schema/resource/response/WorkResponse.json +++ b/src/main/resources/swagger.api/schema/resource/response/WorkResponse.json @@ -145,6 +145,14 @@ "$ref": "DissertationResponse.json" }, "x-json-property": "http://bibfra.me/vocab/scholar/dissertation" + }, + "illustrations": { + "type": "array", + "items": { + "type": "object", + "$ref": "CategoryResponse.json" + }, + "x-json-property": "http://bibfra.me/vocab/marc/illustrations" } } } diff --git a/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java b/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java index 80b8eebe..b513b927 100644 --- a/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java +++ b/src/test/java/org/folio/linked/data/e2e/resource/ResourceControllerITBase.java @@ -632,7 +632,7 @@ void deleteResourceById_shouldDeleteRootInstanceAndRootEdges_reindexWork() throw assertThat(resourceTestService.existsById(instance.getId())).isFalse(); assertThat(resourceTestService.countResources()).isEqualTo(57); assertThat(resourceTestService.findEdgeById(instance.getOutgoingEdges().iterator().next().getId())).isNotPresent(); - assertThat(resourceTestService.countEdges()).isEqualTo(41); + assertThat(resourceTestService.countEdges()).isEqualTo(42); checkSearchIndexMessage(work.getId(), UPDATE); checkIndexDate(work.getId().toString()); } @@ -656,7 +656,7 @@ void deleteResourceById_shouldDeleteRootWorkAndRootEdges() throws Exception { assertThat(resourceTestService.existsById(existed.getId())).isFalse(); assertThat(resourceTestService.countResources()).isEqualTo(57); assertThat(resourceTestService.findEdgeById(existed.getOutgoingEdges().iterator().next().getId())).isNotPresent(); - assertThat(resourceTestService.countEdges()).isEqualTo(31); + assertThat(resourceTestService.countEdges()).isEqualTo(30); checkSearchIndexMessage(existed.getId(), DELETE); } @@ -702,9 +702,6 @@ private void validateInstanceResponse(ResultActions resultActions, String instan .andExpect(jsonPath(toCarrierCode(instanceBase), equalTo("ha"))) .andExpect(jsonPath(toCarrierLink(instanceBase), equalTo("http://id.loc.gov/vocabulary/carriers/ha"))) .andExpect(jsonPath(toCarrierTerm(instanceBase), equalTo("carrier term"))) - .andExpect(jsonPath(toIllustrationsCode(instanceBase), equalTo("code"))) - .andExpect(jsonPath(toIllustrationsLink(instanceBase), equalTo("http://id.loc.gov/vocabulary/millus/code"))) - .andExpect(jsonPath(toIllustrationsTerm(instanceBase), equalTo("illustrations term"))) .andExpect(jsonPath(toPrimaryTitlePartName(instanceBase), equalTo(List.of("Primary: partName")))) .andExpect(jsonPath(toPrimaryTitlePartNumber(instanceBase), equalTo(List.of("Primary: partNumber")))) .andExpect(jsonPath(toPrimaryTitleMain(instanceBase), equalTo(List.of("Primary: mainTitle")))) @@ -870,7 +867,10 @@ private void validateWorkResponse(ResultActions resultActions, String workBase) .andExpect(jsonPath(toWorkGovPublicationLink(workBase), equalTo("http://id.loc.gov/vocabulary/mgovtpubtype/a"))) .andExpect(jsonPath(toWorkTargetAudienceCode(workBase), equalTo("b"))) .andExpect(jsonPath(toWorkTargetAudienceTerm(workBase), equalTo("Primary"))) - .andExpect(jsonPath(toWorkTargetAudienceLink(workBase), equalTo("http://id.loc.gov/vocabulary/maudience/pri"))); + .andExpect(jsonPath(toWorkTargetAudienceLink(workBase), equalTo("http://id.loc.gov/vocabulary/maudience/pri"))) + .andExpect(jsonPath(toIllustrationsCode(workBase), equalTo("code"))) + .andExpect(jsonPath(toIllustrationsLink(workBase), equalTo("http://id.loc.gov/vocabulary/millus/code"))) + .andExpect(jsonPath(toIllustrationsTerm(workBase), equalTo("illustrations term"))); if (workBase.equals(toWork())) { resultActions.andExpect(jsonPath(toInstanceReference(workBase), notNullValue())); validateInstanceResponse(resultActions, toInstanceReference(workBase)); @@ -909,16 +909,12 @@ private void validateInstance(Resource instance, boolean validateFullWork) { validateLiteral(instance, REPRODUCTION_NOTE.getValue(), "reproduction note"); validateLiteral(instance, TYPE_OF_REPORT.getValue(), "type of report"); validateLiteral(instance, WITH_NOTE.getValue(), "with note"); - assertThat(instance.getOutgoingEdges()).hasSize(19); + assertThat(instance.getOutgoingEdges()).hasSize(18); var edgeIterator = instance.getOutgoingEdges().iterator(); validateParallelTitle(edgeIterator.next(), instance); validateCategory(edgeIterator.next(), instance, CARRIER, "http://id.loc.gov/vocabulary/carriers/ha", "ha"); validateCategory(edgeIterator.next(), instance, MEDIA, "http://id.loc.gov/vocabulary/mediaTypes/s", "s"); - validateCategory(edgeIterator.next(), instance, ILLUSTRATIONS, "illustrations term", - Map.of(LINK.getValue(), "http://id.loc.gov/vocabulary/millus/code", CODE.getValue(), "code"), - "Illustrative Content" - ); validateLccn(edgeIterator.next(), instance); var edge = edgeIterator.next(); assertThat(edge.getId()).isNotNull(); @@ -1269,6 +1265,10 @@ private void validateWork(Resource work, boolean validateFullInstance) { validateParallelTitle(outgoingEdgeIterator.next(), work); validateWorkContentType(outgoingEdgeIterator.next(), work); validateWorkTargetAudience(outgoingEdgeIterator.next(), work); + validateCategory(outgoingEdgeIterator.next(), work, ILLUSTRATIONS, "illustrations term", + Map.of(LINK.getValue(), "http://id.loc.gov/vocabulary/millus/code", CODE.getValue(), "code"), + "Illustrative Content" + ); validateWorkGovernmentPublication(outgoingEdgeIterator.next(), work); validateLanguage(outgoingEdgeIterator.next(), work); validateDissertation(outgoingEdgeIterator.next(), work); diff --git a/src/test/java/org/folio/linked/data/test/MonographTestUtil.java b/src/test/java/org/folio/linked/data/test/MonographTestUtil.java index 14e3aa56..7fd54623 100644 --- a/src/test/java/org/folio/linked/data/test/MonographTestUtil.java +++ b/src/test/java/org/folio/linked/data/test/MonographTestUtil.java @@ -231,16 +231,6 @@ public static Resource getSampleInstanceResource(Long id, Resource linkedWork) { emptyMap() ).setLabel("carrier term"); - var illustrations = createResource( - Map.of( - CODE, List.of("code"), - TERM, List.of("illustrations term"), - LINK, List.of("http://id.loc.gov/vocabulary/millus/code") - ), - Set.of(CATEGORY), - emptyMap() - ).setLabel("illustrations term"); - var copyrightEvent = createResource( Map.of( DATE, List.of("copyright date value") @@ -260,7 +250,6 @@ public static Resource getSampleInstanceResource(Long id, Resource linkedWork) { pred2OutgoingResources.put(MAP, List.of(lccn, isbn, ean, localId, otherId)); pred2OutgoingResources.put(MEDIA, List.of(media)); pred2OutgoingResources.put(CARRIER, List.of(carrier)); - pred2OutgoingResources.put(ILLUSTRATIONS, List.of(illustrations)); pred2OutgoingResources.put(COPYRIGHT, List.of(copyrightEvent)); var instance = createResource( @@ -529,6 +518,16 @@ public static Resource getSampleWork(Resource linkedInstance) { emptyMap() ).setLabel("eng"); + var illustrations = createResource( + Map.of( + CODE, List.of("code"), + TERM, List.of("illustrations term"), + LINK, List.of("http://id.loc.gov/vocabulary/millus/code") + ), + Set.of(CATEGORY), + emptyMap() + ).setLabel("illustrations term"); + var pred2OutgoingResources = new LinkedHashMap>(); pred2OutgoingResources.put(TITLE, List.of(primaryTitle, createParallelTitle(), createVariantTitle())); pred2OutgoingResources.put(CLASSIFICATION, List.of(createLcClassification(), createDeweyClassification())); @@ -547,6 +546,7 @@ public static Resource getSampleWork(Resource linkedInstance) { pred2OutgoingResources.put(DISSERTATION, List.of(createDissertation())); pred2OutgoingResources.put(TARGET_AUDIENCE, List.of(createTargetAudience())); pred2OutgoingResources.put(LANGUAGE, List.of(language)); + pred2OutgoingResources.put(ILLUSTRATIONS, List.of(illustrations)); var work = createResource( Map.ofEntries( diff --git a/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java b/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java index ecc2e15c..ca33c743 100644 --- a/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java +++ b/src/test/java/org/folio/linked/data/test/resource/ResourceJsonPath.java @@ -352,16 +352,16 @@ public static String toCarrierTerm(String instanceBase) { return join(".", instanceBase, arrayPath(CARRIER.getUri()), arrayPath(TERM.getValue())); } - public static String toIllustrationsCode(String instanceBase) { - return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(CODE.getValue())); + public static String toIllustrationsCode(String workBase) { + return join(".", workBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(CODE.getValue())); } - public static String toIllustrationsLink(String instanceBase) { - return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(LINK.getValue())); + public static String toIllustrationsLink(String workBase) { + return join(".", workBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(LINK.getValue())); } - public static String toIllustrationsTerm(String instanceBase) { - return join(".", instanceBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(TERM.getValue())); + public static String toIllustrationsTerm(String workBase) { + return join(".", workBase, arrayPath(ILLUSTRATIONS.getUri()), arrayPath(TERM.getValue())); } public static String toCopyrightDate() { diff --git a/src/test/resources/samples/instance_and_work_ref.json b/src/test/resources/samples/instance_and_work_ref.json index 1ab4ea77..407ba39c 100644 --- a/src/test/resources/samples/instance_and_work_ref.json +++ b/src/test/resources/samples/instance_and_work_ref.json @@ -252,19 +252,6 @@ ] } ], - "http://bibfra.me/vocab/marc/illustrations": [ - { - "http://bibfra.me/vocab/lite/link": [ - "http://id.loc.gov/vocabulary/millus/code" - ], - "http://bibfra.me/vocab/marc/term": [ - "illustrations term" - ], - "http://bibfra.me/vocab/marc/code": [ - "code" - ] - } - ], "http://bibfra.me/vocab/marc/accessLocation": [ { "http://bibfra.me/vocab/lite/link": [ diff --git a/src/test/resources/samples/work_and_instance_ref.json b/src/test/resources/samples/work_and_instance_ref.json index 457bf3ff..22f7c302 100644 --- a/src/test/resources/samples/work_and_instance_ref.json +++ b/src/test/resources/samples/work_and_instance_ref.json @@ -303,6 +303,19 @@ ] } ], + "http://bibfra.me/vocab/marc/illustrations": [ + { + "http://bibfra.me/vocab/lite/link": [ + "http://id.loc.gov/vocabulary/millus/code" + ], + "http://bibfra.me/vocab/marc/term": [ + "illustrations term" + ], + "http://bibfra.me/vocab/marc/code": [ + "code" + ] + } + ], "http://bibfra.me/vocab/scholar/dissertation": [ { "http://bibfra.me/vocab/lite/label": [ From 4394b3ce631fe5a4b6527ff0962a0097a5eea03a Mon Sep 17 00:00:00 2001 From: Andrei Bordak Date: Mon, 6 Jan 2025 10:08:43 +0400 Subject: [PATCH 3/3] MODLD-516: Change mapper package --- .../{instance => work}/sub/IllustrationsMapperUnit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/org/folio/linked/data/mapper/dto/monograph/{instance => work}/sub/IllustrationsMapperUnit.java (95%) diff --git a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java b/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/sub/IllustrationsMapperUnit.java similarity index 95% rename from src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java rename to src/main/java/org/folio/linked/data/mapper/dto/monograph/work/sub/IllustrationsMapperUnit.java index 0b247a90..d71ba039 100644 --- a/src/main/java/org/folio/linked/data/mapper/dto/monograph/instance/sub/IllustrationsMapperUnit.java +++ b/src/main/java/org/folio/linked/data/mapper/dto/monograph/work/sub/IllustrationsMapperUnit.java @@ -1,4 +1,4 @@ -package org.folio.linked.data.mapper.dto.monograph.instance.sub; +package org.folio.linked.data.mapper.dto.monograph.work.sub; import static org.folio.ld.dictionary.ResourceTypeDictionary.CATEGORY;