From 42f090f89581dd52b88c734693484839781b1737 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 17 Mar 2026 18:07:34 +0000 Subject: [PATCH 1/8] update gradle to v9.0.0 (+ minimum changes to build.gradle and suppress.gradle) --- build.gradle | 14 +++++++------- gradle/suppress.gradle | 5 +++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 9afb5a5e3e..e6cf28599e 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ plugins { id 'com.github.kt3k.coveralls' version '2.12.2' 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.15.0' + id 'info.solidsoft.pitest' version '1.19.0-rc.3' id 'uk.gov.hmcts.java' version '0.12.68' id 'au.com.dius.pact' version '4.6.20' id 'org.jsonschema2pojo' version '1.2.2' @@ -623,7 +623,7 @@ jacocoTestReport { def report = file("${buildDir}/reports/jacoco/test/jacocoTestReport.xml") logger.lifecycle("Checking coverage results: ${report}") - def parser = new XmlParser() + def parser = new groovy.xml.XmlParser() parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false) def results = parser.parse(report) @@ -719,11 +719,11 @@ task fortifyScan(type: JavaExec) { idea { module { - // config to allow Intelij to mark test source and resource files correctly to help linting tools - testSourceDirs += project.sourceSets.aat.java.srcDirs - testSourceDirs += project.sourceSets.contractTest.java.srcDirs - testResourceDirs += project.sourceSets.aat.resources.srcDirs - testResourceDirs += project.sourceSets.contractTest.resources.srcDirs + // config to allow IntelliJ to mark test source and resource files correctly to help linting tools + testSources.from(project.sourceSets.aat.java.srcDirs) + testSources.from(project.sourceSets.contractTest.java.srcDirs) + testResources.from(project.sourceSets.aat.resources.srcDirs) + testResources.from(project.sourceSets.contractTest.resources.srcDirs) } } diff --git a/gradle/suppress.gradle b/gradle/suppress.gradle index a664a6ad63..c9f1c91f77 100644 --- a/gradle/suppress.gradle +++ b/gradle/suppress.gradle @@ -1,4 +1,5 @@ -import groovy.util.slurpersupport.GPathResult +import groovy.xml.XmlSlurper +import groovy.xml.slurpersupport.GPathResult import groovy.xml.DOMBuilder import groovy.xml.XmlUtil import org.w3c.dom.Document @@ -114,4 +115,4 @@ task suppressCves() { // If no argument is specified, the default report file is 'dependency-check-report.xml' suppressCves() } -} \ No newline at end of file +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aaaabb3cb9..2a84e188b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 386826e03013b3cbe1956b00cf5283c1e7798290 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 17 Mar 2026 18:36:46 +0000 Subject: [PATCH 2/8] Changes to build.gradle --- build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e6cf28599e..c63088dd18 100644 --- a/build.gradle +++ b/build.gradle @@ -244,7 +244,6 @@ dependencies { 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.cloud', name: 'spring-cloud-starter-openfeign' - implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer' implementation group: 'org.springframework.hateoas', name: 'spring-hateoas' implementation group: 'org.springframework.plugin', name: 'spring-plugin-core' implementation group: 'org.springframework.retry', name: 'spring-retry' @@ -304,7 +303,7 @@ dependencies { testImplementation group: 'io.rest-assured', name: 'rest-assured', version: '5.5.6' testImplementation group: 'org.assertj', name: 'assertj-vavr', version: '0.5.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' - testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner' + testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '4.2.1' testImplementation group: 'org.testcontainers', name: 'testcontainers', version: testContainersVersion testImplementation group: 'org.testcontainers', name: 'postgresql', version: testContainersVersion testImplementation group: 'org.testcontainers', name: 'elasticsearch', version: testContainersVersion From f8a1908ec6f3117e80b10f5b3cd5635c468c23a9 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 17 Mar 2026 18:46:48 +0000 Subject: [PATCH 3/8] Update build.gradle --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index c63088dd18..d4f2d1793f 100644 --- a/build.gradle +++ b/build.gradle @@ -244,6 +244,7 @@ dependencies { 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.cloud', name: 'spring-cloud-starter-openfeign' + implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '5.0.1' implementation group: 'org.springframework.hateoas', name: 'spring-hateoas' implementation group: 'org.springframework.plugin', name: 'spring-plugin-core' implementation group: 'org.springframework.retry', name: 'spring-retry' From f21db86348ca7fcc32b42abb2dd7bf841db8533f Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 17 Mar 2026 19:03:19 +0000 Subject: [PATCH 4/8] Try loadbalancer and contract-stub-runner version 4.3.1 --- build.gradle | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d4f2d1793f..c932fdd8f6 100644 --- a/build.gradle +++ b/build.gradle @@ -244,7 +244,13 @@ dependencies { 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.cloud', name: 'spring-cloud-starter-openfeign' - implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '5.0.1' + + // JC NOTE: loadbalancer version options are :- + // 4.3.1 + // 5.0.0 + // 5.0.1 + implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '4.3.1' + implementation group: 'org.springframework.hateoas', name: 'spring-hateoas' implementation group: 'org.springframework.plugin', name: 'spring-plugin-core' implementation group: 'org.springframework.retry', name: 'spring-retry' @@ -304,7 +310,14 @@ dependencies { testImplementation group: 'io.rest-assured', name: 'rest-assured', version: '5.5.6' testImplementation group: 'org.assertj', name: 'assertj-vavr', version: '0.5.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test' - testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '4.2.1' + + // JC NOTE: contract-stub-runner version options are :- + // 4.2.1 ? + // 4.3.1 + // 5.0.0 + // 5.0.1 + testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '4.3.1' + testImplementation group: 'org.testcontainers', name: 'testcontainers', version: testContainersVersion testImplementation group: 'org.testcontainers', name: 'postgresql', version: testContainersVersion testImplementation group: 'org.testcontainers', name: 'elasticsearch', version: testContainersVersion From 11c4630611d6fedfe696011b620a78e7cd3d72d6 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Thu, 19 Mar 2026 11:14:08 +0000 Subject: [PATCH 5/8] Fix various checkstyle issues --- .../ccd/domain/model/common/DisplayContextParameter.java | 4 ++-- .../domain/service/createevent/CreateCaseEventService.java | 2 +- .../search/elasticsearch/ElasticsearchSortService.java | 4 ++-- .../java/uk/gov/hmcts/ccd/domain/types/DocumentValidator.java | 2 +- .../gov/hmcts/ccd/integrations/IdamRepositoryCachingIT.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/model/common/DisplayContextParameter.java b/src/main/java/uk/gov/hmcts/ccd/domain/model/common/DisplayContextParameter.java index 5f687e0c4c..6146ec25dd 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/model/common/DisplayContextParameter.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/model/common/DisplayContextParameter.java @@ -32,8 +32,8 @@ public String getValue() { } public static List getDisplayContextParametersFor(String displayContextParameter) { - List displayContextParameterTypeList = new ArrayList<>(); - List displayContextParameters = new ArrayList<>(); + final List displayContextParameterTypeList = new ArrayList<>(); + final List displayContextParameters = new ArrayList<>(); if (Strings.isNullOrEmpty(displayContextParameter)) { return Collections.emptyList(); 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 60877aa99f..7d52cc528f 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 @@ -343,7 +343,7 @@ public CreateCaseEventResult createCaseSystemEvent(final String caseReference, Event event) { final CaseDetails caseDetails = delegatingCaseDetailsRepository.findByReference(caseReference) .orElseThrow(() -> - new ResourceNotFoundException(format("Case with reference %s could not be found", caseReference))); + new ResourceNotFoundException(format("Case with reference %s could not be found", caseReference))); final CaseEventDefinition caseEventDefinition = new CaseEventDefinition(); caseEventDefinition.setId("DocumentUpdated"); 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 01da197b86..4fd0475de6 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 @@ -73,8 +73,8 @@ private ObjectNode buildSortOrderFieldNode(CaseTypeDefinition caseTypeDefinition ObjectNode objectNode = objectMapper.createObjectNode(); CommonField commonField = caseTypeDefinition.getComplexSubfieldDefinitionByPath(sortOrderField.getCaseFieldId()).orElseThrow(() -> - new ServiceException(String.format("Case field '%s' does not exist in configuration for case type '%s'.", - sortOrderField.getCaseFieldId(), caseTypeDefinition.getId())) + new ServiceException(String.format("Case field '%s' does not exist in configuration for case type " + + "'%s'.", sortOrderField.getCaseFieldId(), caseTypeDefinition.getId())) ); FieldTypeDefinition fieldType = commonField.getFieldTypeDefinition(); 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 4af5243a48..1783914daf 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 @@ -52,7 +52,6 @@ public BaseType getType() { public List validate(final String dataFieldId, final JsonNode dataValue, final CaseFieldDefinition caseFieldDefinition) { - List validationResults; // Empty text should still check against MIN - MIN may or may not be 0 if (isNullOrEmpty(dataValue)) { @@ -87,6 +86,7 @@ public List validate(final String dataFieldId, + " does not match Document Management domain or expected URL path", dataFieldId)); } + List validationResults; if (dataValue.has(DOCUMENT_BINARY_URL)) { final JsonNode documentBinaryUrl = dataValue.get(DOCUMENT_BINARY_URL); validationResults = validateDocumentBinaryURL( diff --git a/src/test/java/uk/gov/hmcts/ccd/integrations/IdamRepositoryCachingIT.java b/src/test/java/uk/gov/hmcts/ccd/integrations/IdamRepositoryCachingIT.java index cf21900329..2c24a8fe75 100644 --- a/src/test/java/uk/gov/hmcts/ccd/integrations/IdamRepositoryCachingIT.java +++ b/src/test/java/uk/gov/hmcts/ccd/integrations/IdamRepositoryCachingIT.java @@ -55,8 +55,8 @@ public void openMocks() { } /** - *

Test cached behaviour of getDataStoreUserAccessToken method. Caching is implemented using Spring - * Cacheable annotation so test is performed on the actual IdamRepository bean with mocked dependencies.

+ * Test cached behaviour of getDataStoreUserAccessToken method. Caching is implemented using Spring + * Cacheable annotation so test is performed on the actual IdamRepository bean with mocked dependencies. * *

As the caching behaviour is controlled by Spring it is not reset between tests. For this reason * all tests have to be in a single method so that state can be controlled.

From bd5346db643545b3aace053afbc2db773550aaaa Mon Sep 17 00:00:00 2001 From: James Collett <89016121+JamesCollettCGI@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:45:04 +0000 Subject: [PATCH 6/8] Try loadbalancer 5.0.0. and contract-stub-runner 5.0.0 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index c932fdd8f6..bd0249b51c 100644 --- a/build.gradle +++ b/build.gradle @@ -249,7 +249,7 @@ dependencies { // 4.3.1 // 5.0.0 // 5.0.1 - implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '4.3.1' + implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-loadbalancer', version: '5.0.0' implementation group: 'org.springframework.hateoas', name: 'spring-hateoas' implementation group: 'org.springframework.plugin', name: 'spring-plugin-core' @@ -316,7 +316,7 @@ dependencies { // 4.3.1 // 5.0.0 // 5.0.1 - testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '4.3.1' + testImplementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-contract-stub-runner', version: '5.0.0' testImplementation group: 'org.testcontainers', name: 'testcontainers', version: testContainersVersion testImplementation group: 'org.testcontainers', name: 'postgresql', version: testContainersVersion From 530142b80d2a885664702dc6ba5d6d2c63de8e9c Mon Sep 17 00:00:00 2001 From: James Collett <89016121+JamesCollettCGI@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:18:10 +0000 Subject: [PATCH 7/8] Add spring-cloud-contract-wiremock:4.3.1 --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index bd0249b51c..919793c7e1 100644 --- a/build.gradle +++ b/build.gradle @@ -326,6 +326,7 @@ dependencies { testImplementation group: 'com.github.hmcts', name: 'ccd-test-definitions', version: ccdTestDefinitionVersion testImplementation group: 'com.github.hmcts', name: 'befta-fw', version: beftaFwVersion testImplementation group: 'com.github.hmcts', name: 'fortify-client', version: '1.4.10', classifier: 'all' + testImplementation 'org.springframework.cloud:spring-cloud-contract-wiremock:4.3.1' contractTestImplementation group: 'au.com.dius.pact.provider', name: 'junit5', version: pactProviderVersion contractTestImplementation group: 'au.com.dius.pact.provider', name: 'spring', version: pactProviderVersion From 97b227cf91309b4478bf2ea7f6d696b63d3a7d20 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 24 Mar 2026 13:19:18 +0000 Subject: [PATCH 8/8] Update build.gradle (align task smoke with task functional) --- build.gradle | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index c932fdd8f6..11ab1e21c4 100644 --- a/build.gradle +++ b/build.gradle @@ -748,7 +748,7 @@ task highLevelDataSetup(type: JavaExec) { jvmArgs = ['--add-opens=java.base/java.lang.reflect=ALL-UNNAMED'] } -task smoke() { +task smoke(type: JavaExec) { description = 'Executes smoke tests against an the CCD Data Store API instance just deployed' dependsOn aatClasses @@ -758,19 +758,15 @@ task smoke() { into "$buildDir/test-results/test" } - doLast { - generateCucumberReports.enabled = true - javaexec { - mainClass = "uk.gov.hmcts.ccd.datastore.befta.DataStoreBeftaMain" - classpath += configurations.cucumberRuntime + sourceSets.aat.runtimeClasspath - args = ['--plugin', "json:${rootDir}/target/cucumber.json", - '--plugin', "junit:${buildDir}/test-results/smoke/cucumber.xml", - '--tags', '@Smoke and not @Ignore', - '--glue', 'uk.gov.hmcts.befta.player', - '--glue', "uk.gov.hmcts.ccd.datastore.befta", 'src/aat/resources/features'] - jvmArgs = [ '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED' ] - } - } + generateCucumberReports.enabled = true + mainClass = "uk.gov.hmcts.ccd.datastore.befta.DataStoreBeftaMain" + classpath += configurations.cucumberRuntime + sourceSets.aat.runtimeClasspath + args = ['--plugin', "json:${rootDir}/target/cucumber.json", + '--plugin', "junit:${buildDir}/test-results/smoke/cucumber.xml", + '--tags', '@Smoke and not @Ignore', + '--glue', 'uk.gov.hmcts.befta.player', + '--glue', "uk.gov.hmcts.ccd.datastore.befta", 'src/aat/resources/features'] + jvmArgs = [ '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED' ] finalizedBy { generateCucumberReports {