From a92c2cbcbc04a2475fe148060b3c971004eb9475 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 22:42:19 +0000 Subject: [PATCH 1/6] fix(deps): bump the prod-deps group across 1 directory with 3 updates Bumps the prod-deps group with 3 updates in the / directory: [org.folio:folio-spring-base](https://github.com/folio-org/folio-spring-support), [org.folio:folio-spring-cql](https://github.com/folio-org/folio-spring-support) and [org.apache.commons:commons-compress](https://github.com/apache/commons-compress). Updates `org.folio:folio-spring-base` from 8.3.0-SNAPSHOT to 10.0.0 - [Release notes](https://github.com/folio-org/folio-spring-support/releases) - [Changelog](https://github.com/folio-org/folio-spring-support/blob/master/NEWS.md) - [Commits](https://github.com/folio-org/folio-spring-support/commits/v10.0.0) Updates `org.folio:folio-spring-cql` from 8.3.0-SNAPSHOT to 10.0.0 - [Release notes](https://github.com/folio-org/folio-spring-support/releases) - [Changelog](https://github.com/folio-org/folio-spring-support/blob/master/NEWS.md) - [Commits](https://github.com/folio-org/folio-spring-support/commits/v10.0.0) Updates `org.folio:folio-spring-cql` from 8.3.0-SNAPSHOT to 10.0.0 - [Release notes](https://github.com/folio-org/folio-spring-support/releases) - [Changelog](https://github.com/folio-org/folio-spring-support/blob/master/NEWS.md) - [Commits](https://github.com/folio-org/folio-spring-support/commits/v10.0.0) Updates `org.apache.commons:commons-compress` from 1.26.2 to 1.28.0 - [Changelog](https://github.com/apache/commons-compress/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-compress/compare/rel/commons-compress-1.26.2...rel/commons-compress-1.28.0) --- updated-dependencies: - dependency-name: org.apache.commons:commons-compress dependency-version: 1.28.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: prod-deps - dependency-name: org.folio:folio-spring-base dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: prod-deps - dependency-name: org.folio:folio-spring-cql dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: prod-deps - dependency-name: org.folio:folio-spring-cql dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-major dependency-group: prod-deps ... Signed-off-by: dependabot[bot] --- service/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/pom.xml b/service/pom.xml index c14a479..3269dcb 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -18,7 +18,7 @@ 9000 - 8.3.0-SNAPSHOT + 10.0.0 @@ -101,7 +101,7 @@ org.apache.commons commons-compress - 1.26.2 + 1.28.0 From e2a3f1aed77ab27ccd3677d85b162b53eb520c38 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Tue, 12 May 2026 16:49:32 -0500 Subject: [PATCH 2/6] MODWRKFLOW-54: Migrate to Spring Boot 3.5. The `folio-spring` dependency is actually using Spring Boot 4. Therefore, this only migrates enough to compile and run the unit tests. Bring in new controller advice testing practices that avoids needing to run a full Spring Boot service. The `count()` can no longer be used. Create a new `countAll()` with a `@Query` and utilize that. --- service/pom.xml | 2 +- .../rest/workflow/config/OkHttpConfig.java | 14 -- .../advice/WorkflowControllerAdvice.java | 4 +- .../workflow/model/repo/WorkflowRepo.java | 4 + .../workflow/service/WorkflowCqlService.java | 14 +- .../config/JunitHelperWebMvcConfig.java | 24 +++ .../advice/EventControllerAdviceTest.java | 104 +++++----- .../advice/WorkflowControllerAdviceTest.java | 183 ++++++++++++------ ...coveryServiceWithCustomPropertiesTest.java | 3 - ...overyServiceWithDefaultPropertiesTest.java | 11 +- .../service/WorkflowImportServiceTest.java | 13 +- 11 files changed, 227 insertions(+), 149 deletions(-) create mode 100644 service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java diff --git a/service/pom.xml b/service/pom.xml index c14a479..d844ca4 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -18,7 +18,7 @@ 9000 - 8.3.0-SNAPSHOT + 10.0.0 diff --git a/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java b/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java index 0d2bada..629ee7c 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/OkHttpConfig.java @@ -1,22 +1,8 @@ package org.folio.rest.workflow.config; -import feign.okhttp.OkHttpClient; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OkHttpConfig { - /** - * Add feignOkHttpClient to prevent issues introduced when using folio-spring-base. - * - * The issue involves enrichUrlAndHeadersClient, FeignClientConfiguration, and okhttp3.OkHttpClient. - * - * This defines a bean of type 'okhttp3.OkHttpClient' to prevent the error. - */ - @Bean - public OkHttpClient feignOkHttpClient() { - return new OkHttpClient(); - } - } diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java index 4f59802..df6dfd7 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java @@ -48,7 +48,7 @@ public ResponseEntity handleWorkflowNotFoundException(WorkflowNotFoundEx @ResponseStatus(HttpStatus.FORBIDDEN) @ExceptionHandler(WorkflowAlreadyActiveException.class) - public ResponseEntity handleWorkflowAlreadyActivrException(WorkflowAlreadyActiveException exception) { + public ResponseEntity handleWorkflowAlreadyActiveException(WorkflowAlreadyActiveException exception) { return buildError(exception, HttpStatus.FORBIDDEN); } @@ -66,7 +66,7 @@ public ResponseEntity handleWorkflowEngineServiceException(WorkflowEngin @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(WorkflowImportException.class) - public ResponseEntity handleWorkflowImportExceptionException(WorkflowImportException exception) { + public ResponseEntity handleWorkflowImportException(WorkflowImportException exception) { return buildError(exception, HttpStatus.BAD_REQUEST); } diff --git a/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java b/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java index 28ccc3e..cda44f9 100644 --- a/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java +++ b/service/src/main/java/org/folio/rest/workflow/model/repo/WorkflowRepo.java @@ -2,6 +2,7 @@ import org.folio.rest.workflow.model.Workflow; import org.folio.spring.cql.JpaCqlRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.data.rest.core.annotation.RestResource; @@ -19,4 +20,7 @@ public interface WorkflowRepo extends JpaCqlRepository { @Override @RestResource(exported = false) public void deleteById(String id); + + @Query("SELECT COUNT(*) FROM Workflow") + public long countAll(); } diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java index 34749d1..01359db 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java @@ -19,11 +19,6 @@ public WorkflowCqlService(ObjectMapper mapper, WorkflowRepo repo) { this.repo = repo; } - @Override - protected String getTypeName() { - return Workflow.class.getSimpleName().toLowerCase() + "s"; - } - @Override public ObjectNode findByCql(String query, Long offset, Integer limit) { Page page = null; @@ -31,13 +26,18 @@ public ObjectNode findByCql(String query, Long offset, Integer limit) { if (StringUtils.isBlank(query)) { page = repo.findAll(new OffsetRequest(offset, limit)); - total = repo.count(); + total = repo.countAll(); } else { page = repo.findByCql(query, new OffsetRequest(offset, limit)); - total = repo.count(query); + total = repo.countByCql(query); } return toJson(page.toList(), total); } + @Override + protected String getTypeName() { + return Workflow.class.getSimpleName().toLowerCase() + "s"; + } + } diff --git a/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java new file mode 100644 index 0000000..5f287be --- /dev/null +++ b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java @@ -0,0 +1,24 @@ +package org.folio.rest.workflow.config; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.TestConfiguration; +import org.springframework.test.context.ActiveProfiles; + +/** + * Provide custom web MVC settings for use during unit tests. + */ +@TestConfiguration +@ActiveProfiles("test") +public class JunitHelperWebMvcConfig { + + @Bean + ObjectMapper objectMapper() { + final ObjectMapper mapper = new ObjectMapper(); + + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + return mapper; + } +} diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java index 398a8b2..e63b497 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/EventControllerAdviceTest.java @@ -1,98 +1,82 @@ package org.folio.rest.workflow.controller.advice; -import static org.folio.spring.test.mock.MockMvcConstant.APP_JSON; -import static org.folio.spring.test.mock.MockMvcConstant.JSON_OBJECT; -import static org.folio.spring.test.mock.MockMvcConstant.OKAPI_HEAD; import static org.folio.spring.test.mock.MockMvcConstant.VALUE; -import static org.folio.spring.test.mock.MockMvcRequest.appendBody; -import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.nio.file.FileSystemException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Stream; -import org.folio.rest.workflow.controller.EventController; import org.folio.rest.workflow.exception.EventPublishException; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@AutoConfigureMockMvc @ExtendWith(MockitoExtension.class) @ActiveProfiles("test") class EventControllerAdviceTest { - private static final String PATH = "/events"; + private static final Exception RUNTIME_EXC = new RuntimeException("Runtime failure."); - private static final String PATH_HANDLE = PATH + "/handle"; + private static final EventPublishException EP_EXC = new EventPublishException(VALUE, RUNTIME_EXC); - @Autowired - private EventControllerAdvice eventControllerAdvice; + private static final FileSystemException FS_EXC = new FileSystemException(VALUE); - @Autowired - @Mock - private EventController eventController; - - private MockMvc mvc; + private EventControllerAdvice advice; @BeforeEach void beforeEach() { - mvc = MockMvcBuilders.standaloneSetup(eventController) - .setControllerAdvice(eventControllerAdvice) - .build(); + advice = new EventControllerAdvice(); + } + + @Test + void handleEventPublishExceptionTest() { + + final String simpleName = EventPublishException.class.getSimpleName(); + final ResponseEntity response = advice.handleEventPublishException(EP_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } - @ParameterizedTest - @MethodSource("provideExceptionsToMatchForActivateWorkflow") - void exceptionsThrownForActivateWorkflowTest(Exception exception, String simpleName, int status) throws Exception { - given(eventController.postHandleEvents(any(), any())).willAnswer(invocation -> { throw exception; }); + @Test + void handleFileSystemExceptionTest() { - MockHttpServletRequestBuilder request = appendHeaders(post(PATH_HANDLE), OKAPI_HEAD, APP_JSON, APP_JSON); + final String simpleName = FileSystemException.class.getSimpleName(); + final ResponseEntity response = advice.handleFileSystemException(FS_EXC); - MvcResult result = mvc.perform(appendBody(request, JSON_OBJECT)) - .andDo(log()).andExpect(status().is(status)).andReturn(); + assertNotNull(response); + assertNotNull(response.getBody()); - Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); - Matcher matcher = pattern.matcher(result.getResponse().getContentAsString()); - assertTrue(matcher.find()); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } /** - * Helper function for parameterized test providing the exceptions to be matched for activate workflow. + * Match the class simple name in the response. * - * @return - * The arguments array stream with the stream columns as: - * - Exception exception. - * - String simpleName (exception name to match). - * - int status (response HTTP status code for the exception). + * @param response The response to search. + * @param simpleName The class name to match. + * + * @return TRUE on match; FALSE otherwise. */ - private static Stream provideExceptionsToMatchForActivateWorkflow() { - Exception runtime = new RuntimeException("Runtime failure."); + private boolean matchBody(ResponseEntity response, String simpleName) { + + final Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); + final Matcher matcher = pattern.matcher(response.getBody()); - return Stream.of( - Arguments.of(new EventPublishException(VALUE, runtime), EventPublishException.class.getSimpleName(), 500), - Arguments.of(new FileSystemException(VALUE), FileSystemException.class.getSimpleName(), 400) - ); + return matcher.find(); } } diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java index bf76148..d620b9a 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdviceTest.java @@ -1,24 +1,14 @@ package org.folio.rest.workflow.controller.advice; -import static org.folio.spring.test.mock.MockMvcConstant.APP_JSON; -import static org.folio.spring.test.mock.MockMvcConstant.JSON_OBJECT; -import static org.folio.spring.test.mock.MockMvcConstant.OKAPI_HEAD; -import static org.folio.spring.test.mock.MockMvcConstant.UUID; import static org.folio.spring.test.mock.MockMvcConstant.VALUE; -import static org.folio.spring.test.mock.MockMvcRequest.appendBody; -import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import jakarta.persistence.EntityNotFoundException; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; -import org.folio.rest.workflow.controller.WorkflowController; import org.folio.rest.workflow.exception.WorkflowAlreadyActiveException; import org.folio.rest.workflow.exception.WorkflowDeploymentException; import org.folio.rest.workflow.exception.WorkflowEngineServiceException; @@ -29,85 +19,166 @@ import org.folio.rest.workflow.exception.WorkflowImportRequiredFileMissing; import org.folio.rest.workflow.exception.WorkflowNotFoundException; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@AutoConfigureMockMvc @ExtendWith(MockitoExtension.class) @ActiveProfiles("test") class WorkflowControllerAdviceTest { - private static final String PATH = "/workflows"; + private static final EntityNotFoundException ENF_EXC = new EntityNotFoundException(VALUE); - private static final String PATH_ACTIVATE = PATH + "/{id}/activate"; + private static final WorkflowNotFoundException WNF_EXC = new WorkflowNotFoundException(VALUE); - @Autowired - private WorkflowControllerAdvice workflowControllerAdvice; + private static final WorkflowAlreadyActiveException WAA_EXC = new WorkflowAlreadyActiveException(VALUE); - @Autowired - @Mock - private WorkflowController workflowController; + private static final WorkflowDeploymentException WD_EXC = new WorkflowDeploymentException(); - private MockMvc mvc; + private static final WorkflowEngineServiceException WES_EXC = new WorkflowEngineServiceException(VALUE); + + private static final WorkflowImportException WI_EXC = new WorkflowImportException(VALUE); + + private static final WorkflowImportAlreadyImported WIAI_EXC = new WorkflowImportAlreadyImported(VALUE); + + private static final WorkflowImportInvalidOrMissingProperty WIIOMP_EXC = new WorkflowImportInvalidOrMissingProperty(VALUE, VALUE); + + private static final WorkflowImportJsonFileIsDirectory WIJFID_EXC = new WorkflowImportJsonFileIsDirectory(VALUE); + + private static final WorkflowImportRequiredFileMissing WIRFM_EXC = new WorkflowImportRequiredFileMissing(VALUE); + + private WorkflowControllerAdvice advice; @BeforeEach void beforeEach() { - mvc = MockMvcBuilders.standaloneSetup(workflowController) - .setControllerAdvice(workflowControllerAdvice) - .build(); + advice = new WorkflowControllerAdvice(); + } + + @Test + void handleEntityNotFoundExceptionTest() { + + final String simpleName = EntityNotFoundException.class.getSimpleName(); + final ResponseEntity response = advice.handleEntityNotFoundException(ENF_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowNotFoundExceptionTest() { + + final String simpleName = WorkflowNotFoundException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowNotFoundException(WNF_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowAlreadyActiveExceptionTest() { + + final String simpleName = WorkflowAlreadyActiveException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowAlreadyActiveException(WAA_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.FORBIDDEN, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowDeploymentExceptionTest() { + + final String simpleName = WorkflowDeploymentException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowDeploymentException(WD_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); + } + + @Test + void handleWorkflowEngineServiceExceptionTest() { + + final String simpleName = WorkflowEngineServiceException.class.getSimpleName(); + final ResponseEntity response = advice.handleWorkflowEngineServiceException(WES_EXC); + + assertNotNull(response); + assertNotNull(response.getBody()); + + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } @ParameterizedTest - @MethodSource("provideExceptionsToMatchForActivateWorkflow") - void exceptionsThrownForActivateWorkflowTest(Exception exception, String simpleName, int status) throws Exception { - given(workflowController.activateWorkflow(any(), any(), any())).willAnswer(invocation -> { throw exception; }); + @MethodSource("provideWorkflowImportExceptions") + void handleWorkflowImportExceptionTest(WorkflowImportException exception, String simpleName) { - MockHttpServletRequestBuilder request = appendHeaders(put(PATH_ACTIVATE, UUID), OKAPI_HEAD, APP_JSON, APP_JSON); + final ResponseEntity response = advice.handleWorkflowImportException(exception); - MvcResult result = mvc.perform(appendBody(request, JSON_OBJECT)) - .andDo(log()).andExpect(status().is(status)).andReturn(); + assertNotNull(response); + assertNotNull(response.getBody()); - Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); - Matcher matcher = pattern.matcher(result.getResponse().getContentAsString()); - assertTrue(matcher.find()); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + assertEquals(MediaType.APPLICATION_JSON, response.getHeaders().getContentType()); + assertTrue(matchBody(response, simpleName)); } /** - * Helper function for parameterized test providing the exceptions to be matched for activate workflow. + * Match the class simple name in the response. + * + * @param response The response to search. + * @param simpleName The class name to match. + * + * @return TRUE on match; FALSE otherwise. + */ + private boolean matchBody(ResponseEntity response, String simpleName) { + + final Pattern pattern = Pattern.compile("\"type\":\"" + simpleName + "\""); + final Matcher matcher = pattern.matcher(response.getBody()); + + return matcher.find(); + } + + /** + * Helper function for parameterized test providing different types of WorkflowImportException. * * @return * The arguments array stream with the stream columns as: * - Exception exception. * - String simpleName (exception name to match). - * - int status (response HTTP status code for the exception). */ - private static Stream provideExceptionsToMatchForActivateWorkflow() { + private static Stream provideWorkflowImportExceptions() { + return Stream.of( - Arguments.of(new WorkflowNotFoundException(VALUE), WorkflowNotFoundException.class.getSimpleName(), 404), - Arguments.of(new EntityNotFoundException(), EntityNotFoundException.class.getSimpleName(), 404), - Arguments.of(new WorkflowAlreadyActiveException(VALUE), WorkflowAlreadyActiveException.class.getSimpleName(), 403), - Arguments.of(new WorkflowDeploymentException(), WorkflowDeploymentException.class.getSimpleName(), 500), - Arguments.of(new WorkflowEngineServiceException(VALUE), WorkflowEngineServiceException.class.getSimpleName(), 500), - Arguments.of(new WorkflowImportException(VALUE), WorkflowImportException.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportAlreadyImported(VALUE), WorkflowImportAlreadyImported.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportInvalidOrMissingProperty(VALUE, VALUE), WorkflowImportInvalidOrMissingProperty.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportJsonFileIsDirectory(VALUE), WorkflowImportJsonFileIsDirectory.class.getSimpleName(), 400), - Arguments.of(new WorkflowImportRequiredFileMissing(VALUE), WorkflowImportRequiredFileMissing.class.getSimpleName(), 400) + Arguments.of(WIAI_EXC, WorkflowImportAlreadyImported.class.getSimpleName()), + Arguments.of(WIIOMP_EXC, WorkflowImportInvalidOrMissingProperty.class.getSimpleName()), + Arguments.of(WIJFID_EXC, WorkflowImportJsonFileIsDirectory.class.getSimpleName()), + Arguments.of(WIRFM_EXC, WorkflowImportRequiredFileMissing.class.getSimpleName()) ); } + } diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java index 3a329b7..1d1dff8 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java @@ -5,8 +5,6 @@ import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.test.context.TestPropertySource; import org.springframework.test.util.ReflectionTestUtils; @@ -15,7 +13,6 @@ * * This is expected to be empty as the OkapiDiscoveryServiceWithDefaultConfigTest() contains all of the tests. */ -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) @TestPropertySource(properties = { "logging.level.org.folio.rest.workflow.service.OkapiDiscoveryService = DEBUG", "tenant.headerName = X-Okapi-Tenant", diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java index fbead70..3817e70 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java @@ -7,6 +7,7 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Iterator; import java.util.List; @@ -21,15 +22,21 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; /** * This runs the OkapiDiscoveryService tests for when there is no properly configuration application.yml. * * Do no add additional settings loading or alterations to this test (such as @TestPropertySource). */ -@ExtendWith(SpringExtension.class) +@ActiveProfiles("test") +@SpringJUnitWebConfig({ + ObjectMapper.class, + OkapiDiscoveryService.class, + HttpService.class +}) @ExtendWith(MockitoExtension.class) class OkapiDiscoveryServiceWithDefaultPropertiesTest { diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java index 1ca91f2..8649598 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java @@ -11,6 +11,7 @@ import java.io.IOException; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.compress.compressors.CompressorException; +import org.folio.rest.workflow.config.JunitHelperWebMvcConfig; import org.folio.rest.workflow.exception.WorkflowImportAlreadyImported; import org.folio.rest.workflow.exception.WorkflowImportException; import org.folio.rest.workflow.exception.WorkflowImportInvalidOrMissingProperty; @@ -26,17 +27,21 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.core.io.Resource; import org.springframework.data.domain.Page; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; -@SpringBootTest(webEnvironment = WebEnvironment.MOCK) -@ExtendWith(MockitoExtension.class) @ActiveProfiles("test") +@SpringJUnitWebConfig({ + JunitHelperWebMvcConfig.class, + WorkflowImportService.class +}) +@ExtendWith(MockitoExtension.class) +@ExtendWith(SpringExtension.class) class WorkflowImportServiceTest { private static final String WORKFLOW_UUID = "7dcd302f-a438-4ca5-a7eb-21653610d46f"; From df9483c7676ba2eac464913e217a0e89f3af160e Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Wed, 13 May 2026 16:35:16 -0500 Subject: [PATCH 3/6] MODWRKFLOW-54: Migrate to Spring-Boot 4.0. This is the first pass at the migration. --- components/pom.xml | 3 +- .../folio/rest/workflow/model/EmailTask.java | 2 +- .../rest/workflow/model/NodeInterface.java | 2 +- .../folio/rest/workflow/model/Workflow.java | 2 +- .../model/converter/AbstractConverter.java | 27 ++++++++++-------- .../converter/ComparisonListConverter.java | 9 ++---- .../converter/EmbeddedVariableConverter.java | 6 ---- .../InputAttributeListConverter.java | 6 ---- .../model/converter/JsonNodeConverter.java | 11 +++----- .../model/converter/MappingListConverter.java | 9 ++---- .../model/converter/RequestConverter.java | 9 ++---- .../model/converter/StringListConverter.java | 6 ---- .../model/has/common/HasWorkflowCommon.java | 2 +- .../DeserializeAsNodeJsonResolver.java | 15 ++++++---- .../rest/workflow/model/WorkflowTest.java | 2 +- .../converter/AbstractConverterTest.java | 2 +- .../DeserializeAsNodeJsonResolverTest.java | 15 +++++----- service/pom.xml | 20 ++++++------- .../config/FolioSpringLiquibaseConfig.java | 2 +- .../workflow/config/KafkaProducerConfig.java | 2 +- .../workflow/controller/EventController.java | 6 ++-- .../controller/WorkflowController.java | 2 +- .../controller/advice/AbstractAdvice.java | 7 +++-- .../advice/EventControllerAdvice.java | 5 ++-- .../controller/advice/GlobalAdvice.java | 5 ++-- .../advice/WorkflowControllerAdvice.java | 5 ++-- .../workflow/model/ExtractedWorkflow.java | 2 +- .../workflow/service/AbstractCqlService.java | 6 ++-- .../service/OkapiDiscoveryService.java | 8 +++--- .../workflow/service/WorkflowCqlService.java | 4 +-- .../service/WorkflowEngineService.java | 16 +++++------ .../service/WorkflowImportService.java | 28 +++++++++---------- service/src/main/resources/application.yaml | 8 ++++-- .../config/JunitHelperWebMvcConfig.java | 14 ++++++---- .../controller/ActionControllerTest.java | 4 +-- .../controller/EventControllerTest.java | 9 ++++-- .../controller/WorkflowControllerTest.java | 16 +++++++---- .../controller/advice/AbstractAdviceTest.java | 19 +++++++------ .../workflow/model/ExtractedWorkflowTest.java | 2 +- ...coveryServiceWithCustomPropertiesTest.java | 2 +- ...overyServiceWithDefaultPropertiesTest.java | 4 +-- .../service/WorkflowCqlServiceTest.java | 7 +++-- .../service/WorkflowEngineServiceTest.java | 13 +++++---- .../service/WorkflowImportServiceTest.java | 2 +- service/src/test/resources/application.yaml | 8 ++++-- 45 files changed, 175 insertions(+), 179 deletions(-) diff --git a/components/pom.xml b/components/pom.xml index 9bdbbe3..208d465 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -1,5 +1,4 @@ - - + 4.0.0 diff --git a/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java b/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java index 7ad5f2a..79dffb3 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java +++ b/components/src/main/java/org/folio/rest/workflow/model/EmailTask.java @@ -8,7 +8,7 @@ import lombok.Setter; import org.folio.rest.workflow.model.components.DelegateTask; import org.folio.rest.workflow.model.has.common.HasEmailTaskCommon; -import org.springframework.lang.NonNull; +import org.jspecify.annotations.NonNull; @Entity public class EmailTask extends AbstractTask implements DelegateTask, HasEmailTaskCommon { diff --git a/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java b/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java index aecdf59..534be76 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java +++ b/components/src/main/java/org/folio/rest/workflow/model/NodeInterface.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver; import org.folio.rest.workflow.model.resolver.DeserializeAsNodeJsonResolver; +import tools.jackson.databind.annotation.JsonTypeIdResolver; @JsonTypeIdResolver(DeserializeAsNodeJsonResolver.class) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "deserializeAs") diff --git a/components/src/main/java/org/folio/rest/workflow/model/Workflow.java b/components/src/main/java/org/folio/rest/workflow/model/Workflow.java index 38c5ffc..794d4a3 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/Workflow.java +++ b/components/src/main/java/org/folio/rest/workflow/model/Workflow.java @@ -1,7 +1,6 @@ package org.folio.rest.workflow.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -33,6 +32,7 @@ import org.folio.spring.domain.model.AbstractBaseEntity; import org.hibernate.annotations.ColumnDefault; import org.springframework.data.annotation.Version; +import tools.jackson.databind.JsonNode; @Entity @JsonIgnoreProperties({ "hibernateLazyInitializer", "handler" }) diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java index 602fb5c..ba9ae40 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/AbstractConverter.java @@ -1,16 +1,19 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.StreamReadFeature; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.persistence.AttributeConverter; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; /** - * This converts the value into a JSON representation stored as a single string tin the database. + * This converts the value into a JSON representation stored as a single string in the database. + * + * Implementations need only provide the T. + * Each implementation is expected to be used as-is as a JSON string value without needing the type details. */ public abstract class AbstractConverter implements AttributeConverter { @@ -27,7 +30,7 @@ public String convertToDatabaseColumn(T attribute) { try { return objectMapper.writeValueAsString(attribute); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e.getMessage()); } } @@ -38,11 +41,13 @@ public T convertToEntityAttribute(String dbData) { try { return objectMapper.readValue(dbData, getTypeReference()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e.getMessage()); } } - public abstract TypeReference getTypeReference(); + public TypeReference getTypeReference() { + return new TypeReference() {}; + } } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java index 8aca340..92d0751 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/ComparisonListConverter.java @@ -1,16 +1,13 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.dto.Comparison; +/** + * Comparison list converter. + */ @Converter public class ComparisonListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java index 8851a5e..886568c 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/EmbeddedVariableConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import org.folio.rest.workflow.model.EmbeddedVariable; @@ -10,9 +9,4 @@ @Converter public class EmbeddedVariableConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java index e1de3fd..dd66694 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/InputAttributeListConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.enums.InputAttribute; @@ -11,9 +10,4 @@ @Converter public class InputAttributeListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java index 243c88c..a7dfa10 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/JsonNodeConverter.java @@ -1,15 +1,12 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; import jakarta.persistence.Converter; +import tools.jackson.databind.JsonNode; +/** + * JSON Node converted. + */ @Converter public class JsonNodeConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java index 214b94e..bc26a40 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/MappingListConverter.java @@ -1,16 +1,13 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; import org.folio.rest.workflow.dto.Mapping; +/** + * Mapping list converter. + */ @Converter public class MappingListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java index 99e372a..386bb98 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/RequestConverter.java @@ -1,15 +1,12 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import org.folio.rest.workflow.dto.Request; +/** + * Request converter. + */ @Converter public class RequestConverter extends AbstractConverter { - @Override - public TypeReference getTypeReference() { - return new TypeReference() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java b/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java index 4e23b18..a36e75d 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java +++ b/components/src/main/java/org/folio/rest/workflow/model/converter/StringListConverter.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.model.converter; -import com.fasterxml.jackson.core.type.TypeReference; import jakarta.persistence.Converter; import java.util.List; @@ -10,9 +9,4 @@ @Converter public class StringListConverter extends AbstractConverter> { - @Override - public TypeReference> getTypeReference() { - return new TypeReference>() {}; - } - } diff --git a/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java b/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java index bf46877..0abd219 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java +++ b/components/src/main/java/org/folio/rest/workflow/model/has/common/HasWorkflowCommon.java @@ -1,8 +1,8 @@ package org.folio.rest.workflow.model.has.common; -import com.fasterxml.jackson.databind.JsonNode; import java.util.Map; import org.folio.rest.workflow.model.Setup; +import tools.jackson.databind.JsonNode; /** * This interface provides common methods for {@link org.folio.rest.workflow.model.Workflow Workflow}. diff --git a/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java b/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java index 8ea28f5..8dde4c8 100644 --- a/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java +++ b/components/src/main/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolver.java @@ -3,9 +3,6 @@ import static java.util.Map.entry; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; -import com.fasterxml.jackson.databind.DatabindContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase; import java.util.Map; import org.folio.rest.workflow.model.CompressFileTask; import org.folio.rest.workflow.model.Condition; @@ -34,12 +31,18 @@ import org.folio.rest.workflow.model.Subprocess; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DatabindContext; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.jsontype.impl.TypeIdResolverBase; /** * Resolve the type from the `deserializeAs` field from a `Node`. */ public class DeserializeAsNodeJsonResolver extends TypeIdResolverBase { + private static final long serialVersionUID = 30422936630293L; + /** * A map of classes that are allowed to be deserialized. */ @@ -73,13 +76,13 @@ public class DeserializeAsNodeJsonResolver extends TypeIdResolverBase { private static final Logger logger = LoggerFactory.getLogger(DeserializeAsNodeJsonResolver.class); @Override - public String idFromValue(Object value) { + public String idFromValue(DatabindContext ctxt, Object value) throws JacksonException { return value.getClass().getSimpleName(); } @Override - public String idFromValueAndType(Object value, Class suggestedType) { - return idFromValue(value); + public String idFromValueAndType(DatabindContext ctxt, Object value, Class suggestedType) throws JacksonException { + return idFromValue(ctxt, value); } @Override diff --git a/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java b/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java index 22fc17e..416a71e 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/WorkflowTest.java @@ -6,7 +6,6 @@ import static org.springframework.test.util.ReflectionTestUtils.getField; import static org.springframework.test.util.ReflectionTestUtils.setField; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -20,6 +19,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import tools.jackson.databind.JsonNode; @ExtendWith(MockitoExtension.class) class WorkflowTest { diff --git a/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java b/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java index 6788aad..f9d3556 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/converter/AbstractConverterTest.java @@ -5,10 +5,10 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import com.fasterxml.jackson.core.type.TypeReference; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import tools.jackson.core.type.TypeReference; class AbstractConverterTest { diff --git a/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java b/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java index 8b31f63..33a8887 100644 --- a/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java +++ b/components/src/test/java/org/folio/rest/workflow/model/resolver/DeserializeAsNodeJsonResolverTest.java @@ -5,10 +5,6 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; -import com.fasterxml.jackson.databind.DatabindContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.util.stream.Stream; import java.util.stream.Stream.Builder; import org.junit.jupiter.api.BeforeEach; @@ -22,6 +18,11 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import tools.jackson.databind.DatabindContext; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @ExtendWith(MockitoExtension.class) class DeserializeAsNodeJsonResolverTest { @@ -36,19 +37,19 @@ class DeserializeAsNodeJsonResolverTest { @BeforeEach void beforeEach() { - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); } @Test void idFromValueWorksTest() { - String result = deserializeAsJsonResolver.idFromValue(new String()); + String result = deserializeAsJsonResolver.idFromValue(null, new String()); assertEquals(String.class.getSimpleName(), result); } @Test void idFromValueAndTypeWorksTest() { - String result = deserializeAsJsonResolver.idFromValueAndType(new String(), JsonNode.class); + String result = deserializeAsJsonResolver.idFromValueAndType(null, new String(), JsonNode.class); assertEquals(String.class.getSimpleName(), result); } diff --git a/service/pom.xml b/service/pom.xml index d844ca4..d713a57 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -1,5 +1,4 @@ - - + 4.0.0 @@ -83,12 +82,12 @@ org.springframework.boot spring-boot-starter-test - - - org.springframework.boot - spring-boot-starter-logging - - + test + + + + org.springframework.boot + spring-boot-starter-webmvc-test test @@ -116,8 +115,8 @@ - org.hibernate.orm.tooling - hibernate-enhance-maven-plugin + org.hibernate.orm + hibernate-maven-plugin enhance @@ -126,7 +125,6 @@ enhance - true true true true diff --git a/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java b/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java index d60265c..30cb83b 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/FolioSpringLiquibaseConfig.java @@ -8,7 +8,7 @@ public class FolioSpringLiquibaseConfig { @Bean - public FolioSpringLiquibase folioSpringLiquibase() { + FolioSpringLiquibase folioSpringLiquibase() { return new FolioSpringLiquibase(); } diff --git a/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java b/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java index 8dfae5c..95664d3 100644 --- a/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java +++ b/service/src/main/java/org/folio/rest/workflow/config/KafkaProducerConfig.java @@ -33,7 +33,7 @@ public ProducerFactory eventProducerFactory() { } @Bean - public KafkaTemplate eventKafkaTemplate() { + KafkaTemplate eventKafkaTemplate() { return new KafkaTemplate<>(eventProducerFactory()); } diff --git a/service/src/main/java/org/folio/rest/workflow/controller/EventController.java b/service/src/main/java/org/folio/rest/workflow/controller/EventController.java index 58f4e24..fe8caee 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/EventController.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/EventController.java @@ -1,8 +1,5 @@ package org.folio.rest.workflow.controller; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import jakarta.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; @@ -35,6 +32,9 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.HandlerMapping; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @RestController @RequestMapping("/events") diff --git a/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java b/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java index d5f6e43..05d4bdf 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/WorkflowController.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.controller; -import com.fasterxml.jackson.databind.JsonNode; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -30,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import tools.jackson.databind.JsonNode; @Slf4j @RestController diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java index 07f3231..c08d0fa 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/AbstractAdvice.java @@ -1,11 +1,12 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; + import org.folio.spring.web.utility.ErrorUtility; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; abstract class AbstractAdvice extends RequestMappingHandlerMapping { @@ -46,7 +47,7 @@ protected ResponseEntity buildError(Exception ex, HttpStatus code, Medi // Catch the exceptions and report it, then fall back to a plain text error message. try { message = getObjectMapper().writeValueAsString(ErrorUtility.buildError(ex, code)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { logger.error("Mapping error to JSON Object failed.", e); type = MediaType.TEXT_PLAIN; diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java index 640acc4..39a9db5 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/EventControllerAdvice.java @@ -1,5 +1,4 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.file.FileSystemException; import org.folio.rest.workflow.exception.EventPublishException; import org.springframework.http.HttpStatus; @@ -7,6 +6,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class EventControllerAdvice extends AbstractAdvice { @@ -14,7 +15,7 @@ public class EventControllerAdvice extends AbstractAdvice { ObjectMapper objectMapper; public EventControllerAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java index 70ad596..8f0342f 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/GlobalAdvice.java @@ -1,11 +1,12 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.TransactionSystemException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class GlobalAdvice extends AbstractAdvice { @@ -13,7 +14,7 @@ public class GlobalAdvice extends AbstractAdvice { ObjectMapper objectMapper; public GlobalAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override diff --git a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java index df6dfd7..88cebee 100644 --- a/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java +++ b/service/src/main/java/org/folio/rest/workflow/controller/advice/WorkflowControllerAdvice.java @@ -1,6 +1,5 @@ package org.folio.rest.workflow.controller.advice; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.EntityNotFoundException; import org.folio.rest.workflow.exception.WorkflowAlreadyActiveException; import org.folio.rest.workflow.exception.WorkflowCreateAlreadyExistsException; @@ -13,6 +12,8 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @RestControllerAdvice public class WorkflowControllerAdvice extends AbstractAdvice { @@ -20,7 +21,7 @@ public class WorkflowControllerAdvice extends AbstractAdvice { ObjectMapper objectMapper; public WorkflowControllerAdvice() { - this.objectMapper = new ObjectMapper(); + this.objectMapper = JsonMapper.builder().build(); } @Override diff --git a/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java b/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java index 916ff0d..c26f877 100644 --- a/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java +++ b/service/src/main/java/org/folio/rest/workflow/model/ExtractedWorkflow.java @@ -1,12 +1,12 @@ package org.folio.rest.workflow.model; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import lombok.Getter; +import tools.jackson.databind.JsonNode; /** * A collection of Workflow Nodes for use during import. diff --git a/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java b/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java index afec275..cea856d 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/AbstractCqlService.java @@ -1,9 +1,9 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.List; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; /** * Provide common CQL-specific service functionality. diff --git a/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java b/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java index 17e8e7d..8f84e63 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/OkapiDiscoveryService.java @@ -2,8 +2,6 @@ import static org.springframework.http.HttpMethod.GET; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -20,6 +18,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; @Service public class OkapiDiscoveryService { @@ -56,7 +56,7 @@ public List getActionsByTenant(String tenant) throws IOException { List actions = new ArrayList<>(); JsonNode modulesNode = getModules(tenant); for (JsonNode moduleNode : modulesNode) { - String id = moduleNode.get("id").asText(); + String id = moduleNode.get("id").asString(); actions.addAll(getActionsByTenantAndModuleId(tenant, id)); } return actions; @@ -81,7 +81,7 @@ public Map> getHandlers(String tenant, String id) throws I if (moduleDescriptorNode.get(PROVIDES) != null) { for (JsonNode interfaceNode : moduleDescriptorNode.get(PROVIDES)) { List handlers = new ArrayList<>(); - String interfaceName = interfaceNode.get(ID).asText(); + String interfaceName = interfaceNode.get(ID).asString(); for (JsonNode handlersNode : interfaceNode.get(HANDLERS)) { handlers.add(objectMapper.readValue(handlersNode.toString(), Handler.class)); } diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java index 01359db..dbb0cea 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowCqlService.java @@ -1,13 +1,13 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.commons.lang3.StringUtils; import org.folio.rest.workflow.model.Workflow; import org.folio.rest.workflow.model.repo.WorkflowRepo; import org.folio.spring.data.OffsetRequest; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @Service public class WorkflowCqlService extends AbstractCqlService { diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java index 155f843..be5a4df 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowEngineService.java @@ -1,9 +1,5 @@ package org.folio.rest.workflow.service; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.Iterator; import lombok.extern.slf4j.Slf4j; import org.folio.rest.workflow.dto.WorkflowDto; @@ -14,7 +10,7 @@ import org.folio.rest.workflow.model.repo.WorkflowRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.restclient.RestTemplateBuilder; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -22,6 +18,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; @Slf4j @Service @@ -121,7 +121,7 @@ public JsonNode start(String workflowId, String tenant, String token, JsonNode c String version = workflow.getVersionTag(); JsonNode definition = fetchDeploymentDefinition(id, version, tenant, token); - String definitionId = definition.get("id").asText(); + String definitionId = definition.get("id").asString(); HttpEntity contextHttpEntity = new HttpEntity<>(context, headers(tenant, token)); @@ -141,7 +141,7 @@ public JsonNode history(String workflowId, String tenant, String token) throws W String version = workflow.getVersionTag(); JsonNode processDefinition = fetchDeploymentDefinition(deploymentId, version, tenant, token); - String processDefinitionId = processDefinition.get("id").asText(); + String processDefinitionId = processDefinition.get("id").asString(); ArrayNode instances = fetchProcessInstanceHistory(processDefinitionId, tenant, token); @@ -149,7 +149,7 @@ public JsonNode history(String workflowId, String tenant, String token) throws W while (iter.hasNext()) { JsonNode instance = iter.next(); - String processInstanceId = instance.get("id").asText(); + String processInstanceId = instance.get("id").asString(); ((ObjectNode) instance).withArray("incidents") .addAll(fetchIncidentsHistory(processInstanceId, tenant, token)); diff --git a/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java b/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java index 82caef6..dcee8a6 100644 --- a/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java +++ b/service/src/main/java/org/folio/rest/workflow/service/WorkflowImportService.java @@ -21,11 +21,6 @@ import static org.folio.rest.workflow.model.ExtractedWorkflow.WORKFLOW_JSON; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.jknack.handlebars.internal.Files; import java.io.BufferedInputStream; import java.io.IOException; @@ -61,6 +56,11 @@ import org.folio.rest.workflow.utility.CompressFileMagic; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeType; +import tools.jackson.databind.node.ObjectNode; @Slf4j @Service @@ -150,8 +150,8 @@ private void collapseNodeScripts(ExtractedWorkflow extracted) throws WorkflowImp continue; } - String scriptFormat = entry.getValue().get(SCRIPT_FORMAT).asText(); - String fileName = entry.getValue().get(CODE).asText(); + String scriptFormat = entry.getValue().get(SCRIPT_FORMAT).asString(); + String fileName = entry.getValue().get(CODE).asString(); String extension = scriptFormat.toLowerCase().trim(); switch (scriptFormat) { @@ -189,7 +189,7 @@ private void collapseNodeScripts(ExtractedWorkflow extracted) throws WorkflowImp * @throws WorkflowImportInvalidOrMissingProperty If a property is missing. */ private boolean collapseNodeScriptsContinue(Entry entry) throws WorkflowImportInvalidOrMissingProperty { - String deserializeAs = entry.getValue().get(DESERIALIZE_AS).asText(); + String deserializeAs = entry.getValue().get(DESERIALIZE_AS).asString(); if (!SCRIPT_TASK.equalsIgnoreCase(deserializeAs)) { return true; } @@ -340,9 +340,9 @@ private void extractSubLevel(String name, InputStream inputStream, ExtractedWork } if (pathParts[0].equalsIgnoreCase(NODES)) { - extracted.getNodes().put(json.get(ID).asText(), json); + extracted.getNodes().put(json.get(ID).asString(), json); } else { - extracted.getTriggers().put(json.get(ID).asText(), json); + extracted.getTriggers().put(json.get(ID).asString(), json); } } @@ -362,7 +362,7 @@ private void expandWorkflow(ExtractedWorkflow extracted) throws JsonProcessingE } JsonNode workflowNode = extracted.getRequired().get(WORKFLOW_JSON); - String workflowId = workflowNode.get(ID).asText(); + String workflowId = workflowNode.get(ID).asString(); // The expandNode() method requires the Workflow to be on the getNodes(), so temporarily add it. extracted.getNodes().put(workflowId, extracted.getRequired().get(WORKFLOW_JSON)); @@ -386,7 +386,7 @@ private void expandWorkflow(ExtractedWorkflow extracted) throws JsonProcessingE * @throws WorkflowImportInvalidOrMissingProperty On invalid property. */ private void expandNode(Map nodes, JsonNode node, List expanded) throws JsonProcessingException, WorkflowImportInvalidOrMissingProperty { - String nodeId = node.get(ID).asText(); + String nodeId = node.get(ID).asString(); if (expanded.contains(nodeId)) { return; } @@ -493,7 +493,7 @@ private void verifyExistence(JsonNode json) throws WorkflowImportException { throw new WorkflowImportInvalidOrMissingProperty(null, ID); } - String id = json.get(ID).asText(); + String id = json.get(ID).asString(); if (workflowRepo.existsById(id)) { throw new WorkflowImportAlreadyImported(id); @@ -539,7 +539,7 @@ private boolean verifyPathParts(String name, String[] pathParts) { */ private void verifyVersion(JsonNode json) { if (json.has(VERSION)) { - String version = json.get(VERSION).asText(); + String version = json.get(VERSION).asString(); if (!VERSION_PATTERN_1_0.matcher(version).find()) { log.warn("Unknown version '{}', attempting import anyway.", version); diff --git a/service/src/main/resources/application.yaml b/service/src/main/resources/application.yaml index fccec1d..dfb80fb 100644 --- a/service/src/main/resources/application.yaml +++ b/service/src/main/resources/application.yaml @@ -15,9 +15,6 @@ server: port: 8081 servlet: context-path: / - encoding: - charset: UTF-8 - enabled: true spring: application.name: mod-workflow @@ -38,6 +35,11 @@ spring: banner-mode: console log-startup-info: true + servlet: + encoding: + charset: UTF-8 + enabled: true + sql: init: #platform: h2 diff --git a/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java index 5f287be..53376f6 100644 --- a/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java +++ b/service/src/test/java/org/folio/rest/workflow/config/JunitHelperWebMvcConfig.java @@ -1,10 +1,11 @@ package org.folio.rest.workflow.config; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.TestConfiguration; import org.springframework.test.context.ActiveProfiles; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; /** * Provide custom web MVC settings for use during unit tests. @@ -15,9 +16,10 @@ public class JunitHelperWebMvcConfig { @Bean ObjectMapper objectMapper() { - final ObjectMapper mapper = new ObjectMapper(); - - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + final ObjectMapper mapper = JsonMapper + .builder() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); return mapper; } diff --git a/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java index fb1107b..0fc8561 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/ActionControllerTest.java @@ -33,7 +33,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -48,7 +47,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.context.bean.override.mockito.MockitoBean; @@ -57,6 +56,7 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.MultiValueMap; +import tools.jackson.databind.ObjectMapper; @WebMvcTest(ActionController.class) @ExtendWith(MockitoExtension.class) diff --git a/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java index 1c33d9a..299410a 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/EventControllerTest.java @@ -24,21 +24,24 @@ import org.folio.spring.tenant.properties.TenantProperties; import org.folio.spring.tenant.resolver.TenantHeaderResolver; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @WebMvcTest(EventController.class) +@ExtendWith(MockitoExtension.class) class EventControllerTest { private MockMvc mockMvc; @@ -118,7 +121,7 @@ static Stream uploadRejected() { arguments("diku", "a", join(separator,"..", "..", "..", "..", "x.txt"))); } - MockHttpServletRequestBuilder upload(String tenant, String dir, String file) throws Exception { + MockMultipartHttpServletRequestBuilder upload(String tenant, String dir, String file) throws Exception { var sampleFile = new MockMultipartFile( "file", file, diff --git a/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java b/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java index faec8eb..24fc251 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/WorkflowControllerTest.java @@ -23,8 +23,11 @@ import static org.folio.spring.test.mock.MockMvcReflection.POST; import static org.folio.spring.test.mock.MockMvcReflection.PUT; import static org.folio.spring.test.mock.MockMvcRequest.appendBody; +import static org.folio.spring.test.mock.MockMvcRequest.appendBodyMultipart; import static org.folio.spring.test.mock.MockMvcRequest.appendHeaders; +import static org.folio.spring.test.mock.MockMvcRequest.appendHeadersMultipart; import static org.folio.spring.test.mock.MockMvcRequest.appendParameters; +import static org.folio.spring.test.mock.MockMvcRequest.appendParametersMultipart; import static org.folio.spring.test.mock.MockMvcRequest.buildArguments1; import static org.folio.spring.test.mock.MockMvcRequest.buildArguments2; import static org.folio.spring.test.mock.MockMvcRequest.invokeRequestBuilder; @@ -43,8 +46,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.lang.reflect.Method; import java.util.List; import java.util.Map; @@ -65,7 +66,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -74,9 +75,12 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMultipartHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; @WebMvcTest(WorkflowController.class) @ExtendWith(MockitoExtension.class) @@ -391,10 +395,10 @@ void importWorkflowsTest(HttpHeaders headers, String contentType, String accept, lenient().when(workflowImportService.importFile(any(Resource.class))).thenReturn(workflow); - MockHttpServletRequestBuilder request = appendHeaders(multipart(PATH_IMPORT).file(exampleFwz), headers, contentType, accept); - request = appendParameters(request, parameters); + MockMultipartHttpServletRequestBuilder request = appendHeadersMultipart(multipart(PATH_IMPORT).file(exampleFwz), headers, contentType, accept); + request = appendParametersMultipart(request, parameters); - MvcResult result = mvc.perform(appendBody(request, body)) + MvcResult result = mvc.perform(appendBodyMultipart(request, body)) .andDo(log()).andExpect(status().is(status)).andReturn(); if (status == 200) { diff --git a/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java b/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java index 71c8443..268c980 100644 --- a/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/controller/advice/AbstractAdviceTest.java @@ -4,30 +4,31 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @ExtendWith(MockitoExtension.class) class AbstractAdviceTest { private static final RuntimeException runtimeException = new RuntimeException("A runtime failure."); - @Mock private ObjectMapper objectMapper; private MockAdvice abstractAdvice; @BeforeEach void beforeEach() { + objectMapper = Mockito.spy(JsonMapper.builder().build()); abstractAdvice = new MockAdvice(); } @@ -40,8 +41,8 @@ void handleBuildErrorWorksTest() { } @Test - void handleBuildErrorThrowsJsonProcessingExceptionTest() throws JsonProcessingException { - when(objectMapper.writeValueAsString(any())).thenThrow(new MockJsonProcessingException()); + void handleBuildErrorThrowsJsonProcessingExceptionTest() throws JacksonException { + when(objectMapper.writeValueAsString(any())).thenThrow(new MockJacksonException()); ResponseEntity response = abstractAdvice.handleException(runtimeException); @@ -69,15 +70,15 @@ public ResponseEntity handleException(RuntimeException ex) { } /** - * Provide a way to throw a type of JsonProcessingException. + * Provide a way to throw a type of JacksonException. * * The JsonProcessingException does not have a public initializer. */ - private class MockJsonProcessingException extends JsonProcessingException { + private class MockJacksonException extends JacksonException { private static final long serialVersionUID = 812355666324245L; - public MockJsonProcessingException() { + public MockJacksonException() { super("mock"); } diff --git a/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java b/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java index e59255e..08a1a0b 100644 --- a/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java +++ b/service/src/test/java/org/folio/rest/workflow/model/ExtractedWorkflowTest.java @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertIterableEquals; -import com.fasterxml.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -14,6 +13,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import tools.jackson.databind.JsonNode; class ExtractedWorkflowTest { diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java index 1d1dff8..2b063e1 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithCustomPropertiesTest.java @@ -3,10 +3,10 @@ import static org.folio.spring.test.mock.MockMvcConstant.VALUE; import static org.junit.jupiter.api.Assertions.assertEquals; -import com.fasterxml.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; import org.springframework.test.context.TestPropertySource; import org.springframework.test.util.ReflectionTestUtils; +import tools.jackson.databind.JsonNode; /** * This runs the OkapiDiscoveryService tests when special application.yml settings need to be tested. diff --git a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java index 3817e70..c297eab 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/OkapiDiscoveryServiceWithDefaultPropertiesTest.java @@ -6,8 +6,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Iterator; import java.util.List; @@ -25,6 +23,8 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; /** * This runs the OkapiDiscoveryService tests for when there is no properly configuration application.yml. diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java index 6a54dbb..5bc605d 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowCqlServiceTest.java @@ -6,8 +6,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; import java.util.ArrayList; import java.util.stream.Stream; @@ -28,6 +26,9 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; @ExtendWith(SpringExtension.class) @ExtendWith(MockitoExtension.class) @@ -56,7 +57,7 @@ static class Config { @Bean ObjectMapper objectMapper() { - return new ObjectMapper(); + return JsonMapper.builder().build(); } } diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java index 8623013..3a2d25d 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowEngineServiceTest.java @@ -16,10 +16,6 @@ import static org.mockito.Mockito.when; import static org.springframework.test.util.ReflectionTestUtils.setField; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; import java.util.concurrent.atomic.AtomicInteger; import org.folio.rest.workflow.dto.WorkflowDto; import org.folio.rest.workflow.dto.WorkflowOperationalDto; @@ -33,13 +29,18 @@ import org.mockito.ArgumentMatchers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.boot.restclient.RestTemplateBuilder; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.web.client.RestTemplate; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; @ExtendWith(SpringExtension.class) @ExtendWith(MockitoExtension.class) @@ -62,7 +63,7 @@ class WorkflowEngineServiceTest { @BeforeEach void beforeEach() { workflowEngineService = new WorkflowEngineService(new RestTemplateBuilder()); - mapper = new ObjectMapper(); + mapper = JsonMapper.builder().build(); workflow = new WorkflowAsDto(); workflow.setId(UUID); diff --git a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java index 8649598..b51d566 100644 --- a/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java +++ b/service/src/test/java/org/folio/rest/workflow/service/WorkflowImportServiceTest.java @@ -7,7 +7,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.compress.compressors.CompressorException; @@ -34,6 +33,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import tools.jackson.databind.ObjectMapper; @ActiveProfiles("test") @SpringJUnitWebConfig({ diff --git a/service/src/test/resources/application.yaml b/service/src/test/resources/application.yaml index e664d61..1e28108 100644 --- a/service/src/test/resources/application.yaml +++ b/service/src/test/resources/application.yaml @@ -19,9 +19,6 @@ server: port: 9101 servlet: context-path: / - encoding: - charset: UTF-8 - enabled: true spring: application.name: mod-workflow @@ -43,6 +40,11 @@ spring: banner-mode: console log-startup-info: true + servlet: + encoding: + charset: UTF-8 + enabled: true + sql: init: platform: h2 From 0de4ace0960074c33108c1084a8c1fe0ac5c0a78 Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Fri, 15 May 2026 10:37:49 -0500 Subject: [PATCH 4/6] Update to use the Spring-Boot 4 supporting spring-module-core 2.2.0-SNAPSHOT. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d11cc2..db5638a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.folio spring-module-core - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT mod-workflow From 887c6b88f14d2188d9ea7874e890420235b4290a Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Fri, 15 May 2026 13:52:04 -0500 Subject: [PATCH 5/6] Update version to distinctly represent the use of Spring-Boot 4 and spring-module-core 2.2.0-SNAPSHOT. --- components/pom.xml | 2 +- pom.xml | 2 +- service/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/pom.xml b/components/pom.xml index 208d465..b45b1a0 100644 --- a/components/pom.xml +++ b/components/pom.xml @@ -5,7 +5,7 @@ org.folio mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT workflow-components diff --git a/pom.xml b/pom.xml index db5638a..ec1b3b3 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT Okapi Workflow Module Okapi workflow module using Spring Boot diff --git a/service/pom.xml b/service/pom.xml index d713a57..b6cb47c 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -5,7 +5,7 @@ org.folio mod-workflow - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT workflow-service From 56ef6313db3b7b8662cca57c9e7b7b5320635f1e Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Fri, 15 May 2026 14:30:38 -0500 Subject: [PATCH 6/6] Also update version in spring-module-core.version to 2.2.0-SNAPSHOT. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec1b3b3..21baf67 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ UTF-8 - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT true