From 3285a8ebd4d4ecb3b9f0118510143208ee0b424a Mon Sep 17 00:00:00 2001 From: Dan Lysiak <50049163+danlysiak@users.noreply.github.com> Date: Tue, 28 Jul 2026 08:55:04 +0100 Subject: [PATCH 1/3] Upgrade to Spring Boot 4 and Jackson 3 --- build.gradle | 149 ++-- lib/applicationinsights.json | 1 + lombok.config | 2 +- .../ccd/datastore/tests/helper/S2SHelper.java | 4 +- .../datastore/tests/helper/idam/IdamApi.java | 11 +- .../tests/helper/idam/IdamHelper.java | 8 +- .../v2/external/GetCaseValidatorTest.java | 8 +- .../hmcts/ccd/WireMockBaseContractTest.java | 29 +- .../CasesControllerProviderTest.java | 15 +- .../CaseAssignedUserRolesProviderTest.java | 4 +- .../pactprovider/cases/CasesProviderTest.java | 61 +- .../resources/application.properties | 20 +- .../hmcts/ccd/ElasticSearchConfiguration.java | 40 +- .../hmcts/ccd/RestTemplateConfiguration.java | 42 +- .../hmcts/ccd/V2HypermediaConfiguration.java | 50 ++ .../appinsights/AppInsightsConfiguration.java | 31 +- .../appinsights/CallbackTelemetryContext.java | 16 - .../CallbackTelemetryThreadContext.java | 21 - .../hmcts/ccd/auditlog/AuditInterceptor.java | 2 +- .../ccd/config/AmDocumentJacksonMixin.java | 36 + .../AppInsightsTracingConfiguration.java | 33 - .../ccd/config/JacksonObjectMapperConfig.java | 31 +- .../uk/gov/hmcts/ccd/config/JacksonUtils.java | 100 ++- .../config/JaywayJsonPathConfigHelper.java | 8 +- .../ccd/config/SwaggerConfiguration.java | 38 +- .../gov/hmcts/ccd/data/JsonDataConverter.java | 19 +- .../uk/gov/hmcts/ccd/data/SecurityUtils.java | 11 +- .../DefaultRoleAssignmentRepository.java | 4 +- .../casedetails/CaseAuditEventEntity.java | 2 +- .../data/casedetails/CaseDetailsEntity.java | 2 +- .../DefaultSupplementaryDataRepository.java | 2 +- .../SupplementaryDataQueryBuilder.java | 9 +- .../SupplementaryDataUserType.java | 9 +- .../DefaultCaseDefinitionRepository.java | 2 +- .../definition/HttpUIDefinitionGateway.java | 4 +- .../documentdata/DocumentDataRequest.java | 4 +- .../ccd/data/draft/DefaultDraftGateway.java | 11 +- .../message/MessageQueueCandidateEntity.java | 2 +- .../ccd/data/user/DefaultUserRepository.java | 2 +- .../client/ServicePersistenceClient.java | 2 +- .../dto/DecentralisedAuditEvent.java | 4 +- .../dto/DecentralisedCaseDetails.java | 4 +- .../dto/DecentralisedCaseEvent.java | 4 +- .../dto/DecentralisedEventDetails.java | 4 +- .../dto/DecentralisedSubmitEventResponse.java | 4 +- ...alisedUpdateSupplementaryDataResponse.java | 6 +- .../jexl/JexlEnablingConditionParser.java | 10 +- .../model/aggregated/CaseUpdateViewEvent.java | 2 +- .../AfterSubmitCallbackResponse.java | 9 +- .../model/callbacks/CallbackResponse.java | 6 +- .../matcher/CaseAccessGroupsMatcher.java | 8 +- .../matcher/LocationMatcher.java | 6 +- .../matcher/RegionMatcher.java | 6 +- .../ccd/domain/model/casedeletion/TTL.java | 4 +- .../casefileview/CategoriesAndDocuments.java | 4 +- .../domain/model/casefileview/Category.java | 4 +- .../domain/model/casefileview/Document.java | 4 +- .../domain/model/caselinking/CaseLink.java | 4 +- .../model/caselinking/CaseLinksResource.java | 4 +- .../model/common/CaseFieldPathUtils.java | 2 +- .../definition/AccessTypeDefinition.java | 4 +- .../definition/AccessTypeRoleDefinition.java | 4 +- .../domain/model/definition/CaseDetails.java | 2 +- .../model/definition/CaseTypeDefinition.java | 8 +- .../model/definition/CategoryDefinition.java | 4 +- .../model/definition/SearchCriteria.java | 4 +- .../domain/model/definition/SearchParty.java | 4 +- .../ccd/domain/model/draft/CaseDraft.java | 2 +- .../hmcts/ccd/domain/model/draft/Draft.java | 2 +- .../model/globalsearch/SearchCriteria.java | 4 +- .../model/globalsearch/SearchPartyValue.java | 4 +- .../model/refdata/BuildingLocation.java | 4 +- .../ccd/domain/model/refdata/CourtVenue.java | 4 +- .../model/refdata/ServiceReferenceData.java | 4 +- .../elasticsearch/ElasticsearchRequest.java | 26 +- .../elasticsearch/SearchResultViewItem.java | 2 +- .../std/AdditionalMessageInformation.java | 2 +- .../ccd/domain/model/std/AuditEvent.java | 2 +- .../ccd/domain/model/std/CaseDataContent.java | 2 +- .../model/std/MessageQueueCandidate.java | 2 +- .../domain/model/std/SupplementaryData.java | 11 +- .../AbstractDefaultGetCaseViewOperation.java | 2 +- ...AuthorisedGetCaseHistoryViewOperation.java | 2 +- .../MergeDataToSearchResultOperation.java | 8 +- .../service/callbacks/CallbackService.java | 7 +- .../DefaultCaseDataAccessControl.java | 5 +- .../casedeletion/TimeToLiveService.java | 8 +- .../CategoriesAndDocumentsService.java | 2 +- .../casefileview/FileViewDocumentService.java | 2 +- .../caselinking/CaseLinkExtractor.java | 4 +- .../caselinking/CaseLinkRetrievalService.java | 6 +- .../GetLinkedCasesResponseCreator.java | 10 +- .../service/common/AccessControlService.java | 17 +- .../common/AccessControlServiceImpl.java | 10 +- .../service/common/CaseAccessGroupUtils.java | 18 +- .../service/common/CaseDataExtractor.java | 2 +- .../service/common/CaseDataService.java | 19 +- .../common/CaseFieldMetadataExtractor.java | 2 +- .../domain/service/common/CaseService.java | 8 +- .../service/common/CaseTypeService.java | 2 +- .../ComplexCaseTypeMetadataExtractor.java | 2 +- .../common/CompoundAccessControlService.java | 26 +- .../common/ConditionalFieldRestorer.java | 15 +- .../common/DefaultObjectMapperService.java | 14 +- .../domain/service/common/NewCaseUtils.java | 13 +- .../service/common/ObjectMapperService.java | 2 +- .../common/SecurityClassificationUtils.java | 8 +- .../common/SecurityValidationService.java | 5 +- .../SimpleCaseTypeMetadataExtractor.java | 2 +- .../AuthorisedCreateCaseOperation.java | 2 +- .../DefaultCreateCaseOperation.java | 2 +- .../AuthorisedCreateEventOperation.java | 4 +- .../createevent/CreateCaseEventService.java | 2 +- .../DefaultCreateEventOperation.java | 5 - .../service/createevent/MidEventCallback.java | 2 +- .../getcasedocument/CaseDocumentService.java | 4 +- .../CaseDocumentTimestampService.java | 19 +- .../getcasedocument/CaseDocumentUtils.java | 12 +- .../GetCaseDocumentOperation.java | 4 +- .../jsonpath/CaseDetailsJsonParser.java | 6 +- .../message/CaseEventMessageService.java | 4 +- .../additionaldata/DataBlockGenerator.java | 27 +- .../additionaldata/PublishableField.java | 2 +- .../processor/CaseViewFieldProcessor.java | 2 +- .../service/processor/FieldProcessor.java | 14 +- .../processor/FieldProcessorService.java | 6 +- .../GlobalSearchProcessorService.java | 6 +- .../date/DateTimeEntryProcessor.java | 17 +- .../processor/date/DateTimeFormatParser.java | 14 +- .../date/DateTimeSearchInputProcessor.java | 3 - .../date/DateTimeSearchResultProcessor.java | 43 +- .../date/DateTimeValueFormatter.java | 27 +- .../search/CaseSearchResultViewGenerator.java | 8 +- .../CrossCaseTypeSearchRequest.java | 7 +- .../ElasticsearchCaseSearchOperation.java | 2 +- .../ElasticsearchQueryHelper.java | 12 +- .../ElasticsearchSortService.java | 13 +- .../elasticsearch/JestToESConverter.java | 4 +- .../dto/ElasticSearchCaseDetailsDTO.java | 6 +- .../AuthorisedCaseSearchOperation.java | 8 +- ...lasticsearchCaseSearchRequestSecurity.java | 6 +- .../global/GlobalSearchQueryBuilder.java | 2 +- .../GlobalSearchResponseTransformer.java | 11 +- .../global/GlobalSearchServiceImpl.java | 2 +- .../ClassifiedStartEventOperation.java | 2 +- .../DefaultStartEventOperation.java | 2 +- .../service/stdapi/CallbackInvoker.java | 2 +- .../service/stdapi/DocumentsOperation.java | 6 +- ...AuthorisedValidateCaseFieldsOperation.java | 2 +- .../service/validate/CaseDataIssueLogger.java | 2 +- .../DefaultValidateCaseFieldsOperation.java | 2 +- .../validate/ValidateCaseFieldsOperation.java | 2 +- .../domain/types/BaseLocationValidator.java | 2 +- .../ccd/domain/types/BaseTypeValidator.java | 6 +- .../ccd/domain/types/CaseDataValidator.java | 2 +- .../ccd/domain/types/CollectionValidator.java | 12 +- .../domain/types/CustomNumberValidator.java | 4 +- .../ccd/domain/types/DateTimeValidator.java | 13 +- .../hmcts/ccd/domain/types/DateValidator.java | 9 +- .../ccd/domain/types/DocumentValidator.java | 8 +- .../domain/types/DynamicListValidator.java | 8 +- .../DynamicMultiSelectListValidator.java | 6 +- .../ccd/domain/types/EmailValidator.java | 4 +- .../ccd/domain/types/FixedListValidator.java | 4 +- .../ccd/domain/types/MoneyGBPValidator.java | 4 +- .../types/MultiSelectListValidator.java | 5 +- .../ccd/domain/types/NumberValidator.java | 4 +- .../OrgPolicyCaseAssignedRoleValidator.java | 6 +- .../ccd/domain/types/PhoneUKValidator.java | 4 +- .../ccd/domain/types/PostCodeValidator.java | 6 +- .../ccd/domain/types/RegionValidator.java | 2 +- .../TextCaseReferenceCaseLinkValidator.java | 4 +- .../hmcts/ccd/domain/types/TextValidator.java | 6 +- .../ccd/domain/types/ValidationContext.java | 2 +- .../ccd/domain/types/YesNoValidator.java | 9 +- .../domain/types/sanitiser/CaseSanitiser.java | 2 +- .../types/sanitiser/CollectionSanitiser.java | 14 +- .../types/sanitiser/ComplexSanitiser.java | 10 +- .../types/sanitiser/DocumentSanitiser.java | 16 +- .../ccd/domain/types/sanitiser/Sanitiser.java | 2 +- .../ccd/endpoint/std/CaseDetailsEndpoint.java | 2 +- ...ignHttpMessageConvertersConfiguration.java | 28 + .../gov/hmcts/ccd/util/ClientContextUtil.java | 13 +- .../external/resource/CaseDataResource.java | 2 +- .../v2/external/resource/CaseResource.java | 2 +- src/main/resources/application.properties | 22 +- .../ccd/AbstractBaseIntegrationTest.java | 30 +- .../gov/hmcts/ccd/ElasticsearchBaseTest.java | 19 +- .../uk/gov/hmcts/ccd/ElasticsearchIT.java | 91 ++- .../hmcts/ccd/GlobalSearchTestFixture.java | 10 +- .../ccd/RestTemplateConfigurationIT.java | 2 + .../ccd/RestTemplateConfigurationTest.java | 37 +- .../uk/gov/hmcts/ccd/TestConfiguration.java | 5 +- .../java/uk/gov/hmcts/ccd/TestFixtures.java | 21 +- .../uk/gov/hmcts/ccd/WireMockBaseTest.java | 92 ++- .../AppInsightsConfigurationTest.java | 71 ++ .../config/JacksonObjectMapperConfigTest.java | 68 +- .../hmcts/ccd/config/JacksonUtilsTest.java | 78 +- .../ccd/data/AbstractReferenceDataIT.java | 2 +- .../hmcts/ccd/data/JsonDataConverterTest.java | 16 +- .../DefaultCaseDetailsRepositoryTest.java | 42 +- .../DelegatingCaseDetailsRepositoryTest.java | 12 +- .../SupplementaryDataUserTypeTest.java | 4 +- .../data/draft/DefaultDraftGatewayTest.java | 30 +- .../message/MessageCandidateMapperTest.java | 8 +- .../DefinitionBlockGeneratorTest.java | 9 +- .../CasePointerRepositoryTest.java | 8 +- .../client/ServicePersistenceClientTest.java | 14 +- .../jexl/JexlEnablingConditionParserTest.java | 22 +- .../aggregated/CaseViewFieldBuilderTest.java | 22 +- .../matcher/CaseAccessGroupsMatcherTest.java | 39 +- .../definition/AccessControlListTest.java | 17 +- .../model/definition/CaseDetailsTest.java | 10 +- .../definition/CaseTypeDefinitionTest.java | 28 +- ...DraftResponseToCaseDetailsBuilderTest.java | 10 +- .../JurisdictionDefinitionTest.java | 32 +- .../RoleToAccessProfileDefinitionTest.java | 32 +- .../SearchResultDefinitionTest.java | 34 +- .../model/definition/WizardPageTest.java | 32 +- .../model/lau/CaseActionPostRequestTest.java | 27 +- .../model/lau/CaseSearchPostRequestTest.java | 35 +- .../ElasticsearchRequestTest.java | 44 +- .../model/std/SupplementaryDataTest.java | 15 +- .../accessprofile/filter/BaseFilter.java | 4 +- ...leAssignmentsFilteringServiceImplTest.java | 9 +- ...uthorisedGetEventTriggerOperationTest.java | 21 +- .../service/aggregated/CaseDetailsUtil.java | 6 +- .../CaseSearchResultViewGeneratorTest.java | 31 +- .../CaseSearchesViewAccessControlTest.java | 9 +- .../CaseUpdateViewEventBuilderTest.java | 2 +- ...efaultGetCaseHistoryViewOperationTest.java | 8 +- ...aultGetCaseViewFromDraftOperationTest.java | 10 +- .../DefaultGetCaseViewOperationTest.java | 8 +- .../MergeDataToSearchResultOperationTest.java | 43 +- .../service/aggregated/SearchResultUtil.java | 8 +- .../CallbackInvokerWireMockTest.java | 2 +- .../callbacks/CallbackServiceTest.java | 14 +- .../CallbackServiceWireMockTest.java | 13 +- .../DefaultCaseDataAccessControlTest.java | 24 +- .../casedeletion/TimeToLiveServiceTest.java | 16 +- .../CategoriesAndDocumentsServiceTest.java | 2 +- .../FileViewDocumentServiceTest.java | 2 +- .../caselinking/CaseLinkExtractorTest.java | 26 +- .../CaseLinkMigrationServiceTest.java | 2 +- .../CaseLinkRetrievalServiceTest.java | 4 +- .../CaseLinkServiceExternalDbDeadlockIT.java | 2 +- .../caselinking/CaseLinkTestFixtures.java | 8 +- .../GetLinkedCasesResponseCreatorTest.java | 21 +- ...actBaseCaseFieldMetadataExtractorTest.java | 2 +- .../common/AccessControlServiceTest.java | 43 +- .../common/CaseAccessGroupUtilsTest.java | 17 +- .../service/common/CaseDataExtractorTest.java | 2 +- .../service/common/CaseDataServiceTest.java | 6 +- .../service/common/CaseServiceTest.java | 39 +- .../service/common/CaseTypeServiceTest.java | 2 +- .../ComplexCaseTypeMetadataExtractorTest.java | 2 +- .../CompoundAccessControlServiceTest.java | 4 +- .../common/ConditionalFieldRestorerTest.java | 717 +++++++++--------- .../DefaultObjectMapperServiceTest.java | 29 +- .../SecurityClassificationServiceTest.java | 8 +- .../common/SecurityValidationServiceTest.java | 8 +- .../SimpleCaseTypeMetadataExtractorTest.java | 2 +- .../service/common/TestBuildersUtil.java | 12 +- .../AuthorisedCreateCaseOperationTest.java | 7 +- .../DefaultCreateCaseOperationTest.java | 9 +- ...mitCaseTransactionCaseAccessGroupTest.java | 40 +- .../SubmitCaseTransactionNewCaseTest.java | 42 +- .../createcase/SubmitCaseTransactionTest.java | 14 +- .../AuthorisedCreateEventOperationTest.java | 21 +- ...teCaseEventServiceSupplementaryDataIT.java | 22 +- .../CreateCaseEventServiceTest.java | 39 +- .../DefaultCreateEventOperationTest.java | 2 +- .../createevent/MidEventCallbackTest.java | 13 +- .../SynchronisedCaseProcessorIT.java | 12 +- .../AuthorisedGetCaseOperationTest.java | 8 +- .../CaseDocumentMetadataMapperTest.java | 2 +- .../CaseDocumentServiceTest.java | 2 +- .../CaseDocumentTimestampServiceTest.java | 44 +- .../CaseDocumentUtilsTest.java | 2 +- .../GetCaseDocumentsOperationTest.java | 8 +- .../globalsearch/GlobalSearchParserTest.java | 23 +- .../jsonpath/CaseDetailsJsonParserTest.java | 6 +- .../lau/AuditCaseRemoteOperationIT.java | 18 +- .../lau/AuditCaseRemoteOperationTest.java | 4 +- .../message/CaseEventMessageServiceTest.java | 4 +- .../DataBlockGeneratorTest.java | 84 +- .../processor/DateTimeEntryProcessorTest.java | 47 +- .../processor/FieldProcessorServiceTest.java | 13 +- .../GlobalSearchProcessorServiceTest.java | 113 +-- .../date/DateTimeFormatParserTest.java | 27 +- .../DateTimeSearchResultProcessorTest.java | 70 +- .../date/DateTimeValueFormatterTest.java | 117 +-- .../search/AuthorisedSearchOperationTest.java | 8 +- .../elasticsearch/CaseSearchRequestTest.java | 7 +- .../CrossCaseTypeSearchRequestTest.java | 11 +- .../ElasticsearchCaseSearchOperationTest.java | 6 +- .../ElasticsearchQueryHelperTest.java | 29 +- .../ElasticsearchSortServiceTest.java | 19 +- .../elasticsearch/JestToESConverterTest.java | 17 +- .../AuthorisedCaseSearchOperationTest.java | 18 +- ...searchCaseSearchRequestSecurityRATest.java | 4 +- ...icsearchCaseSearchRequestSecurityTest.java | 25 +- .../global/GlobalSearchQueryBuilderTest.java | 11 +- .../GlobalSearchResponseTransformerTest.java | 2 +- .../global/GlobalSearchServiceImplTest.java | 22 +- .../AuthorisedStartEventOperationTest.java | 8 +- .../DefaultStartEventOperationTest.java | 30 +- .../service/stdapi/CallbackInvokerTest.java | 42 +- ...tSupplementaryDataUpdateOperationTest.java | 9 +- ...gSupplementaryDataUpdateOperationTest.java | 4 +- .../DefaultUpsertDraftOperationTest.java | 2 +- ...orisedValidateCaseFieldsOperationTest.java | 38 +- .../validate/CaseDataIssueLoggerTest.java | 9 +- ...efaultValidateCaseFieldsOperationTest.java | 20 +- .../types/BaseLocationValidatorTest.java | 29 +- .../domain/types/CaseDataValidatorTest.java | 10 +- .../domain/types/CollectionValidatorTest.java | 5 +- .../types/CustomNumberValidatorTest.java | 12 +- .../domain/types/DateTimeValidatorTest.java | 67 +- .../ccd/domain/types/DateValidatorTest.java | 63 +- .../domain/types/DocumentValidatorTest.java | 17 +- .../types/DynamicListValidatorTest.java | 19 +- .../DynamicMultiSelectListValidatorTest.java | 12 +- .../types/DynamicRadioListValidatorTest.java | 12 +- .../ccd/domain/types/EmailValidatorTest.java | 36 +- .../domain/types/FixedListValidatorTest.java | 12 +- .../types/FixedRadioListValidatorTest.java | 6 +- .../ccd/domain/types/IVallidatorTest.java | 7 +- .../domain/types/MoneyGBPValidatorTest.java | 24 +- .../types/MultiSelectListValidatorTest.java | 10 +- .../ccd/domain/types/NumberValidatorTest.java | 34 +- ...rgPolicyCaseAssignedRoleValidatorTest.java | 12 +- .../domain/types/PhoneUKValidatorTest.java | 30 +- .../domain/types/PostCodeValidatorTest.java | 32 +- .../ccd/domain/types/RegionValidatorTest.java | 29 +- .../domain/types/TextAreaValidatorTest.java | 18 +- ...extCaseReferenceCaseLinkValidatorTest.java | 16 +- .../ccd/domain/types/TextValidatorTest.java | 31 +- .../domain/types/ValidationContextTest.java | 6 +- .../ccd/domain/types/YesNoValidatorTest.java | 16 +- .../types/sanitiser/CaseSanitiserTest.java | 10 +- .../sanitiser/CollectionSanitiserTest.java | 20 +- .../types/sanitiser/ComplexSanitiserTest.java | 16 +- .../sanitiser/DocumentSanitiserTest.java | 18 +- .../DocumentManagementRestClientTest.java | 23 +- .../sanitiser/client/StubServerDependent.java | 13 - .../hmcts/ccd/endpoint/std/CallbackTest.java | 6 +- .../endpoint/std/CaseAccessEndpointIT.java | 2 +- .../endpoint/std/CaseDetailsEndpointIT.java | 191 ++--- .../std/CaseDetailsEndpointPostStateIT.java | 4 +- .../endpoint/std/CaseDetailsEndpointTest.java | 9 +- .../std/CaseDetailsEndpointUserRolesIT.java | 9 +- .../endpoint/std/CaseSearchEndpointIT.java | 4 +- .../endpoint/std/CaseSearchEndpointTest.java | 20 +- .../std/DecentralisedPersistenceIT.java | 35 +- .../ccd/endpoint/std/DraftsEndpointIT.java | 2 +- .../endpoint/std/GlobalSearchEndpointIT.java | 6 +- .../hmcts/ccd/endpoint/ui/CallbackTest.java | 6 +- .../ccd/endpoint/ui/ExternalUserRoleIT.java | 14 +- .../ccd/endpoint/ui/QueryEndpointIT.java | 20 +- ...ttpMessageConvertersConfigurationTest.java | 57 ++ .../integrations/DefinitionsCachingIT.java | 14 +- .../uk/gov/hmcts/ccd/integrations/IdamIT.java | 2 +- .../ccd/integrations/ServiceToServiceIT.java | 2 +- .../ccd/test/ElasticsearchIndexSettings.java | 12 +- .../ccd/test/ElasticsearchTestHelper.java | 2 +- ...BaseCaseAssignedUserRolesControllerIT.java | 2 - .../controller/CaseControllerDCPIT.java | 48 +- .../controller/CaseControllerEventsIT.java | 2 - .../controller/CaseControllerTest.java | 22 +- .../controller/CaseControllerTestIT.java | 21 +- .../CaseDataValidatorControllerDCPIT.java | 23 +- .../CaseDataValidatorControllerTest.java | 10 +- .../controller/CaseDocumentControllerIT.java | 33 +- .../CaseFileViewControllerTestIT.java | 5 - .../controller/CaseUserControllerIT.java | 10 +- .../controller/DocumentControllerITest.java | 12 +- .../GetCaseAssignedUserRolesControllerIT.java | 9 + ...archCaseAssignedUserRolesControllerIT.java | 9 + .../StartEventControllerCaseRolesIT.java | 4 +- .../controller/StartEventControllerIT.java | 2 - .../controller/StartEventControllerTest.java | 10 +- .../resource/CaseDataResourceTest.java | 15 +- .../external/resource/CaseResourceTest.java | 8 +- .../UICaseControllerCaseRolesIT.java | 22 +- .../controller/UICaseControllerDCPIT.java | 2 - .../UICaseControllerGetCaseCallbackIT.java | 2 - .../UICaseSearchControllerTest.java | 14 +- .../controller/UIDefinitionControllerIT.java | 2 - .../UIStartTriggerControllerDCPIT.java | 2 - .../controller/UIUserProfileControllerIT.java | 2 - .../config/WireMockTestConfiguration.java | 19 - src/test/resources/test.properties | 1 - web.config | 2 +- 394 files changed, 3571 insertions(+), 3071 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/ccd/V2HypermediaConfiguration.java delete mode 100644 src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryContext.java delete mode 100644 src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryThreadContext.java create mode 100644 src/main/java/uk/gov/hmcts/ccd/config/AmDocumentJacksonMixin.java delete mode 100644 src/main/java/uk/gov/hmcts/ccd/config/AppInsightsTracingConfiguration.java create mode 100644 src/main/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfiguration.java create mode 100644 src/test/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfigurationTest.java create mode 100644 src/test/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfigurationTest.java delete mode 100644 src/test/java/uk/gov/hmcts/ccd/wiremock/config/WireMockTestConfiguration.java diff --git a/build.gradle b/build.gradle index 7244fea4a0..240749422b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id 'jacoco' id 'idea' id 'eclipse' - id 'org.springframework.boot' version '3.5.14' + id 'org.springframework.boot' version '4.0.7' id 'com.github.ben-manes.versions' version '0.54.0' id 'io.spring.dependency-management' version '1.1.7' id 'org.sonarqube' version '7.3.0.8198' @@ -14,9 +14,9 @@ plugins { id 'com.github.spacialcircumstances.gradle-cucumber-reporting' version '0.1.25' id 'org.jetbrains.gradle.plugin.idea-ext' version '1.4.1' id 'info.solidsoft.pitest' version '1.19.0' - id 'uk.gov.hmcts.java' version '0.12.68' + id 'uk.gov.hmcts.java' version '0.12.70' id 'au.com.dius.pact' version '4.7.1' - id 'org.jsonschema2pojo' version '1.2.2' + id 'org.jsonschema2pojo' version '1.3.3' id 'org.owasp.dependencycheck' version '12.2.1' } @@ -25,24 +25,18 @@ def versions = [ ] ext { - set('springCloudVersion', '2025.1.1') - set('spring-framework.version', '6.2.14') - set('spring-security.version', '6.5.7') - set('log4j2.version', '2.24.3') - set('jacksonVersion', '2.19.2') - set('snakeyaml.version', '2.2') - junit = '5.14.4' - junitPlatform = '1.14.4' + set('springCloudVersion', '2025.1.2') jjwt = '0.13.0' - appInsightsVersion = '2.6.4' + appInsightsVersion = '3.7.9' + jackson2AatVersion = '2.19.4' pactProviderVersion = '4.7.1' lombokVersion = '1.18.46' lombokBindingVersion = '0.2.0' mockito = '5.21.0' elasticVersion = '9.4.4' - testContainersVersion = '2.0.5' cucumber = '7.34.6' - beftaFwVersion = '9.2.7' + restAssuredVersion = '6.0.1' + beftaFwVersion = '9.2.8-rc1' ccdTestDefinitionVersion = '7.26.7' limits = [ 'instruction': 90, @@ -187,11 +181,15 @@ configurations { } } +// BEFTA still references PropertyNamingStrategy.SnakeCaseStrategy, removed in Jackson 2.20. +// Keep this compatibility constraint isolated from the Boot 4 application runtime. configurations.matching { it.name in ['aatCompileClasspath', 'aatRuntimeClasspath', 'cucumberRuntime'] }.configureEach { resolutionStrategy.eachDependency { details -> - if (details.requested.group?.startsWith('com.fasterxml.jackson')) { - details.useVersion jacksonVersion - details.because 'BEFTA 9.2.x still references PropertyNamingStrategy$SnakeCaseStrategy, removed in Jackson 2.20' + def isSharedJacksonAnnotation = details.requested.group == 'com.fasterxml.jackson.core' + && details.requested.name == 'jackson-annotations' + if (details.requested.group?.startsWith('com.fasterxml.jackson') && !isSharedJacksonAnnotation) { + details.useVersion jackson2AatVersion + details.because 'BEFTA 9.2.8-rc1 requires the Jackson 2.19 naming-strategy compatibility class' } } } @@ -219,45 +217,24 @@ task integration(type: Test) { failFast = true } -ext.libraries = [ - junit5: [ - "org.junit.jupiter:junit-jupiter-api:${junit}", - "org.junit.jupiter:junit-jupiter-engine:${junit}", - "org.junit.jupiter:junit-jupiter-params:${junit}", - "org.junit.platform:junit-platform-commons:${junitPlatform}", - "org.junit.platform:junit-platform-engine:${junitPlatform}", - "org.junit.platform:junit-platform-launcher:${junitPlatform}", - "org.apiguardian:apiguardian-api:1.1.2" - ] -] - dependencies { + implementation platform("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}") + // start::CVE Vulnerability dependency overrides // MAIN PARENT DEPENDEDNCY - implementation group: 'com.auth0', name: 'java-jwt', version: '4.5.2' implementation group: 'com.google.code.gson', name: 'gson', version: '2.13.2' // java-property-to-json implementation group: 'com.google.guava', name: 'guava', version: '33.5.0-jre' // java-property-to-json - implementation group: 'com.jayway.jsonpath', name: 'json-path', version: '2.10.0' // spring-hateoas + implementation group: 'com.jayway.jsonpath', name: 'json-path', version: '3.0.0' // spring-hateoas implementation group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '10.7' // spring-security-oauth2-jose - runtimeOnly group: 'com.zaxxer', name: 'HikariCP', version: '6.3.3' // spring-boot-starter-data-jpa - implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.17' - implementation group: 'ch.qos.logback', name: 'logback-core', version: '1.5.27' // applicationinsights-logging-logback - implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.5.27' // applicationinsights-logging-logback implementation group: 'commons-beanutils', name: 'commons-beanutils', version: '1.11.0' // commons-validator - implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.6.0' // feign-form-spring implementation group: 'commons-io', name: 'commons-io', version: '2.21.0' // spring-cloud-starter-openfeign - implementation group: 'io.github.openfeign', name: 'feign-httpclient', version: '13.12' // spring-cloud-starter-openfeign - implementation group: 'io.github.openfeign', name: 'feign-jackson', version: '13.12' // service-auth-provider-java-client - implementation group: 'io.github.openfeign.form', name: 'feign-form-spring', version: '3.8.0' // spring-cloud-starter-openfeign + aatImplementation group: 'io.github.openfeign', name: 'feign-gson' // AAT helpers implementation group: 'jakarta.inject', name: 'jakarta.inject-api', version: '2.0.1' // spring-boot-starter-data-jpa - implementation group: 'jakarta.persistence', name: 'jakarta.persistence-api', version: '3.1.0' // spring-boot-starter-data-jpa (held at 3.1.0 due to methods with same signature getSchemaManager()) implementation group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.1.0' // service-auth-provider-java-client implementation group: 'net.minidev', name: 'json-smart', version: '2.6.0' // spring-security-oauth2-client implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.20.0' // java-property-to-json - implementation group: 'org.hibernate.orm', name: 'hibernate-core', version: '6.6.42.Final' // spring-boot-starter-data-jpa - - testImplementation group: 'io.rest-assured', name: 'rest-assured', version: '5.5.7' // ccd-test-definitions + testImplementation group: 'io.rest-assured', name: 'rest-assured', version: restAssuredVersion // ccd-test-definitions testImplementation group: 'org.json', name: 'json', version: '20250107' // ccd-test-definitions testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.27.7' // spring-cloud-starter-contract-stub-runner testImplementation group: 'org.mockito', name: 'mockito-core', version: mockito // spring-cloud-starter-contract-stub-runner @@ -277,44 +254,40 @@ dependencies { // Spring implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-aspectj' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa' - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-flyway' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-hateoas' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jackson' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-restclient' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webmvc' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc' - implementation group: 'org.springframework.boot', name: 'spring-boot-starter-oauth2-resource-server' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security-oauth2-client' + implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security-oauth2-resource-server' implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign' - implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '4.3.2' - implementation group: 'org.springframework.hateoas', name: 'spring-hateoas' + implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer' implementation group: 'org.springframework.plugin', name: 'spring-plugin-core' implementation group: 'org.springframework.retry', name: 'spring-retry' - implementation group: 'org.springframework.security', name: 'spring-security-oauth2-client' - implementation group: 'org.springframework.security', name: 'spring-security-oauth2-resource-server' - implementation group: 'org.springframework.security', name: 'spring-security-oauth2-core' - implementation group: 'org.springframework.security', name: 'spring-security-oauth2-jose' - implementation group: 'org.springframework.security', name: 'spring-security-core' - implementation group: 'org.springframework.security', name: 'spring-security-config' - implementation group: 'org.springframework.security', name: 'spring-security-web' - implementation group: 'org.springframework.security', name: 'spring-security-crypto' - implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '2.8.17' + implementation group: 'org.springdoc', name: 'springdoc-openapi-starter-webmvc-ui', version: '3.0.3' // HMCTS - implementation group: 'com.github.hmcts', name: 'service-auth-provider-java-client', version: '5.3.4' - implementation group: 'com.github.hmcts', name: 'idam-java-client', version: '3.0.5' - implementation group: 'com.github.hmcts', name: 'ccd-case-document-am-client', version: '1.59.2' + implementation group: 'com.github.hmcts', name: 'service-auth-provider-java-client', version: '6.0.1' + implementation group: 'com.github.hmcts', name: 'idam-java-client', version: '4.0.0' + implementation(group: 'com.github.hmcts', name: 'ccd-case-document-am-client', version: '1.60.0') { + exclude group: 'com.fasterxml.jackson.module', module: 'jackson-module-parameter-names' + } implementation group: 'com.github.hmcts.java-logging', name: 'logging', version: '8.0.0' - implementation group: 'com.auth0', name: 'java-jwt', version: '4.5.2' implementation group: 'com.google.guava', name: 'guava', version: '33.6.0-jre' implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '3.2.4' - implementation group: 'com.microsoft.azure', name: 'applicationinsights-logging-logback', version: appInsightsVersion - implementation group: 'com.microsoft.azure', name: 'applicationinsights-spring-boot-starter', version: appInsightsVersion + implementation group: 'com.microsoft.azure', name: 'applicationinsights-core', version: appInsightsVersion implementation group: 'com.sun.mail', name: 'mailapi', version: '2.0.2' - implementation group: 'com.vladmihalcea', name: 'hibernate-types-60', version: '2.21.1' implementation group: 'commons-validator', name: 'commons-validator', version: '1.10.1' implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: jjwt implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: jjwt - implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: jjwt + implementation group: 'io.jsonwebtoken', name: 'jjwt-gson', version: jjwt implementation group: 'io.searchbox', name: 'jest', version: '6.3.1' implementation group: 'io.vavr', name: 'vavr', version: '0.11.0' implementation group: 'jakarta.inject', name: 'jakarta.inject-api', version: '2.0.1' @@ -329,11 +302,7 @@ dependencies { implementation group: 'co.elastic.clients', name: 'elasticsearch-java', version: elasticVersion implementation group: 'org.elasticsearch.client', name: 'elasticsearch-rest-client', version: elasticVersion -// implementation "com.fasterxml.jackson.core:jackson-core:$jacksonVersion" -// implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonVersion" -// implementation "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion" - - implementation group: 'org.flywaydb', name: 'flyway-core', version: '8.5.13' + runtimeOnly group: 'org.flywaydb', name: 'flyway-database-postgresql' implementation group: 'org.jooq', name: 'jool-java-8', version: '0.9.15' implementation group: 'org.mapstruct', name: 'mapstruct', version: '1.6.3' implementation group: 'pl.jalokim.propertiestojson', name: 'java-properties-to-json', version: '5.3.0' @@ -343,28 +312,34 @@ dependencies { runtimeOnly group: 'org.postgresql', name: 'postgresql', version: '42.7.11' // TEST DEPENDENCIES - testImplementation libraries.junit5 + testImplementation enforcedPlatform('org.junit:junit-bom:6.0.3') testImplementation libs.mockito mockitoAgent(libs.mockito) { transitive = false } testImplementation group: 'com.xebialabs.restito', name: 'restito', version: '1.1.2' - testImplementation group: 'io.rest-assured', name: 'rest-assured', version: '5.5.7' + testImplementation group: 'io.rest-assured', name: 'rest-assured', version: restAssuredVersion testImplementation group: 'org.assertj', name: 'assertj-vavr', version: '0.5.1' - testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' - testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '4.3.3' - testImplementation group: 'org.testcontainers', name: 'testcontainers', version: testContainersVersion - testImplementation group: 'org.testcontainers', name: 'testcontainers-postgresql', version: testContainersVersion - testImplementation group: 'org.testcontainers', name: 'testcontainers-elasticsearch', version: testContainersVersion + testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator-test' + testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa-test' + testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-restclient-test' + testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-security-test' + testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-webmvc-test' + testImplementation group: 'org.testcontainers', name: 'testcontainers' + testImplementation group: 'org.testcontainers', name: 'testcontainers-postgresql' + testImplementation group: 'org.testcontainers', name: 'testcontainers-elasticsearch' + testImplementation group: 'org.wiremock.integrations', name: 'wiremock-spring-boot', version: '4.2.1' + // Gradle's test launcher must be aligned with Boot 4's JUnit 6 engine. + testRuntimeOnly group: 'org.junit.platform', name: 'junit-platform-launcher' testImplementation group: 'org.openid4java', name: 'openid4java', version: '1.0.0' // for sonar analysis testImplementation group: 'com.github.hmcts', name: 'ccd-test-definitions', version: ccdTestDefinitionVersion testImplementation(group: 'com.github.hmcts', name: 'befta-fw', version: beftaFwVersion) { exclude group: 'commons-logging', module: 'commons-logging' + exclude group: 'org.springframework.boot' + exclude group: 'org.springframework.cloud' } testImplementation group: 'com.github.hmcts', name: 'fortify-client', version: '1.4.10', classifier: 'all' - testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock:4.3.3' - contractTestImplementation group: 'au.com.dius.pact.provider', name: 'junit5', version: pactProviderVersion contractTestImplementation group: 'au.com.dius.pact.provider', name: 'spring', version: pactProviderVersion contractTestImplementation group: 'au.com.dius.pact.provider', name: 'junit5spring', version: pactProviderVersion @@ -377,12 +352,6 @@ dependencies { } // end::dependencies[] -dependencyManagement { - imports { - mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" - } -} - publishing { repositories { maven { @@ -534,14 +503,14 @@ jsonSchema2Pojo { // Whether to include a toString method in generated Java types. includeToString = true - // The style of annotations to use in the generated Java types. Supported values: - // - jackson (alias of jackson2) - // - jackson2 (apply annotations from the Jackson 2.x library) + // The style of annotations to use in the generated Java types. Supported values include: + // - jackson3 (apply Jackson 3 annotations) + // - jackson2 (apply Jackson 2 annotations) // - jackson1 (apply annotations from the Jackson 1.x library) // - gson (apply annotations from the Gson library) // - moshi1 (apply annotations from the Moshi 1.x library) // - none (apply no annotations at all) - annotationStyle = 'jackson' + annotationStyle = 'jackson3' // A fully qualified class name, referring to a custom annotator class that implements // org.jsonschema2pojo.Annotator and will be used in addition to the one chosen @@ -590,10 +559,6 @@ jsonSchema2Pojo { formatDates = true formatTimes = true - // Whether to use commons-lang 3.x imports instead of commons-lang 2.x imports when adding equals, - // hashCode and toString methods. - useCommonsLang3 = false - // Whether to initialize Set and List fields as empty collections, or leave them as null. initializeCollections = true diff --git a/lib/applicationinsights.json b/lib/applicationinsights.json index 88ff5ee711..de26c4019f 100644 --- a/lib/applicationinsights.json +++ b/lib/applicationinsights.json @@ -1,5 +1,6 @@ { "connectionString": "${file:/mnt/secrets/ccd/app-insights-connection-string}", + "connectionStringConfiguredAtRuntime": true, "role": { "name": "ccd-data-store-api" }, diff --git a/lombok.config b/lombok.config index e4e935d15b..82ea713e10 100644 --- a/lombok.config +++ b/lombok.config @@ -1,3 +1,3 @@ config.stopBubbling = true lombok.addLombokGeneratedAnnotation = true -lombok.jacksonized.jacksonVersion += 2 +lombok.jacksonized.jacksonVersion += 3 diff --git a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/S2SHelper.java b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/S2SHelper.java index a8e61c126a..a82a682dbb 100644 --- a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/S2SHelper.java +++ b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/S2SHelper.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.datastore.tests.helper; import feign.Feign; -import feign.jackson.JacksonEncoder; +import feign.gson.GsonEncoder; import org.springframework.cloud.openfeign.support.SpringMvcContract; import uk.gov.hmcts.reform.authorisation.ServiceAuthorisationApi; import uk.gov.hmcts.reform.authorisation.generators.ServiceAuthTokenGenerator; @@ -12,7 +12,7 @@ public class S2SHelper { public S2SHelper(final String s2sUrl, final String secret, final String microservice) { final ServiceAuthorisationApi serviceAuthorisationApi = Feign.builder() - .encoder(new JacksonEncoder()) + .encoder(new GsonEncoder()) .contract(new SpringMvcContract()) .target(ServiceAuthorisationApi.class, s2sUrl); diff --git a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamApi.java b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamApi.java index ef0187579d..5da9f507f6 100644 --- a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamApi.java +++ b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamApi.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.datastore.tests.helper.idam; -import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; import feign.Body; import feign.Headers; import feign.Param; @@ -33,7 +33,7 @@ TokenExchangeResponse exchangeCode(@Param("code") String code, IdamUser getUser(@Param("access_token") String accessToken); class AuthenticateUserResponse { - @JsonProperty("code") + @SerializedName("code") private String code; public String getCode() { @@ -43,7 +43,7 @@ public String getCode() { class TokenExchangeResponse { - @JsonProperty("access_token") + @SerializedName("access_token") private String accessToken; public String getAccessToken() { @@ -52,10 +52,10 @@ public String getAccessToken() { } class IdamUser { - @JsonProperty("uid") + @SerializedName("uid") private String uid; - @JsonProperty("roles") + @SerializedName("roles") private List roles; public String getUid() { @@ -67,4 +67,3 @@ public List getRoles() { } } } - diff --git a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamHelper.java b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamHelper.java index 5616d34ea8..72ff33a362 100644 --- a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamHelper.java +++ b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/helper/idam/IdamHelper.java @@ -5,8 +5,8 @@ import java.util.Map; import feign.Feign; -import feign.jackson.JacksonDecoder; -import feign.jackson.JacksonEncoder; +import feign.gson.GsonDecoder; +import feign.gson.GsonEncoder; public class IdamHelper { @@ -21,8 +21,8 @@ public class IdamHelper { public IdamHelper(String idamBaseUrl, OAuth2 oauth2) { idamApi = Feign.builder() - .encoder(new JacksonEncoder()) - .decoder(new JacksonDecoder()) + .encoder(new GsonEncoder()) + .decoder(new GsonDecoder()) .target(IdamApi.class, idamBaseUrl); this.oauth2 = oauth2; } diff --git a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/v2/external/GetCaseValidatorTest.java b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/v2/external/GetCaseValidatorTest.java index f0b1f1d3bf..599c72f7ed 100644 --- a/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/v2/external/GetCaseValidatorTest.java +++ b/src/aat/java/uk/gov/hmcts/ccd/datastore/tests/v2/external/GetCaseValidatorTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import java.util.function.Supplier; @@ -37,7 +37,7 @@ class StartCaseTrigger { @Test @DisplayName("should get 422 when event not provided") - void should422WhenEventNotProvided() throws JsonProcessingException { + void should422WhenEventNotProvided() throws JacksonException { callCaseDataValidate(INVALID_CASE_TYPE_ID, getBody(null)) .when() .post("/case-types/{caseTypeId}/validate") @@ -48,7 +48,7 @@ void should422WhenEventNotProvided() throws JsonProcessingException { @Test @DisplayName("should get 422 when event trigger does not exist") - void should422WhenEventTriggerDoesNotExist() throws JsonProcessingException { + void should422WhenEventTriggerDoesNotExist() throws JacksonException { callCaseDataValidate(CASE_TYPE, getBody(INVALID_EVENT_TRIGGER_ID)) .when() .post("/case-types/{caseTypeId}/validate") @@ -58,7 +58,7 @@ void should422WhenEventTriggerDoesNotExist() throws JsonProcessingException { } private RequestSpecification callCaseDataValidate(String caseTypeId, Supplier supplier) - throws JsonProcessingException { + throws JacksonException { return asAutoTestCaseworker(FALSE) .get() .given() diff --git a/src/contractTest/java/uk/gov/hmcts/ccd/WireMockBaseContractTest.java b/src/contractTest/java/uk/gov/hmcts/ccd/WireMockBaseContractTest.java index 46eed709c8..6452550299 100644 --- a/src/contractTest/java/uk/gov/hmcts/ccd/WireMockBaseContractTest.java +++ b/src/contractTest/java/uk/gov/hmcts/ccd/WireMockBaseContractTest.java @@ -1,7 +1,10 @@ package uk.gov.hmcts.ccd; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.MappingBuilder; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; import com.github.tomakehurst.wiremock.common.FileSource; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformer; import com.github.tomakehurst.wiremock.http.Request; @@ -11,16 +14,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.test.util.ReflectionTestUtils; +import org.wiremock.spring.ConfigureWireMock; +import org.wiremock.spring.EnableWireMock; +import org.wiremock.spring.InjectWireMock; +import org.wiremock.spring.WireMockConfigurationCustomizer; import jakarta.inject.Inject; import java.io.IOException; -@AutoConfigureWireMock(port = 0) +@EnableWireMock(@ConfigureWireMock(configurationCustomizers = WireMockBaseContractTest.Customizer.class)) public abstract class WireMockBaseContractTest { private static final Logger LOG = LoggerFactory.getLogger(WireMockBaseContractTest.class); @@ -33,6 +36,9 @@ public abstract class WireMockBaseContractTest { @Inject protected ApplicationParams applicationParams; + @InjectWireMock + protected WireMockServer wireMockServer; + @BeforeEach public void initMock() throws IOException { hostUrl = "http://localhost:" + wiremockPort; @@ -45,12 +51,15 @@ public void initMock() throws IOException { ReflectionTestUtils.setField(applicationParams, "draftHost", hostUrl); } - @Configuration - static class WireMockTestConfiguration { + protected void stubFor(MappingBuilder mappingBuilder) { + wireMockServer.stubFor(mappingBuilder); + } + + public static class Customizer implements WireMockConfigurationCustomizer { - @Bean - public WireMockConfigurationCustomizer wireMockConfigurationCustomizer() { - return config -> config.extensions(new ResponseDefinitionTransformer() { + @Override + public void customize(WireMockConfiguration configuration, ConfigureWireMock options) { + configuration.extensions(new ResponseDefinitionTransformer() { @Override public String getName() { diff --git a/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/CasesControllerProviderTest.java b/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/CasesControllerProviderTest.java index 80dd7cbc06..c7376e6c1f 100644 --- a/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/CasesControllerProviderTest.java +++ b/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/CasesControllerProviderTest.java @@ -8,9 +8,10 @@ import au.com.dius.pact.provider.junitsupport.loader.PactBroker; import au.com.dius.pact.provider.junitsupport.loader.VersionSelector; import au.com.dius.pact.provider.spring.junit5.PactVerificationSpringProvider; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.github.tomakehurst.wiremock.client.WireMock; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; @@ -86,7 +87,6 @@ import java.util.Optional; import static com.github.tomakehurst.wiremock.client.WireMock.okJson; -import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -204,8 +204,9 @@ public class CasesControllerProviderTest extends WireMockBaseContractTest { @Qualifier("authorised") CaseAssignedUserRolesOperation caseAssignedUserRolesOperation; - private final ObjectMapper mapper = new ObjectMapper() - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + private final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); @TestTemplate @@ -217,7 +218,7 @@ void pactVerificationTestTemplate(PactVerificationContext context) { } @BeforeEach - void before(PactVerificationContext context) throws JsonProcessingException { + void before(PactVerificationContext context) throws JacksonException { if (context != null) { context.setTarget(new HttpTestTarget("localhost", 8123, "/")); } diff --git a/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/caseassigned/CaseAssignedUserRolesProviderTest.java b/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/caseassigned/CaseAssignedUserRolesProviderTest.java index aa6c76be41..f56a409277 100644 --- a/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/caseassigned/CaseAssignedUserRolesProviderTest.java +++ b/src/contractTest/java/uk/gov/hmcts/ccd/v2/external/controller/caseassigned/CaseAssignedUserRolesProviderTest.java @@ -13,8 +13,8 @@ import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; diff --git a/src/contractTest/java/uk/gov/hmcts/reform/ccd/pactprovider/cases/CasesProviderTest.java b/src/contractTest/java/uk/gov/hmcts/reform/ccd/pactprovider/cases/CasesProviderTest.java index e778c0be09..27520c7c3b 100644 --- a/src/contractTest/java/uk/gov/hmcts/reform/ccd/pactprovider/cases/CasesProviderTest.java +++ b/src/contractTest/java/uk/gov/hmcts/reform/ccd/pactprovider/cases/CasesProviderTest.java @@ -8,10 +8,11 @@ import au.com.dius.pact.provider.junitsupport.loader.PactBroker; import au.com.dius.pact.provider.junitsupport.loader.VersionSelector; import au.com.dius.pact.provider.spring.junit5.MockMvcTestTarget; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; @@ -56,7 +57,7 @@ public class CasesProviderTest { @Mock private CreateCaseOperation createCaseOperation; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); @BeforeEach void beforeCreate(PactVerificationContext context) { @@ -77,35 +78,35 @@ void pactVerificationTestTemplate(PactVerificationContext context) { } @State("A Get Case is requested") - public void getCase() throws JsonProcessingException { + public void getCase() throws JacksonException { when(getCaseOperation.execute(anyString())).thenReturn(Optional.of(mockCaseDetails())); } @State("A Start event for a Citizen is requested") - public void startEventForCitizen() throws JsonProcessingException { + public void startEventForCitizen() throws JacksonException { when(startEventOperation.triggerStartForCase(anyString(), anyString(), anyBoolean())) .thenReturn(mockStartEventResult()); } @State("A Start case for a Citizen is requested") - public void startCaseForCitizen() throws JsonProcessingException { + public void startCaseForCitizen() throws JacksonException { when(startEventOperation.triggerStartForCaseType(anyString(), anyString(), anyBoolean())) .thenReturn(mockStartEventResult()); } @State("A Submit event for a Citizen is requested") - public void createCaseEventForCitizen() throws JsonProcessingException { + public void createCaseEventForCitizen() throws JacksonException { when(createEventOperation.createCaseEvent(anyString(), nullable(CaseDataContent.class))) .thenReturn(mockCaseDetails()); } @State("A Submit case for a Citizen is requested") - public void saveCaseDetailsForCitizen() throws JsonProcessingException { + public void saveCaseDetailsForCitizen() throws JacksonException { when(createCaseOperation.createCaseDetails(anyString(), nullable(CaseDataContent.class), anyBoolean())) .thenReturn(mockCaseDetails()); } - private StartEventResult mockStartEventResult() throws JsonProcessingException { + private StartEventResult mockStartEventResult() throws JacksonException { StartEventResult startEventResult = new StartEventResult(); startEventResult.setToken("someToken"); startEventResult.setEventId("startAppeal"); @@ -113,7 +114,7 @@ private StartEventResult mockStartEventResult() throws JsonProcessingException { return startEventResult; } - private CaseDetails mockCaseDetails() throws JsonProcessingException { + private CaseDetails mockCaseDetails() throws JacksonException { CaseDetails caseDetails = new CaseDetails(); caseDetails.setReference(1L); caseDetails.setCaseTypeId("ET_EnglandWales"); @@ -122,29 +123,29 @@ private CaseDetails mockCaseDetails() throws JsonProcessingException { caseDetails.setAfterSubmitCallbackResponseEntity(new ResponseEntity<>(HttpStatus.OK)); caseDetails.setState("appealStarted"); caseDetails.setData(new HashMap() {{ - put("appealReferenceNumber", new TextNode("DRAFT")); - put("appealType", new TextNode("protection")); - put("appellantDateOfBirth", new TextNode("1990-12-07")); - put("appellantFamilyName", new TextNode("Smith")); - put("appellantGivenNames", new TextNode("Bob")); - put("appellantNameForDisplay", new TextNode("Bob Smith")); - put("appellantTitle", new TextNode("Mr")); - put("applicationOutOfTimeExplanation", new TextNode("test case")); + put("appealReferenceNumber", new StringNode("DRAFT")); + put("appealType", new StringNode("protection")); + put("appellantDateOfBirth", new StringNode("1990-12-07")); + put("appellantFamilyName", new StringNode("Smith")); + put("appellantGivenNames", new StringNode("Bob")); + put("appellantNameForDisplay", new StringNode("Bob Smith")); + put("appellantTitle", new StringNode("Mr")); + put("applicationOutOfTimeExplanation", new StringNode("test case")); put("caseManagementLocation", objectMapper.readTree("{\"baseLocation\":\"765324\",\"region\":" + "\"1\"}")); - put("currentCaseStateVisibleToLegalRepresentative", new TextNode("appealStarted")); - put("homeOfficeDecisionDate", new TextNode("2019-08-01")); - put("homeOfficeReferenceNumber", new TextNode("000123456")); + put("currentCaseStateVisibleToLegalRepresentative", new StringNode("appealStarted")); + put("homeOfficeDecisionDate", new StringNode("2019-08-01")); + put("homeOfficeReferenceNumber", new StringNode("000123456")); put("legalRepCompanyAddress", objectMapper.readTree("{\"AddressLine1\":\"\",\"AddressLine2\":" + "\"\",\"AddressLine3\":\"\",\"Country\":\"\",\"PostCode\":\"\",\"PostTown\":\"\"}")); - put("legalRepCompanyName", new TextNode("")); - put("staffLocation", new TextNode("Taylor House")); - put("submissionOutOfTime", new TextNode("Yes")); + put("legalRepCompanyName", new StringNode("")); + put("staffLocation", new StringNode("Taylor House")); + put("submissionOutOfTime", new StringNode("Yes")); put("subscriptions", objectMapper.readTree("[{\"id\":\"1\",\"value\":{\"email\":" + "\"test@example.com\",\"mobileNumber\":\"0111111111\",\"subscriber\":\"appellant\"," + "\"wantsEmail\":\"Yes\",\"wantsSms\":\"Yes\"}}]")); - put("uploadAddendumEvidenceLegalRepActionAvailable", new TextNode("No")); - put("uploadAdditionalEvidenceActionAvailable", new TextNode("No")); + put("uploadAddendumEvidenceLegalRepActionAvailable", new StringNode("No")); + put("uploadAdditionalEvidenceActionAvailable", new StringNode("No")); put("uploadTheNoticeOfDecisionDocs", objectMapper.readTree("[{\"id\":\"1\",\"value\":" + "{\"description\":\"some notice of decision description\",\"document\":{\"document_binary_url\":" + "\"http://dm-store-aat.service.core-compute-aat.internal/documents/" @@ -152,8 +153,8 @@ private CaseDetails mockCaseDetails() throws JsonProcessingException { + "\"some-notice-of-decision-letter.pdf\",\"document_url\":" + "\"http://dm-store-aat.service.core-compute-aat.internal/documents/" + "7f63ca9b-c361-49ab-aa8c-8fbdb6bc2936\"}}}]")); - put("caseSource", new TextNode("Manually Created")); - put("caseType", new TextNode("Single")); + put("caseSource", new StringNode("Manually Created")); + put("caseType", new StringNode("Single")); } }); return caseDetails; diff --git a/src/contractTest/resources/application.properties b/src/contractTest/resources/application.properties index 064ab7e8e2..3fd07427ae 100644 --- a/src/contractTest/resources/application.properties +++ b/src/contractTest/resources/application.properties @@ -3,8 +3,8 @@ server.port=4452 server.servlet.contextPath= server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain -server.error.include-message=always -server.max-http-header-size=100KB +spring.web.error.include-message=always +server.max-http-request-header-size=100KB spring.config.import=optional:configtree:/mnt/secrets/ccd/ spring.cloud.discovery.client.composite-indicator.enabled=false @@ -16,7 +16,7 @@ spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDri spring.datasource.url=jdbc:tc:postgresql:15:///localhost?stringtype=unspecified # Disable feature detection to avoid the java.sql.SQLFeatureNotSupportedException # Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented. -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false +spring.jpa.properties.hibernate.boot.allow_jdbc_metadata_access=false pagination.page.size=25 # Case Data TTL guard in days for the minimum number of days from today that a TTL is allowed to be @@ -48,7 +48,7 @@ user.role.cache.ttl.secs=${USER_ROLE_CACHE_ENTRIES_TTL_SEC:7200} system.user.token.cache.ttl.secs=${SYSTEM_USER_TOKEN_CACHE_TTL_SEC:14400} # Jackson ObjectMapper configuration -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +spring.jackson.datatype.datetime.write-dates-as-timestamps=false ccd.case-definition.host=${DEFINITION_STORE_HOST:http://localhost:4451} ccd.ui-definition.host=${DEFINITION_STORE_HOST:http://localhost:4451} @@ -104,14 +104,13 @@ ccd.upload-timestamp-featured-case-types=${UPLOAD_TIMESTAMP_FEATURED_CASE_TYPES: # GENERAL SPRING BOOT ACTUATOR CONFIG # Context path for Spring Boot Actuator endpoints -management.server.servlet.context-path=/ # server under root instead of /actuator/* management.endpoints.web.base-path=/ management.endpoints.web.exposure.include=* # HEALTH ENDPOINT CONFIG # Enable the health endpoint -management.endpoint.health.enabled=true +management.endpoint.health.access=unrestricted management.endpoint.health.show-details=always # Caching period in milliseconds of health endpoint @@ -137,7 +136,7 @@ management.health.readinessState.enabled=true # METRICS ENDPOINT CONFIG # Enable the metrics endpoint -management.endpoint.metrics.enabled=true +management.endpoint.metrics.access=unrestricted # Define Readiness checks management.endpoint.health.group.readiness.include=db,ping,refreshScope @@ -192,13 +191,9 @@ search.cases.index.name.type=${ELASTIC_SEARCH_CASE_INDEX_TYPE:_doc} search.elastic.nodes.discovery.enabled=${ELASTIC_SEARCH_NODES_DISCOVERY_ENABLED:false} search.elastic.nodes.discovery.frequency.millis=${ELASTIC_SEARCH_NODES_DISCOVERY_FREQUENCY_MILLIS:5000} search.elastic.nodes.discovery.filter=${ELASTIC_SEARCH_NODES_DISCOVERY_FILTER:_all} -spring.elasticsearch.jest.uris=${ELASTIC_SEARCH_HOSTS:http://localhost:9200} -spring.elasticsearch.jest.read-timeout=10000ms search.global.index.name=${GLOBAL_SEARCH_INDEX_NAME:global_search} search.global.index.type=${GLOBAL_SEARCH_INDEX_TYPE:_doc} search.internal.case-access-metadata.enabled=${INTERNAL_SEARCH_CAM_ENABLED:false} -management.health.elasticsearch.enabled=false -management.health.status.order=DOWN, OUT_OF_SERVICE, UNKNOWN, UP, OUT_OF_SYNC, PROBLEM, COULD_NOT_CONNECT # Elasticsearch mappings elasticsearch.type-mappings.defaultText=Text, TextArea, FixedList, FixedListEdit, MultiSelectList, FixedRadioList, DynamicList, DynamicRadioList, DynamicMultiSelectList, Region, BaseLocation, PhoneUK @@ -281,9 +276,10 @@ ccd.messaging.type-mappings.YesOrNo=SimpleBoolean ccd.messaging.type-mappings.Document=Complex spring.flyway.out-of-order=true -spring.flyway.ignore-missing-migrations=true +spring.flyway.ignore-migration-patterns=*:missing,*:future spring.flyway.baseline-on-migrate=true spring.flyway.baseline-version=0001 +spring.flyway.postgresql.transactional-lock=false spring.flyway.enabled=false reference.data.api.url=${RD_LOCATION_REF_API_BASE_URL:http://localhost:5555} diff --git a/src/main/java/uk/gov/hmcts/ccd/ElasticSearchConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/ElasticSearchConfiguration.java index 89431612f8..2c175ec145 100644 --- a/src/main/java/uk/gov/hmcts/ccd/ElasticSearchConfiguration.java +++ b/src/main/java/uk/gov/hmcts/ccd/ElasticSearchConfiguration.java @@ -1,14 +1,13 @@ package uk.gov.hmcts.ccd; import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.json.jackson.Jackson3JsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.json.JsonReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.json.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; @@ -22,8 +21,8 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import uk.gov.hmcts.ccd.domain.service.search.elasticsearch.ElasticsearchMappings; import java.util.Arrays; @@ -40,26 +39,29 @@ public ElasticSearchConfiguration(ApplicationParams applicationParams) { this.applicationParams = applicationParams; } - @Bean(name = "DefaultObjectMapper") + @Bean(name = "ElasticsearchObjectMapper") @Scope(BeanDefinition.SCOPE_PROTOTYPE) - public ObjectMapper objectMapper() { - return new Jackson2ObjectMapperBuilder() - .featuresToEnable(MapperFeature.DEFAULT_VIEW_INCLUSION) - .featuresToEnable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES) - .featuresToEnable(JsonParser.Feature.ALLOW_SINGLE_QUOTES) - .featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .modulesToInstall(JavaTimeModule.class) + public JsonMapper objectMapper() { + return JsonMapper.builderWithJackson2Defaults() + .enable(MapperFeature.DEFAULT_VIEW_INCLUSION) + .enable(JsonReadFeature.ALLOW_UNQUOTED_PROPERTY_NAMES) + .enable(JsonReadFeature.ALLOW_SINGLE_QUOTES) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .build(); } @Bean @Scope(BeanDefinition.SCOPE_PROTOTYPE) - public JacksonJsonpMapper jsonpMapper(ObjectMapper objectMapper) { - return new JacksonJsonpMapper(objectMapper); + public Jackson3JsonpMapper jsonpMapper( + @Qualifier("ElasticsearchObjectMapper") JsonMapper objectMapper + ) { + return new Jackson3JsonpMapper(objectMapper); } @Bean - public ElasticsearchClient elasticsearchClient(ObjectMapper objectMapper) { + public ElasticsearchClient elasticsearchClient( + @Qualifier("ElasticsearchObjectMapper") JsonMapper objectMapper + ) { HttpHost[] esHosts = applicationParams.getElasticSearchDataHosts().stream() .map(HttpHost::create) .toArray(HttpHost[]::new); @@ -84,7 +86,7 @@ public void onFailure(Node node) { ElasticsearchTransport transport = new RestClientTransport( restClient, - new JacksonJsonpMapper(objectMapper) + new Jackson3JsonpMapper(objectMapper) ); return new ElasticsearchClient(transport); diff --git a/src/main/java/uk/gov/hmcts/ccd/RestTemplateConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/RestTemplateConfiguration.java index 95a3bc327f..943599cb3d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/RestTemplateConfiguration.java +++ b/src/main/java/uk/gov/hmcts/ccd/RestTemplateConfiguration.java @@ -1,5 +1,8 @@ package uk.gov.hmcts.ccd; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.apache.hc.client5.http.HttpRoute; import org.apache.hc.client5.http.classic.HttpClient; import org.apache.hc.client5.http.config.ConnectionConfig; @@ -18,7 +21,8 @@ import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverters; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.web.client.RestTemplate; import jakarta.annotation.PreDestroy; @@ -32,6 +36,16 @@ class RestTemplateConfiguration { private static final Logger LOG = LoggerFactory.getLogger(RestTemplateConfiguration.class); private final List connectionManagers = new ArrayList<>(); + private final JsonMapper restClientObjectMapper; + + RestTemplateConfiguration(ObjectMapper objectMapper) { + JsonMapper jsonMapper = objectMapper instanceof JsonMapper + ? (JsonMapper) objectMapper + : JsonMapper.builderWithJackson2Defaults().build(); + this.restClientObjectMapper = jsonMapper.rebuild() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); + } @Value("${http.client.max.total}") private int maxTotalHttpClient; @@ -62,7 +76,7 @@ class RestTemplateConfiguration { @Bean(name = "definitionStoreRestTemplate") public RestTemplate definitionStoreRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); + final RestTemplate restTemplate = createJsonRestTemplate(); restTemplate.setRequestFactory( new HttpComponentsClientHttpRequestFactory(getHttpClient(definitionStoreConnectionTimeout))); LOG.info("definitionStoreConnectionTimeout: {}", definitionStoreConnectionTimeout); @@ -71,7 +85,7 @@ public RestTemplate definitionStoreRestTemplate() { @Bean(name = "restTemplate") public RestTemplate restTemplate() { - final RestTemplate restTemplate = new RestTemplate(); + final RestTemplate restTemplate = createJsonRestTemplate(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(getHttpClient(connectionTimeout, readTimeout)); LOG.info("connectionTimeout: {}, readTimeout: {}", connectionTimeout, readTimeout); @@ -79,10 +93,15 @@ public RestTemplate restTemplate() { return restTemplate; } + @Bean(name = "printableDocumentsRestTemplate") + public RestTemplate printableDocumentsRestTemplate() { + return createJsonRestTemplate(); + } + @Bean(name = "documentRestTemplate") public RestTemplate documentRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); + final RestTemplate restTemplate = createJsonRestTemplate(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(getHttpClient()); LOG.info("connectionTimeout: {}, readTimeout: {}", connectionTimeout, readTimeout); @@ -90,7 +109,8 @@ public RestTemplate documentRestTemplate() { List> messageConverters = new ArrayList<>(); //Add the Jackson Message converter - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + JacksonJsonHttpMessageConverter converter = + new JacksonJsonHttpMessageConverter(restClientObjectMapper); // Note: here we are making this converter to process any kind of response, // not only application/*json, which is the default behaviour converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL)); @@ -102,7 +122,7 @@ public RestTemplate documentRestTemplate() { @Bean(name = "createDraftRestTemplate") public RestTemplate createDraftsRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); + final RestTemplate restTemplate = createJsonRestTemplate(); restTemplate.setRequestFactory( new HttpComponentsClientHttpRequestFactory(getHttpClient(draftsCreateConnectionTimeout))); return restTemplate; @@ -110,12 +130,20 @@ public RestTemplate createDraftsRestTemplate() { @Bean(name = "draftsRestTemplate") public RestTemplate draftsRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); + final RestTemplate restTemplate = createJsonRestTemplate(); restTemplate.setRequestFactory( new HttpComponentsClientHttpRequestFactory(getHttpClient(draftsConnectionTimeout))); return restTemplate; } + private RestTemplate createJsonRestTemplate() { + HttpMessageConverters messageConverters = HttpMessageConverters.forClient() + .registerDefaults() + .withJsonConverter(new JacksonJsonHttpMessageConverter(restClientObjectMapper)) + .build(); + return new RestTemplate(messageConverters); + } + @PreDestroy void close() { LOG.info("PreDestroy called"); diff --git a/src/main/java/uk/gov/hmcts/ccd/V2HypermediaConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/V2HypermediaConfiguration.java new file mode 100644 index 0000000000..5682ee76c3 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/ccd/V2HypermediaConfiguration.java @@ -0,0 +1,50 @@ +package uk.gov.hmcts.ccd; + +import java.util.LinkedHashSet; +import java.util.List; + +import org.springframework.context.annotation.Configuration; +import org.springframework.hateoas.RepresentationModel; +import org.springframework.hateoas.mediatype.hal.HalMediaTypeConfiguration; +import org.springframework.hateoas.server.mvc.TypeConstrainedJacksonJsonHttpMessageConverter; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverters; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import tools.jackson.databind.json.JsonMapper; + +/** + * Keeps the service's existing HAL media-type handling on Jackson 3. + */ +@Configuration +public class V2HypermediaConfiguration implements WebMvcConfigurer { + + private static final MediaType VENDOR_JSON = MediaType.parseMediaType("application/*+json"); + + private final JsonMapper jsonMapper; + private final HalMediaTypeConfiguration halMediaTypeConfiguration; + + public V2HypermediaConfiguration(JsonMapper jsonMapper, + HalMediaTypeConfiguration halMediaTypeConfiguration) { + this.jsonMapper = jsonMapper; + this.halMediaTypeConfiguration = halMediaTypeConfiguration; + } + + @Override + public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) { + var mediaTypes = new LinkedHashSet<>(halMediaTypeConfiguration.getMediaTypes()); + mediaTypes.add(MediaType.APPLICATION_JSON); + mediaTypes.add(VENDOR_JSON); + + var halMapper = halMediaTypeConfiguration + .configureJsonMapper(jsonMapper.rebuild()) + .build(); + HttpMessageConverter converter = new TypeConstrainedJacksonJsonHttpMessageConverter( + RepresentationModel.class, + List.copyOf(mediaTypes), + halMapper + ); + builder.configureMessageConvertersList(converters -> converters.add(0, converter)); + } +} diff --git a/src/main/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfiguration.java index f2f445833f..2eca218a9f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfiguration.java +++ b/src/main/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfiguration.java @@ -1,14 +1,41 @@ package uk.gov.hmcts.ccd.appinsights; import com.microsoft.applicationinsights.TelemetryClient; +import com.microsoft.applicationinsights.connectionstring.ConnectionString; +import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; + +import java.util.Optional; @Configuration public class AppInsightsConfiguration { + static final String CONFIG_TREE_CONNECTION_STRING_PROPERTY = "app-insights-connection-string"; + static final String CONNECTION_STRING_PROPERTY = "applicationinsights.connection-string"; + static final String LEGACY_INSTRUMENTATION_KEY_PROPERTY = "azure.application-insights.instrumentation-key"; + @Bean - public TelemetryClient telemetryClient() { + public TelemetryClient telemetryClient(Environment environment) { + resolveConnectionString(environment).ifPresent(ConnectionString::configure); return new TelemetryClient(); } -} \ No newline at end of file + + static Optional resolveConnectionString(Environment environment) { + Binder binder = Binder.get(environment); + String connectionString = binder.bind(CONFIG_TREE_CONNECTION_STRING_PROPERTY, String.class) + .orElseGet(() -> binder.bind(CONNECTION_STRING_PROPERTY, String.class).orElse(null)); + if (StringUtils.hasText(connectionString)) { + return Optional.of(connectionString); + } + + // Preserve the environment variable used by the former 2.x Spring Boot starter. + String instrumentationKey = binder.bind(LEGACY_INSTRUMENTATION_KEY_PROPERTY, String.class).orElse(null); + if (StringUtils.hasText(instrumentationKey)) { + return Optional.of("InstrumentationKey=" + instrumentationKey); + } + return Optional.empty(); + } +} diff --git a/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryContext.java b/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryContext.java deleted file mode 100644 index 18a34a8f39..0000000000 --- a/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryContext.java +++ /dev/null @@ -1,16 +0,0 @@ -package uk.gov.hmcts.ccd.appinsights; - -import uk.gov.hmcts.ccd.domain.service.callbacks.CallbackType; - -public class CallbackTelemetryContext { - - private final CallbackType callbackType; - - public CallbackTelemetryContext(CallbackType callbackType) { - this.callbackType = callbackType; - } - - public CallbackType getCallbackType() { - return callbackType; - } -} diff --git a/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryThreadContext.java b/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryThreadContext.java deleted file mode 100644 index d09e644c3a..0000000000 --- a/src/main/java/uk/gov/hmcts/ccd/appinsights/CallbackTelemetryThreadContext.java +++ /dev/null @@ -1,21 +0,0 @@ -package uk.gov.hmcts.ccd.appinsights; - -public class CallbackTelemetryThreadContext { - - private static final InheritableThreadLocal threadLocal = new InheritableThreadLocal<>(); - - private CallbackTelemetryThreadContext() { - } - - public static void setTelemetryContext(CallbackTelemetryContext telemetryContext) { - threadLocal.set(telemetryContext); - } - - public static CallbackTelemetryContext getTelemetryContext() { - return threadLocal.get(); - } - - public static void remove() { - threadLocal.remove(); - } -} diff --git a/src/main/java/uk/gov/hmcts/ccd/auditlog/AuditInterceptor.java b/src/main/java/uk/gov/hmcts/ccd/auditlog/AuditInterceptor.java index 8aa60730bd..236f0ad33f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/auditlog/AuditInterceptor.java +++ b/src/main/java/uk/gov/hmcts/ccd/auditlog/AuditInterceptor.java @@ -5,8 +5,8 @@ import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.jspecify.annotations.Nullable; import org.springframework.context.annotation.Lazy; -import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; diff --git a/src/main/java/uk/gov/hmcts/ccd/config/AmDocumentJacksonMixin.java b/src/main/java/uk/gov/hmcts/ccd/config/AmDocumentJacksonMixin.java new file mode 100644 index 0000000000..8816ca4dc2 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/ccd/config/AmDocumentJacksonMixin.java @@ -0,0 +1,36 @@ +package uk.gov.hmcts.ccd.config; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import uk.gov.hmcts.reform.ccd.document.am.model.Classification; +import uk.gov.hmcts.reform.ccd.document.am.model.Document; + +import java.util.Date; +import java.util.Map; + +/** + * Jackson 3 construction metadata for the AM client 1.60.0 document model. + * + *

The published model has no no-args constructor and its Jackson 2 + * parameter-names module cannot participate in Jackson 3 deserialization. + * Keep this mixin until the Jackson 3-ready AM client release is consumed. + */ +abstract class AmDocumentJacksonMixin { + + @JsonCreator + AmDocumentJacksonMixin( + @JsonProperty("classification") Classification classification, + @JsonProperty("size") long size, + @JsonProperty("mimeType") String mimeType, + @JsonProperty("originalDocumentName") String originalDocumentName, + @JsonProperty("createdOn") Date createdOn, + @JsonProperty("modifiedOn") Date modifiedOn, + @JsonProperty("createdBy") String createdBy, + @JsonProperty("lastModifiedBy") String lastModifiedBy, + @JsonProperty("ttl") Date ttl, + @JsonProperty("hashToken") String hashToken, + @JsonProperty("metadata") Map metadata, + @JsonProperty("links") Document.Links links + ) { + } +} diff --git a/src/main/java/uk/gov/hmcts/ccd/config/AppInsightsTracingConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/config/AppInsightsTracingConfiguration.java deleted file mode 100644 index 866ed92708..0000000000 --- a/src/main/java/uk/gov/hmcts/ccd/config/AppInsightsTracingConfiguration.java +++ /dev/null @@ -1,33 +0,0 @@ -package uk.gov.hmcts.ccd.config; - -import com.microsoft.applicationinsights.extensibility.TelemetryProcessor; -import com.microsoft.applicationinsights.telemetry.RemoteDependencyTelemetry; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import uk.gov.hmcts.ccd.appinsights.CallbackTelemetryContext; -import uk.gov.hmcts.ccd.appinsights.CallbackTelemetryThreadContext; - -@Configuration -public class AppInsightsTracingConfiguration { - - @Bean - // Custom TelemetryProcessor which tags the type of {@link RemoteDependencyTelemetry} as callback before publishing. - public TelemetryProcessor callbackRecognitionProcessor() { - return telemetry -> { - if (telemetry instanceof RemoteDependencyTelemetry) { - RemoteDependencyTelemetry dependency = (RemoteDependencyTelemetry) telemetry; - if (dependency.getType().startsWith("Http") - && CallbackTelemetryThreadContext.getTelemetryContext() != null) { - CallbackTelemetryContext telemetryContext = CallbackTelemetryThreadContext.getTelemetryContext(); - if (telemetryContext.getCallbackType() != null) { - dependency.getProperties().put("callback", "true"); - dependency.getProperties().put("callbackType", telemetryContext.getCallbackType().getValue()); - } - // clean up after retrieval - CallbackTelemetryThreadContext.remove(); - } - } - return true; - }; - } -} diff --git a/src/main/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfig.java b/src/main/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfig.java index 5ae18c3ea2..a6ee5b88aa 100644 --- a/src/main/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfig.java +++ b/src/main/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfig.java @@ -1,16 +1,14 @@ package uk.gov.hmcts.ccd.config; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.springframework.beans.factory.config.MethodInvokingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import uk.gov.hmcts.reform.ccd.document.am.model.Document; @Configuration public class JacksonObjectMapperConfig { @@ -22,19 +20,18 @@ public class JacksonObjectMapperConfig { */ @Primary @Bean(name = "DefaultObjectMapper") - public ObjectMapper defaultObjectMapper() { - return new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + public JsonMapper defaultObjectMapper() { + return JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .enable(MapperFeature.DETECT_PARAMETER_NAMES) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .addMixIn(Document.class, AmDocumentJacksonMixin.class) + .build(); } @Bean(name = "SimpleObjectMapper") - public ObjectMapper simpleObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); - return mapper; + public JsonMapper simpleObjectMapper() { + return JsonMapper.builderWithJackson2Defaults().build(); } @Bean diff --git a/src/main/java/uk/gov/hmcts/ccd/config/JacksonUtils.java b/src/main/java/uk/gov/hmcts/ccd/config/JacksonUtils.java index 1588eacb0c..289de570c5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/config/JacksonUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/config/JacksonUtils.java @@ -1,17 +1,18 @@ package uk.gov.hmcts.ccd.config; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.TokenStreamFactory; +import tools.jackson.core.json.JsonFactory; +import tools.jackson.core.json.JsonReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.MapperFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.POJONode; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; import uk.gov.hmcts.ccd.domain.types.sanitiser.CollectionSanitiser; @@ -32,16 +33,16 @@ public final class JacksonUtils { private JacksonUtils() { } - public static final JsonFactory jsonFactory = JsonFactory.builder() + public static final JsonFactory jsonFactory = JsonFactory.builderWithJackson2Defaults() // Change per-factory setting to prevent use of `String.intern()` on symbols - .disable(JsonFactory.Feature.INTERN_FIELD_NAMES) + .disable(TokenStreamFactory.Feature.INTERN_PROPERTY_NAMES) .build(); public static final ObjectMapper MAPPER = JsonMapper.builder(jsonFactory) + .configureForJackson2() .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true) - .configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true) - .configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true) - .addModule(new JavaTimeModule()) + .configure(JsonReadFeature.ALLOW_UNQUOTED_PROPERTY_NAMES, true) + .configure(JsonReadFeature.ALLOW_SINGLE_QUOTES, true) .build(); public static Map convertValue(Object from) { @@ -63,15 +64,60 @@ public static Map convertJsonNode(Object from) { }); } - public static Map convertJsonNode(String from) throws JsonProcessingException { + public static Map convertJsonNode(String from) throws JacksonException { return MAPPER.readValue(from, new TypeReference>() { }); } - public static String writeValueAsString(Map caseData) throws JsonProcessingException { + public static String writeValueAsString(Map caseData) throws JacksonException { return JacksonUtils.MAPPER.writeValueAsString(caseData); } + /** + * Coerces a node to text using Jackson 2's {@code JsonNode.asText()} semantics. + * + *

Jackson 3's replacement, {@code asString()}, rejects container and missing nodes, + * while CCD previously relied on Jackson 2 returning an empty string for those nodes. + */ + public static String asText(@NonNull JsonNode jsonNode) { + if (jsonNode.isContainer() || jsonNode.isMissingNode()) { + return ""; + } + if (jsonNode.isNull()) { + return "null"; + } + if (jsonNode.isPojo()) { + Object value = ((POJONode) jsonNode).getPojo(); + return value == null ? "null" : value.toString(); + } + return jsonNode.asString(null); + } + + /** + * Coerces a node to text using Jackson 2's {@code JsonNode.asText(defaultValue)} semantics. + */ + public static String asText(@NonNull JsonNode jsonNode, String defaultValue) { + if (jsonNode.isNull() || jsonNode.isMissingNode()) { + return defaultValue; + } + if (jsonNode.isPojo()) { + Object value = ((POJONode) jsonNode).getPojo(); + return value == null ? defaultValue : value.toString(); + } + if (jsonNode.isContainer()) { + return ""; + } + return jsonNode.asString(defaultValue); + } + + /** + * Creates a Jackson 3 string node while preserving Jackson 2's effective JSON-null + * representation for the formerly permitted {@code new TextNode(null)}. + */ + public static JsonNode stringOrNullNode(String value) { + return value == null ? MAPPER.getNodeFactory().nullNode() : MAPPER.getNodeFactory().stringNode(value); + } + /** * Builds a JsonNode from a path and puts the value to the last node. * @param path Eg. "OrganisationPolicyField.OrgPolicyCaseAssignedRole" @@ -90,7 +136,7 @@ public static JsonNode buildFromDottedPath(String path, String value) { private static JsonNode addNode(List pathElements, String value) { if (pathElements.isEmpty()) { - return MAPPER.getNodeFactory().textNode(value); + return MAPPER.getNodeFactory().stringNode(value); } else { String first = pathElements.remove(0); return MAPPER.getNodeFactory().objectNode().set(first, addNode(pathElements, value)); @@ -115,7 +161,7 @@ private static JsonNode merge(JsonNode mainNode, JsonNode updateNode) { return mainNode; } - Iterator fieldNames = updateNode.fieldNames(); + Iterator fieldNames = updateNode.propertyNames().iterator(); while (fieldNames.hasNext()) { String updatedFieldName = fieldNames.next(); JsonNode valueToBeUpdated = mainNode.get(updatedFieldName); @@ -191,14 +237,12 @@ private static String getValueFromArray(String path, JsonNode jsonNode) { } private static String getValue(@NonNull JsonNode jsonNode) { - String returnValue = null; - - if (jsonNode instanceof IntNode) { - returnValue = jsonNode.toString(); - } else { - return jsonNode.iterator().hasNext() ? jsonNode.iterator().next().textValue() : jsonNode.textValue(); + Iterator values = jsonNode.iterator(); + JsonNode valueNode = values.hasNext() ? values.next() : jsonNode; + if (valueNode instanceof IntNode) { + return valueNode.toString(); } - return returnValue; + return valueNode.isString() ? valueNode.stringValue() : null; } public static Map convertValueInDataField(Map from) { diff --git a/src/main/java/uk/gov/hmcts/ccd/config/JaywayJsonPathConfigHelper.java b/src/main/java/uk/gov/hmcts/ccd/config/JaywayJsonPathConfigHelper.java index e1f8f8da71..c70453be4e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/config/JaywayJsonPathConfigHelper.java +++ b/src/main/java/uk/gov/hmcts/ccd/config/JaywayJsonPathConfigHelper.java @@ -5,9 +5,9 @@ import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.Option; -import com.jayway.jsonpath.spi.json.JacksonJsonProvider; +import com.jayway.jsonpath.spi.json.Jackson3JsonProvider; import com.jayway.jsonpath.spi.json.JsonProvider; -import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider; +import com.jayway.jsonpath.spi.mapper.Jackson3MappingProvider; import com.jayway.jsonpath.spi.mapper.MappingProvider; public class JaywayJsonPathConfigHelper { @@ -21,8 +21,8 @@ private JaywayJsonPathConfigHelper() { public static void configureJsonPathForJackson() { Configuration.setDefaults(new Configuration.Defaults() { - private final JsonProvider jsonProvider = new JacksonJsonProvider(); - private final MappingProvider mappingProvider = new JacksonMappingProvider(); + private final JsonProvider jsonProvider = new Jackson3JsonProvider(); + private final MappingProvider mappingProvider = new Jackson3MappingProvider(); @Override public JsonProvider jsonProvider() { diff --git a/src/main/java/uk/gov/hmcts/ccd/config/SwaggerConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/config/SwaggerConfiguration.java index 27994b2973..0274db8a1e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/config/SwaggerConfiguration.java +++ b/src/main/java/uk/gov/hmcts/ccd/config/SwaggerConfiguration.java @@ -1,7 +1,12 @@ package uk.gov.hmcts.ccd.config; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; +import org.springdoc.core.customizers.GlobalOpenApiCustomizer; +import org.springdoc.core.customizers.OpenApiHateoasLinksCustomizer; import org.springdoc.core.models.GroupedOpenApi; +import org.springdoc.core.properties.SpringDocConfigProperties; import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType; @@ -11,7 +16,7 @@ import org.springframework.boot.actuate.endpoint.web.WebEndpointsSupplier; import org.springframework.boot.actuate.endpoint.web.EndpointMapping; import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver; -import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; +import org.springframework.boot.webmvc.actuate.endpoint.web.WebMvcEndpointHandlerMapping; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -23,11 +28,17 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; @Configuration public class SwaggerConfiguration { + private static final Set NULLABLE_LINK_PROPERTIES = Set.of( + "deprecation", "hreflang", "name", "profile", "title", "type" + ); + @Bean public GroupedOpenApi apiV1External() { return getNewGroupedOpenApiForPackageOf(CaseDetailsEndpoint.class, "v1_external"); @@ -57,6 +68,31 @@ private GroupedOpenApi getNewGroupedOpenApiForPackageOf(Class klazz, String g .build(); } + @Bean(name = "linksSchemaCustomizer") + public GlobalOpenApiCustomizer linksSchemaCustomizer(SpringDocConfigProperties springDocConfigProperties) { + OpenApiHateoasLinksCustomizer hateoasCustomizer = + new OpenApiHateoasLinksCustomizer(springDocConfigProperties); + return openApi -> { + hateoasCustomizer.customise(openApi); + preserveLinkPropertyNullability(openApi); + }; + } + + private void preserveLinkPropertyNullability(OpenAPI openApi) { + Schema linkSchema = openApi.getComponents().getSchemas().get("Link"); + if (linkSchema == null || linkSchema.getProperties() == null) { + return; + } + + NULLABLE_LINK_PROPERTIES.forEach(propertyName -> { + Schema propertySchema = linkSchema.getProperties().get(propertyName); + if (propertySchema != null) { + propertySchema.setType(null); + propertySchema.setTypes(new LinkedHashSet<>(List.of("string", "null"))); + } + }); + } + //CCD-3509 CVE-2021-22044 required to fix null pointers in integration tests, //conflict in Springfox after Springboot 2.6.10 @Bean diff --git a/src/main/java/uk/gov/hmcts/ccd/data/JsonDataConverter.java b/src/main/java/uk/gov/hmcts/ccd/data/JsonDataConverter.java index 296e2ccbb7..c818ce9e9a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/JsonDataConverter.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/JsonDataConverter.java @@ -1,20 +1,19 @@ package uk.gov.hmcts.ccd.data; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; -import java.io.IOException; @Converter(autoApply = true) public class JsonDataConverter implements AttributeConverter { - private static ObjectMapper mapper = new ObjectMapper(); - - static { - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - } + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults() + .changeDefaultPropertyInclusion(inclusion -> inclusion.withValueInclusion(JsonInclude.Include.NON_NULL)) + .build(); @Override public String convertToDatabaseColumn(final JsonNode objectValue) { @@ -30,8 +29,8 @@ public JsonNode convertToEntityAttribute(final String dataValue) { if (dataValue == null) { return null; } - return mapper.readTree(dataValue); - } catch (IOException e) { + return MAPPER.readTree(dataValue); + } catch (JacksonException e) { throw new RuntimeException("Unable to deserialize to json field", e); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/data/SecurityUtils.java b/src/main/java/uk/gov/hmcts/ccd/data/SecurityUtils.java index da7a881a91..f1671f43c0 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/SecurityUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/SecurityUtils.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.data; -import com.auth0.jwt.JWT; +import com.nimbusds.jwt.JWTParser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +17,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.text.ParseException; import java.util.stream.Collectors; @Service @@ -111,7 +112,13 @@ public String getServiceName() { public String getServiceNameFromS2SToken(String serviceAuthenticationToken) { // NB: this grabs the servce name straight from the token under the assumption // that the S2S token has already been verified elsewhere - return JWT.decode(removeBearerFromToken(serviceAuthenticationToken)).getSubject(); + try { + return JWTParser.parse(removeBearerFromToken(serviceAuthenticationToken)) + .getJWTClaimsSet() + .getSubject(); + } catch (ParseException e) { + throw new IllegalArgumentException("Invalid service authentication token", e); + } } private String removeBearerFromToken(String token) { diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedataaccesscontrol/DefaultRoleAssignmentRepository.java b/src/main/java/uk/gov/hmcts/ccd/data/casedataaccesscontrol/DefaultRoleAssignmentRepository.java index 071d42484a..0061ddd4d6 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedataaccesscontrol/DefaultRoleAssignmentRepository.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedataaccesscontrol/DefaultRoleAssignmentRepository.java @@ -148,7 +148,7 @@ private RoleAssignmentResponse getRoleAssignmentResponse(String userId, HttpEnti if (exchange.getStatusCode() == HttpStatus.NOT_MODIFIED && roleAssignments.containsKey(userId)) { return roleAssignments.get(userId).getRight(); } - if (exchange.getHeaders().containsKey(ETAG) && exchange.getHeaders().getETag() != null) { + if (exchange.getHeaders().containsHeader(ETAG) && exchange.getHeaders().getETag() != null) { log.debug("GET RoleAssignments response contains header ETag={}", exchange.getHeaders().getETag()); if (thereAreRoleAssignmentsInTheBody(exchange)) { roleAssignments.put(userId, Pair.of(getETag(exchange.getHeaders().getETag()), exchange.getBody())); @@ -188,7 +188,7 @@ private ResponseEntity exchangeGet(String userId, HttpEn final Map queryParams = new HashMap<>(); queryParams.put("uid", ApplicationParams.encode(userId.toLowerCase())); - final String encodedUrl = UriComponentsBuilder.fromHttpUrl(applicationParams.amGetRoleAssignmentsURL()) + final String encodedUrl = UriComponentsBuilder.fromUriString(applicationParams.amGetRoleAssignmentsURL()) .buildAndExpand(queryParams).toUriString(); return restTemplate.exchange(new URI(encodedUrl), diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseAuditEventEntity.java b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseAuditEventEntity.java index 59ae3158fe..ca22fbdb15 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseAuditEventEntity.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseAuditEventEntity.java @@ -5,7 +5,7 @@ import java.time.LocalDateTime; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Convert; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseDetailsEntity.java b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseDetailsEntity.java index 77523e89cf..ff620c122e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseDetailsEntity.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/CaseDetailsEntity.java @@ -5,7 +5,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/DefaultSupplementaryDataRepository.java b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/DefaultSupplementaryDataRepository.java index e16274ee2f..fab7647e10 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/DefaultSupplementaryDataRepository.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/DefaultSupplementaryDataRepository.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.data.casedetails.supplementarydata; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.List; import java.util.Set; import jakarta.inject.Singleton; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataQueryBuilder.java b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataQueryBuilder.java index a33acb6061..b71a24a000 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataQueryBuilder.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataQueryBuilder.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.data.casedetails.supplementarydata; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; @@ -56,9 +57,9 @@ default String requestedDataJsonForPath(String fieldPath, Object fieldValue, Str default String jsonNodeToString(Object data) { try { - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); return objectMapper.writeValueAsString(data); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ServiceException("Unable to map object to JSON string", e); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserType.java b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserType.java index 365c502614..195e79fee4 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserType.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserType.java @@ -12,12 +12,13 @@ import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.usertype.UserType; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; public class SupplementaryDataUserType implements UserType { - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); public static CustomType CUSTOM_TYPE = new CustomType( new SupplementaryDataUserType(), new TypeConfiguration() @@ -109,4 +110,4 @@ public JsonNode replace(JsonNode detached, JsonNode managed, Object owner) { return detached; } -} \ No newline at end of file +} diff --git a/src/main/java/uk/gov/hmcts/ccd/data/definition/DefaultCaseDefinitionRepository.java b/src/main/java/uk/gov/hmcts/ccd/data/definition/DefaultCaseDefinitionRepository.java index e0b63d816d..41742aecfc 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/definition/DefaultCaseDefinitionRepository.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/definition/DefaultCaseDefinitionRepository.java @@ -241,7 +241,7 @@ private List getCaseTypeIdFromJurisdictionDefinition(List getJurisdictionsFromDefinitionStore(Optional> jurisdictionIds) { try { - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(applicationParams.jurisdictionDefURL()); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(applicationParams.jurisdictionDefURL()); jurisdictionIds.ifPresent(ids -> builder.queryParam("ids", String.join(",", ids))); LOG.debug("Retrieving jurisdiction object(s) from definition store for Jurisdiction IDs: {}.", diff --git a/src/main/java/uk/gov/hmcts/ccd/data/definition/HttpUIDefinitionGateway.java b/src/main/java/uk/gov/hmcts/ccd/data/definition/HttpUIDefinitionGateway.java index bce290d136..873b8364e3 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/definition/HttpUIDefinitionGateway.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/definition/HttpUIDefinitionGateway.java @@ -131,7 +131,7 @@ public SearchResultDefinition getSearchCasesResultDefinition(int version, String } private URI withVersionQueryParam(String url, int version) { - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url).queryParam("version", version); + UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(url).queryParam("version", version); return builder.build().encode().toUri(); } @@ -165,7 +165,7 @@ public JurisdictionUiConfigResult getJurisdictionUiConfigs(final List ju private URI withJurisdictionIds(String url, final List jurisdictionIds) { UriComponentsBuilder builder = - UriComponentsBuilder.fromHttpUrl(url).queryParam("ids", String.join(",", jurisdictionIds)); + UriComponentsBuilder.fromUriString(url).queryParam("ids", String.join(",", jurisdictionIds)); return builder.build().encode().toUri(); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/data/documentdata/DocumentDataRequest.java b/src/main/java/uk/gov/hmcts/ccd/data/documentdata/DocumentDataRequest.java index 356be951be..3afc368105 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/documentdata/DocumentDataRequest.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/documentdata/DocumentDataRequest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.data.documentdata; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGateway.java b/src/main/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGateway.java index 1fbc0e8490..a049694d8a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGateway.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGateway.java @@ -11,11 +11,12 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import jakarta.inject.Inject; -import java.io.IOException; import java.net.URI; import java.util.List; import java.util.function.Consumer; @@ -41,7 +42,7 @@ public class DefaultDraftGateway implements DraftGateway { public static final String QUALIFIER = "default"; private static final Logger LOG = LoggerFactory.getLogger(DefaultDraftGateway.class); - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String DRAFT_ENCRYPTION_KEY_HEADER = "Secret"; private static final int RESOURCE_NOT_FOUND = 404; public static final String DRAFT_STORE_DOWN_ERR_MESSAGE = "The draft service is currently down, please refresh " @@ -78,7 +79,7 @@ public Long create(final CreateCaseDraftRequest draft) { HttpHeaders responseHeaders = createDraftRestTemplate.exchange(applicationParams.draftBaseURL(), HttpMethod.POST, requestEntity, - HttpEntity.class).getHeaders(); + Void.class).getHeaders(); return getDraftId(responseHeaders); } catch (Exception e) { LOG.warn("Error while saving draft", e); @@ -204,7 +205,7 @@ private DraftResponse assembleDraft(Draft draft, Consumer exceptionCo draftResponse.setCreated(draft.getCreated().toLocalDateTime()); draftResponse.setUpdated(draft.getUpdated().toLocalDateTime()); } - } catch (IOException e) { + } catch (JacksonException e) { exceptionConsumer.accept(e); } return draftResponse; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/message/MessageQueueCandidateEntity.java b/src/main/java/uk/gov/hmcts/ccd/data/message/MessageQueueCandidateEntity.java index a7a5b051ae..fe6fabd826 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/message/MessageQueueCandidateEntity.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/message/MessageQueueCandidateEntity.java @@ -4,7 +4,7 @@ import java.time.LocalDateTime; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.persistence.Convert; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/src/main/java/uk/gov/hmcts/ccd/data/user/DefaultUserRepository.java b/src/main/java/uk/gov/hmcts/ccd/data/user/DefaultUserRepository.java index 31d651ea62..320fabe212 100644 --- a/src/main/java/uk/gov/hmcts/ccd/data/user/DefaultUserRepository.java +++ b/src/main/java/uk/gov/hmcts/ccd/data/user/DefaultUserRepository.java @@ -129,7 +129,7 @@ public UserDefault getUserDefaultSettings(final String userId) { final HttpHeaders requestHeaders = securityUtils.authorizationHeaders(); requestHeaders.add(EMAIL_HEADER, userId.toLowerCase()); final HttpEntity requestEntity = new HttpEntity<>(requestHeaders); - final String encodedUrl = UriComponentsBuilder.fromHttpUrl(applicationParams.userDefaultSettingsURL()) + final String encodedUrl = UriComponentsBuilder.fromUriString(applicationParams.userDefaultSettingsURL()) .toUriString(); UserDefaultCollection userDefaultCollection = restTemplate diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClient.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClient.java index 2db1e0b03d..1122872fd9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClient.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClient.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.decentralised.client; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedAuditEvent.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedAuditEvent.java index 70127aaacb..f9265392b3 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedAuditEvent.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedAuditEvent.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.decentralised.dto; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; import uk.gov.hmcts.ccd.domain.model.std.AuditEvent; diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseDetails.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseDetails.java index 8648f8531c..9546d462f7 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseDetails.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseDetails.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.decentralised.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseEvent.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseEvent.java index d54dbdf6c8..d70c98a230 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseEvent.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedCaseEvent.java @@ -3,8 +3,8 @@ import java.time.LocalDate; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedEventDetails.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedEventDetails.java index 45ecfb1ec0..3f81217a77 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedEventDetails.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedEventDetails.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.decentralised.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedSubmitEventResponse.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedSubmitEventResponse.java index f71ae0f801..610120948f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedSubmitEventResponse.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedSubmitEventResponse.java @@ -3,8 +3,8 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonUnwrapped; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) diff --git a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedUpdateSupplementaryDataResponse.java b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedUpdateSupplementaryDataResponse.java index 4fb3a920df..9ddf343a7f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedUpdateSupplementaryDataResponse.java +++ b/src/main/java/uk/gov/hmcts/ccd/decentralised/dto/DecentralisedUpdateSupplementaryDataResponse.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.decentralised.dto; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParser.java b/src/main/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParser.java index c8370610ca..fb9c169cba 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParser.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.enablingcondition.jexl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import java.util.HashMap; @@ -40,7 +40,7 @@ public class JexlEnablingConditionParser implements EnablingConditionParser { @Inject public JexlEnablingConditionParser(EnablingConditionConverter enablingConditionConverter) { - this(enablingConditionConverter, new ObjectMapper().registerModule(new JavaTimeModule())); + this(enablingConditionConverter, JsonMapper.builderWithJackson2Defaults().build()); } protected JexlEnablingConditionParser(EnablingConditionConverter enablingConditionConverter, @@ -93,7 +93,7 @@ private Set getVariableNames(Set> variableLists) { private String caseDataToJsonString(Map caseData) { try { return this.objectMapper.writeValueAsString(caseData); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ServiceException("Unable to convert case data to JSON string", e); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseUpdateViewEvent.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseUpdateViewEvent.java index 728056ee2c..ce6971aa29 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseUpdateViewEvent.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseUpdateViewEvent.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.Map; import uk.gov.hmcts.ccd.domain.model.definition.WizardPage; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/AfterSubmitCallbackResponse.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/AfterSubmitCallbackResponse.java index 4a00a5a639..b69896b079 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/AfterSubmitCallbackResponse.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/AfterSubmitCallbackResponse.java @@ -1,12 +1,13 @@ package uk.gov.hmcts.ccd.domain.model.callbacks; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; public class AfterSubmitCallbackResponse { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); @JsonProperty("confirmation_header") private String confirmationHeader; @@ -33,7 +34,7 @@ public void setConfirmationBody(final String confirmationBody) { public String toJson() { try { return MAPPER.writeValueAsString(this); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { return toString(); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/CallbackResponse.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/CallbackResponse.java index 9f6bc3a4de..22034e3894 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/CallbackResponse.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/callbacks/CallbackResponse.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.base.Strings; import io.swagger.v3.oas.annotations.media.Schema; @@ -118,7 +118,9 @@ public void setState(String state) { private Optional filterCaseState(final Map data) { final Optional jsonNode = ofNullable(data.get(CALLBACK_RESPONSE_KEY_STATE)); jsonNode.ifPresent(value -> data.remove(CALLBACK_RESPONSE_KEY_STATE)); - return jsonNode.flatMap(value -> value.isTextual() ? Optional.of(value.textValue()) : Optional.empty()); + return jsonNode.flatMap(value -> + value.isString() ? Optional.of(value.stringValue(null)) : Optional.empty() + ); } public void updateCallbackStateBasedOnPriority() { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcher.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcher.java index 3e09d51d21..6719ec60c7 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcher.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcher.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.matcher; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; @@ -14,6 +14,8 @@ import java.util.List; import java.util.Optional; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Slf4j @Component @ConditionalOnProperty(name = "enable-case-group-access-filtering", havingValue = "true") @@ -61,13 +63,13 @@ private List getCaseAccessGroupIds(JsonNode caseAccessGroups) { List allGroupIds = new ArrayList<>(); if (caseAccessGroups.isArray()) { - Iterator elements = caseAccessGroups.elements(); + Iterator elements = caseAccessGroups.values().iterator(); while (elements.hasNext()) { JsonNode jsonNode = elements.next(); JsonNode valueNode = jsonNode.get(COLLECTION_VALUE_FIELD); JsonNode idNode = jsonNode.get(COLLECTION_ID_FIELD); if (valueNode != null && idNode != null) { - String caseAccessGroupId = valueNode.get(CASE_ACCESS_GROUP_ID_FIELD).asText(); + String caseAccessGroupId = asText(valueNode.get(CASE_ACCESS_GROUP_ID_FIELD)); allGroupIds.add(caseAccessGroupId); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/LocationMatcher.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/LocationMatcher.java index 07b32a5b4f..f0235fcb44 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/LocationMatcher.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/LocationMatcher.java @@ -1,12 +1,14 @@ package uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.matcher; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.Optional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.RoleAssignment; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Slf4j @Component public class LocationMatcher implements RoleAttributeMatcher { @@ -35,7 +37,7 @@ public boolean matchAttribute(RoleAssignment roleAssignment, CaseDetails caseDet private Optional getLocation(CaseDetails caseDetails) { JsonNode caseManagementLocation = caseDetails.getData().get(CASE_MANAGEMENT__LOCATION); if (caseManagementLocation != null && caseManagementLocation.get(BASE_LOCATION) != null) { - return Optional.ofNullable(caseManagementLocation.get(BASE_LOCATION).asText()); + return Optional.ofNullable(asText(caseManagementLocation.get(BASE_LOCATION))); } return Optional.empty(); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/RegionMatcher.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/RegionMatcher.java index f9ec467cce..db21685940 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/RegionMatcher.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/RegionMatcher.java @@ -1,12 +1,14 @@ package uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.matcher; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.Optional; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.RoleAssignment; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Slf4j @Component public class RegionMatcher implements RoleAttributeMatcher { @@ -35,7 +37,7 @@ public boolean matchAttribute(RoleAssignment roleAssignment, CaseDetails caseDet private Optional getRegion(CaseDetails caseDetails) { JsonNode caseManagementLocation = caseDetails.getData().get(CASE_MANAGEMENT__LOCATION); if (caseManagementLocation != null && caseManagementLocation.get(REGION) != null) { - return Optional.ofNullable(caseManagementLocation.get(REGION).asText()); + return Optional.ofNullable(asText(caseManagementLocation.get(REGION))); } return Optional.empty(); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedeletion/TTL.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedeletion/TTL.java index 0477543b1f..b9addd973f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casedeletion/TTL.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casedeletion/TTL.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.casedeletion; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/CategoriesAndDocuments.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/CategoriesAndDocuments.java index 933d6e8307..dc389c305e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/CategoriesAndDocuments.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/CategoriesAndDocuments.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.casefileview; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Value; import java.util.List; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Category.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Category.java index c9ae741f60..6c9bb7a9a2 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Category.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Category.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.casefileview; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Value; import java.util.List; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Document.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Document.java index 36ae45f01c..32ba584b31 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Document.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/casefileview/Document.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.casefileview; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Value; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLink.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLink.java index 98b238ec3d..45297fcc0d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLink.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLink.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.model.caselinking; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLinksResource.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLinksResource.java index 3d339bc399..e7915ab40a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLinksResource.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/caselinking/CaseLinksResource.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.caselinking; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/common/CaseFieldPathUtils.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/common/CaseFieldPathUtils.java index 8fa645ab0e..4f08b020d9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/common/CaseFieldPathUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/common/CaseFieldPathUtils.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.model.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.apache.commons.lang3.StringUtils; import uk.gov.hmcts.ccd.domain.model.aggregated.CommonField; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeDefinition.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeDefinition.java index be826b8a3e..36b7a59807 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeDefinition.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeDefinition.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeRoleDefinition.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeRoleDefinition.java index 0d8b7b8dcd..ade5d99128 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeRoleDefinition.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/AccessTypeRoleDefinition.java @@ -3,8 +3,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetails.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetails.java index 8668754311..4eea10d765 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetails.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetails.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.media.Schema; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.slf4j.Logger; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinition.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinition.java index f88547b2a8..1bfd049256 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinition.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinition.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.StringNode; import lombok.ToString; import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; import uk.gov.hmcts.ccd.domain.model.aggregated.CommonField; @@ -215,12 +215,12 @@ public Optional getComplexSubfieldDefinitionByPath(St } @JsonIgnore - public Map getLabelsFromCaseFields() { + public Map getLabelsFromCaseFields() { return getCaseFieldDefinitions() .stream() .filter(caseField -> LABEL.equals(caseField.getFieldTypeDefinition().getType())) .collect(Collectors.toMap(CaseFieldDefinition::getId, caseField -> - JsonNodeFactory.instance.textNode(caseField.getLabel()))); + JsonNodeFactory.instance.stringNode(caseField.getLabel()))); } public List getRoleToAccessProfiles() { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CategoryDefinition.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CategoryDefinition.java index 570f14ee66..b81e44e344 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CategoryDefinition.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/CategoryDefinition.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.model.definition; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchCriteria.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchCriteria.java index 672780c8bc..47887cda9e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchCriteria.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchCriteria.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.model.definition; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; import java.io.Serializable; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchParty.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchParty.java index 8ae60af02e..0325916719 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchParty.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/definition/SearchParty.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.model.definition; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Data; import java.io.Serializable; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/CaseDraft.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/CaseDraft.java index 83308e7dfb..da3ba99d26 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/CaseDraft.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/CaseDraft.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.draft; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import lombok.ToString; import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/Draft.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/Draft.java index b8456711f7..7119c4a855 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/Draft.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/draft/Draft.java @@ -2,7 +2,7 @@ import java.time.ZonedDateTime; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.ToString; @ToString diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchCriteria.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchCriteria.java index 500f0012e2..801ea728ab 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchCriteria.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchCriteria.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchPartyValue.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchPartyValue.java index 5e1d664880..f7038065c5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchPartyValue.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/globalsearch/SearchPartyValue.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/BuildingLocation.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/BuildingLocation.java index f2bf94882e..08128182d7 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/BuildingLocation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/BuildingLocation.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.refdata; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Builder; import lombok.Value; import lombok.extern.jackson.Jacksonized; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/CourtVenue.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/CourtVenue.java index 2c568412b7..a899f55419 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/CourtVenue.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/CourtVenue.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.refdata; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Builder; import lombok.Value; import lombok.extern.jackson.Jacksonized; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/ServiceReferenceData.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/ServiceReferenceData.java index 6a001b5fc0..e26d8f43f1 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/ServiceReferenceData.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/refdata/ServiceReferenceData.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.refdata; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import lombok.Builder; import lombok.Value; import lombok.extern.jackson.Jacksonized; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequest.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequest.java index ec6204a994..84d71f7bc4 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequest.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequest.java @@ -1,10 +1,10 @@ package uk.gov.hmcts.ccd.domain.model.search.elasticsearch; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.BooleanNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.BooleanNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import lombok.Data; import lombok.NonNull; import uk.gov.hmcts.ccd.data.casedetails.search.MetaData; @@ -16,6 +16,8 @@ import static java.util.stream.Collectors.toList; import static uk.gov.hmcts.ccd.config.JacksonUtils.MAPPER; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; import static uk.gov.hmcts.ccd.data.casedetails.CaseDetailsEntity.DATA_CLASSIFICATION_COL; import static uk.gov.hmcts.ccd.data.casedetails.CaseDetailsEntity.DATA_COL; @@ -39,9 +41,9 @@ public class ElasticsearchRequest { static { METADATA_FIELDS = MAPPER.createArrayNode(); for (String metadata : MetaData.CaseField.getColumnNames()) { - METADATA_FIELDS.add(new TextNode(metadata)); + METADATA_FIELDS.add(new StringNode(metadata)); } - METADATA_FIELDS.add(new TextNode(DATA_CLASSIFICATION_COL)); + METADATA_FIELDS.add(new StringNode(DATA_CLASSIFICATION_COL)); } public ElasticsearchRequest(@NonNull JsonNode searchRequest) { @@ -76,7 +78,7 @@ public boolean hasSourceFields() { } return nativeSearchRequest.has(SOURCE) && !getSource().isEmpty() - && !(getSource().size() == 1 && getSource().get(0).asText().equals(WILDCARD)); + && !(getSource().size() == 1 && asText(getSource().get(0)).equals(WILDCARD)); } public JsonNode getSource() { @@ -86,7 +88,7 @@ public JsonNode getSource() { public List getRequestedFields() { if (hasSourceFields() && getSource().isArray()) { return StreamSupport.stream(getSource().spliterator(), false) - .map(JsonNode::asText) + .map(node -> asText(node)) .map(this::getFieldId) .filter(Objects::nonNull) .collect(toList()); @@ -114,7 +116,7 @@ public void setRequestedSupplementaryData(ArrayNode requestedSupplementaryData) public void setRequestedSupplementaryData(String... requestedSupplementaryDataFields) { requestedSupplementaryData = MAPPER.createArrayNode(); for (String field : requestedSupplementaryDataFields) { - requestedSupplementaryData.add(new TextNode(field)); + requestedSupplementaryData.add(stringOrNullNode(field)); } } @@ -137,12 +139,12 @@ private ArrayNode mergedSourceFields() { if (hasSourceFields()) { sourceFields.addAll((ArrayNode) getSource()); } else { - sourceFields.add(new TextNode(DATA_COL)); + sourceFields.add(new StringNode(DATA_COL)); } if (hasRequestedSupplementaryData()) { StreamSupport.stream(getRequestedSupplementaryData().spliterator(), false) - .forEach(sd -> sourceFields.add(new TextNode(SUPPLEMENTARY_DATA_PREFIX + sd.asText()))); + .forEach(sd -> sourceFields.add(new StringNode(SUPPLEMENTARY_DATA_PREFIX + asText(sd)))); } return sourceFields; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/SearchResultViewItem.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/SearchResultViewItem.java index 56585756e2..4592aa13cc 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/SearchResultViewItem.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/SearchResultViewItem.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.search.elasticsearch; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AdditionalMessageInformation.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AdditionalMessageInformation.java index 88a187c2fe..ec8d8449a4 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AdditionalMessageInformation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AdditionalMessageInformation.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.std; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.service.message.additionaldata.DefinitionBlock; import java.util.Map; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AuditEvent.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AuditEvent.java index 444e1287e4..e77f09076d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AuditEvent.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/AuditEvent.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/CaseDataContent.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/CaseDataContent.java index b4b3bbaff9..d8f726d19f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/CaseDataContent.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/CaseDataContent.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.ToString; @ToString diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/MessageQueueCandidate.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/MessageQueueCandidate.java index 0e30db6d94..c47c4a81d9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/MessageQueueCandidate.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/MessageQueueCandidate.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.std; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.Data; import jakarta.persistence.Id; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryData.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryData.java index d4fcce936d..f4dd9a234c 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryData.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryData.java @@ -1,9 +1,10 @@ package uk.gov.hmcts.ccd.domain.model.std; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import java.util.HashMap; @@ -26,7 +27,7 @@ public class SupplementaryData { @JsonIgnore - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private Map response; @@ -54,7 +55,7 @@ public SupplementaryData(JsonNode data, Set requestKeys) { private String jsonNodeToString(JsonNode data) { try { return objectMapper.writeValueAsString(data); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ServiceException("Unable to map object to JSON string", e); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AbstractDefaultGetCaseViewOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AbstractDefaultGetCaseViewOperation.java index 8fe4fc57ee..f81b3146b8 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AbstractDefaultGetCaseViewOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AbstractDefaultGetCaseViewOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.data.definition.UIDefinitionRepository; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewEvent; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewField; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetCaseHistoryViewOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetCaseHistoryViewOperation.java index 1bf84970eb..e475a79871 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetCaseHistoryViewOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetCaseHistoryViewOperation.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; import java.util.Set; -import com.microsoft.applicationinsights.boot.dependencies.apachecommons.lang3.BooleanUtils; +import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.data.casedetails.CachedCaseDetailsRepository; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperation.java index a781218b45..74f798a3bd 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperation.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.StringNode; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -121,7 +121,7 @@ private SearchResultViewItem buildSearchResultViewItem(final CaseDetails caseDet Map caseData = new HashMap<>(caseDetails.getData()); Map caseMetadata = new HashMap<>(caseDetails.getMetadata()); convertReferenceToString(caseMetadata); - Map labels = caseTypeDefinition.getLabelsFromCaseFields(); + Map labels = caseTypeDefinition.getLabelsFromCaseFields(); Map caseFields = prepareData(searchResult, caseData, caseMetadata, labels); String caseId = caseDetails.hasCaseReference() ? caseDetails.getReferenceAsString() : caseDetails.getId(); return new SearchResultViewItem(caseId, caseFields, new HashMap<>(caseFields)); @@ -137,7 +137,7 @@ private Map convertReferenceToString(Map caseMet private Map prepareData(SearchResultDefinition searchResult, Map caseData, Map metadata, - Map labels) { + Map labels) { Map newResults = new HashMap<>(); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackService.java index 7c1f7fe218..bd6df0d64b 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.callbacks; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,8 +19,6 @@ import org.springframework.web.client.RestTemplate; import uk.gov.hmcts.ccd.ApplicationParams; import uk.gov.hmcts.ccd.appinsights.AppInsights; -import uk.gov.hmcts.ccd.appinsights.CallbackTelemetryContext; -import uk.gov.hmcts.ccd.appinsights.CallbackTelemetryThreadContext; import uk.gov.hmcts.ccd.data.SecurityUtils; import uk.gov.hmcts.ccd.domain.model.callbacks.CallbackRequest; import uk.gov.hmcts.ccd.domain.model.callbacks.CallbackResponse; @@ -139,7 +137,6 @@ private Optional> sendRequest(final String url, HttpHeaders securityHeaders = securityUtils.authorizationHeaders(); - CallbackTelemetryThreadContext.setTelemetryContext(new CallbackTelemetryContext(callbackType)); int httpStatus = 0; Instant startTime = Instant.now(); @@ -214,7 +211,7 @@ protected void addPassThroughHeaders(final HttpHeaders httpHeaders) { private void addPassThruContextValuesToHttpHeaders(HttpHeaders httpHeaders, String context) { if (null != request.getAttribute(context)) { - if (httpHeaders.containsKey(context)) { + if (httpHeaders.containsHeader(context)) { httpHeaders.remove(context); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControl.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControl.java index 7a873cc635..9ab04d96cc 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControl.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControl.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.casedataaccesscontrol; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.apache.logging.log4j.util.Strings; @@ -45,6 +45,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.data.caseaccess.GlobalCaseRole.CREATOR; import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_READ; @@ -183,7 +184,7 @@ private String getCaseAccessCategoryFromCaseData(CaseDetails caseDetails) { if (caseDetails.getData() != null) { caseAccessCategory = caseDetails.getData().get("CaseAccessCategory"); } - return caseAccessCategory != null ? caseAccessCategory.asText().trim() : ""; + return caseAccessCategory != null ? asText(caseAccessCategory).trim() : ""; } @Override diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveService.java index bcc1152167..f975d76e02 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveService.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.casedeletion; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import lombok.NonNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -202,7 +202,7 @@ private TTL getTTLFromJson(JsonNode ttlJsonNode) { if (ttlJsonNode != null) { try { return objectMapper.readValue(ttlJsonNode.toString(), TTL.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ValidationException(FAILED_TO_READ_TTL_FROM_CASE_DATA); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsService.java index cb38737e14..8cedf84f44 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.casefileview; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.Tuple2; import lombok.NonNull; import uk.gov.hmcts.ccd.domain.model.casefileview.CategoriesAndDocuments; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentService.java index 8f17e8f89d..4d88380de9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.casefileview; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import io.vavr.Tuple2; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractor.java index 7bb4c60453..ab2377340a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -51,7 +51,7 @@ public List getCaseLinksFromData(CaseDetails caseDetails, for (JsonNode caseLinkNode : jsonNode) { JsonNode nestedCaseFieldByPath = CaseFieldPathUtils.getNestedCaseFieldByPath(caseLinkNode, "value.CaseReference"); - standardCaseReferences.add(nestedCaseFieldByPath.textValue()); + standardCaseReferences.add(nestedCaseFieldByPath.stringValue(null)); } } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalService.java index 2cb725015d..df04f1c23e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.NullNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -80,7 +80,7 @@ private boolean checkCaseReferenceInCaseLinkField(CaseDetails caseDetails, Strin final JsonNode caseLinksJsonNode = caseDetails.getData() .getOrDefault(CaseLinkExtractor.STANDARD_CASE_LINK_FIELD, NullNode.getInstance()); - Iterator iterator = caseLinksJsonNode.elements(); + Iterator iterator = caseLinksJsonNode.values().iterator(); while (iterator.hasNext()) { if (caseReference.equals(getValueFromPath("value.CaseReference", iterator.next()))) { return true; // found diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreator.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreator.java index aefdfbf8a5..02f05ec05f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreator.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.NullNode; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.domain.model.caselinking.CaseLinkDetails; import uk.gov.hmcts.ccd.domain.model.caselinking.CaseLinkInfo; @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.List; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.config.JacksonUtils.getValueFromPath; @Service @@ -32,9 +33,8 @@ private List createCaseLinkInfoList(List caseDetails, List caseLinkInfoList = new ArrayList<>(); caseDetails.forEach( caseDetail -> caseLinkInfoList.add(CaseLinkInfo.builder() - .caseNameHmctsInternal(caseDetail.getData() - .getOrDefault("caseNameHmctsInternal", NullNode.getInstance()) - .asText(null)) + .caseNameHmctsInternal(asText(caseDetail.getData() + .getOrDefault("caseNameHmctsInternal", NullNode.getInstance()), null)) .caseReference(String.valueOf(caseDetail.getReference())) .ccdCaseType(caseDetail.getCaseTypeId()) .ccdJurisdiction(caseDetail.getJurisdiction()) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlService.java index 76ea52f577..66b257d841 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -222,14 +222,14 @@ default void locateAndRemoveChildNode(CaseFieldDefinition caseField, JsonNode js if (caseField.isCollectionFieldType() && jsonNode.isArray()) { jsonNode.forEach(jsonNode1 -> ((ObjectNode) jsonNode1.get(VALUE)).remove(childField.getId())); } else { - // We are getting class com.fasterxml.jackson.databind.node.MissingNode cannot be cast to class - // com.fasterxml.jackson.databind.node.ObjectNode exception when childField.getId() is null, so this + // We are getting class tools.jackson.databind.node.MissingNode cannot be cast to class + // tools.jackson.databind.node.ObjectNode exception when childField.getId() is null, so this // is added to check if the value exists. if (jsonNode instanceof ObjectNode) { ((ObjectNode) jsonNode).remove(childField.getId()); } else { - LOG.debug("Logging below details as we are getting com.fasterxml.jackson.databind.node.MissingNode " - + " cannot be cast to class com.fasterxml.jackson.databind.node.ObjectNode"); + LOG.debug("Logging below details as we are getting tools.jackson.databind.node.MissingNode " + + " cannot be cast to class tools.jackson.databind.node.ObjectNode"); LOG.info("Can not find field with caseFieldId={}, accessControlList={}", caseField.getId(), caseField.getAccessControlLists()); } @@ -562,7 +562,10 @@ && hasAccessControlList(accessProfiles, } default Stream getStream(JsonNode newData) { - return StreamSupport.stream(spliteratorUnknownSize(newData.fieldNames(), Spliterator.ORDERED), false); + return StreamSupport.stream( + spliteratorUnknownSize(newData.propertyNames().iterator(), Spliterator.ORDERED), + false + ); } default boolean hasCaseEventAccess(String eventId, diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceImpl.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceImpl.java index c52f95ad37..f27b02db6d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceImpl.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceImpl.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -38,7 +38,7 @@ public class AccessControlServiceImpl implements AccessControlService { private static final Logger LOG = LoggerFactory.getLogger(AccessControlServiceImpl.class); - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private final ApplicationParams applicationParams; @@ -109,7 +109,7 @@ public boolean canAccessCaseFieldsWithCriteria(final JsonNode caseFields, final Set accessProfiles, final Predicate criteria) { if (caseFields != null) { - final Iterator fieldNames = caseFields.fieldNames(); + final Iterator fieldNames = caseFields.propertyNames().iterator(); while (fieldNames.hasNext()) { if (!hasCaseFieldAccess(caseFieldDefinitions, accessProfiles, criteria, fieldNames.next())) { return false; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtils.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtils.java index 99a733f4c0..35cc894406 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtils.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.common; -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 tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,6 +25,8 @@ import java.util.HashMap; import java.util.UUID; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Component public class CaseAccessGroupUtils { @@ -76,7 +78,7 @@ private void addCaseAccessGroupWithIds(JsonNode caseAssignedRoleFieldNode, List caseAccessGroupWithIds) { if (caseAssignedRoleFieldNode != null) { String orgIdentifier = caseAssignedRoleFieldNode.get(ORGANISATION) - .get(ORGANISATIONID).textValue(); + .get(ORGANISATIONID).stringValue(null); if (orgIdentifier != null && !orgIdentifier.isEmpty()) { String caseGroupID = acd.getCaseAccessGroupIdTemplate() @@ -140,7 +142,7 @@ private void setUpModifiedCaseAccessGroups(CaseDetails caseDetails, JsonNode mergedNode = null; try { mergedNode = objectMapper.readTree(mergedValue); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ValidationException(String.format(e.getMessage())); } @@ -165,7 +167,7 @@ public List findListOfOrganisationPolicyNodeForCaseRole(CaseDetails ca .stream() .filter(Objects::nonNull) .filter(node -> node != null && node.get(ORG_POLICY_CASE_ASSIGNED_ROLE) != null - && node.get(ORG_POLICY_CASE_ASSIGNED_ROLE).asText().equalsIgnoreCase(caseRoleId)) + && asText(node.get(ORG_POLICY_CASE_ASSIGNED_ROLE)).equalsIgnoreCase(caseRoleId)) .toList(); LOG.debug("Organisations found for CASE_ACCESS_GROUPS={} caseType={} version={} ORGANISATION={}," @@ -223,7 +225,7 @@ private boolean hasNodeValueAndId(JsonNode caseAccessGroupTypeValueNode) { private boolean isCaseAccessGroupTypeField(JsonNode field) { return (field != null && field.get(CASE_ACCESS_GROUP_TYPE) != null - && field.get(CASE_ACCESS_GROUP_TYPE).textValue().equals(CCD_ALL_CASES)); + && field.get(CASE_ACCESS_GROUP_TYPE).stringValue(null).equals(CCD_ALL_CASES)); } private boolean isCaseAccessGroupFromDataClassificationAvailable(CaseDetails caseDetails) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractor.java index 415a571e67..a127283269 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import lombok.extern.slf4j.Slf4j; import uk.gov.hmcts.ccd.config.JacksonUtils; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataService.java index 6483e699e6..466c772844 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataService.java @@ -10,10 +10,10 @@ import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COMPLEX; import static uk.gov.hmcts.ccd.domain.service.common.SecurityClassificationUtils.getDataClassificationForData; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; @@ -24,7 +24,7 @@ @Service public class CaseDataService { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String EMPTY_STRING = ""; private static final String FIELD_SEPARATOR = "."; private static final String DEFAULT_CLASSIFICATION = ""; @@ -47,7 +47,7 @@ private void deduceDefaultClassifications(final JsonNode dataNode, final JsonNode existingDataClassificationNode, final List caseFieldDefinitions, final String fieldIdPrefix) { - final Iterator fieldNames = dataNode.fieldNames(); + final Iterator fieldNames = dataNode.propertyNames().iterator(); while (fieldNames.hasNext()) { boolean found = false; final String fieldName = fieldNames.next(); @@ -109,7 +109,8 @@ private void deduceClassificationForSimpleType(ObjectNode dataNode, String fieldName, CaseFieldDefinition caseField) { dataNode.put(fieldName, existingDataClassificationNode.equals(JSON_NODE_FACTORY.objectNode()) - ? getClassificationFromCaseFieldOrDefault(caseField) : existingDataClassificationNode.textValue()); + ? getClassificationFromCaseFieldOrDefault(caseField) + : existingDataClassificationNode.stringValue(null)); } private String getClassificationFromCaseFieldOrDefault(CaseFieldDefinition caseField) { @@ -142,8 +143,8 @@ private void deduceClassificationForCollectionType(JsonNode dataNode, } else { final ObjectNode simpleCollectionItemNode = (ObjectNode) field; // Add `classification` property - final String newClassification = itemClassification.isTextual() - ? itemClassification.textValue() : getClassificationFromCaseFieldOrDefault(caseField); + final String newClassification = itemClassification.isString() + ? itemClassification.stringValue(null) : getClassificationFromCaseFieldOrDefault(caseField); simpleCollectionItemNode.put(CLASSIFICATION, newClassification); // Remove `value` property simpleCollectionItemNode.remove(VALUE); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseFieldMetadataExtractor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseFieldMetadataExtractor.java index 2fe8cea59a..a76748d922 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseFieldMetadataExtractor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseFieldMetadataExtractor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import lombok.Value; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseService.java index dca4df2ae5..0d966fefc5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Maps; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -127,7 +127,7 @@ public Map buildJsonFromCaseFieldsWithDefaultValue( String defaultValue = caseField.getDefaultValue(); if (defaultValue != null) { - data.put(caseField.getCaseFieldId(), MAPPER.getNodeFactory().textNode(defaultValue)); + data.put(caseField.getCaseFieldId(), MAPPER.getNodeFactory().stringNode(defaultValue)); } List collect = caseField.getCaseEventFieldComplexDefinitions().stream() @@ -140,7 +140,7 @@ public Map buildJsonFromCaseFieldsWithDefaultValue( if (!collect.isEmpty()) { // to prevent construct like "FieldA": {} ObjectNode objectNode = MAPPER.getNodeFactory().objectNode(); collect.forEach(e -> { - String next = e.fieldNames().next(); + String next = e.propertyNames().iterator().next(); objectNode.set(next, e.findValue(next)); }); data.put(caseField.getCaseFieldId(), objectNode); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeService.java index 0603994030..8df81df13e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import uk.gov.hmcts.ccd.data.definition.CachedCaseDefinitionRepository; import uk.gov.hmcts.ccd.data.definition.CaseDefinitionRepository; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractor.java index 58d18d868c..bf92682bed 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlService.java index 3bfbb7b87b..e910fd062c 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.NullNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.NullNode; import java.util.Optional; import java.util.Set; import java.util.Spliterator; @@ -13,6 +13,7 @@ import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import static java.util.Spliterators.spliteratorUnknownSize; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_CREATE; import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_DELETE; import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_UPDATE; @@ -107,8 +108,10 @@ private boolean itemDeletedAndHasDeleteAccess(JsonNode existingData, CaseFieldDefinition caseFieldDefinition, Set accessProfiles) { boolean containsDeletedItem = caseFieldDefinition.isCollectionFieldType() && StreamSupport - .stream(spliteratorUnknownSize(existingData.get(caseFieldDefinition.getId()).elements(), - Spliterator.ORDERED), false) + .stream(spliteratorUnknownSize( + existingData.get(caseFieldDefinition.getId()).values().iterator(), + Spliterator.ORDERED + ), false) .anyMatch(oldItem -> itemMissing(oldItem, newData.get(caseFieldDefinition.getId()))); return (!containsDeletedItem @@ -121,7 +124,7 @@ private boolean itemDeletedAndHasDeleteAccess(JsonNode existingData, private boolean itemMissing(JsonNode oldItem, JsonNode newValue) { boolean itemExists = - StreamSupport.stream(spliteratorUnknownSize(newValue.elements(), Spliterator.ORDERED), false) + StreamSupport.stream(spliteratorUnknownSize(newValue.values().iterator(), Spliterator.ORDERED), false) .anyMatch(newItem -> !isNullId(newItem) && newItem.get("id").equals(oldItem.get("id"))); return !itemExists; } @@ -199,7 +202,10 @@ private boolean itemUpdatedAndHasUpdateAccess(JsonNode existingData, Set accessProfiles) { if (caseFieldDefinition.isCollectionFieldType()) { boolean containsUpdatedItem = StreamSupport.stream( - spliteratorUnknownSize(existingData.get(caseFieldDefinition.getId()).elements(), Spliterator.ORDERED), + spliteratorUnknownSize( + existingData.get(caseFieldDefinition.getId()).values().iterator(), + Spliterator.ORDERED + ), false) .anyMatch(oldItem -> itemUpdated(oldItem, newData.get(caseFieldDefinition.getId()), @@ -213,7 +219,7 @@ private boolean itemUpdatedAndHasUpdateAccess(JsonNode existingData, private boolean itemUpdated(JsonNode oldItem, JsonNode newValue, CaseFieldDefinition caseFieldDefinition, Set accessProfiles) { - return StreamSupport.stream(spliteratorUnknownSize(newValue.elements(), Spliterator.ORDERED), false) + return StreamSupport.stream(spliteratorUnknownSize(newValue.values().iterator(), Spliterator.ORDERED), false) .anyMatch(newItem -> { boolean itemExists = !isNullId(newItem) && newItem.get("id").equals(oldItem.get("id")); if (itemExists) { @@ -340,19 +346,19 @@ private Optional findCorrespondingNode(final JsonNode newItem, final J if (newItem == null) { return Optional.empty(); } - return StreamSupport.stream(spliteratorUnknownSize(newItem.elements(), Spliterator.ORDERED), false) + return StreamSupport.stream(spliteratorUnknownSize(newItem.values().iterator(), Spliterator.ORDERED), false) .filter(node -> node.get("id") != null && node.get("id").equals(id)) .findFirst(); } private boolean containsNewCollectionItem(JsonNode data) { - return StreamSupport.stream(spliteratorUnknownSize(data.elements(), Spliterator.ORDERED), false) + return StreamSupport.stream(spliteratorUnknownSize(data.values().iterator(), Spliterator.ORDERED), false) .anyMatch(this::isNullId); } private boolean isNullId(JsonNode newItem) { return newItem.get("id") == null || newItem.get("id").equals(NullNode.getInstance()) - || newItem.get("id").asText().equalsIgnoreCase("null"); + || asText(newItem.get("id")).equalsIgnoreCase("null"); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorer.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorer.java index 8ef75a4d56..5489e46ad9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorer.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorer.java @@ -1,10 +1,10 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.AccessProfile; @@ -20,6 +20,7 @@ import java.util.Set; import java.util.stream.StreamSupport; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.extractAccessProfileNames; /** @@ -105,7 +106,7 @@ private JsonNode processSubFieldsRecursively(CaseFieldDefinition parentFieldDefi ObjectNode sanitizedObjectNode = initializeSanitizedObjectNode(sanitizedNode); ObjectNode existingObjectNode = (ObjectNode) existingNode; - existingObjectNode.fieldNames().forEachRemaining(fieldName -> { + existingObjectNode.propertyNames().forEach(fieldName -> { JsonNode existingSubField = existingObjectNode.get(fieldName); JsonNode sanitizedSubField = sanitizedObjectNode.get(fieldName); @@ -242,7 +243,7 @@ private JsonNode processSimpleValueField(CaseFieldDefinition subFieldDefinition, private boolean isNullId(JsonNode newItem) { return newItem.get(ID) == null || newItem.get(ID).equals(NullNode.getInstance()) - || "null".equalsIgnoreCase(newItem.get(ID).asText()); + || "null".equalsIgnoreCase(asText(newItem.get(ID))); } private boolean isNullNode(JsonNode node) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperService.java index bc232fe2b0..d02827d9f9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperService.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.JsonNodeFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -17,7 +17,7 @@ @Service public class DefaultObjectMapperService implements ObjectMapperService { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private final ObjectMapper objectMapper; @Autowired @@ -38,7 +38,7 @@ public T convertStringToObject(String string, Class classType) { public String convertObjectToString(Object object) { try { return objectMapper.writeValueAsString(object); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new ServiceException("Unable map object to JSON string", e); } } @@ -52,7 +52,7 @@ public JsonNode convertObjectToJsonNode(Object object) { public Map convertJsonNodeToMap(JsonNode node) { try { return objectMapper.convertValue(node, JacksonUtils.getHashMapTypeReference()); - } catch (IllegalArgumentException e) { + } catch (IllegalArgumentException | JacksonException e) { throw new ServiceException("Unable to convert JSON node to map", e); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/NewCaseUtils.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/NewCaseUtils.java index f7e296ce2f..23468f1d93 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/NewCaseUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/NewCaseUtils.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import lombok.experimental.UtilityClass; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +15,7 @@ import java.util.Map; import java.util.HashMap; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; @UtilityClass public class NewCaseUtils { @@ -55,7 +56,7 @@ public static List findListOfOrganisationPolicyNodesForNewCase(CaseDet .stream() .filter(Objects::nonNull) .filter(node -> node != null && node.get(ORG_POLICY_NEW_CASE) != null - && node.get(ORG_POLICY_NEW_CASE).asText().toUpperCase().equals(newCaseValue)) + && asText(node.get(ORG_POLICY_NEW_CASE)).toUpperCase().equals(newCaseValue)) .toList(); LOG.debug("Organisation found for caseType={} version={} ORGANISATION={}," @@ -68,10 +69,10 @@ public static List findListOfOrganisationPolicyNodesForNewCase(CaseDet private static void updateCaseNewCaseSupplementaryData(CaseDetails caseDetails, List organizationProfiles) { - ObjectNode orgNode = new ObjectMapper().createObjectNode(); + ObjectNode orgNode = JsonNodeFactory.instance.objectNode(); for (JsonNode orgProfile : organizationProfiles) { String orgIdentifier = orgProfile.get(ORGANISATION) - .get(ORGANISATIONID).textValue(); + .get(ORGANISATIONID).stringValue(null); if (orgIdentifier != null && !orgIdentifier.isEmpty()) { orgNode.put(orgIdentifier, Boolean.TRUE); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ObjectMapperService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ObjectMapperService.java index 11be2654d4..301063ba68 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ObjectMapperService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/ObjectMapperService.java @@ -2,7 +2,7 @@ import java.util.Map; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; /** * Common Object mapper service for serialising/de-serialising objects. diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationUtils.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationUtils.java index 5a6d98569d..57572c44ac 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationUtils.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -20,7 +20,7 @@ public class SecurityClassificationUtils { private static final Logger LOG = LoggerFactory.getLogger(SecurityClassificationUtils.class); private static final String ID = "id"; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private SecurityClassificationUtils() { } @@ -40,7 +40,7 @@ public static Optional getSecurityClassification(JsonNod if (dataNode == null || dataNode.isNull()) { return Optional.empty(); } - return getSecurityClassification(dataNode.textValue()); + return getSecurityClassification(dataNode.stringValue(null)); } public static Optional getSecurityClassification(String classification) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationService.java index defe0222f8..c141ff2992 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -75,7 +75,8 @@ private void validateObject(JsonNode callbackDataClassification, JsonNode defaul throw new ValidationException(VALIDATION_ERR_MSG); } - Iterator> callbackDataClassificationIterator = callbackDataClassification.fields(); + Iterator> callbackDataClassificationIterator = + callbackDataClassification.properties().iterator(); while (callbackDataClassificationIterator.hasNext()) { Map.Entry callbackClassificationMap = callbackDataClassificationIterator.next(); String callbackClassificationKey = callbackClassificationMap.getKey(); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractor.java index 380d86a9dc..ea0f2f76e8 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import lombok.NonNull; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperation.java index 72e668ec8d..5f69b097a3 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperation.java index 5cfcf16c88..04826f4857 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperation.java index f401cb6619..a73c4ec080 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperation.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import com.jayway.jsonpath.PathNotFoundException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventService.java index 9fa1f2a664..9c2d21ca8a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperation.java index 0e37d1ded6..6f8648d2e1 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperation.java @@ -1,7 +1,5 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.inject.Inject; import jakarta.transaction.Transactional; import org.slf4j.Logger; @@ -27,8 +25,6 @@ public class DefaultCreateEventOperation implements CreateEventOperation { private static final Logger LOG = LoggerFactory.getLogger(DefaultCreateEventOperation.class); - private static final ObjectMapper mapper = new ObjectMapper(); - private final EventValidator eventValidator; private final CreateCaseEventService createEventService; private final CallbackInvoker callbackInvoker; @@ -43,7 +39,6 @@ public DefaultCreateEventOperation(final EventValidator eventValidator, this.eventValidator = eventValidator; this.callbackInvoker = callbackInvoker; this.keyHolder = keyHolder; - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); } @Transactional diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallback.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallback.java index 01c81ad669..43ad55d5ce 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallback.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallback.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.Map; import java.util.Optional; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentService.java index 7dfd1de41d..28bf1542d3 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import org.jooq.lambda.tuple.Tuple2; import uk.gov.hmcts.ccd.ApplicationParams; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampService.java index 1c98da5d60..0a8ef2172d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampService.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.springframework.beans.factory.annotation.Qualifier; import uk.gov.hmcts.ccd.ApplicationParams; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; @@ -29,6 +29,7 @@ import java.util.Set; import java.util.stream.Collectors; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.service.getcasedocument.CaseDocumentUtils.DOCUMENT_URL; import static uk.gov.hmcts.ccd.domain.service.getcasedocument.CaseDocumentUtils.UPLOAD_TIMESTAMP; import static uk.gov.hmcts.ccd.domain.types.CollectionValidator.VALUE; @@ -126,13 +127,13 @@ protected List getDocumentUrls(List jsonNodes) { protected List findDocumentUrls(Collection nodes) { List lstJsonNodes = findNodes(nodes); List lstDocumentUrls = new ArrayList<>(); - lstJsonNodes.forEach(node -> lstDocumentUrls.add(node.get(DOCUMENT_URL).asText())); + lstJsonNodes.forEach(node -> lstDocumentUrls.add(asText(node.get(DOCUMENT_URL)))); return lstDocumentUrls; } protected List findDocumentUrls(List jsonNodes) { List documentUrls = new ArrayList<>(); - jsonNodes.forEach(node -> documentUrls.add(node.get(DOCUMENT_URL).asText())); + jsonNodes.forEach(node -> documentUrls.add(asText(node.get(DOCUMENT_URL)))); return documentUrls; } @@ -177,7 +178,7 @@ protected void addUploadTimestampToDocument(Collection nodes, jsonNodes.forEach(jsonNode -> { JsonNode documentUrl = jsonNode.get(DOCUMENT_URL); if (documentUrl != null - && documentUrlsNew.contains(documentUrl.asText()) + && documentUrlsNew.contains(asText(documentUrl)) && isToBeUpdatedWithTimestamp(jsonNode)) { insertUploadTimestamp(jsonNode, uploadTimestamp); } @@ -281,12 +282,12 @@ private String extractDocumentUrl(JsonNode documentNode) { if (urlNode == null || urlNode.isNull()) { return null; } - return urlNode.asText(); + return asText(urlNode); } private String getDocumentFilename(JsonNode documentNode) { - if (documentNode.has(DOCUMENT_FILENAME) && documentNode.get(DOCUMENT_FILENAME).isTextual()) { - return documentNode.get(DOCUMENT_FILENAME).asText(); + if (documentNode.has(DOCUMENT_FILENAME) && documentNode.get(DOCUMENT_FILENAME).isString()) { + return asText(documentNode.get(DOCUMENT_FILENAME)); } return null; } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtils.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtils.java index 81c912d0e7..eaab46ea9a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtils.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtils.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.NonNull; import org.jooq.lambda.tuple.Tuple2; import uk.gov.hmcts.ccd.endpoint.exceptions.BadRequestException; @@ -16,6 +16,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Named public class CaseDocumentUtils { private static final Function>, @@ -42,15 +44,15 @@ public List> findDocumentsHashes(@NonNull final Map new Tuple2<>( getDocumentId(node), - Optional.ofNullable(node.get(DOCUMENT_HASH)).map(JsonNode::textValue).orElse(null)) + Optional.ofNullable(node.get(DOCUMENT_HASH)).map(JsonNode::stringValue).orElse(null)) ) .collect(Collectors.toUnmodifiableList()); } private String getDocumentId(final JsonNode jsonNode) { final String documentIdField = Optional.ofNullable(jsonNode.get(DOCUMENT_BINARY_URL)) - .map(JsonNode::asText) - .orElse(jsonNode.get(DOCUMENT_URL).asText()); + .map(node -> asText(node)) + .orElse(asText(jsonNode.get(DOCUMENT_URL))); final String documentId = documentIdField.contains(BINARY) ? documentIdField.substring(documentIdField.length() - 43, documentIdField.length() - 7) @@ -80,7 +82,7 @@ public List findDocumentNodes(@NonNull final Map dat } private boolean nonHearingRecordingUrl(JsonNode documentNode) { - return !documentNode.get(DOCUMENT_URL).asText().contains(HEARING_RECORDINGS); + return !asText(documentNode.get(DOCUMENT_URL)).contains(HEARING_RECORDINGS); } public Set getTamperedHashes(@NonNull final List> preCallbackHashes, diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentOperation.java index a935cc9156..d736f1af63 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -62,7 +62,7 @@ public CaseDocumentMetadata getCaseDocumentMetadata(String caseReference, String private boolean isDocumentPresentInTheCaseData(String documentId, Map data) { return data.values().stream() - .map(node -> node.findValuesAsText(DOCUMENT_BINARY_URL)) + .map(node -> node.findValuesAsString(DOCUMENT_BINARY_URL)) .flatMap(List::stream) .anyMatch(binaryLink -> isDocumentIdMatches(binaryLink, documentId)); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParser.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParser.java index 1988f15933..cb771bb8e5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParser.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.jsonpath; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import com.google.common.collect.Maps; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.DocumentContext; @@ -53,7 +53,7 @@ public void updateCaseDocumentData(String attributePath, String value, CaseDetai documentContext.set(JsonPath.compile(jsonPath), value); try { caseDetails.setData(JacksonUtils.convertJsonNode(documentContext.jsonString())); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new BadRequestException("Unable to process updated Case Details Data"); } } @@ -73,7 +73,7 @@ public String compiledPath(String attributePath, boolean addJsonPathNotation) { private String convertToJson(CaseDetails caseDetails) { try { return JacksonUtils.writeValueAsString(caseDetails.getData()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new BadRequestException("Unable to process Case Details Data"); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageService.java index 34ded349de..dacfe48f4c 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageService.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.message; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.data.casedetails.CaseAuditEventRepository; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGenerator.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGenerator.java index 94b8023915..b041766ce5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGenerator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGenerator.java @@ -1,13 +1,14 @@ package uk.gov.hmcts.ccd.domain.service.message.additionaldata; -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.BooleanNode; -import com.fasterxml.jackson.databind.node.DecimalNode; -import com.fasterxml.jackson.databind.node.LongNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +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.BooleanNode; +import tools.jackson.databind.node.DecimalNode; +import tools.jackson.databind.node.LongNode; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.DisplayContext; @@ -29,7 +30,7 @@ @Component public class DataBlockGenerator { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); public Map generateData(AdditionalDataContext context) { Map dataBlock = newHashMap(); @@ -166,15 +167,17 @@ private JsonNode buildSimpleNode(JsonNode node, String fieldType) { } private JsonNode booleanNodeOf(JsonNode node) { - if (isNullOrEmpty(node.textValue())) { + if (isNullOrEmpty(node.stringValue(null))) { return MAPPER.nullNode(); } - return node.textValue().equalsIgnoreCase("Yes") ? BooleanNode.TRUE : BooleanNode.FALSE; + return node.stringValue(null).equalsIgnoreCase("Yes") ? BooleanNode.TRUE : BooleanNode.FALSE; } private JsonNode processNumberNodeOf(JsonNode node) { - return node.isNumber() ? LongNode.valueOf(node.asLong()) : LongNode.valueOf(Long.parseLong(node.textValue())); + return node.isNumber() + ? LongNode.valueOf(node.asLong()) + : LongNode.valueOf(Long.parseLong(node.stringValue(null))); } private JsonNode numberNodeOf(JsonNode node) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/PublishableField.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/PublishableField.java index 71f94f460f..02dac42b66 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/PublishableField.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/PublishableField.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.message.additionaldata; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/CaseViewFieldProcessor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/CaseViewFieldProcessor.java index 6059b6b2eb..803e840752 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/CaseViewFieldProcessor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/CaseViewFieldProcessor.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.ObjectNode; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewField; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewFieldBuilder; import uk.gov.hmcts.ccd.domain.model.definition.WizardPageField; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessor.java index 30f4a26f4c..4a304957a7 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessor.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import java.util.List; import java.util.Optional; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewField; @@ -16,11 +17,12 @@ import uk.gov.hmcts.ccd.domain.model.definition.WizardPageField; import uk.gov.hmcts.ccd.domain.types.BaseType; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COMPLEX; public abstract class FieldProcessor { - protected static final ObjectMapper MAPPER = new ObjectMapper(); + protected static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); protected static final String FIELD_SEPARATOR = "."; private final CaseViewFieldBuilder caseViewFieldBuilder; @@ -55,7 +57,7 @@ protected JsonNode executeComplex(JsonNode complexNode, return null; } ObjectNode newNode = MAPPER.createObjectNode(); - complexNode.fieldNames().forEachRemaining(fieldId -> { + complexNode.propertyNames().forEach(fieldId -> { final JsonNode caseFieldNode = complexNode.get(fieldId); Optional complexCaseFieldOpt = complexCaseFields.stream().filter(f -> f.getId().equals(fieldId)).findFirst(); @@ -117,7 +119,7 @@ protected abstract JsonNode executeCollection(JsonNode collectionNode, public static boolean isNullOrEmpty(final JsonNode node) { return node == null || node.isNull() - || (node.isTextual() && (null == node.asText() || node.asText().trim().length() == 0)) + || (node.isString() && (null == asText(node) || asText(node).trim().length() == 0)) || (node.isObject() && node.toString().equals("{}")); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorService.java index 3df2f289aa..b2573bfe04 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,6 +20,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + @Service public class FieldProcessorService { @@ -114,7 +116,7 @@ private WizardPageField wizardPageField(List wizardPageFields, private boolean isNullOrEmpty(final JsonNode node) { return node == null || node.isNull() - || (node.isTextual() && (null == node.asText() || node.asText().trim().length() == 0)) + || (node.isString() && (null == asText(node) || asText(node).trim().length() == 0)) || (node.isObject() && node.toString().equals("{}")); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorService.java index 9337b18749..aa9030bdba 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorService.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.common.Strings; import org.springframework.beans.factory.annotation.Autowired; @@ -101,7 +101,7 @@ private SearchCriteria populateSearchCriteria(Map data, } else if (key.equals(currentSearchCriteria.getOtherCaseReference()) && !jsonNode.isNull()) { otherCaseReferences.add(OtherCaseReference.builder() .id(UUID.randomUUID().toString()) - .value(jsonNode.textValue()) + .value(jsonNode.stringValue(null)) .build()); } })); @@ -304,7 +304,7 @@ private Map getCollectionItemValueFromJsonNode(JsonNode jsonNo } private String jsonNodeObjectToText(JsonNode jsonNode) { - return isNull(jsonNode) ? null : jsonNode.textValue(); + return isNull(jsonNode) ? null : jsonNode.stringValue(null); } private boolean isNull(JsonNode jsonNode) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeEntryProcessor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeEntryProcessor.java index 1cd423ca5a..be9c9593f2 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeEntryProcessor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeEntryProcessor.java @@ -1,9 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import java.util.Arrays; import java.util.List; @@ -16,6 +15,7 @@ import uk.gov.hmcts.ccd.domain.types.BaseType; import uk.gov.hmcts.ccd.endpoint.exceptions.DataProcessingException; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.model.common.DisplayContextParameterType.DATETIMEENTRY; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATE; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATETIME; @@ -45,7 +45,7 @@ protected JsonNode executeSimple(JsonNode node, return !isNullOrEmpty(node) && field.hasDisplayContextParameter(DATETIMEENTRY) && isSupportedBaseType(baseType, SUPPORTED_TYPES) - ? createNode(field, node.asText(), baseType, fieldPath) + ? createNode(field, asText(node), baseType, fieldPath) : node; } @@ -84,7 +84,7 @@ private JsonNode createCollectionValueNode(JsonNode valueNode, return valueNode; } return isSupportedBaseType(collectionFieldType, SUPPORTED_TYPES) - ? createNode(caseViewField, valueNode.asText(), collectionFieldType, fieldPath) + ? createNode(caseViewField, asText(valueNode), collectionFieldType, fieldPath) : executeComplex(valueNode, caseViewField.getFieldTypeDefinition().getChildren(), null, @@ -92,7 +92,10 @@ private JsonNode createCollectionValueNode(JsonNode valueNode, topLevelField); } - private TextNode createNode(CommonField caseViewField, String valueToConvert, BaseType baseType, String fieldPath) { + private JsonNode createNode(CommonField caseViewField, + String valueToConvert, + BaseType baseType, + String fieldPath) { String format = caseViewField.getDisplayContextParameterValue(DATETIMEENTRY) .orElseThrow(() -> new DataProcessingException().withDetails( String.format("Unable to obtain datetime format for field %s with display context parameter %s", diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParser.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParser.java index ddf9118262..429286bf61 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParser.java @@ -15,8 +15,7 @@ import java.util.Objects; import java.util.stream.Collectors; -import com.fasterxml.jackson.databind.node.TextNode; -import com.google.common.base.Strings; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.domain.types.BaseType; @@ -24,6 +23,7 @@ import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATE; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATETIME; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; @Component @Slf4j @@ -51,18 +51,18 @@ public String convertIso8601ToDate(String dateFormat, String value) { return date.format(DateTimeFormatter.ofPattern(dateFormat)); } - public TextNode valueToTextNode(String valueToConvert, BaseType baseType, String fieldPath, + public JsonNode valueToTextNode(String valueToConvert, BaseType baseType, String fieldPath, String format, boolean toIso) { - if (Strings.isNullOrEmpty(valueToConvert)) { - return new TextNode(valueToConvert); + if (valueToConvert == null || valueToConvert.isEmpty()) { + return stringOrNullNode(valueToConvert); } try { if (baseType == BaseType.get(DATETIME)) { - return new TextNode(toIso ? convertDateTimeToIso8601(format, valueToConvert) : + return stringOrNullNode(toIso ? convertDateTimeToIso8601(format, valueToConvert) : convertIso8601ToDateTime(format, valueToConvert)); } else if (baseType == BaseType.get(DATE)) { - return new TextNode(toIso ? convertDateToIso8601(format, valueToConvert) : + return stringOrNullNode(toIso ? convertDateToIso8601(format, valueToConvert) : convertIso8601ToDate(format, valueToConvert)); } else { throw new DataProcessingException().withDetails( diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchInputProcessor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchInputProcessor.java index 5a2a3393a5..7c50670029 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchInputProcessor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchInputProcessor.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.primitives.Ints; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -29,8 +28,6 @@ @Component public class DateTimeSearchInputProcessor { - protected static final ObjectMapper MAPPER = new ObjectMapper(); - private final DateTimeFormatParser dateTimeFormatParser; private final GetCriteriaOperation getCriteriaOperation; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessor.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessor.java index b8ee75af0e..b6620d0c7a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessor.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessor.java @@ -1,10 +1,11 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -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 com.fasterxml.jackson.databind.node.TextNode; +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; +import tools.jackson.databind.node.StringNode; import com.google.common.base.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,6 +22,8 @@ import java.util.Optional; import java.util.stream.Collectors; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; import static uk.gov.hmcts.ccd.domain.model.common.DisplayContextParameterType.DATETIMEDISPLAY; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATETIME; import static uk.gov.hmcts.ccd.domain.service.processor.FieldProcessor.isNullOrEmpty; @@ -30,7 +33,7 @@ @Component public class DateTimeSearchResultProcessor { - protected static final ObjectMapper MAPPER = new ObjectMapper(); + protected static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String FIELD_SEPARATOR = "."; private final DateTimeFormatParser dateTimeFormatParser; @@ -59,8 +62,8 @@ private U processViewItem private Object processObject(final Object object, final CommonViewHeader viewHeader) { - if (object instanceof TextNode && !isNullOrEmpty((TextNode) object)) { - return createTextNodeFrom((TextNode) object, viewHeader, viewHeader.getCaseFieldId()); + if (object instanceof StringNode && !isNullOrEmpty((StringNode) object)) { + return createTextNodeFrom((StringNode) object, viewHeader, viewHeader.getCaseFieldId()); } else if (object instanceof ArrayNode && !isNullOrEmpty((ArrayNode) object)) { return createArrayNodeFrom((ArrayNode) object, viewHeader, viewHeader.getCaseFieldId()); } else if (object instanceof ObjectNode && !isNullOrEmpty((ObjectNode) object)) { @@ -69,7 +72,7 @@ private Object processObject(final Object object, viewHeader.getCaseFieldTypeDefinition().getComplexFields(), viewHeader.getCaseFieldId()); } else if (object instanceof LocalDateTime) { - return createTextNodeFrom(new TextNode(((LocalDateTime) object) + return createTextNodeFrom(new StringNode(((LocalDateTime) object) .format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT))), viewHeader, viewHeader.getCaseFieldId()); } @@ -102,18 +105,18 @@ private JsonNode createObjectNodeFrom(final ObjectNode originalNode, complexCaseField.getFieldTypeDefinition().getComplexFields(), fieldPath)) .ifPresent(result -> newNode.set(fieldId, result)); } else { - newNode.set(fieldId, createTextNodeFrom((TextNode) caseFieldNode, viewHeader, fieldPath)); + newNode.set(fieldId, createTextNodeFrom((StringNode) caseFieldNode, viewHeader, fieldPath)); } }); return newNode; } - private JsonNode createTextNodeFrom(final TextNode originalNode, + private JsonNode createTextNodeFrom(final StringNode originalNode, final CommonViewHeader viewHeader, final String fieldPath) { - if (Strings.isNullOrEmpty(originalNode.asText())) { - return new TextNode(originalNode.asText()); + if (Strings.isNullOrEmpty(asText(originalNode))) { + return new StringNode(asText(originalNode)); } Optional nestedField = @@ -132,13 +135,13 @@ private JsonNode createTextNodeFrom(final TextNode originalNode, : collectionFieldType.getType(); }); if (fieldType.equals(DATETIME) || viewHeader.isMetadata()) { - return new TextNode(dateTimeFormatParser.convertIso8601ToDateTime(dcp.getValue(), - originalNode.asText())); + return stringOrNullNode(dateTimeFormatParser.convertIso8601ToDateTime(dcp.getValue(), + asText(originalNode))); } else { - return new TextNode(dateTimeFormatParser.convertIso8601ToDate(dcp.getValue(), - originalNode.asText())); + return stringOrNullNode(dateTimeFormatParser.convertIso8601ToDate(dcp.getValue(), + asText(originalNode))); } - }).orElse(new TextNode(originalNode.asText())); + }).orElse(new StringNode(asText(originalNode))); } private ArrayNode createArrayNodeFrom(final ArrayNode originalNode, @@ -163,8 +166,8 @@ private JsonNode createCollectionValue(JsonNode existingValue, if (isNullOrEmpty(existingValue)) { return existingValue; } - return existingValue instanceof TextNode - ? createTextNodeFrom((TextNode) existingValue, viewHeader, fieldPrefix) : + return existingValue instanceof StringNode + ? createTextNodeFrom((StringNode) existingValue, viewHeader, fieldPrefix) : createObjectNodeFrom((ObjectNode) existingValue, viewHeader, viewHeader.getCaseFieldTypeDefinition().getChildren(), diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatter.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatter.java index 9b3eddd184..4357606e45 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatter.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatter.java @@ -1,10 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; -import com.google.common.base.Strings; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import uk.gov.hmcts.ccd.domain.model.aggregated.CaseViewField; @@ -23,6 +22,8 @@ import java.util.List; import java.util.Map; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; import static uk.gov.hmcts.ccd.domain.model.common.DisplayContextParameterType.DATETIMEDISPLAY; import static uk.gov.hmcts.ccd.domain.model.common.DisplayContextParameterType.DATETIMEENTRY; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.DATE; @@ -56,8 +57,8 @@ public DateTimeValueFormatter(CaseViewFieldBuilder caseViewFieldBuilder, @Override protected CaseViewField executeSimple(CaseViewField caseViewField, BaseType baseType) { caseViewField.setFormattedValue( - caseViewField.getValue() instanceof TextNode - ? executeSimple((TextNode) caseViewField.getValue(), caseViewField, baseType, caseViewField.getId(), + caseViewField.getValue() instanceof StringNode + ? executeSimple((StringNode) caseViewField.getValue(), caseViewField, baseType, caseViewField.getId(), null, caseViewField) : caseViewField.getValue() ); @@ -76,7 +77,7 @@ protected JsonNode executeSimple(JsonNode node, return !isNullOrEmpty(node) && field.hasDisplayContextParameter(DISPLAY_CONTEXT_DCP_MAPPING.get(displayContext)) && isSupportedBaseType(baseType, SUPPORTED_TYPES) - ? createNode(field, node.asText(), baseType, fieldPath, displayContext) + ? createNode(field, asText(node), baseType, fieldPath, displayContext) : node; } @@ -110,7 +111,7 @@ protected JsonNode executeCollection(JsonNode collectionNode, isSupportedBaseType(collectionFieldType, SUPPORTED_TYPES) ? createNode( field, - item.get(VALUE).asText(), + asText(item.get(VALUE)), collectionFieldType, fieldPath, displayContext) : @@ -129,17 +130,17 @@ protected JsonNode executeCollection(JsonNode collectionNode, return collectionNode; } - private TextNode createNode(CommonDCPModel field, String valueToConvert, BaseType baseType, String fieldPath, + private JsonNode createNode(CommonDCPModel field, String valueToConvert, BaseType baseType, String fieldPath, DisplayContext displayContext) { - if (Strings.isNullOrEmpty(valueToConvert)) { - return new TextNode(valueToConvert); + if (valueToConvert == null || valueToConvert.isEmpty()) { + return stringOrNullNode(valueToConvert); } if (DISPLAY_CONTEXT_DCP_MAPPING.containsKey(displayContext)) { String format = format(field, displayContext, baseType); return dateTimeFormatParser.valueToTextNode(valueToConvert, baseType, fieldPath, format, false); } - return new TextNode(valueToConvert); + return stringOrNullNode(valueToConvert); } private String format(CommonDCPModel field, DisplayContext displayContext, BaseType baseType) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/CaseSearchResultViewGenerator.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/CaseSearchResultViewGenerator.java index d28c2795dc..f28eaf033e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/CaseSearchResultViewGenerator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/CaseSearchResultViewGenerator.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.search; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -33,6 +32,7 @@ import uk.gov.hmcts.ccd.endpoint.exceptions.BadSearchRequest; import static java.lang.String.format; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; import static java.util.stream.Collectors.toList; import static uk.gov.hmcts.ccd.data.casedetails.search.MetaData.CaseField.CASE_REFERENCE; import static uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.CaseAccessMetadata.ACCESS_GRANTED; @@ -221,8 +221,8 @@ private void updateCaseFieldsWithAccessControlMetadata(Map caseF CaseAccessMetadata caseAccessMetadata = Strings.isNullOrEmpty(caseDetails.getReferenceAsString()) ? caseDataAccessControl.generateAccessMetadataWithNoCaseId() : caseSearchesViewAccessControl.getCaseAccessMetaData(caseDetails.getReference().toString()); - caseFields.put(ACCESS_GRANTED, new TextNode(caseAccessMetadata.getAccessGrantsString())); - caseFields.put(ACCESS_PROCESS, new TextNode(caseAccessMetadata.getAccessProcessString())); + caseFields.put(ACCESS_GRANTED, stringOrNullNode(caseAccessMetadata.getAccessGrantsString())); + caseFields.put(ACCESS_PROCESS, stringOrNullNode(caseAccessMetadata.getAccessProcessString())); } private Map prepareData(SearchResultDefinition searchResult, diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequest.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequest.java index 8246cec465..e260a7a8fb 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequest.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; import uk.gov.hmcts.ccd.domain.model.definition.SearchAliasField; import uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest; @@ -14,6 +14,7 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest.SOURCE; /** @@ -158,7 +159,7 @@ private void setSourceFilterAliasFields() { private List sourceFilterToAliasFields(JsonNode multiCaseTypeSearchSourceNode) { return StreamSupport.stream(multiCaseTypeSearchSourceNode.spliterator(), false) - .map(JsonNode::asText) + .map(node -> asText(node)) .filter(nodeText -> nodeText.startsWith(SEARCH_ALIAS_FIELD_PREFIX)) .map(nodeText -> nodeText.replaceFirst(SEARCH_ALIAS_FIELD_PREFIX, "")) .collect(Collectors.toList()); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperation.java index f3f0b60e00..05e1b20a17 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperation.java @@ -6,7 +6,7 @@ import co.elastic.clients.elasticsearch.core.msearch.MultiSearchResponseItem; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.core.search.TotalHits; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import io.searchbox.core.Search; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelper.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelper.java index 46f89b7673..05a4c6a429 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelper.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelper.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -96,7 +96,7 @@ private void normaliseRangeQueries(JsonNode node) { normaliseRangeObject((ObjectNode) rangeNode); } - Iterator elements = objectNode.elements(); + Iterator elements = objectNode.values().iterator(); while (elements.hasNext()) { normaliseRangeQueries(elements.next()); } @@ -111,7 +111,7 @@ private void normaliseRangeQueries(JsonNode node) { } private void normaliseRangeObject(ObjectNode rangeNode) { - rangeNode.fieldNames().forEachRemaining(fieldName -> { + rangeNode.propertyNames().forEach(fieldName -> { ObjectNode fieldObject = asObject(rangeNode.get(fieldName)); if (fieldObject == null) { return; @@ -202,6 +202,6 @@ private boolean isArrayOfTextFields(JsonNode node) { private boolean arrayContainsOnlyText(ArrayNode node) { return StreamSupport.stream(node.spliterator(), false) - .allMatch(JsonNode::isTextual); + .allMatch(JsonNode::isString); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortService.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortService.java index 4fd0475de6..4952d0e528 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortService.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortService.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -21,6 +21,7 @@ import static uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest.CASE_DATA_PREFIX; import static uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest.COLLECTION_VALUE_SUFFIX; import static uk.gov.hmcts.ccd.data.casedetails.search.MetaData.CaseField.CREATED_DATE; +import static uk.gov.hmcts.ccd.config.JacksonUtils.stringOrNullNode; @Service @Slf4j @@ -59,7 +60,7 @@ private ArrayNode buildSortNode(ElasticsearchRequest searchRequest, String caseT } // Always add created_date as the final sort (ES defaults to ascending when direction is not specified) - sortNode.add(new TextNode(CREATED_DATE.getDbColumnName())); + sortNode.add(new StringNode(CREATED_DATE.getDbColumnName())); return sortNode; } @@ -95,7 +96,7 @@ private ObjectNode buildSortOrderFieldNode(CaseTypeDefinition caseTypeDefinition sb.append(KEYWORD_SUFFIX); } - objectNode.set(sb.toString(), new TextNode(sortOrderField.getDirection())); + objectNode.set(sb.toString(), stringOrNullNode(sortOrderField.getDirection())); return objectNode; } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverter.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverter.java index bd698d46cb..61e9410d95 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverter.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverter.java @@ -4,7 +4,7 @@ import co.elastic.clients.elasticsearch.core.msearch.RequestItem; import co.elastic.clients.elasticsearch.core.search.SearchRequestBody; import co.elastic.clients.json.JsonpMapper; -import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.json.jackson.Jackson3JsonpMapper; import com.google.gson.Gson; import io.searchbox.core.Search; import jakarta.json.Json; @@ -19,7 +19,7 @@ public class JestToESConverter { - private static final JsonpMapper mapper = new JacksonJsonpMapper(); + private static final JsonpMapper mapper = new Jackson3JsonpMapper(); private static final Gson GSON = new Gson(); private static final String INCLUDES = "includes"; private static final String SOURCE = "_source"; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/dto/ElasticSearchCaseDetailsDTO.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/dto/ElasticSearchCaseDetailsDTO.java index 2726deb76f..ce4601b917 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/dto/ElasticSearchCaseDetailsDTO.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/dto/ElasticSearchCaseDetailsDTO.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.PropertyNamingStrategies; +import tools.jackson.databind.annotation.JsonNaming; import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; import java.time.LocalDateTime; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperation.java index 6dd8e1a8ff..ce1d087060 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperation.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.security; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.MissingNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.MissingNode; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; import java.util.List; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurity.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurity.java index f62ca30033..966b295fc5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurity.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurity.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.security; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.index.query.BoolQueryBuilder; @@ -139,7 +139,7 @@ private ElasticsearchRequest createNewElasticsearchRequest(ElasticsearchRequest searchRequestObjectNode.set(NATIVE_ES_QUERY, updatedSearchRequestQuery.deepCopy()); searchRequestObjectNode.set(SUPPLEMENTARY_DATA, request.getRequestedSupplementaryData()); } else { - searchRequestObjectNode = updatedSearchRequestQuery.deepCopy(); + searchRequestObjectNode = (ObjectNode) updatedSearchRequestQuery.deepCopy(); } return new ElasticsearchRequest(searchRequestObjectNode); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilder.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilder.java index 1760d099e5..78c640b6e2 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilder.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilder.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -import com.fasterxml.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ArrayNode; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformer.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformer.java index f29c3fa82e..2715bed932 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformer.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformer.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; @@ -30,6 +30,7 @@ import java.util.stream.StreamSupport; import static java.util.Collections.emptyList; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.service.search.global.GlobalSearchFields.CaseDataFields.CASE_MANAGEMENT_CATEGORY; import static uk.gov.hmcts.ccd.domain.service.search.global.GlobalSearchFields.CaseDataFields.CASE_MANAGEMENT_LOCATION; import static uk.gov.hmcts.ccd.domain.service.search.global.GlobalSearchFields.CaseDataFields.CASE_NAME_HMCTS_INTERNAL; @@ -129,10 +130,10 @@ private String findValue(@NonNull final Map jsonNodeMap, final Optional optionalJsonNode = Optional.ofNullable(jsonNodeMap.get(parentKey)); return optionalJsonNode.map(node -> { - if (node.isContainerNode()) { - return Optional.ofNullable(node.at(childPath)).map(JsonNode::asText).orElse(null); + if (node.isContainer()) { + return Optional.ofNullable(node.at(childPath)).map(value -> asText(value)).orElse(null); } - return node.asText(); + return asText(node); }).orElse(null); } @@ -142,7 +143,7 @@ private List getOtherReferences(@NonNull final Map dat // get values from collection list return optionalJsonNode.map(node -> StreamSupport.stream(node.spliterator(), false) - .map(x -> x.get(CollectionValidator.VALUE).asText()) + .map(x -> asText(x.get(CollectionValidator.VALUE))) .collect(Collectors.toUnmodifiableList())) .orElse(emptyList()); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImpl.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImpl.java index 7e68dcdaa0..af4d177bf9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImpl.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImpl.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.ObjectNode; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/ClassifiedStartEventOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/ClassifiedStartEventOperation.java index 73d40466ba..9592aee06e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/ClassifiedStartEventOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/ClassifiedStartEventOperation.java @@ -2,7 +2,7 @@ import java.util.HashMap; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperation.java index 3fcdb192ee..550c1900ba 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.startevent; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvoker.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvoker.java index 4d55addfde..b38b30712c 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvoker.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvoker.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.stdapi; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/DocumentsOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/DocumentsOperation.java index 262319a67e..6fc5966975 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/DocumentsOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/stdapi/DocumentsOperation.java @@ -47,6 +47,7 @@ public class DocumentsOperation { private final UIDService uidService; private final AccessControlService accessControlService; private final CaseAccessService caseAccessService; + private final RestTemplate restTemplate; @Inject public DocumentsOperation(final SecurityUtils securityUtils, @@ -55,13 +56,15 @@ public DocumentsOperation(final SecurityUtils securityUtils, final CaseDetailsRepository caseDetailsRepository, final AccessControlService accessControlService, final CaseAccessService caseAccessService, - final UIDService uidService) { + final UIDService uidService, + @Qualifier("printableDocumentsRestTemplate") final RestTemplate restTemplate) { this.securityUtils = securityUtils; this.caseDetailsRepository = caseDetailsRepository; this.caseTypeService = caseTypeService; this.uidService = uidService; this.accessControlService = accessControlService; this.caseAccessService = caseAccessService; + this.restTemplate = restTemplate; } public List getPrintableDocumentsForCase(final String caseReference) { @@ -100,7 +103,6 @@ private List retrieveDocuments(CaseDetails caseDetails, CaseTypeDefini try { String documentListUrl = caseTypeDefinition.getPrintableDocumentsUrl(); - RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = securityUtils.authorizationHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity requestEntity = new HttpEntity<>(caseDetails, headers); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperation.java index 3b11704092..802c274e7e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLogger.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLogger.java index 74588b2c21..6c830782c9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLogger.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLogger.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.springframework.stereotype.Service; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperation.java index dfc672cedf..b51ed4a502 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperation.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.data.definition.CachedCaseDefinitionRepository; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/ValidateCaseFieldsOperation.java b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/ValidateCaseFieldsOperation.java index 8302388db4..7b332dfdaf 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/ValidateCaseFieldsOperation.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/service/validate/ValidateCaseFieldsOperation.java @@ -2,7 +2,7 @@ import java.util.Map; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition; import uk.gov.hmcts.ccd.domain.model.std.CaseDataContent; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidator.java index 1a60243c1c..67e75bd49a 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseTypeValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseTypeValidator.java index 517f6f3b08..9fd857b009 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseTypeValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/BaseTypeValidator.java @@ -1,10 +1,12 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import java.util.List; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; + public interface BaseTypeValidator extends FieldValidator { String REGEX_GUIDANCE @@ -15,7 +17,7 @@ public interface BaseTypeValidator extends FieldValidator { default Boolean isNullOrEmpty(final JsonNode dataValue) { return dataValue == null || dataValue.isNull() - || (dataValue.isTextual() && (null == dataValue.asText() || dataValue.asText().trim().length() == 0)) + || (dataValue.isString() && (null == asText(dataValue) || asText(dataValue).trim().length() == 0)) || (dataValue.isObject() && dataValue.toString().equals("{}")); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidator.java index 5c9c650ad2..ecc34d94fd 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.extern.slf4j.Slf4j; import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/CollectionValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/CollectionValidator.java index 9f7e6a2e41..56e2590385 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/CollectionValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/CollectionValidator.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; @@ -71,7 +71,7 @@ public List validate(final String dataFieldId, } final Set ids = new HashSet<>(); - final Iterator items = dataValue.elements(); + final Iterator items = dataValue.values().iterator(); Integer index = 0; while (items.hasNext()) { @@ -87,19 +87,19 @@ public List validate(final String dataFieldId, if (item.hasNonNull(ID)) { final JsonNode itemId = item.get(ID); - if (!itemId.isTextual()) { + if (!itemId.isString()) { final ValidationResult result = new ValidationResult("Collection item ID must be a string", itemFieldId); validationResults.add(result); } - if (ids.contains(itemId.textValue())) { + if (ids.contains(itemId.stringValue(null))) { final ValidationResult result = new ValidationResult("Collection item ID must be unique", itemFieldId); validationResults.add(result); } - ids.add(itemId.textValue()); + ids.add(itemId.stringValue(null)); } index++; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidator.java index 01a0bfae1b..0e7c8527ea 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.math.BigDecimal; import java.util.Collections; import java.util.List; @@ -24,7 +24,7 @@ public List validate(final String dataFieldId, List validationResults = super.validate(dataFieldId, dataValue, caseFieldDefinition); if (validationResults.isEmpty() && FIELD_TO_VALIDATE.equalsIgnoreCase(caseFieldDefinition.getId())) { - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); final int numberValue = new BigDecimal(value).intValue(); if (numberValue < 0 || numberValue > 2) { return Collections.singletonList( diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidator.java index a5f232eb9e..5f8d1396f9 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDateTime; @@ -14,6 +14,7 @@ import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import static java.time.format.DateTimeFormatter.ISO_DATE_TIME; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.types.TextValidator.checkRegex; /** @@ -40,7 +41,7 @@ public List validate(final String dataFieldId, final LocalDateTime dateTimeValue; try { - dateTimeValue = LocalDateTime.parse(dataValue.asText(), ISO_DATE_TIME); + dateTimeValue = LocalDateTime.parse(asText(dataValue), ISO_DATE_TIME); } catch (DateTimeParseException e) { return Collections.singletonList(new ValidationResult("Date or Time entered is not valid", dataFieldId)); @@ -58,17 +59,17 @@ public List validate(final String dataFieldId, .getMin())), dataFieldId)); } - if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), dataValue.asText())) { + if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), asText(dataValue))) { return Collections.singletonList( - new ValidationResult(dataValue.asText() + new ValidationResult(asText(dataValue) + " Field Type Regex Failed:" + caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), dataFieldId) ); } - if (!checkRegex(getType().getRegularExpression(), dataValue.asText())) { + if (!checkRegex(getType().getRegularExpression(), asText(dataValue))) { return Collections.singletonList( - new ValidationResult(dataValue.asText() + " Date Time Type Regex Failed:" + getType() + new ValidationResult(asText(dataValue) + " Date Time Type Regex Failed:" + getType() .getRegularExpression(), dataFieldId) ); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/DateValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/DateValidator.java index e8459cee04..dc8ca26ac0 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/DateValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/DateValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -15,6 +15,7 @@ import java.util.List; import static java.time.format.DateTimeFormatter.ISO_DATE; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.types.TextValidator.checkRegex; /** @@ -41,7 +42,7 @@ public List validate(final String dataFieldId, final LocalDate dateValue; try { - dateValue = LocalDate.parse(dataValue.asText(), ISO_DATE); + dateValue = LocalDate.parse(asText(dataValue), ISO_DATE); } catch (DateTimeParseException e) { return Collections.singletonList(new ValidationResult("Date or Time entered is not valid", dataFieldId)); @@ -59,11 +60,11 @@ public List validate(final String dataFieldId, .getFieldTypeDefinition().getMin())), dataFieldId)); } - if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), dataValue.asText())) { + if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), asText(dataValue))) { return Collections.singletonList(new ValidationResult(REGEX_GUIDANCE, dataFieldId)); } - if (!checkRegex(getType().getRegularExpression(), dataValue.asText())) { + if (!checkRegex(getType().getRegularExpression(), asText(dataValue))) { return Collections.singletonList(new ValidationResult(REGEX_GUIDANCE, dataFieldId)); } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/DocumentValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/DocumentValidator.java index 1783914daf..6a6f2cab2d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/DocumentValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/DocumentValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -69,7 +69,7 @@ public List validate(final String dataFieldId, return nullOrEmptyValidationResult(DOCUMENT_URL, dataFieldId); } - final String documentUrlValue = documentUrl.textValue(); + final String documentUrlValue = documentUrl.stringValue(null); if (documentUrlValue == null) { return Collections.singletonList(new ValidationResult( DOCUMENT_URL + NOT_TEXT_OR_NULL, dataFieldId)); @@ -124,7 +124,7 @@ private List validateDocumentBinaryURL(final String dataFieldI return nullOrEmptyValidationResult(DOCUMENT_BINARY_URL, dataFieldId); } - final String documentBinaryUrlValue = documentBinaryUrl.textValue(); + final String documentBinaryUrlValue = documentBinaryUrl.stringValue(null); final Matcher documentBinaryUrlMatcher = urlPattern.matcher(documentBinaryUrlValue); if (!documentBinaryUrlMatcher.matches()) { @@ -146,7 +146,7 @@ private List validateCategoryId(final String dataFieldId, return Collections.emptyList(); } - if (!categoryId.isTextual()) { + if (!categoryId.isString()) { final String nodeType = categoryId.getNodeType().toString().toLowerCase(); return Collections.singletonList(new ValidationResult(nodeType + " is not a string : " + CATEGORY_ID, dataFieldId)); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidator.java index 4c2c5df225..283a8d0ba3 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -43,7 +43,7 @@ public List validate(String dataFieldId, JsonNode dataValue, } List results = new ArrayList<>(); - dataValue.get(LIST_ITEMS).elements().forEachRemaining(node -> validateLength(results, node, dataFieldId)); + dataValue.get(LIST_ITEMS).values().forEach(node -> validateLength(results, node, dataFieldId)); JsonNode value = dataValue.get(VALUE); validateValueField(value, dataFieldId, results); return results; @@ -74,10 +74,10 @@ protected void validateLength(List results, JsonNode node, Str //For String values textValue() is never null, but may be empty if (node.get(CODE) != null) { - code = node.get(CODE).textValue(); + code = node.get(CODE).stringValue(null); } if (node.get(LABEL) != null) { - value = node.get(LABEL).textValue(); + value = node.get(LABEL).stringValue(null); } //To correct Fortify dereferencing a null-pointer, diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidator.java index 38f84851b9..ccbd1b17c2 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -27,8 +27,8 @@ protected void validateValueField(JsonNode value, String dataFieldId, List results) { if (value != null && value.isArray()) { - value.elements() - .forEachRemaining(node -> validateLength(results, node, dataFieldId)); + value.values() + .forEach(node -> validateLength(results, node, dataFieldId)); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index e9d6d2f28a..05f5dc661e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -32,7 +32,7 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); if (null == value) { return Collections.singletonList(new ValidationResult(dataValue + " is not a valid email", diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/FixedListValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/FixedListValidator.java index bb31cde9fb..f6f2f57d64 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/FixedListValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/FixedListValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.FixedListItemDefinition; @@ -29,7 +29,7 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); final List validValues = caseFieldDefinition.getFieldTypeDefinition().getFixedListItemDefinitions(); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidator.java index 1a8715c5eb..b9f735d8af 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -30,7 +30,7 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); final Long numberValue; try { if (null == value) { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidator.java index 4c374f3983..d156757334 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.FixedListItemDefinition; @@ -13,6 +13,7 @@ import java.util.List; import static java.math.BigDecimal.ONE; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; @Named @Singleton @@ -47,7 +48,7 @@ public List validate(final String dataFieldId, final HashSet uniqueValues = new HashSet<>(); dataValue.forEach(value -> { - final String textValue = value.asText(); + final String textValue = asText(value); final Boolean found = validValues.stream() .anyMatch(validValue -> validValue.getCode().equals(textValue)); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/NumberValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/NumberValidator.java index 488de4e3c8..4e79e6bb77 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/NumberValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/NumberValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.math.BigDecimal; import java.util.Collections; import java.util.List; @@ -27,7 +27,7 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); final BigDecimal numberValue; try { diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidator.java index 455dcd6609..7488fb01c5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import uk.gov.hmcts.ccd.data.caseaccess.CachedCaseRoleRepository; import uk.gov.hmcts.ccd.data.caseaccess.CaseRoleRepository; @@ -59,13 +59,13 @@ private void validateContent(ValidationContext validationContext, final Set caseRoles, JsonNode orgPolicyRoleNode) { - return caseRoles.stream().anyMatch(e -> e.equalsIgnoreCase(orgPolicyRoleNode.textValue())); + return caseRoles.stream().anyMatch(e -> e.equalsIgnoreCase(orgPolicyRoleNode.stringValue(null))); } } diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidator.java index 499349c47b..050a1dcc44 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -29,7 +29,7 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); if (!checkMax(caseFieldDefinition.getFieldTypeDefinition().getMax(), value)) { return Collections.singletonList(new ValidationResult("Phone no '" + value + "' exceeds maximum length " + caseFieldDefinition.getFieldTypeDefinition().getMax(), dataFieldId)); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidator.java index 2a64601ff7..931a98b591 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -30,12 +30,12 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - if (!dataValue.isTextual()) { + if (!dataValue.isString()) { return Collections.singletonList(new ValidationResult(dataValue + " needs to be a valid " + TYPE_ID, dataFieldId)); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); if (isBlank(value)) { return Collections.singletonList(new ValidationResult("post code is empty", dataFieldId)); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/RegionValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/RegionValidator.java index c5fbd5b262..156af0474e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/RegionValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/RegionValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.springframework.beans.factory.annotation.Qualifier; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidator.java index ea00eeb050..6c6d05324d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -42,7 +42,7 @@ public List validate(ValidationContext validationContext) { textValidator.validate(dataFieldId, dataValue, caseFieldDefinition); if (validationResults.isEmpty() && !textValidator.isNullOrEmpty(dataValue)) { - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); return isAnExistingCase(value, dataFieldId); } return validationResults; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/TextValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/TextValidator.java index dd33aa488c..bf16943b4e 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/TextValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/TextValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -31,13 +31,13 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - if (!dataValue.isTextual()) { + if (!dataValue.isString()) { final String nodeType = dataValue.getNodeType().toString().toLowerCase(); return Collections.singletonList(new ValidationResult(nodeType + " is not a string", dataFieldId)); } - final String value = dataValue.textValue(); + final String value = dataValue.stringValue(null); if (!checkMax(caseFieldDefinition.getFieldTypeDefinition().getMax(), value)) { String fieldValueSummary = getFieldValueSummary(value); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/ValidationContext.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/ValidationContext.java index cddc1c388a..1ae6aef394 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/ValidationContext.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/ValidationContext.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/YesNoValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/YesNoValidator.java index 09754c22e1..3b7d8ea5e5 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/YesNoValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/YesNoValidator.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import jakarta.inject.Named; @@ -26,16 +26,17 @@ public List validate(final String dataFieldId, return Collections.emptyList(); } - if (!dataValue.isTextual()) { + if (!dataValue.isString()) { return Collections.singletonList(new ValidationResult(dataValue + " is not " + TYPE_ID, dataFieldId)); } final List results = new ArrayList<>(); - if (!"YES".equalsIgnoreCase(dataValue.textValue()) && !"NO".equalsIgnoreCase(dataValue.textValue())) { + if (!"YES".equalsIgnoreCase(dataValue.stringValue(null)) + && !"NO".equalsIgnoreCase(dataValue.stringValue(null))) { results.add(new ValidationResult("YES_NO values needs to be YES or NO. Given value is " - + dataValue.textValue(), dataFieldId)); + + dataValue.stringValue(null), dataFieldId)); } return results; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiser.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiser.java index 0d31eb7181..51f78e494b 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiser.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiser.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiser.java index a20bc0cf6b..6275ffe326 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiser.java @@ -10,17 +10,17 @@ import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COLLECTION; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; @Named @Singleton public class CollectionSanitiser implements Sanitiser { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); public static final String VALUE = "value"; public static final String ID = "id"; @@ -59,10 +59,10 @@ public JsonNode sanitise(FieldTypeDefinition fieldTypeDefinition, JsonNode field } // Generate missing IDs - if (item.hasNonNull(ID) && item.get(ID).isTextual()) { + if (item.hasNonNull(ID) && item.get(ID).isString()) { sanitisedItem.set(ID, item.get(ID)); } else { - sanitisedItem.set(ID, JSON_NODE_FACTORY.textNode(UUID.randomUUID().toString())); + sanitisedItem.set(ID, JSON_NODE_FACTORY.stringNode(UUID.randomUUID().toString())); } sanitisedData.add(sanitisedItem); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiser.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiser.java index bcfbeb8766..a917fc6f23 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiser.java @@ -10,9 +10,9 @@ import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COMPLEX; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; @@ -20,7 +20,7 @@ @Singleton public class ComplexSanitiser implements Sanitiser { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private Map sanitisers; @@ -48,7 +48,7 @@ public JsonNode sanitise(FieldTypeDefinition fieldTypeDefinition, JsonNode field fieldsMap.put(field.getId(), field); }); - final Iterator> fields = fieldData.fields(); + final Iterator> fields = fieldData.properties().iterator(); while (fields.hasNext()) { final Map.Entry field = fields.next(); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiser.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiser.java index 723936de6e..862f9322d6 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiser.java @@ -11,9 +11,9 @@ import java.net.URI; import java.net.URISyntaxException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import jakarta.inject.Inject; import jakarta.inject.Named; import jakarta.inject.Singleton; @@ -35,7 +35,7 @@ public class DocumentSanitiser implements Sanitiser { public static final String UPLOAD_TIMESTAMP = "upload_timestamp"; public static final String TYPE = "Document"; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private final DocumentManagementRestClient documentManagementRestClient; private final ApplicationParams applicationParams; @@ -60,7 +60,7 @@ public JsonNode sanitise(FieldTypeDefinition fieldTypeDefinition, JsonNode field || fieldData.isNull()) { return fieldData; } else { - final String documentUrl = fieldData.get(DOCUMENT_URL).textValue(); + final String documentUrl = fieldData.get(DOCUMENT_URL).stringValue(null); sanitisedData.put(DOCUMENT_URL, documentUrl); Document document = retrieveDocument(fieldTypeDefinition, documentUrl); @@ -71,15 +71,15 @@ public JsonNode sanitise(FieldTypeDefinition fieldTypeDefinition, JsonNode field final JsonNode documentHashNode = fieldData.get(DOCUMENT_HASH); if (documentHashNode != null) { - sanitisedData.put(DOCUMENT_HASH, documentHashNode.textValue()); + sanitisedData.put(DOCUMENT_HASH, documentHashNode.stringValue(null)); } final JsonNode documentCategoryId = fieldData.get(CATEGORY_ID); if (documentCategoryId != null) { - sanitisedData.put(CATEGORY_ID, documentCategoryId.textValue()); + sanitisedData.put(CATEGORY_ID, documentCategoryId.stringValue(null)); } final JsonNode documentUploadTimeStamp = fieldData.get(UPLOAD_TIMESTAMP); if (documentUploadTimeStamp != null) { - sanitisedData.put(UPLOAD_TIMESTAMP, documentUploadTimeStamp.textValue()); + sanitisedData.put(UPLOAD_TIMESTAMP, documentUploadTimeStamp.stringValue(null)); } validateDocumentFilename(fieldTypeDefinition, document); diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/Sanitiser.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/Sanitiser.java index 547562b26a..66c8899070 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/Sanitiser.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/sanitiser/Sanitiser.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; import uk.gov.hmcts.ccd.domain.types.Typed; diff --git a/src/main/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpoint.java b/src/main/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpoint.java index 8a1699bc54..260654bf38 100644 --- a/src/main/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpoint.java +++ b/src/main/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpoint.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.responses.ApiResponse; diff --git a/src/main/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfiguration.java b/src/main/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfiguration.java new file mode 100644 index 0000000000..e480015199 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfiguration.java @@ -0,0 +1,28 @@ +package uk.gov.hmcts.ccd.feign; + +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.http.converter.autoconfigure.ClientHttpMessageConvertersCustomizer; +import org.springframework.cloud.openfeign.support.FeignHttpMessageConverters; +import org.springframework.cloud.openfeign.support.HttpMessageConverterCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +public class FeignHttpMessageConvertersConfiguration { + + /** + * Eagerly initializes the converters before publishing the bean to concurrent Feign clients. + * + *

Remove this workaround after upgrading to Spring Cloud OpenFeign 5.0.3 or later, which + * includes the upstream concurrency fix from spring-cloud-openfeign#1371. + */ + @Bean + public FeignHttpMessageConverters feignHttpMessageConverters( + ObjectProvider customizers, + ObjectProvider cloudCustomizers + ) { + FeignHttpMessageConverters converters = new FeignHttpMessageConverters(customizers, cloudCustomizers); + converters.getConverters(); + return converters; + } +} diff --git a/src/main/java/uk/gov/hmcts/ccd/util/ClientContextUtil.java b/src/main/java/uk/gov/hmcts/ccd/util/ClientContextUtil.java index fa8b8ee9b9..39bf5d3704 100644 --- a/src/main/java/uk/gov/hmcts/ccd/util/ClientContextUtil.java +++ b/src/main/java/uk/gov/hmcts/ccd/util/ClientContextUtil.java @@ -1,12 +1,13 @@ package uk.gov.hmcts.ccd.util; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; -import java.io.IOException; import java.util.Base64; import java.util.regex.Pattern; @@ -14,7 +15,7 @@ public class ClientContextUtil { private static final Logger LOG = LoggerFactory.getLogger(ClientContextUtil.class); - private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private static final Pattern BASE64_PATTERN = Pattern.compile("^[A-Za-z0-9+/]*={0,2}$"); @@ -96,7 +97,7 @@ private static ObjectNode convertToObjectNode(String json) { try { return (ObjectNode) objectMapper.readTree(json); - } catch (IOException e) { + } catch (JacksonException e) { LOG.error("Problem deserialising JSON: {}", json, e); } catch (Exception e) { LOG.error("Problem with JSON: {}", json, e); @@ -106,7 +107,7 @@ private static ObjectNode convertToObjectNode(String json) { } private static void mergeObjectNodes(ObjectNode originalJsonNode, ObjectNode toBeMergedJsonNode) { - toBeMergedJsonNode.fields().forEachRemaining(entry -> + toBeMergedJsonNode.properties().forEach(entry -> originalJsonNode.set(entry.getKey(), entry.getValue()) ); } diff --git a/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResource.java b/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResource.java index 2653270d6c..310c48f9e6 100644 --- a/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResource.java +++ b/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResource.java @@ -5,7 +5,7 @@ import org.springframework.hateoas.RepresentationModel; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.Data; import lombok.EqualsAndHashCode; diff --git a/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResource.java b/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResource.java index c87fc07022..a79fd8784d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResource.java +++ b/src/main/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResource.java @@ -6,7 +6,7 @@ import org.springframework.hateoas.RepresentationModel; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.validation.constraints.NotNull; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 67c9733f40..caf194134c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,7 +5,7 @@ springdoc.api-docs.path=/v2/api-docs server.servlet.contextPath= server.compression.enabled=true server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain -server.error.include-message=always +spring.web.error.include-message=always server.max-http-request-header-size=100KB spring.config.import=optional:configtree:/mnt/secrets/ccd/ @@ -25,7 +25,7 @@ spring.datasource.hikari.minimum-idle=${DATA_STORE_DB_MIN_IDLE:8} spring.datasource.hikari.maximum-pool-size=${DATA_STORE_DB_MAX_POOL_SIZE:16} # Disable feature detection to avoid the java.sql.SQLFeatureNotSupportedException # Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented. -spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false +spring.jpa.properties.hibernate.boot.allow_jdbc_metadata_access=false spring.main.allow-circular-references=true #CCD-3509 CVE-2021-22044 spring.mvc.pathmatch.matching-strategy = ant_path_matcher @@ -64,7 +64,7 @@ user.role.cache.ttl.secs=${USER_ROLE_CACHE_ENTRIES_TTL_SEC:7200} system.user.token.cache.ttl.secs=${SYSTEM_USER_TOKEN_CACHE_TTL_SEC:14400} # Jackson ObjectMapper configuration -spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false +spring.jackson.datatype.datetime.write-dates-as-timestamps=false ccd.case-definition.host=${DEFINITION_STORE_HOST:http://localhost:4451} ccd.ui-definition.host=${DEFINITION_STORE_HOST:http://localhost:4451} @@ -121,17 +121,16 @@ ccd.defaultPrintType=CCD Print Type # GENERAL SPRING BOOT ACTUATOR CONFIG # Context path for Spring Boot Actuator endpoints -management.server.servlet.context-path=/ # server under root instead of /actuator/* management.endpoints.web.base-path=/ management.endpoints.web.exposure.include=health,info # Explicitly disable the loggers actuator endpoint to prevent runtime log-level manipulation -management.endpoint.loggers.enabled=false +management.endpoint.loggers.access=none # HEALTH ENDPOINT CONFIG # Enable the health endpoint -management.endpoint.health.enabled=true +management.endpoint.health.access=unrestricted management.endpoint.health.show-details=always # Caching period in milliseconds of health endpoint @@ -163,7 +162,7 @@ testing.support.endpoint.enabled=${TESTING_SUPPORT_ENABLED:false} migrations.endpoint.enabled=${MIGRATIONS_ENDPOINT_ENABLED:false} # Enable the metrics endpoint -management.endpoint.metrics.enabled=true +management.endpoint.metrics.access=unrestricted # Define Readiness checks management.endpoint.health.group.readiness.include=db,ping,refreshScope @@ -197,7 +196,7 @@ http.client.connection.drafts.create.timeout=${HTTP_CLIENT_CONNECTION_DRAFTS_CRE http.client.connection.drafts.timeout=${HTTP_CLIENT_CONNECTION_DRAFTS_TIMEOUT:5000} http.client.connection.definition-store.timeout=${HTTP_CLIENT_CONNECTION_DEFINITION_STORE_TIMEOUT:20000} -feign.client.config.default.readTimeout=${FEIGN_CLIENT_READ_TIMEOUT:60000} +spring.cloud.openfeign.client.config.default.read-timeout=${FEIGN_CLIENT_READ_TIMEOUT:60000} # Draft store ccd.draft.host=${CCD_DRAFT_STORE_URL:http://localhost:8800} @@ -225,13 +224,9 @@ search.cases.index.name.type=${ELASTIC_SEARCH_CASE_INDEX_TYPE:_doc} search.elastic.nodes.discovery.enabled=${ELASTIC_SEARCH_NODES_DISCOVERY_ENABLED:false} search.elastic.nodes.discovery.frequency.millis=${ELASTIC_SEARCH_NODES_DISCOVERY_FREQUENCY_MILLIS:5000} search.elastic.nodes.discovery.filter=${ELASTIC_SEARCH_NODES_DISCOVERY_FILTER:_all} -spring.elasticsearch.jest.uris=${ELASTIC_SEARCH_HOSTS:http://localhost:9200} -spring.elasticsearch.jest.read-timeout=10000ms search.global.index.name=${GLOBAL_SEARCH_INDEX_NAME:global_search} search.global.index.type=${GLOBAL_SEARCH_INDEX_TYPE:_doc} search.internal.case-access-metadata.enabled=${INTERNAL_SEARCH_CAM_ENABLED:false} -management.health.elasticsearch.enabled=false -management.health.status.order=DOWN, OUT_OF_SERVICE, UNKNOWN, UP, OUT_OF_SYNC, PROBLEM, COULD_NOT_CONNECT # Elasticsearch mappings elasticsearch.type-mappings.defaultText=Text, TextArea, FixedList, FixedListEdit, MultiSelectList, FixedRadioList, DynamicList, DynamicRadioList, DynamicMultiSelectList, Region, BaseLocation, PhoneUK @@ -305,9 +300,10 @@ ccd.messaging.type-mappings.YesOrNo=SimpleBoolean ccd.messaging.type-mappings.Document=Complex spring.flyway.out-of-order=true -spring.flyway.ignore-missing-migrations=true +spring.flyway.ignore-migration-patterns=*:missing,*:future spring.flyway.baseline-on-migrate=true spring.flyway.baseline-version=0001 +spring.flyway.postgresql.transactional-lock=false reference.data.api.url=${RD_LOCATION_REF_API_BASE_URL:http://localhost:5555} reference.data.cache.ttl.in.days=5 diff --git a/src/test/java/uk/gov/hmcts/ccd/AbstractBaseIntegrationTest.java b/src/test/java/uk/gov/hmcts/ccd/AbstractBaseIntegrationTest.java index 2dd8266989..3195e8ed0b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/AbstractBaseIntegrationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/AbstractBaseIntegrationTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.common.Slf4jNotifier; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -19,8 +20,10 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.context.request.RequestContextHolder; @@ -80,7 +83,11 @@ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestPropertySource(locations = "classpath:test.properties") public abstract class AbstractBaseIntegrationTest { - protected static final ObjectMapper mapper = JacksonUtils.MAPPER; + protected static final ObjectMapper mapper = JacksonUtils.MAPPER.rebuild() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .changeDefaultPropertyInclusion(inclusion -> + inclusion.withValueInclusion(JsonInclude.Include.NON_NULL)) + .build(); protected static final Slf4jNotifier slf4jNotifier = new Slf4jNotifier(true); protected static final MediaType JSON_CONTENT_TYPE = new MediaType( @@ -139,6 +146,10 @@ public abstract class AbstractBaseIntegrationTest { @Mock protected HttpServletRequest request; + // Avoid remote OIDC discovery while application contexts are starting. + @MockitoBean + private JwtDecoder jwtDecoder; + @BeforeEach public void initMock() throws IOException { MockitoAnnotations.openMocks(this); @@ -174,9 +185,6 @@ private void setupUIDService() { @BeforeAll public static void init() { - mapper.registerModule(new JavaTimeModule()); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - // Force re-initialisation of base types for each test suite ReflectionTestUtils.setField(BaseType.class, "initialised", false); } @@ -244,14 +252,14 @@ protected CaseDetails mapCaseData(ResultSet resultSet, Integer i) throws SQLExce } try { caseDetails.setData(JacksonUtils.convertValue(mapper.readTree(resultSet.getString("data")))); - } catch (IOException e) { + } catch (JacksonException e) { fail("Incorrect JSON structure: " + resultSet.getString("data")); } final String dataClassification = resultSet.getString("data_classification"); if (null != dataClassification) { try { caseDetails.setDataClassification(JacksonUtils.convertValue(mapper.readTree(dataClassification))); - } catch (IOException e) { + } catch (JacksonException e) { fail("Incorrect JSON structure: " + dataClassification); } } @@ -282,7 +290,7 @@ protected MessageQueueCandidate mapMessageCandidate(ResultSet resultSet, Integer } try { messageQueueCandidate.setMessageInformation(mapper.readTree(resultSet.getString("message_information"))); - } catch (IOException e) { + } catch (JacksonException e) { fail("Incorrect JSON structure: " + resultSet.getString("DATA")); } @@ -314,7 +322,7 @@ protected AuditEvent mapAuditEvent(ResultSet resultSet, Integer i) throws SQLExc try { auditEvent.setData(JacksonUtils.convertValue(mapper.readTree(resultSet.getString("data")))); - } catch (IOException e) { + } catch (JacksonException e) { fail("Incorrect JSON structure: " + resultSet.getString("DATA")); } @@ -322,7 +330,7 @@ protected AuditEvent mapAuditEvent(ResultSet resultSet, Integer i) throws SQLExc if (null != dataClassification) { try { auditEvent.setDataClassification(JacksonUtils.convertValue(mapper.readTree(dataClassification))); - } catch (IOException e) { + } catch (JacksonException e) { fail("Incorrect JSON structure: " + dataClassification); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/ElasticsearchBaseTest.java b/src/test/java/uk/gov/hmcts/ccd/ElasticsearchBaseTest.java index 82223634e7..d73e72327f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/ElasticsearchBaseTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/ElasticsearchBaseTest.java @@ -4,11 +4,12 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRawValue; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import lombok.Builder; import lombok.Singular; import org.elasticsearch.common.Strings; @@ -54,14 +55,14 @@ public static class ElasticsearchTestRequest { @JsonIgnore private List supplementaryData; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); @JsonRawValue public String getQuery() { return query == null ? null : Strings.toString(query); } - public String toJsonString() throws JsonProcessingException { + public String toJsonString() throws JacksonException { if (supplementaryData == null) { return objectMapper.writeValueAsString(this); } @@ -69,9 +70,9 @@ public String toJsonString() throws JsonProcessingException { return toJsonStringWithSupplementaryData(); } - private String toJsonStringWithSupplementaryData() throws JsonProcessingException { + private String toJsonStringWithSupplementaryData() throws JacksonException { ArrayNode supplementaryDataNode = objectMapper.createArrayNode(); - supplementaryData.forEach(sd -> supplementaryDataNode.add(new TextNode(sd))); + supplementaryData.forEach(sd -> supplementaryDataNode.add(new StringNode(sd))); ObjectNode request = objectMapper.createObjectNode(); request.set("native_es_query", objectMapper.readTree(objectMapper.writeValueAsString(this))); request.set("supplementary_data", supplementaryDataNode); diff --git a/src/test/java/uk/gov/hmcts/ccd/ElasticsearchIT.java b/src/test/java/uk/gov/hmcts/ccd/ElasticsearchIT.java index 5c832442f4..1fff904196 100644 --- a/src/test/java/uk/gov/hmcts/ccd/ElasticsearchIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/ElasticsearchIT.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.ccd; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; @@ -280,7 +279,6 @@ void setUp() { MockUtils.setSecurityAuthorities(authentication, AUTOTEST1_PUBLIC, AUTOTEST2_PUBLIC); mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test @@ -752,9 +750,9 @@ void shouldReturnRequestedSupplementaryDataForUseCaseRequest() throws Exception () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData().size(), is(2)), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField2").asText(), is("SDField2Value")), + .get("SDField2").asString(), is("SDField2Value")), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField3").asText(), is("SDField3Value")) + .get("SDField3").asString(), is("SDField3Value")) ); } @@ -773,11 +771,11 @@ void shouldReturnAllSupplementaryDataWhenWildcardIsUsed() throws Exception { () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData().size(), is(3)), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField1").asText(), is("SDField1Value")), + .get("SDField1").asString(), is("SDField1Value")), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField2").asText(), is("SDField2Value")), + .get("SDField2").asString(), is("SDField2Value")), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField3").asText(), is("SDField3Value")) + .get("SDField3").asString(), is("SDField3Value")) ); } @@ -811,11 +809,11 @@ void shouldReturnAllSupplementaryDataByDefaultForStandardRequest() throws Except () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData().size(), is(3)), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField1").asText(), is("SDField1Value")), + .get("SDField1").asString(), is("SDField1Value")), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField2").asText(), is("SDField2Value")), + .get("SDField2").asString(), is("SDField2Value")), () -> assertThat(caseSearchResultViewResource.getCases().getFirst().getSupplementaryData() - .get("SDField3").asText(), is("SDField3Value")) + .get("SDField3").asString(), is("SDField3Value")) ); } @@ -827,7 +825,7 @@ void shouldReturnErrorWithUnsupportedUseCase() throws Exception { 400); assertAll( - () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asText(), + () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asString(), is("The provided use case 'INVALID' is unsupported for case type 'AAT'.")) ); } @@ -840,7 +838,7 @@ void shouldReturnErrorWithMissingQueryField() throws Exception { 400); assertAll( - () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asText(), + () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asString(), is("missing required field 'query'")) ); } @@ -855,7 +853,7 @@ void shouldReturnErrorWhenElasticsearchErrors() throws Exception { JsonNode exceptionNode = executeErrorRequest(searchRequest, CASE_TYPE_A, null, 400); assertAll( - () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asText(), + () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asString(), containsString("No mapping found for [invalid.keyword] in order to sort on")) ); } @@ -876,7 +874,7 @@ void shouldReturnErrorWhenInvalidJsonIsSent() throws Exception { mapper, mockMvc, JsonNode.class); assertAll( - () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asText(), + () -> assertThat(exceptionNode.get(ERROR_MESSAGE).asString(), containsString("Request requires correctly formatted JSON")) ); } @@ -1727,11 +1725,11 @@ void shouldReturnRequestedAliasSource() throws Exception { assertAll( () -> assertThat(caseSearchResult.getTotal(), is(3L)), - () -> assertThat(caseSearchResult.getCases().getFirst().getData().get(TEXT_ALIAS).asText(), + () -> assertThat(caseSearchResult.getCases().getFirst().getData().get(TEXT_ALIAS).asString(), is(TEXT_VALUE)), - () -> assertThat(caseSearchResult.getCases().get(1).getData().get(TEXT_ALIAS).asText(), + () -> assertThat(caseSearchResult.getCases().get(1).getData().get(TEXT_ALIAS).asString(), is("CCC TextValue")), - () -> assertThat(caseSearchResult.getCases().get(2).getData().get(TEXT_ALIAS).asText(), + () -> assertThat(caseSearchResult.getCases().get(2).getData().get(TEXT_ALIAS).asString(), is("BBB TextValue")), () -> assertThat(caseSearchResult.getCases().getFirst().getData().size(), is(1)), () -> assertThat(caseSearchResult.getCases().get(1).getData().size(), is(1)), @@ -1799,11 +1797,11 @@ void shouldReturnAllCaseDetails() throws Exception { () -> assertExampleCaseMetadata(caseDetails), () -> assertExampleCaseData(caseDetails), () -> assertThat(caseDetails.getSupplementaryData().size(), is(3)), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField1").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField1").asString(), is("SDField1Value")), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asString(), is("SDField2Value")), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asString(), is("SDField3Value")) ); } @@ -1823,9 +1821,9 @@ void shouldReturnRequestedSupplementaryData() throws Exception { () -> assertExampleCaseMetadata(caseDetails), () -> assertExampleCaseData(caseDetails), () -> assertThat(caseDetails.getSupplementaryData().size(), is(2)), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asString(), is("SDField2Value")), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asString(), is("SDField3Value")) ); } @@ -1845,11 +1843,11 @@ void shouldReturnAllSupplementaryDataWhenWildcardIsUsed() throws Exception { () -> assertExampleCaseMetadata(caseDetails), () -> assertExampleCaseData(caseDetails), () -> assertThat(caseDetails.getSupplementaryData().size(), is(3)), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField1").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField1").asString(), is("SDField1Value")), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField2").asString(), is("SDField2Value")), - () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asText(), + () -> assertThat(caseDetails.getSupplementaryData().get("SDField3").asString(), is("SDField3Value")) ); } @@ -1861,7 +1859,7 @@ void shouldErrorWhenInvalidCaseTypeIsProvided() throws Exception { JsonNode exceptionNode = executeErrorRequest(searchRequest, "INVALID", 404); assertAll( - () -> assertThat(exceptionNode.get("message").asText(), + () -> assertThat(exceptionNode.get("message").asString(), startsWith("Resource not found when getting case type definition for INVALID")) ); } @@ -1883,39 +1881,40 @@ public void assertExampleCaseMetadata(CaseDetails caseDetails) { public void assertExampleCaseData(CaseDetails caseDetails) { Map data = caseDetails.getData(); assertAll( - () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_1).asText(), is(STREET_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_2).asText(), is(ADDRESS_LINE_2_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_3).asText(), is(ADDRESS_LINE_3_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(COUNTRY_NESTED_FIELD).asText(), is(COUNTRY_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(COUNTY_FIELD).asText(), is(COUNTY_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(POST_CODE_FIELD).asText(), is(POST_CODE_VALUE)), - () -> assertThat(data.get(ADDRESS_FIELD).get(TOWN_FIELD).asText(), is(TOWN_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_1).asString(), is(STREET_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_2).asString(), is(ADDRESS_LINE_2_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(ADDRESS_LINE_3).asString(), is(ADDRESS_LINE_3_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(COUNTRY_NESTED_FIELD).asString(), is(COUNTRY_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(COUNTY_FIELD).asString(), is(COUNTY_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(POST_CODE_FIELD).asString(), is(POST_CODE_VALUE)), + () -> assertThat(data.get(ADDRESS_FIELD).get(TOWN_FIELD).asString(), is(TOWN_VALUE)), () -> assertThat(data.get(COLLECTION_FIELD).toString(), is("[{\"id\":\"2c6da07c-1dfb-4765-88f6-96cd5d5f33b1\",\"value\":\"CollectionTextValue2\"}," + "{\"id\":\"f7d67f03-172d-4adb-85e5-ca958ad442ce\",\"value\":\"CollectionTextValue1\"}]")), - () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_TEXT_FIELD).asText(), is(COMPLEX_TEXT_VALUE)), - () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_FIXED_LIST_FIELD).asText(), + () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_TEXT_FIELD).asString(), + is(COMPLEX_TEXT_VALUE)), + () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_FIXED_LIST_FIELD).asString(), is(COMPLEX_FIXED_LIST_VALUE)), () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_NESTED_FIELD).get(NESTED_NUMBER_FIELD) - .asText(), is(NESTED_NUMBER_FIELD_VALUE)), + .asString(), is(NESTED_NUMBER_FIELD_VALUE)), () -> assertThat(data.get(COMPLEX_FIELD).get(COMPLEX_NESTED_FIELD).get(NESTED_COLLECTION_TEXT_FIELD) .toString(), is("[{\"id\":\"8e19ccb3-2d8c-42f0-abe1-fa585cc2d8c8\"," + "\"value\":\"NestedCollectionTextValue1\"}," + "{\"id\":\"95f337e8-5f17-4b25-a795-b7f84f4b2855\"," + "\"value\":\"NestedCollectionTextValue2\"}]")), - () -> assertThat(data.get(DATE_FIELD).asText(), is(DATE_VALUE)), - () -> assertThat(data.get(DATE_TIME_FIELD).asText(), is(DATE_TIME_VALUE)), - () -> assertThat(data.get(EMAIL_FIELD).asText(), is(EMAIL_VALUE)), - () -> assertThat(data.get(FIXED_LIST_FIELD).asText(), is(FIXED_LIST_VALUE)), + () -> assertThat(data.get(DATE_FIELD).asString(), is(DATE_VALUE)), + () -> assertThat(data.get(DATE_TIME_FIELD).asString(), is(DATE_TIME_VALUE)), + () -> assertThat(data.get(EMAIL_FIELD).asString(), is(EMAIL_VALUE)), + () -> assertThat(data.get(FIXED_LIST_FIELD).asString(), is(FIXED_LIST_VALUE)), () -> assertThat(data.get(FIXED_RADIO_LIST_FIELD).isNull(), is(true)), () -> assertThat(data.get(MULTI_SELECT_LIST_FIELD).toString(), is("[\"OPTION2\",\"OPTION4\"]")), - () -> assertThat(data.get(NUMBER_FIELD).asText(), is(NUMBER_VALUE)), - () -> assertThat(data.get(PHONE_FIELD).asText(), is(PHONE_VALUE)), - () -> assertThat(data.get(TEXT_AREA_FIELD).asText(), is(TEXT_AREA_VALUE)), - () -> assertThat(data.get(TEXT_FIELD).asText(), is(TEXT_VALUE)), - () -> assertThat(data.get(YES_OR_NO_FIELD).asText(), is(YES_OR_NO_VALUE)) + () -> assertThat(data.get(NUMBER_FIELD).asString(), is(NUMBER_VALUE)), + () -> assertThat(data.get(PHONE_FIELD).asString(), is(PHONE_VALUE)), + () -> assertThat(data.get(TEXT_AREA_FIELD).asString(), is(TEXT_AREA_VALUE)), + () -> assertThat(data.get(TEXT_FIELD).asString(), is(TEXT_VALUE)), + () -> assertThat(data.get(YES_OR_NO_FIELD).asString(), is(YES_OR_NO_VALUE)) ); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/GlobalSearchTestFixture.java b/src/test/java/uk/gov/hmcts/ccd/GlobalSearchTestFixture.java index 31fab47cfd..e7e9b3829e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/GlobalSearchTestFixture.java +++ b/src/test/java/uk/gov/hmcts/ccd/GlobalSearchTestFixture.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import org.junit.Assert; import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.globalsearch.SearchPartyValue; @@ -42,7 +42,7 @@ public static Map createCaseData() { + " \"Country\": \"" + COUNTRY + "\",\n" + " \"AddressLine2\": \"" + ADDRESS_LINE_2 + "\"\n" + "}")); - } catch (JsonProcessingException jpe) { + } catch (JacksonException jpe) { fail("Failed to create test case data", jpe); } @@ -56,7 +56,7 @@ public static void assertGlobalSearchData(Map caseData) { searchCriteriaJsonNode.get("OtherCaseReferences").size(), "Saved case data should contain two SearchCriteria with OtherCaseReferences"); - assertTrue(searchCriteriaJsonNode.get("OtherCaseReferences").findValuesAsText("value") + assertTrue(searchCriteriaJsonNode.get("OtherCaseReferences").findValuesAsString("value") .containsAll(List.of(TEST_FIELD_VALUE, ADDRESS_LINE_1)), "Saved case data should contain SearchCriteria with OtherCaseReferences"); @@ -95,7 +95,7 @@ private static void assertSearchPartyNodesPopulatedAsExpected(List searchPartyList = searchParties.findValues("value").stream().map(jsonNode -> { try { return JacksonUtils.MAPPER.treeToValue(jsonNode, SearchPartyValue.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); } return null; diff --git a/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationIT.java b/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationIT.java index b36a9a2df0..0fe39a8a72 100644 --- a/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationIT.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.ccd; +import tools.jackson.databind.ObjectMapper; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.junit.jupiter.api.Test; import org.mockito.MockedConstruction; @@ -17,6 +18,7 @@ class RestTemplateConfigurationIT { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withUserConfiguration(RestTemplateConfiguration.class) + .withBean(ObjectMapper.class, ObjectMapper::new) .withPropertyValues( "http.client.max.total=50", "http.client.seconds.idle.connection=30", diff --git a/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationTest.java b/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationTest.java index 652fcc162d..39ddf474f0 100644 --- a/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/RestTemplateConfigurationTest.java @@ -3,8 +3,11 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.test.context.TestPropertySource; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; @@ -17,6 +20,7 @@ import java.net.URI; import java.util.List; import java.util.ArrayList; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -37,9 +41,10 @@ import static org.springframework.http.HttpMethod.PUT; import static org.apache.http.entity.ContentType.APPLICATION_JSON; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @TestPropertySource(properties = {"http.client.connection.timeout=1500", "http.client.max.total=1", @@ -70,6 +75,19 @@ public void restTemplateShouldBeUsable() throws Exception { assertResponse(response); } + @Test + public void shouldConfigureOnlyJackson3JsonObjectConverter() { + RestTemplate configuredRestTemplate = new RestTemplateConfiguration( + JsonMapper.builderWithJackson2Defaults().build()).printableDocumentsRestTemplate(); + + List> jsonObjectConverters = configuredRestTemplate.getMessageConverters().stream() + .filter(converter -> converter.canWrite(OptionalJsonPayload.class, MediaType.APPLICATION_JSON)) + .toList(); + + assertThat(jsonObjectConverters, hasSize(1)); + assertThat(jsonObjectConverters.getFirst().getClass(), is(JacksonJsonHttpMessageConverter.class)); + } + @Test public void shouldTimeOut() { assertNotNull(restTemplate); @@ -112,7 +130,8 @@ public void shouldBeAbleToUseMultipleTimes() throws Exception { public void shouldApplyDistinctConnectAndReadTimeoutsWhenConfiguredSeparately() { final int connectTimeout = 500; final int readTimeout = 5000; - RestTemplateConfiguration configuration = new RestTemplateConfiguration(); + RestTemplateConfiguration configuration = + new RestTemplateConfiguration(JsonMapper.builderWithJackson2Defaults().build()); // Provide minimal defaults to satisfy the configuration wiring ReflectionTestUtils.setField(configuration, "maxTotalHttpClient", 10); ReflectionTestUtils.setField(configuration, "maxSecondsIdleConnection", 1); @@ -137,7 +156,8 @@ public void shouldApplyDistinctConnectAndReadTimeoutsWhenConfiguredSeparately() public void defaultClientFactoryShouldUseReadTimeoutForSocket() { final int connectTimeout = 800; final int readTimeout = 3200; - RestTemplateConfiguration configuration = new RestTemplateConfiguration(); + RestTemplateConfiguration configuration = + new RestTemplateConfiguration(JsonMapper.builderWithJackson2Defaults().build()); ReflectionTestUtils.setField(configuration, "maxTotalHttpClient", 10); ReflectionTestUtils.setField(configuration, "maxSecondsIdleConnection", 1); ReflectionTestUtils.setField(configuration, "maxClientPerRoute", 2); @@ -162,11 +182,14 @@ private void stubResponse() { .withBody(RESPONSE_BODY))); } - private void assertResponse(final ResponseEntity response) throws JsonProcessingException { - ObjectMapper objectMapper = new ObjectMapper(); + private void assertResponse(final ResponseEntity response) throws JacksonException { + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); assertThat(response.getBody(), is(objectMapper.readValue(RESPONSE_BODY, JsonNode.class))); assertThat(response.getHeaders().get(CONTENT_TYPE), contains(MIME_TYPE)); assertThat(response.getStatusCode().value(), is(SC_OK)); } + + private record OptionalJsonPayload(Optional value) { + } } diff --git a/src/test/java/uk/gov/hmcts/ccd/TestConfiguration.java b/src/test/java/uk/gov/hmcts/ccd/TestConfiguration.java index 608c4c0d71..b32b001a9e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/TestConfiguration.java +++ b/src/test/java/uk/gov/hmcts/ccd/TestConfiguration.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.ccd; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -34,7 +35,7 @@ class TestConfiguration extends ContextCleanupListener { private final ApplicationParams applicationParams; private final DefinitionStoreClient definitionStoreClient; - private static final ObjectMapper mapper = new ObjectMapper(); + private static final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @SuppressWarnings("checkstyle:LineLength") // don't want to break long regex expressions private static final String baseTypes = diff --git a/src/test/java/uk/gov/hmcts/ccd/TestFixtures.java b/src/test/java/uk/gov/hmcts/ccd/TestFixtures.java index affc610258..55adaece84 100644 --- a/src/test/java/uk/gov/hmcts/ccd/TestFixtures.java +++ b/src/test/java/uk/gov/hmcts/ccd/TestFixtures.java @@ -1,10 +1,10 @@ package uk.gov.hmcts.ccd; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.type.TypeFactory; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.type.TypeFactory; import lombok.SneakyThrows; import org.jooq.lambda.tuple.Tuple2; import org.junit.jupiter.params.provider.Arguments; @@ -131,8 +131,7 @@ public abstract class TestFixtures { protected final List locationsRefData = List.of(location1, location2); protected final List servicesRefData = List.of(service1, service2); - protected static final ObjectMapper mapper = new ObjectMapper() - .registerModule(new JavaTimeModule()); + protected static final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @SuppressWarnings("unused") protected static Stream provideNullListParameters() { @@ -257,7 +256,7 @@ public static T loadFromJson(final String filePath, final Class valueType public static List getCaseFieldsFromJson(final String filePath) throws IOException { final InputStream inputStream = getInputStream(filePath); - return mapper.readValue(inputStream, TypeFactory.defaultInstance() + return mapper.readValue(inputStream, TypeFactory.createDefaultInstance() .constructCollectionType(List.class, CaseFieldDefinition.class)); } @@ -288,18 +287,18 @@ public static CaseTypeDefinition loadCaseTypeDefinitionFromJson(final String fil public static List getFieldTypesFromJson(final String filePath) throws IOException { final InputStream inputStream = getInputStream(filePath); - return mapper.readValue(inputStream, TypeFactory.defaultInstance() + return mapper.readValue(inputStream, TypeFactory.createDefaultInstance() .constructCollectionType(List.class, FieldTypeDefinition.class)); } public static Map loadCaseDataFromJson(final String filePath) throws IOException { final InputStream inputStream = getInputStream(filePath); - return mapper.readValue(inputStream, TypeFactory.defaultInstance() + return mapper.readValue(inputStream, TypeFactory.createDefaultInstance() .constructMapType(Map.class, String.class, JsonNode.class)); } public static Map caseDataFromJsonString(final String filePath) throws IOException { - return mapper.readValue(filePath, TypeFactory.defaultInstance() + return mapper.readValue(filePath, TypeFactory.createDefaultInstance() .constructMapType(Map.class, String.class, JsonNode.class)); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/WireMockBaseTest.java b/src/test/java/uk/gov/hmcts/ccd/WireMockBaseTest.java index c1a8ffaaf6..d11579e6be 100644 --- a/src/test/java/uk/gov/hmcts/ccd/WireMockBaseTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/WireMockBaseTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.MappingBuilder; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; @@ -10,6 +10,7 @@ import com.github.tomakehurst.wiremock.common.FileSource; import com.github.tomakehurst.wiremock.extension.Parameters; import com.github.tomakehurst.wiremock.extension.ResponseDefinitionTransformer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; import com.github.tomakehurst.wiremock.http.Fault; import com.github.tomakehurst.wiremock.http.Request; import com.github.tomakehurst.wiremock.http.ResponseDefinition; @@ -20,15 +21,17 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; -import org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.util.ReflectionTestUtils; +import org.wiremock.spring.ConfigureWireMock; +import org.wiremock.spring.EnableWireMock; +import org.wiremock.spring.InjectWireMock; +import org.wiremock.spring.WireMockConfigurationCustomizer; import uk.gov.hmcts.ccd.feign.FeignClientConfig; +import uk.gov.hmcts.ccd.wiremock.extensions.CustomisedResponseTransformer; +import uk.gov.hmcts.ccd.wiremock.extensions.DynamicOAuthJwkSetResponseTransformer; import java.io.IOException; import java.util.UUID; @@ -46,15 +49,15 @@ import static org.springframework.http.HttpHeaders.CONTENT_TYPE; -@AutoConfigureWireMock(port = 0) +@EnableWireMock(@ConfigureWireMock(configurationCustomizers = WireMockBaseTest.Customizer.class)) @Import({FeignClientConfig.class}) public abstract class WireMockBaseTest extends AbstractBaseIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(WireMockBaseTest.class); - protected final ObjectMapper objectMapper = new ObjectMapper() - .registerModule(new JavaTimeModule()) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + protected final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); // data values as per: classpath:sql/insert_cases.sql public static final String CASE_01_REFERENCE = "1504259907353529"; @@ -115,7 +118,7 @@ public abstract class WireMockBaseTest extends AbstractBaseIntegrationTest { @Inject protected ApplicationParams applicationParams; - @Inject + @InjectWireMock protected WireMockServer wireMockServer; @BeforeEach @@ -153,10 +156,10 @@ public void stubSuccess(final String path, final String payload, final UUID mapp } public void stubUpstreamFault(final String path, final UUID mappingId) { - stubFor(get(urlPathEqualTo(path)) + upsertStub(get(urlPathEqualTo(path)) .withId(mappingId) .willReturn(aResponse() - .withFault(Fault.MALFORMED_RESPONSE_CHUNK))); + .withFault(Fault.MALFORMED_RESPONSE_CHUNK)), mappingId); } public void editSuccessStub(final String path, final String payload, final UUID mappingId) { @@ -172,43 +175,48 @@ public void editSuccessStub(final String path, final String payload, final UUID } public void stubNotFound(final String path, final UUID mappingId) { - stubFor(get(urlPathEqualTo(path)) + upsertStub(get(urlPathEqualTo(path)) .withId(mappingId) .withHeader(SERVICE_AUTHORIZATION, equalTo(SERVICE_AUTHORISATION_VALUE)) .willReturn(aResponse() .withStatus(HttpStatus.NOT_FOUND.value()) - ) - ); + ), mappingId); } - public String objectToJsonString(final Object object) { - try { - return mapper.writeValueAsString(object); - } catch (IOException e) { - throw new RuntimeException(e); + private void upsertStub(MappingBuilder mappingBuilder, UUID mappingId) { + if (wireMockServer.getSingleStubMapping(mappingId) == null) { + wireMockServer.stubFor(mappingBuilder); + } else { + wireMockServer.editStub(mappingBuilder); } } - @Configuration - static class WireMockTestConfiguration { - - @Bean - public WireMockConfigurationCustomizer wireMockConfigurationCustomizer() { - return config -> config.extensions(new ResponseDefinitionTransformer() { - - @Override - public String getName() { - return "keep-alive-disabler"; - } - - @Override - public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, - FileSource files, Parameters parameters) { - return ResponseDefinitionBuilder.like(responseDefinition) - .withHeader(HttpHeaders.CONNECTION, "close") - .build(); - } - }); + public String objectToJsonString(final Object object) { + return mapper.writeValueAsString(object); + } + + public static class Customizer implements WireMockConfigurationCustomizer { + + @Override + public void customize(WireMockConfiguration configuration, ConfigureWireMock options) { + configuration.extensions( + new CustomisedResponseTransformer(), + new DynamicOAuthJwkSetResponseTransformer(), + new ResponseDefinitionTransformer() { + + @Override + public String getName() { + return "keep-alive-disabler"; + } + + @Override + public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, + FileSource files, Parameters parameters) { + return ResponseDefinitionBuilder.like(responseDefinition) + .withHeader(HttpHeaders.CONNECTION, "close") + .build(); + } + }); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfigurationTest.java b/src/test/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfigurationTest.java new file mode 100644 index 0000000000..a6910efb6f --- /dev/null +++ b/src/test/java/uk/gov/hmcts/ccd/appinsights/AppInsightsConfigurationTest.java @@ -0,0 +1,71 @@ +package uk.gov.hmcts.ccd.appinsights; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.support.SystemEnvironmentPropertySourceEnvironmentPostProcessor; +import org.springframework.core.env.StandardEnvironment; +import org.springframework.core.env.SystemEnvironmentPropertySource; +import org.springframework.mock.env.MockEnvironment; + +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class AppInsightsConfigurationTest { + + @Test + void shouldResolveInstrumentationKeyFromExistingAzureEnvironmentVariable() { + StandardEnvironment environment = environmentWith( + "AZURE_APPLICATIONINSIGHTS_INSTRUMENTATIONKEY", "test-instrumentation-key" + ); + + assertThat(AppInsightsConfiguration.resolveConnectionString(environment)) + .contains("InstrumentationKey=test-instrumentation-key"); + } + + @Test + void shouldResolveOfficialConnectionStringEnvironmentVariable() { + StandardEnvironment environment = environmentWith( + "APPLICATIONINSIGHTS_CONNECTION_STRING", + "InstrumentationKey=00000000-0000-0000-0000-000000000000" + ); + + assertThat(AppInsightsConfiguration.resolveConnectionString(environment)) + .contains("InstrumentationKey=00000000-0000-0000-0000-000000000000"); + } + + @Test + void shouldPreferMountedConfigTreeConnectionString() { + MockEnvironment environment = new MockEnvironment() + .withProperty("app-insights-connection-string", "InstrumentationKey=config-tree") + .withProperty("applicationinsights.connection-string", "InstrumentationKey=environment") + .withProperty("azure.application-insights.instrumentation-key", "legacy-key"); + + assertThat(AppInsightsConfiguration.resolveConnectionString(environment)) + .contains("InstrumentationKey=config-tree"); + } + + @Test + void shouldLeaveConnectionStringUnconfiguredWhenNoValueIsAvailable() { + assertThat(AppInsightsConfiguration.resolveConnectionString(new MockEnvironment())).isEmpty(); + } + + private static StandardEnvironment environmentWith(String... propertyPairs) { + Map properties = new java.util.HashMap<>(); + for (int index = 0; index < propertyPairs.length; index += 2) { + properties.put(propertyPairs[index], propertyPairs[index + 1]); + } + + StandardEnvironment environment = new StandardEnvironment(); + environment.getPropertySources().replace( + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, + new SystemEnvironmentPropertySource( + StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, + properties + ) + ); + new SystemEnvironmentPropertySourceEnvironmentPostProcessor() + .postProcessEnvironment(environment, new SpringApplication()); + return environment; + } +} diff --git a/src/test/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfigTest.java b/src/test/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfigTest.java index 53892cfccf..9067579515 100644 --- a/src/test/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfigTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/config/JacksonObjectMapperConfigTest.java @@ -1,16 +1,22 @@ package uk.gov.hmcts.ccd.config; import java.time.LocalDateTime; +import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertAll; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import uk.gov.hmcts.reform.ccd.document.am.model.Classification; +import uk.gov.hmcts.reform.ccd.document.am.model.Document; +import uk.gov.hmcts.reform.idam.client.models.UserInfo; @DisplayName("JacksonObjectMapperConfig") class JacksonObjectMapperConfigTest { @@ -18,6 +24,24 @@ class JacksonObjectMapperConfigTest { private static final String DATE_TIME_ISO8601 = "2017-03-01T10:20:30"; private static final LocalDateTime DATE_TIME = LocalDateTime.parse(DATE_TIME_ISO8601); private static final String DATE_TIME_ARRAY = "[2017,3,1,10,20,30]"; + private static final String USER_INFO_JSON = """ + { + "sub": "caseworker@example.com", + "uid": "123", + "name": "Case Worker", + "given_name": "Case", + "family_name": "Worker", + "roles": ["caseworker", "caseworker-test"] + } + """; + private static final String AM_DOCUMENT_JSON = """ + { + "classification": "RESTRICTED", + "size": 42, + "mimeType": "application/pdf", + "originalDocumentName": "evidence.pdf" + } + """; private JacksonObjectMapperConfig mapperConfig; @@ -32,8 +56,41 @@ void shouldConfigureDefaultObjectMapper() { final ObjectMapper mapper = mapperConfig.defaultObjectMapper(); assertAll( - () -> assertThat(mapper.canSerialize(LocalDateTime.class), is(true)), - () -> assertThat(mapper.writeValueAsString(DATE_TIME), equalTo("\"" + DATE_TIME_ISO8601 + "\"")) + () -> assertThat(mapper.writeValueAsString(DATE_TIME), equalTo("\"" + DATE_TIME_ISO8601 + "\"")), + () -> assertThat(mapper.isEnabled(StreamReadFeature.STRICT_DUPLICATE_DETECTION), is(true)), + () -> assertThat(mapper.isEnabled(DeserializationFeature.FAIL_ON_TRAILING_TOKENS), is(false)) + ); + } + + @Test + @DisplayName("should use constructor parameter names when deserialising") + void shouldUseConstructorParameterNamesWhenDeserialising() { + final ObjectMapper mapper = mapperConfig.defaultObjectMapper(); + + UserInfo userInfo = mapper.readValue(USER_INFO_JSON, UserInfo.class); + + assertAll( + () -> assertThat(userInfo.getSub(), equalTo("caseworker@example.com")), + () -> assertThat(userInfo.getUid(), equalTo("123")), + () -> assertThat(userInfo.getName(), equalTo("Case Worker")), + () -> assertThat(userInfo.getGivenName(), equalTo("Case")), + () -> assertThat(userInfo.getFamilyName(), equalTo("Worker")), + () -> assertThat(userInfo.getRoles(), equalTo(List.of("caseworker", "caseworker-test"))) + ); + } + + @Test + @DisplayName("should deserialize the published AM document model without a Jackson 2 parameter-names module") + void shouldDeserializePublishedAmDocumentModelWithJackson3() { + final ObjectMapper mapper = mapperConfig.defaultObjectMapper(); + + Document document = mapper.readValue(AM_DOCUMENT_JSON, Document.class); + + assertAll( + () -> assertThat(document.classification, equalTo(Classification.RESTRICTED)), + () -> assertThat(document.size, equalTo(42L)), + () -> assertThat(document.mimeType, equalTo("application/pdf")), + () -> assertThat(document.originalDocumentName, equalTo("evidence.pdf")) ); } @@ -42,10 +99,7 @@ void shouldConfigureDefaultObjectMapper() { void shouldConfigureSimpleObjectMapper() { final ObjectMapper mapper = mapperConfig.simpleObjectMapper(); - assertAll( - () -> assertThat(mapper.canSerialize(LocalDateTime.class), is(true)), - () -> assertThat(mapper.writeValueAsString(DATE_TIME), equalTo(DATE_TIME_ARRAY)) - ); + assertThat(mapper.writeValueAsString(DATE_TIME), equalTo(DATE_TIME_ARRAY)); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/config/JacksonUtilsTest.java b/src/test/java/uk/gov/hmcts/ccd/config/JacksonUtilsTest.java index e32986b805..ae0922a3a8 100644 --- a/src/test/java/uk/gov/hmcts/ccd/config/JacksonUtilsTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/config/JacksonUtilsTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.config; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeType; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeType; import com.google.common.collect.Maps; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -14,6 +14,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -25,6 +26,39 @@ class JacksonUtilsTest { private static final String NULL_MARKER = "NULL"; private static final String UUID_MARKER = "UUID"; + @Test + void shouldCoerceNodesToTextUsingJackson2Semantics() { + assertAll( + () -> assertEquals("", JacksonUtils.asText(MAPPER.createObjectNode().put("field", "value"))), + () -> assertEquals("", JacksonUtils.asText(MAPPER.createArrayNode().add("value"))), + () -> assertEquals("", JacksonUtils.asText(MAPPER.getNodeFactory().missingNode())), + () -> assertEquals("null", JacksonUtils.asText(MAPPER.getNodeFactory().nullNode())), + () -> assertEquals("42", JacksonUtils.asText(MAPPER.getNodeFactory().numberNode(42))), + () -> assertEquals("value", JacksonUtils.asText(MAPPER.getNodeFactory().stringNode("value"))), + () -> assertEquals("wrapped", JacksonUtils.asText(MAPPER.getNodeFactory().pojoNode("wrapped"))) + ); + } + + @Test + void shouldUseDefaultOnlyForNullOrMissingNodesUsingJackson2Semantics() { + assertAll( + () -> assertEquals("default", JacksonUtils.asText(MAPPER.getNodeFactory().missingNode(), "default")), + () -> assertEquals("default", JacksonUtils.asText(MAPPER.getNodeFactory().nullNode(), "default")), + () -> assertEquals("", JacksonUtils.asText(MAPPER.createObjectNode().put("field", "value"), "default")), + () -> assertEquals("", JacksonUtils.asText(MAPPER.createArrayNode().add("value"), "default")), + () -> assertEquals("value", JacksonUtils.asText( + MAPPER.getNodeFactory().stringNode("value"), "default")) + ); + } + + @Test + void shouldRepresentNullStringsAsJsonNull() { + assertAll( + () -> assertTrue(JacksonUtils.stringOrNullNode(null).isNull()), + () -> assertEquals("value", JacksonUtils.asText(JacksonUtils.stringOrNullNode("value"))) + ); + } + @Test void buildFromDottedPath() { JsonNode result = JacksonUtils.buildFromDottedPath("FieldA.FieldB.FieldC", "Test value"); @@ -35,7 +69,7 @@ void buildFromDottedPath() { assertNotNull(result.get("FieldA").get("FieldB")); assertNotNull(result.get("FieldA").get("FieldB").get("FieldC")); assertThat(result.get("FieldA").get("FieldB").get("FieldC").getNodeType(), is(JsonNodeType.STRING)); - assertThat(result.get("FieldA").get("FieldB").get("FieldC").asText(), is("Test value")); + assertThat(result.get("FieldA").get("FieldB").get("FieldC").asString(), is("Test value")); } @Test @@ -89,38 +123,38 @@ void shouldOmitNestedCollectionOnMerge() throws Exception { @Test void shouldMergeNullTopLevelValue() { Map mergeFrom = new HashMap<>(); - mergeFrom.put("TextField0", MAPPER.getNodeFactory().textNode("Default text")); + mergeFrom.put("TextField0", MAPPER.getNodeFactory().stringNode("Default text")); Map mergeInto = new HashMap<>(); mergeInto.put("TextField0", MAPPER.getNodeFactory().nullNode()); JacksonUtils.merge(mergeFrom, mergeInto); - assertEquals("Default text", mergeInto.get("TextField0").asText()); + assertEquals("Default text", mergeInto.get("TextField0").asString()); } @Test void shouldNotUseDefaultValueWhenTopLevelValueExists() { Map mergeFrom = new HashMap<>(); - mergeFrom.put("TextField0", MAPPER.getNodeFactory().textNode("Default text")); + mergeFrom.put("TextField0", MAPPER.getNodeFactory().stringNode("Default text")); Map mergeInto = new HashMap<>(); - mergeInto.put("TextField0", MAPPER.getNodeFactory().textNode("Existing text")); + mergeInto.put("TextField0", MAPPER.getNodeFactory().stringNode("Existing text")); JacksonUtils.merge(mergeFrom, mergeInto); - assertEquals("Existing text", mergeInto.get("TextField0").asText()); + assertEquals("Existing text", mergeInto.get("TextField0").asString()); } @Test void shouldOnlyUseDefaultValueWhenTopLevelKeyNotPresent() { Map mergeFrom = new HashMap<>(); - mergeFrom.put("TextField0", MAPPER.getNodeFactory().textNode("Default text")); + mergeFrom.put("TextField0", MAPPER.getNodeFactory().stringNode("Default text")); Map mergeInto = new HashMap<>(); - mergeInto.put("TextField1", MAPPER.getNodeFactory().textNode("Existing text")); + mergeInto.put("TextField1", MAPPER.getNodeFactory().stringNode("Existing text")); JacksonUtils.merge(mergeFrom, mergeInto); - assertEquals("Default text", mergeInto.get("TextField0").asText()); - assertEquals("Existing text", mergeInto.get("TextField1").asText()); + assertEquals("Default text", mergeInto.get("TextField0").asString()); + assertEquals("Existing text", mergeInto.get("TextField1").asString()); } @ParameterizedTest(name = "Test getValueFromPath - #{index} - `{0}`") @@ -176,7 +210,7 @@ void shouldOnlyUseDefaultValueWhenTopLevelKeyNotPresent() { "CaseLinkCollection.0.CaseReference," + "1637697929437509", "CaseLinkCollection.1.CaseReference," + "1637697929619312" }) - void testGetValueFromPath(final String path, final String expected) throws JsonProcessingException { + void testGetValueFromPath(final String path, final String expected) throws JacksonException { // ARRANGE final String testId = UUID.randomUUID().toString(); @@ -297,7 +331,7 @@ void testGetValueFromPath(final String path, final String expected) throws JsonP } static Map mySchoolDataWithNestedCollection(String name, String className1, String className2) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -325,7 +359,7 @@ static Map mySchoolDataWithNestedCollection(String name, Strin } static Map mySchoolDefaultValueData(String name, String className) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -341,7 +375,7 @@ static Map mySchoolDefaultValueData(String name, String classN } static Map topLevelCollectionCaseData() - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "[" @@ -365,7 +399,7 @@ static Map topLevelCollectionCaseData() } static Map topLevelCollectionDefaultValue() - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -378,7 +412,7 @@ static Map topLevelCollectionDefaultValue() } static Map organisationPolicyCaseData(String role) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -396,7 +430,7 @@ static Map organisationPolicyCaseData(String role) } static Map organisationPolicyDefaultValue(String role) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -411,7 +445,7 @@ static Map organisationPolicyDefaultValue(String role) @Test void testConvertValueInDataFieldFromMap() { Map inputMap = new HashMap<>(); - inputMap.put("data1", MAPPER.getNodeFactory().textNode("Name_1")); + inputMap.put("data1", MAPPER.getNodeFactory().stringNode("Name_1")); inputMap.put("data2", MAPPER.getNodeFactory().numberNode(42)); Map result = JacksonUtils.convertValueInDataField(inputMap); @@ -420,7 +454,7 @@ void testConvertValueInDataFieldFromMap() { assertTrue(result.containsKey(DATA)); JsonNode dataNode = result.get(DATA); - assertEquals("Name_1", dataNode.get("data1").asText()); + assertEquals("Name_1", dataNode.get("data1").asString()); assertEquals(42, dataNode.get("data2").asInt()); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/data/AbstractReferenceDataIT.java b/src/test/java/uk/gov/hmcts/ccd/data/AbstractReferenceDataIT.java index 34a90c4d31..dac4b13cc2 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/AbstractReferenceDataIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/AbstractReferenceDataIT.java @@ -27,6 +27,6 @@ void prepare() { stubMapping.ifPresent(mapping -> wireMockServer.removeStub(mapping)); }); - wireMockServer.resetAll(); + wireMockServer.resetRequests(); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/data/JsonDataConverterTest.java b/src/test/java/uk/gov/hmcts/ccd/data/JsonDataConverterTest.java index 85d2e1cbe8..5385b06c59 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/JsonDataConverterTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/JsonDataConverterTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.data; import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -12,11 +13,10 @@ import static org.junit.Assert.fail; public class JsonDataConverterTest { - private static ObjectMapper mapper = new ObjectMapper(); - - static { - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - } + private static final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults() + .changeDefaultPropertyInclusion(inclusion -> + inclusion.withValueInclusion(JsonInclude.Include.NON_NULL)) + .build(); private JsonDataConverter jsonbConverter; @@ -40,7 +40,7 @@ public void convertToEntityAttribute() { // Teasing valid non null final JsonNode converted = jsonbConverter.convertToEntityAttribute("{\"key\":\"value\"}"); - assertEquals("value", converted.get("key").asText()); + assertEquals("value", converted.get("key").asString()); try { jsonbConverter.convertToEntityAttribute("hjkdash\""); diff --git a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DefaultCaseDetailsRepositoryTest.java b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DefaultCaseDetailsRepositoryTest.java index 12fe311c0b..8b60a73c25 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DefaultCaseDetailsRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DefaultCaseDetailsRepositoryTest.java @@ -36,7 +36,6 @@ import jakarta.persistence.OptimisticLockException; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletRequestEvent; -import java.io.IOException; import java.lang.reflect.Field; import java.time.LocalDate; import java.time.LocalDateTime; @@ -178,12 +177,8 @@ public void setShouldPersistCaseDetails() { caseDetails.setState("CaseCreated"); caseDetails.setSecurityClassification(SecurityClassification.PUBLIC); caseDetails.setResolvedTTL(RESOLVED_TTL); - try { - caseDetails.setData(JacksonUtils.convertValue( - mapper.readTree("{\"Alliases\": [], \"HasOtherInfo\": \"Yes\"}"))); - } catch (IOException e) { - e.printStackTrace(); - } + caseDetails.setData(JacksonUtils.convertValue( + mapper.readTree("{\"Alliases\": [], \"HasOtherInfo\": \"Yes\"}"))); final CaseDetails caseDetailsPersisted = caseDetailsRepository.set(caseDetails); assertThat(caseDetailsPersisted.getId(), is(notNullValue())); assertThat(caseDetailsPersisted.getReference(), is(caseDetails.getReference())); @@ -205,11 +200,11 @@ public void findByIdShouldReturnCorrectSingleRecord() { () -> assertThat(byId.getCaseTypeId(), is("TestAddressBookCase")), () -> assertThat(byId.getSecurityClassification(), is(SecurityClassification.PUBLIC)), () -> assertThat(byId.getReference(), is(1504259907353529L)), - () -> assertThat(byId.getData().get("PersonFirstName").asText(), is("Janet")), - () -> assertThat(byId.getData().get("PersonLastName").asText(), is("Parker")), - () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine1").asText(), is("123")), - () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine2").asText(), is("Fake Street")), - () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine3").asText(), is("Hexton")) + () -> assertThat(byId.getData().get("PersonFirstName").asString(), is("Janet")), + () -> assertThat(byId.getData().get("PersonLastName").asString(), is("Parker")), + () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine1").asString(), is("123")), + () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine2").asString(), is("Fake Street")), + () -> assertThat(byId.getData().get("PersonAddress").get("AddressLine3").asString(), is("Hexton")) ); } @@ -226,12 +221,12 @@ public void findByReferenceShouldReturnCorrectSingleRecord() { () -> assertThat(byReference.getCaseTypeId(), is("TestAddressBookCase")), () -> assertThat(byReference.getSecurityClassification(), is(SecurityClassification.PUBLIC)), () -> assertThat(byReference.getReference(), is(1504259907353529L)), - () -> assertThat(byReference.getData().get("PersonFirstName").asText(), is("Janet")), - () -> assertThat(byReference.getData().get("PersonLastName").asText(), is("Parker")), - () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine1").asText(), is("123")), - () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine2").asText(), + () -> assertThat(byReference.getData().get("PersonFirstName").asString(), is("Janet")), + () -> assertThat(byReference.getData().get("PersonLastName").asString(), is("Parker")), + () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine1").asString(), is("123")), + () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine2").asString(), is("Fake Street")), - () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine3").asText(), is("Hexton")) + () -> assertThat(byReference.getData().get("PersonAddress").get("AddressLine3").asString(), is("Hexton")) ); } @@ -529,13 +524,16 @@ public void getFindByMetadataAndFieldDataReturnCorrectRecords() { () -> assertThat(byMetaDataAndFieldData.get(0).getSecurityClassification(), is(SecurityClassification.PUBLIC)), () -> assertThat(byMetaDataAndFieldData.get(0).getReference(), is(1504259907353529L)), - () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonFirstName").asText(), is("Janet")), - () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonLastName").asText(), is("Parker")), - () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress").get("AddressLine1").asText(), + () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonFirstName").asString(), is("Janet")), + () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonLastName").asString(), is("Parker")), + () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress") + .get("AddressLine1").asString(), is("123")), - () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress").get("AddressLine2").asText(), + () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress") + .get("AddressLine2").asString(), is("Fake Street")), - () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress").get("AddressLine3").asText(), + () -> assertThat(byMetaDataAndFieldData.get(0).getData().get("PersonAddress") + .get("AddressLine3").asString(), is("Hexton")) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DelegatingCaseDetailsRepositoryTest.java b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DelegatingCaseDetailsRepositoryTest.java index da28409685..ecc23f569f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DelegatingCaseDetailsRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/DelegatingCaseDetailsRepositoryTest.java @@ -1,11 +1,11 @@ package uk.gov.hmcts.ccd.data.casedetails; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.decentralised.client.ServicePersistenceClient; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; import uk.gov.hmcts.ccd.domain.service.common.PersistenceStrategyResolver; @@ -28,7 +28,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class DelegatingCaseDetailsRepositoryTest { private static final String JURISDICTION = "TEST_JURISDICTION"; @@ -54,7 +54,7 @@ public class DelegatingCaseDetailsRepositoryTest { private CaseDetails decentralizedCaseDetails; private CaseDetails decentralizedFullCaseDetails; - @Before + @BeforeEach public void setUp() { centralizedCaseDetails = createCaseDetails(CASE_TYPE_CENTRALIZED); decentralizedCaseDetails = createCaseDetails(CASE_TYPE_DECENTRALIZED); diff --git a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserTypeTest.java b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserTypeTest.java index 1966255ef2..62b47c99fb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserTypeTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/casedetails/supplementarydata/SupplementaryDataUserTypeTest.java @@ -18,8 +18,8 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; public class SupplementaryDataUserTypeTest { diff --git a/src/test/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGatewayTest.java b/src/test/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGatewayTest.java index 196b9012b0..82af118177 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGatewayTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/draft/DefaultDraftGatewayTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.data.draft; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.StringNode; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -60,9 +60,9 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.UpdateCaseDraftBuilder.newUpdateCaseDraft; class DefaultDraftGatewayTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); - public static final TextNode VALUE_CLASS = JSON_NODE_FACTORY.textNode("valueClass"); - public static final TextNode VALUE = JSON_NODE_FACTORY.textNode("value"); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); + public static final StringNode VALUE_CLASS = JSON_NODE_FACTORY.stringNode("valueClass"); + public static final StringNode VALUE = JSON_NODE_FACTORY.stringNode("value"); private static final String CASE_DATA_CONTENT = "CaseDataContent"; private static final String UID = "1"; private static final String JID = "TEST"; @@ -108,7 +108,7 @@ class DefaultDraftGatewayTest { private final String draftURL5 = "draftBaseURL/" + DID; @BeforeEach - public void setUp() throws JsonProcessingException { + public void setUp() throws JacksonException { MockitoAnnotations.openMocks(this); doReturn(new HttpHeaders()).when(securityUtils).authorizationHeaders(); doReturn(new HttpHeaders()).when(securityUtils).userAuthorizationHeaders(); @@ -156,17 +156,17 @@ public void setUp() throws JsonProcessingException { @Test void shouldSuccessfullyCreateDraft() throws URISyntaxException { - ResponseEntity response = ResponseEntity.created(new URI("http://localhost:8800/drafts/4")).build(); + ResponseEntity response = ResponseEntity.created(new URI("http://localhost:8800/drafts/4")).build(); doReturn(response).when(createDraftRestTemplate).exchange(anyString(), eq(HttpMethod.POST), - any(HttpEntity.class), eq(HttpEntity.class)); + any(HttpEntity.class), eq(Void.class)); Long result = draftGateway.create(createCaseDraftRequest); assertAll( () -> verify(createDraftRestTemplate).exchange(eq(draftBaseURL), eq(HttpMethod.POST), any(HttpEntity.class), - eq(HttpEntity.class)), + eq(Void.class)), () -> verify(restTemplate, never()).exchange(eq(draftBaseURL), eq(HttpMethod.POST), any(HttpEntity.class), - eq(HttpEntity.class)), + eq(Void.class)), () -> assertEquals(4L, result) ); } @@ -175,7 +175,7 @@ void shouldSuccessfullyCreateDraft() throws URISyntaxException { void shouldFailToCreateDraftWhenConnectivityIssue() { Exception exception = new RestClientException("connectivity issue"); doThrow(exception).when(createDraftRestTemplate).exchange(anyString(), eq(HttpMethod.POST), - any(HttpEntity.class), eq(HttpEntity.class)); + any(HttpEntity.class), eq(Void.class)); final ServiceException actualException = assertThrows(ServiceException.class, () -> draftGateway.create(createCaseDraftRequest)); @@ -186,9 +186,9 @@ void shouldFailToCreateDraftWhenConnectivityIssue() { @Test void shouldFailToGetResponseFromCreateDraft() { - ResponseEntity response = ResponseEntity.noContent().build(); + ResponseEntity response = ResponseEntity.noContent().build(); doReturn(response).when(createDraftRestTemplate).exchange(anyString(), eq(HttpMethod.POST), - any(HttpEntity.class), eq(HttpEntity.class)); + any(HttpEntity.class), eq(Void.class)); assertNull(draftGateway.create(createCaseDraftRequest)); } diff --git a/src/test/java/uk/gov/hmcts/ccd/data/message/MessageCandidateMapperTest.java b/src/test/java/uk/gov/hmcts/ccd/data/message/MessageCandidateMapperTest.java index 8fe96b3194..dc9cfdfa67 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/message/MessageCandidateMapperTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/message/MessageCandidateMapperTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.data.message; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.std.MessageInformation; @@ -24,7 +24,7 @@ class MessageCandidateMapperTest { private static final String USER_ID = "USER_ID"; private static final LocalDateTime DATE_TIME = LocalDateTime.of(2020,12,07,16,42,00); - private static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); + private static final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @Test @DisplayName("Should map model to entity ") diff --git a/src/test/java/uk/gov/hmcts/ccd/data/message/additionaldata/DefinitionBlockGeneratorTest.java b/src/test/java/uk/gov/hmcts/ccd/data/message/additionaldata/DefinitionBlockGeneratorTest.java index 61f3162c31..a9812130bf 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/message/additionaldata/DefinitionBlockGeneratorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/message/additionaldata/DefinitionBlockGeneratorTest.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.data.message.additionaldata; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -53,7 +54,7 @@ class DefinitionBlockGeneratorTest { private CaseTypeDefinition caseTypeDefinition; private CaseDetails caseDetails; - private ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private static final String FIELD_ID = "FieldId"; private static final String FIELD_ALIAS = "FieldAlias"; @@ -74,7 +75,7 @@ class DefinitionBlockGeneratorTest { private static final String UPLOAD_TIMESTAMP = "upload_timestamp"; @BeforeEach - void setUp() throws JsonProcessingException { + void setUp() throws JacksonException { MockitoAnnotations.openMocks(this); Map mappings = newHashMap(); diff --git a/src/test/java/uk/gov/hmcts/ccd/data/persistence/CasePointerRepositoryTest.java b/src/test/java/uk/gov/hmcts/ccd/data/persistence/CasePointerRepositoryTest.java index 1152534d68..c18d76522d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/data/persistence/CasePointerRepositoryTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/data/persistence/CasePointerRepositoryTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.data.persistence; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; @@ -14,7 +14,7 @@ import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; -import javax.inject.Inject; +import jakarta.inject.Inject; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneOffset; @@ -48,7 +48,7 @@ public class CasePointerRepositoryTest extends WireMockBaseTest { @Inject private PlatformTransactionManager transactionManager; - @Before + @BeforeEach public void setUp() { originalCaseDetails = createOriginalCaseDetails(); } diff --git a/src/test/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClientTest.java b/src/test/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClientTest.java index 55ec356159..ca59cf6eb5 100644 --- a/src/test/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClientTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/decentralised/client/ServicePersistenceClientTest.java @@ -1,12 +1,12 @@ package uk.gov.hmcts.ccd.decentralised.client; -import com.fasterxml.jackson.databind.JsonNode; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import tools.jackson.databind.JsonNode; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.decentralised.dto.DecentralisedAuditEvent; import uk.gov.hmcts.ccd.decentralised.dto.DecentralisedCaseDetails; import uk.gov.hmcts.ccd.decentralised.dto.DecentralisedCaseEvent; @@ -35,7 +35,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class ServicePersistenceClientTest { private static final String JURISDICTION = "TEST_JURISDICTION"; @@ -65,7 +65,7 @@ public class ServicePersistenceClientTest { private DecentralisedCaseDetails decentralisedCaseDetails; private DecentralisedSubmitEventResponse submitEventResponse; - @Before + @BeforeEach public void setUp() { casePointer = createCasePointer(); caseDetails = createCaseDetails(); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParserTest.java index 45339bdda1..aabf046830 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/enablingcondition/jexl/JexlEnablingConditionParserTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.enablingcondition.jexl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.JsonNodeFactory; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -19,7 +19,7 @@ class JexlEnablingConditionParserTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private JexlEnablingConditionParser enablingConditionParser; @@ -112,9 +112,9 @@ void shouldReturnFalseWhenConditionHasUnKnownField() { } @Test - void shouldThrowExceptionWhenDataIsNotValidJson() throws JsonProcessingException { + void shouldThrowExceptionWhenDataIsNotValidJson() throws JacksonException { ObjectMapper objectMapper = mock(ObjectMapper.class); - when(objectMapper.writeValueAsString(any())).thenThrow(JsonProcessingException.class); + when(objectMapper.writeValueAsString(any())).thenThrow(JacksonException.class); enablingConditionParser = new JexlEnablingConditionParser(new JexlEnablingConditionConverter(), objectMapper); String enablingCondition = "FieldA!=\"\" AND FieldB=\"I'm innocent\")"; @@ -132,7 +132,7 @@ void shouldReturnTrueWhenEnablingConditionInjectedDataMatches() { String enablingCondition = "[INJECTED_DATA__gsData]=\"myValue\""; Map data = new HashMap<>(); - data.put("[INJECTED_DATA__gsData]", JSON_NODE_FACTORY.textNode("myValue")); + data.put("[INJECTED_DATA__gsData]", JSON_NODE_FACTORY.stringNode("myValue")); Boolean isValid = enablingConditionParser.evaluate(enablingCondition, data); @@ -145,7 +145,7 @@ void shouldReturnFalseWhenEnablingConditionInjectedDataWithDotDelimeters() { String enablingCondition = "[INJECTED_DATA.gsData]=\"myValue\""; Map data = new HashMap<>(); - data.put("[INJECTED_DATA.gsData]", JSON_NODE_FACTORY.textNode("myValue")); + data.put("[INJECTED_DATA.gsData]", JSON_NODE_FACTORY.stringNode("myValue")); Boolean isValid = enablingConditionParser.evaluate(enablingCondition, data); @@ -156,8 +156,8 @@ void shouldReturnFalseWhenEnablingConditionInjectedDataWithDotDelimeters() { private Map createCaseData(String fieldA, String fieldB) { Map data = new HashMap<>(); - data.put("FieldA", JSON_NODE_FACTORY.textNode(fieldA)); - data.put("FieldB", JSON_NODE_FACTORY.textNode(fieldB)); + data.put("FieldA", JSON_NODE_FACTORY.stringNode(fieldA)); + data.put("FieldB", JSON_NODE_FACTORY.stringNode(fieldB)); return data; } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseViewFieldBuilderTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseViewFieldBuilderTest.java index 2bc709378b..c062337901 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseViewFieldBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/aggregated/CaseViewFieldBuilderTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -47,7 +47,7 @@ public class CaseViewFieldBuilderTest { private static final CaseEventFieldDefinition EVENT_FIELD_3 = new CaseEventFieldDefinition(); private static final String FIRST_NAME = "Patrick"; private static final String LAST_NAME = "Smith"; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final AccessControlList acl1 = anAcl().withRole("role1").withCreate(true).withRead(true) .withUpdate(true).withDelete(false).build(); private static final AccessControlList acl2 = anAcl().withRole("role2").withCreate(true).withRead(true) @@ -139,7 +139,7 @@ public void shouldCreateFieldFromCaseEventFieldWithData() { final CaseViewField expectedField = new CaseViewField(); doReturn(expectedField).when(fieldBuilder).build(CASE_FIELD, EVENT_FIELD); - final JsonNode data = JSON_NODE_FACTORY.textNode("value"); + final JsonNode data = JSON_NODE_FACTORY.stringNode("value"); final CaseViewField field = fieldBuilder.build(CASE_FIELD, EVENT_FIELD, data); @@ -159,8 +159,8 @@ public void shouldCreateFieldFromArrayOfCaseEventField() { final List caseFieldDefinitions = asList(CASE_FIELD, CASE_FIELD_2); final List eventFields = asList(EVENT_FIELD, EVENT_FIELD_2); final Map data = new HashMap<>(); - data.put("PersonFirstName", JSON_NODE_FACTORY.textNode(FIRST_NAME)); - data.put("PersonLastName", JSON_NODE_FACTORY.textNode(LAST_NAME)); + data.put("PersonFirstName", JSON_NODE_FACTORY.stringNode(FIRST_NAME)); + data.put("PersonLastName", JSON_NODE_FACTORY.stringNode(LAST_NAME)); final List fields = fieldBuilder.build(caseFieldDefinitions, eventFields, data); @@ -180,8 +180,8 @@ public void shouldCreateFieldFromArrayOfCaseEventField_fieldNotInCaseFieldsIsIgn final List caseFieldDefinitions = asList(CASE_FIELD); final List eventFields = asList(EVENT_FIELD, EVENT_FIELD_2); final Map data = new HashMap<>(); - data.put("PersonFirstName", JSON_NODE_FACTORY.textNode(FIRST_NAME)); - data.put("PersonLastName", JSON_NODE_FACTORY.textNode(LAST_NAME)); + data.put("PersonFirstName", JSON_NODE_FACTORY.stringNode(FIRST_NAME)); + data.put("PersonLastName", JSON_NODE_FACTORY.stringNode(LAST_NAME)); final List fields = fieldBuilder.build(caseFieldDefinitions, eventFields, data); @@ -202,8 +202,8 @@ public void shouldCreateFieldFromArrayOfCaseEventField_fieldNotInEventFieldsIsIg final List caseFieldDefinitions = asList(CASE_FIELD, CASE_FIELD_2); final List eventFields = asList(EVENT_FIELD); final Map data = new HashMap<>(); - data.put("PersonFirstName", JSON_NODE_FACTORY.textNode(FIRST_NAME)); - data.put("PersonLastName", JSON_NODE_FACTORY.textNode(LAST_NAME)); + data.put("PersonFirstName", JSON_NODE_FACTORY.stringNode(FIRST_NAME)); + data.put("PersonLastName", JSON_NODE_FACTORY.stringNode(LAST_NAME)); final List fields = fieldBuilder.build(caseFieldDefinitions, eventFields, data); @@ -224,7 +224,7 @@ public void shouldCreateFieldFromArrayOfCaseEventField_fieldWithoutData() { final List caseFieldDefinitions = asList(CASE_FIELD); final List eventFields = asList(EVENT_FIELD); final Map data = new HashMap<>(); - data.put("PersonLastName", JSON_NODE_FACTORY.textNode(LAST_NAME)); + data.put("PersonLastName", JSON_NODE_FACTORY.stringNode(LAST_NAME)); final List fields = fieldBuilder.build(caseFieldDefinitions, eventFields, data); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcherTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcherTest.java index 5a62751632..af9416aa53 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcherTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/casedataaccesscontrol/matcher/CaseAccessGroupsMatcherTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.model.casedataaccesscontrol.matcher; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -47,12 +48,12 @@ void setUp() { } @Test - void shouldMatchOnCaseAccessGroupId() throws JsonProcessingException { + void shouldMatchOnCaseAccessGroupId() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId1")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map dataMap = JacksonUtils.convertValue(mapper.readTree(simpleGAjsonRequest)); @@ -61,12 +62,12 @@ void shouldMatchOnCaseAccessGroupId() throws JsonProcessingException { } @Test - void shouldNotMatchOnCaseAccessGroupIdWithEmptyRAValues() throws JsonProcessingException { + void shouldNotMatchOnCaseAccessGroupIdWithEmptyRAValues() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId1")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map dataMap = JacksonUtils.convertValue(mapper.readTree("{}")); @@ -75,12 +76,12 @@ void shouldNotMatchOnCaseAccessGroupIdWithEmptyRAValues() throws JsonProcessingE } @Test - void shouldMatchOnCaseAccessGroupIdWithEmptyCaseValues() throws JsonProcessingException { + void shouldMatchOnCaseAccessGroupIdWithEmptyCaseValues() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, null); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map dataMap = JacksonUtils.convertValue(mapper.readTree(simpleGAjsonRequest)); @@ -89,12 +90,12 @@ void shouldMatchOnCaseAccessGroupIdWithEmptyCaseValues() throws JsonProcessingEx } @Test - void shouldMatchOnCaseAccessGroupIdWithEmptyCaseAndRAValues() throws JsonProcessingException { + void shouldMatchOnCaseAccessGroupIdWithEmptyCaseAndRAValues() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, null); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map dataMap = JacksonUtils.convertValue(mapper.readTree("{}")); @@ -103,12 +104,12 @@ void shouldMatchOnCaseAccessGroupIdWithEmptyCaseAndRAValues() throws JsonProcess } @Test - void shouldNotMatchOnCaseGroupId() throws JsonProcessingException { + void shouldNotMatchOnCaseGroupId() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId3")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map dataMap = JacksonUtils.convertValue(mapper.readTree(simpleGAjsonRequest)); @@ -117,12 +118,12 @@ void shouldNotMatchOnCaseGroupId() throws JsonProcessingException { } @Test - void shouldNotMatchOnCaseAccessGroupIdWithMissingItemId() throws JsonProcessingException { + void shouldNotMatchOnCaseAccessGroupIdWithMissingItemId() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId1")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); String replacing = "\"id\": \"id1\",\n"; String missing = simpleGAjsonRequest.replaceAll(replacing, "\n"); @@ -134,12 +135,12 @@ void shouldNotMatchOnCaseAccessGroupIdWithMissingItemId() throws JsonProcessingE } @Test - void shouldNotMatchOnCaseAccessGroupIdWithMissingValue() throws JsonProcessingException { + void shouldNotMatchOnCaseAccessGroupIdWithMissingValue() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId1")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); String replacing = ",\n \"value\": \\{\n \"caseAccessGroupId\": \"caseGroupId1\",\n" + " \"caseAccessGroupType\": \"caseAccessGroupType1\"\n \\}\n"; @@ -152,12 +153,12 @@ void shouldNotMatchOnCaseAccessGroupIdWithMissingValue() throws JsonProcessingEx } @Test - void shouldNotMatchOnCaseAccessGroupIdWhenNotAnArray() throws JsonProcessingException { + void shouldNotMatchOnCaseAccessGroupIdWhenNotAnArray() throws JacksonException { RoleAssignment roleAssignment = createRoleAssignment(Instant.now().minus(1, ChronoUnit.DAYS), Instant.now().plus(2, ChronoUnit.DAYS), "PRIVATE", null, null, null, null, Optional.of("caseGroupId1")); CaseDetails caseDetails = mockCaseDetails(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); String missing = "{\n\"caseAccessGroups\": \"\"}\n"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/AccessControlListTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/AccessControlListTest.java index fdadcdd139..8616a10f2b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/AccessControlListTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/AccessControlListTest.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -10,7 +11,7 @@ class AccessControlListTest { @Test - void shouldValidateAccessControlListParsing() throws JsonProcessingException { + void shouldValidateAccessControlListParsing() throws JacksonException { AccessControlList accessControlList = new AccessControlList(); accessControlList.setUpdate(false); @@ -19,14 +20,14 @@ void shouldValidateAccessControlListParsing() throws JsonProcessingException { accessControlList.setCreate(true); accessControlList.setAccessProfile("test"); - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); String value = objectMapper.writeValueAsString(accessControlList); assertEquals("{\"create\":true,\"read\":false,\"update\":false,\"delete\":false,\"role\":\"test\"}", value); } @Test - void shouldValidateAccessControlListSerializationWithRole() throws JsonProcessingException { + void shouldValidateAccessControlListSerializationWithRole() throws JacksonException { String accessControlJson = "{\n" + "\t\"role\": \"caseworker-probate-public\",\n" + "\t\"create\": true,\n" @@ -35,13 +36,13 @@ void shouldValidateAccessControlListSerializationWithRole() throws JsonProcessin + "\t\"delete\": false\n" + "}"; - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); AccessControlList value = objectMapper.readValue(accessControlJson, AccessControlList.class); assertEquals("caseworker-probate-public", value.getAccessProfile()); } @Test - void shouldValidateAccessControlListSerializationWithAccessProfile() throws JsonProcessingException { + void shouldValidateAccessControlListSerializationWithAccessProfile() throws JacksonException { String accessControlJson = "{\n" + "\t\"accessProfile\": \"caseworker-probate-public\",\n" + "\t\"create\": true,\n" @@ -50,7 +51,7 @@ void shouldValidateAccessControlListSerializationWithAccessProfile() throws Json + "\t\"delete\": false\n" + "}"; - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); AccessControlList value = objectMapper.readValue(accessControlJson, AccessControlList.class); assertEquals("caseworker-probate-public", value.getAccessProfile()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetailsTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetailsTest.java index 63ff9818d0..8999166573 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetailsTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseDetailsTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; @@ -25,7 +25,7 @@ class CaseDetailsTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_DETAIL_FIELD = "dataTestField1"; private uk.gov.hmcts.ccd.domain.model.definition.CaseDetails caseDetails; @@ -106,7 +106,7 @@ void shouldReturnCaseDataAndMetadataFieldMap() { Map allData = caseDetails.getCaseDataAndMetadata(); - assertThat(((JsonNode) allData.get(CASE_DETAIL_FIELD)).asText(), equalTo(CASE_DETAIL_FIELD)); + assertThat(((JsonNode) allData.get(CASE_DETAIL_FIELD)).asString(), equalTo(CASE_DETAIL_FIELD)); assertThat(allData.get(JURISDICTION.getReference()), equalTo(caseDetails.getJurisdiction())); assertThat(allData.get(CASE_TYPE.getReference()), equalTo(caseDetails.getCaseTypeId())); assertThat(allData.get(STATE.getReference()), equalTo(caseDetails.getState())); @@ -122,7 +122,7 @@ void shouldReturnCaseDataAndMetadataFieldMap() { private Map buildData(String... dataFieldIds) { Map dataMap = Maps.newHashMap(); Lists.newArrayList(dataFieldIds) - .forEach(dataFieldId -> dataMap.put(dataFieldId, JSON_NODE_FACTORY.textNode(dataFieldId))); + .forEach(dataFieldId -> dataMap.put(dataFieldId, JSON_NODE_FACTORY.stringNode(dataFieldId))); return dataMap; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinitionTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinitionTest.java index 580945cbbf..be76f9f362 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinitionTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/CaseTypeDefinitionTest.java @@ -1,13 +1,10 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -44,15 +41,14 @@ class CaseTypeDefinitionTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); } @Test - public void ftMasterCaseTypeHashStringComparison() throws JsonProcessingException { + public void ftMasterCaseTypeHashStringComparison() throws JacksonException { String fileContent = fromFileAsString("tests/FT-MasterCaseType-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); @@ -70,7 +66,7 @@ public void ftMasterCaseTypeHashStringComparison() throws JsonProcessingExceptio } @Test - public void beftaCaseType31HashStringComparison() throws JsonProcessingException { + public void beftaCaseType31HashStringComparison() throws JacksonException { String fileContent = fromFileAsString("tests/BEFTA-CASETYPE-3-1-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); @@ -88,7 +84,7 @@ public void beftaCaseType31HashStringComparison() throws JsonProcessingException } @Test - public void ftComplexCrudHashStringComparison() throws JsonProcessingException { + public void ftComplexCrudHashStringComparison() throws JacksonException { String fileContent = fromFileAsString("tests/FT-ComplexCRUD-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/DraftResponseToCaseDetailsBuilderTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/DraftResponseToCaseDetailsBuilderTest.java index 8d10e9477a..c6c3cd29bb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/DraftResponseToCaseDetailsBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/DraftResponseToCaseDetailsBuilderTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; import uk.gov.hmcts.ccd.domain.model.draft.DraftResponse; @@ -21,16 +21,16 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.DraftResponseBuilder.newDraftResponse; class DraftResponseToCaseDetailsBuilderTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String DRAFT_ID = "1"; private static final String FULL_DRAFT_ID = "DRAFT1"; private static final SecurityClassification SECURITY_CLASSIFICATION = SecurityClassification.PRIVATE; private static final String SECURITY_CLASSIFICATION_STRING = SECURITY_CLASSIFICATION.name(); private static final Map DATA = newCaseData() - .withPair("testDataKey", JSON_NODE_FACTORY.textNode("testDataValue")) + .withPair("testDataKey", JSON_NODE_FACTORY.stringNode("testDataValue")) .build(); private static final Map DATA_CLASSIFICATION = newCaseData() - .withPair("testClassificationKey", JSON_NODE_FACTORY.textNode("testClassificationValue")) + .withPair("testClassificationKey", JSON_NODE_FACTORY.stringNode("testClassificationValue")) .build(); private static final String TOKEN = "testToken"; private static final String EVENT_ID = "EVENT_ID"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/JurisdictionDefinitionTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/JurisdictionDefinitionTest.java index b147ff4ac2..b8ee325a8b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/JurisdictionDefinitionTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/JurisdictionDefinitionTest.java @@ -1,14 +1,11 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -22,16 +19,15 @@ class JurisdictionDefinitionTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); } @Test - public void autoTest1JurisdictionCompareActualAndClone() throws JsonProcessingException { + public void autoTest1JurisdictionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/AUTOTEST1-jurisdiction-payload.json"); JurisdictionDefinition jurisdictionDefinition = objectMapper @@ -51,7 +47,7 @@ public void autoTest1JurisdictionCompareActualAndClone() throws JsonProcessingEx } @Test - public void beftaMasterJurisdictionCompareActualAndClone() throws JsonProcessingException { + public void beftaMasterJurisdictionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/BEFTA_MASTER-jurisdiction-payload.json"); JurisdictionDefinition jurisdictionDefinition = objectMapper @@ -71,7 +67,7 @@ public void beftaMasterJurisdictionCompareActualAndClone() throws JsonProcessing } @Test - public void beftaJurisdiction3JurisdictionCompareActualAndClone() throws JsonProcessingException { + public void beftaJurisdiction3JurisdictionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/BEFTA_JURISDICTION_3-jurisdiction-payload.json"); JurisdictionDefinition jurisdictionDefinition = objectMapper diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/RoleToAccessProfileDefinitionTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/RoleToAccessProfileDefinitionTest.java index bee591162b..c7eb8adaa1 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/RoleToAccessProfileDefinitionTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/RoleToAccessProfileDefinitionTest.java @@ -1,14 +1,11 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,16 +24,15 @@ class RoleToAccessProfileDefinitionTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); } @Test - public void ftMasterCaseTypeRoleToAccessProfileDefinitionCompareActualAndClone() throws JsonProcessingException { + public void ftMasterCaseTypeRoleToAccessProfileDefinitionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/FT-MasterCaseType-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); @@ -63,7 +59,7 @@ public void ftMasterCaseTypeRoleToAccessProfileDefinitionCompareActualAndClone() } @Test - public void ftComplexCrudRoleToAccessProfileDefinitionCompareActualAndClone() throws JsonProcessingException { + public void ftComplexCrudRoleToAccessProfileDefinitionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/FT-ComplexCRUD-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); @@ -90,7 +86,7 @@ public void ftComplexCrudRoleToAccessProfileDefinitionCompareActualAndClone() th } @Test - public void beftaCaseType31RoleToAccessProfileDefinitionCompareActualAndClone() throws JsonProcessingException { + public void beftaCaseType31RoleToAccessProfileDefinitionCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/BEFTA-CASETYPE-3-1-payload.json"); CaseTypeDefinition caseTypeDefinition = objectMapper.readValue(fileContent, CaseTypeDefinition.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/SearchResultDefinitionTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/SearchResultDefinitionTest.java index b0ce41ad51..36fec3551c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/SearchResultDefinitionTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/SearchResultDefinitionTest.java @@ -1,14 +1,11 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.apache.commons.codec.digest.DigestUtils; import org.hamcrest.CoreMatchers; import org.junit.jupiter.api.BeforeEach; @@ -44,16 +41,15 @@ public class SearchResultDefinitionTest { public void setUp() { searchResultDefinition = new SearchResultDefinition(); - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); } @Test - public void workBasket_1CompareActualAndClone() throws JsonProcessingException { + public void workBasket_1CompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/Data-workbasket-1.json"); SearchResultDefinition searchResultDefinition = objectMapper @@ -72,7 +68,7 @@ public void workBasket_1CompareActualAndClone() throws JsonProcessingException { } @Test - public void workBasket_2CompareActualAndClone() throws JsonProcessingException { + public void workBasket_2CompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/Data-workbasket-2.json"); SearchResultDefinition searchResultDefinition = objectMapper @@ -91,7 +87,7 @@ public void workBasket_2CompareActualAndClone() throws JsonProcessingException { } @Test - public void workBasketEmptyAndNullFieldInListCompareActualAndClone() throws JsonProcessingException { + public void workBasketEmptyAndNullFieldInListCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/Data-workbasket-3.json"); SearchResultDefinition searchResultDefinition = objectMapper @@ -114,7 +110,7 @@ public void workBasketEmptyAndNullFieldInListCompareActualAndClone() throws Json } @Test - public void workBasketEmptyFieldsListInListCompareActualAndClone() throws JsonProcessingException { + public void workBasketEmptyFieldsListInListCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/Data-workbasket-4.json"); SearchResultDefinition searchResultDefinition = objectMapper diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/WizardPageTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/WizardPageTest.java index 07bd56b294..4cac2c65f4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/WizardPageTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/definition/WizardPageTest.java @@ -1,14 +1,11 @@ package uk.gov.hmcts.ccd.domain.model.definition; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.apache.commons.codec.digest.DigestUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -25,16 +22,15 @@ class WizardPageTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); } @Test - public void ftMasterCaseTypeEventCreateCaseCompareActualAndClone() throws JsonProcessingException { + public void ftMasterCaseTypeEventCreateCaseCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/FT-MasterCaseType-event-createCase-payload.json"); WizardPageCollection wizardPageCollection = objectMapper.readValue(fileContent, WizardPageCollection.class); @@ -54,7 +50,7 @@ public void ftMasterCaseTypeEventCreateCaseCompareActualAndClone() throws JsonPr } @Test - public void ftComplexCollectionComplexEventcreateSchoolCompareActualAndClone() throws JsonProcessingException { + public void ftComplexCollectionComplexEventcreateSchoolCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/FT-ComplexCollectionComplex-event-createSchool-payload.json"); WizardPageCollection wizardPageCollection = objectMapper.readValue(fileContent, WizardPageCollection.class); @@ -74,7 +70,7 @@ public void ftComplexCollectionComplexEventcreateSchoolCompareActualAndClone() t } @Test - public void ftConditionalsEventcreateSchoolCompareActualAndClone() throws JsonProcessingException { + public void ftConditionalsEventcreateSchoolCompareActualAndClone() throws JacksonException { String fileContent = fromFileAsString("tests/FT-Conditionals-event-createCase-payload.json"); WizardPageCollection wizardPageCollection = objectMapper.readValue(fileContent, WizardPageCollection.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseActionPostRequestTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseActionPostRequestTest.java index 1f54486aaf..b7bbb60d88 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseActionPostRequestTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseActionPostRequestTest.java @@ -2,9 +2,10 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -36,7 +37,7 @@ class CaseActionPostRequestTest { private ZonedDateTime currentZonedDateTime; @Test - void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { + void jsonContructionTestWithMultipleCaseRefs() throws JacksonException { caseActionPostRequest = new CaseActionPostRequest(new ActionLog( ACTION_LOG_USER_ID, ACTION_LOG_CASE_ACTION, @@ -45,8 +46,10 @@ void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { ACTION_LOG_CASE_TYPE_ID, ACTION_LOG_TIMESTAMP)); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .changeDefaultVisibility(visibility -> + visibility.withVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)) + .build(); String jsonRequest = objectMapper .writerWithDefaultPrettyPrinter() @@ -55,12 +58,12 @@ void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { Map value = JacksonUtils.convertValue(objectMapper.readTree(jsonRequest)); assertNotNull(value); - assertEquals(ACTION_LOG_USER_ID, value.get("actionLog").get("userId").asText()); - assertEquals(ACTION_LOG_CASE_REF, value.get("actionLog").get("caseRef").asText()); - assertEquals(ACTION_LOG_CASE_ACTION, value.get("actionLog").get("caseAction").asText()); - assertEquals(ACTION_LOG_CASE_TYPE_ID, value.get("actionLog").get("caseTypeId").asText()); - assertEquals(ACTION_LOG_CASE_JURISDICTION_ID, value.get("actionLog").get("caseJurisdictionId").asText()); - assertEquals(ACTION_LOG_TIMESTAMP_AS_TEXT, value.get("actionLog").get("timestamp").asText()); + assertEquals(ACTION_LOG_USER_ID, value.get("actionLog").get("userId").asString()); + assertEquals(ACTION_LOG_CASE_REF, value.get("actionLog").get("caseRef").asString()); + assertEquals(ACTION_LOG_CASE_ACTION, value.get("actionLog").get("caseAction").asString()); + assertEquals(ACTION_LOG_CASE_TYPE_ID, value.get("actionLog").get("caseTypeId").asString()); + assertEquals(ACTION_LOG_CASE_JURISDICTION_ID, value.get("actionLog").get("caseJurisdictionId").asString()); + assertEquals(ACTION_LOG_TIMESTAMP_AS_TEXT, value.get("actionLog").get("timestamp").asString()); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseSearchPostRequestTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseSearchPostRequestTest.java index 60eab02bc3..c83f856a9f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseSearchPostRequestTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/lau/CaseSearchPostRequestTest.java @@ -2,9 +2,10 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -32,7 +33,7 @@ class CaseSearchPostRequestTest { private ZonedDateTime currentZonedDateTime; @Test - void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { + void jsonContructionTestWithMultipleCaseRefs() throws JacksonException { final SearchLog searchLog = new SearchLog(); searchLog.setUserId(SEARCH_LOG_USER_ID); @@ -40,8 +41,10 @@ void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { searchLog.setTimestamp(SEARCH_LOG_TIMESTAMP); caseSearchPostRequest = new CaseSearchPostRequest(searchLog); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .changeDefaultVisibility(visibility -> + visibility.withVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)) + .build(); String jsonRequest = objectMapper .writerWithDefaultPrettyPrinter() @@ -50,22 +53,24 @@ void jsonContructionTestWithMultipleCaseRefs() throws JsonProcessingException { Map value = JacksonUtils.convertValue(objectMapper.readTree(jsonRequest)); assertNotNull(value); - assertEquals(SEARCH_LOG_USER_ID, value.get("searchLog").get("userId").asText()); - assertEquals("100001", value.get("searchLog").get("caseRefs").get(0).asText()); - assertEquals("100002", value.get("searchLog").get("caseRefs").get(1).asText()); - assertEquals(SEARCH_LOG_TIMESTAMP_AS_TEXT, value.get("searchLog").get("timestamp").asText()); + assertEquals(SEARCH_LOG_USER_ID, value.get("searchLog").get("userId").asString()); + assertEquals("100001", value.get("searchLog").get("caseRefs").get(0).asString()); + assertEquals("100002", value.get("searchLog").get("caseRefs").get(1).asString()); + assertEquals(SEARCH_LOG_TIMESTAMP_AS_TEXT, value.get("searchLog").get("timestamp").asString()); } @Test - void jsonContructionTestWithEmptyCaseRefs() throws JsonProcessingException { + void jsonContructionTestWithEmptyCaseRefs() throws JacksonException { final SearchLog searchLog = new SearchLog(); searchLog.setUserId(SEARCH_LOG_USER_ID); searchLog.setCaseRefs(null); searchLog.setTimestamp(SEARCH_LOG_TIMESTAMP); caseSearchPostRequest = new CaseSearchPostRequest(searchLog); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .changeDefaultVisibility(visibility -> + visibility.withVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)) + .build(); String jsonRequest = objectMapper .writerWithDefaultPrettyPrinter() @@ -74,8 +79,8 @@ void jsonContructionTestWithEmptyCaseRefs() throws JsonProcessingException { Map value = JacksonUtils.convertValue(objectMapper.readTree(jsonRequest)); assertNotNull(value); - assertEquals(SEARCH_LOG_USER_ID, value.get("searchLog").get("userId").asText()); + assertEquals(SEARCH_LOG_USER_ID, value.get("searchLog").get("userId").asString()); assertEquals(0, value.get("searchLog").get("caseRefs").size()); - assertEquals(SEARCH_LOG_TIMESTAMP_AS_TEXT, value.get("searchLog").get("timestamp").asText()); + assertEquals(SEARCH_LOG_TIMESTAMP_AS_TEXT, value.get("searchLog").get("timestamp").asString()); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequestTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequestTest.java index 044dbf1b0a..7ef221bb1c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequestTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/search/elasticsearch/ElasticsearchRequestTest.java @@ -1,10 +1,11 @@ package uk.gov.hmcts.ccd.domain.model.search.elasticsearch; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -31,10 +32,10 @@ class ElasticsearchRequestTest { - private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @Test - void hasSourceFieldsShouldReturnFalseWhenSourceIsMissing() throws JsonProcessingException { + void hasSourceFieldsShouldReturnFalseWhenSourceIsMissing() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -43,7 +44,7 @@ void hasSourceFieldsShouldReturnFalseWhenSourceIsMissing() throws JsonProcessing } @Test - void hasSourceFieldsShouldReturnTrueWhenSourceIsProvided() throws JsonProcessingException { + void hasSourceFieldsShouldReturnTrueWhenSourceIsProvided() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[\"data.Field\"],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -52,7 +53,7 @@ void hasSourceFieldsShouldReturnTrueWhenSourceIsProvided() throws JsonProcessing } @Test - void hasSourceFieldsShouldReturnFalseWhenSourceIsEmpty() throws JsonProcessingException { + void hasSourceFieldsShouldReturnFalseWhenSourceIsEmpty() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -61,7 +62,7 @@ void hasSourceFieldsShouldReturnFalseWhenSourceIsEmpty() throws JsonProcessingEx } @Test - void hasSourceFieldsShouldReturnFalseWhenSourceOnlyHasWildcard() throws JsonProcessingException { + void hasSourceFieldsShouldReturnFalseWhenSourceOnlyHasWildcard() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[\"*\"],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -70,7 +71,7 @@ void hasSourceFieldsShouldReturnFalseWhenSourceOnlyHasWildcard() throws JsonProc } @Test - void hasSourceFieldsShouldReturnFalseWhenSourceIsFalse() throws JsonProcessingException { + void hasSourceFieldsShouldReturnFalseWhenSourceIsFalse() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\": false,\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -79,7 +80,7 @@ void hasSourceFieldsShouldReturnFalseWhenSourceIsFalse() throws JsonProcessingEx } @Test - void hasSourceFieldsShouldReturnFalseWhenSourceIsTrue() throws JsonProcessingException { + void hasSourceFieldsShouldReturnFalseWhenSourceIsTrue() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\": true,\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -88,7 +89,7 @@ void hasSourceFieldsShouldReturnFalseWhenSourceIsTrue() throws JsonProcessingExc } @Test - void shouldReturnRequestedFieldsAsCaseFieldIds() throws JsonProcessingException { + void shouldReturnRequestedFieldsAsCaseFieldIds() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[\"data.CaseDataField\",\"reference\",\"state\"," + "\"data.OtherCaseDataField\"],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = @@ -106,7 +107,7 @@ void shouldReturnRequestedFieldsAsCaseFieldIds() throws JsonProcessingException } @Test - void shouldOnlyReturnRequestedMetadataFieldsThatExist() throws JsonProcessingException { + void shouldOnlyReturnRequestedMetadataFieldsThatExist() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[\"reference\",\"INVALID\"],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = @@ -121,7 +122,7 @@ void shouldOnlyReturnRequestedMetadataFieldsThatExist() throws JsonProcessingExc } @Test - void shouldReturnNoRequestedFieldsWhenOnlyWildcardIsRequested() throws JsonProcessingException { + void shouldReturnNoRequestedFieldsWhenOnlyWildcardIsRequested() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"_source\":[\"*\"],\"query\":{\"match_all\": {}}}"); uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest elasticsearchRequest = new uk.gov.hmcts.ccd.domain.model.search.elasticsearch.ElasticsearchRequest(queryNode); @@ -132,7 +133,7 @@ void shouldReturnNoRequestedFieldsWhenOnlyWildcardIsRequested() throws JsonProce } @Test - void shouldHandleWrappedQueryFormatWithSupplementaryData() throws JsonProcessingException { + void shouldHandleWrappedQueryFormatWithSupplementaryData() throws JacksonException { JsonNode queryNode = queryAsJsonNode("{\"native_es_query\":{\"_source\":[\"data.CaseDataField\"," + "\"reference\",\"state\",\"data.OtherCaseDataField\"],\"query\":{\"match_all\": {}}}," + "\"supplementary_data\":[\"SupDataField\"]}"); @@ -187,8 +188,7 @@ void shouldSetSupplementaryData() throws Exception { void shouldSetMetadataFieldsArrayNode() throws Exception { ArrayNode result = ElasticsearchRequest.METADATA_FIELDS; - List resultAsList = - new ObjectMapper().readValue(result.traverse(), new TypeReference>(){}); + List resultAsList = mapper.convertValue(result, new TypeReference>() {}); assertAll( () -> assertThat(result.size(), is(9)), () -> assertThat(resultAsList, hasItem(CASE_REFERENCE.getDbColumnName())), @@ -216,7 +216,7 @@ void shouldSetSourceFieldsWhenSourceIsProvidedInRequest() throws Exception { JsonNode jsonResult = mapper.readTree(result); JsonNode sourceNode = jsonResult.get("_source"); List sourceFields = - new ObjectMapper().readValue(sourceNode.traverse(), new TypeReference>(){}); + mapper.convertValue(sourceNode, new TypeReference>() {}); assertAll( () -> assertThat(sourceFields.size(), is(10)), @@ -243,7 +243,7 @@ void shouldSetSourceFieldsWhenSourceIsNotProvidedInRequest() throws Exception { JsonNode jsonResult = mapper.readTree(result); JsonNode sourceNode = jsonResult.get("_source"); List sourceFields = - new ObjectMapper().readValue(sourceNode.traverse(), new TypeReference>(){}); + mapper.convertValue(sourceNode, new TypeReference>() {}); assertAll( () -> assertThat(sourceFields.size(), is(10)), @@ -271,7 +271,7 @@ void shouldSetSourceFieldsWhenSupplementaryDataIsProvidedInRequest() throws Exce JsonNode jsonResult = mapper.readTree(result); JsonNode sourceNode = jsonResult.get("_source"); List sourceFields = - new ObjectMapper().readValue(sourceNode.traverse(), new TypeReference>(){}); + mapper.convertValue(sourceNode, new TypeReference>() {}); assertAll( () -> assertThat(sourceFields.size(), is(12)), @@ -291,7 +291,7 @@ void shouldSetSourceFieldsWhenSupplementaryDataIsProvidedInRequest() throws Exce } } - private JsonNode queryAsJsonNode(String query) throws JsonProcessingException { + private JsonNode queryAsJsonNode(String query) throws JacksonException { return mapper.readTree(query); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryDataTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryDataTest.java index 80bc03578d..9abfd8d5be 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryDataTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/model/std/SupplementaryDataTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.model.std; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import java.util.Collections; import java.util.Map; import org.junit.jupiter.api.Test; @@ -19,8 +20,8 @@ class SupplementaryDataTest { private static final String INVALID_KEY = "orgs_assigned_users.test"; @Test - void testConstruction() throws JsonProcessingException { - ObjectMapper mapper = new ObjectMapper(); + void testConstruction() throws JacksonException { + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); String jsonRequest = "{\n" + "\t\"$set\": {\n" + "\t\t\"orgs_assigned_users\": {\n" @@ -40,8 +41,8 @@ void testConstruction() throws JsonProcessingException { } @Test - void testConstructionFailure() throws JsonProcessingException { - ObjectMapper mapper = new ObjectMapper(); + void testConstructionFailure() throws JacksonException { + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); String jsonRequest = "{\n" + "\t\"$inc\": {\n" + "\t\t\"orgs_assigned_users\": {\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/BaseFilter.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/BaseFilter.java index e55ee35dab..fa8cb3c7d5 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/BaseFilter.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/BaseFilter.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.accessprofile.filter; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import java.time.Instant; import java.time.temporal.ChronoUnit; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/RoleAssignmentsFilteringServiceImplTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/RoleAssignmentsFilteringServiceImplTest.java index d365f45e63..13f63f6bf6 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/RoleAssignmentsFilteringServiceImplTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/accessprofile/filter/RoleAssignmentsFilteringServiceImplTest.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.accessprofile.filter; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.google.common.collect.Lists; import java.time.Instant; import java.time.temporal.ChronoUnit; @@ -56,7 +57,7 @@ class RoleAssignmentsFilteringServiceImplTest extends BaseFilter { @Mock private CaseDataService caseDataService; - private ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); @BeforeEach void setUp() { @@ -315,7 +316,7 @@ private JsonNode getCaseAccessGroups() { .id(uuid).build(); caseAccessGroupForUIs.add(caseAccessGroupForUI); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); return data; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetEventTriggerOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetEventTriggerOperationTest.java index 9067f9836f..ef78b2ed1d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetEventTriggerOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/AuthorisedGetEventTriggerOperationTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.google.common.collect.Sets; import org.assertj.core.util.Lists; import org.junit.jupiter.api.BeforeEach; @@ -289,7 +290,7 @@ void shouldFailIfNoCreateAccessOnCaseEvent() { @Test @DisplayName("should return Case Access metadata") - void shouldReturnCaseAccessMetadata() throws JsonProcessingException { + void shouldReturnCaseAccessMetadata() throws JacksonException { CaseAccessMetadata caseAccessMetadata = new CaseAccessMetadata(); caseAccessMetadata.setAccessProcess(AccessProcess.NONE); caseAccessMetadata.setAccessGrants(List.of(GrantType.STANDARD)); @@ -307,8 +308,8 @@ void shouldReturnCaseAccessMetadata() throws JsonProcessingException { } private boolean isCaseAccessMetadataPresentInJson(CaseUpdateViewEvent caseUpdateViewEvent) - throws JsonProcessingException { - ObjectMapper objMapper = new ObjectMapper(); + throws JacksonException { + ObjectMapper objMapper = JsonMapper.builderWithJackson2Defaults().build(); String jsonString = objMapper.writeValueAsString(caseUpdateViewEvent); return jsonString.contains("access_granted") || jsonString.contains("access_process"); } @@ -405,7 +406,7 @@ void shouldReturnEventTriggerAndPerformOperationsInOrder() { @Test @DisplayName("should return Case Access metadata") - void shouldReturnCaseAccessMetadata() throws JsonProcessingException { + void shouldReturnCaseAccessMetadata() throws JacksonException { CaseAccessMetadata caseAccessMetadata = new CaseAccessMetadata(); caseAccessMetadata.setAccessGrants(List.of(GrantType.STANDARD, GrantType.SPECIFIC, GrantType.CHALLENGED)); caseAccessMetadata.setAccessProcess(AccessProcess.NONE); @@ -423,7 +424,7 @@ void shouldReturnCaseAccessMetadata() throws JsonProcessingException { @Test @DisplayName("should not set CaseUpdateViewEvent json fields if there is no Case Access metadata") - void shouldNotSetCaseAccessMetadataJson() throws JsonProcessingException { + void shouldNotSetCaseAccessMetadataJson() throws JacksonException { final CaseUpdateViewEvent output = authorisedGetEventTriggerOperation.executeForCase(CASE_REFERENCE, EVENT_TRIGGER_ID, IGNORE); @@ -434,8 +435,8 @@ void shouldNotSetCaseAccessMetadataJson() throws JsonProcessingException { } private boolean isCaseAccessMetadataPresentInJson(CaseUpdateViewEvent caseUpdateViewEvent) - throws JsonProcessingException { - ObjectMapper objMapper = new ObjectMapper(); + throws JacksonException { + ObjectMapper objMapper = JsonMapper.builderWithJackson2Defaults().build(); String jsonString = objMapper.writeValueAsString(caseUpdateViewEvent); return jsonString.contains("access_granted") || jsonString.contains("access_process"); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseDetailsUtil.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseDetailsUtil.java index 6113513198..bffa44cc92 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseDetailsUtil.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseDetailsUtil.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import uk.gov.hmcts.ccd.data.casedetails.SecurityClassification; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; @@ -10,7 +10,7 @@ public class CaseDetailsUtil extends CaseDetails { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); public static class CaseDetailsBuilder { private final CaseDetails caseDetails; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchResultViewGeneratorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchResultViewGeneratorTest.java index 0b8f4db29c..e987309d7c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchResultViewGeneratorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchResultViewGeneratorTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.io.IOException; @@ -157,7 +157,8 @@ void setUp() throws IOException { dataMap = buildData(CASE_FIELD_1, CASE_FIELD_2, CASE_FIELD_3, CASE_FIELD_4, CASE_FIELD_5); supplementaryDataMap = buildData(SUPPLEMENTARY_DATA_FIELD_1, SUPPLEMENTARY_DATA_FIELD_2); - ObjectNode familyDetails = (ObjectNode) new ObjectMapper().readTree(FAMILY_DETAILS_VALUE); + ObjectNode familyDetails = (ObjectNode) JsonMapper.builderWithJackson2Defaults() + .build().readTree(FAMILY_DETAILS_VALUE); dataMap.put(FAMILY_DETAILS, familyDetails); when(caseDataAccessControl.generateAccessProfilesByCaseTypeId(anyString())) @@ -387,10 +388,10 @@ void shouldBuildCaseSearchResultCases() { is(LAST_MODIFIED_DATE)), () -> assertThat(caseSearchResultView.getCases().get(0).getSupplementaryData().size(), is(2)), () -> assertThat(caseSearchResultView.getCases().get(0).getSupplementaryData() - .get(SUPPLEMENTARY_DATA_FIELD_1).asText(), + .get(SUPPLEMENTARY_DATA_FIELD_1).asString(), is(SUPPLEMENTARY_DATA_FIELD_1)), () -> assertThat(caseSearchResultView.getCases().get(0).getSupplementaryData() - .get(SUPPLEMENTARY_DATA_FIELD_2).asText(), + .get(SUPPLEMENTARY_DATA_FIELD_2).asString(), is(SUPPLEMENTARY_DATA_FIELD_2)), () -> assertThat(caseSearchResultView.getCases().get(1).getSupplementaryData(), is(nullValue())), () -> assertThat(caseSearchResultView.getCases().get(2).getSupplementaryData(), is(nullValue())) @@ -620,10 +621,10 @@ void shouldBuildResultsWithComplexNestedElements() { FAMILY + SEPARATOR + FATHER_NAME, FAMILY_DETAILS, TEXT_TYPE), () -> assertHeaderField(caseSearchResultView.getHeaders().get(0).getFields().get(1), FAMILY + SEPARATOR + FAMILY_DETAILS_PATH_NESTED, FAMILY_DETAILS, TEXT_TYPE), - () -> assertThat(((TextNode) caseSearchResultView.getCases().get(0).getFields() - .get(FAMILY + SEPARATOR + FATHER_NAME)).asText(), is(FATHER_NAME_VALUE)), - () -> assertThat(((TextNode) caseSearchResultView.getCases().get(0).getFields() - .get(FAMILY + SEPARATOR + FAMILY_DETAILS_PATH_NESTED)).asText(), is(POSTCODE_VALUE)) + () -> assertThat(((StringNode) caseSearchResultView.getCases().get(0).getFields() + .get(FAMILY + SEPARATOR + FATHER_NAME)).asString(), is(FATHER_NAME_VALUE)), + () -> assertThat(((StringNode) caseSearchResultView.getCases().get(0).getFields() + .get(FAMILY + SEPARATOR + FAMILY_DETAILS_PATH_NESTED)).asString(), is(POSTCODE_VALUE)) ); } @@ -660,10 +661,10 @@ void shouldBuildResultsWithCaseAccessMetadataWhenEnabled() { Collections.emptyList()); assertAll( - () -> assertThat(((TextNode) caseSearchResultView.getCases().get(0).getFields() - .get(CaseAccessMetadata.ACCESS_PROCESS)).asText(), is(AccessProcess.CHALLENGED.name())), - () -> assertThat(((TextNode) caseSearchResultView.getCases().get(0).getFields() - .get(CaseAccessMetadata.ACCESS_GRANTED)).asText(), + () -> assertThat(((StringNode) caseSearchResultView.getCases().get(0).getFields() + .get(CaseAccessMetadata.ACCESS_PROCESS)).asString(), is(AccessProcess.CHALLENGED.name())), + () -> assertThat(((StringNode) caseSearchResultView.getCases().get(0).getFields() + .get(CaseAccessMetadata.ACCESS_GRANTED)).asString(), is(GrantType.BASIC.name() + "," + GrantType.SPECIFIC.name())) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchesViewAccessControlTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchesViewAccessControlTest.java index 8a666b7398..6f52492c54 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchesViewAccessControlTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseSearchesViewAccessControlTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Sets; import java.io.IOException; import java.time.LocalDateTime; @@ -119,7 +119,8 @@ void setUp() throws IOException { MockitoAnnotations.openMocks(this); dataMap = buildData(CASE_FIELD_1, CASE_FIELD_2, CASE_FIELD_3, CASE_FIELD_4, CASE_FIELD_5); - ObjectNode familyDetails = (ObjectNode) new ObjectMapper().readTree(FAMILY_DETAILS_VALUE); + ObjectNode familyDetails = (ObjectNode) JsonMapper.builderWithJackson2Defaults() + .build().readTree(FAMILY_DETAILS_VALUE); dataMap.put(FAMILY_DETAILS, familyDetails); jurisdiction = new JurisdictionDefinition(); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseUpdateViewEventBuilderTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseUpdateViewEventBuilderTest.java index 4b15d30b64..a273cf5adf 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseUpdateViewEventBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/CaseUpdateViewEventBuilderTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.List; import java.util.Map; import org.assertj.core.util.Lists; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseHistoryViewOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseHistoryViewOperationTest.java index 90b26f2deb..26f14c4dea 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseHistoryViewOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseHistoryViewOperationTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,7 +44,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.CaseTabCollectionBuilder.newCaseTabCollection; class DefaultGetCaseHistoryViewOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String JURISDICTION_ID = "Probate"; private static final String CASE_TYPE_ID = "Grant"; private static final String CASE_REFERENCE = "1111222233334444"; @@ -167,7 +167,7 @@ void shouldThrowExceptionWhenNoEventFound() { private Map buildData(String... dataFieldIds) { Map dataMap = new HashMap<>(); asList(dataFieldIds).forEach(dataFieldId -> { - dataMap.put(dataFieldId, JSON_NODE_FACTORY.textNode(dataFieldId)); + dataMap.put(dataFieldId, JSON_NODE_FACTORY.stringNode(dataFieldId)); }); return dataMap; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewFromDraftOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewFromDraftOperationTest.java index 8ba14d78da..b8c0b50e36 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewFromDraftOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewFromDraftOperationTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import java.time.LocalDateTime; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -55,7 +55,7 @@ class DefaultGetCaseViewFromDraftOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String JURISDICTION_ID = "Probate"; private static final String CASE_TYPE_ID = "Grant"; private static final String DRAFT_ID_FORMAT = "DRAFT%s"; @@ -107,8 +107,8 @@ public void setup() { LocalDateTime now = LocalDateTime.now(); LocalDateTime then = LocalDateTime.now(); data = newCaseData() - .withPair("dataTestField1", JSON_NODE_FACTORY.textNode("dataTestField1")) - .withPair("dataTestField2", JSON_NODE_FACTORY.textNode("dataTestField2")) + .withPair("dataTestField1", JSON_NODE_FACTORY.stringNode("dataTestField1")) + .withPair("dataTestField2", JSON_NODE_FACTORY.stringNode("dataTestField2")) .build(); draftResponse = newDraftResponse() .withId(DRAFT_ID) diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewOperationTest.java index 6d24616e6e..dfb86b5685 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/DefaultGetCaseViewOperationTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -68,7 +68,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.FieldTypeBuilder.aFieldType; class DefaultGetCaseViewOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String JURISDICTION_ID = "Probate"; private static final String CASE_TYPE_ID = "Grant"; private static final String CASE_REFERENCE = "1111222233334444"; @@ -385,7 +385,7 @@ private CaseViewField caseViewField() { private Map buildData(String... dataFieldIds) { Map dataMap = new HashMap<>(); asList(dataFieldIds).forEach(dataFieldId -> { - dataMap.put(dataFieldId, JSON_NODE_FACTORY.textNode(dataFieldId)); + dataMap.put(dataFieldId, JSON_NODE_FACTORY.stringNode(dataFieldId)); }); return dataMap; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperationTest.java index 4d3572e632..3d66a6ed5f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/MergeDataToSearchResultOperationTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -108,7 +108,8 @@ void setUp() throws IOException { MockitoAnnotations.openMocks(this); Map dataMap = buildData(CASE_FIELD_1, CASE_FIELD_2, CASE_FIELD_3, CASE_FIELD_4); - ObjectNode familyDetails = (ObjectNode) new ObjectMapper().readTree(FAMILY_DETAILS_VALUE); + ObjectNode familyDetails = (ObjectNode) JsonMapper.builderWithJackson2Defaults() + .build().readTree(FAMILY_DETAILS_VALUE); dataMap.put(FAMILY_DETAILS, familyDetails); CaseDetails caseDetails1 = new CaseDetails(); @@ -377,12 +378,12 @@ void getWorkbasketViewAndLabels() { assertAll( () -> assertThat(searchResultView.getSearchResultViewItems().size(), is(2)), () -> assertThat(searchResultView.getSearchResultViewColumns().size(), is(2)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(0) + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(0) .getFields() - .get(LABEL_ID)).asText(), is(LABEL_TEXT)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(1) + .get(LABEL_ID)).asString(), is(LABEL_TEXT)), + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(1) .getFields() - .get(LABEL_ID)).asText(), is(LABEL_TEXT))); + .get(LABEL_ID)).asString(), is(LABEL_TEXT))); } @Test @@ -441,10 +442,10 @@ void getSearchViewAndLabels() { assertAll( () -> assertThat(searchResultView.getSearchResultViewItems().size(), is(2)), () -> assertThat(searchResultView.getSearchResultViewColumns().size(), is(1)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(0).getFields() - .get(LABEL_ID)).asText(), is(LABEL_TEXT)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(1).getFields() - .get(LABEL_ID)).asText(), is(LABEL_TEXT))) + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(0).getFields() + .get(LABEL_ID)).asString(), is(LABEL_TEXT)), + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(1).getFields() + .get(LABEL_ID)).asString(), is(LABEL_TEXT))) ; } @@ -465,10 +466,10 @@ void getSearchViewWhenCaseFieldPathDefined() { assertAll( () -> assertThat(searchResultView.getSearchResultViewItems().size(), is(2)), () -> assertThat(searchResultView.getSearchResultViewColumns().size(), is(1)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(0).getFields() - .get("FamilyDetails.FatherName")).asText(), is(FATHER_NAME_VALUE)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(1).getFields() - .get("FamilyDetails.FatherName")).asText(), is(FATHER_NAME_VALUE))) + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(0).getFields() + .get("FamilyDetails.FatherName")).asString(), is(FATHER_NAME_VALUE)), + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(1).getFields() + .get("FamilyDetails.FatherName")).asString(), is(FATHER_NAME_VALUE))) ; } @@ -491,10 +492,10 @@ void getSearchViewWhenCaseFieldPathDefinedWithNestingLevelOfTwo() { () -> assertThat(searchResultView.getSearchResultViewItems().size(), is(2)), () -> assertThat(searchResultView.getSearchResultViewColumns().size(), is(1)), () -> assertThat(searchResultView.getSearchResultViewItems().get(0).getCaseId(), is("999")), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(0).getFields() - .get("FamilyDetails.FamilyAddress.PostCode")).asText(), is(POSTCODE_VALUE)), - () -> assertThat(((TextNode)searchResultView.getSearchResultViewItems().get(1).getFields() - .get("FamilyDetails.FamilyAddress.PostCode")).asText(), is(POSTCODE_VALUE))) + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(0).getFields() + .get("FamilyDetails.FamilyAddress.PostCode")).asString(), is(POSTCODE_VALUE)), + () -> assertThat(((StringNode)searchResultView.getSearchResultViewItems().get(1).getFields() + .get("FamilyDetails.FamilyAddress.PostCode")).asString(), is(POSTCODE_VALUE))) ; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/SearchResultUtil.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/SearchResultUtil.java index cb502b6424..0d097d102c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/SearchResultUtil.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/aggregated/SearchResultUtil.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.aggregated; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import uk.gov.hmcts.ccd.domain.model.definition.SearchResultField; @@ -16,7 +16,7 @@ private SearchResultUtil() { // (squid:S1118) } - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); public static class SearchResultBuilder { private final SearchResultDefinition searchResult; @@ -60,7 +60,7 @@ public static SearchResultField buildSearchResultField(String caseTypedId, static Map buildData(String... dataFieldIds) { Map dataMap = Maps.newHashMap(); Lists.newArrayList(dataFieldIds).forEach(dataFieldId -> { - dataMap.put(dataFieldId, JSON_NODE_FACTORY.textNode(dataFieldId)); + dataMap.put(dataFieldId, JSON_NODE_FACTORY.stringNode(dataFieldId)); }); return dataMap; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackInvokerWireMockTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackInvokerWireMockTest.java index a180dfedf5..9f5e92c73a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackInvokerWireMockTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackInvokerWireMockTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.callbacks; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceTest.java index 04d9c35ec8..3365f00d3f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceTest.java @@ -7,7 +7,7 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import org.assertj.core.api.Assertions; import org.json.JSONObject; @@ -295,11 +295,11 @@ void shouldAddCallbackPassthruHeadersFromRequestHeader() throws Exception { callbackService.addPassThroughHeaders(httpHeaders); assertEquals(2, httpHeaders.size()); - assertTrue(httpHeaders.containsKey(customHeaders.get(0))); + assertTrue(httpHeaders.containsHeader(customHeaders.get(0))); assertEquals(customHeaderValues.get(0), httpHeaders.get(customHeaders.get(0)).get(0)); - assertTrue(httpHeaders.containsKey(customHeaders.get(1))); + assertTrue(httpHeaders.containsHeader(customHeaders.get(1))); assertEquals(customHeaderValues.get(1), httpHeaders.get(customHeaders.get(1)).get(0)); - assertFalse(httpHeaders.containsKey(customHeaders.get(2))); + assertFalse(httpHeaders.containsHeader(customHeaders.get(2))); } @Test @@ -327,11 +327,11 @@ void shouldAddCallbackPassthruHeadersFromRequestAttribute() throws Exception { callbackService.addPassThroughHeaders(httpHeaders); assertEquals(2, httpHeaders.size()); - assertTrue(httpHeaders.containsKey(customHeaders.get(0))); + assertTrue(httpHeaders.containsHeader(customHeaders.get(0))); assertEquals(customHeaderValues.get(0), httpHeaders.get(customHeaders.get(0)).get(0)); - assertTrue(httpHeaders.containsKey(customHeaders.get(1))); + assertTrue(httpHeaders.containsHeader(customHeaders.get(1))); assertEquals(customHeaderValues.get(1), httpHeaders.get(customHeaders.get(1)).get(0)); - assertFalse(httpHeaders.containsKey(customHeaders.get(2))); + assertFalse(httpHeaders.containsHeader(customHeaders.get(2))); } @Test diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceWireMockTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceWireMockTest.java index 94a3230fba..fa077dc225 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceWireMockTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/callbacks/CallbackServiceWireMockTest.java @@ -19,9 +19,10 @@ import java.util.List; import java.util.Optional; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import jakarta.servlet.http.HttpServletRequest; import org.hamcrest.Matchers; import org.json.JSONObject; @@ -65,7 +66,7 @@ }) public class CallbackServiceWireMockTest extends WireMockBaseTest { private MockHttpServletRequest request; - private static final ObjectMapper mapper = new ObjectMapper(); + private static final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); public static final CallbackType TEST_CALLBACK_ABOUT_TO_START = CallbackType.ABOUT_TO_START; public static final CallbackType TEST_CALLBACK_ABOUT_TO_SUBMIT = CallbackType.ABOUT_TO_SUBMIT; public static final CallbackType TEST_CALLBACK_SUBMITTED = CallbackType.SUBMITTED; @@ -500,12 +501,12 @@ private void assertOnRequestAttribute(JSONObject jsonObject, String customContex try { jsonNode1 = mapper.readTree(jsonObject.toString()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } try { jsonNode2 = mapper.readTree(ClientContextUtil.decodeFromBase64(contextValue)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } assertEquals(jsonNode1, jsonNode2); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControlTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControlTest.java index 8f7b6831e8..a374a0bc10 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControlTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/casedataaccesscontrol/DefaultCaseDataAccessControlTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.casedataaccesscontrol; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import com.google.common.collect.Maps; import lombok.AllArgsConstructor; import lombok.Builder; @@ -308,7 +308,7 @@ void shouldGenerateAccessProfilesByCaseDetails() { } @Test - void shouldGenerateAccessProfilesByCaseAccessCategory_MatchCommaSeparatedLine() throws JsonProcessingException { + void shouldGenerateAccessProfilesByCaseAccessCategory_MatchCommaSeparatedLine() throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -348,7 +348,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_MatchCommaSeparatedLine() } @Test - void shouldGenerateAccessProfilesByCaseAccessCategory_NoCaseAccessCategoryMatch() throws JsonProcessingException { + void shouldGenerateAccessProfilesByCaseAccessCategory_NoCaseAccessCategoryMatch() throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -387,7 +387,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_NoCaseAccessCategoryMatch( @Test void shouldGenerateAccessProfilesByCaseAccessCategory_MatchOnlySingleLineCaseAccessCategory() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -428,7 +428,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_MatchOnlySingleLineCaseAcc @Test void shouldGenerateAccessProfilesByCaseAccessCategory_MatchTrimmedCaseAccessCategory() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -469,7 +469,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_MatchTrimmedCaseAccessCate @Test void shouldGenerateAccessProfilesByCaseAccessCategory_EmptyCaseAccessCategoryField() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -508,7 +508,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_EmptyCaseAccessCategoryFie @Test void shouldGenerateAccessProfilesByCaseAccessCategory_NullCaseAccessCategoryField() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -547,7 +547,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_NullCaseAccessCategoryFiel @Test void shouldGenerateAccessProfilesByCaseAccessCategory_StartWithNoMatch() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -586,7 +586,7 @@ void shouldGenerateAccessProfilesByCaseAccessCategory_StartWithNoMatch() @Test void shouldGenerateAccessProfilesByCaseAccessCategory_StartWithMatch() - throws JsonProcessingException { + throws JacksonException { doReturn(USER_ID).when(securityUtils).getUserId(); CaseDetails caseDetails = new CaseDetails(); caseDetails.setCaseTypeId(CASE_TYPE_1); @@ -1881,7 +1881,7 @@ private AccessProfileServiceCalls verifyAccessProfileServiceCalls() { private Map generateCaseData(final String value) - throws JsonProcessingException { + throws JacksonException { final String caseData = (value == null) ? "{}" : "{\n" + "\"CaseAccessCategory\": \"" + value + "\"\n" + " }"; return JacksonUtils.convertValue(mapper.readTree(caseData)); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveServiceTest.java index d927c5da3a..623cc36a62 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/casedeletion/TimeToLiveServiceTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.casedeletion; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -80,7 +80,7 @@ class TimeToLiveServiceTest { private CaseDataService caseDataService; @BeforeEach - void setUp() throws JsonProcessingException { + void setUp() throws JacksonException { caseData.put("key", objectMapper.readTree("{\"Value\": \"value\"}")); } @@ -178,7 +178,7 @@ class UpdateCaseDataClassificationWithTTL { private final JsonNode ttlDataClassification = objectMapper.valueToTree("{\"Ttl_Field\": \"PUBLIC\"}"); @BeforeEach - void setUp() throws JsonProcessingException { + void setUp() throws JacksonException { caseDataClassification.put("key", objectMapper.readTree("{\"Value\": \"PUBLIC\"}")); } @@ -473,7 +473,7 @@ void updateCaseDetailsWithTTL_ThrowsValidationExceptionWhenJsonParsingFails() th caseData.put(TTL.TTL_CASE_FIELD_ID, objectMapper.valueToTree(ttl)); caseEventDefinition.setTtlIncrement(TTL_INCREMENT); - doThrow(JsonProcessingException.class).when(objectMapper).readValue(ttlNodeAsString, TTL.class); + doThrow(JacksonException.class).when(objectMapper).readValue(ttlNodeAsString, TTL.class); // WHEN / THEN Exception exception = assertThrows(ValidationException.class, () -> @@ -595,7 +595,7 @@ void verifyTTLContentNotChangedByCallback_ThrowsExceptionWhenJsonParsingFails() caseData.put(TTL.TTL_CASE_FIELD_ID, objectMapper.valueToTree(ttl)); - doThrow(JsonProcessingException.class).when(objectMapper).readValue(ttlNodeAsString, TTL.class); + doThrow(JacksonException.class).when(objectMapper).readValue(ttlNodeAsString, TTL.class); Exception exception = assertThrows(ValidationException.class, () -> timeToLiveService.verifyTTLContentNotChangedByCallback(caseData, caseData) diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsServiceTest.java index 20e7516a14..2591221558 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/CategoriesAndDocumentsServiceTest.java @@ -8,7 +8,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.Tuple2; import uk.gov.hmcts.ccd.TestFixtures; import uk.gov.hmcts.ccd.domain.model.casefileview.CategoriesAndDocuments; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentServiceTest.java index 141c25e9a6..1ecaa70e5c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/casefileview/FileViewDocumentServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.casefileview; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.Tuple2; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractorTest.java index 4e3bf659ad..8ef60712ff 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkExtractorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -67,7 +67,7 @@ void setup() throws IOException { @DisplayName("Should extract a simple CaseLink value") @Test - void shouldExtractSimpleCaseLinkValue() throws JsonProcessingException { + void shouldExtractSimpleCaseLinkValue() throws JacksonException { // ARRANGE CaseDetails caseDetails = createCaseDetailsAndMockCaseDetailsExtractor(true, false, false); @@ -83,7 +83,7 @@ void shouldExtractSimpleCaseLinkValue() throws JsonProcessingException { @DisplayName("Should extract CaseLink values from a collection") @Test - void shouldExtractCollectionCaseLinkValues() throws JsonProcessingException { + void shouldExtractCollectionCaseLinkValues() throws JacksonException { // ARRANGE CaseDetails caseDetails = createCaseDetailsAndMockCaseDetailsExtractor(false, true, false); @@ -100,7 +100,7 @@ void shouldExtractCollectionCaseLinkValues() throws JsonProcessingException { @DisplayName("Should extract CaseLink values from the standard `caseLinks` field: and set the StandardLink flag") @Test - void shouldExtractStandardCaseLinkValuesAndSetTheFlag() throws JsonProcessingException { + void shouldExtractStandardCaseLinkValuesAndSetTheFlag() throws JacksonException { // ARRANGE CaseDetails caseDetails = createCaseDetailsAndMockCaseDetailsExtractor(false, false, true); @@ -121,7 +121,7 @@ void shouldExtractStandardCaseLinkValuesAndSetTheFlag() throws JsonProcessingExc ) @Test void shouldExtractWithCorrectStandardCaseLinkFlagsWhenLinksDuplicatedInsideAndOutsideOfSCLField() - throws JsonProcessingException { + throws JacksonException { // ARRANGE CaseDetails caseDetails = createCaseDetailsAndMockCaseDetailsExtractor(false, true, true); @@ -140,7 +140,7 @@ void shouldExtractWithCorrectStandardCaseLinkFlagsWhenLinksDuplicatedInsideAndOu "Should extract CaseLink values even if some of the values are empty or null" ) @Test - void shouldExtractEvenIfSomeCaseLinkFieldsAreNullOrEmpty() throws JsonProcessingException { + void shouldExtractEvenIfSomeCaseLinkFieldsAreNullOrEmpty() throws JacksonException { // ARRANGE List dataValues = List.of( @@ -190,7 +190,7 @@ void shouldExtractEvenIfSomeCaseLinkFieldsAreNullOrEmpty() throws JsonProcessing @DisplayName("Should extract when Standard CaseLink field not in use") @Test void shouldExtractWhenStandardCaseLinkFieldNotConfigured() - throws JsonProcessingException { + throws JacksonException { // ARRANGE removeCaseFieldDefinition(STANDARD_CASE_LINK_FIELD); @@ -214,7 +214,7 @@ void shouldExtractWhenStandardCaseLinkFieldNotConfigured() ) @Test void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_NotACollection() - throws JsonProcessingException { + throws JacksonException { // ARRANGE // remove and replace the SCL field @@ -242,7 +242,7 @@ void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_NotACo ) @Test void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_WrongCollection() - throws JsonProcessingException { + throws JacksonException { // ARRANGE // find and adjust the SCL field (wrong collection type) @@ -268,7 +268,7 @@ void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_WrongC ) @Test void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_BadCollection() - throws JsonProcessingException { + throws JacksonException { // ARRANGE // find and adjust the SCL field (delete collection field type config) @@ -293,7 +293,7 @@ void shouldExtractWithoutSettingStandardLinkFlagWhenSCLFieldMisConfigured_BadCol private Map createCaseData(boolean includeSimpleCaseLink, boolean includeCollectionOfCaseLinks, - boolean includeStandardCaseLinksField) throws JsonProcessingException { + boolean includeStandardCaseLinksField) throws JacksonException { List dataValues = new ArrayList<>(); if (includeSimpleCaseLink) { @@ -312,7 +312,7 @@ private Map createCaseData(boolean includeSimpleCaseLink, private CaseDetails createCaseDetailsAndMockCaseDetailsExtractor(boolean includeSimpleCaseLink, boolean includeCollectionOfCaseLinks, boolean includeStandardCaseLinksField) - throws JsonProcessingException { + throws JacksonException { mockCaseDetailsExtractor(includeSimpleCaseLink, includeCollectionOfCaseLinks, includeStandardCaseLinksField); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkMigrationServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkMigrationServiceTest.java index 227375cfbb..1d97e67b40 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkMigrationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkMigrationServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalServiceTest.java index 32d7de8509..fce10b544b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkRetrievalServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -223,7 +223,7 @@ private CaseDetails createCaseDetails(Long linkedCaseReference, List dat caseDetails = createCaseDetails(linkedCaseReference, CASE_TYPE_ID, createCaseDataMap(dataValues)); caseDetails.setId(valueOf(linkedCaseReference)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { fail("Unexpected exception when prepping mock data: " + e.getMessage()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkServiceExternalDbDeadlockIT.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkServiceExternalDbDeadlockIT.java index f78ebe6fb0..928ea0b2d4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkServiceExternalDbDeadlockIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkServiceExternalDbDeadlockIT.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkTestFixtures.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkTestFixtures.java index c6799d23e7..c3e2d8e09d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkTestFixtures.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/CaseLinkTestFixtures.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; import org.apache.commons.lang3.StringUtils; import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.caselinking.CaseLink; @@ -91,7 +91,7 @@ protected CaseDetails createCaseDetails(Long caseReference, String caseType, Map return caseDetails; } - protected Map createCaseDataMap(List dataValues) throws JsonProcessingException { + protected Map createCaseDataMap(List dataValues) throws JacksonException { return JacksonUtils.MAPPER.readValue("{" + StringUtils.join(dataValues, ",") + "}", new TypeReference>() { }); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreatorTest.java index a412010209..cf9a220dfd 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/caselinking/GetLinkedCasesResponseCreatorTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.caselinking; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.caselinking.CaseLinkDetails; @@ -28,8 +28,7 @@ class GetLinkedCasesResponseCreatorTest { private GetLinkedCasesResponseCreator getLinkedCasesResponseCreator; - protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() - .registerModule(new JavaTimeModule()); + protected static final ObjectMapper OBJECT_MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String CASE_REFERENCE = "1648478073517926"; @@ -398,7 +397,7 @@ void setup() { getLinkedCasesResponseCreator = new GetLinkedCasesResponseCreator(); } - private CaseDetails createCaseDetail(List parameters) throws JsonProcessingException { + private CaseDetails createCaseDetail(List parameters) throws JacksonException { if (parameters.size() != 5) { fail("Need 5 strings to create a CaseDetails"); } @@ -409,7 +408,7 @@ private CaseDetails createCaseDetail(List parameters) throws JsonProcess } @Test - void testCreateCaseLinkInfoList() throws JsonProcessingException { + void testCreateCaseLinkInfoList() throws JacksonException { List caseDetails1 = List.of("1500638105106660", "jurisdiction", "state", @@ -449,7 +448,7 @@ void testCreateCaseLinkInfoList() throws JsonProcessingException { } @Test - void testCreateCaseLinkInfoListNoCaseLinkFieldsPresent() throws JsonProcessingException { + void testCreateCaseLinkInfoListNoCaseLinkFieldsPresent() throws JacksonException { final String caseDetails = String.format(CASE_DETAILS_TEMPLATE_NO_CASE_LINK_FIELDS, "1500638105106660", "jurisdiction", "state", "caseTypeId", "caseNameHmctsInternal"); @@ -468,7 +467,7 @@ void testCreateCaseLinkInfoListNoCaseLinkFieldsPresent() throws JsonProcessingEx } @Test - void testCreateCaseLinkInfoListNoLinkReasonCaseLinkFieldsPresent() throws JsonProcessingException { + void testCreateCaseLinkInfoListNoLinkReasonCaseLinkFieldsPresent() throws JacksonException { final String caseDetails = String.format(CASE_DETAILS_TEMPLATE_NO_LINK_REASON_CASE_LINK_FIELDS, "1500638105106660", "jurisdiction", "state", "caseTypeId", "caseNameHmctsInternal"); @@ -490,7 +489,7 @@ void testCreateCaseLinkInfoListNoLinkReasonCaseLinkFieldsPresent() throws JsonPr } @Test - void testCreateCaseLinkInfoListEmptyLinkReasonCaseLinkFieldsPresent() throws JsonProcessingException { + void testCreateCaseLinkInfoListEmptyLinkReasonCaseLinkFieldsPresent() throws JacksonException { final String caseDetails = String.format(CASE_DETAILS_TEMPLATE_EMPTY_LINK_REASON_CASE_LINK_FIELDS, "1500638105106660", "jurisdiction", "state", "caseTypeId", "caseNameHmctsInternal"); @@ -513,7 +512,7 @@ void testCreateCaseLinkInfoListEmptyLinkReasonCaseLinkFieldsPresent() throws Jso @Test - void testCreateCaseLinkInfoListNoCaseNameHmctsInternalFieldPresent() throws JsonProcessingException { + void testCreateCaseLinkInfoListNoCaseNameHmctsInternalFieldPresent() throws JacksonException { final String minimalCaseDetails = "{\n" + " \"id\": \"1500638105106660\",\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AbstractBaseCaseFieldMetadataExtractorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AbstractBaseCaseFieldMetadataExtractorTest.java index d3bd029382..3940b3af32 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AbstractBaseCaseFieldMetadataExtractorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AbstractBaseCaseFieldMetadataExtractorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.params.provider.Arguments; import org.mockito.Mockito; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceTest.java index 91822656f1..02820ecbd5 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/AccessControlServiceTest.java @@ -4,11 +4,12 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.MissingNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.MissingNode; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Sets; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -91,13 +92,13 @@ public class AccessControlServiceTest { @Mock private ApplicationParams applicationParams; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String EVENT_ID_WITH_ACCESS = "EVENT_ID_WITH_ACCESS"; private static final String EVENT_ID_WITHOUT_ACCESS = "EVENT_ID_WITHOUT_ACCESS"; private static final String EVENT_ID_WITHOUT_ACCESS_2 = "EVENT_ID_WITHOUT_ACCESS_2"; private static final String EVENT_ID_WITH_ACCESS_2 = "EVENT_ID_WITH_ACCESS_2"; - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); static final String ROLE_IN_USER_ROLES = "caseworker-probate-loa1"; static final String ROLE_IN_USER_ROLES_2 = "caseworker-divorce-loa"; static final String ROLE_IN_USER_ROLES_3 = "caseworker-probate-loa3"; @@ -1955,17 +1956,18 @@ void shouldGrantAccessToCollectionTypeChildren() throws IOException { false); assertAll( - () -> assertThat(jsonNode.get("People").get(0).get("value").get("FirstName").textValue(), is("Fatih")), + () -> assertThat(jsonNode.get("People").get(0).get("value").get("FirstName").stringValue(), + is("Fatih")), () -> assertThat(jsonNode.get("People").get(0).get("value").get("LastName"), is(nullValue())), () -> assertThat(jsonNode.get("People").get(0).get("value").get(ADDRESSES).get(0).get("value") - .get("Name").textValue(), is("home")), + .get("Name").stringValue(), is("home")), () -> assertThat( jsonNode.get("People").get(0).get("value").get(ADDRESSES).get(1).get("value").get("Address") - .get(LINE1).textValue(), + .get(LINE1).stringValue(), is("41 Kings Road") ), () -> assertThat(jsonNode.get("People").get(0).get("value").get("Notes").get(0).get("value").get("Txt") - .textValue(), is("someNote11")), + .stringValue(), is("someNote11")), () -> assertThat(jsonNode.get("People").get(0).get("value").size(), is(3)) ); } @@ -2049,25 +2051,26 @@ void shouldfilterDataWhenChildDoesnotHaveACL() throws IOException { false); assertAll( - () -> assertThat(jsonNode.get("People").get(0).get("value").get("FirstName").textValue(), is("Fatih")), + () -> assertThat(jsonNode.get("People").get(0).get("value").get("FirstName").stringValue(), + is("Fatih")), () -> assertThat(jsonNode.get("People").get(0).get("value").get("LastName"), is(nullValue())), () -> assertThat(jsonNode.get("People").get(0).get("value").get("BirthInfo").get("BornCity") - .textValue(), is("Salihli")), + .stringValue(), is("Salihli")), () -> assertThat(jsonNode.get("People").get(0).get("value").get("BirthInfo").get("BornCountry"), is(nullValue())), () -> assertThat( jsonNode.get("People").get(0).get("value").get("BirthInfo").get("BornAddress").get("Address") - .get(LINE1).textValue(), + .get(LINE1).stringValue(), is("23 Lampton Road") ), () -> assertThat(jsonNode.get("People").get(0).get("value").get(ADDRESSES).get(0).get("value") - .get("Name").textValue(), is("home")), + .get("Name").stringValue(), is("home")), () -> assertThat(jsonNode.get("People").get(0).get("value").get(ADDRESSES).get(0).get("value") .get("Address"), is(nullValue())), () -> assertThat(jsonNode.get("People").get(0).get("value").get("Notes").get(0).get("value") .get("Note"), is(nullValue())), () -> assertThat(jsonNode.get("People").get(0).get("value").get("Notes").get(0).get("value") - .get("Txt").textValue(), is("someNote11")), + .get("Txt").stringValue(), is("someNote11")), () -> assertThat(jsonNode.get("People").get(0).get("value").size(), is(4)) ); } @@ -2158,8 +2161,9 @@ void shouldFilterDataForMissingNodeAndReturnRemainingData() throws IOException { false); assertAll(() -> assertTrue(jsonNode.get("People").get(0).get(VALUE).get("BirthInfo").isEmpty()), - () -> assertThat(jsonNode.get("People").get(0).get(VALUE).get("FirstName").textValue(), is("Fatih")), - () -> assertThat(jsonNode.get("People").get(1).get(VALUE).get("FirstName").textValue(), is("Andrew"))); + () -> assertThat(jsonNode.get("People").get(0).get(VALUE).get("FirstName").stringValue(), is("Fatih")), + () -> assertThat(jsonNode.get("People").get(1).get(VALUE).get("FirstName").stringValue(), + is("Andrew"))); List logsList = listAppender.list; assertEquals("Can not find field with caseFieldId=BirthInfo, " @@ -4706,11 +4710,12 @@ public void tearDown() { } if (logger != null) { logger.detachAndStopAllAppenders(); + logger.setLevel(null); } } private JsonNode getTextNode(String value) { - return JSON_NODE_FACTORY.textNode(value); + return JSON_NODE_FACTORY.stringNode(value); } static CaseFieldDefinition getPeopleCollectionFieldDefinition() { diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtilsTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtilsTest.java index 2dc1844d82..4c5fc360b2 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtilsTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseAccessGroupUtilsTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -380,8 +381,8 @@ private void mergeCaseAccessGroupsWithNew(CaseDetails caseDetails, JsonNode newC JsonNode mergedNode = null; try { - mergedNode = new ObjectMapper().readTree(mergedValue); - } catch (JsonProcessingException e) { + mergedNode = JsonMapper.builderWithJackson2Defaults().build().readTree(mergedValue); + } catch (JacksonException e) { throw new ValidationException(String.format(e.getMessage())); } @@ -404,7 +405,7 @@ private void addOrganisationPolicyToCaseDetailsData(CaseDetails caseDetails) { try { dataOrganisation = organisationPolicyCaseData("caseAssignedField", "\"" + TEST_ORGID + "\""); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } @@ -412,7 +413,7 @@ private void addOrganisationPolicyToCaseDetailsData(CaseDetails caseDetails) { } private Map organisationPolicyCaseData(String role, String organisationId) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -451,7 +452,7 @@ private Map caseAccessGroupCaseData(String caseAccessGroupType caseAccessGroupForUIs.add(caseAccessGroupForUI1); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); Map result = new HashMap<>(); result.put(CaseAccessGroupUtils.CASE_ACCESS_GROUPS, data); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractorTest.java index 9c2df4f940..45478c07af 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataExtractorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataServiceTest.java index 5f5f74e6de..8466c55e2b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseDataServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import org.json.JSONException; import org.junit.jupiter.api.BeforeEach; @@ -525,13 +525,13 @@ private void assertSimpleCollectionClassification(JsonNode collection, String... expectedItemClassifications) { assertThat(collection.isObject(), is(true)); assertThat(collection.size(), is(2)); - assertThat(collection.get("classification").textValue(), is(expectedCollectionClassification)); + assertThat(collection.get("classification").stringValue(), is(expectedCollectionClassification)); final JsonNode classificationValues = collection.get("value"); assertThat(classificationValues.isArray(), is(true)); assertThat(classificationValues.size(), is(expectedItemClassifications.length)); for (int i = 0; i < expectedItemClassifications.length; i++) { - assertThat(classificationValues.get(i).get("classification").textValue(), + assertThat(classificationValues.get(i).get("classification").stringValue(), is(expectedItemClassifications[i])); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseServiceTest.java index 7a82565bc3..856831eb34 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseServiceTest.java @@ -1,10 +1,11 @@ package uk.gov.hmcts.ccd.domain.service.common; -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 com.fasterxml.jackson.databind.node.TextNode; +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; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -179,7 +180,7 @@ void shouldDeepCloneCaseData() { final JsonNode cloneNames = clonePerson.get(DATA_NAMES); // Change name - ((ObjectNode) names).set(DATA_FNAME, new TextNode(OTHER_NAME)); + ((ObjectNode) names).set(DATA_FNAME, new StringNode(OTHER_NAME)); final JsonNode fname = names.get(DATA_FNAME); final JsonNode cloneFname = cloneNames.get(DATA_FNAME); @@ -189,8 +190,8 @@ void shouldDeepCloneCaseData() { () -> assertThat(clonePerson, not(sameInstance(person))), () -> assertThat(cloneNames, not(sameInstance(names))), () -> assertThat(cloneFname, not(sameInstance(fname))), - () -> assertThat(cloneFname.asText(), equalTo(PERSON_FNAME)), - () -> assertThat(fname.asText(), equalTo(OTHER_NAME)) + () -> assertThat(cloneFname.asString(), equalTo(PERSON_FNAME)), + () -> assertThat(fname.asString(), equalTo(OTHER_NAME)) ); } @@ -211,7 +212,7 @@ void shouldDeepCloneCaseDataClassification() { final JsonNode cloneNames = clonePerson.get(DATA_NAMES); // Change name classification - ((ObjectNode) names).set(DATA_FNAME, new TextNode("PRIVATE")); + ((ObjectNode) names).set(DATA_FNAME, new StringNode("PRIVATE")); final JsonNode fname = names.get(DATA_FNAME); final JsonNode cloneFname = cloneNames.get(DATA_FNAME); @@ -221,8 +222,8 @@ void shouldDeepCloneCaseDataClassification() { () -> assertThat(clonePerson, not(sameInstance(person))), () -> assertThat(cloneNames, not(sameInstance(names))), () -> assertThat(cloneFname, not(sameInstance(fname))), - () -> assertThat(cloneFname.asText(), equalTo("PUBLIC")), - () -> assertThat(fname.asText(), equalTo("PRIVATE")) + () -> assertThat(cloneFname.asString(), equalTo("PUBLIC")), + () -> assertThat(fname.asString(), equalTo("PRIVATE")) ); } } @@ -326,17 +327,17 @@ void buildsJsonRepresentationFromEventCaseFields() throws Exception { () -> assertNull(result.get("ChangeOrganisationRequestField").get("CaseRoleId")), () -> assertNotNull(result.get("ChangeOrganisationRequestField").get("OrganisationToAdd") .get("OrganisationID")), - () -> assertThat(result.get("ChangeOrganisationRequestField").get("Reason").asText(), + () -> assertThat(result.get("ChangeOrganisationRequestField").get("Reason").asString(), is("SomeReasonX")), () -> assertThat(result.get("ChangeOrganisationRequestField").get("OrganisationToAdd") - .get("OrganisationID").asText(), is("Solicitor firm 1")), + .get("OrganisationID").asString(), is("Solicitor firm 1")), () -> assertTrue(result.containsKey("OrganisationPolicyField")), () -> assertNotNull(result.get("OrganisationPolicyField").get("OrgPolicyCaseAssignedRole")), - () -> assertThat(result.get("OrganisationPolicyField").get("OrgPolicyCaseAssignedRole").asText(), + () -> assertThat(result.get("OrganisationPolicyField").get("OrgPolicyCaseAssignedRole").asString(), is("[Claimant]")), () -> assertTrue(result.containsKey("TextField0")), - () -> assertThat(result.get("TextField0").asText(), is("Default text")) + () -> assertThat(result.get("TextField0").asString(), is("Default text")) ); } } @@ -389,7 +390,7 @@ void buildsJsonRepresentationFromEventCaseFields() throws Exception { assertAll( () -> assertThat(result.size(), is(1)), () -> assertTrue(result.containsKey("TextField0")), - () -> assertThat(result.get("TextField0").asText(), is("")) + () -> assertThat(JacksonUtils.asText(result.get("TextField0")), is("")) ); } @@ -440,7 +441,7 @@ void buildsJsonRepresentationFromEventCaseFieldsForCollection() throws Exception () -> assertThat(result.size(), is(1)), () -> assertTrue(result.containsKey("TextField0")), () -> assertTrue(result.get("TextField0") instanceof ArrayNode), - () -> assertThat(result.get("TextField0").asText(), is("")) + () -> assertThat(JacksonUtils.asText(result.get("TextField0")), is("")) ); } @@ -504,10 +505,10 @@ private CaseDetails buildCaseDetails() { private Map buildCaseDataStructure(String fnameValue) { final HashMap data = new HashMap<>(); - final ObjectMapper objectMapper = new ObjectMapper(); + final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); final ObjectNode namesNode = objectMapper.createObjectNode(); - namesNode.set(DATA_FNAME, new TextNode(fnameValue)); + namesNode.set(DATA_FNAME, new StringNode(fnameValue)); final ObjectNode personNode = objectMapper.createObjectNode(); personNode.set(DATA_NAMES, namesNode); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeServiceTest.java index c0823b6ac0..e24f978158 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CaseTypeServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractorTest.java index e407fd5404..3328b85293 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ComplexCaseTypeMetadataExtractorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import org.assertj.vavr.api.VavrAssertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlServiceTest.java index 155a7126fb..18e6224a52 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/CompoundAccessControlServiceTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorerTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorerTest.java index 52d600e489..6bc35fdbf3 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/ConditionalFieldRestorerTest.java @@ -4,10 +4,11 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -15,6 +16,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.MockitoAnnotations; import org.slf4j.LoggerFactory; +import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.definition.AccessControlList; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition; @@ -600,12 +602,12 @@ void shouldAddMissingNullFieldToComplexTypeWhenCreateWithoutReadPermission() { Level.INFO, expectedMessage); assertAll( - () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asText()), - () -> assertEquals("null", result.get("caseCategory").get("value").get("code").asText()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asString()), + () -> assertTrue(result.get("caseCategory").get("value").get("code").isNull()), () -> assertEquals("Test", - result.get("caseCategory").get("list_items").get(0).get("value").get("label").asText()), + result.get("caseCategory").get("list_items").get(0).get("value").get("label").asString()), () -> assertEquals("Test", - result.get("caseCategory").get("list_items").get(0).get("value").get("code").asText()) + result.get("caseCategory").get("list_items").get(0).get("value").get("code").asString()) ); } @@ -658,12 +660,12 @@ void shouldKeepWhenNewNullFieldAddedToComplexTypeWhenCreateWithoutReadPermission existingData, ACCESS_PROFILES); assertAll( - () -> assertEquals("Test", filteredFields.get("caseCategory").get("value").get("label").asText()), - () -> assertEquals("null", filteredFields.get("caseCategory").get("value").get("code").asText()), + () -> assertEquals("Test", filteredFields.get("caseCategory").get("value").get("label").asString()), + () -> assertTrue(filteredFields.get("caseCategory").get("value").get("code").isNull()), () -> assertEquals("Test", - filteredFields.get("caseCategory").get("list_items").get(0).get("value").get("label").asText()), + filteredFields.get("caseCategory").get("list_items").get(0).get("value").get("label").asString()), () -> assertEquals("Test", - filteredFields.get("caseCategory").get("list_items").get(0).get("value").get("code").asText()) + filteredFields.get("caseCategory").get("list_items").get(0).get("value").get("code").asString()) ); } @@ -697,8 +699,8 @@ void shouldAddMissingValueComplexFieldToComplexTypeWhenCreateWithoutReadPermissi () -> assertTrue(result.get("caseCategory").has("value")), () -> assertTrue(result.get("caseCategory").get("value").has("code")), () -> assertTrue(result.get("caseCategory").get("value").has("label")), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asText()), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asText()) + () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asString()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asString()) ); } @@ -732,11 +734,11 @@ void shouldKeepNullValueSubFieldsToComplexTypeWhenCreateWithoutReadPermission() () -> assertTrue(result.get("caseCategory").get("value").isNull()), () -> assertTrue(result.get("caseCategory").has("list_items")), () -> assertEquals(1, result.get("caseCategory").get("list_items").size()), - () -> assertEquals("123456", result.get("caseCategory").get("list_items").get(0).get("id").asText()), + () -> assertEquals("123456", result.get("caseCategory").get("list_items").get(0).get("id").asString()), () -> assertEquals("Test", result.get("caseCategory").get("list_items").get(0).get("value").get("label") - .asText()), + .asString()), () -> assertEquals("Test", result.get("caseCategory").get("list_items").get(0).get("value").get("code") - .asText()) + .asString()) ); } @@ -893,8 +895,8 @@ void shouldDoNothingForMissingListItemArrayWhenWithoutCreateAndReadPermission() assertAll( () -> assertTrue(result.containsKey("caseCategory")), () -> assertTrue(result.get("caseCategory").has("value")), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asText()), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asText()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asString()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asString()), () -> assertFalse(result.get("caseCategory").has("list_items")) ); } @@ -931,11 +933,11 @@ void shouldDoNothingForMissingListItemNodeWhenWithoutCreateAndReadPermission() { assertAll( () -> assertTrue(result.containsKey("caseCategory")), () -> assertTrue(result.get("caseCategory").has("value")), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asText()), - () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asText()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("label").asString()), + () -> assertEquals("Test", result.get("caseCategory").get("value").get("code").asString()), () -> assertTrue(result.get("caseCategory").has("list_items")), () -> assertEquals(1, result.get("caseCategory").get("list_items").size()), - () -> assertEquals("444", result.get("caseCategory").get("list_items").get(0).get("id").asText()) + () -> assertEquals("444", result.get("caseCategory").get("list_items").get(0).get("id").asString()) ); } @@ -971,16 +973,16 @@ void shouldAddMissingCategoryFieldToCollectionTypeWhenWithCreateWithoutReadPermi assertAll( () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertNotNull(result.get("Note").get("Tags").get(0).get("value").get("Category")), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), - () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()), - () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asText()) + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), + () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()), + () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asString()) ); } @@ -1020,20 +1022,20 @@ void shouldDoNothingWhenCategoryFieldSetToNullWhenWithCreateWithoutReadPermissio assertAll( () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertNotNull(result.get("Note").get("Tags").get(0).get("value").get("Category")), - () -> assertEquals("null", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertTrue( + result.get("Note").get("Tags").get(0).get("value").get("Category").isNull()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()) ); } @@ -1066,16 +1068,16 @@ void shouldAddMissingValueSubFieldsToCollectionTypeWhenWithCreateWithoutReadPerm assertAll( () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), () -> assertEquals("123", - result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1111,13 +1113,13 @@ void shouldKeepNullValueToCollectionTypeWhenWithCreateWithoutReadPermission() { () -> assertEquals(2, result.get("Note").get("Tags").size()), () -> assertTrue(result.get("Note").get("Tags").get(0).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").isNull()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1158,21 +1160,23 @@ void shouldAddFirstMissingNodeToCollectionTypeWhenWithCreateWithoutReadPermissio () -> assertTrue(result.get("Note").get("Tags").get(0).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), () -> assertFalse(result.get("Note").get("Tags").get(0).has("id")), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()), + () -> assertEquals("public", result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(2).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Category")), - () -> assertEquals("private", result.get("Note").get("Tags").get(2).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Note").get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(2).get("id").asText()) + () -> assertEquals("private", result.get("Note").get("Tags").get(2).get("value").get("Tag").asString()), + () -> assertEquals("Personal", + result.get("Note").get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(2).get("id").asString()) ); } @@ -1214,26 +1218,26 @@ void shouldAddSecondMissingNodeToCollectionTypeWhenWithCreateWithoutReadPermissi () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), () -> assertFalse(result.get("Note").get("Tags").get(1).has("id")), () -> assertTrue(result.get("Note").get("Tags").get(2).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(2).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(2).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(2).get("id").asText()) + result.get("Note").get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(2).get("id").asString()) ); } @@ -1275,15 +1279,15 @@ void shouldAddMissingSubFirstFieldToCollectionTypeWhenWithCreateWithoutReadPermi () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()) ); } @@ -1326,26 +1330,27 @@ void shouldAddFirstNullIDToCollectionTypeWhenWithCreateWithoutReadPermission() { () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("null", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("null", + JacksonUtils.asText(result.get("Note").get("Tags").get(0).get("id"))), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(2).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(2).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(2).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(2).get("id").asText()) + result.get("Note").get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(2).get("id").asString()) ); } @@ -1388,26 +1393,26 @@ void shouldAddSecondNullIDToCollectionTypeWhenWithCreateWithoutReadPermission() () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("null", result.get("Note").get("Tags").get(1).get("id").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertTrue(result.get("Note").get("Tags").get(1).get("id").isNull()), () -> assertTrue(result.get("Note").get("Tags").get(2).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(2).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(2).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(2).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(2).get("id").asText()) + result.get("Note").get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(2).get("id").asString()) ); } @@ -1435,18 +1440,18 @@ void shouldAddMissingNodesToCollectionTypeWhenWithCreateWithoutReadPermission() () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1488,16 +1493,16 @@ void shouldDoNothingWhenCategoryFieldMissingWhenWithoutCreateWithoutReadPermissi () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertFalse(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(1).get("value").has("Category")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1534,13 +1539,13 @@ void shouldDoNothingWhenValueMissingWithoutCreateWithoutReadPermission() { () -> assertEquals(2, result.get("Note").get("Tags").size()), () -> assertTrue(result.get("Note").get("Tags").get(0).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").isEmpty()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1576,13 +1581,13 @@ void shouldKeepNullWhenValueIsNullWithoutCreateWithoutReadPermission() { () -> assertEquals(2, result.get("Note").get("Tags").size()), () -> assertTrue(result.get("Note").get("Tags").get(0).has("value")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").isNull()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1624,16 +1629,16 @@ void shouldDoNothingWhenNodeIDMissingWithoutCreateWithoutReadPermission() { () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), () -> assertFalse(result.get("Note").get("Tags").get(0).has("id")), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1675,15 +1680,15 @@ void shouldDoNothingWhenSecondNodeIDMissingWithoutCreateWithoutReadPermission() () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), () -> assertFalse(result.get("Note").get("Tags").get(1).has("id")) ); } @@ -1726,15 +1731,15 @@ void shouldDoNothingWhenSecondSubFieldMissingWithoutCreateWithoutReadPermission( () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Note").get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertFalse(result.get("Note").get("Tags").get(1).get("value").has("Tag")), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1777,17 +1782,18 @@ void shouldDoNothingWhenNodeIDNullStringWithoutCreateWithoutReadPermission() { () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Note").get("Tags").get(0).has("id")), - () -> assertEquals("null", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertEquals("null", + JacksonUtils.asText(result.get("Note").get("Tags").get(0).get("id"))), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1830,17 +1836,17 @@ void shouldDoNothingWhenNodeIDNullWithoutCreateWithoutReadPermission() { () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Note").get("Tags").get(0).get("value").has("Category")), () -> assertEquals("private", - result.get("Note").get("Tags").get(0).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Tag").asString()), () -> assertEquals("Personal", - result.get("Note").get("Tags").get(0).get("value").get("Category").asText()), + result.get("Note").get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Note").get("Tags").get(0).has("id")), - () -> assertEquals("null", result.get("Note").get("Tags").get(0).get("id").asText()), + () -> assertTrue(result.get("Note").get("Tags").get(0).get("id").isNull()), () -> assertTrue(result.get("Note").get("Tags").get(1).has("value")), () -> assertEquals("public", - result.get("Note").get("Tags").get(1).get("value").get("Tag").asText()), + result.get("Note").get("Tags").get(1).get("value").get("Tag").asString()), () -> assertEquals("Work", - result.get("Note").get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asText()) + result.get("Note").get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Note").get("Tags").get(1).get("id").asString()) ); } @@ -1901,21 +1907,21 @@ void shouldAddMissingCollectionTypeNoeIDWithoutCreateWithoutReadPermission() { () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertFalse(result.get("Tags").get(0).has("id")), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()), + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()), () -> assertTrue(result.get("Tags").get(2).has("value")), () -> assertTrue(result.get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(2).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(2).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Tags").get(2).get("id").asText()) + () -> assertEquals("private", result.get("Tags").get(2).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Tags").get(2).get("id").asString()) ); } @@ -1953,22 +1959,22 @@ void shouldAddMissingSecondCollectionTypeNodeIDWithoutCreateWithoutReadPermissio () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), () -> assertFalse(result.get("Tags").get(1).has("id")), () -> assertTrue(result.get("Tags").get(2).has("value")), () -> assertTrue(result.get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(2).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(2).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(2).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(2).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(2).get("id").asString()) ); } @@ -2006,20 +2012,20 @@ void shouldAddChangedCollectionTypeNodeIDWithoutCreateWithoutReadPermission() { () -> assertEquals(3, result.get("Tags").size()), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("999", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("999", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()), + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()), () -> assertTrue(result.get("Tags").get(2).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(2).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(2).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(2).get("value").get("Category").asText()), - () -> assertEquals("123", result.get("Tags").get(2).get("id").asText()) + () -> assertEquals("private", result.get("Tags").get(2).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(2).get("value").get("Category").asString()), + () -> assertEquals("123", result.get("Tags").get(2).get("id").asString()) ); } @@ -2104,19 +2110,19 @@ void shouldHandleTagFilteringWithCreatePermissionWithoutReadPermission(TestCase () -> assertTrue(result.containsKey("Tags")), () -> assertEquals(2, result.get("Tags").size()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); if (testCase.expectedMessage.isEmpty()) { assertTrue(result.get("Tags").get(0).has("value")); assertTrue(result.get("Tags").get(0).get("value").isNull()); } else { - assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()); - assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()); + assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()); + assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()); } } @@ -2193,15 +2199,15 @@ void shouldDoNothingWhenSecondCollectionTypeNodeIDMissingWithoutCreateWithoutRea () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), () -> assertFalse(result.get("Tags").get(1).has("id")) ); } @@ -2239,15 +2245,15 @@ void shouldDoNothingWhenCollectionTypeNodeIDMissingWithoutCreateWithoutReadPermi () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertFalse(result.get("Tags").get(0).has("id")), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); } @@ -2285,16 +2291,16 @@ void shouldDoNothingWhenCollectionTypeNodeIDChangedWithoutCreateWithoutReadPermi () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("999", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("999", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); } @@ -2327,13 +2333,13 @@ void shouldDoNothingWhenCollectionTypeValueMissingWithoutCreateWithoutReadPermis () -> assertEquals(2, result.get("Tags").size()), () -> assertTrue(result.get("Tags").get(0).get("value").isEmpty()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); } @@ -2365,13 +2371,13 @@ void shouldKeepNullWhenCollectionTypeValueIsNullWithoutCreateWithoutReadPermissi () -> assertEquals(2, result.get("Tags").size()), () -> assertTrue(result.get("Tags").get(0).get("value").isNull()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asText()), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("public", result.get("Tags").get(1).get("value").get("Tag").asString()), + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); } @@ -2408,15 +2414,15 @@ void shouldDoNothingWhenCollectionTypeSubFieldMissingWithoutCreateWithoutReadPer () -> assertTrue(result.get("Tags").get(0).has("value")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(0).get("value").has("Category")), - () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asText()), - () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asText()), + () -> assertEquals("private", result.get("Tags").get(0).get("value").get("Tag").asString()), + () -> assertEquals("Personal", result.get("Tags").get(0).get("value").get("Category").asString()), () -> assertTrue(result.get("Tags").get(0).has("id")), - () -> assertEquals("123", result.get("Tags").get(0).get("id").asText()), + () -> assertEquals("123", result.get("Tags").get(0).get("id").asString()), () -> assertTrue(result.get("Tags").get(1).has("value")), () -> assertFalse(result.get("Tags").get(1).get("value").has("Tag")), () -> assertTrue(result.get("Tags").get(1).get("value").has("Category")), - () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asText()), - () -> assertEquals("456", result.get("Tags").get(1).get("id").asText()) + () -> assertEquals("Work", result.get("Tags").get(1).get("value").get("Category").asString()), + () -> assertEquals("456", result.get("Tags").get(1).get("id").asString()) ); } @@ -2531,29 +2537,29 @@ void shouldAddMissingDocumentNodeToDocumentCollectionWithCreateWithoutRead() { () -> assertTrue(filteredFields.containsKey("Documents")), () -> assertTrue(filteredFields.get("Documents").isArray()), () -> assertEquals(2, filteredFields.get("Documents").size()), - () -> assertEquals("CollectionField2", filteredFields.get("Documents").get(0).get("id").asText()), + () -> assertEquals("CollectionField2", filteredFields.get("Documents").get(0).get("id").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).has("value")), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75dd3943", - filteredFields.get("Documents").get(0).get("value").get("document_url").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_binary_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75dd3943/binary", - filteredFields.get("Documents").get(0).get("value").get("document_binary_url").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_binary_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_filename")), () -> assertEquals("Elastic Search test Case.png --> updated by Solicitor 1", - filteredFields.get("Documents").get(0).get("value").get("document_filename").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_filename").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).has("id")), - () -> assertEquals("CollectionField1", filteredFields.get("Documents").get(1).get("id").asText()), + () -> assertEquals("CollectionField1", filteredFields.get("Documents").get(1).get("id").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).has("value")), () -> assertTrue(filteredFields.get("Documents").get(1).get("value").has("document_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75yfhgfhg", - filteredFields.get("Documents").get(1).get("value").get("document_url").asText()), + filteredFields.get("Documents").get(1).get("value").get("document_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).get("value").has("document_binary_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75yfhgfhg/binary", - filteredFields.get("Documents").get(1).get("value").get("document_binary_url").asText()), + filteredFields.get("Documents").get(1).get("value").get("document_binary_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).get("value").has("document_filename")), () -> assertEquals("Elastic Search test Case.png --> updated by Solicitor 1", - filteredFields.get("Documents").get(1).get("value").get("document_filename").asText()), + filteredFields.get("Documents").get(1).get("value").get("document_filename").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).has("id")) ); @@ -2647,26 +2653,26 @@ void shouldDoNothingWhenMissingDocumentSubFieldWithoutCreateWithoutRead() { () -> assertTrue(filteredFields.containsKey("Documents")), () -> assertTrue(filteredFields.get("Documents").isArray()), () -> assertEquals(2, filteredFields.get("Documents").size()), - () -> assertEquals("CollectionField1", filteredFields.get("Documents").get(0).get("id").asText()), + () -> assertEquals("CollectionField1", filteredFields.get("Documents").get(0).get("id").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).has("value")), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75yfhgfhg", - filteredFields.get("Documents").get(0).get("value").get("document_url").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_binary_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75yfhgfhg/binary", - filteredFields.get("Documents").get(0).get("value").get("document_binary_url").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_binary_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(0).get("value").has("document_filename")), () -> assertEquals("Elastic Search test Case.png --> updated by Solicitor 1", - filteredFields.get("Documents").get(0).get("value").get("document_filename").asText()), - () -> assertEquals("CollectionField2", filteredFields.get("Documents").get(1).get("id").asText()), + filteredFields.get("Documents").get(0).get("value").get("document_filename").asString()), + () -> assertEquals("CollectionField2", filteredFields.get("Documents").get(1).get("id").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).has("value")), () -> assertFalse(filteredFields.get("Documents").get(1).get("value").has("document_url")), () -> assertTrue(filteredFields.get("Documents").get(1).get("value").has("document_binary_url")), () -> assertEquals("{{DM_STORE_BASE_URL}}/documents/ae5c9e4b-1385-483e-b1b7-607e75dd3943/binary", - filteredFields.get("Documents").get(1).get("value").get("document_binary_url").asText()), + filteredFields.get("Documents").get(1).get("value").get("document_binary_url").asString()), () -> assertTrue(filteredFields.get("Documents").get(1).get("value").has("document_filename")), () -> assertEquals("Elastic Search test Case.png --> updated by Solicitor 1", - filteredFields.get("Documents").get(1).get("value").get("document_filename").asText()) + filteredFields.get("Documents").get(1).get("value").get("document_filename").asString()) ); String expectedMessage = "Missing field 'document_url' under 'Documents'."; @@ -2748,22 +2754,22 @@ void shouldAddMissingLocationFieldInComplexNestedObjectWithCreateAndWithoutReadP noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, expectedMessage); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertEquals("project, timeline, deliverable", result.get("Note").get("content") - .get("additionalInfo").get("tags").asText()), + .get("additionalInfo").get("tags").asString()), () -> assertEquals("123 Main Street", - result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()) + result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()) ); } @@ -2803,25 +2809,25 @@ void shouldNotPermitNullOfAddressLine2FieldInComplexNestedObjectWithCreateAndWit noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, expectedMessage); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertEquals("project, timeline, deliverable", - result.get("Note").get("content").get("additionalInfo").get("tags").asText()), + result.get("Note").get("content").get("additionalInfo").get("tags").asString()), () -> assertEquals("123 Main Street", - result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -2861,26 +2867,26 @@ void shouldAddMissingSubFieldInInnerComplexNestedObjectWithCreateAndWithoutReadP noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, expectedMessage); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), () -> assertTrue(result.get("Note").get("metadata").has("creationDate")), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertEquals("project, timeline, deliverable", - result.get("Note").get("content").get("additionalInfo").get("tags").asText()), + result.get("Note").get("content").get("additionalInfo").get("tags").asString()), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), - () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), + () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -2956,21 +2962,21 @@ void shouldKeepNullSubFieldsOfNullComplexFieldInInnerComplexNestedObjectWithCrea noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, ""); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertTrue(result.get("Note").get("content").has("additionalInfo")), () -> assertTrue(result.get("Note").get("content").get("additionalInfo").isNull()), - () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -3006,24 +3012,24 @@ void shouldAddMissingComplexFieldInInnerComplexNestedObjectWithCreateAndWithoutR noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, expectedMessage); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertEquals("project, timeline, deliverable", - result.get("Note").get("content").get("additionalInfo").get("tags").asText()), - () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + result.get("Note").get("content").get("additionalInfo").get("tags").asString()), + () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -3055,27 +3061,27 @@ void shouldAddMissingParentComplexFieldWithCreateAndWithoutReadPermission() { noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, expectedMessage); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), () -> assertTrue(result.get("Note").get("location").has("AddressLine1")), - () -> assertEquals("123 Main Street", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("123 Main Street", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertTrue(result.get("Note").get("content").get("additionalInfo").has("noteID")), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertTrue(result.get("Note").get("content").get("additionalInfo").has("tags")), () -> assertEquals("project, timeline, deliverable", - result.get("Note").get("content").get("additionalInfo").get("tags").asText()) + result.get("Note").get("content").get("additionalInfo").get("tags").asString()) ); } @@ -3106,17 +3112,17 @@ void shouldKeepNullParentComplexFieldWithCreateAndWithoutReadPermission() { noteWithNestedFieldsWithCreateAndWithoutReadPermission(), Level.INFO, ""); assertAll( - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), () -> assertEquals("123 Main Street", - result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()), + result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()), () -> assertTrue(result.get("Note").has("content")), () -> assertTrue(result.get("Note").get("content").isNull()) ); @@ -3159,27 +3165,27 @@ void shouldAddMissingTopSimpleFieldInParentNodeWithCreateAndWithoutReadPermissio assertAll( () -> assertTrue(result.get("Note").has("type")), - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), () -> assertTrue(result.get("Note").get("location").has("AddressLine1")), () -> assertEquals("123 Main Street", - result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertEquals("abc123", - result.get("Note").get("content").get("additionalInfo").get("noteID").asText()), + result.get("Note").get("content").get("additionalInfo").get("noteID").asString()), () -> assertEquals("Meeting", - result.get("Note").get("content").get("additionalInfo").get("category").asText()), + result.get("Note").get("content").get("additionalInfo").get("category").asString()), () -> assertEquals("project, timeline, deliverable", - result.get("Note").get("content").get("additionalInfo").get("tags").asText()) + result.get("Note").get("content").get("additionalInfo").get("tags").asString()) ); } @@ -3449,23 +3455,23 @@ void shouldKeepNullWhenComplexFieldIsNullInInnerComplexNestedObjectWithoutCreate assertAll( () -> assertTrue(result.get("Note").has("type")), - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), () -> assertTrue(result.get("Note").has("content")), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertTrue(result.get("Note").get("content").has("additionalInfo")), () -> assertTrue(result.get("Note").get("content").get("additionalInfo").isNull()), () -> assertTrue(result.get("Note").has("location")), - () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -3502,20 +3508,20 @@ void shouldDoNothingWhenComplexFieldIsMissingInInnerComplexNestedObjectWithoutCr assertAll( () -> assertTrue(result.get("Note").has("type")), - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), - () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), + () -> assertEquals("Meeting Notes", result.get("Note").get("content").get("title").asString()), () -> assertEquals("Discussion about project timelines and deliverables.", - result.get("Note").get("content").get("body").asText()), + result.get("Note").get("content").get("body").asString()), () -> assertTrue(result.get("Note").has("location")), - () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asText()), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + () -> assertEquals("address1", result.get("Note").get("location").get("AddressLine1").asString()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -3547,28 +3553,28 @@ void shouldKeepNullWhenParentComplexFieldIsNullInObjectWithoutCreateAndReadPermi assertAll( () -> assertTrue(result.get("Note").has("type")), - () -> assertEquals("PersonalNote", result.get("Note").get("type").asText()), + () -> assertEquals("PersonalNote", result.get("Note").get("type").asString()), () -> assertTrue(result.get("Note").has("metadata")), () -> assertTrue(result.get("Note").get("metadata").has("authorName")), - () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asText()), + () -> assertEquals("John Doe", result.get("Note").get("metadata").get("authorName").asString()), () -> assertTrue(result.get("Note").get("metadata").has("creationDate")), - () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asText()), + () -> assertEquals("2024-11-04", result.get("Note").get("metadata").get("creationDate").asString()), () -> assertTrue(result.get("Note").has("content")), () -> assertTrue(result.get("Note").get("content").isNull()), () -> assertTrue(result.get("Note").has("location")), () -> assertTrue(result.get("Note").get("location").has("AddressLine1")), () -> assertEquals("123 Main Street", - result.get("Note").get("location").get("AddressLine1").asText()), + result.get("Note").get("location").get("AddressLine1").asString()), () -> assertTrue(result.get("Note").get("location").has("AddressLine2")), - () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asText()), + () -> assertEquals("Suite 500", result.get("Note").get("location").get("AddressLine2").asString()), () -> assertTrue(result.get("Note").get("location").has("City")), - () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asText()), + () -> assertEquals("Anytown", result.get("Note").get("location").get("City").asString()), () -> assertTrue(result.get("Note").get("location").has("State")), - () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asText()), + () -> assertEquals("Anystate", result.get("Note").get("location").get("State").asString()), () -> assertTrue(result.get("Note").get("location").has("Country")), - () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asText()), + () -> assertEquals("AnyCountry", result.get("Note").get("location").get("Country").asString()), () -> assertTrue(result.get("Note").get("location").has("PostalCode")), - () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asText()) + () -> assertEquals("12345", result.get("Note").get("location").get("PostalCode").asString()) ); } @@ -3714,7 +3720,7 @@ void shouldAddMissingSimpleFieldToNewDataRootNoteWithCreateAndWithoutReadPermiss assertAll( () -> assertTrue(result.get("Note").has("type")), - () -> assertEquals("test", result.get("Note").get("type").asText()), + () -> assertEquals("test", result.get("Note").get("type").asString()), () -> assertEquals("Adding missing field 'type' under 'Note'.", listAppender.list.getFirst().getFormattedMessage()) ); @@ -3806,34 +3812,34 @@ void shouldAddMissingUndefinedFieldInDocumentObjectWithCreateWithoutReadPermissi assertAll( () -> assertTrue(result.get("generatedCaseDocuments").isArray()), () -> assertEquals(1, result.get("generatedCaseDocuments").size()), - () -> assertEquals("123", result.get("generatedCaseDocuments").get(0).get("id").asText()), + () -> assertEquals("123", result.get("generatedCaseDocuments").get(0).get("id").asString()), () -> assertEquals("Test", - result.get("generatedCaseDocuments").get(0).get("value").get("createdBy").asText()), + result.get("generatedCaseDocuments").get(0).get("value").get("createdBy").asString()), () -> assertTrue(result.get("generatedCaseDocuments").get(0).get("value").get("documentLink").has( "document_url")), () -> assertEquals("http_document_url", result.get("generatedCaseDocuments").get(0).get("value").get("documentLink") - .get("document_url").asText()), + .get("document_url").asString()), () -> assertTrue(result.get("generatedCaseDocuments").get(0) .get("value").get("documentLink").has("document_filename")), () -> assertEquals("document.pdf", result.get("generatedCaseDocuments").get(0) - .get("value").get("documentLink").get("document_filename").asText()), + .get("value").get("documentLink").get("document_filename").asString()), () -> assertTrue(result.get("generatedCaseDocuments").get(0).get("value").get("documentLink") .has("document_binary_url")), () -> assertEquals("http://document/binary", result.get("generatedCaseDocuments").get(0) - .get("value").get("documentLink").get("document_binary_url").asText()), + .get("value").get("documentLink").get("document_binary_url").asString()), () -> assertTrue(result.get("generatedCaseDocuments").get(0).get("value").get("documentLink") .has("category_id")), () -> assertEquals("detailsOfClaim", result.get("generatedCaseDocuments").get(0) - .get("value").get("documentLink").get("category_id").asText()), + .get("value").get("documentLink").get("category_id").asString()), () -> assertEquals("document.pdf", result.get("generatedCaseDocuments").get(0) - .get("value").get("documentName").asText()), + .get("value").get("documentName").asString()), () -> assertEquals(34805, result.get("generatedCaseDocuments").get(0).get("value") .get("documentSize").asInt()), () -> assertEquals("CLAIM", result.get("generatedCaseDocuments").get(0).get("value") - .get("documentType").asText()), + .get("documentType").asString()), () -> assertEquals("2024-10-16T10:47:03", result.get("generatedCaseDocuments").get(0) - .get("value").get("createdDatetime").asText()) + .get("value").get("createdDatetime").asString()) ); } @@ -3906,10 +3912,10 @@ private Logger setupLogging() { private Map getJsonMapNode(final String content) { try { - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); return objectMapper.readValue(content, objectMapper.getTypeFactory().constructMapType(Map.class, String.class, JsonNode.class)); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } } @@ -3946,13 +3952,14 @@ private Map assertFilterServiceAndLogging(final String existin private CaseTypeDefinition caseDefinitionWithNestedList() { try { - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); String defContent = fromFileAsString("tests/nested-list-definition.json"); return objectMapper.readValue(defContent, CaseTypeDefinition.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperServiceTest.java index 221bcf861d..e0ea5d8bd9 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/DefaultObjectMapperServiceTest.java @@ -11,12 +11,13 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.exc.StreamReadException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -27,7 +28,7 @@ class DefaultObjectMapperServiceTest { private DefaultObjectMapperService objectMapperService; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); @BeforeEach void setUp() { @@ -77,10 +78,10 @@ void shouldConvertObjectToString() { @Test @DisplayName("should throw exception for errors on converting object to json string") - void shouldThrowExceptionOnConvertObjectToString() throws JsonProcessingException { + void shouldThrowExceptionOnConvertObjectToString() throws JacksonException { ObjectMapper objectMapper = mock(ObjectMapper.class); DefaultObjectMapperService service = new DefaultObjectMapperService(objectMapper); - doThrow(new JsonParseException(null, "")).when(objectMapper).writeValueAsString(any()); + doThrow(new StreamReadException(null, "")).when(objectMapper).writeValueAsString(any()); assertThrows(ServiceException.class, () -> service.convertObjectToString(new JsonTestDto())); } @@ -127,7 +128,7 @@ void shouldConvertObjectToString() { @Test @DisplayName("should throw exception for errors on converting object to json string") - void shouldThrowExceptionOnConvertObjectToString() throws JsonProcessingException { + void shouldThrowExceptionOnConvertObjectToString() throws JacksonException { ObjectNode node = objectMapper.createObjectNode(); node.put("field", "value"); ObjectMapper objectMapper = mock(ObjectMapper.class); @@ -138,6 +139,14 @@ void shouldThrowExceptionOnConvertObjectToString() throws JsonProcessingExceptio assertThrows(ServiceException.class, () -> service.convertJsonNodeToMap(node)); } + @Test + @DisplayName("should wrap Jackson mapping errors") + void shouldWrapJacksonMappingErrors() { + JsonNode arrayNode = objectMapper.createArrayNode(); + + assertThrows(ServiceException.class, () -> objectMapperService.convertJsonNodeToMap(arrayNode)); + } + } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationServiceTest.java index ba05454aa1..b3ff4cb28e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityClassificationServiceTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.JsonNodeFactory; import java.io.IOException; import java.util.Arrays; import java.util.List; @@ -58,7 +58,7 @@ @SuppressWarnings("checkstyle:OperatorWrap") public class SecurityClassificationServiceTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String JURISDICTION_ID = "PROBATE"; private static final ObjectMapper MAPPER = JacksonUtils.MAPPER; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationServiceTest.java index 42ae998a4c..24f8aea768 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SecurityValidationServiceTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -34,7 +34,7 @@ class SecurityValidationServiceTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private SecurityValidationService securityValidationService; @Mock @@ -1190,6 +1190,6 @@ private void assertThrowsSecurityValidationDueToClassificationException(CaseDeta } private JsonNode getTextNode(String value) { - return JSON_NODE_FACTORY.textNode(value); + return JSON_NODE_FACTORY.stringNode(value); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractorTest.java index 69ccfb0d67..6f2a562031 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/SimpleCaseTypeMetadataExtractorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import io.vavr.control.Either; import org.assertj.vavr.api.VavrAssertions; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/TestBuildersUtil.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/TestBuildersUtil.java index a091a03622..8842c21177 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/common/TestBuildersUtil.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/common/TestBuildersUtil.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.common; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.slf4j.helpers.MessageFormatter; @@ -1724,7 +1724,7 @@ public CaseDataBuilder asCollectionOf(JsonNode... nodes) { } public static JsonNode collectionItem(String id, String value) { - return collectionItem(id, JsonNodeFactory.instance.textNode(value)); + return collectionItem(id, JsonNodeFactory.instance.stringNode(value)); } public static JsonNode collectionItem(String id, JsonNode value) { @@ -1783,7 +1783,7 @@ public CaseDataClassificationBuilder asCollectionOf(String classification, JsonN } public static JsonNode collectionClassification(String id, String classification) { - return collectionItem(id, JsonNodeFactory.instance.textNode(classification)); + return collectionItem(id, JsonNodeFactory.instance.stringNode(classification)); } public static JsonNode collectionClassification(String id, JsonNode classification) { diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperationTest.java index 1f932072da..573316b274 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/AuthorisedCreateCaseOperationTest.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.stream.Collectors; @@ -54,7 +55,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.JurisdictionBuilder.newJurisdiction; class AuthorisedCreateCaseOperationTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String CASEWORKER_PROBATE_LOA1 = "caseworker-probate-loa1"; private static final String CASEWORKER_PROBATE_LOA3 = "caseworker-probate-loa3"; private static final String CASEWORKER_DIVORCE = "caseworker-divorce-loa3"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperationTest.java index 583464a54c..5c218d367c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/DefaultCreateCaseOperationTest.java @@ -43,9 +43,9 @@ import java.util.List; import java.util.Map; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.hamcrest.core.IsInstanceOf; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -139,7 +139,7 @@ class DefaultCreateCaseOperationTest { @Mock private IdempotencyKeyHolder keyHolder; - private ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private TimeToLiveService timeToLiveService; @@ -185,7 +185,6 @@ void setup() throws Exception { timeToLiveService, keyHolder); data = buildJsonNodeData(); - objectMapper.registerModule(new JavaTimeModule()); given(userRepository.getUser()).willReturn(IDAM_USER); given(userRepository.getUserId()).willReturn(UID); eventTrigger = newCaseEvent().withId("eventId").withName("event Name").build(); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionCaseAccessGroupTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionCaseAccessGroupTest.java index ce79b655b2..e2f8a510ef 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionCaseAccessGroupTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionCaseAccessGroupTest.java @@ -1,15 +1,12 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -166,7 +163,7 @@ void setup() throws IOException { event = buildEvent(); caseTypeDefinition = buildCaseType(); - objectMapper = new ObjectMapper(); + objectMapper = JsonMapper.builderWithJackson2Defaults().build(); caseAccessGroupUtils = new CaseAccessGroupUtils(caseDataService, objectMapper); submitCaseTransaction = new SubmitCaseTransaction(caseDetailsRepository, @@ -198,11 +195,10 @@ void setup() throws IOException { doReturn(savedCaseDetails).when(caseDetailsRepository).set(caseDetails); doReturn(CASE_ID).when(savedCaseDetails).getId(); - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); inputCaseDetails = new CaseDetails(); doReturn(true).when(applicationParams).getCaseGroupAccessFilteringEnabled(); @@ -307,7 +303,7 @@ static HashMap buildCaseData(String fileName) throws IOExcepti SubmitCaseTransactionCaseAccessGroupTest.class.getClassLoader() .getResourceAsStream("tests/".concat(fileName)); - return new ObjectMapper().readValue(inputStream, new TypeReference<>() { + return JsonMapper.builderWithJackson2Defaults().build().readValue(inputStream, new TypeReference<>() { }); } @@ -385,7 +381,7 @@ void shouldCreateCaseEventWithOrganisationID() { .id(uuid).build(); caseAccessGroupForUIs.add(caseAccessGroupForUI); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); Map dataCaseAccessGroup = new HashMap<>(); dataCaseAccessGroup.put(CaseAccessGroups, data); @@ -429,7 +425,7 @@ void shouldPersistCreateCaseEventWithOrganisationIDUpdateCaseAccessGroup() { .id(uuid).build(); caseAccessGroupForUIs.add(caseAccessGroupForUI); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); Map dataCaseAccessGroup = new HashMap<>(); dataCaseAccessGroup.put(CaseAccessGroups, data); @@ -483,7 +479,7 @@ void shouldPersistCreateCaseEventWithOrganisationIDMergeCaseAccessGroup() { .id(uuid).build(); caseAccessGroupForUIs.add(caseAccessGroupForUI); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); Map dataCaseAccessGroup = new HashMap<>(); dataCaseAccessGroup.put(CaseAccessGroups, data); @@ -513,7 +509,7 @@ void shouldPersistCreateCaseEventWithOrganisationIDMergeCaseAccessGroup() { } private Map organisationPolicyCaseData(String role, String organisationId) - throws JsonProcessingException { + throws JacksonException { JsonNode data = MAPPER.readTree("" + "{" @@ -552,7 +548,7 @@ private Map caseAccessGroupCaseData(String caseAccessGroupType caseAccessGroupForUIs.add(caseAccessGroupForUI1); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); JsonNode data = mapper.convertValue(caseAccessGroupForUIs, JsonNode.class); Map result = new HashMap<>(); result.put(CaseAccessGroups, data); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionNewCaseTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionNewCaseTest.java index e63bb6e9bf..1525ac8ad3 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionNewCaseTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionNewCaseTest.java @@ -1,15 +1,12 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import tools.jackson.core.JacksonException; +import tools.jackson.core.StreamReadFeature; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.cfg.DateTimeFeature; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -165,7 +162,7 @@ void setup() throws IOException { event = buildEvent(); caseTypeDefinition = buildCaseType(); - objectMapper = new ObjectMapper(); + objectMapper = JsonMapper.builderWithJackson2Defaults().build(); caseAccessGroupUtils = new CaseAccessGroupUtils(caseDataService, objectMapper); submitCaseTransaction = new SubmitCaseTransaction(caseDetailsRepository, @@ -197,11 +194,10 @@ void setup() throws IOException { doReturn(savedCaseDetails).when(caseDetailsRepository).set(caseDetails); doReturn(CASE_ID).when(savedCaseDetails).getId(); - objectMapper = new ObjectMapper() - .registerModule(new Jdk8Module()) - .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)) - .registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION); + objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS) + .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION) + .build(); inputCaseDetails = new CaseDetails(); doReturn(true).when(applicationParams).getCaseGroupAccessFilteringEnabled(); @@ -306,13 +302,13 @@ static HashMap buildCaseData(String fileName) throws IOExcepti SubmitCaseTransactionNewCaseTest.class.getClassLoader() .getResourceAsStream("tests/".concat(fileName)); - return new ObjectMapper().readValue(inputStream, new TypeReference<>() { + return JsonMapper.builderWithJackson2Defaults().build().readValue(inputStream, new TypeReference<>() { }); } @Test @DisplayName("should create a case With Organisations for new case false") - void shouldPersistCreateCaseEventWithOrganisationNewCaseFalse() throws JsonProcessingException { + void shouldPersistCreateCaseEventWithOrganisationNewCaseFalse() throws JacksonException { Map dataOrganisation = organisationPolicyCaseDataNewCase("OrganisationPolicyField","caseAssignedField", "\"550e8400-e29b-41d4-a716-446655440000\"", true,false); @@ -342,7 +338,7 @@ void shouldPersistCreateCaseEventWithOrganisationNewCaseFalse() throws JsonProce @DisplayName("should create a case With OrganisationID, multiple organisationProfileField for " + "new case false and true") void shouldPersistCreateCaseEventWithOrganisationIDCaseMultipleOrganisationProfileFieldNewCase() - throws JsonProcessingException { + throws JacksonException { organisationPolicyMultipleCaseDataNewCase(inputCaseDetails); @@ -404,7 +400,7 @@ void shouldPersistCreateCaseEvenWithOrganisationNewCaseTrue() { @DisplayName("should create a case With OrganisationID, multiple organisationProfileField for " + "new case false and true and update when new case NO for organisationProfileField") void shouldPersistCreateCaseEventWithOrganisationIDCaseMultipleOrganisationProfileFieldNewCaseUpdate() - throws JsonProcessingException { + throws JacksonException { organisationPolicyMultipleCaseDataNewCase(inputCaseDetails); @@ -429,7 +425,7 @@ void shouldPersistCreateCaseEventWithOrganisationIDCaseMultipleOrganisationProfi private Map organisationPolicyCaseDataNewCase(String orgPolicyField, String role, String organisationId, boolean includeNewCase, boolean newCase) - throws JsonProcessingException { + throws JacksonException { JsonNode data; String yesOrNo = "No"; if (newCase) { @@ -466,7 +462,7 @@ private Map organisationPolicyCaseDataNewCase(String orgPolicy } private void organisationPolicyMultipleCaseDataNewCase(CaseDetails inputCaseDetails) - throws JsonProcessingException { + throws JacksonException { Map dataOrganisation = organisationPolicyCaseDataNewCase("OrganisationPolicyField","caseAssignedField", @@ -496,7 +492,7 @@ private void organisationPolicyMultipleCaseDataNewCase(CaseDetails inputCaseDeta } private void organisationPolicyMultipleCaseDataNewCaseUpdate(CaseDetails inputCaseDetails) - throws JsonProcessingException { + throws JacksonException { Map dataOrganisation = organisationPolicyCaseDataNewCase("OrganisationPolicyField","caseAssignedField", diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionTest.java index 85f4c5b020..05b928c8f4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createcase/SubmitCaseTransactionTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.createcase; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -168,7 +169,7 @@ void setup() { event = buildEvent(); caseTypeDefinition = buildCaseType(); - objectMapper = new ObjectMapper(); + objectMapper = JsonMapper.builderWithJackson2Defaults().build(); caseAccessGroupUtils = new CaseAccessGroupUtils(caseDataService, objectMapper); submitCaseTransaction = new SubmitCaseTransaction(caseDetailsRepository, @@ -583,8 +584,9 @@ static HashMap buildCaseData(String fileName) throws IOExcepti SubmitCaseTransactionTest.class.getClassLoader().getResourceAsStream("tests/".concat(fileName)); HashMap result = - new ObjectMapper().readValue(inputStream, new TypeReference>() { - }); + JsonMapper.builderWithJackson2Defaults().build() + .readValue(inputStream, new TypeReference>() { + }); return result; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperationTest.java index 33130bd683..9be659a848 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/AuthorisedCreateEventOperationTest.java @@ -4,11 +4,12 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.assertj.core.util.Lists; @@ -85,8 +86,8 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.CaseDataContentBuilder.newCaseDataContent; class AuthorisedCreateEventOperationTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASEWORKER_PROBATE_LOA1 = "caseworker-probate-loa1"; private static final String CASEWORKER_PROBATE_LOA3 = "caseworker-probate-loa3"; private static final String CASEWORKER_DIVORCE = "caseworker-divorce-loa3"; @@ -222,7 +223,7 @@ void setUp() { eq(USER_ROLES), eq(CAN_READ))).thenReturn(true); authorisedCaseNode = MAPPER.createObjectNode(); - ((ObjectNode) authorisedCaseNode).set("testField", JSON_NODE_FACTORY.textNode("testValue")); + ((ObjectNode) authorisedCaseNode).set("testField", JSON_NODE_FACTORY.stringNode("testValue")); when(accessControlService.filterCaseFieldsByAccess(any(JsonNode.class), eq(caseFieldDefinitions), eq(USER_ROLES), @@ -769,14 +770,14 @@ private static Set createAccessProfilesWithCaseAccessCategories(S } private Map getCaseAccessCategoriesData(String caseAccessCategoryValue) { - JsonNode caseAccessCategory = new TextNode(caseAccessCategoryValue); + JsonNode caseAccessCategory = new StringNode(caseAccessCategoryValue); Map data = new HashMap<>(); data.put("CaseAccessCategory", caseAccessCategory); return data; } private CaseDataContent createNewCaseDataContent(String caseAccessCategoryValue) { - JsonNode caseAccessCategory = new TextNode(caseAccessCategoryValue); + JsonNode caseAccessCategory = new StringNode(caseAccessCategoryValue); Map data = new HashMap<>(); data.put("CaseAccessCategory", caseAccessCategory); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventServiceSupplementaryDataIT.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventServiceSupplementaryDataIT.java index dec9139c5c..10402676d0 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventServiceSupplementaryDataIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/CreateCaseEventServiceSupplementaryDataIT.java @@ -1,10 +1,10 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.StringNode; import jakarta.inject.Inject; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; @@ -100,11 +100,11 @@ void shouldPersistSupplementaryDataWhenPresentInAboutToSubmitCallback() throws E assertAll( () -> assertNotNull(savedCase.getSupplementaryData(), "Supplementary data should be persisted"), - () -> assertThat(savedCase.getSupplementaryData().get("key1").asText()).isEqualTo("value1"), + () -> assertThat(savedCase.getSupplementaryData().get("key1").asString()).isEqualTo("value1"), () -> assertThat(savedCase.getSupplementaryData().get("key2").asInt()).isEqualTo(42), () -> assertNotNull(result.getSavedCaseDetails().getSupplementaryData(), "Result should contain supplementary data"), - () -> assertThat(result.getSavedCaseDetails().getSupplementaryData().get("key1").asText()) + () -> assertThat(result.getSavedCaseDetails().getSupplementaryData().get("key1").asString()) .isEqualTo("value1") ); } @@ -144,7 +144,7 @@ private void setupCallbackInvokerMockWithSupplementaryData() { // Create supplementary_data map Map supplementaryData = new HashMap<>(); - supplementaryData.put("key1", TextNode.valueOf("value1")); + supplementaryData.put("key1", StringNode.valueOf("value1")); supplementaryData.put("key2", IntNode.valueOf(42)); updateSupplementaryDataInDatabase(CASE_REFERENCE, supplementaryData); @@ -186,7 +186,7 @@ private void updateSupplementaryDataInDatabase(String caseReference, Map supplementaryDataMap = new HashMap<>(); - supplementaryDataMap.put("key1", TextNode.valueOf("value1")); + supplementaryDataMap.put("key1", StringNode.valueOf("value1")); supplementaryDataMap.put("key2", IntNode.valueOf(42)); // Mock callbackInvoker to set supplementary_data on the CaseDetails @@ -410,7 +411,7 @@ void shouldSetSupplementaryDataWhenPresentInAboutToSubmitCallback() { assertAll( () -> verify(caseDetailsRepository, times(2)).findByReference(anyString(), anyBoolean()), () -> assertNotNull(caseEventResult.getSavedCaseDetails().getSupplementaryData()), - () -> assertThat(caseEventResult.getSavedCaseDetails().getSupplementaryData().get("key1").asText()) + () -> assertThat(caseEventResult.getSavedCaseDetails().getSupplementaryData().get("key1").asString()) .isEqualTo("value1"), () -> assertThat(caseEventResult.getSavedCaseDetails().getSupplementaryData().get("key2").asInt()) .isEqualTo(42) @@ -607,7 +608,7 @@ void shouldUpdateUserDetailsWhenOnBehalfOfIdIsPassed() { void shouldUpdateCaseDocumentCategoryIdBySendingFullDataContent() throws Exception { caseDetailsFromDB = caseDetails.shallowClone(); Map data = Maps.newHashMap(); - data.put("dataKey1", JSON_NODE_FACTORY.textNode("dataValue1")); + data.put("dataKey1", JSON_NODE_FACTORY.stringNode("dataValue1")); caseDetailsFromDB.setData(data); CaseDetailsRepository defaultCaseDetailsRepository = mock(CaseDetailsRepository.class); @@ -673,7 +674,7 @@ void shouldAddUploadTimestampToDocument() throws Exception { AtomicInteger countChanges = new AtomicInteger(); nodes.forEach(node -> { countChanges.getAndIncrement(); - System.out.println("node - " + node.get(DOCUMENT_URL).asText() + " : " + node.get(UPLOAD_TIMESTAMP)); + System.out.println("node - " + node.get(DOCUMENT_URL).asString() + " : " + node.get(UPLOAD_TIMESTAMP)); assertTrue(node.has(UPLOAD_TIMESTAMP)); }); assertEquals(1, countChanges.get()); @@ -768,7 +769,7 @@ void shouldFilterDocumentHashesUsingFinalSavedCaseDataNotPreSaveData() { savedCaseDetails.setReference(Long.parseLong(CASE_REFERENCE)); savedCaseDetails.setCaseTypeId(CASE_TYPE_ID); savedCaseDetails.setState(POST_STATE); - final Map savedData = Map.of("savedKey", JSON_NODE_FACTORY.textNode("savedValue")); + final Map savedData = Map.of("savedKey", JSON_NODE_FACTORY.stringNode("savedValue")); savedCaseDetails.setData(savedData); doReturn(savedCaseDetails).when(caseDetailsRepository).set(any(CaseDetails.class)); @@ -870,7 +871,7 @@ void shouldNotReplaceUploadTimestampInDocument() throws Exception { Map data = Maps.newHashMap(); ObjectNode objectNode = createBasicDoc(); final String uploadTimestamp = "2001-01-01T01:02:03.00Z"; - objectNode.set(UPLOAD_TIMESTAMP, new TextNode(uploadTimestamp)); + objectNode.set(UPLOAD_TIMESTAMP, new StringNode(uploadTimestamp)); data.put("dataKey1", objectNode); caseDetails.setData(data); caseDetailsFromDB = caseDetails.shallowClone(); @@ -888,9 +889,9 @@ void shouldNotReplaceUploadTimestampInDocument() throws Exception { AtomicInteger countChanges = new AtomicInteger(); nodes.forEach(node -> { countChanges.getAndIncrement(); - System.out.println("node - " + node.get(DOCUMENT_URL).asText() + " : " + node.get(UPLOAD_TIMESTAMP)); + System.out.println("node - " + node.get(DOCUMENT_URL).asString() + " : " + node.get(UPLOAD_TIMESTAMP)); assertTrue(node.has(UPLOAD_TIMESTAMP)); - assertEquals(uploadTimestamp, node.get(UPLOAD_TIMESTAMP).asText()); + assertEquals(uploadTimestamp, node.get(UPLOAD_TIMESTAMP).asString()); }); assertEquals(1, countChanges.get()); } @@ -913,9 +914,9 @@ private Map buildJsonNodeData() { private ObjectNode createBasicDoc() { ObjectNode node = MAPPER.createObjectNode(); - node.set(DOCUMENT_URL, new TextNode(VALID_DOCUMENT_URL)); - node.set(DOCUMENT_BINARY_URL, new TextNode(VALID_DOCUMENT_URL + "/binary")); - node.set("document_filename", new TextNode("test-a5.pdf")); + node.set(DOCUMENT_URL, new StringNode(VALID_DOCUMENT_URL)); + node.set(DOCUMENT_BINARY_URL, new StringNode(VALID_DOCUMENT_URL + "/binary")); + node.set("document_filename", new StringNode("test-a5.pdf")); return node; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperationTest.java index 1bc2a2a8c1..60054d3548 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/DefaultCreateEventOperationTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallbackTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallbackTest.java index 6c15740763..9e2286940b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallbackTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/MidEventCallbackTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.StringNode; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; @@ -46,7 +47,7 @@ class MidEventCallbackTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String JURISDICTION_ID = "jurisdictionId"; private static final String CASE_TYPE_ID = "caseTypeId"; private static final Boolean IGNORE_WARNINGS = Boolean.FALSE; @@ -441,8 +442,8 @@ void shouldFilterCaseDataContentWhenWizardPageOrderExists() { private Map createData() { Map data = new HashMap<>(); - data.put("createCase2_field1", new TextNode("test1")); - data.put("createCase2_field1_complex1", new TextNode("complex1")); + data.put("createCase2_field1", new StringNode("test1")); + data.put("createCase2_field1_complex1", new StringNode("complex1")); return data; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/SynchronisedCaseProcessorIT.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/SynchronisedCaseProcessorIT.java index edad98247c..a4de4ed9ee 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/SynchronisedCaseProcessorIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/createevent/SynchronisedCaseProcessorIT.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.createevent; -import com.fasterxml.jackson.databind.node.TextNode; -import org.junit.Before; -import org.junit.Test; +import tools.jackson.databind.node.StringNode; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; @@ -13,7 +13,7 @@ import uk.gov.hmcts.ccd.decentralised.service.SynchronisedCaseProcessor; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; -import javax.inject.Inject; +import jakarta.inject.Inject; import java.time.LocalDateTime; import java.util.Collections; import java.util.function.Consumer; @@ -38,7 +38,7 @@ public class SynchronisedCaseProcessorIT extends WireMockBaseTest { private long initialVersion; - @Before + @BeforeEach public void setUp() { initialVersion = getCurrentVersion(CASE_REFERENCE); } @@ -96,7 +96,7 @@ private DecentralisedCaseDetails buildCasePayload(Long version) { caseDetails.setCreatedDate(LocalDateTime.now()); caseDetails.setLastModified(LocalDateTime.now()); caseDetails.setVersion(version.intValue()); - caseDetails.setData(Collections.singletonMap("PersonFirstName", new TextNode("Test"))); + caseDetails.setData(Collections.singletonMap("PersonFirstName", new StringNode("Test"))); DecentralisedCaseDetails decentralisedCaseDetails = new DecentralisedCaseDetails(); decentralisedCaseDetails.setCaseDetails(caseDetails); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcase/AuthorisedGetCaseOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcase/AuthorisedGetCaseOperationTest.java index 24760c054c..a53e61fdc0 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcase/AuthorisedGetCaseOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcase/AuthorisedGetCaseOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.getcase; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Sets; import java.util.Collections; import java.util.List; @@ -43,7 +43,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_READ; class AuthorisedGetCaseOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String JURISDICTION_ID = "Probate"; private static final String CASE_TYPE_ID = "GrantOnly"; private static final String USER_ID = "26"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentMetadataMapperTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentMetadataMapperTest.java index 7897ca1ce8..4505a1c88d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentMetadataMapperTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentMetadataMapperTest.java @@ -2,7 +2,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase; import uk.gov.hmcts.ccd.WireMockBaseTest; import uk.gov.hmcts.ccd.domain.model.search.CaseDocumentsMetadata; import uk.gov.hmcts.ccd.v2.external.domain.DocumentHashToken; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentServiceTest.java index 08b94f2ca0..c19a81ee0d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentServiceTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampServiceTest.java index 9b75bb1625..5fde82b343 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentTimestampServiceTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Maps; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -40,6 +41,7 @@ import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.Mockito.when; +import static uk.gov.hmcts.ccd.config.JacksonUtils.asText; import static uk.gov.hmcts.ccd.domain.service.getcasedocument.CaseDocumentUtils.DOCUMENT_URL; import static uk.gov.hmcts.ccd.domain.service.getcasedocument.CaseDocumentUtils.UPLOAD_TIMESTAMP; @@ -56,7 +58,7 @@ class CaseDocumentTimestampServiceTest { private final String urlMicrosoft = "https://www.microsoft.com"; private final String urlElastic = "https://www.elastic.com"; private final String urlApple = "https://www.apple.com"; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private static final Clock FIXED_CLOCK = Clock.fixed(Instant.parse("2024-01-01T00:00:00Z"), ZoneOffset.UTC); private final JsonNode jsonRequestNode = @@ -160,9 +162,9 @@ void testAddTimestamp() { System.out.println("lstDocumentUrls:" + lstDocumentUrls); AtomicInteger countChanges = new AtomicInteger(); lstJsonNodes.forEach(node -> { - if (lstDocumentUrls.contains(node.get(DOCUMENT_URL).asText())) { + if (lstDocumentUrls.contains(node.get(DOCUMENT_URL).asString())) { countChanges.getAndIncrement(); - System.out.println("node - " + node.get(DOCUMENT_URL).asText() + " : " + node.get(UPLOAD_TIMESTAMP)); + System.out.println("node - " + node.get(DOCUMENT_URL).asString() + " : " + node.get(UPLOAD_TIMESTAMP)); assertTrue(node.has(UPLOAD_TIMESTAMP)); } }); @@ -177,8 +179,8 @@ void testInsertTimestampIfNotAlreadyPresent() { underTest.insertUploadTimestamp(jsonNode, uploadTimestamp); assertTrue(jsonNode.has(UPLOAD_TIMESTAMP)); - assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); - System.out.println(jsonNode.asText()); + assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); + System.out.println(asText(jsonNode)); } @Test @@ -188,14 +190,14 @@ void testDoNotInsertTimestampIfAlreadyPresent() { underTest.insertUploadTimestamp(jsonNode, uploadTimestamp); assertTrue(jsonNode.has(UPLOAD_TIMESTAMP)); - assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); + assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); String uploadTimestampNew = LocalDateTime.now().toString(); underTest.insertUploadTimestamp(jsonNode, uploadTimestampNew); - assertNotEquals(uploadTimestampNew, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); - assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); + assertNotEquals(uploadTimestampNew, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); + assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); - System.out.println(jsonNode.asText()); + System.out.println(asText(jsonNode)); } @Test @@ -205,15 +207,15 @@ void insertTimestampIfPresentButNull() { underTest.insertUploadTimestamp(jsonNode, uploadTimestamp); assertTrue(jsonNode.has(UPLOAD_TIMESTAMP)); - assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); - System.out.println(jsonNode.asText()); + assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); + System.out.println(asText(jsonNode)); String uploadTimestampNew = LocalDateTime.now().toString(); underTest.insertUploadTimestamp(jsonNode, uploadTimestampNew); - assertNotEquals(uploadTimestampNew, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); - assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).textValue()); + assertNotEquals(uploadTimestampNew, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); + assertEquals(uploadTimestamp, jsonNode.get(UPLOAD_TIMESTAMP).stringValue()); - System.out.println(jsonNode.asText()); + System.out.println(asText(jsonNode)); } @Test @@ -729,10 +731,10 @@ void shouldExerciseGuardClausesAndNonNewDocuments() { data.put("nullTypeField", nullTypeNode); // Complex field whose value is not an object -> non-object guard - data.put("complexField", objectMapper.getNodeFactory().textNode("notAnObject")); + data.put("complexField", objectMapper.getNodeFactory().stringNode("notAnObject")); // Collection field that is not an array -> !isArray guard - data.put("collectionNotArray", objectMapper.getNodeFactory().textNode("notArray")); + data.put("collectionNotArray", objectMapper.getNodeFactory().stringNode("notArray")); // Collection with item missing \"value\" -> itemValue null branch ObjectNode arrayItemNoValue = objectMapper.createObjectNode(); @@ -1014,7 +1016,7 @@ void shouldNotOverwriteExistingTimestamp() { underTest.addUploadTimestamps(modified, original, docDef); - assertEquals("2023-01-01T00:00:00", docWithTimestamp.get(UPLOAD_TIMESTAMP).asText()); + assertEquals("2023-01-01T00:00:00", docWithTimestamp.get(UPLOAD_TIMESTAMP).asString()); } @Test @@ -1385,7 +1387,7 @@ void shouldIgnoreCollectionWithNonComplexOrDocumentItems() { underTest.addUploadTimestamps(modified, original, caseTypeDefinition); JsonNode valueNode = modified.getData().get("textCollection").get(0).get("value"); - assertTrue(valueNode.isTextual()); + assertTrue(valueNode.isString()); } @Test diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtilsTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtilsTest.java index dd07b12831..788141548a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtilsTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/CaseDocumentUtilsTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.jooq.lambda.tuple.Tuple2; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentsOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentsOperationTest.java index 86c9bb43f3..ea3b391ed1 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentsOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/getcasedocument/GetCaseDocumentsOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.getcasedocument; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -177,7 +177,7 @@ static HashMap buildCaseDetailData(String fileName) throws IOE InputStream inputStream = GetCaseDocumentsOperationTest.class.getClassLoader().getResourceAsStream("tests/".concat(fileName)); return - new ObjectMapper().readValue(inputStream, new TypeReference<>() { + JsonMapper.builderWithJackson2Defaults().build().readValue(inputStream, new TypeReference<>() { }); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/globalsearch/GlobalSearchParserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/globalsearch/GlobalSearchParserTest.java index dd2db21419..48f134abe7 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/globalsearch/GlobalSearchParserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/globalsearch/GlobalSearchParserTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.globalsearch; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.hamcrest.core.Is; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -205,12 +206,12 @@ void setUp() { } @Test - void shouldNotFilterAnyResults() throws JsonProcessingException { + void shouldNotFilterAnyResults() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setCaseManagementBaseLocationIds(validFields); searchCriteria.setCaseManagementRegionIds(validFields); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put("caseManagementLocation", mapper.readTree("{\n" + " \"region\": \"valueOne\",\n" @@ -233,12 +234,12 @@ void shouldNotFilterAnyResults() throws JsonProcessingException { } @Test - void shouldFilterResultsWhenFieldDoesNotHaveReadPermission() throws JsonProcessingException { + void shouldFilterResultsWhenFieldDoesNotHaveReadPermission() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setCaseManagementBaseLocationIds(validFields); searchCriteria.setCaseManagementRegionIds(validFields); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put("caseManagementLocation", mapper.readTree("{\n" + " \"region\": \"valueOne\",\n" @@ -268,12 +269,12 @@ void shouldFilterResultsWhenFieldDoesNotHaveReadPermission() throws JsonProcessi } @Test - void shouldNotFilterResultsWhenFieldIsRestricted() throws JsonProcessingException { + void shouldNotFilterResultsWhenFieldIsRestricted() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setCaseManagementBaseLocationIds(validFields); searchCriteria.setCaseManagementRegionIds(validFields); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put("caseManagementLocation", mapper.readTree("{\n" + " \"region\": \"valueOne\",\n" @@ -303,12 +304,12 @@ void shouldNotFilterResultsWhenFieldIsRestricted() throws JsonProcessingExceptio } @Test - void shouldFilterResultsWhenRequestIncludesPartiesAndOtherReferences() throws JsonProcessingException { + void shouldFilterResultsWhenRequestIncludesPartiesAndOtherReferences() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setParties(parties); searchCriteria.setOtherReferences(validFields); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put("searchCriteria", mapper.readTree("{\n" + " \"OtherCaseReferences\": \"valueOne\",\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParserTest.java index f1cc9078ed..caae4d01c8 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/jsonpath/CaseDetailsJsonParserTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.jsonpath; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.config.JacksonUtils; @@ -83,7 +83,7 @@ private void assertCaseData(CaseDetails caseData, String categoryId) { try { String json = JacksonUtils.writeValueAsString(caseData.getData()); assertTrue(json.contains(categoryId)); - } catch (JsonProcessingException jpe) { + } catch (JacksonException jpe) { jpe.printStackTrace(); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationIT.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationIT.java index 03322dd5b8..cc230419b4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationIT.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.lau; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; import jakarta.inject.Inject; import org.junit.jupiter.api.AfterEach; @@ -157,7 +157,7 @@ public void after() throws IOException { } @Test - public void shouldMakeAuditRequestWhenPerformingCaseSearch() throws JsonProcessingException, InterruptedException { + public void shouldMakeAuditRequestWhenPerformingCaseSearch() throws JacksonException, InterruptedException { final SearchLog searchLog = new SearchLog(); searchLog.setUserId(SEARCH_LOG_USER_ID); @@ -195,7 +195,7 @@ public void shouldMakeAuditRequestWhenPerformingCaseSearch() throws JsonProcessi } @Test - public void shouldMakeAuditRequestWhenPerformingCaseAction() throws JsonProcessingException, InterruptedException { + public void shouldMakeAuditRequestWhenPerformingCaseAction() throws JacksonException, InterruptedException { AuditContext auditContext = AuditContext.auditContextWith() .caseId(CASE_ID) .auditOperationType(AuditOperationType.CASE_ACCESSED) @@ -236,7 +236,7 @@ public void shouldMakeAuditRequestWhenPerformingCaseAction() throws JsonProcessi @Test public void shouldNotThrowExceptionInAuditServiceIfLauIsDown() - throws JsonProcessingException, InterruptedException { + throws JacksonException, InterruptedException { AuditContext auditContext = AuditContext.auditContextWith() .caseId(CASE_ID) .auditOperationType(AuditOperationType.CASE_ACCESSED) @@ -269,7 +269,7 @@ public void shouldNotThrowExceptionInAuditServiceIfLauIsDown() @Test public void shouldNotThrowExceptionInAuditServiceIfLauSearchIsDownAndRetry() - throws JsonProcessingException, InterruptedException { + throws JacksonException, InterruptedException { final SearchLog searchLog = new SearchLog(); searchLog.setUserId(SEARCH_LOG_USER_ID); searchLog.setCaseRefs(SEARCH_LOG_CASE_REFS); @@ -298,7 +298,7 @@ public void shouldNotThrowExceptionInAuditServiceIfLauSearchIsDownAndRetry() } public void shouldRetryIf403StatusFromLAU() - throws JsonProcessingException, InterruptedException { + throws JacksonException, InterruptedException { AuditContext auditContext = AuditContext.auditContextWith() .caseId(CASE_ID) .auditOperationType(AuditOperationType.CASE_ACCESSED) @@ -330,7 +330,7 @@ public void shouldRetryIf403StatusFromLAU() } public void shouldRetryIfResponseStatus502() - throws JsonProcessingException, InterruptedException { + throws JacksonException, InterruptedException { AuditContext auditContext = AuditContext.auditContextWith() .caseId(CASE_ID) .auditOperationType(AuditOperationType.CASE_ACCESSED) @@ -362,7 +362,7 @@ public void shouldRetryIfResponseStatus502() } public void shouldRetryIfResponseStatus504() - throws JsonProcessingException, InterruptedException { + throws JacksonException, InterruptedException { AuditContext auditContext = AuditContext.auditContextWith() .caseId(CASE_ID) .auditOperationType(AuditOperationType.CASE_ACCESSED) diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationTest.java index c1c666efc1..4fb7a98fd6 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/lau/AuditCaseRemoteOperationTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.lau; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import uk.gov.hmcts.ccd.AuditCaseRemoteConfiguration; import uk.gov.hmcts.ccd.auditlog.AuditEntry; import uk.gov.hmcts.ccd.auditlog.AuditOperationType; @@ -88,7 +88,7 @@ class AuditCaseRemoteOperationTest { .build(); @BeforeEach - void setUp() throws JsonProcessingException { + void setUp() throws JacksonException { MockitoAnnotations.openMocks(this); doReturn("Bearer 1234").when(securityUtils).getServiceAuthorization(); doReturn("http://localhost/caseAction").when(auditCaseRemoteConfiguration).getCaseActionAuditUrl(); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageServiceTest.java index 74cbea5c00..dc48427f37 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/message/CaseEventMessageServiceTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.message; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGeneratorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGeneratorTest.java index 54a0d7f36b..44b8c867ce 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGeneratorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/message/additionaldata/DataBlockGeneratorTest.java @@ -1,14 +1,15 @@ package uk.gov.hmcts.ccd.domain.service.message.additionaldata; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.DecimalNode; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.DecimalNode; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; @@ -57,7 +58,9 @@ class DataBlockGeneratorTest { private CaseTypeDefinition caseTypeDefinition; private CaseDetails caseDetails; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults() + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .build(); private static final String FIELD_ID = "FieldId"; private static final String FIELD_ID_2 = "FieldId2"; @@ -74,7 +77,6 @@ class DataBlockGeneratorTest { @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test @@ -101,7 +103,7 @@ void shouldBuildDataForPublishableSimpleBooleanField() { .build(); Map data = new HashMap<>(); - data.put(FIELD_ID, new TextNode("Yes")); + data.put(FIELD_ID, new StringNode("Yes")); caseDetails = newCaseDetails().withData(data).build(); @@ -184,7 +186,7 @@ void shouldBuildDataForPublishableSimpleTextFieldAlias() { )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.convertValue(TEXT_FIELD, JsonNode.class)); @@ -197,13 +199,13 @@ void shouldBuildDataForPublishableSimpleTextFieldAlias() { Map result = dataBlockGenerator.generateData(context); assertAll( - () -> assertThat(result.get(FIELD_ALIAS).textValue(), is("TextValue")), + () -> assertThat(result.get(FIELD_ALIAS).stringValue(), is("TextValue")), () -> assertThat(result.size(), is(1)) ); } @Test - void shouldBuildDataForPublishableSimpleAddressUkField() throws JsonProcessingException { + void shouldBuildDataForPublishableSimpleAddressUkField() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -231,7 +233,7 @@ void shouldBuildDataForPublishableSimpleAddressUkField() throws JsonProcessingEx )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); final JsonNode DATA = mapper.readTree("{\n" + " \"AddressLine1\" : \"line 1\",\n" @@ -256,7 +258,7 @@ void shouldBuildDataForPublishableSimpleAddressUkField() throws JsonProcessingEx } @Test - void shouldBuildDataForPublishableSimpleCollectionField() throws JsonProcessingException { + void shouldBuildDataForPublishableSimpleCollectionField() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -280,7 +282,7 @@ void shouldBuildDataForPublishableSimpleCollectionField() throws JsonProcessingE )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); final JsonNode DATA = mapper.readTree("[\n" + " {\n" @@ -313,7 +315,7 @@ void shouldBuildDataForPublishableSimpleCollectionField() throws JsonProcessingE } @Test - void shouldBuildDataForPublishableComplexCollectionField() throws JsonProcessingException { + void shouldBuildDataForPublishableComplexCollectionField() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -382,7 +384,7 @@ void shouldBuildDataForPublishableComplexCollectionField() throws JsonProcessing } @Test - void shouldBuildDataForPublishableComplexField() throws JsonProcessingException { + void shouldBuildDataForPublishableComplexField() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -422,7 +424,7 @@ void shouldBuildDataForPublishableComplexField() throws JsonProcessingException )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); JsonNode jsonData = mapper.readTree("{\n" + " \"NestedField1\": \"valueOne\",\n" @@ -447,7 +449,7 @@ void shouldBuildDataForPublishableComplexField() throws JsonProcessingException } @Test - void shouldBuildDataForComplexWithComplexOverrides() throws JsonProcessingException { + void shouldBuildDataForComplexWithComplexOverrides() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -498,7 +500,7 @@ void shouldBuildDataForComplexWithComplexOverrides() throws JsonProcessingExcept )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField1\": \"valueOne\",\n" @@ -519,12 +521,12 @@ void shouldBuildDataForComplexWithComplexOverrides() throws JsonProcessingExcept assertAll( () -> assertThat(result.size(), is(1)), () -> assertThat(nestedFieldTwo.get(NESTED_FIELD_2).size(), is(1)), - () -> assertThat(nestedFieldTwo.findValue(SUB_NESTED_FIELD_1).asText(), is("valueTwo")) + () -> assertThat(nestedFieldTwo.findValue(SUB_NESTED_FIELD_1).asString(), is("valueTwo")) ); } @Test - void shouldBuildDataForComplexWithComplexOverrides2() throws JsonProcessingException { + void shouldBuildDataForComplexWithComplexOverrides2() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -569,7 +571,7 @@ void shouldBuildDataForComplexWithComplexOverrides2() throws JsonProcessingExcep )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField1\": \"valueOne\",\n" @@ -594,7 +596,7 @@ void shouldBuildDataForComplexWithComplexOverrides2() throws JsonProcessingExcep } @Test - void shouldBuildDataForComplexWithCollectionOverrides() throws JsonProcessingException { + void shouldBuildDataForComplexWithCollectionOverrides() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -651,7 +653,7 @@ void shouldBuildDataForComplexWithCollectionOverrides() throws JsonProcessingExc )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField2\": [\n" @@ -689,7 +691,7 @@ void shouldBuildDataForComplexWithCollectionOverrides() throws JsonProcessingExc } @Test - void shouldBuildDataForComplexWithCollectionOverrides2() throws JsonProcessingException { + void shouldBuildDataForComplexWithCollectionOverrides2() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -733,7 +735,7 @@ void shouldBuildDataForComplexWithCollectionOverrides2() throws JsonProcessingEx )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField2\": [\n" @@ -764,7 +766,7 @@ void shouldBuildDataForComplexWithCollectionOverrides2() throws JsonProcessingEx } @Test - void shouldBuildDataForComplexWithCollectionOverrides3() throws JsonProcessingException { + void shouldBuildDataForComplexWithCollectionOverrides3() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -808,7 +810,7 @@ void shouldBuildDataForComplexWithCollectionOverrides3() throws JsonProcessingEx )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField2\": [\n" @@ -839,7 +841,7 @@ void shouldBuildDataForComplexWithCollectionOverrides3() throws JsonProcessingEx } @Test - void shouldBuildDataForComplexWithComplexOverridesWithAlias() throws JsonProcessingException { + void shouldBuildDataForComplexWithComplexOverridesWithAlias() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -890,7 +892,7 @@ void shouldBuildDataForComplexWithComplexOverridesWithAlias() throws JsonProcess )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField1\": \"valueOne\",\n" @@ -918,7 +920,7 @@ void shouldBuildDataForComplexWithComplexOverridesWithAlias() throws JsonProcess } @Test - void shouldBuildDataForComplexWithComplexOverridesWithMoneyGBP() throws JsonProcessingException { + void shouldBuildDataForComplexWithComplexOverridesWithMoneyGBP() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -969,7 +971,7 @@ void shouldBuildDataForComplexWithComplexOverridesWithMoneyGBP() throws JsonProc )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField1\": \"1271\",\n" @@ -995,7 +997,7 @@ void shouldBuildDataForComplexWithComplexOverridesWithMoneyGBP() throws JsonProc } @Test - void shouldBuildDataForComplexWithComplexOverridesWithYesOrNoField() throws JsonProcessingException { + void shouldBuildDataForComplexWithComplexOverridesWithYesOrNoField() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -1046,7 +1048,7 @@ void shouldBuildDataForComplexWithComplexOverridesWithYesOrNoField() throws Json )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField1\": \"No\",\n" @@ -1199,7 +1201,7 @@ void shouldBuildDataForPublishableBooleanFieldWithEmptyValue() { .build(); Map data = new HashMap<>(); - data.put(FIELD_ID, new TextNode("")); + data.put(FIELD_ID, new StringNode("")); caseDetails = newCaseDetails().withData(data).build(); @@ -1246,7 +1248,7 @@ void shouldBuildDataForPublishableNumberFieldWithNullValue() { } @Test - void shouldBuildDataForPublishableComplexOverrideFieldWithNullValue() throws JsonProcessingException { + void shouldBuildDataForPublishableComplexOverrideFieldWithNullValue() throws JacksonException { caseEventDefinition = newCaseEvent() .withCaseFields(List.of( newCaseEventField() @@ -1303,7 +1305,7 @@ void shouldBuildDataForPublishableComplexOverrideFieldWithNullValue() throws Jso )) .build(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); Map data = new HashMap<>(); data.put(FIELD_ID, mapper.readTree("{\n" + " \"NestedField2\": null" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/DateTimeEntryProcessorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/DateTimeEntryProcessorTest.java index 86cf4954a0..b3c23019ff 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/DateTimeEntryProcessorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/DateTimeEntryProcessorTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -39,7 +40,7 @@ class DateTimeEntryProcessorTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String ID = "FieldId"; private static final String DATETIME_FIELD_TYPE = "DateTime"; @@ -81,7 +82,7 @@ void shouldReturnProcessedNodeForSimpleField() throws IOException { when(caseViewFieldBuilder.build(any(), any())).thenReturn(caseViewField); when(dateTimeFormatParser.valueToTextNode(eq("13/03/2020"), eq(BaseType.get(DATETIME)), any(), eq("dd/MM/yyyy"), eq(true))) - .thenReturn(new TextNode("2020-03-13T00:00:00.000")); + .thenReturn(new StringNode("2020-03-13T00:00:00.000")); JsonNode result = dateTimeEntryProcessor.execute(node, new CaseFieldDefinition(), @@ -89,8 +90,8 @@ void shouldReturnProcessedNodeForSimpleField() throws IOException { wizardPageField(ID, Collections.emptyList())); assertAll( - () -> assertThat(result.isTextual(), is(true)), - () -> assertThat(result.asText(), is("2020-03-13T00:00:00.000")) + () -> assertThat(result.isString(), is(true)), + () -> assertThat(result.asString(), is("2020-03-13T00:00:00.000")) ); } @@ -102,7 +103,7 @@ void shouldReturnProcessedNodeForSimpleFieldNullDisplayContextParameter() throws when(caseViewFieldBuilder.build(any(), any())).thenReturn(caseViewField); when(dateTimeFormatParser.valueToTextNode(eq("2020-03-13T00:00:00.000"), eq(BaseType.get(DATETIME)), any(), eq(null), eq(false))) - .thenReturn(new TextNode("2020-03-13T00:00:00.000")); + .thenReturn(new StringNode("2020-03-13T00:00:00.000")); JsonNode result = dateTimeEntryProcessor.execute(node, new CaseFieldDefinition(), @@ -110,8 +111,8 @@ void shouldReturnProcessedNodeForSimpleFieldNullDisplayContextParameter() throws wizardPageField(ID, Collections.emptyList())); assertAll( - () -> assertThat(result.isTextual(), is(true)), - () -> assertThat(result.asText(), is("2020-03-13T00:00:00.000")) + () -> assertThat(result.isString(), is(true)), + () -> assertThat(result.asString(), is("2020-03-13T00:00:00.000")) ); } @@ -124,7 +125,7 @@ void shouldReturnProcessedNodeForSimpleFieldIncorrectDisplayContextParameter() t when(caseViewFieldBuilder.build(any(), any())).thenReturn(caseViewField); when(dateTimeFormatParser.valueToTextNode(eq("2020-03-13T00:00:00.000"), eq(BaseType.get(DATETIME)), any(), eq("dd/MM/yyyy"), eq(true))) - .thenReturn(new TextNode("2020-03-13T00:00:00.000")); + .thenReturn(new StringNode("2020-03-13T00:00:00.000")); JsonNode result = dateTimeEntryProcessor.execute(node, new CaseFieldDefinition(), @@ -132,8 +133,8 @@ void shouldReturnProcessedNodeForSimpleFieldIncorrectDisplayContextParameter() t wizardPageField(ID, Collections.emptyList())); assertAll( - () -> assertThat(result.isTextual(), is(true)), - () -> assertThat(result.asText(), is("2020-03-13T00:00:00.000")) + () -> assertThat(result.isString(), is(true)), + () -> assertThat(result.asString(), is("2020-03-13T00:00:00.000")) ); } @@ -150,10 +151,10 @@ void shouldReturnProcessedNodeForCollectionField() throws IOException { when(caseViewFieldBuilder.build(any(), any())).thenReturn(caseViewField); when(dateTimeFormatParser.valueToTextNode(eq("13/03/2020"), eq(BaseType.get(DATETIME)), any(), eq("dd/MM/yyyy"), eq(true))) - .thenReturn(new TextNode("2020-03-13T00:00:00.000")); + .thenReturn(new StringNode("2020-03-13T00:00:00.000")); when(dateTimeFormatParser.valueToTextNode(eq("25/12/1995"), eq(BaseType.get(DATETIME)), any(), eq("dd/MM/yyyy"), eq(true))) - .thenReturn(new TextNode("1995-12-25T00:00:00.000")); + .thenReturn(new StringNode("1995-12-25T00:00:00.000")); JsonNode result = dateTimeEntryProcessor.execute(node, new CaseFieldDefinition(), @@ -163,10 +164,10 @@ void shouldReturnProcessedNodeForCollectionField() throws IOException { assertAll( () -> assertThat(result.isArray(), is(true)), () -> assertThat(result.size(), is(2)), - () -> assertThat(result.get(0).get(CollectionValidator.VALUE).asText(), is("2020-03-13T00:00:00.000")), - () -> assertThat(result.get(0).get("id").asText(), is("id1")), - () -> assertThat(result.get(1).get(CollectionValidator.VALUE).asText(), is("1995-12-25T00:00:00.000")), - () -> assertThat(result.get(1).get("id").asText(), is("id2")) + () -> assertThat(result.get(0).get(CollectionValidator.VALUE).asString(), is("2020-03-13T00:00:00.000")), + () -> assertThat(result.get(0).get("id").asString(), is("id1")), + () -> assertThat(result.get(1).get(CollectionValidator.VALUE).asString(), is("1995-12-25T00:00:00.000")), + () -> assertThat(result.get(1).get("id").asString(), is("id2")) ); } @@ -203,9 +204,9 @@ void shouldReturnProcessedNodeForComplexField() throws IOException { when(caseViewFieldBuilder.build(Mockito.any(), Mockito.any())).thenReturn(caseViewField); when(dateTimeFormatParser.valueToTextNode(eq("2001"), eq(BaseType.get(DATETIME)), any(), eq("yyyy"), eq(true))) - .thenReturn(new TextNode("2001-01-01T00:00:00.000")); + .thenReturn(new StringNode("2001-01-01T00:00:00.000")); when(dateTimeFormatParser.valueToTextNode(eq("12"), eq(BaseType.get(DATE)), any(), eq("MM"), eq(true))) - .thenReturn(new TextNode("1970-12-01")); + .thenReturn(new StringNode("1970-12-01")); JsonNode result = dateTimeEntryProcessor.execute(node, caseField6, new CaseEventFieldDefinition(), wizardPageField(ID, Collections.emptyList())); @@ -213,8 +214,8 @@ void shouldReturnProcessedNodeForComplexField() throws IOException { assertAll( () -> assertThat(result.isObject(), is(true)), () -> assertThat(result.size(), is(2)), - () -> assertThat(result.get("ComplexDateTimeField").asText(), is("2001-01-01T00:00:00.000")), - () -> assertThat(result.get("ComplexNestedField").get("NestedDateField").asText(), is("1970-12-01")), + () -> assertThat(result.get("ComplexDateTimeField").asString(), is("2001-01-01T00:00:00.000")), + () -> assertThat(result.get("ComplexNestedField").get("NestedDateField").asString(), is("1970-12-01")), () -> assertThat(result.get("ComplexNestedField").get("NestedCollectionTextField").isArray(), is(true)), () -> assertThat(result.get("ComplexNestedField").get("NestedCollectionTextField").size(), is(0)) ); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorServiceTest.java index 499d4864cc..3031dd5155 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/FieldProcessorServiceTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -38,7 +39,7 @@ class FieldProcessorServiceTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final TypeReference> STRING_JSON_MAP = new TypeReference>() {}; private static final String CASE_TYPE_ID = "CaseType"; @@ -200,8 +201,8 @@ void shouldProcessDataWithAllProcessors() throws IOException { verifyNoMoreInteractions(caseDataFieldProcessor1, caseDataFieldProcessor2); assertAll( () -> assertThat(result.size(), is(2)), - () -> assertThat(result.get(ID1).asText(), is("Value 1")), - () -> assertThat(result.get(ID2).asText(), is("Value 2")) + () -> assertThat(result.get(ID1).asString(), is("Value 1")), + () -> assertThat(result.get(ID2).asString(), is("Value 2")) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorServiceTest.java index bb6914f5c3..1e1065491a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/GlobalSearchProcessorServiceTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.processor; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -65,10 +65,11 @@ class GlobalSearchProcessorServiceTest { private static final String SEARCH_PARTY_POSTCODE_2 = "EF3 4GH"; private static final String SEARCH_PARTY_EMAIL_2 = "c@d.com"; - private final ObjectMapperService objectMapperService = new DefaultObjectMapperService(new ObjectMapper()); + private final ObjectMapperService objectMapperService = + new DefaultObjectMapperService(JsonMapper.builderWithJackson2Defaults().build()); @BeforeEach - void setup() throws JsonProcessingException { + void setup() throws JacksonException { globalSearchProcessorService = new GlobalSearchProcessorService(objectMapperService); caseTypeDefinition = new CaseTypeDefinition(); @@ -170,7 +171,7 @@ void searchCriteriaStillCreatedEvenIfCollectionIsMissing() { + "]" }) void searchCriteriaStillCreatedEvenIfCollectionIsNullEmptyOrBad(String collectionAsString) - throws JsonProcessingException { + throws JacksonException { final String collectionName = "myCollection"; final String firstName = "FirstName"; @@ -198,7 +199,7 @@ void searchCriteriaStillCreatedEvenIfCollectionIsNullEmptyOrBad(String collectio } @Test - void checkOtherReferenceFieldPopulatedInSearchCriteria() throws JsonProcessingException { + void checkOtherReferenceFieldPopulatedInSearchCriteria() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setOtherCaseReference("TextField1"); @@ -212,16 +213,16 @@ void checkOtherReferenceFieldPopulatedInSearchCriteria() throws JsonProcessingEx JsonNode searchCriteriaNode = globalSearchData.get(SEARCH_CRITERIA); - assertEquals(lastName, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asText()); + assertEquals(lastName, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asString()); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.findValue(ID).asText())); + searchCriteriaNode.findValue(ID).asString())); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asText())); + searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asString())); assertFalse(searchCriteriaNode.has(SEARCH_PARTIES)); } @Test - void checkOtherReferenceFieldPopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkOtherReferenceFieldPopulatedInSearchCriteriaWithComplexField() throws JacksonException { SearchCriteria searchCriteria = new SearchCriteria(); searchCriteria.setOtherCaseReference("PersonAddress.AddressLine1"); @@ -237,15 +238,15 @@ void checkOtherReferenceFieldPopulatedInSearchCriteriaWithComplexField() throws JsonNode searchCriteriaNode = globalSearchData.get(SEARCH_CRITERIA); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.findValue(ID).asText())); + searchCriteriaNode.findValue(ID).asString())); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asText())); - assertEquals(addressValue, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asText()); + searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asString())); + assertEquals(addressValue, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asString()); assertFalse(globalSearchData.get(SEARCH_CRITERIA).has(SEARCH_PARTIES)); } @Test - void checkOtherReferenceFieldPopulatedComplexTypeInSearchCriteriaWithNullValues() throws JsonProcessingException { + void checkOtherReferenceFieldPopulatedComplexTypeInSearchCriteriaWithNullValues() throws JacksonException { SearchCriteria searchCriteria1 = new SearchCriteria(); searchCriteria1.setOtherCaseReference("PersonAddress.AddressLine1"); @@ -265,15 +266,15 @@ void checkOtherReferenceFieldPopulatedComplexTypeInSearchCriteriaWithNullValues( assertEquals(1, searchCriteriaNode.size()); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.findValue(ID).asText())); + searchCriteriaNode.findValue(ID).asString())); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asText())); - assertEquals(addressValue, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asText()); + searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asString())); + assertEquals(addressValue, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asString()); assertFalse(globalSearchData.get(SEARCH_CRITERIA).has(SEARCH_PARTIES)); } @Test - void checkOtherReferenceFieldPopulatedSimpleFieldInSearchCriteriaWithNullValues() throws JsonProcessingException { + void checkOtherReferenceFieldPopulatedSimpleFieldInSearchCriteriaWithNullValues() throws JacksonException { SearchCriteria searchCriteria1 = new SearchCriteria(); searchCriteria1.setOtherCaseReference("caseReference"); @@ -293,15 +294,15 @@ void checkOtherReferenceFieldPopulatedSimpleFieldInSearchCriteriaWithNullValues( assertEquals(1, searchCriteriaNode.size()); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.findValue(ID).asText())); + searchCriteriaNode.findValue(ID).asString())); assertDoesNotThrow(() -> UUID.fromString( - searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asText())); - assertEquals(caseReference, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asText()); + searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(ID).asString())); + assertEquals(caseReference, searchCriteriaNode.get(OTHER_CASE_REFERENCES).findValue(VALUE).asString()); assertFalse(globalSearchData.get(SEARCH_CRITERIA).has(SEARCH_PARTIES)); } @Test - void checkSearchPartyNamePopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyNamePopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyName("SearchPartyFirstName"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -312,7 +313,7 @@ void checkSearchPartyNamePopulatedInSearchCriteria() throws JsonProcessingExcept } @Test - void checkSearchPartyNamePopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyNamePopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyName("SearchParty.FirstName"); @@ -325,7 +326,7 @@ void checkSearchPartyNamePopulatedInSearchCriteriaWithComplexField() throws Json } @Test - void checkCommaSeparatedValuesSearchPartyNamePopulatedInSearchCriteria() throws JsonProcessingException { + void checkCommaSeparatedValuesSearchPartyNamePopulatedInSearchCriteria() throws JacksonException { final String searchPartyNameFirstName = "John"; final String searchPartyNameMiddleName = "Johnny"; final String searchPartyNameLastName = "Johnson"; @@ -353,7 +354,7 @@ void checkCommaSeparatedValuesSearchPartyNamePopulatedInSearchCriteria() throws @Test void checkCommaSeparatedValuesSearchPartyNameWithNullAndMissingValuesPopulatedInSearchCriteria() - throws JsonProcessingException { + throws JacksonException { final String searchPartyNameFirstName = "John"; final String searchPartyNameLastName = "Johnson"; @@ -380,7 +381,7 @@ void checkCommaSeparatedValuesSearchPartyNameWithNullAndMissingValuesPopulatedIn } @Test - void checkCommaSeparatedComplexValuesSearchPartyNamePopulatedInSearchCriteria() throws JsonProcessingException { + void checkCommaSeparatedComplexValuesSearchPartyNamePopulatedInSearchCriteria() throws JacksonException { final String firstName = "MyPerson.Person.FirstName"; final String middleName = "MyPerson.Person.MiddleName"; @@ -409,7 +410,7 @@ void checkCommaSeparatedComplexValuesSearchPartyNamePopulatedInSearchCriteria() @Test void checkSearchPartyValuesPopulatedInSearchCriteriaFromCollection() - throws JsonProcessingException { + throws JacksonException { final String collectionName = "myCollection"; final String firstName = "FirstName"; @@ -459,7 +460,7 @@ void checkSearchPartyValuesPopulatedInSearchCriteriaFromCollection() @Test void checkComplexSearchPartyValuesPopulatedInSearchCriteriaFromCollection() - throws JsonProcessingException { + throws JacksonException { final String collectionName = "myCollection"; final String firstName = "Person.FirstName"; @@ -513,7 +514,7 @@ void checkComplexSearchPartyValuesPopulatedInSearchCriteriaFromCollection() @Test void checkComplexSearchPartyValuesPopulatedInSearchCriteriaFromComplexCollection() - throws JsonProcessingException { + throws JacksonException { final String collectionName = "myComplex.myCollection"; final String firstName = "Person.FirstName"; @@ -569,7 +570,7 @@ void checkComplexSearchPartyValuesPopulatedInSearchCriteriaFromComplexCollection @Test void checkSearchPartyValuesPopulatedInSearchCriteriaFromComplexCollection() - throws JsonProcessingException { + throws JacksonException { final String collectionName = "myComplex.myCollection"; final String firstName = "FirstName"; @@ -623,7 +624,7 @@ void checkSearchPartyValuesPopulatedInSearchCriteriaFromComplexCollection() @Test void checkCommaSeparatedComplexValuesSearchPartyNameWithNullAndMissingValuesPopulatedInSearchCriteria() - throws JsonProcessingException { + throws JacksonException { final String firstName = "MyPerson.Person.FirstName"; final String middleName = "MyPerson.Person.MiddleName"; // test will set this field to null in case data @@ -655,7 +656,7 @@ void checkCommaSeparatedComplexValuesSearchPartyNameWithNullAndMissingValuesPopu @Test - void checkSearchPartyAddressLinePopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyAddressLinePopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyAddressLine1("SearchPartyAddress"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -665,7 +666,7 @@ void checkSearchPartyAddressLinePopulatedInSearchCriteria() throws JsonProcessin } @Test - void checkSearchPartyAddressLinePopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyAddressLinePopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyAddressLine1("SearchParty.Address"); @@ -677,7 +678,7 @@ void checkSearchPartyAddressLinePopulatedInSearchCriteriaWithComplexField() thro } @Test - void checkSearchPartyEMailAddressPopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyEMailAddressPopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyEmailAddress("SearchPartyEmailAddress"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -688,7 +689,7 @@ void checkSearchPartyEMailAddressPopulatedInSearchCriteria() throws JsonProcessi } @Test - void checkSearchPartyEMailAddressPopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyEMailAddressPopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyEmailAddress("SearchParty.EmailAddress"); @@ -701,7 +702,7 @@ void checkSearchPartyEMailAddressPopulatedInSearchCriteriaWithComplexField() thr } @Test - void checkSearchPartyPostCodePopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyPostCodePopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyPostCode("SearchPartyPostCode"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -712,7 +713,7 @@ void checkSearchPartyPostCodePopulatedInSearchCriteria() throws JsonProcessingEx } @Test - void checkSearchPartyPostCodePopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyPostCodePopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyPostCode("MySearchParty.SearchParty.PostCode.name"); @@ -730,7 +731,7 @@ void checkSearchPartyPostCodePopulatedInSearchCriteriaWithComplexField() throws } @Test - void checkSearchPartyDateOfDeathPopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyDateOfDeathPopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyDod("SearchPartyDod"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -741,7 +742,7 @@ void checkSearchPartyDateOfDeathPopulatedInSearchCriteria() throws JsonProcessin } @Test - void checkSearchPartyDateOfDeathEmptyInSearchCriteriaWhenBadDateValue() throws JsonProcessingException { + void checkSearchPartyDateOfDeathEmptyInSearchCriteriaWhenBadDateValue() throws JacksonException { searchParty.setSearchPartyDod("SearchPartyDod"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -753,7 +754,7 @@ void checkSearchPartyDateOfDeathEmptyInSearchCriteriaWhenBadDateValue() throws J } @Test - void checkSearchPartyDateOfDeathPopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyDateOfDeathPopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyDod("SearchParty.PostCode.name"); @@ -769,7 +770,7 @@ void checkSearchPartyDateOfDeathPopulatedInSearchCriteriaWithComplexField() thro } @Test - void checkSearchPartyDateOfBirthPopulatedInSearchCriteria() throws JsonProcessingException { + void checkSearchPartyDateOfBirthPopulatedInSearchCriteria() throws JacksonException { searchParty.setSearchPartyDob("SearchPartyDoB"); caseTypeDefinition.setSearchParties(List.of(searchParty)); @@ -780,7 +781,7 @@ void checkSearchPartyDateOfBirthPopulatedInSearchCriteria() throws JsonProcessin } @Test - void checkSearchPartyDateOfBirthPopulatedInSearchCriteriaWithComplexField() throws JsonProcessingException { + void checkSearchPartyDateOfBirthPopulatedInSearchCriteriaWithComplexField() throws JacksonException { searchParty.setSearchPartyDob("SearchParty.PostCode.name"); @@ -796,7 +797,7 @@ void checkSearchPartyDateOfBirthPopulatedInSearchCriteriaWithComplexField() thro } @Test - void checkSearchPartyDateOfBirthEmptyInSearchCriteriaWhenBadDateValue() throws JsonProcessingException { + void checkSearchPartyDateOfBirthEmptyInSearchCriteriaWhenBadDateValue() throws JacksonException { searchParty.setSearchPartyDob("SearchPartyDob"); @@ -810,7 +811,7 @@ void checkSearchPartyDateOfBirthEmptyInSearchCriteriaWhenBadDateValue() throws J @Test void checkSearchCriteriaExistsButSearchPartyNodeIsNullWhenTwoBadDateValues() - throws JsonProcessingException { + throws JacksonException { searchParty.setSearchPartyDob("spDob"); searchParty.setSearchPartyDod("spDod"); @@ -827,7 +828,7 @@ void checkSearchCriteriaExistsButSearchPartyNodeIsNullWhenTwoBadDateValues() } @Test - void checkSearchCriteriaContainingASearchPartyContainingAllFields() throws JsonProcessingException { + void checkSearchCriteriaContainingASearchPartyContainingAllFields() throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -858,7 +859,7 @@ void checkSearchCriteriaContainingASearchPartyContainingAllFields() throws JsonP } @Test - void checkSearchCriteriaContainingASearchPartyContainingAllFieldsFromCollection() throws JsonProcessingException { + void checkSearchCriteriaContainingASearchPartyContainingAllFieldsFromCollection() throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -897,7 +898,7 @@ void checkSearchCriteriaContainingASearchPartyContainingAllFieldsFromCollection( @Test void checkSearchCriteriaContainingASearchPartyContainingAllFieldsTwoDateFieldsAreWrong() - throws JsonProcessingException { + throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -934,7 +935,7 @@ void checkSearchCriteriaContainingASearchPartyContainingAllFieldsTwoDateFieldsAr } @Test - void checkSearchCriteriaContainingMultipleSearchPartiesContainingAllFields() throws JsonProcessingException { + void checkSearchCriteriaContainingMultipleSearchPartiesContainingAllFields() throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -989,7 +990,7 @@ void checkSearchCriteriaContainingMultipleSearchPartiesContainingAllFields() thr @Test void checkSearchCriteriaContainsMultipleSearchPartiesFromCollection() - throws JsonProcessingException { + throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -1041,7 +1042,7 @@ void checkSearchCriteriaContainsMultipleSearchPartiesFromCollection() } @Test - void checkSearchCriteriaContainingSingleMatchingSearchPartyContainingAllFields() throws JsonProcessingException { + void checkSearchCriteriaContainingSingleMatchingSearchPartyContainingAllFields() throws JacksonException { searchParty.setSearchPartyName("spName"); searchParty.setSearchPartyDob("spDob"); @@ -1107,7 +1108,7 @@ void checkSearchCriteriaContainingSingleMatchingSearchPartyContainingAllFields() JsonNode searchPartyNode = searchPartyNodes.get(0); expectedFieldValues.forEach((key, value) -> - assertEquals(value, searchPartyNode.findValue(VALUE).findValue(key).asText())); + assertEquals(value, searchPartyNode.findValue(VALUE).findValue(key).asString())); } private void assertSearchCriteriaField(String fieldName, Object expectedValue) { @@ -1116,8 +1117,8 @@ private void assertSearchCriteriaField(String fieldName, Object expectedValue) { JsonNode searchPartyNode = globalSearchData.get(SEARCH_CRITERIA).get(SEARCH_PARTIES); - assertDoesNotThrow(() -> UUID.fromString(searchPartyNode.findValue(ID).asText())); - assertEquals(expectedValue, searchPartyNode.findValue(VALUE).findValue(fieldName).asText()); + assertDoesNotThrow(() -> UUID.fromString(searchPartyNode.findValue(ID).asString())); + assertEquals(expectedValue, searchPartyNode.findValue(VALUE).findValue(fieldName).asString()); searchPartyPropertyNames.stream() .filter(propertyName -> !propertyName.equals(fieldName)) @@ -1130,10 +1131,10 @@ private void assertSearchCriteriaFields(Map expectedValues) { JsonNode searchPartyNode = globalSearchData.get(SEARCH_CRITERIA).get(SEARCH_PARTIES); - assertDoesNotThrow(() -> UUID.fromString(searchPartyNode.findValue(ID).asText())); + assertDoesNotThrow(() -> UUID.fromString(searchPartyNode.findValue(ID).asString())); expectedValues.forEach((key, value) -> - assertEquals(value, searchPartyNode.findValue(VALUE).findValue(key).asText()) + assertEquals(value, searchPartyNode.findValue(VALUE).findValue(key).asString()) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParserTest.java index 687acaeb27..d7d9ad5c97 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeFormatParserTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -17,7 +17,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.nullValue; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; @@ -321,58 +320,58 @@ void shouldConvertDateToIso8601FormatIncorrectDisplayContextParameter() { @Test void shouldCreateTextNodeForDate_ToIso() { - TextNode result = dateTimeFormatParser.valueToTextNode("2010", BaseType.get(DATE), "FieldId", "yyyy", true); + JsonNode result = dateTimeFormatParser.valueToTextNode("2010", BaseType.get(DATE), "FieldId", "yyyy", true); assertAll( - () -> assertThat(result.asText(), is("2010-01-01")) + () -> assertThat(result.asString(), is("2010-01-01")) ); } @Test void shouldCreateTextNodeForDateTime_ToIso() { - TextNode result = + JsonNode result = dateTimeFormatParser.valueToTextNode("2010", BaseType.get(DATETIME), "FieldId", "yyyy", true); assertAll( - () -> assertThat(result.asText(), is("2010-01-01T00:00:00.000")) + () -> assertThat(result.asString(), is("2010-01-01T00:00:00.000")) ); } @Test void shouldCreateTextNodeForDate_FromIso() { - TextNode result = + JsonNode result = dateTimeFormatParser.valueToTextNode("2010-01-01", BaseType.get(DATE), "FieldId", "yyyy", false); assertAll( - () -> assertThat(result.asText(), is("2010")) + () -> assertThat(result.asString(), is("2010")) ); } @Test void shouldCreateTextNodeForDateTime_FromIso() { - TextNode result = dateTimeFormatParser.valueToTextNode("2010-01-01T00:00:00.000", BaseType.get(DATETIME), + JsonNode result = dateTimeFormatParser.valueToTextNode("2010-01-01T00:00:00.000", BaseType.get(DATETIME), "FieldId", "yyyy", false); assertAll( - () -> assertThat(result.asText(), is("2010")) + () -> assertThat(result.asString(), is("2010")) ); } @Test void shouldCreateTextNodeForNullValue() { - TextNode result = dateTimeFormatParser.valueToTextNode(null, BaseType.get(DATE), "FieldId", "yyyy", true); + JsonNode result = dateTimeFormatParser.valueToTextNode(null, BaseType.get(DATE), "FieldId", "yyyy", true); assertAll( - () -> assertThat(result.asText(), is(nullValue())) + () -> assertThat(result.isNull(), is(true)) ); } @Test void shouldCreateTextNodeForEmptyValue() { - TextNode result = dateTimeFormatParser.valueToTextNode("", BaseType.get(DATE), "FieldId", "yyyy", true); + JsonNode result = dateTimeFormatParser.valueToTextNode("", BaseType.get(DATE), "FieldId", "yyyy", true); assertAll( - () -> assertThat(result.asText(), is("")) + () -> assertThat(result.asString(), is("")) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessorTest.java index 582036a9e2..5a85410930 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeSearchResultProcessorTest.java @@ -1,10 +1,11 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; @@ -34,7 +35,7 @@ class DateTimeSearchResultProcessorTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String DATE_FIELD = "DateField"; private static final String DATETIME_FIELD = "DateTimeField"; private static final String TEXT_FIELD = "TextField"; @@ -76,9 +77,9 @@ void setUp() { "#DATETIMEDISPLAY(ddMMyyyy)"); viewColumns.addAll(Arrays.asList(column1, column2)); - caseFields.put(DATE_FIELD, new TextNode("2020-10-01")); - caseFields.put(DATETIME_FIELD, new TextNode("1985-12-30")); - caseFields.put(TEXT_FIELD, new TextNode("Text Value")); + caseFields.put(DATE_FIELD, new StringNode("2020-10-01")); + caseFields.put(DATETIME_FIELD, new StringNode("1985-12-30")); + caseFields.put(TEXT_FIELD, new StringNode("Text Value")); SearchResultViewItem item = new SearchResultViewItem("CaseId", caseFields, new HashMap<>(caseFields)); viewItems.add(item); } @@ -96,12 +97,15 @@ void shouldProcessDatesWithDCP() { assertAll( () -> assertThat(result.size(), is(1)), () -> assertThat(itemResult.getFields().size(), is(3)), - () -> assertThat(((TextNode)itemResult.getFieldsFormatted().get(DATE_FIELD)).asText(), is("01/10/2020")), - () -> assertThat(((TextNode)itemResult.getFieldsFormatted().get(DATETIME_FIELD)).asText(), is("30121985")), - () -> assertThat(((TextNode)itemResult.getFieldsFormatted().get(TEXT_FIELD)).asText(), is("Text Value")), - () -> assertThat(((TextNode)itemResult.getFields().get(DATE_FIELD)).asText(), is("2020-10-01")), - () -> assertThat(((TextNode)itemResult.getFields().get(DATETIME_FIELD)).asText(), is("1985-12-30")), - () -> assertThat(((TextNode)itemResult.getFields().get(TEXT_FIELD)).asText(), is("Text Value")) + () -> assertThat(((StringNode)itemResult.getFieldsFormatted().get(DATE_FIELD)).asString(), + is("01/10/2020")), + () -> assertThat(((StringNode)itemResult.getFieldsFormatted().get(DATETIME_FIELD)).asString(), + is("30121985")), + () -> assertThat(((StringNode)itemResult.getFieldsFormatted().get(TEXT_FIELD)).asString(), + is("Text Value")), + () -> assertThat(((StringNode)itemResult.getFields().get(DATE_FIELD)).asString(), is("2020-10-01")), + () -> assertThat(((StringNode)itemResult.getFields().get(DATETIME_FIELD)).asString(), is("1985-12-30")), + () -> assertThat(((StringNode)itemResult.getFields().get(TEXT_FIELD)).asString(), is("Text Value")) ); } @@ -125,7 +129,7 @@ void shouldProcessMetadataDatesWithDCP() { assertAll( () -> assertThat(result.size(), is(1)), () -> assertThat(itemResult.getFields().size(), is(4)), - () -> assertThat(((TextNode)itemResult.getFieldsFormatted().get(metadataField)).asText(), + () -> assertThat(((StringNode)itemResult.getFieldsFormatted().get(metadataField)).asString(), is("01/10/2020")), () -> assertThat(itemResult.getFields().get(metadataField), is(localDateTime)) ); @@ -153,8 +157,8 @@ void shouldProcessComplexTypesWithDCP() throws IOException { () -> assertThat(result.size(), is(1)), () -> assertThat(itemResult.getFields().size(), is(4)), () -> assertThat(((ObjectNode)itemResult.getFieldsFormatted().get(COMPLEX_FIELD)).get("ComplexDateField") - .asText(), is("10-2020")), - () -> assertThat(((ObjectNode)itemResult.getFields().get(COMPLEX_FIELD)).get("ComplexDateField").asText(), + .asString(), is("10-2020")), + () -> assertThat(((ObjectNode)itemResult.getFields().get(COMPLEX_FIELD)).get("ComplexDateField").asString(), is("2020-10-05")) ); } @@ -184,18 +188,18 @@ void shouldProcessCollectionsWithDCP() throws IOException { () -> assertThat(itemResult.getFields().size(), is(4)), () -> assertThat( ((ArrayNode)itemResult.getFieldsFormatted().get(COLLECTION_FIELD)).get(0) - .get(CollectionValidator.VALUE).asText(), + .get(CollectionValidator.VALUE).asString(), is("10-2020") ), () -> assertThat( ((ArrayNode)itemResult.getFieldsFormatted().get(COLLECTION_FIELD)).get(1) - .get(CollectionValidator.VALUE).asText(), + .get(CollectionValidator.VALUE).asString(), is("12-1999") ), () -> assertThat(((ArrayNode)itemResult.getFields().get(COLLECTION_FIELD)).get(0) - .get(CollectionValidator.VALUE).asText(), is("2020-10-05")), + .get(CollectionValidator.VALUE).asString(), is("2020-10-05")), () -> assertThat(((ArrayNode)itemResult.getFields().get(COLLECTION_FIELD)).get(1) - .get(CollectionValidator.VALUE).asText(), is("1999-12-01")) + .get(CollectionValidator.VALUE).asString(), is("1999-12-01")) ); } @@ -228,22 +232,22 @@ void shouldProcessCollectionOfComplexTypesWithDCP() throws IOException { () -> assertThat(itemResult.getFields().size(), is(4)), () -> assertThat( ((ArrayNode)itemResult.getFieldsFormatted().get(COLLECTION_FIELD)).get(0) - .get(CollectionValidator.VALUE).get("NestedDate").asText(), + .get(CollectionValidator.VALUE).get("NestedDate").asString(), is("10-2020") ), () -> assertThat( ((ArrayNode)itemResult.getFieldsFormatted().get(COLLECTION_FIELD)).get(1) - .get(CollectionValidator.VALUE).get("NestedDate").asText(), + .get(CollectionValidator.VALUE).get("NestedDate").asString(), is("07-1992") ), () -> assertThat( ((ArrayNode)itemResult.getFields().get(COLLECTION_FIELD)).get(0).get(CollectionValidator.VALUE) - .get("NestedDate").asText(), + .get("NestedDate").asString(), is("2020-10-05") ), () -> assertThat( ((ArrayNode)itemResult.getFields().get(COLLECTION_FIELD)).get(1).get(CollectionValidator.VALUE) - .get("NestedDate").asText(), + .get("NestedDate").asString(), is("1992-07-30") ) ); @@ -264,13 +268,13 @@ void shouldUseOriginalValueForDatesWithoutDCP() { assertAll( () -> assertThat(result.size(), is(1)), () -> assertThat(itemResult.getFields().size(), is(3)), - () -> assertThat(((TextNode)itemResult.getFields().get(DATE_FIELD)).asText(), is("2020-10-01")), - () -> assertThat(((TextNode)itemResult.getFields().get(DATETIME_FIELD)).asText(), is("1985-12-30")) + () -> assertThat(((StringNode)itemResult.getFields().get(DATE_FIELD)).asString(), is("2020-10-01")), + () -> assertThat(((StringNode)itemResult.getFields().get(DATETIME_FIELD)).asString(), is("1985-12-30")) ); } @Test - void shouldUseOriginalValueForMultiSelectListField() throws JsonProcessingException { + void shouldUseOriginalValueForMultiSelectListField() throws JacksonException { final String multiSelectField = "MultiSelectField"; caseFields.put(multiSelectField, MAPPER.readTree("[\"Value1\", \"Value2\"]")); @@ -291,11 +295,11 @@ void shouldUseOriginalValueForMultiSelectListField() throws JsonProcessingExcept () -> assertThat(result.size(), is(1)), () -> assertThat(itemResult.getFields().size(), is(4)), () -> assertThat(multiSelectResult.size(), is(2)), - () -> assertThat(multiSelectResult.get(0).asText(), is("Value1")), - () -> assertThat(multiSelectResult.get(1).asText(), is("Value2")), + () -> assertThat(multiSelectResult.get(0).asString(), is("Value1")), + () -> assertThat(multiSelectResult.get(1).asString(), is("Value2")), () -> assertThat(multiSelectResultFormatted.size(), is(2)), - () -> assertThat(multiSelectResultFormatted.get(0).asText(), is("Value1")), - () -> assertThat(multiSelectResultFormatted.get(1).asText(), is("Value2")) + () -> assertThat(multiSelectResultFormatted.get(0).asString(), is("Value1")), + () -> assertThat(multiSelectResultFormatted.get(1).asString(), is("Value2")) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatterTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatterTest.java index 8f9725aa1f..59fa8288ce 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatterTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/processor/date/DateTimeValueFormatterTest.java @@ -1,9 +1,10 @@ package uk.gov.hmcts.ccd.domain.service.processor.date; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -39,7 +40,7 @@ class DateTimeValueFormatterTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String ID = "FieldId"; private static final String DATETIME_FIELD_TYPE = "DateTime"; private static final String DATE_FIELD_TYPE = "Date"; @@ -77,36 +78,36 @@ class ExecuteCaseViewFieldTest { @Test void shouldFormatSimpleDateTimeFieldUsingDisplayDCP() { setUpBaseType(DATETIME_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATETIME); + StringNode value = new StringNode(TEST_DATETIME); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEDISPLAY(dd/MM/yyyy)", fieldType(DATETIME_FIELD_TYPE), value, DisplayContext.READONLY.name()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATETIME), eq(BaseType.get(DATETIME)), anyString(), eq(TEST_FORMAT), eq(false))) - .thenReturn(new TextNode("13/03/2020")); + .thenReturn(new StringNode("13/03/2020")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is("13/03/2020")) + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is("13/03/2020")) ); } @Test void shouldFormatSimpleDateFieldUsingDisplayDCP() { setUpBaseType(DATE_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATE); + StringNode value = new StringNode(TEST_DATE); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEDISPLAY(d M yy)", fieldType(DATE_FIELD_TYPE), value, DisplayContext.READONLY.name()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq("d M yy"), eq(false))).thenReturn(new TextNode("13 3 20")); + eq("d M yy"), eq(false))).thenReturn(new StringNode("13 3 20")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is("13 3 20")) + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is("13 3 20")) ); } @@ -118,20 +119,20 @@ void shouldFormatCollectionOfDateFieldsUsingDisplayDCP() throws IOException { caseViewField(ID, "#DATETIMEDISPLAY(dd/MM/yyyy)", fieldType(COLLECTION_FIELD_TYPE, fieldType(DATE_FIELD_TYPE)), value, null); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("13/03/2020")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("13/03/2020")); when(dateTimeFormatParser.valueToTextNode(eq("2010-10-30"), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("30/10/2010")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("30/10/2010")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( () -> assertThat(result.getFormattedValue(), instanceOf(ArrayNode.class)), () -> assertThat(((ArrayNode) result.getFormattedValue()).size(), is(2)), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asText(), is("id1")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asString(), is("id1")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asString(), is("13/03/2020")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asText(), is("id2")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asString(), is("id2")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asString(), is("30/10/2010")) ); } @@ -156,11 +157,11 @@ void shouldFormatComplexFieldsUsingComplexTypeDisplayDCP() throws IOException { caseViewField.getFieldTypeDefinition().setComplexFields(Arrays.asList(complexDateField, complexNestedField)); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq("MM yyyy"), eq(false))).thenReturn(new TextNode("03 2020")); + eq("MM yyyy"), eq(false))).thenReturn(new StringNode("03 2020")); when(dateTimeFormatParser.valueToTextNode(eq("2010-01-30"), eq(BaseType.get(DATE)), anyString(), - eq("dd/MM/yyyy"), eq(false))).thenReturn(new TextNode("30/01/2010")); + eq("dd/MM/yyyy"), eq(false))).thenReturn(new StringNode("30/01/2010")); when(dateTimeFormatParser.valueToTextNode(eq("2020-10-10"), eq(BaseType.get(DATE)), anyString(), - eq("dd/MM/yyyy"), eq(false))).thenReturn(new TextNode("10/10/2020")); + eq("dd/MM/yyyy"), eq(false))).thenReturn(new StringNode("10/10/2020")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); @@ -183,32 +184,32 @@ void shouldFormatComplexFieldsUsingComplexTypeDisplayDCP() throws IOException { @Test void shouldReturnExistingSimpleValueWhenEntryDCP() { setUpBaseType(COLLECTION_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATE); + StringNode value = new StringNode(TEST_DATE); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEENTRY(hhmmss)", fieldType(DATE_FIELD_TYPE), value, DisplayContext.READONLY.name()); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), () -> assertThat(result.getFormattedValue(), is(result.getValue())), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is(TEST_DATE)) + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is(TEST_DATE)) ); } @Test void shouldReturnExistingSimpleValueWhenNoDCP() { setUpBaseType(COLLECTION_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATE); + StringNode value = new StringNode(TEST_DATE); CaseViewField caseViewField = caseViewField(ID, null, fieldType(DATE_FIELD_TYPE), value, DisplayContext.READONLY.name()); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), () -> assertThat(result.getFormattedValue(), is(result.getValue())), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is(TEST_DATE)) + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is(TEST_DATE)) ); } @@ -226,11 +227,11 @@ void shouldReturnExistingCollectionValueWhenNoDCP() throws IOException { () -> assertThat(result.getFormattedValue(), instanceOf(ArrayNode.class)), () -> assertThat(result.getFormattedValue(), is(result.getValue())), () -> assertThat(((ArrayNode) result.getFormattedValue()).size(), is(2)), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asText(), is("id1")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asString(), is("id1")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asString(), is("2020-03-13")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asText(), is("id2")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asString(), is("id2")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asString(), is("2010-10-30")) ); } @@ -267,23 +268,23 @@ void shouldReturnExistingComplexValueWhenNoDCP() throws IOException { @Test void shouldReturnExistingValueForUnsupportedSimpleFieldType() { setUpBaseType("Text"); - TextNode value = new TextNode("TextField"); + StringNode value = new StringNode("TextField"); CaseViewField caseViewField = caseViewField(ID, null, fieldType("Text"), value, DisplayContext.READONLY.name()); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), () -> assertThat(result.getFormattedValue(), is(result.getValue())), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is("TextField")) + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is("TextField")) ); } @Test void shouldThrowExceptionWhenDateTimeCannotBeConverted() { setUpBaseType(DATETIME_FIELD_TYPE); - TextNode value = new TextNode("INVALID"); + StringNode value = new StringNode("INVALID"); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEDISPLAY(dd/MM/yyyy)", fieldType(DATETIME_FIELD_TYPE), value, DisplayContext.READONLY.name()); @@ -298,7 +299,7 @@ void shouldThrowExceptionWhenDateTimeCannotBeConverted() { @Test void shouldThrowExceptionWhenDateCannotBeConverted() { setUpBaseType(DATE_FIELD_TYPE); - TextNode value = new TextNode("INVALID"); + StringNode value = new StringNode("INVALID"); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEDISPLAY(dd/MM/yyyy)", fieldType(DATE_FIELD_TYPE), value, DisplayContext.READONLY.name()); when(dateTimeFormatParser.valueToTextNode("INVALID", BaseType.get(DATE), ID, @@ -317,36 +318,36 @@ class ExecuteCaseViewFieldAndWizardPageFieldTest { @Test void shouldFormatSimpleDateFieldUsingDisplayDCPWhenDisplayContextIsReadonly() { setUpBaseType(DATE_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATE); + StringNode value = new StringNode(TEST_DATE); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEDISPLAY(dd/MM/yyyy)", fieldType(DATE_FIELD_TYPE), value, DisplayContext.READONLY.name()); WizardPageField wizardPageField = wizardPageField(ID, Collections.emptyList()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("13/03/2020")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("13/03/2020")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, wizardPageField); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is("13/03/2020")) + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is("13/03/2020")) ); } @Test void shouldFormatSimpleDateFieldUsingEntryDCPWhenDisplayContextIsMandatory() { setUpBaseType(DATE_FIELD_TYPE); - TextNode value = new TextNode(TEST_DATE); + StringNode value = new StringNode(TEST_DATE); CaseViewField caseViewField = caseViewField(ID, "#DATETIMEENTRY(dd/MM/yyyy)", fieldType(DATE_FIELD_TYPE), value, DisplayContext.MANDATORY.name()); WizardPageField wizardPageField = wizardPageField(ID, Collections.emptyList()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq("dd/MM/yyyy"), eq(false))).thenReturn(new TextNode("13/03/2020")); + eq("dd/MM/yyyy"), eq(false))).thenReturn(new StringNode("13/03/2020")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, wizardPageField); assertAll( - () -> assertThat(result.getFormattedValue(), instanceOf(TextNode.class)), - () -> assertThat(((TextNode) result.getFormattedValue()).asText(), is("13/03/2020")) + () -> assertThat(result.getFormattedValue(), instanceOf(StringNode.class)), + () -> assertThat(((StringNode) result.getFormattedValue()).asString(), is("13/03/2020")) ); } @@ -358,20 +359,20 @@ void shouldFormatCollectionOfDateFieldsUsingDisplayDCP() throws IOException { fieldType(COLLECTION_FIELD_TYPE, fieldType(DATE_FIELD_TYPE)), value, DisplayContext.READONLY.name()); WizardPageField wizardPageField = wizardPageField(ID, Collections.emptyList()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("13/03/2020")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("13/03/2020")); when(dateTimeFormatParser.valueToTextNode(eq("2010-10-30"), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("30/10/2010")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("30/10/2010")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, null); assertAll( () -> assertThat(result.getFormattedValue(), instanceOf(ArrayNode.class)), () -> assertThat(((ArrayNode) result.getFormattedValue()).size(), is(2)), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asText(), is("id1")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("id").asString(), is("id1")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(0).get("value").asString(), is("13/03/2020")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asText(), is("id2")), - () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asText(), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("id").asString(), is("id2")), + () -> assertThat(((ArrayNode) result.getFormattedValue()).get(1).get("value").asString(), is("30/10/2010")) ); } @@ -398,11 +399,11 @@ void shouldFormatComplexFieldsWithNoDisplayContextOverrides() throws IOException complexNestedField)); WizardPageField wizardPageField = wizardPageField(ID, Collections.emptyList()); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq("MM yyyy"), eq(false))).thenReturn(new TextNode("03 2020")); + eq("MM yyyy"), eq(false))).thenReturn(new StringNode("03 2020")); when(dateTimeFormatParser.valueToTextNode(eq("2010-01-30"), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("30/01/2010")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("30/01/2010")); when(dateTimeFormatParser.valueToTextNode(eq("2020-10-10"), eq(BaseType.get(DATE)), anyString(), - eq(TEST_FORMAT), eq(false))).thenReturn(new TextNode("10/10/2020")); + eq(TEST_FORMAT), eq(false))).thenReturn(new StringNode("10/10/2020")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, wizardPageField); @@ -452,13 +453,13 @@ void shouldFormatComplexFieldsWithDisplayContextOverrides() throws IOException { wizardPageField(ID, Arrays.asList(nestedDateFieldOverride, nestedCollectionDateFieldOverride, complexDateFieldOverride)); when(dateTimeFormatParser.valueToTextNode(eq(TEST_DATE), eq(BaseType.get(DATE)), anyString(), - eq("yyyy"), eq(false))).thenReturn(new TextNode("2020")); + eq("yyyy"), eq(false))).thenReturn(new StringNode("2020")); when(dateTimeFormatParser.valueToTextNode(eq("2010-01-30"), eq(BaseType.get(DATE)), anyString(), - eq("MM"), eq(false))).thenReturn(new TextNode("01")); + eq("MM"), eq(false))).thenReturn(new StringNode("01")); when(dateTimeFormatParser.valueToTextNode(eq("2020-10-10"), eq(BaseType.get(DATE)), anyString(), - eq("MM"), eq(false))).thenReturn(new TextNode("10")); + eq("MM"), eq(false))).thenReturn(new StringNode("10")); when(dateTimeFormatParser.valueToTextNode(eq("1990-01-01"), eq(BaseType.get(DATE)), anyString(), - eq("d"), eq(false))).thenReturn(new TextNode("1")); + eq("d"), eq(false))).thenReturn(new StringNode("1")); CaseViewField result = dateTimeValueFormatter.execute(caseViewField, wizardPageField); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/AuthorisedSearchOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/AuthorisedSearchOperationTest.java index a1f278865e..9c8f62a410 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/AuthorisedSearchOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/AuthorisedSearchOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.search; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Sets; import java.util.Arrays; import java.util.HashMap; @@ -51,7 +51,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.AccessControlService.CAN_READ; class AuthorisedSearchOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_TYPE_ID = "GrantOnly"; private static final String JURISDICTION_ID = "Probate"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CaseSearchRequestTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CaseSearchRequestTest.java index 84a0b33a27..03f2065d40 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CaseSearchRequestTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CaseSearchRequestTest.java @@ -6,8 +6,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -19,7 +20,7 @@ class CaseSearchRequestTest { private static final String CASE_TYPE_ID = "caseTypeId"; private static final String FULL_QUERY = "{\"query\":{\"field\":\"value\"},\"sort\":{}}"; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private CaseSearchRequest caseSearchRequest; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequestTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequestTest.java index 456ff635fe..d87670c7f4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequestTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/CrossCaseTypeSearchRequestTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -26,7 +27,7 @@ class CrossCaseTypeSearchRequestTest { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private static final String NAME = "name"; private static final String ALIAS_NAME = "alias." + NAME; @@ -37,7 +38,7 @@ class CrossCaseTypeSearchRequestTest { @Test @DisplayName("should throw exception when query node not found") - void shouldThrowExceptionWhenQueryNodeNotFound() throws JsonProcessingException { + void shouldThrowExceptionWhenQueryNodeNotFound() throws JacksonException { // ARRANGE String query = "{}"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperationTest.java index e0a73e5e93..af86288b6a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchCaseSearchOperationTest.java @@ -9,9 +9,9 @@ import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation; import co.elastic.clients.json.JsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelperTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelperTest.java index 02b23c4540..1a44c81d01 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelperTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchQueryHelperTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -107,7 +108,7 @@ class ElasticsearchQueryHelperTest { @Mock private UserRepository userRepository; - private final ObjectMapper objectMapperES = new ObjectMapper(); + private final ObjectMapper objectMapperES = JsonMapper.builderWithJackson2Defaults().build(); @Mock private CaseTypeDefinition caseTypeDefinition; @@ -235,7 +236,7 @@ void shouldPreserveSearchAfterInConvertedElasticSearchRequest() { assertAll( () -> assertTrue(elasticsearchRequest.getNativeSearchRequest().has("search_after")), () -> assertThat(searchAfterNode.get(0).asLong(), is(123456789L)), - () -> assertThat(searchAfterNode.get(1).asText(), is("case-2")) + () -> assertThat(searchAfterNode.get(1).asString(), is("case-2")) ); } @@ -243,7 +244,7 @@ void shouldPreserveSearchAfterInConvertedElasticSearchRequest() { void shouldConvertWrappedQueryToElasticSearchRequest() { String searchRequest = """ - {"native_es_query":{"query":{}},"supplementary_data":["Field1","Field2"]}} + {"native_es_query":{"query":{}},"supplementary_data":["Field1","Field2"]} """; ElasticsearchRequest elasticsearchRequest @@ -281,8 +282,8 @@ void shouldNormaliseRangeQueryFromTo() { () -> assertFalse(rangeNode.has(TO)), () -> assertFalse(rangeNode.has(INCLUDE_LOWER)), () -> assertFalse(rangeNode.has(INCLUDE_UPPER)), - () -> assertThat(rangeNode.get(GT).asText(), is("2020-01-01")), - () -> assertThat(rangeNode.get(LT).asText(), is("2020-02-01")) + () -> assertThat(rangeNode.get(GT).asString(), is("2020-01-01")), + () -> assertThat(rangeNode.get(LT).asString(), is("2020-02-01")) ); } @@ -358,8 +359,8 @@ void shouldNormaliseRangeQueryComplex() { () -> assertFalse(rangeNode.has(TO)), () -> assertFalse(rangeNode.has(INCLUDE_LOWER)), () -> assertFalse(rangeNode.has(INCLUDE_UPPER)), - () -> assertThat(rangeNode.get(GTE).asText(), is("10")), - () -> assertThat(rangeNode.get(LT).asText(), is("101")) + () -> assertThat(rangeNode.get(GTE).asString(), is("10")), + () -> assertThat(rangeNode.get(LT).asString(), is("101")) ); } @@ -381,8 +382,8 @@ void shouldNormaliseRangeQueryComplexOperatorCombinations(String rangeFieldsJson () -> assertFalse(rangeNode.has(TO)), () -> assertFalse(rangeNode.has(INCLUDE_LOWER)), () -> assertFalse(rangeNode.has(INCLUDE_UPPER)), - () -> assertThat(rangeNode.get(expectedLowerKey).asText(), is(expectedLowerValue)), - () -> assertThat(rangeNode.get(expectedUpperKey).asText(), is(expectedUpperValue)) + () -> assertThat(rangeNode.get(expectedLowerKey).asString(), is(expectedLowerValue)), + () -> assertThat(rangeNode.get(expectedUpperKey).asString(), is(expectedUpperValue)) ); } @@ -413,7 +414,7 @@ void shouldRejectBlacklistedSearchQueriesWithRuntimeMappings() { @Test void shouldErrorWhenSupplementaryDataIsNotAnArray() { String searchRequest - = "{\"native_es_query\":{\"query\":{}},\"supplementary_data\":{\"object\":\"value\"}}}"; + = "{\"native_es_query\":{\"query\":{}},\"supplementary_data\":{\"object\":\"value\"}}"; BadSearchRequest exception = assertThrows(BadSearchRequest.class, () -> elasticsearchQueryHelper.validateAndConvertRequest(searchRequest)); @@ -427,7 +428,7 @@ void shouldErrorWhenSupplementaryDataIsNotAnArray() { @Test void shouldErrorWhenSupplementaryDataIsAnArrayOfNonTextFields() { String searchRequest - = "{\"native_es_query\":{\"query\":{}},\"supplementary_data\":[{\"array\":\"object\"}]}}"; + = "{\"native_es_query\":{\"query\":{}},\"supplementary_data\":[{\"array\":\"object\"}]}"; BadSearchRequest exception = assertThrows(BadSearchRequest.class, () -> elasticsearchQueryHelper.validateAndConvertRequest(searchRequest)); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortServiceTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortServiceTest.java index ab12670561..e46f0800d7 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortServiceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/ElasticsearchSortServiceTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -83,7 +84,7 @@ class ElasticsearchSortServiceTest { @Mock private ElasticsearchMappings elasticsearchMappings; - private ObjectMapper objectMapperES = new ObjectMapper(); + private ObjectMapper objectMapperES = JsonMapper.builderWithJackson2Defaults().build(); @Mock private CaseTypeDefinition caseTypeDefinition; @@ -113,7 +114,7 @@ void setUp() { } @Test - void shouldApplyConfiguredSortForMetadataFields() throws JsonProcessingException { + void shouldApplyConfiguredSortForMetadataFields() throws JacksonException { sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(JURISDICTION).metadata(true).direction(ASC) .build()); sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(LAST_MODIFIED_DATE).metadata(true) @@ -135,7 +136,7 @@ void shouldApplyConfiguredSortForMetadataFields() throws JsonProcessingException } @Test - void shouldApplyConfiguredSortForCaseDataFields() throws JsonProcessingException { + void shouldApplyConfiguredSortForCaseDataFields() throws JacksonException { sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(TEXT_FIELD_ID).direction(ASC).build()); sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(DATE_FIELD_ID).direction(DESC).build()); sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(COLLECTION_TEXT_FIELD_ID) @@ -160,7 +161,7 @@ void shouldApplyConfiguredSortForCaseDataFields() throws JsonProcessingException } @Test - void shouldNotApplyConfiguredSortWhenRequestContainsSortOverride() throws JsonProcessingException { + void shouldNotApplyConfiguredSortWhenRequestContainsSortOverride() throws JacksonException { sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId(JURISDICTION).metadata(true).direction(ASC) .build()); String searchRequest = "{\"query\":{},\"sort\":[{\"data.TextField.keyword\":\"ASC\"}]}"; @@ -176,7 +177,7 @@ void shouldNotApplyConfiguredSortWhenRequestContainsSortOverride() throws JsonPr } @Test - void shouldApplyDefaultSortWhenNoSortsAreConfigured() throws JsonProcessingException { + void shouldApplyDefaultSortWhenNoSortsAreConfigured() throws JacksonException { String searchRequest = "{\"query\":{}}"; ElasticsearchRequest elasticsearchRequest = new ElasticsearchRequest(objectMapperES.readValue(searchRequest, ObjectNode.class)); @@ -190,7 +191,7 @@ void shouldApplyDefaultSortWhenNoSortsAreConfigured() throws JsonProcessingExcep } @Test - void shouldThrowExceptionWhenSortOrderCaseFieldIsNotInCaseType() throws JsonProcessingException { + void shouldThrowExceptionWhenSortOrderCaseFieldIsNotInCaseType() throws JacksonException { sortOrderFields.add(SortOrderField.sortOrderWith().caseFieldId("UnknownCaseField").direction(ASC).build()); ElasticsearchRequest elasticsearchRequest = new ElasticsearchRequest(objectMapperES.readValue(QUERY_STRING, ObjectNode.class)); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverterTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverterTest.java index af3ae5acee..6d56b98c3e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverterTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/JestToESConverterTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch; -import co.elastic.clients.json.jackson.JacksonJsonpMapper; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import co.elastic.clients.json.jackson.Jackson3JsonpMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import co.elastic.clients.elasticsearch.core.MsearchRequest; import co.elastic.clients.elasticsearch.core.msearch.RequestItem; import io.searchbox.core.Search; @@ -19,7 +20,7 @@ class JestToESConverterTest { - private final ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); @Test void fromJest_shouldConvertSingleSearch() { @@ -76,7 +77,7 @@ void fromJest_shouldPreserveSearchAfterInConvertedBody() throws Exception { RequestItem item = request.searches().get(0); StringWriter writer = new StringWriter(); - var mapper = new JacksonJsonpMapper(); + var mapper = new Jackson3JsonpMapper(); var generator = mapper.jsonProvider().createGenerator(writer); item.body().serialize(generator, mapper); generator.close(); @@ -89,7 +90,7 @@ void fromJest_shouldPreserveSearchAfterInConvertedBody() throws Exception { () -> assertTrue(bodyJson.has("size")), () -> assertTrue(bodyJson.has("search_after")), () -> assertEquals(123456789L, bodyJson.get("search_after").get(0).asLong()), - () -> assertEquals("case-2", bodyJson.get("search_after").get(1).asText()) + () -> assertEquals("case-2", bodyJson.get("search_after").get(1).asString()) ); } @@ -111,7 +112,7 @@ void fromJest_shouldPreserveSearchAfterWhenSourceIsArray() throws Exception { RequestItem item = request.searches().get(0); StringWriter writer = new StringWriter(); - var mapper = new JacksonJsonpMapper(); + var mapper = new Jackson3JsonpMapper(); var generator = mapper.jsonProvider().createGenerator(writer); item.body().serialize(generator, mapper); generator.close(); @@ -122,7 +123,7 @@ void fromJest_shouldPreserveSearchAfterWhenSourceIsArray() throws Exception { () -> assertTrue(bodyJson.has("_source")), () -> assertTrue(bodyJson.has("search_after")), () -> assertEquals(987654321L, bodyJson.get("search_after").get(0).asLong()), - () -> assertEquals("case-3", bodyJson.get("search_after").get(1).asText()) + () -> assertEquals("case-3", bodyJson.get("search_after").get(1).asString()) ); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperationTest.java index 83a702dfde..950782f522 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/AuthorisedCaseSearchOperationTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.security; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -202,9 +202,9 @@ void shouldPreserveSearchIndexPropertyInExecuteCall() { anyBoolean())).thenReturn(searchResult); ObjectNode dataNode = JsonNodeFactory.instance.objectNode(); - dataNode.set("firstName", JsonNodeFactory.instance.textNode("Baker")); + dataNode.set("firstName", JsonNodeFactory.instance.stringNode("Baker")); ObjectNode complexNode = JsonNodeFactory.instance.objectNode(); - complexNode.set("postcode", JsonNodeFactory.instance.textNode("W4")); + complexNode.set("postcode", JsonNodeFactory.instance.stringNode("W4")); dataNode.set("personAddress", complexNode); when(objectMapperService.convertObjectToJsonNode(anyMap())) .thenReturn(dataNode); @@ -244,9 +244,9 @@ void shouldTransformMultiCaseTypeSearchResults() { anyBoolean())).thenReturn(searchResult); ObjectNode dataNode = JsonNodeFactory.instance.objectNode(); - dataNode.set("firstName", JsonNodeFactory.instance.textNode("Baker")); + dataNode.set("firstName", JsonNodeFactory.instance.stringNode("Baker")); ObjectNode complexNode = JsonNodeFactory.instance.objectNode(); - complexNode.set("postcode", JsonNodeFactory.instance.textNode("W4")); + complexNode.set("postcode", JsonNodeFactory.instance.stringNode("W4")); dataNode.set("personAddress", complexNode); when(objectMapperService.convertObjectToJsonNode(anyMap())) .thenReturn(dataNode); @@ -274,7 +274,7 @@ void shouldTransformAliasFieldForCollection() { ObjectNode dataNode = JsonNodeFactory.instance.objectNode(); ObjectNode textNode = JsonNodeFactory.instance.objectNode(); - textNode.set("value", JsonNodeFactory.instance.textNode("some text")); + textNode.set("value", JsonNodeFactory.instance.stringNode("some text")); ArrayNode collectionNode = JsonNodeFactory.instance.arrayNode(); collectionNode.add(textNode); dataNode.set("collectionField", collectionNode); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityRATest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityRATest.java index f6bd7d81d9..6c16e97391 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityRATest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityRATest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.security; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ObjectNode; import org.elasticsearch.index.query.QueryBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityTest.java index 74473bc1a5..8403014c8f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/elasticsearch/security/ElasticsearchCaseSearchRequestSecurityTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.search.elasticsearch.security; -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 tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.json.JSONException; @@ -61,7 +61,8 @@ class ElasticsearchCaseSearchRequestSecurityTest { @Mock private AccessControlGrantTypeESQueryBuilder grantTypeESQueryBuilder; - private final ObjectMapperService objectMapperService = new DefaultObjectMapperService(new ObjectMapper()); + private final ObjectMapperService objectMapperService = + new DefaultObjectMapperService(JsonMapper.builderWithJackson2Defaults().build()); private JsonNode searchRequestNode; private ElasticsearchRequest elasticsearchRequest; @@ -96,7 +97,7 @@ void shouldSecureRequest() { assertEquals(CASE_TYPE_ID_1, securedSearchRequest.getCaseTypeId()); assertEquals(EXPECTED_SEARCH_TERM, decodedQuery); assertEquals(FILTER_VALUE_1, jsonNode.at("/query/bool/filter").get(0).at("/term/filterTermValue/value") - .asText()); + .asString()); } @Test @@ -163,13 +164,13 @@ void shouldSecureCrossCaseTypeRequestWithFiltersVerifyFilters() { Map mapOfFilterValues = createMapOfFilterValues(securedSearchRequest.getSearchRequestJsonNode()); assertEquals(FILTER_VALUE_1, mapOfFilterValues.get(CASE_TYPE_ID_1.toLowerCase()).at("/bool/must").get(0) - .at("/term/filterTermValue/value").asText()); + .at("/term/filterTermValue/value").asString()); assertEquals(FILTER_VALUE_2, mapOfFilterValues.get(CASE_TYPE_ID_2.toLowerCase()).at("/bool/must").get(0) - .at("/term/filterTermValue/value").asText()); + .at("/term/filterTermValue/value").asString()); assertEquals(CASE_TYPE_ID_1.toLowerCase(), mapOfFilterValues.get(CASE_TYPE_ID_1.toLowerCase()).at("/bool/must") - .get(1).at("/term/case_type_id/value").asText()); + .get(1).at("/term/case_type_id/value").asString()); assertEquals(CASE_TYPE_ID_2.toLowerCase(), mapOfFilterValues.get(CASE_TYPE_ID_2.toLowerCase()).at("/bool/must") - .get(1).at("/term/case_type_id/value").asText()); + .get(1).at("/term/case_type_id/value").asString()); } @Test @@ -294,7 +295,7 @@ private String getDecodedQuery(JsonNode node) { } private String decodedQuery(JsonNode queryJsonNode) { - return new String(Base64.getDecoder().decode(queryJsonNode.asText())); + return new String(Base64.getDecoder().decode(queryJsonNode.asString())); } private QueryBuilder newQueryBuilder(String value) { @@ -309,7 +310,7 @@ private Map createMapOfFilterValues(JsonNode jsonNode) { for (JsonNode mustNode : shouldNode.at("/bool/must")) { if (!mustNode.at("/term/case_type_id").isEmpty()) { values.put( - mustNode.at("/term/case_type_id/value").asText(), + mustNode.at("/term/case_type_id/value").asString(), shouldNode ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilderTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilderTest.java index d18c626841..58d5f312fb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchQueryBuilderTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; import org.apache.commons.collections.CollectionUtils; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.MatchPhraseQueryBuilder; @@ -62,7 +62,8 @@ class GlobalSearchQueryBuilderTest { @DisplayName("GlobalSearch Query") class GlobalSearchQuery { - private final ObjectMapperService objectMapperService = new DefaultObjectMapperService(new ObjectMapper()); + private final ObjectMapperService objectMapperService = + new DefaultObjectMapperService(JsonMapper.builderWithJackson2Defaults().build()); @DisplayName("Null Check: should return empty QueryBuilder when supplied with null request") @Test @@ -460,7 +461,7 @@ private String getMatchPhraseValue(QueryBuilder queryBuilder, String fieldName) private String getNestedQueriesPathValue(QueryBuilder queryBuilder) { // NB: cannot read nested path value so force into JSON JsonNode jsonNode = objectMapperService.convertStringToObject(queryBuilder.toString(), JsonNode.class); - return jsonNode != null ? jsonNode.at("/nested/path").asText() : null; + return jsonNode != null ? jsonNode.at("/nested/path").asString() : null; } private RangeQueryBuilder getRangeQueryBuilder(QueryBuilder queryBuilder, String fieldName) { diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformerTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformerTest.java index f81f55fa89..f9cf412f4e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchResponseTransformerTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import lombok.val; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImplTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImplTest.java index 6d53d91291..8bb5a42efb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImplTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/search/global/GlobalSearchServiceImplTest.java @@ -1,9 +1,10 @@ package uk.gov.hmcts.ccd.domain.service.search.global; -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 tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ArrayNode; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.sort.FieldSortBuilder; @@ -70,7 +71,8 @@ class GlobalSearchServiceImplTest extends TestFixtures { @Spy @SuppressWarnings("unused") // needed to set up GlobalSearchServiceImpl - private ObjectMapperService objectMapperService = new DefaultObjectMapperService(new ObjectMapper()); + private ObjectMapperService objectMapperService = + new DefaultObjectMapperService(JsonMapper.builderWithJackson2Defaults().build()); @Mock private ReferenceDataRepository referenceDataRepository; @@ -195,7 +197,7 @@ class AssembleSearchQuery { QueryBuilder expectedBuilder; ElasticsearchRequest expectedElasticsearchRequest; - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @DisplayName("Null Check: should return null if supplied with null request or query") @Test @@ -349,10 +351,10 @@ void shouldGenerateSearchRequestWithSupplementaryDataFields() throws Exception { assertNotNull(output.getElasticSearchRequest()); assertNotNull(output.getElasticSearchRequest().getRequestedSupplementaryData()); ArrayNode supplementaryData = output.getElasticSearchRequest().getRequestedSupplementaryData(); - assertEquals(supplementaryDataField1, supplementaryData.get(0).asText()); + assertEquals(supplementaryDataField1, supplementaryData.get(0).asString()); assertAll( () -> assertEquals(1, supplementaryData.size()), - () -> assertEquals(supplementaryDataField1, supplementaryData.get(0).asText()) + () -> assertEquals(supplementaryDataField1, supplementaryData.get(0).asString()) ); } @@ -559,12 +561,12 @@ private FieldSortBuilder createSimpleSortBuilder(String fieldName) { .fieldSort(fieldName); } - private ElasticsearchRequest createSimpleElasticsearchRequest() throws JsonProcessingException { + private ElasticsearchRequest createSimpleElasticsearchRequest() throws JacksonException { JsonNode queryNode = mapper.readTree("{\"query\":" + createSimpleQueryBuilder() + "}"); return new ElasticsearchRequest(queryNode); } - private void mockInternalCalls() throws JsonProcessingException { + private void mockInternalCalls() throws JacksonException { request = new GlobalSearchRequestPayload(); request.setSearchCriteria(new SearchCriteria()); // NB: must not be empty diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/AuthorisedStartEventOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/AuthorisedStartEventOperationTest.java index 6356b7b9d9..dcf23e9568 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/AuthorisedStartEventOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/AuthorisedStartEventOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.startevent; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import java.util.List; @@ -54,7 +54,7 @@ class AuthorisedStartEventOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_TYPE_ID = "GrantOnly"; private static final String CASE_REFERENCE = "1234123412341234"; private static final String EVENT_TRIGGER_ID = "updateEvent"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperationTest.java index 0d37b5cd2d..2492a679f2 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/startevent/DefaultStartEventOperationTest.java @@ -5,9 +5,9 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -85,14 +85,14 @@ public class DefaultStartEventOperationTest { private static final String PRIVATE = SecurityClassification.PRIVATE.name(); private static final Map DATA_CLASSIFICATION = Maps.newHashMap(); private static final Map DEFAULT_VALUE_DATA = expectedDefaultValue(); - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final int TTL_INCREMENT = 20; private static final Map NEW_FIELDS_CLASSIFICATION = - Map.of("key", JSON_NODE_FACTORY.textNode("value")); + Map.of("key", JSON_NODE_FACTORY.stringNode("value")); private static final Map NEW_FIELDS_CLASSIFICATION_TTL = - Map.of("key", JSON_NODE_FACTORY.textNode("value_with_ttl")); + Map.of("key", JSON_NODE_FACTORY.stringNode("value_with_ttl")); static Map expectedDefaultValue() { Map data = new HashMap<>(); @@ -115,11 +115,11 @@ static Map expectedDefaultValue() { + "}"); data.put("OrganisationPolicyField", orgPolicyDefaultValue); - data.put("TextField0", MAPPER.getNodeFactory().textNode("Default text")); + data.put("TextField0", MAPPER.getNodeFactory().stringNode("Default text")); - data.put("TextField1", MAPPER.getNodeFactory().textNode("Should not replace existing text")); + data.put("TextField1", MAPPER.getNodeFactory().stringNode("Should not replace existing text")); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); } return data; @@ -147,12 +147,12 @@ static Map existingCaseData() { + "}"); data.put("OrganisationPolicyField", orgPolicy); - data.put("TextField1", MAPPER.getNodeFactory().textNode("Existing text")); + data.put("TextField1", MAPPER.getNodeFactory().stringNode("Existing text")); data.put("TextField0", MAPPER.getNodeFactory().nullNode()); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); } return data; @@ -169,7 +169,7 @@ static Map ttlCaseData(String systemTtl) { + "}"); data.put("TTL", ttl); - } catch (JsonProcessingException ex) { + } catch (JacksonException ex) { ex.printStackTrace(); } @@ -198,11 +198,11 @@ static Map expectedAfterMergeWithDefaultValue() { + "}"); data.put("OrganisationPolicyField", orgPolicy); - data.put("TextField0", MAPPER.getNodeFactory().textNode("Default text")); + data.put("TextField0", MAPPER.getNodeFactory().stringNode("Default text")); - data.put("TextField1", MAPPER.getNodeFactory().textNode("Existing text")); + data.put("TextField1", MAPPER.getNodeFactory().stringNode("Existing text")); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { e.printStackTrace(); } return data; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvokerTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvokerTest.java index 8b27be184a..776e529c6b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvokerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/stdapi/CallbackInvokerTest.java @@ -1,11 +1,11 @@ package uk.gov.hmcts.ccd.domain.service.stdapi; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.IntNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.StringNode; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; @@ -93,7 +93,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.DataClassificationBuilder.aClassificationBuilder; class CallbackInvokerTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final Boolean IGNORE_WARNING = true; private static final String URL_ABOUT_TO_START = "http://about-to-start"; private static final String URL_ABOUT_TO_SUBMIT = "http://about-to-submit"; @@ -213,7 +213,7 @@ void shouldDisableCallbackRetries() { @Test @DisplayName("should handle exception in printCallbackDetails gracefully") - void shouldHandleExceptionInPrintCallbackDetailsGracefully() throws JsonProcessingException { + void shouldHandleExceptionInPrintCallbackDetailsGracefully() throws JacksonException { when(applicationParams.getCcdCallbackLogControl()).thenReturn(Collections.singletonList("*")); doNothing().when(appinsights).trackCallbackEvent(any(), anyString(), anyString(), any(Duration.class)); @@ -609,7 +609,7 @@ void shouldNotUpdateSecurityClassificationIfCallbackDataIsNull() { private CallbackResponse mockCallbackResponse(final String state) { final CallbackResponse response = new CallbackResponse(); final Map data = new HashMap<>(); - data.put("state", JsonNodeFactory.instance.textNode(state)); + data.put("state", JsonNodeFactory.instance.stringNode(state)); response.setData(data); return response; } @@ -622,7 +622,7 @@ private CallbackResponse mockCallbackResponseWithSignificantItem(final String st significantItem.setType(SignificantItemType.DOCUMENT.name()); response.setSignificantItem(significantItem); final Map data = new HashMap<>(); - data.put("state", JsonNodeFactory.instance.textNode(state)); + data.put("state", JsonNodeFactory.instance.stringNode(state)); response.setData(data); return response; } @@ -635,7 +635,7 @@ private CallbackResponse mockCallbackResponseWithIncorrectSignificantItem(final response.setSignificantItem(significantItem); final Map data = new HashMap<>(); - data.put("state", JsonNodeFactory.instance.textNode(state)); + data.put("state", JsonNodeFactory.instance.stringNode(state)); response.setData(data); return response; } @@ -782,7 +782,7 @@ class AboutToStart { void validateAndSetDataForAboutToStart() { final CallbackResponse callbackResponse = new CallbackResponse(); final Map data = new HashMap<>(); - data.put("xxx", TextNode.valueOf("ngitb")); + data.put("xxx", StringNode.valueOf("ngitb")); callbackResponse.setData(data); HashMap currentDataClassification = Maps.newHashMap(); when(caseDataService.getDefaultSecurityClassifications(caseTypeDefinition, @@ -896,11 +896,11 @@ public void setup() { caseDetails.setDataClassification(currentDataClassification); caseDetails.setData(data); callbackResponse.setData(data); - currentDataClassification.put("currentKey", JSON_NODE_FACTORY.textNode("currentValue")); + currentDataClassification.put("currentKey", JSON_NODE_FACTORY.stringNode("currentValue")); caseDetails.setState("BAYAN"); - newFieldsDataClassification.put("key", JSON_NODE_FACTORY.textNode("value")); + newFieldsDataClassification.put("key", JSON_NODE_FACTORY.stringNode("value")); - allFieldsDataClassification.put("key", JSON_NODE_FACTORY.textNode("otherValue")); + allFieldsDataClassification.put("key", JSON_NODE_FACTORY.stringNode("otherValue")); callbackResponse.setSecurityClassification(PRIVATE); callbackResponse.setDataClassification(allFieldsDataClassification); when(callbackService.send(caseEventDefinition.getCallBackURLAboutToSubmitEvent(), @@ -923,7 +923,7 @@ public void setup() { @Test void doNotValidateCallbackResponseIfNoDataSecurityPassedBack() { callbackResponse.setDataClassification(null); - data.put("state", TextNode.valueOf("ngitb")); + data.put("state", StringNode.valueOf("ngitb")); callbackInvoker.invokeAboutToSubmitCallback(caseEventDefinition, caseDetailsBefore, caseDetails, caseTypeDefinition, TRUE); @@ -948,7 +948,7 @@ void doNotValidateCallbackResponseIfNoDataSecurityPassedBack() { @Test void doNotValidateCallbackResponseIfNoCaseSecurityPassedBack() { callbackResponse.setSecurityClassification(null); - data.put("state", TextNode.valueOf("ngitb")); + data.put("state", StringNode.valueOf("ngitb")); callbackResponse.setState(null); callbackInvoker.invokeAboutToSubmitCallback(caseEventDefinition, caseDetailsBefore, caseDetails, caseTypeDefinition, TRUE); @@ -1011,7 +1011,7 @@ void doNotValidateCallbackResponseAndDoNotSetSate() { @DisplayName("validate call back response and set case details state for about to submit") @Test void validateAndSetStateForAboutToSubmit() { - data.put("state", TextNode.valueOf("ngitb")); + data.put("state", StringNode.valueOf("ngitb")); callbackResponse.setState("toto"); callbackInvoker.invokeAboutToSubmitCallback(caseEventDefinition, caseDetailsBefore, caseDetails, @@ -1104,7 +1104,7 @@ class MidEvent { void validateAndSetDataForAboutToStart() { final CallbackResponse callbackResponse = new CallbackResponse(); final Map data = new HashMap<>(); - data.put("xxx", TextNode.valueOf("ngitb")); + data.put("xxx", StringNode.valueOf("ngitb")); callbackResponse.setData(data); HashMap currentDataClassification = Maps.newHashMap(); when(caseDataService.getDefaultSecurityClassifications(caseTypeDefinition, data, @@ -1211,7 +1211,7 @@ void resolveStateInsideDataSectionOnly() { final CallbackResponse callbackResponse = new CallbackResponse(); final Map data = new HashMap<>(); - data.put("state", TextNode.valueOf("stateInDataSection")); + data.put("state", StringNode.valueOf("stateInDataSection")); data.put("blah", IntNode.valueOf(678)); callbackResponse.setData(data); @@ -1254,7 +1254,7 @@ void resolveTopLevelStateAndSateInDataSection() { final Map data = new HashMap<>(); data.put("blah", IntNode.valueOf(678)); - data.put("state", TextNode.valueOf("stateInDataSection")); + data.put("state", StringNode.valueOf("stateInDataSection")); callbackResponse.setData(data); callbackResponse.setState("stateInTopLevel"); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DefaultSupplementaryDataUpdateOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DefaultSupplementaryDataUpdateOperationTest.java index 9680fb9cb8..4b43952ca2 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DefaultSupplementaryDataUpdateOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DefaultSupplementaryDataUpdateOperationTest.java @@ -1,7 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.supplementarydata; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -25,7 +26,7 @@ class DefaultSupplementaryDataUpdateOperationTest { - private ObjectMapper mapper = new ObjectMapper(); + private ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); private static final String CASE_REFERENCE = "12345677"; @@ -108,7 +109,7 @@ private Map> convertData(String jsonRquest) { Map> requestData; try { requestData = mapper.readValue(jsonRquest, Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { requestData = new HashMap<>(); } return requestData; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DelegatingSupplementaryDataUpdateOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DelegatingSupplementaryDataUpdateOperationTest.java index c4fe91d61b..88cd40cd37 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DelegatingSupplementaryDataUpdateOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/supplementarydata/DelegatingSupplementaryDataUpdateOperationTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.service.supplementarydata; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/upsertdraft/DefaultUpsertDraftOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/upsertdraft/DefaultUpsertDraftOperationTest.java index 34ace883a1..b981e5de08 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/upsertdraft/DefaultUpsertDraftOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/upsertdraft/DefaultUpsertDraftOperationTest.java @@ -21,7 +21,7 @@ import static uk.gov.hmcts.ccd.domain.service.common.TestBuildersUtil.JurisdictionBuilder.newJurisdiction; import static uk.gov.hmcts.ccd.domain.service.upsertdraft.DefaultUpsertDraftOperation.CASE_DATA_CONTENT; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperationTest.java index 6c4e03acba..d8e476de73 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/AuthorisedValidateCaseFieldsOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -44,7 +44,7 @@ import static uk.gov.hmcts.ccd.config.JacksonUtils.DATA; class AuthorisedValidateCaseFieldsOperationTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_TYPE_ID = "GrantOnly"; private static final String PAGE_ID = "1"; private static final String USER_ROLE_1 = "user-role-1"; @@ -90,11 +90,11 @@ void shouldSkipVerifyAccessWhenCaseTypeIdIsExcluded() { CaseDataContent content = new CaseDataContent(); content.setCaseReference(CASE_REFERENCE); Map inputData = new HashMap<>(); - inputData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + inputData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); content.setData(inputData); Map midEventData = new HashMap<>(); - midEventData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + midEventData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); when(midEventCallback.invoke(eq(CASE_TYPE_ID), eq(content), eq(PAGE_ID))) .thenReturn(midEventData); @@ -110,7 +110,7 @@ void shouldSkipVerifyAccessWhenCaseTypeIdIsExcluded() { () -> assertNotNull(result), () -> assertNotEquals(inputData, result), () -> assertTrue(result.containsKey("data")), - () -> assertEquals("value1", result.get("data").get("field1").asText()), + () -> assertEquals("value1", result.get("data").get("field1").asString()), () -> verify(caseAccessService, never()).getAccessProfilesByCaseReference(anyString()), () -> verify(caseDefinitionRepository, never()).getCaseType(anyString()) ); @@ -156,7 +156,7 @@ void shouldContinueVerifyAccessWhenCaseTypeIdNotExcluded() { () -> verify(caseAccessService).getAccessProfilesByCaseReference(CASE_REFERENCE), () -> verify(caseDefinitionRepository).getCaseType(CASE_TYPE_ID), () -> assertNotNull(result), - () -> assertEquals("filtered_value1", result.get(DATA).get("filtered_field1").asText()) + () -> assertEquals("filtered_value1", result.get(DATA).get("filtered_field1").asString()) ); } @@ -259,7 +259,7 @@ void shouldReturnCaseDetailsWithRestoredMissingField() { () -> assertNotNull(result), () -> assertTrue(result.containsKey(DATA)), () -> assertEquals(3, result.get(DATA).size()), - () -> assertEquals("restored_value", result.get(DATA).get("restored_field").asText()) + () -> assertEquals("restored_value", result.get(DATA).get("restored_field").asString()) ); } @@ -312,12 +312,12 @@ void shouldInvokeMidEventCallbackAndUpdateContentData() { content.setCaseReference(CASE_REFERENCE); Map inputData = new HashMap<>(); - inputData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + inputData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); content.setData(inputData); Map callbackResponseData = new HashMap<>(); - callbackResponseData.put("field1", JSON_NODE_FACTORY.textNode("updatedValue1")); - callbackResponseData.put("field2", JSON_NODE_FACTORY.textNode("value2")); + callbackResponseData.put("field1", JSON_NODE_FACTORY.stringNode("updatedValue1")); + callbackResponseData.put("field2", JSON_NODE_FACTORY.stringNode("value2")); OperationContext operationContext = new OperationContext(CASE_TYPE_ID, content, PAGE_ID); @@ -344,11 +344,11 @@ void shouldInvokeMidEventCallbackWithEmptyPageId() { content.setCaseReference(CASE_REFERENCE); Map inputData = new HashMap<>(); - inputData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + inputData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); content.setData(inputData); Map callbackResponseData = new HashMap<>(); - callbackResponseData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + callbackResponseData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); OperationContext operationContext = new OperationContext(CASE_TYPE_ID, content, ""); @@ -369,11 +369,11 @@ void shouldInvokeMidEventCallbackWithNullPageId() { content.setCaseReference(CASE_REFERENCE); Map inputData = new HashMap<>(); - inputData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + inputData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); content.setData(inputData); Map callbackResponseData = new HashMap<>(); - callbackResponseData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + callbackResponseData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); OperationContext operationContext = new OperationContext(CASE_TYPE_ID, content, null); @@ -394,12 +394,12 @@ void shouldInvokeMidEventCallbackAndPreserveDataWhenContinuingVerifyAccess() { content.setCaseReference(CASE_REFERENCE); Map inputData = new HashMap<>(); - inputData.put("field1", JSON_NODE_FACTORY.textNode("value1")); + inputData.put("field1", JSON_NODE_FACTORY.stringNode("value1")); content.setData(inputData); Map callbackResponseData = new HashMap<>(); - callbackResponseData.put("field1", JSON_NODE_FACTORY.textNode("callbackValue1")); - callbackResponseData.put("field2", JSON_NODE_FACTORY.textNode("callbackValue2")); + callbackResponseData.put("field1", JSON_NODE_FACTORY.stringNode("callbackValue1")); + callbackResponseData.put("field2", JSON_NODE_FACTORY.stringNode("callbackValue2")); when(applicationParams.getExcludeVerifyAccessCaseTypesForValidate()) .thenReturn(List.of("SomeOtherType")); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLoggerTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLoggerTest.java index 0dfc538133..c18ecc23d9 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLoggerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/CaseDataIssueLoggerTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -28,7 +29,7 @@ public class CaseDataIssueLoggerTest { private static final String JURISDICTION_ID = "EMPLOYMENT"; private static final String CASE_TYPE_ID = "TestCaseType"; - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final TypeReference> STRING_JSON_MAP = new TypeReference<>() {}; private CaseDetails caseDetails; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperationTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperationTest.java index a4c1347fa4..f4846ead58 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperationTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/service/validate/DefaultValidateCaseFieldsOperationTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.service.validate; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -160,10 +160,10 @@ void shouldValidateData_when_organisation_has_correct_roles_complex() throws Exc final Map organisationPolicyData = buildJsonNodeDataWithTwoOrganisationPolicyRole("[default_role1]", "[default_role2]"); - ObjectNode classNode = new ObjectMapper().createObjectNode(); + ObjectNode classNode = JsonMapper.builderWithJackson2Defaults().build().createObjectNode(); organisationPolicyData.keySet().forEach(key -> classNode.set(key, organisationPolicyData.get(key))); - ObjectNode parentNode = new ObjectMapper().createObjectNode(); + ObjectNode parentNode = JsonMapper.builderWithJackson2Defaults().build().createObjectNode(); parentNode.set("Class", classNode); Map parentData = new HashMap<>(); parentData.put("ParentNode", parentNode); @@ -188,10 +188,10 @@ void shouldValidate_when_organisation_has_correct_roles_complex() throws Excepti final Map organisationPolicyData = buildJsonNodeDataWithTwoOrganisationPolicyRole("[default_role1]", "[default_role2]"); - ObjectNode classNode = new ObjectMapper().createObjectNode(); + ObjectNode classNode = JsonMapper.builderWithJackson2Defaults().build().createObjectNode(); organisationPolicyData.keySet().forEach(key -> classNode.set(key, organisationPolicyData.get(key))); - ObjectNode parentNode = new ObjectMapper().createObjectNode(); + ObjectNode parentNode = JsonMapper.builderWithJackson2Defaults().build().createObjectNode(); parentNode.set("Class", classNode); Map parentData = new HashMap<>(); parentData.put("ParentNode", parentNode); @@ -407,7 +407,7 @@ void shouldFailValidationIfEventIdNotFoundInCaseType() { private Map buildJsonNodeDataWithOrganisationPolicyRole(String organisationPolicyRole) throws IOException { - final JsonNode node = new ObjectMapper().readTree("{\n" + final JsonNode node = JsonMapper.builderWithJackson2Defaults().build().readTree("{\n" + " \"OrgPolicyCaseAssignedRole\": \"" + organisationPolicyRole + "\",\n" + " \"OrgPolicyReference\": \"" + organisationPolicyRole + "\",\n" + " \"Organisation\": {\n" @@ -525,7 +525,7 @@ private static JurisdictionDefinition buildJurisdiction() { private Map buildJsonNodeDataWithTwoOrganisationPolicyRole(String organisationPolicyRole1, String organisationPolicyRole2) throws IOException { - final JsonNode node = new ObjectMapper().readTree("{\n" + final JsonNode node = JsonMapper.builderWithJackson2Defaults().build().readTree("{\n" + " \"OrgPolicyCaseAssignedRole\": \"" + organisationPolicyRole1 + "\",\n" + " \"OrgPolicyReference\": \"" + organisationPolicyRole1 + "\",\n" + " \"Organisation\": {\n" @@ -534,7 +534,7 @@ private Map buildJsonNodeDataWithTwoOrganisationPolicyRole(Str + " }\n" + "}\n"); - final JsonNode node1 = new ObjectMapper().readTree("{\n" + final JsonNode node1 = JsonMapper.builderWithJackson2Defaults().build().readTree("{\n" + " \"OrgPolicyCaseAssignedRole\": \"" + organisationPolicyRole2 + "\",\n" + " \"OrgPolicyReference\": \"" + organisationPolicyRole2 + "\",\n" + " \"Organisation\": {\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidatorTest.java index 6efeca850e..2a8184d2f9 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/BaseLocationValidatorTest.java @@ -1,8 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -61,7 +60,7 @@ void setUp() { @Test @DisplayName("should be valid when text length between min and max") void baseLocationFieldWithValidMinMax() { - final JsonNode DATA = NODE_FACTORY.textNode("5 & 10"); + final JsonNode DATA = NODE_FACTORY.stringNode("5 & 10"); final List validMinMaxResults = validator.validate(FIELD_ID, DATA, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); @@ -70,10 +69,10 @@ void baseLocationFieldWithValidMinMax() { @Test @DisplayName("should NOT be valid when text length outside of min and max") void baseLocationFieldWithInvalidMinMax() { - final JsonNode invalidMin = NODE_FACTORY.textNode("Test"); + final JsonNode invalidMin = NODE_FACTORY.stringNode("Test"); final List validMinResults = validator.validate(FIELD_ID, invalidMin, caseFieldDefinition); - final JsonNode invalidMax = NODE_FACTORY.textNode("Test Test Test"); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test Test Test"); final List validMaxResults = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertAll( @@ -92,7 +91,7 @@ void baseLocationFieldWithInvalidMinMax() { @DisplayName("should be valid when no min and max defined") void baseLocationFieldWithNoMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().build(); - final JsonNode value = NODE_FACTORY.textNode("Test"); + final JsonNode value = NODE_FACTORY.stringNode("Test"); final List validMinMaxResults = validator.validate(FIELD_ID, value, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); } @@ -103,16 +102,16 @@ void baseLocationFieldWithSameMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5) .withMax(5) .build(); - final JsonNode valid_value = NODE_FACTORY.textNode("12345"); + final JsonNode valid_value = NODE_FACTORY.stringNode("12345"); final List validMinMaxResults = validator.validate(FIELD_ID, valid_value, caseFieldDefinition); // Test value over - final JsonNode over_value = NODE_FACTORY.textNode("123456"); + final JsonNode over_value = NODE_FACTORY.stringNode("123456"); final List overMinMaxResults = validator.validate(FIELD_ID, over_value, caseFieldDefinition); // Test value under - final JsonNode under_value = NODE_FACTORY.textNode("1234"); + final JsonNode under_value = NODE_FACTORY.stringNode("1234"); final List underMinMaxResults = validator.validate(FIELD_ID, under_value, caseFieldDefinition); @@ -127,10 +126,10 @@ void baseLocationFieldWithSameMinMax() { @DisplayName("should test against regular expression") void baseLocationRegex() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("\\d{4}-\\d{2}-\\d{2}").build(); - final JsonNode validValue = NODE_FACTORY.textNode("1234-56-78"); + final JsonNode validValue = NODE_FACTORY.stringNode("1234-56-78"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); - final JsonNode invalidValue = NODE_FACTORY.textNode("aa-56-78"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("aa-56-78"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, caseFieldDefinition); assertAll( @@ -153,10 +152,10 @@ void nullValue() { } @Test - @DisplayName("should be valid when input is null text node") - void nullTextValue() { + @DisplayName("should be valid when input is an explicit null node") + void explicitNullValue() { final List validationResult = - validator.validate(FIELD_ID, new TextNode(null), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.nullNode(), caseFieldDefinition); assertThat(validationResult, hasSize(0)); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidatorTest.java index 35b725f297..6740f72f68 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/CaseDataValidatorTest.java @@ -4,9 +4,9 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.type.TypeFactory; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.type.TypeFactory; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -645,7 +645,7 @@ public void textFieldWithMaxMin() throws Exception { " }\n" + "}]"; final List caseFields = - mapper.readValue(caseFieldString, TypeFactory.defaultInstance().constructCollectionType(List.class, + mapper.readValue(caseFieldString, TypeFactory.createDefaultInstance().constructCollectionType(List.class, CaseFieldDefinition.class)); final String DATA = "{\"PersonFirstName\" : \"Test Name Test Name\"}"; final Map values = caseDataFromJsonString(DATA); @@ -674,7 +674,7 @@ public void textFieldWithInvalidMaxMin() throws Exception { " }\n" + "}]"; final List caseFields = - mapper.readValue(caseFieldString, TypeFactory.defaultInstance().constructCollectionType(List.class, + mapper.readValue(caseFieldString, TypeFactory.createDefaultInstance().constructCollectionType(List.class, CaseFieldDefinition.class)); final String DATA = "{\"PersonFirstName\" : \"Test Name Test Name\"}"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/CollectionValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/CollectionValidatorTest.java index 844376df42..5b7067173d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/CollectionValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/CollectionValidatorTest.java @@ -12,7 +12,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COLLECTION; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; @@ -20,7 +21,7 @@ public class CollectionValidatorTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String TYPE_TEXT = "Text"; private static final String CASE_FIELD_ID = "Aliases"; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidatorTest.java index bc7f7da221..6e97ddab03 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/CustomNumberValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -53,7 +53,7 @@ private CaseFieldDefinitionBuilder caseField(String fieldId) { @Test void shouldFailOnInvalidApprovalStatus() { - final JsonNode data = NODE_FACTORY.textNode("5"); + final JsonNode data = NODE_FACTORY.stringNode("5"); List validationResults = this.validator.validate("ApprovalStatus", data, caseFieldDefinition); assertNotNull(validationResults); @@ -65,7 +65,7 @@ void shouldFailOnInvalidApprovalStatus() { @Test void shouldValidateOnValidApprovalStatus() { - final JsonNode data = NODE_FACTORY.textNode("0"); + final JsonNode data = NODE_FACTORY.stringNode("0"); List validationResults = this.validator.validate("ApprovalStatus", data, caseFieldDefinition); assertNotNull(validationResults); @@ -75,7 +75,7 @@ void shouldValidateOnValidApprovalStatus() { @Test void shouldReturnEmptyErrorListValidateForOtherFieldId() { caseFieldDefinition = caseField(ORGANISATION_TO_ADD).build(); - final JsonNode data = NODE_FACTORY.textNode("0"); + final JsonNode data = NODE_FACTORY.stringNode("0"); List validationResults = this.validator.validate("OrganisationToAdd", data, caseFieldDefinition); assertNotNull(validationResults); @@ -84,7 +84,7 @@ void shouldReturnEmptyErrorListValidateForOtherFieldId() { @Test void shouldReturnEmptyErrorListValidateForEmptyDataForOtherFieldId() { - final JsonNode data = NODE_FACTORY.textNode(""); + final JsonNode data = NODE_FACTORY.stringNode(""); List validationResults = this.validator.validate("OrganisationToAdd", data, caseFieldDefinition); assertNotNull(validationResults); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidatorTest.java index e625485932..c5c3d4512d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DateTimeValidatorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -73,7 +73,7 @@ void emptyCaseFieldDefinition() { CaseFieldDefinition caseFieldDefinition = new CaseFieldDefinition(); caseFieldDefinition.setFieldTypeDefinition(new FieldTypeDefinition()); - assertEquals(0, validator.validate(FIELD_ID, NODE_FACTORY.textNode("2012-04-21T00:00:00.000000000"), + assertEquals(0, validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2012-04-21T00:00:00.000000000"), caseFieldDefinition).size()); } @@ -81,7 +81,7 @@ void emptyCaseFieldDefinition() { @DisplayName("should validate date time: 2012-04-21T00:00:00.000") void shouldValidateDateTimeWithoutTimeZone() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2012-04-21T00:00:00.000"), + NODE_FACTORY.stringNode("2012-04-21T00:00:00.000"), caseFieldDefinition); assertThat(results, hasSize(0)); } @@ -90,7 +90,7 @@ void shouldValidateDateTimeWithoutTimeZone() { @DisplayName("should validate date time: 2012-04-21T00:00:00.000Z") void shouldValidateDateTimeWithTimeZoneZ() { final List results = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2012-04-21T00:00:00.000Z"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2012-04-21T00:00:00.000Z"), caseFieldDefinition); assertThat(results, hasSize(0)); } @@ -98,7 +98,7 @@ void shouldValidateDateTimeWithTimeZoneZ() { @DisplayName("should validate date time: 2012-04-21T00:00:00+01:00") void shouldValidateDateTimeWithTimeZone() { final List results = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2012-04-21T00:00:00+01:00"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2012-04-21T00:00:00+01:00"), caseFieldDefinition); assertThat(results, hasSize(0)); } @@ -106,7 +106,7 @@ void shouldValidateDateTimeWithTimeZone() { @DisplayName("should validate date time: 2000-02-29T00:00:00.00Z") void shouldValidateDateTimeLeapYear() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2000-02-29T00:00:00.00Z"), + NODE_FACTORY.stringNode("2000-02-29T00:00:00.00Z"), caseFieldDefinition); assertThat(results, hasSize(0)); } @@ -122,7 +122,7 @@ void emptyCaseFieldDefinition() { CaseFieldDefinition caseFieldDefinition = new CaseFieldDefinition(); caseFieldDefinition.setFieldTypeDefinition(new FieldTypeDefinition()); - assertEquals(1, validator.validate(FIELD_ID, NODE_FACTORY.textNode("3321M1 1AA"), + assertEquals(1, validator.validate(FIELD_ID, NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition).size()); } @@ -131,7 +131,7 @@ void emptyCaseFieldDefinition() { @DisplayName("should not validate date time: 3321M1 1AA") void shouldNotValidateNotDateTime() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("3321M1 1AA"), + NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition); assertAll( () -> assertThat(results, hasSize(1)), @@ -144,7 +144,7 @@ void shouldNotValidateNotDateTime() { @DisplayName("should not validate date time: 1800-14-14T00:00:00") void shouldNotValidateNotMonth() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("1800-14-14T00:00:00"), + NODE_FACTORY.stringNode("1800-14-14T00:00:00"), caseFieldDefinition); assertAll( () -> assertThat(results, hasSize(1)), @@ -157,7 +157,7 @@ void shouldNotValidateNotMonth() { @DisplayName("should not validate date time: 2001-11-31T00:00:00") void shouldNotValidateNotDay() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2001-11-31T00:00:00"), + NODE_FACTORY.stringNode("2001-11-31T00:00:00"), caseFieldDefinition); assertAll( () -> assertThat(results, hasSize(1)), @@ -170,7 +170,7 @@ void shouldNotValidateNotDay() { @DisplayName("should not validate date time: 2001-01-01") void shouldNotValidateNotTime() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2001-01-01"), + NODE_FACTORY.stringNode("2001-01-01"), caseFieldDefinition); assertAll( () -> assertThat(results, hasSize(1)), @@ -183,7 +183,7 @@ void shouldNotValidateNotTime() { @DisplayName("should not validate date time: 2100-02-29T00:00:00Z") void shouldNotValidateNotDayLeapYear() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2100-02-29T00:00:00Z"), + NODE_FACTORY.stringNode("2100-02-29T00:00:00Z"), caseFieldDefinition); assertAll( () -> assertThat(results, hasSize(1)), @@ -193,6 +193,21 @@ void shouldNotValidateNotDayLeapYear() { } } + @Test + void shouldRejectContainerValuesWithoutThrowing() { + List objectResults = validator.validate( + FIELD_ID, NODE_FACTORY.objectNode().put("unexpected", "value"), caseFieldDefinition); + List arrayResults = validator.validate( + FIELD_ID, NODE_FACTORY.arrayNode().add("unexpected"), caseFieldDefinition); + + assertAll( + () -> assertEquals(1, objectResults.size()), + () -> assertEquals("Date or Time entered is not valid", objectResults.get(0).getErrorMessage()), + () -> assertEquals(1, arrayResults.size()), + () -> assertEquals("Date or Time entered is not valid", arrayResults.get(0).getErrorMessage()) + ); + } + @Test void getType() { assertEquals(validator.getType(), BaseType.get("DATETIME")); @@ -211,15 +226,15 @@ void checkMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(datetime(maxDateTime)).build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDateTime), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(maxDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(maxDateTime), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidDateTime), caseFieldDefinition); assertEquals(1, result03.size(), "Did not catch invalid max-date"); assertEquals("The date time should be earlier than 2001-12-31T00:00:00", result03.get(0).getErrorMessage(), "Validation message"); @@ -233,15 +248,15 @@ void checkMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(datetime(minDateTime)).build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDateTime), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(minDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(minDateTime), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidDateTime), caseFieldDefinition); assertEquals(1, result03.size(), "Did not catch invalid max-date"); assertEquals("The date time should be later than 2001-01-01T00:00:00", result03.get(0).getErrorMessage(), @@ -260,23 +275,23 @@ void checkMaxMinWithoutRegEx() { .build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDateTime), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(minDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(minDateTime), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(maxDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(maxDateTime), caseFieldDefinition); assertEquals(0, result03.size(), result03.toString()); final List result04 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidMinDateTime), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidMinDateTime), caseFieldDefinition); assertEquals(1, result04.size(), "Did not catch invalid min-date"); final List result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode(invalidMaxDateTime), + NODE_FACTORY.stringNode(invalidMaxDateTime), caseFieldDefinition); assertEquals(1, result05.size(), "Did not catch invalid max-date"); } @@ -287,7 +302,7 @@ void invalidFieldTypeRegEx() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("InvalidRegEx").build(); final List result = validator.validate(FIELD_ID, - NODE_FACTORY.textNode(validDateTime), + NODE_FACTORY.stringNode(validDateTime), caseFieldDefinition); assertEquals(1, result.size(), "RegEx validation failed"); assertEquals("2001-12-10T00:00:00Z Field Type Regex Failed:InvalidRegEx", result.get(0).getErrorMessage()); @@ -299,7 +314,7 @@ void invalidBaseTypeRegEx() { when(dateTimeFieldTypeDefinition.getRegularExpression()).thenReturn("InvalidRegEx"); BaseType.register(new BaseType(dateTimeFieldTypeDefinition)); final List result = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2001-12-10T00:00:00"), + NODE_FACTORY.stringNode("2001-12-10T00:00:00"), caseFieldDefinition); assertEquals(1, result.size(), "RegEx validation failed"); assertEquals("2001-12-10T00:00:00 Date Time Type Regex Failed:InvalidRegEx", result.get(0).getErrorMessage()); @@ -313,7 +328,7 @@ void validRegEx() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp(limitedRegex).build(); final List result = validator.validate(FIELD_ID, - NODE_FACTORY.textNode(validDateTime), + NODE_FACTORY.stringNode(validDateTime), caseFieldDefinition); assertEquals(0, result.size(), "RegEx validation failed"); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DateValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DateValidatorTest.java index 9529a006dd..35485121df 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DateValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DateValidatorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -65,7 +65,7 @@ class WhenDateValid { @DisplayName("should accept date without timezone") void shouldAcceptDateNoTimezone() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2012-04-21"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2012-04-21"), caseFieldDefinition); assertEquals(0, result.size()); } @@ -73,7 +73,7 @@ void shouldAcceptDateNoTimezone() { @DisplayName("should accept date with timezone Z") void shouldAcceptDateWithTimezoneZ() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2012-04-21Z"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2012-04-21Z"), caseFieldDefinition); assertEquals(0, result.size()); } @@ -81,7 +81,7 @@ void shouldAcceptDateWithTimezoneZ() { @DisplayName("should accept date with timezone") void shouldAcceptDateWithTimezone() { final List result = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("2012-04-21+01:00"), + NODE_FACTORY.stringNode("2012-04-21+01:00"), caseFieldDefinition); assertEquals(0, result.size()); } @@ -90,7 +90,7 @@ void shouldAcceptDateWithTimezone() { @DisplayName("should accept date for leap year: 2000-02-29Z") void shouldAcceptDayLeapYear() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2000-02-29Z"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2000-02-29Z"), caseFieldDefinition); assertEquals(0, result.size()); } } @@ -102,7 +102,7 @@ class WhenDateInvalid { @DisplayName("should not accept date: 3321M1 1AA") void shouldNotAcceptNotDate() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("3321M1 1AA"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size()), () -> assertEquals("Date or Time entered is not valid", result.get(0).getErrorMessage()) @@ -113,7 +113,7 @@ void shouldNotAcceptNotDate() { @DisplayName("should not accept date: 1800-14-14") void shouldNotAcceptNotMonth() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("1800-14-14"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("1800-14-14"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size()), () -> assertEquals("Date or Time entered is not valid", result.get(0).getErrorMessage()) @@ -124,7 +124,7 @@ void shouldNotAcceptNotMonth() { @DisplayName("should not accept date: 2001-11-31") void shouldNotAcceptNotDay() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2001-11-31"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2001-11-31"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size()), () -> assertEquals("Date or Time entered is not valid", result.get(0).getErrorMessage()) @@ -135,7 +135,7 @@ void shouldNotAcceptNotDay() { @DisplayName("should not accept date with time: 2001-01-01T00:00:00.000Z") void shouldNotAcceptDateTime() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2001-01-01T00:00:00.000Z"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2001-01-01T00:00:00.000Z"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size()), () -> assertEquals("Date or Time entered is not valid", @@ -147,7 +147,7 @@ void shouldNotAcceptDateTime() { @DisplayName("should not accept date: 2001-02-29Z") void shouldNotAcceptNotDayLeapYear() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2001-02-29Z"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2001-02-29Z"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size()), () -> assertEquals("Date or Time entered is not valid", result.get(0).getErrorMessage()) @@ -155,6 +155,21 @@ void shouldNotAcceptNotDayLeapYear() { } } + @Test + void shouldRejectContainerValuesWithoutThrowing() { + List objectResults = validator.validate( + FIELD_ID, NODE_FACTORY.objectNode().put("unexpected", "value"), caseFieldDefinition); + List arrayResults = validator.validate( + FIELD_ID, NODE_FACTORY.arrayNode().add("unexpected"), caseFieldDefinition); + + assertAll( + () -> assertEquals(1, objectResults.size()), + () -> assertEquals("Date or Time entered is not valid", objectResults.get(0).getErrorMessage()), + () -> assertEquals(1, arrayResults.size()), + () -> assertEquals("Date or Time entered is not valid", arrayResults.get(0).getErrorMessage()) + ); + } + @Test void getType() { assertEquals(validator.getType(), BaseType.get("DATE"), "Type is incorrect"); @@ -174,15 +189,15 @@ void checkMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(date(maxDate)).build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDate), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(maxDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(maxDate), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidDate), caseFieldDefinition); assertEquals(1, result03.size(), "Did not catch invalid max-date"); assertEquals("The date should be earlier than 31-12-2001", result03.get(0).getErrorMessage(), @@ -197,15 +212,15 @@ void checkMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(date(minDate)).build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDate), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(minDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(minDate), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidDate), caseFieldDefinition); assertEquals(1, result03.size(), "Did not catch invalid max-date"); assertEquals("The date should be later than 01-01-2001", result03.get(0).getErrorMessage(), @@ -224,23 +239,23 @@ void checkMaxMinWithoutRegEx() { .build(); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDate), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(minDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(minDate), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(maxDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(maxDate), caseFieldDefinition); assertEquals(0, result03.size(), result03.toString()); final List result04 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidMinDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidMinDate), caseFieldDefinition); assertEquals(1, result04.size(), "Did not catch invalid min-date"); final List result05 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(invalidMaxDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(invalidMaxDate), caseFieldDefinition); assertEquals(1, result05.size(), "Did not catch invalid max-date"); } @@ -253,7 +268,7 @@ void invalidFieldTypeRegEx() { .withRegExp("InvalidRegEx") .build(); final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDate), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size(), "RegEx validation failed"), () -> assertEquals(REGEX_GUIDANCE, result.get(0).getErrorMessage()), @@ -268,7 +283,7 @@ void invalidBaseTypeRegEx() { final CaseFieldDefinition caseFieldDefinition = caseField().build(); final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("2001-12-10"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("2001-12-10"), caseFieldDefinition); assertAll( () -> assertEquals(1, result.size(), "RegEx validation failed"), () -> assertEquals(REGEX_GUIDANCE, result.get(0).getErrorMessage()), @@ -282,7 +297,7 @@ void validRegEx() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp(LIMITED_REGEX).build(); final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(validDate), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(validDate), caseFieldDefinition); assertEquals(0, result.size(), "RegEx validation failed"); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DocumentValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DocumentValidatorTest.java index 3c050fc0d9..8a60fa41e7 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DocumentValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DocumentValidatorTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.ApplicationParams; @@ -34,7 +35,7 @@ public class DocumentValidatorTest implements IVallidatorTest { private static final String CATEGORY_ID = "category_id"; private static final String UPLOAD_TIMESTAMP = "upload_timestamp"; private static final String CASE_TYPE_ID = "FT_CaseAccessCategories"; - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String CASE_FIELD_STRING = "{\n" + " \"id\": \"DOCUMENT_FIELD_ID\",\n" @@ -330,7 +331,7 @@ public void shouldFailWhenValidatingBooleanNode() { public void shouldFailWhenValidatingTextNode() { final List result = - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("IATB"), caseFieldDefinition); + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("IATB"), caseFieldDefinition); assertThat(result, hasSize(1)); assertThat(result.get(0).getErrorMessage(), is("string does not have document_url key specified")); } @@ -471,14 +472,14 @@ public void shouldValidateUploadTimeStamp() { private ObjectNode createDoc(String documentUrl) { data = MAPPER.createObjectNode(); - data.set(DOCUMENT_URL, new TextNode(documentUrl)); + data.set(DOCUMENT_URL, new StringNode(documentUrl)); return data; } private ObjectNode createDoc(String key, String value) { data = MAPPER.createObjectNode(); - data.set(DOCUMENT_URL, new TextNode(VALID_DOCUMENT_URL)); - data.set(key, new TextNode(value)); + data.set(DOCUMENT_URL, new StringNode(VALID_DOCUMENT_URL)); + data.set(key, value == null ? NODE_FACTORY.nullNode() : new StringNode(value)); return data; } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidatorTest.java index dad399c7aa..93ff20319a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicListValidatorTest.java @@ -6,8 +6,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -57,7 +57,7 @@ public void setUp() { @Test public void validValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", @@ -100,7 +100,7 @@ public void invalidCodeMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(500); validator = new DynamicListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", @@ -143,7 +143,7 @@ public void invalidValueMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(2); validator = new DynamicListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", @@ -183,7 +183,8 @@ public void invalidValueMaxLength() throws Exception { @Test @SuppressWarnings("checkstyle:LineLength") // don't want to break long regex expressions public void invalidValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree("{\n" + " \"default\": {\n" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build() + .readTree("{\n" + " \"default\": {\n" + " \"code\": \"FixedList1\",\n" + " \"label\": \"Fixed List 1\"\n" + " },\n" @@ -222,7 +223,8 @@ public void invalidValue() throws Exception { @Test public void emptyCodeAndValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree("{\n" + " \"default\": {\n" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build() + .readTree("{\n" + " \"default\": {\n" + " \"code\": \"FixedList1\",\n" + " \"label\": \"Fixed List 1\"\n" + " },\n" @@ -260,7 +262,8 @@ public void emptyCodeAndValue() throws Exception { @Test public void emptyListItems() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree("{\n" + " \"default\": {\n" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build() + .readTree("{\n" + " \"default\": {\n" + " \"code\": \"FixedList1\",\n" + " \"label\": \"Fixed List 1\"\n" + " },\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidatorTest.java index ed0f4a09a3..78cdcc65bc 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicMultiSelectListValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -56,7 +56,7 @@ public void setUp() { @Test public void validValueMultipleSelection() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { \t"value": [{ \t\t"code": "MONDAYFIRSTOFMAY", @@ -90,7 +90,7 @@ public void validValueMultipleSelection() throws Exception { @Test @SuppressWarnings("checkstyle:LineLength") // don't want to break long regex expressions public void invalidValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "default": { "code": "FixedList1", @@ -135,7 +135,7 @@ public void invalidCodeMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(500); validator = new DynamicMultiSelectListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { \t"value": [{ \t\t"code": "MONDAYFIRSTOFMAY", @@ -172,7 +172,7 @@ public void invalidValueMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(5); validator = new DynamicMultiSelectListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { \t"value": [{ \t\t"code": "MONDAYFIRSTOFMAY", diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicRadioListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicRadioListValidatorTest.java index 378cb474b3..c085721757 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicRadioListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/DynamicRadioListValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -56,7 +56,7 @@ public void setUp() { @Test public void validValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", @@ -96,7 +96,7 @@ public void validValue() throws Exception { @Test @SuppressWarnings("checkstyle:LineLength") // don't want to break long regex expressions public void invalidValue() throws Exception { - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "default": { "code": "FixedList1", @@ -141,7 +141,7 @@ public void invalidCodeMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(500); validator = new DynamicRadioListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", @@ -185,7 +185,7 @@ public void invalidValueMaxLength() throws Exception { when(applicationParams.getValidationDynamicListValueMaxLength()).thenReturn(5); validator = new DynamicRadioListValidator(applicationParams); - JsonNode dataValue = new ObjectMapper().readTree(""" + JsonNode dataValue = JsonMapper.builderWithJackson2Defaults().build().readTree(""" { "value": { "code": "FixedList1", diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java index 5e397655a4..429ce18bc1 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,32 +54,32 @@ void setUp() { @Test void validEmail() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test.com"), + NODE_FACTORY.stringNode("test@test.com"), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test"), + NODE_FACTORY.stringNode("test@test"), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test.org"), + NODE_FACTORY.stringNode("test@test.org"), caseFieldDefinition); assertEquals(0, result03.size(), result01.toString()); final List result04 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test.org.uk"), + NODE_FACTORY.stringNode("test@test.org.uk"), caseFieldDefinition); assertEquals(0, result04.size(), result04.toString()); final List result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test.test@test.com"), + NODE_FACTORY.stringNode("test.test@test.com"), caseFieldDefinition); assertEquals(0, result05.size(), result05.toString()); final List result06 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test_test@test.xxx"), + NODE_FACTORY.stringNode("test_test@test.xxx"), caseFieldDefinition); assertEquals(0, result06.size(), result06.toString()); } @@ -87,17 +87,17 @@ void validEmail() { @Test void invalidEmail() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test.test.com"), + NODE_FACTORY.stringNode("test.test.com"), caseFieldDefinition); assertEquals(1, result01.size(), result01.toString()); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test.com"), + NODE_FACTORY.stringNode("test.com"), caseFieldDefinition); assertEquals(1, result01.size(), result02.toString()); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test@test"), + NODE_FACTORY.stringNode("test@test@test"), caseFieldDefinition); assertEquals(1, result03.size(), result03.toString()); } @@ -105,11 +105,11 @@ void invalidEmail() { @Test void fieldTypeRegEx() { final CaseFieldDefinition regexCaseFieldDefinition = caseField().withRegExp("^[a-z]\\w*@hmcts.net$").build(); - final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); + final JsonNode validValue = NODE_FACTORY.stringNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, regexCaseFieldDefinition); assertEquals(0, validResult.size(), validResult.toString()); - final JsonNode invalidValue = NODE_FACTORY.textNode("9k@hmcts.net"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("9k@hmcts.net"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, regexCaseFieldDefinition); assertEquals(1, invalidResult.size(), invalidResult.toString()); @@ -121,7 +121,7 @@ void baseTypeRegEx() { when(emailBaseType.getRegularExpression()).thenReturn("\\\\w*@hmcts.net"); final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("9k@hmcts.net"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("9k@hmcts.net"), caseFieldDefinition); assertEquals(1, result01.size()); assertEquals(REGEX_GUIDANCE, result01.get(0).getErrorMessage()); } @@ -129,11 +129,11 @@ void baseTypeRegEx() { @Test void checkMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(new BigDecimal(13)).build(); - final JsonNode validValue = NODE_FACTORY.textNode("k99@hmcts.net"); + final JsonNode validValue = NODE_FACTORY.stringNode("k99@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); assertEquals(0, validResult.size(), validResult.toString()); - final JsonNode invalidValue = NODE_FACTORY.textNode("k9@hmcts.net"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("k9@hmcts.net"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, caseFieldDefinition); assertEquals(1, invalidResult.size(), invalidResult.toString()); assertEquals("Email 'k9@hmcts.net' requires minimum length 13", invalidResult.get(0).getErrorMessage()); @@ -142,11 +142,11 @@ void checkMin() { @Test void checkMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(new BigDecimal(12)).build(); - final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); + final JsonNode validValue = NODE_FACTORY.stringNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); assertEquals(0, validResult.size(), validResult.toString()); - final JsonNode invalidValue = NODE_FACTORY.textNode("k99@hmcts.net"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("k99@hmcts.net"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, caseFieldDefinition); assertEquals(1, invalidResult.size(), invalidResult.toString()); assertEquals("Email 'k99@hmcts.net' exceeds maximum length 12", invalidResult.get(0).getErrorMessage()); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedListValidatorTest.java index fb050c1fc2..2fa5c02826 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedListValidatorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -51,7 +51,7 @@ void setUp() { @Test void validValue() { final List result01 = validator.validate("TEST_FIELD_ID", - NODE_FACTORY.textNode("AAAAAA"), + NODE_FACTORY.stringNode("AAAAAA"), caseFieldDefinition); assertEquals(0, result01.size()); } @@ -59,7 +59,7 @@ void validValue() { @Test void invalidValue() { final List result01 = validator.validate("TEST_FIELD_ID", - NODE_FACTORY.textNode("DDDD"), + NODE_FACTORY.stringNode("DDDD"), caseFieldDefinition); assertEquals(1, result01.size(), result01.toString()); } @@ -77,11 +77,11 @@ void getType() { @Test void fieldTypeRegEx() { final CaseFieldDefinition caseFieldDefinitionWithRegEx = caseField().withRegExp("AAAAAA").build(); - final List result01 = validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("AAAAAA"), + final List result01 = validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("AAAAAA"), caseFieldDefinitionWithRegEx); assertEquals(0, result01.size()); - final List result02 = validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("BBBBBB"), + final List result02 = validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("BBBBBB"), caseFieldDefinitionWithRegEx); assertEquals(1, result02.size(), "BBBBBB failed regular expression check"); assertEquals(REGEX_GUIDANCE, result02.get(0).getErrorMessage()); @@ -92,7 +92,7 @@ void fieldTypeRegEx() { void baseTypeRegEx() { when(fixedListBaseType.getRegularExpression()).thenReturn("InvalidRegEx"); final List result = validator.validate("TEST_FIELD_ID", - NODE_FACTORY.textNode("AA"), caseFieldDefinition); + NODE_FACTORY.stringNode("AA"), caseFieldDefinition); assertEquals(1, result.size(), "RegEx validation failed"); assertEquals("'AA' failed FixedList Type Regex check: InvalidRegEx", result.get(0).getErrorMessage()); assertEquals("TEST_FIELD_ID", result.get(0).getFieldId()); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedRadioListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedRadioListValidatorTest.java index a70e3ba1f8..b7282712a3 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedRadioListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/FixedRadioListValidatorTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -52,7 +52,7 @@ void setUp() { @Test void validValue() { final List result01 = validator.validate(TEST_FIELD_ID, - NODE_FACTORY.textNode("AAAAAA"), + NODE_FACTORY.stringNode("AAAAAA"), caseFieldDefinition); assertEquals(0, result01.size()); } @@ -60,7 +60,7 @@ void validValue() { @Test void invalidValue() { final List result01 = validator.validate(TEST_FIELD_ID, - NODE_FACTORY.textNode("DDDD"), + NODE_FACTORY.stringNode("DDDD"), caseFieldDefinition); assertEquals(1, result01.size(), result01.toString()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/IVallidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/IVallidatorTest.java index 6956c90873..0c7518f6c1 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/IVallidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/IVallidatorTest.java @@ -1,12 +1,13 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; /** * Groups common code used in ValidatorTest. */ interface IVallidatorTest { static final JsonNodeFactory NODE_FACTORY = JsonNodeFactory.instance; - static final ObjectMapper MAPPER = new ObjectMapper(); + static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidatorTest.java index bf7b5937ce..7f4072559a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/MoneyGBPValidatorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -49,12 +49,12 @@ void setUp() { @Test void validMoney() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("177978989700"), + NODE_FACTORY.stringNode("177978989700"), caseFieldDefinition); assertEquals(0, result01.size()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("-100"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("-100"), caseFieldDefinition); assertEquals(0, result02.size()); } @@ -67,11 +67,11 @@ void nullMoney() { @Test void invalidMoney() { final List result01 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("3321M1 1AA"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition); assertEquals(1, result01.size(), result01.toString()); final List result02 = - validator.validate(FIELD_ID, NODE_FACTORY.textNode("100.1"), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode("100.1"), caseFieldDefinition); assertEquals(1, result01.size(), result02.toString()); } @@ -83,29 +83,29 @@ void checkMaxMin_BothBelow1GBP() { // Test valid max min final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("5"), + NODE_FACTORY.stringNode("5"), minMaxCaseFieldDefinition); assertEquals(0, result01.size()); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("10"), + NODE_FACTORY.stringNode("10"), minMaxCaseFieldDefinition); assertEquals(0, result02.size()); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("7"), + NODE_FACTORY.stringNode("7"), minMaxCaseFieldDefinition); assertEquals(0, result03.size()); // Test invalid max min final List result04 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("4"), + NODE_FACTORY.stringNode("4"), minMaxCaseFieldDefinition); assertEquals(1, result04.size()); assertEquals(result04.get(0).getErrorMessage(), "Should be more than or equal to £0.05"); final List result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("11"), + NODE_FACTORY.stringNode("11"), minMaxCaseFieldDefinition); assertEquals(1, result05.size()); assertEquals(result05.get(0).getErrorMessage(), "Should be less than or equal to £0.10"); @@ -119,13 +119,13 @@ void checkMaxMin_BothAbove1GBP() { // Test invalid max min final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("123457"), + NODE_FACTORY.stringNode("123457"), minMaxCaseFieldDefinition); assertEquals(1, result01.size()); assertEquals(result01.get(0).getErrorMessage(), "Should be less than or equal to £1,234.56"); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("122"), + NODE_FACTORY.stringNode("122"), minMaxCaseFieldDefinition); assertEquals(1, result02.size()); assertEquals(result02.get(0).getErrorMessage(), "Should be more than or equal to £1.23"); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidatorTest.java index 1b02147b75..26a53b79f1 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/MultiSelectListValidatorTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ @DisplayName("MultiSelectListValidator") class MultiSelectListValidatorTest { - private static final JsonNodeFactory NODE_FACTORY = new JsonNodeFactory(Boolean.FALSE); + private static final JsonNodeFactory NODE_FACTORY = new JsonNodeFactory(); private static final String FIELD_ID = "MultiSelectList1"; private static final String OPTION_1 = "Option1"; private static final String OPTION_2 = "Option2"; @@ -87,7 +87,7 @@ void validate_shouldBeValidWhenArrayOfValidValues() { @Test void validate_shouldNOTBeValidWhenValueIsNotAnArray() { - final JsonNode value = NODE_FACTORY.textNode("Nayab was here, 24/07/2017"); + final JsonNode value = NODE_FACTORY.stringNode("Nayab was here, 24/07/2017"); final List results = validator.validate(FIELD_ID, value, caseFieldDefinition); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/NumberValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/NumberValidatorTest.java index 64e23e8545..78dc95d644 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/NumberValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/NumberValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,7 +54,7 @@ private CaseFieldDefinitionBuilder caseField() { @Test void noValueOrMaxOrMin() { - final JsonNode data = NODE_FACTORY.textNode(""); + final JsonNode data = NODE_FACTORY.stringNode(""); assertEquals(0, validator.validate("TEST_FIELD_ID", data, caseFieldDefinition).size(), validator.validate("TEST_FIELD_ID", data, caseFieldDefinition).toString()); @@ -65,7 +65,7 @@ void noValueWithMaxOrMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5) .withMax(10) .build(); - final JsonNode data = NODE_FACTORY.textNode(""); + final JsonNode data = NODE_FACTORY.stringNode(""); assertEquals(0, validator.validate("TEST_FIELD_ID", data, caseFieldDefinition).size()); } @@ -76,7 +76,7 @@ void valueWithMaxMin() { .build(); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("5"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("5"), caseFieldDefinition).size(), "5 should be with in range of between 5 and 10"); assertEquals(0, @@ -84,7 +84,7 @@ void valueWithMaxMin() { "5 should be with in range of between 5 and 10"); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("5.001"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("5.001"), caseFieldDefinition).size(), "5.001 should be with in range of between 5 and 10"); assertEquals(0, @@ -92,7 +92,8 @@ void valueWithMaxMin() { "5.001 should be with in range of between 5 and 10"); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("9.999999"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", + NODE_FACTORY.stringNode("9.999999"), caseFieldDefinition).size(), "9.999999 should be with in range of between 5 and 10"); assertEquals(0, @@ -100,7 +101,7 @@ void valueWithMaxMin() { "9.999999 should be with in range of between 5 and 10"); List textNodeBelowMin = validator.validate("TEST_FIELD_ID", - NODE_FACTORY.textNode("4.9"), + NODE_FACTORY.stringNode("4.9"), caseFieldDefinition); assertEquals(1, textNodeBelowMin.size(), "4.9 should not be with in range of between 5 and 10"); assertEquals("Should be more than or equal to 5", textNodeBelowMin.get(0).getErrorMessage()); @@ -112,7 +113,7 @@ void valueWithMaxMin() { assertEquals("Should be more than or equal to 5", numberNodeBelowMin.get(0).getErrorMessage()); List textNodeAboveMin = validator.validate("TEST_FIELD_ID", - NODE_FACTORY.textNode("10.1"), + NODE_FACTORY.stringNode("10.1"), caseFieldDefinition); assertEquals(1, textNodeAboveMin.size(), "10.1 should not be with in range of between 5 and 10"); assertEquals("Should be less than or equal to 10", textNodeAboveMin.get(0).getErrorMessage()); @@ -133,7 +134,7 @@ void valueWithSameMaxMin() { .build(); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("0"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("0"), caseFieldDefinition).size(), "0 should be with in range of between 0 and 0"); assertEquals(0, @@ -141,7 +142,7 @@ void valueWithSameMaxMin() { "0 should be with in range of between 0 and 0"); assertEquals(1, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("-1"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("-1"), caseFieldDefinition).size(), "-1 should not be with in range of between 0 and 0"); assertEquals(1, @@ -149,7 +150,7 @@ void valueWithSameMaxMin() { "-1 should not be with in range of between 0 and 0"); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("0.0000000000"), caseFieldDefinition) + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("0.0000000000"), caseFieldDefinition) .size(), "0.0000000000 should be with in range of between 0 and 0"); assertEquals(0, @@ -164,7 +165,7 @@ void valueWithSameDecimalMaxMin() { .build(); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("0"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("0"), caseFieldDefinition).size(), "0 should be with in range of between 0.00 and 0.00"); assertEquals(0, @@ -177,11 +178,11 @@ void fieldTypeRegEx() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("^\\d\\.\\d\\d$").build(); assertEquals(0, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("8.20"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("8.20"), caseFieldDefinition).size(), "regular expression check"); List results = - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("8.2"), caseFieldDefinition); + validator.validate("TEST_FIELD_ID", NODE_FACTORY.stringNode("8.2"), caseFieldDefinition); assertEquals(1, results.size(), "regular expression check"); assertEquals(REGEX_GUIDANCE, results.get(0).getErrorMessage()); } @@ -204,7 +205,8 @@ void incorrectFormat() { .build(); assertEquals(1, - validator.validate("TEST_FIELD_ID", NODE_FACTORY.textNode("10.1xxxx"), caseFieldDefinition).size(), + validator.validate("TEST_FIELD_ID", + NODE_FACTORY.stringNode("10.1xxxx"), caseFieldDefinition).size(), "Did not catch invalid 10.1xxxx"); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidatorTest.java index 97654c8512..a8be2d95b7 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/OrgPolicyCaseAssignedRoleValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -55,7 +55,7 @@ void failDueToIncorrectOrganisationRole() { final CaseFieldDefinition caseFieldDefinition = caseField().build(); caseFieldDefinition.setId("TEST"); - final JsonNode validValue = NODE_FACTORY.textNode("XXXX"); + final JsonNode validValue = NODE_FACTORY.stringNode("XXXX"); ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); final List validResult = validator.validate(validationContext1); @@ -90,7 +90,7 @@ void passOrganisationRole() { final Set roles = Collections.singleton("ROLE_1"); final CaseFieldDefinition caseFieldDefinition = caseField().build(); caseFieldDefinition.setCaseTypeId("TEST"); - final JsonNode validValue = NODE_FACTORY.textNode("ROLE_1"); + final JsonNode validValue = NODE_FACTORY.stringNode("ROLE_1"); ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); when(caseRoleRepository.getRoles(anyString())).thenReturn(roles); @@ -116,11 +116,11 @@ private ValidationContext createValidationContext(CaseFieldDefinition caseFieldD void textRegexFail() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("(?:^[0-9]{16}$|^\\d{4}-\\d{4}-\\d{4}-\\d{4}$)").build(); - final JsonNode validValue = NODE_FACTORY.textNode("15xxxx00"); + final JsonNode validValue = NODE_FACTORY.stringNode("15xxxx00"); ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); final List validResult = validator.validate(validationContext1); - final JsonNode invalidValue = NODE_FACTORY.textNode("15961077777774840593131"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("15961077777774840593131"); ValidationContext validationContext2 = createValidationContext(caseFieldDefinition, invalidValue); final List invalidResult = validator.validate(validationContext2); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidatorTest.java index e940aa002f..e245b484bb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/PhoneUKValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,27 +54,27 @@ void setUp() { @Test void validPhoneUKForBaseRegex() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("01222 555 555"), + NODE_FACTORY.stringNode("01222 555 555"), caseFieldDefinition); assertEquals(0, result01.size(), result01.toString()); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("(010) 55555555 #2222"), + NODE_FACTORY.stringNode("(010) 55555555 #2222"), caseFieldDefinition); assertEquals(0, result02.size(), result02.toString()); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("07222 555555"), + NODE_FACTORY.stringNode("07222 555555"), caseFieldDefinition); assertEquals(0, result03.size(), result03.toString()); final List result04 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("(07222) 555555"), + NODE_FACTORY.stringNode("(07222) 555555"), caseFieldDefinition); assertEquals(0, result04.size(), result04.toString()); final List result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("07222555555"), + NODE_FACTORY.stringNode("07222555555"), caseFieldDefinition); assertEquals(0, result05.size(), result05.toString()); } @@ -82,17 +82,17 @@ void validPhoneUKForBaseRegex() { @Test void invalidPhoneUKForBaseRegEx() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("3321M1 1AA"), + NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition); assertEquals(1, result01.size()); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("1m1 1m1"), + NODE_FACTORY.stringNode("1m1 1m1"), caseFieldDefinition); assertEquals(1, result02.size()); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("0800505555"), + NODE_FACTORY.stringNode("0800505555"), caseFieldDefinition); assertEquals(1, result03.size()); } @@ -101,12 +101,12 @@ void invalidPhoneUKForBaseRegEx() { void checkFieldRegex() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("^[0-9]*$").build(); final List validResult = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("123456789"), + NODE_FACTORY.stringNode("123456789"), caseFieldDefinition); assertEquals(0, validResult.size()); final List invalidResult = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("abc123"), + NODE_FACTORY.stringNode("abc123"), caseFieldDefinition); assertEquals(1, invalidResult.size(), invalidResult.toString()); } @@ -124,7 +124,7 @@ void getType() { @Test void testInvalidMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5).build(); - final JsonNode invalidMin = NODE_FACTORY.textNode("Test"); + final JsonNode invalidMin = NODE_FACTORY.stringNode("Test"); final List validationResults = validator.validate(FIELD_ID, invalidMin, caseFieldDefinition); assertEquals(1, validationResults.size(), "Did not catch min"); @@ -135,7 +135,7 @@ void testInvalidMin() { @Test void testInvalidMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(6).build(); - final JsonNode invalidMax = NODE_FACTORY.textNode("Test Test Test"); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test Test Test"); final List validationResults = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertEquals(1, validationResults.size(), "Did not catch max"); @@ -151,7 +151,7 @@ void testValidMinMaxButNoRegExChecks() { // Disable regular expression checks when(phoneUkBaseType.getRegularExpression()).thenReturn("^.*$"); - final JsonNode DATA = NODE_FACTORY.textNode("5 & 10"); + final JsonNode DATA = NODE_FACTORY.stringNode("5 & 10"); final List validMinMaxResults = validator.validate(FIELD_ID, DATA, caseFieldDefinition); assertEquals(0, validMinMaxResults.size(), validMinMaxResults.toString()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidatorTest.java index 5891b665d4..be9cd440d7 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/PostCodeValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -60,22 +60,22 @@ void setUp() { @Test void validPostCodesForBaseRegEx() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("M1 1AA"), + NODE_FACTORY.stringNode("M1 1AA"), caseFieldDefinition); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("N60 1NW"), + NODE_FACTORY.stringNode("N60 1NW"), caseFieldDefinition); final List result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("CR2 6XH"), + NODE_FACTORY.stringNode("CR2 6XH"), caseFieldDefinition); final List result04 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("DN55 1PT"), + NODE_FACTORY.stringNode("DN55 1PT"), caseFieldDefinition); final List result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("W1A 1HQ"), + NODE_FACTORY.stringNode("W1A 1HQ"), caseFieldDefinition); final List result06 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("EC1A 1BB"), + NODE_FACTORY.stringNode("EC1A 1BB"), caseFieldDefinition); assertAll( @@ -91,10 +91,10 @@ void validPostCodesForBaseRegEx() { @Test void invalidPostCodesForBaseRegEx() { final List result01 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("3321M1 1AA"), + NODE_FACTORY.stringNode("3321M1 1AA"), caseFieldDefinition); final List result02 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("1m1 1m1"), + NODE_FACTORY.stringNode("1m1 1m1"), caseFieldDefinition); assertAll( @@ -108,12 +108,12 @@ void invalidPostCodesForBaseRegEx() { void checkFieldRegex() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("^[0-9]*$").build(); final List validResult = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("123456789"), + NODE_FACTORY.stringNode("123456789"), caseFieldDefinition); assertEquals(0, validResult.size()); final List invalidResult = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("abc123"), + NODE_FACTORY.stringNode("abc123"), caseFieldDefinition); assertEquals(1, invalidResult.size(), invalidResult.toString()); } @@ -131,7 +131,7 @@ void getType() { @Test void testInvalidMin() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5).build(); - final JsonNode invalidMin = NODE_FACTORY.textNode("Test"); + final JsonNode invalidMin = NODE_FACTORY.stringNode("Test"); final List validationResults = validator.validate(FIELD_ID, invalidMin, caseFieldDefinition); assertEquals(1, validationResults.size(), "Did not catch min"); @@ -142,7 +142,7 @@ void testInvalidMin() { @Test void testInvalidMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(6).build(); - final JsonNode invalidMax = NODE_FACTORY.textNode("Test Test Test"); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test Test Test"); final List validationResults = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertEquals(1, validationResults.size(), "Did not catch max"); @@ -158,7 +158,7 @@ void testValidMinMaxButNoRegExChecks() { // Disable regular expression checks when(postcodeBaseType.getRegularExpression()).thenReturn("^.*$"); - final JsonNode DATA = NODE_FACTORY.textNode("5 & 10"); + final JsonNode DATA = NODE_FACTORY.stringNode("5 & 10"); final List validMinMaxResults = validator.validate(FIELD_ID, DATA, caseFieldDefinition); assertEquals(0, validMinMaxResults.size(), validMinMaxResults.toString()); } @@ -229,7 +229,7 @@ void shouldPass_whenValidatingNullNode() { void shouldPass_whenValidatingNulText() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(null), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(null), caseFieldDefinition); assertThat(result, empty()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/RegionValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/RegionValidatorTest.java index 0805841b90..4650ece295 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/RegionValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/RegionValidatorTest.java @@ -1,8 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -61,7 +60,7 @@ void setUp() { @Test @DisplayName("should be valid when text length between min and max") void regionFieldWithValidMinMax() { - final JsonNode DATA = NODE_FACTORY.textNode("5 & 10"); + final JsonNode DATA = NODE_FACTORY.stringNode("5 & 10"); final List validMinMaxResults = validator.validate(FIELD_ID, DATA, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); @@ -70,10 +69,10 @@ void regionFieldWithValidMinMax() { @Test @DisplayName("should NOT be valid when text length outside of min and max") void regionFieldWithInvalidMinMax() { - final JsonNode invalidMin = NODE_FACTORY.textNode("Test"); + final JsonNode invalidMin = NODE_FACTORY.stringNode("Test"); final List validMinResults = validator.validate(FIELD_ID, invalidMin, caseFieldDefinition); - final JsonNode invalidMax = NODE_FACTORY.textNode("Test Test Test"); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test Test Test"); final List validMaxResults = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertAll( @@ -92,7 +91,7 @@ void regionFieldWithInvalidMinMax() { @DisplayName("should be valid when no min and max defined") void regionFieldWithNoMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().build(); - final JsonNode value = NODE_FACTORY.textNode("Test"); + final JsonNode value = NODE_FACTORY.stringNode("Test"); final List validMinMaxResults = validator.validate(FIELD_ID, value, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); } @@ -103,16 +102,16 @@ void regionFieldWithSameMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5) .withMax(5) .build(); - final JsonNode valid_value = NODE_FACTORY.textNode("12345"); + final JsonNode valid_value = NODE_FACTORY.stringNode("12345"); final List validMinMaxResults = validator.validate(FIELD_ID, valid_value, caseFieldDefinition); // Test value over - final JsonNode over_value = NODE_FACTORY.textNode("123456"); + final JsonNode over_value = NODE_FACTORY.stringNode("123456"); final List overMinMaxResults = validator.validate(FIELD_ID, over_value, caseFieldDefinition); // Test value under - final JsonNode under_value = NODE_FACTORY.textNode("1234"); + final JsonNode under_value = NODE_FACTORY.stringNode("1234"); final List underMinMaxResults = validator.validate(FIELD_ID, under_value, caseFieldDefinition); @@ -127,10 +126,10 @@ void regionFieldWithSameMinMax() { @DisplayName("should test against regular expression") void regionRegex() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("\\d{4}-\\d{2}-\\d{2}").build(); - final JsonNode validValue = NODE_FACTORY.textNode("1234-56-78"); + final JsonNode validValue = NODE_FACTORY.stringNode("1234-56-78"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); - final JsonNode invalidValue = NODE_FACTORY.textNode("aa-56-78"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("aa-56-78"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, caseFieldDefinition); assertAll( @@ -153,10 +152,10 @@ void nullValue() { } @Test - @DisplayName("should be valid when input is null text node") - void nullTextValue() { + @DisplayName("should be valid when input is an explicit null node") + void explicitNullValue() { final List validationResult = - validator.validate(FIELD_ID, new TextNode(null), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.nullNode(), caseFieldDefinition); assertThat(validationResult, hasSize(0)); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextAreaValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextAreaValidatorTest.java index ce924193b2..00eb1163ea 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextAreaValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextAreaValidatorTest.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -69,7 +69,7 @@ void validate_shouldBeValidWhenNull() { @Test void validate_shouldBeValidWhenEmptyString() { - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode(""), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode(""), caseFieldDefinition); assertThat(results, is(emptyCollectionOf(ValidationResult.class))); @@ -78,7 +78,7 @@ void validate_shouldBeValidWhenEmptyString() { @Test void validate_shouldBeValidWhenNonEmptyString() { final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("Some text"), + NODE_FACTORY.stringNode("Some text"), caseFieldDefinition); assertThat(results, is(emptyCollectionOf(ValidationResult.class))); @@ -88,7 +88,7 @@ void validate_shouldBeValidWhenNonEmptyString() { void validate_shouldNotBeValidWhenMinimumLengthRequirementNotMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(4).build(); - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode("xxx"), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode("xxx"), caseFieldDefinition); assertThat(results, hasSize(1)); @@ -99,7 +99,7 @@ void validate_shouldNotBeValidWhenMinimumLengthRequirementNotMet() { void validate_shouldBeValidWhenMinimumLengthRequirementMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(4).build(); - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode("xxx4"), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode("xxx4"), caseFieldDefinition); assertThat(results, is(emptyCollectionOf(ValidationResult.class))); @@ -109,7 +109,7 @@ void validate_shouldBeValidWhenMinimumLengthRequirementMet() { void validate_shouldNotBeValidWhenMaximumLengthRequirementNotMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(4).build(); - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode("xxx45"), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode("xxx45"), caseFieldDefinition); assertThat(results, hasSize(1)); @@ -120,7 +120,7 @@ void validate_shouldNotBeValidWhenMaximumLengthRequirementNotMet() { void validate_shouldBeValidWhenMaximumLengthRequirementMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withMax(4).build(); - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode("xxx"), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode("xxx"), caseFieldDefinition); assertThat(results, is(emptyCollectionOf(ValidationResult.class))); @@ -130,7 +130,7 @@ void validate_shouldBeValidWhenMaximumLengthRequirementMet() { void validate_shouldNotBeValidWhenRegexRequirementNotMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("\\d{4}-\\d{2}-\\d{2}").build(); - final List results = validator.validate(FIELD_ID, NODE_FACTORY.textNode("3232"), + final List results = validator.validate(FIELD_ID, NODE_FACTORY.stringNode("3232"), caseFieldDefinition); assertThat(results, hasSize(1)); @@ -142,7 +142,7 @@ void validate_shouldBeValidWhenRegexRequirementMet() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("\\d{4}-\\d{2}-\\d{2}").build(); final List results = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("3232-32-32"), + NODE_FACTORY.stringNode("3232-32-32"), caseFieldDefinition); assertThat(results, is(emptyCollectionOf(ValidationResult.class))); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidatorTest.java index 1e472e9a59..861d7e851c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextCaseReferenceCaseLinkValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -68,11 +68,11 @@ void textRegexPass() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("(?:^[0-9]{16}$|^\\d{4}-\\d{4}-\\d{4}-\\d{4}$)").build(); - final JsonNode validValue = NODE_FACTORY.textNode("1596-1048-4059-0000"); + final JsonNode validValue = NODE_FACTORY.stringNode("1596-1048-4059-0000"); ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); final List validResult = validator.validate(validationContext1); - final JsonNode invalidValue = NODE_FACTORY.textNode("1596104840593131"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("1596104840593131"); ValidationContext validationContext2 = createValidationContext(caseFieldDefinition, invalidValue); final List invalidResult = validator.validate(validationContext2); @@ -96,11 +96,11 @@ private ValidationContext createValidationContext(CaseFieldDefinition caseFieldD void textRegexFail() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("(?:^[0-9]{16}$|^\\d{4}-\\d{4}-\\d{4}-\\d{4}$)").build(); - final JsonNode validValue = NODE_FACTORY.textNode("15xxxx00"); + final JsonNode validValue = NODE_FACTORY.stringNode("15xxxx00"); ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); final List validResult = validator.validate(validationContext1); - final JsonNode invalidValue = NODE_FACTORY.textNode("15961077777774840593131"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("15961077777774840593131"); ValidationContext validationContext2 = createValidationContext(caseFieldDefinition, invalidValue); final List invalidResult = validator.validate(validationContext2); @@ -117,7 +117,7 @@ void failDueToResourceNotFound() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("(?:^[0-9]{16}$|^\\d{4}-\\d{4}-\\d{4}-\\d{4}$)").build(); final String caseReference = "1596-1048-4059-0000"; - final JsonNode validValue = NODE_FACTORY.textNode(caseReference); + final JsonNode validValue = NODE_FACTORY.stringNode(caseReference); when(caseService.getCaseDetailsByCaseReference("1596104840590000")).thenThrow( new ResourceNotFoundException("No case exist with id=" + caseReference) @@ -126,7 +126,7 @@ void failDueToResourceNotFound() { ValidationContext validationContext1 = createValidationContext(caseFieldDefinition, validValue); final List validResult = validator.validate(validationContext1); - final JsonNode invalidValue = NODE_FACTORY.textNode("1596104840593131"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("1596104840593131"); ValidationContext validationContext2 = createValidationContext(caseFieldDefinition, invalidValue); final List invalidResult = validator.validate(validationContext2); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextValidatorTest.java index 3d83d873ac..c49096a713 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/TextValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/TextValidatorTest.java @@ -1,8 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -59,7 +58,7 @@ void setUp() { @Test @DisplayName("should be valid when text length between min and max") void textFieldWithValidMinMax() { - final JsonNode DATA = NODE_FACTORY.textNode("5 & 10"); + final JsonNode DATA = NODE_FACTORY.stringNode("5 & 10"); final List validMinMaxResults = validator.validate(FIELD_ID, DATA, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); @@ -68,10 +67,10 @@ void textFieldWithValidMinMax() { @Test @DisplayName("should NOT be valid when text length outside of min and max") void textFieldWithInvalidMinMax() { - final JsonNode invalidMin = NODE_FACTORY.textNode("Test"); + final JsonNode invalidMin = NODE_FACTORY.stringNode("Test"); final List validMinResults = validator.validate(FIELD_ID, invalidMin, caseFieldDefinition); - final JsonNode invalidMax = NODE_FACTORY.textNode("Test Test Test"); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test Test Test"); final List validMaxResults = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertAll( @@ -91,7 +90,7 @@ void textFieldWithInvalidMinMax() { @Test @DisplayName("should truncate field value in error when very long") void textFieldValueTruncatedForInvalidMax() { - final JsonNode invalidMax = NODE_FACTORY.textNode("Test ".repeat(20)); + final JsonNode invalidMax = NODE_FACTORY.stringNode("Test ".repeat(20)); final List validationList = validator.validate(FIELD_ID, invalidMax, caseFieldDefinition); assertThat("Max not caught", validationList, hasSize(1)); @@ -105,7 +104,7 @@ void textFieldValueTruncatedForInvalidMax() { @DisplayName("should be valid when no min and max defined") void textFieldWithNoMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().build(); - final JsonNode value = NODE_FACTORY.textNode("Test"); + final JsonNode value = NODE_FACTORY.stringNode("Test"); final List validMinMaxResults = validator.validate(FIELD_ID, value, caseFieldDefinition); assertThat(validMinMaxResults.toString(), validMinMaxResults, hasSize(0)); } @@ -116,16 +115,16 @@ void textFieldWithSameMinMax() { final CaseFieldDefinition caseFieldDefinition = caseField().withMin(5) .withMax(5) .build(); - final JsonNode valid_value = NODE_FACTORY.textNode("12345"); + final JsonNode valid_value = NODE_FACTORY.stringNode("12345"); final List validMinMaxResults = validator.validate(FIELD_ID, valid_value, caseFieldDefinition); // Test value over - final JsonNode over_value = NODE_FACTORY.textNode("123456"); + final JsonNode over_value = NODE_FACTORY.stringNode("123456"); final List overMinMaxResults = validator.validate(FIELD_ID, over_value, caseFieldDefinition); // Test value under - final JsonNode under_value = NODE_FACTORY.textNode("1234"); + final JsonNode under_value = NODE_FACTORY.stringNode("1234"); final List underMinMaxResults = validator.validate(FIELD_ID, under_value, caseFieldDefinition); @@ -140,10 +139,10 @@ void textFieldWithSameMinMax() { @DisplayName("should test against regular expression") void textRegex() { final CaseFieldDefinition caseFieldDefinition = caseField().withRegExp("\\d{4}-\\d{2}-\\d{2}").build(); - final JsonNode validValue = NODE_FACTORY.textNode("1234-56-78"); + final JsonNode validValue = NODE_FACTORY.stringNode("1234-56-78"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); - final JsonNode invalidValue = NODE_FACTORY.textNode("aa-56-78"); + final JsonNode invalidValue = NODE_FACTORY.stringNode("aa-56-78"); final List invalidResult = validator.validate(FIELD_ID, invalidValue, caseFieldDefinition); assertAll( @@ -166,10 +165,10 @@ void nullValue() { } @Test - @DisplayName("should be valid when input is null text node") - void nullTextValue() { + @DisplayName("should be valid when input is an explicit null node") + void explicitNullValue() { final List validationResult = - validator.validate(FIELD_ID, new TextNode(null), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.nullNode(), caseFieldDefinition); assertThat(validationResult, hasSize(0)); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/ValidationContextTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/ValidationContextTest.java index 377fc38130..c4e5a91b2a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/ValidationContextTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/ValidationContextTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.definition.CaseTypeDefinition; import uk.gov.hmcts.ccd.domain.model.std.CaseDataContent; @@ -9,8 +9,8 @@ import java.util.HashMap; import java.util.Map; -import static org.hibernate.validator.internal.util.Contracts.assertNotNull; -import static org.junit.Assert.assertNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; class ValidationContextTest { diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/YesNoValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/YesNoValidatorTest.java index 515d4e4c8c..09a9e13c6d 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/YesNoValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/YesNoValidatorTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -55,10 +55,10 @@ void setUp() { @Test void correctValue() { - final JsonNode upperYes = NODE_FACTORY.textNode("YES"); - final JsonNode lowerYes = NODE_FACTORY.textNode("yes"); - final JsonNode upperNo = NODE_FACTORY.textNode("NO"); - final JsonNode lowerNo = NODE_FACTORY.textNode("no"); + final JsonNode upperYes = NODE_FACTORY.stringNode("YES"); + final JsonNode lowerYes = NODE_FACTORY.stringNode("yes"); + final JsonNode upperNo = NODE_FACTORY.stringNode("NO"); + final JsonNode lowerNo = NODE_FACTORY.stringNode("no"); assertAll( () -> assertEquals(0, validator.validate(FIELD_ID, upperYes, caseFieldDefinition).size(), @@ -74,7 +74,7 @@ void correctValue() { @Test void incorrectValue() { - final JsonNode anything = NODE_FACTORY.textNode("dasdahsaAAA"); + final JsonNode anything = NODE_FACTORY.stringNode("dasdahsaAAA"); assertEquals(1, validator.validate(FIELD_ID, anything, caseFieldDefinition).size(), "Did not catch non YES/NO"); } @@ -156,7 +156,7 @@ void shouldPass_whenValidatingNullNode() { void shouldPass_whenValidatingNullValue() { final List result = - validator.validate(FIELD_ID, NODE_FACTORY.textNode(null), caseFieldDefinition); + validator.validate(FIELD_ID, NODE_FACTORY.stringNode(null), caseFieldDefinition); assertThat(result, empty()); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiserTest.java index 6096f6292f..b03851daaf 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CaseSanitiserTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; @@ -22,7 +22,7 @@ public class CaseSanitiserTest { - private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(); private static final CaseTypeDefinition CASE_TYPE = new CaseTypeDefinition(); @@ -30,8 +30,8 @@ public class CaseSanitiserTest { private static final FieldTypeDefinition SIMPLE_FIELD_TYPE = new FieldTypeDefinition(); private static final String SIMPLE_FIELD_ID = "FirstName"; private static final CaseFieldDefinition SIMPLE_FIELD = new CaseFieldDefinition(); - private static final JsonNode SIMPLE_VALUE_INITIAL = JSON_FACTORY.textNode("Initial value"); - private static final JsonNode SIMPLE_VALUE_SANITISED = JSON_FACTORY.textNode("Sanitised value"); + private static final JsonNode SIMPLE_VALUE_INITIAL = JSON_FACTORY.stringNode("Initial value"); + private static final JsonNode SIMPLE_VALUE_SANITISED = JSON_FACTORY.stringNode("Sanitised value"); private static final String TYPE_OTHER = "Other"; static { diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiserTest.java index 211f432f69..e449977583 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/CollectionSanitiserTest.java @@ -14,28 +14,28 @@ import static org.mockito.Mockito.verify; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COLLECTION; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition; public class CollectionSanitiserTest { - private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(); private static final String TYPE_1 = "Type1"; private static final FieldTypeDefinition FIELD_1_TYPE = new FieldTypeDefinition(); - private static final JsonNode ITEM_1_VALUE_INITIAL = JSON_FACTORY.textNode("Initial value 1"); - private static final JsonNode ITEM_1_VALUE_SANITISED = JSON_FACTORY.textNode("Sanitised value 1"); - private static final JsonNode ITEM_2_VALUE_INITIAL = JSON_FACTORY.textNode("Initial value 2"); - private static final JsonNode ITEM_2_VALUE_SANITISED = JSON_FACTORY.textNode("Sanitised value 2"); + private static final JsonNode ITEM_1_VALUE_INITIAL = JSON_FACTORY.stringNode("Initial value 1"); + private static final JsonNode ITEM_1_VALUE_SANITISED = JSON_FACTORY.stringNode("Sanitised value 1"); + private static final JsonNode ITEM_2_VALUE_INITIAL = JSON_FACTORY.stringNode("Initial value 2"); + private static final JsonNode ITEM_2_VALUE_SANITISED = JSON_FACTORY.stringNode("Sanitised value 2"); private static final FieldTypeDefinition COLLECTION_FIELD_TYPE = new FieldTypeDefinition(); - private static final JsonNode UNIQUE_ID = JSON_FACTORY.textNode("123"); + private static final JsonNode UNIQUE_ID = JSON_FACTORY.stringNode("123"); static { FIELD_1_TYPE.setId(TYPE_1); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiserTest.java index eacb5dd897..01094c1c63 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/ComplexSanitiserTest.java @@ -13,9 +13,9 @@ import static org.mockito.Mockito.verify; import static uk.gov.hmcts.ccd.domain.model.definition.FieldTypeDefinition.COMPLEX; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; @@ -23,21 +23,21 @@ public class ComplexSanitiserTest { - private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(); private static final String TYPE_1 = "Type1"; private static final FieldTypeDefinition FIELD_1_TYPE = new FieldTypeDefinition(); private static final String FIELD_1_ID = "FirstName"; private static final CaseFieldDefinition FIELD_1 = new CaseFieldDefinition(); - private static final JsonNode FIELD_1_VALUE_INITIAL = JSON_FACTORY.textNode("Initial value 1"); - private static final JsonNode FIELD_1_VALUE_SANITISED = JSON_FACTORY.textNode("Sanitised value 1"); + private static final JsonNode FIELD_1_VALUE_INITIAL = JSON_FACTORY.stringNode("Initial value 1"); + private static final JsonNode FIELD_1_VALUE_SANITISED = JSON_FACTORY.stringNode("Sanitised value 1"); private static final String TYPE_2 = "Type2"; private static final FieldTypeDefinition FIELD_2_TYPE = new FieldTypeDefinition(); private static final String FIELD_2_ID = "Money"; private static final CaseFieldDefinition FIELD_2 = new CaseFieldDefinition(); - private static final JsonNode FIELD_2_VALUE_INITIAL = JSON_FACTORY.textNode("Initial value 2"); - private static final JsonNode FIELD_2_VALUE_SANITISED = JSON_FACTORY.textNode("Sanitised value 2"); + private static final JsonNode FIELD_2_VALUE_INITIAL = JSON_FACTORY.stringNode("Initial value 2"); + private static final JsonNode FIELD_2_VALUE_SANITISED = JSON_FACTORY.stringNode("Sanitised value 2"); private static final FieldTypeDefinition COMPLEX_FIELD_TYPE = new FieldTypeDefinition(); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiserTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiserTest.java index a0f4c568f5..3fb7108b6b 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiserTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/DocumentSanitiserTest.java @@ -1,9 +1,9 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.NullNode; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -40,7 +40,7 @@ @DisplayName("DocumentSanitiser") class DocumentSanitiserTest { - private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(); private static final CaseTypeDefinition CASE_TYPE = new CaseTypeDefinition(); @@ -196,10 +196,10 @@ void shouldSanitizeIfDocumentRetrievedButNullHashToken() { @DisplayName("should not sanitise already sane document") void shouldNotSanitizeIfDocumentSanitizedAlready() { final JsonNode documentValue = JSON_FACTORY.objectNode(); - ((ObjectNode)documentValue).set(DOCUMENT_URL, JSON_FACTORY.textNode("testUrl")); - ((ObjectNode)documentValue).set(DOCUMENT_BINARY_URL, JSON_FACTORY.textNode("testBinaryUrl")); - ((ObjectNode)documentValue).set(DOCUMENT_FILENAME, JSON_FACTORY.textNode("testFilename")); - ((ObjectNode)documentValue).set(DOCUMENT_HASH, JSON_FACTORY.textNode("testHash")); + ((ObjectNode)documentValue).set(DOCUMENT_URL, JSON_FACTORY.stringNode("testUrl")); + ((ObjectNode)documentValue).set(DOCUMENT_BINARY_URL, JSON_FACTORY.stringNode("testBinaryUrl")); + ((ObjectNode)documentValue).set(DOCUMENT_FILENAME, JSON_FACTORY.stringNode("testFilename")); + ((ObjectNode)documentValue).set(DOCUMENT_HASH, JSON_FACTORY.stringNode("testHash")); JsonNode sanitisedDocument = documentSanitiser.sanitise(DOCUMENT_FIELD_TYPE, documentValue); diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/DocumentManagementRestClientTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/DocumentManagementRestClientTest.java index 022762883c..87f8ca8926 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/DocumentManagementRestClientTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/DocumentManagementRestClientTest.java @@ -1,9 +1,10 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser.client; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.node.ObjectNode; import com.xebialabs.restito.semantics.Action; import com.xebialabs.restito.server.StubServer; import org.glassfish.grizzly.http.Method; @@ -16,7 +17,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.web.client.RestTemplate; import uk.gov.hmcts.ccd.data.SecurityUtils; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; @@ -43,14 +44,14 @@ import static com.xebialabs.restito.semantics.Condition.withHeader; import static java.lang.String.format; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class DocumentManagementRestClientTest extends StubServerDependent { - private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_FACTORY = new JsonNodeFactory(); private static final String RESOURCE_URI = "/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d0"; private static final String DOCUMENT_URL = "http://localhost:%s" + RESOURCE_URI; private static final String BINARY_URL = "http://localhost:%s/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d0/binary"; @@ -65,7 +66,7 @@ public class DocumentManagementRestClientTest extends StubServerDependent { private static final String BEARER_TEST_JWT = "Bearer testJwt"; private static final String SERVICE_JWT = "ey373478378347847834783784"; - private ObjectMapper objectMapper = new ObjectMapper(); + private ObjectMapper objectMapper = JsonMapper.builderWithJackson2Defaults().build(); private RestTemplate restTemplate = new RestTemplate(); @Mock @@ -105,7 +106,7 @@ public void setUp() { document.setOriginalDocumentName(FILENAME); subject = new DocumentManagementRestClient(securityUtils, restTemplate); List> messageConverters = new ArrayList<>(); - MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); + JacksonJsonHttpMessageConverter converter = new JacksonJsonHttpMessageConverter(); converter.setSupportedMediaTypes(Collections.singletonList(MediaType.ALL)); messageConverters.add(converter); restTemplate.setMessageConverters(messageConverters); @@ -200,7 +201,7 @@ private String formatURL(String url) { return format(url, server.getPort()); } - private Action jsonContent(Object object) throws JsonProcessingException { + private Action jsonContent(Object object) throws JacksonException { return stringContent(objectMapper.writeValueAsString(object)); } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/StubServerDependent.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/StubServerDependent.java index 811efbaff0..d09be7d40a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/StubServerDependent.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/sanitiser/client/StubServerDependent.java @@ -1,24 +1,11 @@ package uk.gov.hmcts.ccd.domain.types.sanitiser.client; import com.xebialabs.restito.server.StubServer; -import com.xebialabs.restito.support.junit.ServerDependencyRule; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.Rule; public abstract class StubServerDependent { protected StubServer server; - @Rule - public ServerDependencyRule serverDependency = new ServerDependencyRule(); - - @BeforeEach - public void startServer() { - if (serverDependency.isServerDependent()) { - server = new StubServer().run(); - } - } - @AfterEach public void stopServer() { if (server != null) { diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CallbackTest.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CallbackTest.java index 6d19ad1090..cb79437fa6 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CallbackTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CallbackTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.client.WireMock; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; @@ -1458,7 +1458,7 @@ public void shouldCommitUpdatedCaseDetailsImmediatelyBeforeSendToPostCallback() future.get(); // This will rethrow Exceptions and Errors as ExecutionException } - private void stubForErrorCallbackResponse(final String url) throws JsonProcessingException { + private void stubForErrorCallbackResponse(final String url) throws JacksonException { final CallbackResponse callbackResponse = new CallbackResponse(); callbackResponse.setErrors(Collections.singletonList("Just a test")); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseAccessEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseAccessEndpointIT.java index baecef28f5..25cdd90452 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseAccessEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseAccessEndpointIT.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.core.type.TypeReference; +import tools.jackson.core.type.TypeReference; import com.github.tomakehurst.wiremock.client.WireMock; import com.google.common.collect.Lists; import org.hamcrest.MatcherAssert; diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointIT.java index 00ee6a308e..b5a62aae50 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointIT.java @@ -4,10 +4,11 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; import com.github.tomakehurst.wiremock.client.WireMock; import org.hamcrest.CoreMatchers; @@ -113,9 +114,9 @@ // too many legacy OperatorWrap occurrences on JSON strings so suppress until move to Java12+ @SuppressWarnings({"checkstyle:OperatorWrap", "checkstyle:FileTabCharacter"}) public class CaseDetailsEndpointIT extends WireMockBaseTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String UPLOAD_TIMESTAMP = "2000-02-29T00:00:00.000000000"; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_TYPE = "TestAddressBookCase"; private static final String CASE_TYPE_FILTERED = "TestAddressBookCaseFiltered"; private static final String CASE_TYPE_VALIDATE = "TestAddressBookCaseValidate"; @@ -1203,8 +1204,8 @@ void shouldReturn201WhenPostCreateCaseWithNoDataForCaseworker() throws Exception ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); @@ -1271,8 +1272,8 @@ void shouldReturn201WhenPostCreateCaseWithNoDataForCitizen() throws Exception { ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); @@ -1613,35 +1614,35 @@ void shouldReturn200WhenGetValidCaseForCaseworker() throws Exception { assertEquals("PROBATE", caseDetails.getJurisdiction()); assertEquals("CaseCreated", caseDetails.getState()); - assertEquals("Janet", caseDetails.getData().get("PersonFirstName").asText()); - assertEquals("Parker", caseDetails.getData().get("PersonLastName").asText()); - assertEquals("123", caseDetails.getData().get("PersonAddress").get("AddressLine1").asText()); - assertEquals("Fake Street", caseDetails.getData().get("PersonAddress").get("AddressLine2").asText()); - assertEquals("Hexton", caseDetails.getData().get("PersonAddress").get("AddressLine3").asText()); - assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asText()); - assertEquals("HX08 5TG", caseDetails.getData().get("PersonAddress").get("Postcode").asText()); + assertEquals("Janet", caseDetails.getData().get("PersonFirstName").asString()); + assertEquals("Parker", caseDetails.getData().get("PersonLastName").asString()); + assertEquals("123", caseDetails.getData().get("PersonAddress").get("AddressLine1").asString()); + assertEquals("Fake Street", caseDetails.getData().get("PersonAddress").get("AddressLine2").asString()); + assertEquals("Hexton", caseDetails.getData().get("PersonAddress").get("AddressLine3").asString()); + assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asString()); + assertEquals("HX08 5TG", caseDetails.getData().get("PersonAddress").get("Postcode").asString()); assertEquals("http://localhost:[port]/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d1", - caseDetails.getData().get("D8Document").get("document_url").asText()); + caseDetails.getData().get("D8Document").get("document_url").asString()); assertEquals("http://localhost:[port]/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d1/binary", - caseDetails.getData().get("D8Document").get("document_binary_url").asText()); + caseDetails.getData().get("D8Document").get("document_binary_url").asString()); assertEquals("Seagulls_Square.jpg", - caseDetails.getData().get("D8Document").get("document_filename").asText()); + caseDetails.getData().get("D8Document").get("document_filename").asString()); assertEquals(4, caseDetails.getDataClassification().size()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asText()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("classification") - .asText()); + .asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine1").asText()); + .get("AddressLine1").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine2").asText()); + .get("AddressLine2").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine3").asText()); + .get("AddressLine3").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Country").asText()); + .get("Country").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Postcode").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("D8Document").asText()); + .get("Postcode").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("D8Document").asString()); } { @@ -1661,28 +1662,28 @@ void shouldReturn200WhenGetValidCaseForCaseworker() throws Exception { assertEquals("PROBATE", caseDetails.getJurisdiction()); assertEquals("CaseCreated", caseDetails.getState()); - assertEquals("Peter", caseDetails.getData().get("PersonFirstName").asText()); - assertEquals("Pullen", caseDetails.getData().get("PersonLastName").asText()); - assertEquals("Governer House", caseDetails.getData().get("PersonAddress").get("AddressLine1").asText()); - assertEquals("1 Puddle Lane", caseDetails.getData().get("PersonAddress").get("AddressLine2").asText()); - assertEquals("London", caseDetails.getData().get("PersonAddress").get("AddressLine3").asText()); - assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asText()); - assertEquals("SE1 4EE", caseDetails.getData().get("PersonAddress").get("Postcode").asText()); + assertEquals("Peter", caseDetails.getData().get("PersonFirstName").asString()); + assertEquals("Pullen", caseDetails.getData().get("PersonLastName").asString()); + assertEquals("Governer House", caseDetails.getData().get("PersonAddress").get("AddressLine1").asString()); + assertEquals("1 Puddle Lane", caseDetails.getData().get("PersonAddress").get("AddressLine2").asString()); + assertEquals("London", caseDetails.getData().get("PersonAddress").get("AddressLine3").asString()); + assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asString()); + assertEquals("SE1 4EE", caseDetails.getData().get("PersonAddress").get("Postcode").asString()); assertEquals(3, caseDetails.getDataClassification().size()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asText()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("classification") - .asText()); + .asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine1").asText()); + .get("AddressLine1").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine2").asText()); + .get("AddressLine2").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine3").asText()); + .get("AddressLine3").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Country").asText()); + .get("Country").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Postcode").asText()); + .get("Postcode").asString()); } } @@ -1749,29 +1750,29 @@ void shouldReturn200WhenGetValidCaseForCitizen() throws Exception { assertEquals("PROBATE", caseDetails.getJurisdiction()); assertEquals("CaseCreated", caseDetails.getState()); - assertEquals("Janet", caseDetails.getData().get("PersonFirstName").asText()); - assertEquals("Parker", caseDetails.getData().get("PersonLastName").asText()); - assertEquals("123", caseDetails.getData().get("PersonAddress").get("AddressLine1").asText()); - assertEquals("Fake Street", caseDetails.getData().get("PersonAddress").get("AddressLine2").asText()); - assertEquals("Hexton", caseDetails.getData().get("PersonAddress").get("AddressLine3").asText()); - assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asText()); - assertEquals("HX08 5TG", caseDetails.getData().get("PersonAddress").get("Postcode").asText()); + assertEquals("Janet", caseDetails.getData().get("PersonFirstName").asString()); + assertEquals("Parker", caseDetails.getData().get("PersonLastName").asString()); + assertEquals("123", caseDetails.getData().get("PersonAddress").get("AddressLine1").asString()); + assertEquals("Fake Street", caseDetails.getData().get("PersonAddress").get("AddressLine2").asString()); + assertEquals("Hexton", caseDetails.getData().get("PersonAddress").get("AddressLine3").asString()); + assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asString()); + assertEquals("HX08 5TG", caseDetails.getData().get("PersonAddress").get("Postcode").asString()); assertEquals("http://localhost:[port]/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d1", - caseDetails.getData().get("D8Document").get("document_url").asText()); + caseDetails.getData().get("D8Document").get("document_url").asString()); assertEquals("http://localhost:[port]/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d1/binary", - caseDetails.getData().get("D8Document").get("document_binary_url").asText()); + caseDetails.getData().get("D8Document").get("document_binary_url").asString()); assertEquals("Seagulls_Square.jpg", - caseDetails.getData().get("D8Document").get("document_filename").asText()); + caseDetails.getData().get("D8Document").get("document_filename").asString()); assertEquals(4, caseDetails.getDataClassification().size()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asText()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("classification") - .asText()); + .asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine1").asText()); + .get("AddressLine1").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress") - .get("classification").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("D8Document").asText()); + .get("classification").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("D8Document").asString()); } { @@ -1791,26 +1792,26 @@ void shouldReturn200WhenGetValidCaseForCitizen() throws Exception { assertEquals("PROBATE", caseDetails.getJurisdiction()); assertEquals("CaseCreated", caseDetails.getState()); - assertEquals("Peter", caseDetails.getData().get("PersonFirstName").asText()); - assertEquals("Pullen", caseDetails.getData().get("PersonLastName").asText()); - assertEquals("Governer House", caseDetails.getData().get("PersonAddress").get("AddressLine1").asText()); - assertEquals("1 Puddle Lane", caseDetails.getData().get("PersonAddress").get("AddressLine2").asText()); - assertEquals("London", caseDetails.getData().get("PersonAddress").get("AddressLine3").asText()); - assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asText()); - assertEquals("SE1 4EE", caseDetails.getData().get("PersonAddress").get("Postcode").asText()); + assertEquals("Peter", caseDetails.getData().get("PersonFirstName").asString()); + assertEquals("Pullen", caseDetails.getData().get("PersonLastName").asString()); + assertEquals("Governer House", caseDetails.getData().get("PersonAddress").get("AddressLine1").asString()); + assertEquals("1 Puddle Lane", caseDetails.getData().get("PersonAddress").get("AddressLine2").asString()); + assertEquals("London", caseDetails.getData().get("PersonAddress").get("AddressLine3").asString()); + assertEquals("England", caseDetails.getData().get("PersonAddress").get("Country").asString()); + assertEquals("SE1 4EE", caseDetails.getData().get("PersonAddress").get("Postcode").asString()); assertEquals(3, caseDetails.getDataClassification().size()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asText()); - assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asText()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonFirstName").asString()); + assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonLastName").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine1").asText()); + .get("AddressLine1").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine2").asText()); + .get("AddressLine2").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("AddressLine3").asText()); + .get("AddressLine3").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Country").asText()); + .get("Country").asString()); assertEquals("PUBLIC", caseDetails.getDataClassification().get("PersonAddress").get("value") - .get("Postcode").asText()); + .get("Postcode").asString()); } } @@ -3904,7 +3905,7 @@ private void shouldReturn200WithCaseDataWithTLLWhenGetTokenForStartEvent(String CaseDetails caseDetails = actualStartEventResult.getCaseDetails(); String expectedSystemTTL = LocalDate.now().plusDays(20).toString(); assertAll( - () -> assertThat(caseDetails.getData().get(TTL_CASE_FIELD_ID).get("SystemTTL").textValue(), + () -> assertThat(caseDetails.getData().get(TTL_CASE_FIELD_ID).get("SystemTTL").stringValue(), is(expectedSystemTTL)) ); } @@ -5183,8 +5184,8 @@ void shouldReturn201WhenPostCreateCaseWithCreatorRoleWithNoDataForCaseworker() t ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); @@ -5233,8 +5234,8 @@ void shouldReturn201WhenPostCreateCaseWithCreatorRoleWithNoDataForCitizen() thro ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); @@ -5287,7 +5288,7 @@ private void assertCaseDataResultSetSize() { } private JsonNode getTextNode(String value) { - return JSON_NODE_FACTORY.textNode(value); + return JSON_NODE_FACTORY.stringNode(value); } private String exampleDataWithInvalidPostcode() { @@ -6199,11 +6200,11 @@ public void shouldAttachDocumentToCdamWhenCallbackIgnoreDocumentctionField() thr boolean newItemSaved = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-002".equals(item.get("id").asText()) + if ("new-item-id-002".equals(item.get("id").asString()) && item.path("value") .path("documentFile") .path("document_url") - .asText() + .asString() .contains(newDocumentId)) { newItemSaved = true; break; @@ -6321,7 +6322,7 @@ public void shouldNotAttachDocumentToCdamWhenCallbackDeleteCollectionItemRemovin boolean newItemFound = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-002".equals(item.path("id").asText())) { + if ("new-item-id-002".equals(item.path("id").asString())) { newItemFound = true; break; } @@ -6451,7 +6452,7 @@ public void shouldNotAttachDocumentToCdamWhenCallbackReplacesCollectionItemRemov boolean newItemFound = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-002".equals(item.path("id").asText())) { + if ("new-item-id-002".equals(item.path("id").asString())) { newItemFound = true; break; } @@ -6503,7 +6504,7 @@ public void shouldUpdateDocumentCategoryIdAndNotCallCdamForSystemEvent() throws assertThat(savedCase.getData(), hasKey("D8Document")); final JsonNode savedDocument = mapper.convertValue( savedCase.getData().get("D8Document"), JsonNode.class); - assertThat(savedDocument.path("category_id").asText(), is("caseDocuments")); + assertThat(savedDocument.path("category_id").asString(), is("caseDocuments")); com.github.tomakehurst.wiremock.client.WireMock.verify(0, patchRequestedFor(urlMatching("/cases/documents/attachToCase.*"))); @@ -6594,11 +6595,11 @@ public void shouldAttachDocumentToCdamWhenCallbackRetainsDocumentOnCaseCreation( boolean documentSaved = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-001".equals(item.path("id").asText()) + if ("new-item-id-001".equals(item.path("id").asString()) && item.path("value") .path("documentFile") .path("document_url") - .asText() + .asString() .contains(newDocumentId)) { documentSaved = true; break; @@ -6702,11 +6703,11 @@ public void shouldNotAttachDocumentToCdamWhenCallbackStripsDocumentSubfieldOnCas boolean documentSaved = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-001".equals(item.path("id").asText()) + if ("new-item-id-001".equals(item.path("id").asString()) && item.path("value") .path("documentFile") .path("document_url") - .asText() + .asString() .contains(newDocumentId)) { documentSaved = true; break; @@ -6716,7 +6717,7 @@ public void shouldNotAttachDocumentToCdamWhenCallbackStripsDocumentSubfieldOnCas boolean newItemFound = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-002".equals(item.path("id").asText())) { + if ("new-item-id-002".equals(item.path("id").asString())) { newItemFound = true; break; } @@ -6844,11 +6845,11 @@ public void shouldNotAttachDocumentToCdamWhenCallbackReplaceDocumentSubfieldOnCa boolean documentSaved = false; for (JsonNode item : savedDocuments) { - if ("existing-item-id-001".equals(item.path("id").asText()) + if ("existing-item-id-001".equals(item.path("id").asString()) && item.path("value") .path("documentFile") .path("document_url") - .asText() + .asString() .contains("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")) { documentSaved = true; break; @@ -6857,11 +6858,11 @@ public void shouldNotAttachDocumentToCdamWhenCallbackReplaceDocumentSubfieldOnCa assertThat("Item should exist in savedDocuments", documentSaved, is(true)); for (JsonNode item : savedDocuments) { - if ("new-item-id-003".equals(item.path("id").asText()) + if ("new-item-id-003".equals(item.path("id").asString()) && item.path("value") .path("documentFile") .path("document_url") - .asText() + .asString() .contains(newCallbackDocumentId)) { documentSaved = true; break; @@ -6871,7 +6872,7 @@ public void shouldNotAttachDocumentToCdamWhenCallbackReplaceDocumentSubfieldOnCa boolean newItemFound = false; for (JsonNode item : savedDocuments) { - if ("new-item-id-002".equals(item.path("id").asText())) { + if ("new-item-id-002".equals(item.path("id").asString())) { newItemFound = true; break; } diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointPostStateIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointPostStateIT.java index cc23f50eb8..79973f92eb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointPostStateIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointPostStateIT.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import java.util.List; import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; @@ -86,7 +86,7 @@ public void shouldIgnorePostStateConditionWhenFieldNotAssignedToEvent() throws E performRequestAndValidate(data, "Goodness", "CaseEnteredIntoLegacy"); } - private JsonNode createData() throws com.fasterxml.jackson.core.JsonProcessingException { + private JsonNode createData() throws tools.jackson.core.JacksonException { return mapper.readTree("{" + "\"PersonLastName\":\"Test Last\"," + "\"PersonFirstName\":\"Test First\"}"); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointTest.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointTest.java index 882d177cce..014ad263eb 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -233,7 +234,7 @@ void createCaseEventForCaseWorker() { void validateCaseFieldsForCaseWorker() { String pageId = "pageId"; final Map data = new HashMap<>(); - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); ObjectNode objectNode = mapper.createObjectNode(); objectNode.set("data", mapper.valueToTree(data)); final JsonNode toBeReturned = objectNode; diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointUserRolesIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointUserRolesIT.java index c3027d8c6c..50c4542c2a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointUserRolesIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseDetailsEndpointUserRolesIT.java @@ -9,6 +9,7 @@ import org.springframework.web.context.WebApplicationContext; import uk.gov.hmcts.ccd.MockUtils; import uk.gov.hmcts.ccd.WireMockBaseTest; +import uk.gov.hmcts.ccd.config.JacksonUtils; import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; import uk.gov.hmcts.ccd.domain.model.std.AuditEvent; import uk.gov.hmcts.ccd.domain.model.std.CaseDataContent; @@ -69,8 +70,8 @@ public void shouldReturn201WhenPostCreateCaseWithCreatorRoleWithNoDataForCasewor ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); @@ -124,8 +125,8 @@ public void shouldReturn201WhenPostCreateCaseWithCreatorRoleWithNoDataForCitizen ).andExpect(status().is(201)) .andReturn(); - assertEquals("Expected empty case data", "", mapper.readTree(mvcResult.getResponse().getContentAsString()) - .get("case_data").asText()); + assertEquals("Expected empty case data", "", JacksonUtils.asText( + mapper.readTree(mvcResult.getResponse().getContentAsString()).get("case_data"))); final List caseDetailsList = template.query("SELECT * FROM case_data", this::mapCaseData); assertEquals("Incorrect number of cases", 1, caseDetailsList.size()); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointIT.java index 7de42a208c..0d7ba3b18e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointIT.java @@ -8,8 +8,7 @@ import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.core.search.HitsMetadata; import co.elastic.clients.elasticsearch.core.search.TotalHits; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -306,7 +305,6 @@ private void stubElasticSearchSearchRequestWillReturn(String caseDetailElastic, } public static List parseSources(String json) throws Exception { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode root = mapper.readTree(json); List caseDetailsList = new ArrayList<>(); JsonNode hitsArray = root.path("hits").path("hits"); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointTest.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointTest.java index f5dc26c522..7790292644 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/CaseSearchEndpointTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import com.google.common.collect.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -102,13 +102,13 @@ void shouldThrowBadRequestExceptionWhenCaseTypeListIsEmptyAndGlobalTrue() { } @Test - void searchCaseDetailsInvokesOperation() throws JsonProcessingException { + void searchCaseDetailsInvokesOperation() throws JacksonException { // ARRANGE CaseSearchResult result = mock(CaseSearchResult.class); when(caseSearchOperation.execute(any(CrossCaseTypeSearchRequest.class), anyBoolean())).thenReturn(result); String searchRequest = "{\"query\": {\"match\": \"blah blah\"}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); List caseTypeIds = singletonList(CASE_TYPE_ID); @@ -131,7 +131,7 @@ void searchCaseDetailsInvokesOperation() throws JsonProcessingException { } @Test - void searchCaseDetailsGlobalInvokesOperation() throws JsonProcessingException { + void searchCaseDetailsGlobalInvokesOperation() throws JacksonException { // ARRANGE when(applicationParams.getGlobalSearchIndexName()).thenReturn(GLOBAL_INDEX); @@ -139,7 +139,7 @@ void searchCaseDetailsGlobalInvokesOperation() throws JsonProcessingException { CaseSearchResult result = mock(CaseSearchResult.class); when(caseSearchOperation.execute(any(CrossCaseTypeSearchRequest.class), anyBoolean())).thenReturn(result); String searchRequest = "{\"query\": {\"match\": \"blah blah\"}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); List caseTypeIds = singletonList(CASE_TYPE_ID); @@ -165,13 +165,13 @@ void searchCaseDetailsGlobalInvokesOperation() throws JsonProcessingException { } @Test - void searchCaseDetailsInvokesOperationWithExpandedCaseTypesForWildcard() throws JsonProcessingException { + void searchCaseDetailsInvokesOperationWithExpandedCaseTypesForWildcard() throws JacksonException { // ARRANGE CaseSearchResult result = mock(CaseSearchResult.class); when(caseSearchOperation.execute(any(CrossCaseTypeSearchRequest.class), anyBoolean())).thenReturn(result); String searchRequest = "{\"query\": {\"match\": \"blah blah\"}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); List caseTypeIds = singletonList(ElasticsearchRequest.WILDCARD); @@ -202,7 +202,7 @@ void searchCases_globalTrueAndWildcardExpandsCaseTypes() throws Exception { when(applicationParams.getGlobalSearchIndexType()).thenReturn(INDEX_TYPE_DOC); String searchRequest = "{\"query\": {\"match_all\": {}}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DecentralisedPersistenceIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DecentralisedPersistenceIT.java index 091168ffa1..4c11137b7a 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DecentralisedPersistenceIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DecentralisedPersistenceIT.java @@ -1,14 +1,14 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.stubbing.Scenario; -import org.junit.Before; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.jdbc.Sql; @@ -23,7 +23,7 @@ import uk.gov.hmcts.ccd.domain.model.std.CaseDataContent; import uk.gov.hmcts.ccd.domain.model.std.AuditEvent; -import javax.inject.Inject; +import jakarta.inject.Inject; import java.io.IOException; import java.util.List; import java.util.Map; @@ -86,7 +86,7 @@ public class DecentralisedPersistenceIT extends WireMockBaseTest { private JdbcTemplate jdbcTemplate; private JsonNode data; - @Before + @BeforeEach public void setUp() throws IOException { data = mapper.readTree(DATA_JSON_STRING); @@ -105,7 +105,7 @@ public void setUp() throws IOException { .willReturn(okJson(getTestDefinition(wiremockPort, DECENTRALISED_CASE_TYPE_ID)).withStatus(200))); } - @After + @AfterEach public void tearDown() { wireMockServer.resetAll(); } @@ -181,7 +181,7 @@ public void test1_shouldInvokeServicePersistenceAPIWhenCreatingDecentralisedCase assertThat(actualResponseData) .as("Response should contain case data from decentralised service (only readable fields)") - .containsEntry("PersonLastName", expectedResponseDataNode.get("PersonLastName").asText()) + .containsEntry("PersonLastName", expectedResponseDataNode.get("PersonLastName").asString()) .containsEntry("PersonAddress", expectedAddress); // AND: The ServicePersistenceAPI should have been called exactly once @@ -252,6 +252,11 @@ public void testGetCase() throws Exception { Map responseBody = mapper.readValue(content, Map.class); Map responseData = (Map) responseBody.get("data"); assertEquals("Roof", responseData.get("PersonLastName")); + Map responseAddress = (Map) responseData.get("PersonAddress"); + assertEquals("Wales", responseAddress.get("Country")); + Map links = (Map) responseBody.get("_links"); + Map selfLink = (Map) links.get("self"); + assertThat(selfLink.get("href").toString()).endsWith(URL); } @@ -508,7 +513,7 @@ public void shouldReturnDecentralisedEventHistoryForCaseworker() throws Exceptio assertEquals("Expected decentralised case history view to be returned", 200, status); final JsonNode response = mapper.readTree(mvcResult.getResponse().getContentAsString()); - assertThat(response.get("case_id").asText()) + assertThat(response.get("case_id").asString()) .as("Response should include original case reference") .isEqualTo(caseReference); @@ -516,9 +521,9 @@ public void shouldReturnDecentralisedEventHistoryForCaseworker() throws Exceptio assertThat(responseEvent.get("id").asLong()) .as("Case history view should include decentralised event id") .isEqualTo(eventId); - assertThat(responseEvent.get("event_name").asText()).isEqualTo("Create Case"); - assertThat(responseEvent.get("event_id").asText()).isEqualTo("CREATE-CASE"); - assertThat(responseEvent.get("state_id").asText()).isEqualTo("CaseCreated"); + assertThat(responseEvent.get("event_name").asString()).isEqualTo("Create Case"); + assertThat(responseEvent.get("event_id").asString()).isEqualTo("CREATE-CASE"); + assertThat(responseEvent.get("state_id").asString()).isEqualTo("CaseCreated"); verify(getRequestedFor(urlEqualTo("/ccd-persistence/cases/" + caseReference + "/history/" + eventId))); @@ -757,7 +762,7 @@ private String startEventToken(String caseId, String eventId) throws Exception { assertEquals("Start event should provide a valid token", 200, startEventResult.getResponse().getStatus()); final JsonNode startEventJson = mapper.readTree(startEventResult.getResponse().getContentAsString()); - return startEventJson.get("token").asText(); + return startEventJson.get("token").asString(); } private CaseDataContent buildEventContent(String token, JsonNode caseData, String eventId) { diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DraftsEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DraftsEndpointIT.java index f66b0b5c80..05165d6b92 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DraftsEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/DraftsEndpointIT.java @@ -1,6 +1,6 @@ package uk.gov.hmcts.ccd.endpoint.std; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/GlobalSearchEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/GlobalSearchEndpointIT.java index 98c91900c8..1bc217b8e4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/std/GlobalSearchEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/std/GlobalSearchEndpointIT.java @@ -8,8 +8,8 @@ import co.elastic.clients.elasticsearch.core.search.HitsMetadata; import co.elastic.clients.elasticsearch.core.search.TotalHits; import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -285,7 +285,7 @@ void shouldReturn200WhenOneValidFieldInSearchCriteria_Jurisdiction() throws Exce } private JsonNode toJsonNode(String value) { - return new ObjectMapper().convertValue(value, JsonNode.class); + return JsonMapper.builderWithJackson2Defaults().build().convertValue(value, JsonNode.class); } private MsearchResponse mockMultiSearchResponse() { diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/CallbackTest.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/CallbackTest.java index ff324d1ca8..1da2866e16 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/CallbackTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/CallbackTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.endpoint.ui; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.client.WireMock; import org.assertj.core.util.Lists; import org.hamcrest.FeatureMatcher; @@ -109,7 +109,7 @@ public CallbackTest() throws IOException { } @BeforeEach - public void setUp() throws JsonProcessingException { + public void setUp() throws JacksonException { CALLBACK_DATA = mapper.readTree(CALLBACK_DATA_JSON_STRING); CALLBACK_DATA_CLASSIFICATION = mapper.readTree(CALLBACK_DATA_CLASSIFICATION_JSON_STRING); diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/ExternalUserRoleIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/ExternalUserRoleIT.java index 33db01448d..20a67d9837 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/ExternalUserRoleIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/ExternalUserRoleIT.java @@ -2,8 +2,8 @@ import com.github.tomakehurst.wiremock.client.WireMock; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; @@ -17,14 +17,14 @@ import uk.gov.hmcts.ccd.domain.model.definition.CaseDetails; import uk.gov.hmcts.ccd.domain.model.std.AuditEvent; -import javax.inject.Inject; +import jakarta.inject.Inject; import java.util.List; import static com.github.tomakehurst.wiremock.client.WireMock.okJson; import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.http.HttpHeaders.AUTHORIZATION; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -50,7 +50,7 @@ public class ExternalUserRoleIT extends WireMockBaseTest { private MockMvc mockMvc; private JdbcTemplate template; - @Before + @BeforeEach public void setUp() { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_EXTERNAL_USER); mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); @@ -73,10 +73,10 @@ public void shouldReturnForbiddenWhenEventUserRoleIsExternal() throws Exception // Check that we have the expected test data set size List resultList = template.query("SELECT * FROM case_data", this::mapCaseData); - assertEquals("Incorrect data initiation", 1, resultList.size()); + assertEquals(1, resultList.size(), "Incorrect data initiation"); List eventList = template.query("SELECT * FROM case_event", this::mapAuditEvent); - assertEquals("Incorrect data initiation", 3, eventList.size()); + assertEquals(3, eventList.size(), "Incorrect data initiation"); mockMvc.perform(get(String.format(GET_CASE_HISTORY_FOR_EVENT_EXTERNAL, eventList.get(1).getId())) diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/QueryEndpointIT.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/QueryEndpointIT.java index a32c52e9a3..b63ee82ae6 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/QueryEndpointIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/ui/QueryEndpointIT.java @@ -1,13 +1,10 @@ package uk.gov.hmcts.ccd.endpoint.ui; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import org.junit.Test; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.jdbc.Sql; @@ -75,7 +72,6 @@ import static uk.gov.hmcts.ccd.v2.DCPTestHelper.arrayOf; import static uk.gov.hmcts.ccd.v2.DCPTestHelper.mapOf; -@ExtendWith(MockitoExtension.class) public class QueryEndpointIT extends WireMockBaseTest { private static final String GET_CASES = "/aggregated/caseworkers/0/jurisdictions/PROBATE/case-types/" + "TestAddressBookCase/cases"; @@ -144,7 +140,7 @@ public class QueryEndpointIT extends WireMockBaseTest { private static final String GET_CASES_DCP = "/aggregated/caseworkers/0/jurisdictions/DCPTest1/case-types/DCP/cases"; - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String TEST_CASE_TYPE = "TestAddressBookCase"; private static final String TEST_JURISDICTION = "PROBATE"; @@ -986,7 +982,7 @@ public void validGetCase() throws Exception { final CaseViewActionableEvent[] actionableEvents = caseView.getActionableEvents(); assertNotNull("Triggers are null", actionableEvents); - assertEquals("Should only get valid triggers", 1, actionableEvents.length); + assertEquals("Should only get valid triggers", 2, actionableEvents.length); // checks Trigger 1 content assertEquals("Trigger ID", "HAS_PRE_STATES_EVENT", actionableEvents[0].getId()); @@ -995,6 +991,13 @@ public void validGetCase() throws Exception { .getDescription()); assertEquals("Trigger Order", Integer.valueOf(1), actionableEvents[0].getOrder()); + // checks Trigger 2 content + assertEquals("Trigger ID", "DOCUMENT_COLLECTION_EVENT", actionableEvents[1].getId()); + assertEquals("Trigger Name", "DOCUMENT COLLECTION EVENT", actionableEvents[1].getName()); + assertEquals("Trigger Description", "Test event for document collection callback filter", + actionableEvents[1].getDescription()); + assertEquals("Trigger Order", Integer.valueOf(2), actionableEvents[1].getOrder()); + // audit-log assertions ArgumentCaptor captor = ArgumentCaptor.forClass(AuditEntry.class); verify(auditRepository).save(captor.capture()); @@ -1764,7 +1767,6 @@ public void shouldSearchCasesWithFormattedDCP() throws Exception { .andExpect(status().is(200)) .andReturn(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final SearchResultView searchResultView = mapper.readValue(result.getResponse().getContentAsString(), SearchResultView.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfigurationTest.java b/src/test/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfigurationTest.java new file mode 100644 index 0000000000..f7d7ddf626 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/ccd/feign/FeignHttpMessageConvertersConfigurationTest.java @@ -0,0 +1,57 @@ +package uk.gov.hmcts.ccd.feign; + +import java.util.List; +import java.util.Map; + +import tools.jackson.databind.json.JsonMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.http.converter.autoconfigure.HttpMessageConvertersAutoConfiguration; +import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.cloud.openfeign.support.FeignHttpMessageConverters; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; +import org.springframework.test.util.ReflectionTestUtils; +import uk.gov.hmcts.ccd.config.JacksonObjectMapperConfig; + +import static org.assertj.core.api.Assertions.assertThat; + +class FeignHttpMessageConvertersConfigurationTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + JacksonAutoConfiguration.class, + HttpMessageConvertersAutoConfiguration.class + )) + .withUserConfiguration( + JacksonObjectMapperConfig.class, + FeignHttpMessageConvertersConfiguration.class + ); + + @Test + void shouldEagerlyInitializeCcdJackson3ConvertersBeforePublishingBean() { + contextRunner.run(context -> { + FeignHttpMessageConverters feignConverters = context.getBean(FeignHttpMessageConverters.class); + + Object initializedConverters = ReflectionTestUtils.getField(feignConverters, "converters"); + assertThat(initializedConverters).isInstanceOf(List.class); + + @SuppressWarnings("unchecked") + List> converterList = + (List>) initializedConverters; + assertThat(converterList).isNotEmpty(); + + List> jsonConverters = converterList.stream() + .filter(converter -> converter.canWrite(Map.class, MediaType.APPLICATION_JSON)) + .toList(); + assertThat(jsonConverters).singleElement().isExactlyInstanceOf(JacksonJsonHttpMessageConverter.class); + + JacksonJsonHttpMessageConverter jacksonConverter = + (JacksonJsonHttpMessageConverter) jsonConverters.getFirst(); + assertThat(jacksonConverter.getMapper()) + .isSameAs(context.getBean("DefaultObjectMapper", JsonMapper.class)); + }); + } +} diff --git a/src/test/java/uk/gov/hmcts/ccd/integrations/DefinitionsCachingIT.java b/src/test/java/uk/gov/hmcts/ccd/integrations/DefinitionsCachingIT.java index 077b7a64a8..7514d399cd 100644 --- a/src/test/java/uk/gov/hmcts/ccd/integrations/DefinitionsCachingIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/integrations/DefinitionsCachingIT.java @@ -1,18 +1,20 @@ package uk.gov.hmcts.ccd.integrations; import org.junit.Assert; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.wiremock.spring.EnableWireMock; import uk.gov.hmcts.ccd.ApplicationParams; import uk.gov.hmcts.ccd.data.definition.CachedCaseDefinitionRepository; import uk.gov.hmcts.ccd.data.definition.CachedUIDefinitionGateway; @@ -49,7 +51,7 @@ @ExtendWith(SpringExtension.class) @SpringBootTest -@AutoConfigureWireMock(port = 0) +@EnableWireMock @TestPropertySource(locations = "classpath:test.properties") public class DefinitionsCachingIT { @@ -71,6 +73,8 @@ public class DefinitionsCachingIT { private static final JurisdictionDefinition JURISDICTION_DEFINITION_2 = new JurisdictionDefinition(); private static final JurisdictionDefinition JURISDICTION_DEFINITION_3 = new JurisdictionDefinition(); + private AutoCloseable mocks; + @MockitoSpyBean private DefaultCaseDefinitionRepository caseDefinitionRepository; @@ -109,6 +113,7 @@ public class DefinitionsCachingIT { @BeforeEach public void setup() { + mocks = MockitoAnnotations.openMocks(this); initiateWizardPageList(wizardPageList); doReturn(caseTypeDefinitionVersion(VERSION_1)).when(this.caseDefinitionRepository) @@ -129,6 +134,11 @@ public void setup() { doReturn(wizardPageList).when(this.httpUIDefinitionGateway).getWizardPageCollection(VERSION_1, ID_1, EVENT_ID); } + @AfterEach + void closeMocks() throws Exception { + mocks.close(); + } + private void initiateWizardPageList(List wizardPageList) { WizardPageField wizardPageField = new WizardPageField(); diff --git a/src/test/java/uk/gov/hmcts/ccd/integrations/IdamIT.java b/src/test/java/uk/gov/hmcts/ccd/integrations/IdamIT.java index 95e85cf3e4..6af59f6e96 100644 --- a/src/test/java/uk/gov/hmcts/ccd/integrations/IdamIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/integrations/IdamIT.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; diff --git a/src/test/java/uk/gov/hmcts/ccd/integrations/ServiceToServiceIT.java b/src/test/java/uk/gov/hmcts/ccd/integrations/ServiceToServiceIT.java index 13dedc847a..6f57e87f82 100644 --- a/src/test/java/uk/gov/hmcts/ccd/integrations/ServiceToServiceIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/integrations/ServiceToServiceIT.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.resttestclient.TestRestTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; diff --git a/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchIndexSettings.java b/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchIndexSettings.java index cb37a873b6..69789b5812 100644 --- a/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchIndexSettings.java +++ b/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchIndexSettings.java @@ -1,8 +1,10 @@ package uk.gov.hmcts.ccd.test; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; @@ -17,7 +19,7 @@ @Slf4j public class ElasticsearchIndexSettings { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private final Map types; private final Optional settings; private final Optional aliases; @@ -66,7 +68,7 @@ public static String unwrapIO(InputStream stream) { public static JsonNode rawToJson(String rawJson) { try { return OBJECT_MAPPER.readTree(rawJson); - } catch (IOException e) { + } catch (JacksonException e) { throw new RuntimeException("Problem converting to JSON", e); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchTestHelper.java b/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchTestHelper.java index 6707d9b4e4..cdb4080927 100644 --- a/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchTestHelper.java +++ b/src/test/java/uk/gov/hmcts/ccd/test/ElasticsearchTestHelper.java @@ -8,7 +8,7 @@ import co.elastic.clients.elasticsearch.core.search.HitsMetadata; import co.elastic.clients.elasticsearch.core.search.TotalHits; import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.google.common.base.Strings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/BaseCaseAssignedUserRolesControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/BaseCaseAssignedUserRolesControllerIT.java index 62d0c5ed03..414746139c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/BaseCaseAssignedUserRolesControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/BaseCaseAssignedUserRolesControllerIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.github.tomakehurst.wiremock.client.WireMock; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; @@ -142,7 +141,6 @@ void setUp() throws IOException { ); mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String userJson = "{\n" + " \"sub\": \"Cloud.Strife@test.com\",\n" diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerDCPIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerDCPIT.java index ed2e1ac567..26df8731cd 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerDCPIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerDCPIT.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -82,7 +81,6 @@ public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); template = new JdbcTemplate(db); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test @@ -103,16 +101,16 @@ public void shouldCreateCaseWithFormattedDCPValues() throws Exception { Map data = caseResource.getData(); assertAll( - () -> assertThat(data.get(TEXT_FIELD).asText(), is("Case 1 Text")), - () -> assertThat(data.get(DATE_FIELD).asText(), is("2003-01-01")), - () -> assertThat(data.get(DATE_TIME_FIELD).asText(), is("1970-01-01T07:08:00.000")), - () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("0", CollectionValidator.VALUE)).asText(), + () -> assertThat(data.get(TEXT_FIELD).asString(), is("Case 1 Text")), + () -> assertThat(data.get(DATE_FIELD).asString(), is("2003-01-01")), + () -> assertThat(data.get(DATE_TIME_FIELD).asString(), is("1970-01-01T07:08:00.000")), + () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("0", CollectionValidator.VALUE)).asString(), is("2017-12-16T18:19:20.000")), - () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("1", CollectionValidator.VALUE)).asText(), + () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("1", CollectionValidator.VALUE)).asString(), is("2020-12-21T22:23:24.000")), - () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_DATE_TIME_FIELD)).asText(), + () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_DATE_TIME_FIELD)).asString(), is("2004-07-01T00:00:00.000")), - () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_NESTED_FIELD, NESTED_NUMBER_FIELD)).asText(), + () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_NESTED_FIELD, NESTED_NUMBER_FIELD)).asString(), is("1970-01-01T12:34:00.000")) ); } @@ -138,40 +136,40 @@ public void shouldCreateEventWithFormattedDCPValues() throws Exception { Map data = caseResource.getData(); assertAll( - () -> assertThat(data.get(TEXT_FIELD).asText(), is("Case 1 Text")), - () -> assertThat(data.get(DATE_FIELD).asText(), is("2000-10-20")), - () -> assertThat(data.get(DATE_TIME_FIELD).asText(), is("1987-01-15T00:00:00.000")), - () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("0", CollectionValidator.VALUE)).asText(), + () -> assertThat(data.get(TEXT_FIELD).asString(), is("Case 1 Text")), + () -> assertThat(data.get(DATE_FIELD).asString(), is("2000-10-20")), + () -> assertThat(data.get(DATE_TIME_FIELD).asString(), is("1987-01-15T00:00:00.000")), + () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("0", CollectionValidator.VALUE)).asString(), is("2004-01-01T05:06:00.000")), - () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("1", CollectionValidator.VALUE)).asText(), + () -> assertThat(data.get(COLLECTION_FIELD).at(jsonPath("1", CollectionValidator.VALUE)).asString(), is("2010-01-01T11:12:00.000")), - () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_DATE_TIME_FIELD)).asText(), + () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_DATE_TIME_FIELD)).asString(), is("2005-03-01T00:00:00.000")), - () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_NESTED_FIELD, NESTED_NUMBER_FIELD)).asText(), + () -> assertThat(data.get(COMPLEX_FIELD).at(jsonPath(COMPLEX_NESTED_FIELD, NESTED_NUMBER_FIELD)).asString(), is("1970-01-01T17:30:00.000")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, DATE_FIELD)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, DATE_FIELD)).asString(), is("1963-05-07")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, DATE_TIME_FIELD)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, DATE_TIME_FIELD)).asString(), is("2008-04-02T16:37:00.000")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, STANDARD_DATE)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, STANDARD_DATE)).asString(), is("1999-08-19")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, STANDARD_DATE_TIME)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, STANDARD_DATE_TIME)).asString(), is("2010-06-17T19:20:00.000")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, DATE_FIELD)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, DATE_FIELD)).asString(), is("1981-02-01")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, DATE_TIME_FIELD)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, DATE_TIME_FIELD)).asString(), is("2002-03-04T00:00:00.000")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, STANDARD_DATE)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, STANDARD_DATE)).asString(), is("2020-02-19")), () -> assertThat(data.get(COLLECTION_COMPLEX_DATE_TIME) - .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, STANDARD_DATE_TIME)).asText(), + .at(jsonPath("0", CollectionValidator.VALUE, NESTED_COMPLEX, STANDARD_DATE_TIME)).asString(), is("2007-07-17T07:07:00.000")) ); } diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerEventsIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerEventsIT.java index f5d505a6dc..23bb6f520f 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerEventsIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerEventsIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.github.tomakehurst.wiremock.client.WireMock; import java.util.Arrays; import jakarta.inject.Inject; @@ -57,7 +56,6 @@ public class CaseControllerEventsIT extends WireMockBaseTest { @BeforeEach public void setUp() throws Exception { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); if (applicationParams.getEnableAttributeBasedAccessControl()) { MockUtils.setSecurityAuthorities(RandomStringUtils.randomAlphanumeric(10), authentication, MockUtils.ROLE_CASEWORKER_PUBLIC, MockUtils.ROLE_CITIZEN); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTest.java index 17a4b26377..9f7e26f67e 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationFeature; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; import com.google.common.collect.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -286,7 +287,9 @@ void shouldPropagateExceptionWhenThrown() { @DisplayName("POST /cases/{caseId}/supplementary-data") class UpdateSupplementaryData { - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults() + .enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT) + .build(); @Test @DisplayName("should return 200 when supplementary data updated") @@ -372,7 +375,7 @@ private Map convertResponseData(String jsonRequest) { Map requestData; try { requestData = mapper.readValue(jsonRequest, Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { requestData = new HashMap<>(); } return requestData; @@ -400,7 +403,7 @@ private Map> convertData(String jsonRequest) { Map> requestData; try { requestData = mapper.readValue(jsonRequest, Map.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { requestData = new HashMap<>(); } return requestData; @@ -632,7 +635,7 @@ private GetLinkedCasesResponse createGetLinkedCasesResponse(int numberRequired) @DisplayName("POST /cases/supplementary-data") class UpdateCasesSupplementaryData { - private final ObjectMapper mapper = new ObjectMapper(); + private final ObjectMapper mapper = JsonMapper.builderWithJackson2Defaults().build(); @Test @DisplayName("should return 200 when supplementary data updated") @@ -754,9 +757,8 @@ private SupplementaryCasesDataResource convertResponseData(String jsonResponse) SupplementaryCasesDataResource responseData; try { - mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); responseData = mapper.readValue(jsonResponse, SupplementaryCasesDataResource.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOG.info(e.getStackTrace().toString()); responseData = new SupplementaryCasesDataResource(); } @@ -810,7 +812,7 @@ private SupplementaryDataCasesUpdateRequest convertData(String jsonRequest) { SupplementaryDataCasesUpdateRequest requestData; try { requestData = mapper.readValue(jsonRequest, SupplementaryDataCasesUpdateRequest.class); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { LOG.info(e.getStackTrace().toString()); requestData = new SupplementaryDataCasesUpdateRequest(); } diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTestIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTestIT.java index 80c01c3203..229fad1143 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTestIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseControllerTestIT.java @@ -1,9 +1,8 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.core.JacksonException; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.client.WireMock; import org.apache.commons.lang3.StringUtils; import org.json.JSONException; @@ -107,7 +106,6 @@ class CaseControllerTestIT extends WireMockBaseTest { @BeforeEach public void setUp() throws JSONException { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(customHeadersFilter).build(); CUSTOM_CONTEXT = applicationParams.getCallbackPassthruHeaderContexts().get(0); responseJsonObject1 = new JSONObject(responseJson1); @@ -391,7 +389,7 @@ void shouldPopulateSearchCriteriaPostCreateCase() throws Exception { assertNotNull(savedCaseResource, "Saved Case Details should not be null"); JsonNode searchCriteriaJsonNode = savedCaseResource.getData().get("SearchCriteria"); - assertEquals(searchCriteriaJsonNode.get("OtherCaseReferences").findValue("value").asText(), + assertEquals(searchCriteriaJsonNode.get("OtherCaseReferences").findValue("value").asString(), testFieldValue, "Saved case data should contain SearchCriteria with OtherCaseReferences"); @@ -867,12 +865,12 @@ void shouldThrowExceptionWhenSolicitorRoleWithNoCasesAssignedToTheUser() throws } } - private Map> readValueToMap(String jsonRequest) throws JsonProcessingException { + private Map> readValueToMap(String jsonRequest) throws JacksonException { return mapper.readValue(jsonRequest, new TypeReference>>() { }); } - private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestMultiple() throws JsonProcessingException { + private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestMultiple() throws JacksonException { String jsonRequest = "{\n" + "\t\"$set\": {\n" + "\t\t\"orgs_assigned_users.organisationA\": 25,\n" @@ -884,7 +882,7 @@ private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestMultiple return new SupplementaryDataUpdateRequest(requestData); } - private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestOrgB() throws JsonProcessingException { + private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestOrgB() throws JacksonException { String jsonRequest = "{\n" + "\t\"$set\": {\n" + "\t\t\"orgs_assigned_users.organisationB\": 23\n" @@ -895,7 +893,7 @@ private SupplementaryDataUpdateRequest createSupplementaryDataSetRequestOrgB() t return new SupplementaryDataUpdateRequest(requestData); } - private SupplementaryDataUpdateRequest createSupplementaryDataSetRequest() throws JsonProcessingException { + private SupplementaryDataUpdateRequest createSupplementaryDataSetRequest() throws JacksonException { String jsonRequest = "{\n" + "\t\"$set\": {\n" + "\t\t\"orgs_assigned_users.organisationA\": 22\n" @@ -906,7 +904,7 @@ private SupplementaryDataUpdateRequest createSupplementaryDataSetRequest() throw return new SupplementaryDataUpdateRequest(requestData); } - private SupplementaryDataUpdateRequest createSupplementaryDataIncrementRequest() throws JsonProcessingException { + private SupplementaryDataUpdateRequest createSupplementaryDataIncrementRequest() throws JacksonException { String jsonRequest = "{\n" + "\t\"$inc\": {\n" + "\t\t\"orgs_assigned_users.organisationA\": 3\n" @@ -1034,7 +1032,6 @@ void testGetLinkedCasesInvalidCaseReferenceShouldReturn400() throws Exception { final String caseReference = "abc"; final String URL = "/getLinkedCases/" + caseReference; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final MvcResult mvcResult = mockMvc.perform(get(URL) .header(REQUEST_ID, REQUEST_ID_VALUE) diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerDCPIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerDCPIT.java index 20e12a03bc..96db7e8190 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerDCPIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerDCPIT.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -88,7 +87,6 @@ public void shouldValidateWithFormattedDCPValues() throws Exception { .andReturn(); assertEquals(result.getResponse().getContentAsString(), 200, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); CaseDataResource caseDataResource = mapper.readValue(content, CaseDataResource.class); @@ -97,28 +95,28 @@ public void shouldValidateWithFormattedDCPValues() throws Exception { CollectionValidator.VALUE); assertAll( - () -> assertThat(data.get(TEXT_FIELD).asText(), is("Case 1 Text")), - () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, DATE_FIELD)).asText(), + () -> assertThat(data.get(TEXT_FIELD).asString(), is("Case 1 Text")), + () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, DATE_FIELD)).asString(), is("1963-05-07")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, DATE_TIME_FIELD)) - .asText(), + .asString(), is("2008-04-02T16:37:00.000")), - () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, STANDARD_DATE)).asText(), + () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, STANDARD_DATE)).asString(), is("1999-08-19")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, STANDARD_DATE_TIME)) - .asText(), + .asString(), is("2010-06-17T19:20:00.000")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, NESTED_COMPLEX, - DATE_FIELD)).asText(), + DATE_FIELD)).asString(), is("1981-02-01")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, NESTED_COMPLEX, - DATE_TIME_FIELD)).asText(), + DATE_TIME_FIELD)).asString(), is("2002-03-04T00:00:00.000")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, NESTED_COMPLEX, - STANDARD_DATE)).asText(), + STANDARD_DATE)).asString(), is("2020-02-19")), () -> assertThat(data.at(String.join("/", collectionComplexDateTimeValuePointer, NESTED_COMPLEX, - STANDARD_DATE_TIME)).asText(), + STANDARD_DATE_TIME)).asString(), is("2007-07-17T07:07:00.000")) ); } @@ -137,7 +135,6 @@ public void shouldFail() throws Exception { .andReturn(); assertEquals(result.getResponse().getContentAsString(), 422, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); DataProcessingException exception = mapper.readValue(content, DataProcessingException.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerTest.java index 71e7a4a327..30bdbfe723 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDataValidatorControllerTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -33,17 +33,17 @@ @DisplayName("CaseDataValidatorControllerTest") class CaseDataValidatorControllerTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); private static final String CASE_TYPE_ID = "TestAddressBookCase"; private static final String PAGE_ID = "PageId"; private static final boolean IGNORE_WARNING = false; private static final Event EVENT = anEvent().build(); private static final Map DATA = newCaseData() - .withPair("data", JSON_NODE_FACTORY.objectNode().set("aField", JSON_NODE_FACTORY.textNode("aValue"))) + .withPair("data", JSON_NODE_FACTORY.objectNode().set("aField", JSON_NODE_FACTORY.stringNode("aValue"))) .build(); public static final Map UNWRAPPED_DATA = newCaseData() - .withPair("aField", JSON_NODE_FACTORY.textNode("aValue")) + .withPair("aField", JSON_NODE_FACTORY.stringNode("aValue")) .build(); private static final JsonNode UNWRAPPED_DATA_NODE = JacksonUtils.convertValueJsonNode(UNWRAPPED_DATA); private static final String TOKEN = "JwtToken"; diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDocumentControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDocumentControllerIT.java index 5d2a8516fd..41e945ef23 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDocumentControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseDocumentControllerIT.java @@ -1,27 +1,20 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasItems; -import static org.hamcrest.Matchers.is; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import java.util.Optional; import jakarta.inject.Inject; import javax.sql.DataSource; -import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.springframework.hateoas.Link; -import org.springframework.hateoas.mediatype.hal.Jackson2HalModule; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContext; @@ -36,9 +29,6 @@ import uk.gov.hmcts.ccd.WireMockBaseTest; import uk.gov.hmcts.ccd.customheaders.CustomHeadersFilter; import uk.gov.hmcts.ccd.v2.V2; -import uk.gov.hmcts.ccd.v2.external.domain.CaseDocumentMetadata; -import uk.gov.hmcts.ccd.v2.external.domain.Permission; -import uk.gov.hmcts.ccd.v2.external.resource.CaseDocumentResource; public class CaseDocumentControllerIT extends WireMockBaseTest { @@ -61,7 +51,6 @@ public class CaseDocumentControllerIT extends WireMockBaseTest { private SecurityContext securityContext; private MockMvc mockMvc; - protected static final ObjectMapper mapper = new ObjectMapper(); private static String CUSTOM_CONTEXT = ""; @BeforeEach @@ -76,7 +65,6 @@ public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(customHeadersFilter).build(); CUSTOM_CONTEXT = applicationParams.getCallbackPassthruHeaderContexts().get(0); - mapper.registerModule(new Jackson2HalModule()); } @Test @@ -90,22 +78,13 @@ public void shouldReturn200WhenGetValidCaseDocuments() throws Exception { .header(CUSTOM_CONTEXT, new JSONObject(responseJson1).toString()) .header("experimental", true)) .andExpect(status().is(200)) + .andExpect(jsonPath("$._links.self.href").value(String + .format("http://localhost:%s/cases/1504259907353651/documents/" + + "05e7cd7e-7041-4d8a-826a-7bb49dfd83d1", super.wiremockPort))) + .andExpect(jsonPath("$.documentMetadata.documentPermissions.permissions", hasSize(1))) + .andExpect(jsonPath("$.documentMetadata.documentPermissions.permissions[0]").value("READ")) .andReturn(); assertTrue(result.getResponse().getHeaderNames().contains(CUSTOM_CONTEXT)); - final CaseDocumentResource caseDocumentResource - = mapper.readValue(result.getResponse().getContentAsString(), CaseDocumentResource.class); - - CaseDocumentMetadata caseDocumentMetadata = caseDocumentResource.getDocumentMetadata(); - Optional self = caseDocumentResource.getLink("self"); - - assertAll( - () -> assertThat(self.get().getHref(), - is(String - .format("http://localhost:%s/cases/1504259907353651/documents/05e7cd7e-7041-4d8a-826a-7bb49dfd83d1", super.wiremockPort))), - () -> assertThat(caseDocumentMetadata.getDocumentPermissions().getPermissions(), hasSize(1)), - () -> assertThat(caseDocumentMetadata.getDocumentPermissions().getPermissions(), - hasItems(Permission.READ)) - ); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseFileViewControllerTestIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseFileViewControllerTestIT.java index af478462d6..fe974171c4 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseFileViewControllerTestIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseFileViewControllerTestIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; @@ -72,7 +71,6 @@ void testShouldGetCategoriesAndDocuments() throws Exception { final String caseId = "1504259907353529"; final String URL = "/categoriesAndDocuments/" + caseId; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final MvcResult mvcResult = mockMvc.perform(get(URL) .header(REQUEST_ID, REQUEST_ID_VALUE) @@ -101,7 +99,6 @@ void testShouldGetCategoriesAndDocuments() throws Exception { void testGetCategoriesAndDocumentsShouldReturn404WhenCaseDoesNotExist() throws Exception { final String caseId = "4259907353529155"; final String URL = "/categoriesAndDocuments/" + caseId; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final MvcResult mvcResult = mockMvc.perform(get(URL) .header(REQUEST_ID, REQUEST_ID_VALUE) @@ -118,7 +115,6 @@ void testGetCategoriesAndDocumentsShouldReturn404WhenCaseDoesNotExist() throws E void testGetCategoriesAndDocumentsShouldReturn404WhenUserIsNotAllowedAccessToCase() throws Exception { final String caseId = "1504259907353529"; final String URL = "/categoriesAndDocuments/" + caseId; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CITIZEN); final MvcResult mvcResult = mockMvc.perform(get(URL) @@ -135,7 +131,6 @@ void testGetCategoriesAndDocumentsShouldReturn404WhenUserIsNotAllowedAccessToCas void testGetCategoriesAndDocumentsShouldReturnBadRequestWhenCaseRefHasWrongFormat() throws Exception { final String badCaseId = "1504259907353529000"; final String URL = "/categoriesAndDocuments/" + badCaseId; - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final MvcResult mvcResult = mockMvc.perform(get(URL) .header(REQUEST_ID, REQUEST_ID_VALUE) diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseUserControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseUserControllerIT.java index 61d2896275..833c753847 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseUserControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/CaseUserControllerIT.java @@ -1,9 +1,8 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import com.github.tomakehurst.wiremock.client.WireMock; import com.google.common.collect.Sets; -import com.microsoft.applicationinsights.core.dependencies.google.common.collect.Lists; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -26,8 +25,9 @@ import static com.github.tomakehurst.wiremock.client.WireMock.okJson; import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertEquals; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; @@ -42,7 +42,7 @@ public class CaseUserControllerIT extends WireMockBaseTest { private AuditRepository auditRepository; @BeforeEach - public void setUp() throws JsonProcessingException { + public void setUp() throws JacksonException { mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC, "caseworker-probate"); @@ -88,6 +88,6 @@ public void shouldGrantRoles() throws Exception { assertThat(captor.getValue().getOperationType(), is(AuditOperationType.UPDATE_CASE_ACCESS.getLabel())); assertThat(captor.getValue().getCaseId(), is(caseId)); assertThat(captor.getValue().getTargetIdamId(), is(userId)); - assertThat(captor.getValue().getTargetCaseRoles(), is(Lists.newArrayList(role1, role2))); + assertThat(captor.getValue().getTargetCaseRoles(), containsInAnyOrder(role1, role2)); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/DocumentControllerITest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/DocumentControllerITest.java index 3d5d2b4002..6c17f0e566 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/DocumentControllerITest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/DocumentControllerITest.java @@ -12,6 +12,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.sql.SQLException; @@ -23,7 +24,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.hateoas.Link; -import org.springframework.hateoas.mediatype.hal.Jackson2HalModule; +import org.springframework.hateoas.mediatype.hal.HalJacksonModule; import org.springframework.http.MediaType; import org.springframework.jdbc.datasource.init.ScriptException; import org.springframework.test.annotation.DirtiesContext; @@ -33,8 +34,8 @@ import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tomakehurst.wiremock.client.WireMock; +import tools.jackson.databind.json.JsonMapper; import jakarta.inject.Inject; import uk.gov.hmcts.ccd.ApplicationParams; @@ -67,7 +68,9 @@ public class DocumentControllerITest extends WireMockBaseTest { protected DataSource db; private MockMvc mockMvc; - protected static final ObjectMapper mapper = new ObjectMapper(); + protected static final JsonMapper mapper = JsonMapper.builder() + .addModule(new HalJacksonModule()) + .build(); private static final String caseTypeResponseString = """ {\n \"id\": \"TestAddressBookCase\",\n @@ -122,7 +125,6 @@ public void setUp() throws ScriptException, SQLException { mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(customHeadersFilter).build(); CUSTOM_CONTEXT = applicationParams.getCallbackPassthruHeaderContexts().get(0); - mapper.registerModule(new Jackson2HalModule()); } @Test @@ -144,6 +146,8 @@ public void shouldReturn200WhenGetValidCaseDocuments() throws Exception { .header(CUSTOM_CONTEXT, ClientContextUtil.encodeToBase64(new JSONObject(responseJson1).toString())) .header("experimental", true)) .andExpect(status().is(200)) + .andExpect(jsonPath("$._links.self.href") + .value(hostUrl + "/cases/" + CASE_ID + "/documents")) .andReturn(); final DocumentsResource documentsResource = mapper.readValue(result.getResponse().getContentAsString(), diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/GetCaseAssignedUserRolesControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/GetCaseAssignedUserRolesControllerIT.java index c77400f7a0..767cc4fd84 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/GetCaseAssignedUserRolesControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/GetCaseAssignedUserRolesControllerIT.java @@ -41,6 +41,15 @@ class GetCaseAssignedUserRolesControllerIT extends BaseCaseAssignedUserRolesCont void getUserCaseRolesAssignedToUser() throws Exception { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC, caseworkerCaa); + String roleAssignmentResponseJson = roleAssignmentResponseJson( + userRoleAssignmentJson(USER_IDS_1, "[CREATOR]", CASE_ID_1), + userRoleAssignmentJson(USER_IDS_2, "[DEFENDANT]", CASE_ID_2), + userRoleAssignmentJson(USER_IDS_2, "[SOLICITOR]", CASE_ID_2) + ); + + stubFor(post(urlMatching("/am/role-assignments/query")) + .willReturn(okJson(roleAssignmentResponseJson).withStatus(200))); + final MvcResult result = mockMvc.perform(get(getCaseAssignedUserRoles) .contentType(JSON_CONTENT_TYPE) .param(PARAM_CASE_IDS, CASE_IDS) diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/SearchCaseAssignedUserRolesControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/SearchCaseAssignedUserRolesControllerIT.java index 77921e5dcb..235d4c0ebc 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/SearchCaseAssignedUserRolesControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/SearchCaseAssignedUserRolesControllerIT.java @@ -44,6 +44,15 @@ class SearchCaseAssignedUserRolesControllerIT extends BaseCaseAssignedUserRolesC void getUserCaseRolesAssignedToUser() throws Exception { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC, caseworkerCaa); + String roleAssignmentResponseJson = roleAssignmentResponseJson( + userRoleAssignmentJson(USER_IDS_1, "[CREATOR]", CASE_ID_1), + userRoleAssignmentJson(USER_IDS_2, "[DEFENDANT]", CASE_ID_2), + userRoleAssignmentJson(USER_IDS_2, "[SOLICITOR]", CASE_ID_2) + ); + + stubFor(post(urlMatching("/am/role-assignments/query")) + .willReturn(okJson(roleAssignmentResponseJson).withStatus(200))); + final MvcResult result = mockMvc.perform(MockMvcRequestBuilders.post(searchCaseAssignedUserRoles) .contentType(JSON_CONTENT_TYPE) .content(mapper.writeValueAsBytes( diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerCaseRolesIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerCaseRolesIT.java index 04bdfe37cf..e42da97c87 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerCaseRolesIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerCaseRolesIT.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; +import tools.jackson.databind.JsonNode; import com.github.tomakehurst.wiremock.client.WireMock; import org.hamcrest.FeatureMatcher; import org.hamcrest.Matcher; @@ -75,7 +74,6 @@ public void setUp() throws IOException { @Test public void externalGetStartCaseTrigger_200_shouldAddFieldsWithCreatorCaseRole() throws Exception { - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); HttpHeaders headers = new HttpHeaders(); headers.add(AUTHORIZATION, "Bearer user1"); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerIT.java index 5165bffe60..f58d44bcdd 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.external.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import org.json.JSONException; import org.json.JSONObject; @@ -74,7 +73,6 @@ public void setUp() throws JSONException { responseJsonObject2 = new JSONObject(responseJsonString2); MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC); mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(customHeadersFilter).build(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerTest.java index 28ecd18f47..a98bf7b540 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/controller/StartEventControllerTest.java @@ -8,8 +8,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.JsonNodeFactory; import com.google.common.collect.Maps; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -35,7 +35,7 @@ class StartEventControllerTest { private static final boolean IGNORE_WARNING = false; private static final String TOKEN = "TOKEN"; private static final CaseDetails CASE_DETAILS = new CaseDetails(); - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); @Mock private StartEventOperation startEventOperation; @@ -52,10 +52,10 @@ class StartEventControllerTest { void setUp() { MockitoAnnotations.openMocks(this); Map data = Maps.newHashMap(); - data.put("dataKey1", JSON_NODE_FACTORY.textNode("dataValue1")); + data.put("dataKey1", JSON_NODE_FACTORY.stringNode("dataValue1")); CASE_DETAILS.setData(data); Map dataClassification = Maps.newHashMap(); - dataClassification.put("classKey1", JSON_NODE_FACTORY.textNode("classValue1")); + dataClassification.put("classKey1", JSON_NODE_FACTORY.stringNode("classValue1")); CASE_DETAILS.setDataClassification(dataClassification); startEventResult.setCaseDetails(CASE_DETAILS); startEventResult.setToken(TOKEN); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResourceTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResourceTest.java index 1d7218c080..ca071916ac 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResourceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseDataResourceTest.java @@ -1,8 +1,9 @@ package uk.gov.hmcts.ccd.v2.external.resource; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.JsonNodeFactory; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.hateoas.Link; @@ -21,16 +22,16 @@ @DisplayName("CaseDataResource") class CaseDataResourceTest { - private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(false); - private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final JsonNodeFactory JSON_NODE_FACTORY = new JsonNodeFactory(); + private static final ObjectMapper MAPPER = JsonMapper.builderWithJackson2Defaults().build(); private static final String CASE_TYPE_ID = "TestAddressBookCase"; private static final String PAGE_ID = "pageId"; private static final Map DATA = newCaseData() - .withPair("data", JSON_NODE_FACTORY.objectNode().set("aField", JSON_NODE_FACTORY.textNode("aValue"))) + .withPair("data", JSON_NODE_FACTORY.objectNode().set("aField", JSON_NODE_FACTORY.stringNode("aValue"))) .build(); public static final Map UNWRAPPED_DATA = newCaseData() - .withPair("aField", JSON_NODE_FACTORY.textNode("aValue")) + .withPair("aField", JSON_NODE_FACTORY.stringNode("aValue")) .build(); private static final JsonNode UNWRAPPED_DATA_NODE = JacksonUtils.convertValueJsonNode(UNWRAPPED_DATA); private static final CaseDataContent CASE_DATA_CONTENT = newCaseDataContent().withData(DATA).build(); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResourceTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResourceTest.java index 5db1dfb50e..ecff11d446 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResourceTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/external/resource/CaseResourceTest.java @@ -1,7 +1,7 @@ package uk.gov.hmcts.ccd.v2.external.resource; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.StringNode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -36,9 +36,9 @@ class CaseResourceTest { private static final String STATE = "Started"; private static final String CALLBACK_COMPLETED = "CALLBACK_COMPLETED"; private static final SecurityClassification SECURITY_CLASSIFICATION = SecurityClassification.PUBLIC; - private static final Map DATA = Collections.singletonMap("FieldID", new TextNode("Value")); + private static final Map DATA = Collections.singletonMap("FieldID", new StringNode("Value")); private static final Map DATA_CLASSIFICATION = Collections.singletonMap("FieldID", - new TextNode("PUBLIC")); + new StringNode("PUBLIC")); private static final AfterSubmitCallbackResponse CALLBACK_BODY = new AfterSubmitCallbackResponse(); private static final ResponseEntity AFTER_SUBMIT_CALLBACK_RESPONSE = ResponseEntity.ok(CALLBACK_BODY); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerCaseRolesIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerCaseRolesIT.java index f5d29685f7..ce6bf43044 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerCaseRolesIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerCaseRolesIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.github.tomakehurst.wiremock.client.WireMock; import com.google.common.collect.Lists; import org.apache.commons.lang3.RandomStringUtils; @@ -43,7 +42,7 @@ public class UICaseControllerCaseRolesIT extends WireMockBaseTest { private static final String GET_CASE = "/internal/cases/1504259907353529"; - private static final String GET_EVENT = "/internal/cases/1504259907353529/events/1"; + private static final String GET_EVENT = "/internal/cases/1504259907353529/events/%s"; private static final String UID_NO_EVENT_ACCESS = "1234"; private static final String UID_WITH_EVENT_ACCESS = "123"; @@ -97,7 +96,6 @@ public void shouldNotReturnEventHistoryDataForCitizenWhoHasNoAccessToEvents() th .andReturn(); assertEquals(result.getResponse().getContentAsString(), 200, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); assertNotNull("Content Should not be null", content); CaseViewResource savedCaseResource = mapper.readValue(content, CaseViewResource.class); @@ -138,7 +136,6 @@ public void shouldReturnEventHistoryDataForCitizenWhoHasCaseRoleAccess() throws .andReturn(); assertEquals(result.getResponse().getContentAsString(), 200, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); assertNotNull("Content Should not be null", content); CaseViewResource savedCaseResource = mapper.readValue(content, CaseViewResource.class); @@ -159,6 +156,18 @@ public void shouldReturnEventHistoryDataForCitizenWhoHasCaseRoleAccess() throws @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = { "classpath:sql/insert_cases_event_access_case_roles.sql" }) public void shouldGetEventById() throws Exception { + String roleAssignmentResponseJson = roleAssignmentResponseJson( + roleAssignmentJson("idam:[02-TEST-EVENT-ACCESS-ROLE]", "PROBATE", + "TestAddressBookNoEventAccessToCaseRole", "1504259907353529") + ); + stubFor(WireMock.get(urlMatching(GET_ROLE_ASSIGNMENTS_PREFIX + UID_WITH_EVENT_ACCESS)) + .willReturn(okJson(roleAssignmentResponseJson).withStatus(200))); + + final Long eventId = template.queryForObject( + "SELECT id FROM case_event WHERE event_id = ?", + Long.class, + "TEST_EVENT_ACCESS" + ); UserInfo userInfo = UserInfo.builder() .uid(UID_WITH_EVENT_ACCESS) @@ -171,17 +180,16 @@ public void shouldGetEventById() throws Exception { headers.add(AUTHORIZATION, "Bearer " + UID_WITH_EVENT_ACCESS); headers.add(V2.EXPERIMENTAL_HEADER, "true"); - final MvcResult result = mockMvc.perform(get(GET_EVENT) + final MvcResult result = mockMvc.perform(get(String.format(GET_EVENT, eventId)) .contentType(JSON_CONTENT_TYPE) .headers(headers)) .andExpect(status().is(200)) .andReturn(); assertEquals(result.getResponse().getContentAsString(), 200, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); CaseHistoryViewResource response = mapper.readValue(content, CaseHistoryViewResource.class); - assertThat(response.getEvent().getId(), is(1L)); + assertThat(response.getEvent().getId(), is(eventId)); ArgumentCaptor captor = ArgumentCaptor.forClass(AuditEntry.class); verify(auditRepository).save(captor.capture()); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerDCPIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerDCPIT.java index 84a5581d13..439d59ef45 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerDCPIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerDCPIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -95,7 +94,6 @@ public void shouldGetCaseWithDCPConfigured() throws Exception { .andReturn(); assertEquals(result.getResponse().getContentAsString(), 200, result.getResponse().getStatus()); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); String content = result.getResponse().getContentAsString(); CaseViewResource savedCaseResource = mapper.readValue(content, CaseViewResource.class); diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerGetCaseCallbackIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerGetCaseCallbackIT.java index 7e55d04712..1913988255 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerGetCaseCallbackIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseControllerGetCaseCallbackIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.github.tomakehurst.wiremock.client.WireMock; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.BeforeEach; @@ -60,7 +59,6 @@ public void setUp() throws Exception { headers.add(AUTHORIZATION, "Bearer " + UID_WITH_EVENT_ACCESS); headers.add(V2.EXPERIMENTAL_HEADER, "true"); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final String jsonString = TestFixtures .fromFileAsString("__files/test-addressbook-get-case-callback.json") diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseSearchControllerTest.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseSearchControllerTest.java index fd2486f1e5..b3e1630fc5 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseSearchControllerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UICaseSearchControllerTest.java @@ -1,8 +1,8 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.json.JsonMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -74,11 +74,11 @@ void setUp() { } @Test - void shouldSearchCaseDetails() throws JsonProcessingException { + void shouldSearchCaseDetails() throws JacksonException { CaseSearchResult caseSearchResult = mock(CaseSearchResult.class); CaseSearchResultView caseSearchResultView = mock(CaseSearchResultView.class); String searchRequest = "{\"query\": {\"match\": \"blah blah\"}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); when(caseSearchOperation.execute(any(CrossCaseTypeSearchRequest.class), @@ -110,11 +110,11 @@ void shouldSearchCaseDetails() throws JsonProcessingException { } @Test - void shouldSearchCaseDetailsGlobal() throws JsonProcessingException { + void shouldSearchCaseDetailsGlobal() throws JacksonException { CaseSearchResult caseSearchResult = mock(CaseSearchResult.class); CaseSearchResultView caseSearchResultView = mock(CaseSearchResultView.class); String searchRequest = "{\"query\": {\"match\": \"blah blah\"}}"; - JsonNode searchRequestNode = new ObjectMapper().readTree(searchRequest); + JsonNode searchRequestNode = JsonMapper.builderWithJackson2Defaults().build().readTree(searchRequest); ElasticsearchRequest elasticSearchRequest = new ElasticsearchRequest(searchRequestNode); when(elasticsearchQueryHelper.validateAndConvertRequest(any())).thenReturn(elasticSearchRequest); when(caseSearchOperation.execute(any(CrossCaseTypeSearchRequest.class), diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIDefinitionControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIDefinitionControllerIT.java index 09187b49d3..019884af34 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIDefinitionControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIDefinitionControllerIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; @@ -36,7 +35,6 @@ public void setUp() { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC); mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIStartTriggerControllerDCPIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIStartTriggerControllerDCPIT.java index 89d3898265..02d43ecd7c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIStartTriggerControllerDCPIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIStartTriggerControllerDCPIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; @@ -86,7 +85,6 @@ public void setUp() { @SuppressWarnings("unchecked") public void shouldGetStartTriggerForCaseWithDCPConfigured() throws Exception { assertCaseDataResultSetSize(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); final MvcResult result = mockMvc.perform(get(GET_START_TRIGGER) .contentType(MediaType.APPLICATION_JSON) diff --git a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIUserProfileControllerIT.java b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIUserProfileControllerIT.java index b4d4ff0e64..09972e21da 100644 --- a/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIUserProfileControllerIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/v2/internal/controller/UIUserProfileControllerIT.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.ccd.v2.internal.controller; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.github.tomakehurst.wiremock.client.WireMock; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -49,7 +48,6 @@ public void setUp() { MockUtils.setSecurityAuthorities(authentication, MockUtils.ROLE_CASEWORKER_PUBLIC); mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } @Test diff --git a/src/test/java/uk/gov/hmcts/ccd/wiremock/config/WireMockTestConfiguration.java b/src/test/java/uk/gov/hmcts/ccd/wiremock/config/WireMockTestConfiguration.java deleted file mode 100644 index 959276b4f2..0000000000 --- a/src/test/java/uk/gov/hmcts/ccd/wiremock/config/WireMockTestConfiguration.java +++ /dev/null @@ -1,19 +0,0 @@ -package uk.gov.hmcts.ccd.wiremock.config; - -import uk.gov.hmcts.ccd.wiremock.extensions.CustomisedResponseTransformer; -import uk.gov.hmcts.ccd.wiremock.extensions.DynamicOAuthJwkSetResponseTransformer; - -import org.springframework.cloud.contract.wiremock.WireMockConfigurationCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class WireMockTestConfiguration { - - @Bean - public WireMockConfigurationCustomizer wireMockConfigurationCustomizer() { - return config -> config.extensions(new CustomisedResponseTransformer(), - new DynamicOAuthJwkSetResponseTransformer()); - } -} - diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties index 9138837b8d..d7c06a53c0 100644 --- a/src/test/resources/test.properties +++ b/src/test/resources/test.properties @@ -4,7 +4,6 @@ ccd.document.url.pattern=http://localhost.* pagination.page.size=2 -app-insights.dev-mode=off spring.application.name=ccd-data-store http.client.connection.drafts.timeout=2000 diff --git a/web.config b/web.config index df78d5e991..de303a2c04 100644 --- a/web.config +++ b/web.config @@ -7,7 +7,7 @@ + arguments="-Xms1024M -Xmx2048M -javaagent:"%HOME%\site\wwwroot\applicationinsights-agent-3.7.9.jar" -Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\core-case-data.jar""> From 984ea33dffa1a1493a345b4c09942397eb526a80 Mon Sep 17 00:00:00 2001 From: Dan Lysiak <50049163+danlysiak@users.noreply.github.com> Date: Tue, 28 Jul 2026 09:52:22 +0100 Subject: [PATCH 2/3] Fix dependency vulnerability findings --- build.gradle | 9 +++++++-- dependency-check-suppressions.xml | 21 ++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 240749422b..4b1e0dc276 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,11 @@ ext { lombokBindingVersion = '0.2.0' mockito = '5.21.0' elasticVersion = '9.4.4' + set('elasticsearch-client.version', elasticVersion) + set('httpcore5.version', '5.4.3') + set('jackson-2-bom.version', '2.21.5') + set('log4j2.version', '2.26.1') + set('tomcat.version', '11.0.24') cucumber = '7.34.6' restAssuredVersion = '6.0.1' beftaFwVersion = '9.2.8-rc1' @@ -295,7 +300,7 @@ dependencies { implementation group: 'org.apache.commons', name: 'commons-jexl3', version: '3.6.2' implementation group: 'org.apache.httpcomponents.client5', name: 'httpclient5', version: '5.6.1' implementation group: 'org.apache.httpcomponents.core5', name: 'httpcore5', version: '5.4.3' - implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.26.0' + implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.26.1' // Elasticsearch implementation group: 'org.elasticsearch', name: 'elasticsearch', version: elasticVersion @@ -309,7 +314,7 @@ dependencies { annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.6.3' testAnnotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.6.3' - runtimeOnly group: 'org.postgresql', name: 'postgresql', version: '42.7.11' + runtimeOnly group: 'org.postgresql', name: 'postgresql', version: '42.7.12' // TEST DEPENDENCIES testImplementation enforcedPlatform('org.junit:junit-bom:6.0.3') diff --git a/dependency-check-suppressions.xml b/dependency-check-suppressions.xml index a3365459f0..6e3c1c9c93 100644 --- a/dependency-check-suppressions.xml +++ b/dependency-check-suppressions.xml @@ -1,2 +1,21 @@ - + + + + + ^pkg:maven/com\.microsoft\.azure/applicationinsights-core@3\.7\.9$ + CVE-2025-21199 + + + + ^pkg:maven/org\.jetbrains\.kotlin/kotlin-stdlib(?:-jdk7|-jdk8)?@2\.2\.21$ + CVE-2026-53914 + From 3716c5b6606f3fa8dbd7e7403049471f28fcda00 Mon Sep 17 00:00:00 2001 From: Dan Lysiak <50049163+danlysiak@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:03:34 +0100 Subject: [PATCH 3/3] Preserve problem detail type compatibility --- .../exceptions/RestExceptionHandler.java | 15 ++++++++ .../exceptions/RestExceptionHandlerTest.java | 36 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandler.java b/src/main/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandler.java index d0976a488b..16f1df1a3f 100644 --- a/src/main/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandler.java +++ b/src/main/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandler.java @@ -10,6 +10,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatusCode; +import org.springframework.http.ProblemDetail; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -25,6 +26,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.ConstraintViolationException; import java.io.Serializable; +import java.net.URI; import java.sql.SQLException; import java.util.Collections; import java.util.HashMap; @@ -33,6 +35,7 @@ @ControllerAdvice public class RestExceptionHandler extends ResponseEntityExceptionHandler { private static final Logger LOG = LoggerFactory.getLogger(RestExceptionHandler.class); + private static final URI ABOUT_BLANK = URI.create("about:blank"); private final AppInsights appInsights; @@ -152,6 +155,18 @@ protected ResponseEntity handleMethodArgumentNotValid(MethodArgumentNotV .body(error); } + @Override + protected ResponseEntity createResponseEntity(Object body, + HttpHeaders headers, + HttpStatusCode statusCode, + WebRequest request) { + // Spring Framework 7 no longer supplies this default; retain the existing API error contract. + if (body instanceof ProblemDetail problemDetail && problemDetail.getType() == null) { + problemDetail.setType(ABOUT_BLANK); + } + return super.createResponseEntity(body, headers, statusCode, request); + } + private HttpStatus getHttpStatus(final Throwable causeOfException) { HttpStatus httpStatus = checkAndRetrieveExceptionStatusCode(causeOfException); if (httpStatus != null) { diff --git a/src/test/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandlerTest.java b/src/test/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandlerTest.java index 03e9ebd7c4..096e8c5d04 100644 --- a/src/test/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/endpoint/exceptions/RestExceptionHandlerTest.java @@ -20,7 +20,10 @@ import org.mockito.MockitoAnnotations; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.mock.http.MockHttpInputMessage; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; @@ -29,6 +32,8 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.context.request.WebRequest; +import org.springframework.web.servlet.resource.NoResourceFoundException; import uk.gov.hmcts.ccd.appinsights.AppInsights; import uk.gov.hmcts.ccd.domain.model.common.HttpError; @@ -758,6 +763,37 @@ public void handleConstraintViolationException_shouldReturnHttpErrorResponse() t assertHttpErrorResponse(result, expectedException, HttpStatus.BAD_REQUEST); } + @Test + public void handleHttpMessageNotReadable_shouldRetainAboutBlankProblemDetailType() throws Exception { + HttpMessageNotReadableException expectedException = new HttpMessageNotReadableException( + "Unreadable request", + new MockHttpInputMessage(new byte[0]) + ); + setupMockServiceToThrowException(expectedException); + + mockMvc.perform(MockMvcRequestBuilders.get(TEST_URL)) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.type").value("about:blank")); + } + + @Test + public void createResponseEntity_shouldRetainAboutBlankProblemDetailTypeForNoResourceFound() { + NoResourceFoundException expectedException = new NoResourceFoundException( + HttpMethod.GET, + "static resource", + "getLinkedCases." + ); + + new RestExceptionHandler(appInsights).createResponseEntity( + expectedException.getBody(), + HttpHeaders.EMPTY, + expectedException.getStatusCode(), + mock(WebRequest.class) + ); + + assertThat(expectedException.getBody().getType().toString(), is("about:blank")); + } + private void assertHttpErrorResponse(ResultActions result, Exception expectedException) throws Exception { // NB: as we cannot mock HttpError generate an equivalent and compare to response