diff --git a/NEWS.md b/NEWS.md index bf365f805..ebb154b4a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -21,6 +21,7 @@ * Disallow updating ownership of boundwith item [MODINV-1052](https://folio-org.atlassian.net/browse/MODINV-1052) * InstanceIngress update events consumption [MODINV-1008](https://folio-org.atlassian.net/browse/MODINV-1008) * Apply new date type fields to instance schema [MODINV-1067](https://folio-org.atlassian.net/browse/MODINV-1067) +* Extend Authority with Additional fields [MODINV-1071](https://folio-org.atlassian.net/browse/MODINV-1071) ## 20.2.0 2023-03-20 * Inventory cannot process Holdings with virtual fields ([MODINV-941](https://issues.folio.org/browse/MODINV-941)) diff --git a/README.MD b/README.MD index 71fa0e31b..ca9d74c41 100644 --- a/README.MD +++ b/README.MD @@ -129,6 +129,18 @@ After setup, it is good to check logs in all related modules for errors. * DI_SRS_MARC_BIB_RECORD_MODIFIED_PARTITIONS Default value for all partitions is 1 +## Properties + +`AUTHORITY_EXTENDED` environment variable enables extended mapping for Authority to support advanced references classification in 5xx fields: +* broader terms (`$wg` tag) +* narrower terms (`$wh` tag) +* earlier headings (`$wa` tag) +* later headings (`$wb` tag) + +Default value for `AUTHORITY_EXTENDED` is `false`. +The mapping itself is implemented in [data-import-processing-core](https://github.com/folio-org/data-import-processing-core). + + # Making Requests These modules provide HTTP based APIs rather than any UI themselves. diff --git a/src/main/java/org/folio/inventory/dataimport/handlers/actions/AbstractAuthorityEventHandler.java b/src/main/java/org/folio/inventory/dataimport/handlers/actions/AbstractAuthorityEventHandler.java index 12be75fd7..2f052bf36 100644 --- a/src/main/java/org/folio/inventory/dataimport/handlers/actions/AbstractAuthorityEventHandler.java +++ b/src/main/java/org/folio/inventory/dataimport/handlers/actions/AbstractAuthorityEventHandler.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.Logger; import org.folio.ActionProfile; +import org.folio.ActionProfile.FolioRecord; import org.folio.Authority; import org.folio.DataImportEventPayload; import org.folio.MappingMetadataDto; @@ -54,10 +55,13 @@ public abstract class AbstractAuthorityEventHandler implements EventHandler { private static final String RECORD_ID_HEADER = "recordId"; private static final String CHUNK_ID_HEADER = "chunkId"; + public static final String AUTHORITY_EXTENDED = "AUTHORITY_EXTENDED"; private final Storage storage; private final MappingMetadataCache mappingMetadataCache; + private static boolean isAuthorityExtended = isAuthorityExtendedMode(); + protected AbstractAuthorityEventHandler(Storage storage, MappingMetadataCache mappingMetadataCache) { this.storage = storage; this.mappingMetadataCache = mappingMetadataCache; @@ -161,7 +165,9 @@ private Future mapAuthority(DataImportEventPayload payload, MappingMe var mappingParameters = Json.decodeValue(mappingMetadata.getMappingParams(), MappingParameters.class); var parsedRecord = new JsonObject((String) new JsonObject(payload.getContext().get(sourceRecordType().value())) .mapTo(Record.class).getParsedRecord().getContent()); - RecordMapper recordMapper = RecordMapperBuilder.buildMapper(sourceRecordType().value()); + RecordMapper recordMapper = isAuthorityExtended + ? RecordMapperBuilder.buildMapper(FolioRecord.MARC_AUTHORITY_EXTENDED.value()) + : RecordMapperBuilder.buildMapper(sourceRecordType().value()); var authority = recordMapper.mapRecord(parsedRecord, mappingParameters, mappingRules); authority.setSource(Authority.Source.MARC); return Future.succeededFuture(authority); @@ -215,4 +221,18 @@ private String constructMetaInfoMsg(DataImportEventPayload payload) { getChunkIdHeader(payload) ); } + + private static boolean isAuthorityExtendedMode() { + return Boolean.parseBoolean( + System.getenv().getOrDefault(AUTHORITY_EXTENDED, "false")); + } + + /** + * For test usage only. + * + * @param newIsAuthoritiesExtended New value for the env to set. + */ + public static void setAuthorityExtendedMode(boolean newIsAuthoritiesExtended) { + isAuthorityExtended = newIsAuthoritiesExtended; + } } diff --git a/src/test/java/org/folio/inventory/dataimport/handlers/actions/UpdateAuthorityEventHandlerTest.java b/src/test/java/org/folio/inventory/dataimport/handlers/actions/UpdateAuthorityEventHandlerTest.java index 5cea2d3c4..b4961c753 100644 --- a/src/test/java/org/folio/inventory/dataimport/handlers/actions/UpdateAuthorityEventHandlerTest.java +++ b/src/test/java/org/folio/inventory/dataimport/handlers/actions/UpdateAuthorityEventHandlerTest.java @@ -9,6 +9,8 @@ import io.vertx.core.Vertx; import io.vertx.core.json.Json; import io.vertx.core.json.JsonObject; +import java.util.Arrays; +import java.util.Collection; import org.folio.ActionProfile; import org.folio.Authority; import org.folio.DataImportEventPayload; @@ -28,9 +30,12 @@ import org.folio.rest.jaxrs.model.ParsedRecord; import org.folio.rest.jaxrs.model.ProfileSnapshotWrapper; import org.folio.rest.jaxrs.model.Record; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -70,11 +75,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@RunWith(Parameterized.class) public class UpdateAuthorityEventHandlerTest { private static final String MAPPING_RULES_PATH = "src/test/resources/handlers/marc-authority-rules.json"; private static final String PARSED_AUTHORITY_RECORD = "src/test/resources/marc/authority/parsed-authority-record.json"; private static final String MAPPING_METADATA_URL = "/mapping-metadata"; + private final boolean isAuthorityExtended; private final Vertx vertx = Vertx.vertx(); @Rule @@ -112,6 +119,15 @@ public class UpdateAuthorityEventHandlerTest { private UpdateAuthorityEventHandler eventHandler; + public UpdateAuthorityEventHandlerTest(boolean isAuthorityExtended) { + this.isAuthorityExtended = isAuthorityExtended; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[][]{{true}, {false}}); + } + @Before public void setUp() throws IOException { MockitoAnnotations.openMocks(this); @@ -130,6 +146,13 @@ public void setUp() throws IOException { .willReturn(WireMock.ok().withBody(Json.encode(new MappingMetadataDto() .withMappingParams(Json.encode(new MappingParameters())) .withMappingRules(mappingRules.encode()))))); + + AbstractAuthorityEventHandler.setAuthorityExtendedMode(isAuthorityExtended); + } + + @After + public void tearDown() { + AbstractAuthorityEventHandler.setAuthorityExtendedMode(false); } @Test