diff --git a/NEWS.md b/NEWS.md index e376d3f4..cca76b82 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ -## 2025-mm-dd v4.5.0-SNAPSHOT +## 2025-mm-dd v5.0.0-SNAPSHOT * [MODSOURCE-919](https://folio-org.atlassian.net/browse/MODSOURCE-919) Fill in permissions header during event sending to Kafka * [MODDICORE-464](https://folio-org.atlassian.net/browse/MODDICORE-464) Add links, linking rules setter to MarcBibRecordModifier +* [MODDICORE-468](https://folio-org.atlassian.net/browse/MODDICORE-468) Upgrade to Vert.x v5.0 and RMB v36.0.0 ## 2025-03-07 v4.4.0 * [MODDICORE-433](https://folio-org.atlassian.net/browse/MODDICORE-433) Add userId to event header and allow to send events with null token diff --git a/pom.xml b/pom.xml index 01ec68a1..deaf2ffb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.folio data-import-processing-core - 4.5.0-SNAPSHOT + 5.0.0-SNAPSHOT jar data-import-processing-core @@ -23,8 +23,8 @@ 2.6 2.0.17 4.13.2 - 3.12.1 - 35.4.0 + 3.13.2 + 36.0.0-SNAPSHOT org.folio.processing.mapping.defaultmapper.** **/OkapiConnectionParams.java **/parameters/MappingParameters.java @@ -45,7 +45,7 @@ io.vertx vertx-stack-depchain - 4.5.14 + 5.0.5 pom import @@ -68,7 +68,7 @@ org.folio folio-kafka-wrapper - 3.4.0-SNAPSHOT + 4.0.0-SNAPSHOT org.folio diff --git a/src/main/java/org/folio/processing/events/services/processor/EventProcessorImpl.java b/src/main/java/org/folio/processing/events/services/processor/EventProcessorImpl.java index b15d929a..60eec2b8 100644 --- a/src/main/java/org/folio/processing/events/services/processor/EventProcessorImpl.java +++ b/src/main/java/org/folio/processing/events/services/processor/EventProcessorImpl.java @@ -26,8 +26,8 @@ public class EventProcessorImpl implements EventProcessor { @Override public CompletableFuture process(DataImportEventPayload eventPayload) { - LOG.debug("process:: Processing event payload jobExecutionId: {} recordId: {}", - eventPayload.getJobExecutionId(), extractRecordId(eventPayload)); + LOG.debug("process:: Processing event payload, eventType: {} jobExecutionId: {} recordId: {}", + eventPayload.getEventType(), eventPayload.getJobExecutionId(), extractRecordId(eventPayload)); CompletableFuture future = new CompletableFuture<>(); try { Optional optionalEventHandler = eventHandlers.stream() @@ -90,8 +90,8 @@ private void logEventProcessingTime(String eventType, long startTime, DataImport eventType, profileType, profileId, (endTime - startTime) / 1000000L, eventPayload.getJobExecutionId(), extractRecordId(eventPayload)); } } catch (Exception e) { - LOG.warn("logEventProcessingTime:: An Exception occurred {} jobExecutionId: {} recordId: {}", - e.getMessage(), eventPayload.getJobExecutionId(), extractRecordId(eventPayload)); + LOG.warn("logEventProcessingTime:: An Exception occurred, jobExecutionId: {} recordId: {}", + eventPayload.getJobExecutionId(), extractRecordId(eventPayload), e); } } diff --git a/src/main/java/org/folio/processing/matching/matcher/AbstractMatcher.java b/src/main/java/org/folio/processing/matching/matcher/AbstractMatcher.java index 4c26556c..295cb768 100644 --- a/src/main/java/org/folio/processing/matching/matcher/AbstractMatcher.java +++ b/src/main/java/org/folio/processing/matching/matcher/AbstractMatcher.java @@ -44,11 +44,11 @@ public CompletableFuture match(DataImportEventPayload eventPayload) { } // Only one matching detail is expected in first implementation, // in future matching will support multiple matching details combined in logic expressions - MatchDetail matchDetail = matchProfile.getMatchDetails().get(0); + MatchDetail matchDetail = matchProfile.getMatchDetails().getFirst(); Value value = matchValueReader.read(eventPayload, matchDetail); if (value != null && value.getType().equals(Value.ValueType.STRING)) { - value = MatchIdProcessorUtil.retrieveIdFromContext(matchDetail.getExistingMatchExpression().getFields().get(0).getValue(), + value = MatchIdProcessorUtil.retrieveIdFromContext(matchDetail.getExistingMatchExpression().getFields().getFirst().getValue(), eventPayload, (StringValue) value); } diff --git a/src/main/java/org/folio/processing/matching/matcher/HoldingsItemMatcher.java b/src/main/java/org/folio/processing/matching/matcher/HoldingsItemMatcher.java index 0c3b5538..0703a0f8 100644 --- a/src/main/java/org/folio/processing/matching/matcher/HoldingsItemMatcher.java +++ b/src/main/java/org/folio/processing/matching/matcher/HoldingsItemMatcher.java @@ -1,6 +1,5 @@ package org.folio.processing.matching.matcher; -import io.vertx.core.CompositeFuture; import io.vertx.core.Future; import io.vertx.core.Promise; import io.vertx.core.json.JsonArray; @@ -51,7 +50,7 @@ private CompletableFuture processMultipleMatching(Value genericValue, M JsonArray matchedEntities = new JsonArray(); JsonArray errors = new JsonArray(); - List multipleFutures = new ArrayList<>(); + List> multipleFutures = new ArrayList<>(); values.forEach(v -> { Promise promise = Promise.promise(); multipleFutures.add(promise.future()); @@ -66,16 +65,16 @@ private CompletableFuture processMultipleMatching(Value genericValue, M }); }); - CompositeFuture.join(multipleFutures) + Future.join(multipleFutures) .onComplete(ar -> { String errorsAsStringJson = errors.encode(); - if (matchedEntities.size() == 0 && errors.size() == values.size()) { + if (matchedEntities.isEmpty() && errors.size() == values.size()) { resultFuture.completeExceptionally(new MatchingException(errorsAsStringJson)); } else { eventPayload.getContext().put(ERRORS, errorsAsStringJson); eventPayload.getContext().put(matchDetail.getExistingRecordType().value(), matchedEntities.encode()); eventPayload.getContext().put(NOT_MATCHED_NUMBER, String.valueOf(values.size() - matchedEntities.size() - errors.size())); - resultFuture.complete(matchedEntities.size() > 0); + resultFuture.complete(!matchedEntities.isEmpty()); } }); diff --git a/src/main/java/org/folio/rest/util/RestUtil.java b/src/main/java/org/folio/rest/util/RestUtil.java index 2c3bff79..12775be9 100644 --- a/src/main/java/org/folio/rest/util/RestUtil.java +++ b/src/main/java/org/folio/rest/util/RestUtil.java @@ -1,6 +1,5 @@ package org.folio.rest.util; -import com.fasterxml.jackson.databind.ObjectMapper; import io.vertx.core.Future; import io.vertx.core.Promise; import io.vertx.core.Handler; @@ -9,6 +8,7 @@ import io.vertx.core.http.HttpClient; import io.vertx.core.http.HttpClientOptions; import io.vertx.core.http.HttpMethod; +import io.vertx.core.json.Json; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.HttpRequest; import io.vertx.ext.web.client.HttpResponse; @@ -97,9 +97,10 @@ public static Future doRequest(OkapiConnectionParams params } } if (method == HttpMethod.PUT || method == HttpMethod.POST) { - request.sendBuffer(Buffer.buffer(new ObjectMapper().writeValueAsString(payload)), handleResponse(promise)); + request.sendBuffer(Buffer.buffer(Json.encode(payload))) + .onComplete(handleResponse(promise)); } else { - request.send(handleResponse(promise)); + request.send().onComplete(handleResponse(promise)); } return promise.future(); } catch (Exception e) { diff --git a/src/test/java/org/folio/processing/events/utils/PomReaderUtilTest.java b/src/test/java/org/folio/processing/events/utils/PomReaderUtilTest.java index bb2ce73f..344661dd 100644 --- a/src/test/java/org/folio/processing/events/utils/PomReaderUtilTest.java +++ b/src/test/java/org/folio/processing/events/utils/PomReaderUtilTest.java @@ -50,7 +50,7 @@ void readFromJar() throws IOException, XmlPullParserException { pom.readIt(null, "META-INF/maven/io.vertx"); // force reading from Jar // first dependency in main pom - assertThat(pom.getModuleName(), is("vertx_parent")); + assertThat(pom.getModuleName(), is("vertx_core_aggregator")); } @Test diff --git a/src/test/java/org/folio/processing/events/utils/RestUtilTest.java b/src/test/java/org/folio/processing/events/utils/RestUtilTest.java index 2a268ba0..11bc90de 100644 --- a/src/test/java/org/folio/processing/events/utils/RestUtilTest.java +++ b/src/test/java/org/folio/processing/events/utils/RestUtilTest.java @@ -1,9 +1,9 @@ package org.folio.processing.events.utils; -import com.fasterxml.jackson.core.JsonProcessingException; import com.github.tomakehurst.wiremock.client.WireMock; import io.vertx.core.Promise; import io.vertx.core.http.HttpMethod; +import io.vertx.core.json.EncodeException; import io.vertx.core.json.JsonObject; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; @@ -155,22 +155,17 @@ public void shouldReturnForbiddenStatus(TestContext testContext) throws IOExcept } @Test - public void shouldReturnFailedFutureWhenJsonDoesntParse(TestContext testContext) throws IOException { + public void shouldReturnFailedFutureWhenJsonDoesntParse(TestContext testContext) { Async async = testContext.async(); WireMock.stubFor(WireMock.post(PUBLISH_SERVICE_URL).willReturn(WireMock.forbidden())); Object mockItem = mock(Object.class); when(mockItem.toString()).thenReturn(mockItem.getClass().getName()); - Promise promise = Promise.promise(); RestUtil.doRequest(params, "/pubsub/publish", HttpMethod.POST, mockItem) .onComplete(postPublishResult -> { - if(postPublishResult.succeeded()) { - fail(); - } else { - Throwable throwable = postPublishResult.cause(); - Assert.assertTrue(throwable instanceof JsonProcessingException); - } + testContext.assertTrue(postPublishResult.failed()); + testContext.assertTrue(postPublishResult.cause() instanceof EncodeException); async.complete(); }); }