Skip to content

Commit 935f591

Browse files
[PRM-713] Upgraded PDS Adaptor to Spring Boot 4, Java 25 and Gradle 9.3 (#292)
1 parent ca2d404 commit 935f591

22 files changed

Lines changed: 269 additions & 293 deletions

File tree

.github/workflows/service-ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ jobs:
137137
service: pds-adaptor
138138
environment: dev
139139
is_deployment: ${{ github.ref == 'refs/heads/main' }}
140-
java_version: "11"
140+
java_version: "25"
141141
ecr_alias: deductions/pds-adaptor
142142
secrets: inherit
143143

services/pds-adaptor/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM eclipse-temurin:11-jre-alpine-3.23
1+
FROM eclipse-temurin:25-jre-alpine-3.23
22

33
RUN apk update && \
44
apk -u list && \

services/pds-adaptor/build.gradle

Lines changed: 38 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
plugins {
2-
id 'org.springframework.boot' version '2.7.18'
3-
id 'io.spring.dependency-management' version '1.1.4'
2+
id 'org.springframework.boot' version '4.0.3'
3+
id 'io.spring.dependency-management' version '1.1.7'
44
id 'java'
55
id 'jacoco'
6-
id 'com.github.spotbugs' version '6.0.6'
76
}
87

98
group = 'uk.nhs.prm.deductions'
@@ -13,54 +12,63 @@ configurations {
1312
compileOnly {
1413
extendsFrom annotationProcessor
1514
}
15+
mockitoAgent
1616
}
1717

1818
repositories {
1919
mavenCentral()
2020
}
2121

22+
java {
23+
toolchain {
24+
languageVersion = JavaLanguageVersion.of(25)
25+
}
26+
}
27+
2228
//Without this task two jars are built, the additional "-plain.jar" is not needed
2329
// for more details refer to: https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable.and-plain-archives
2430
jar {
2531
enabled = false
2632
}
2733

2834
dependencies {
29-
implementation 'org.springframework.boot:spring-boot-starter-web'
35+
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
3036
implementation 'org.springframework.boot:spring-boot-starter-actuator'
3137
implementation 'org.springframework.boot:spring-boot-starter-security'
38+
implementation 'org.springframework.boot:spring-boot-starter-validation'
3239

3340
testImplementation 'org.springframework.boot:spring-boot-starter-test'
34-
testImplementation 'org.springframework.boot:spring-boot-starter-aop'
35-
36-
implementation 'org.yaml:snakeyaml:2.2'
37-
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'
38-
implementation 'net.logstash.logback:logstash-logback-encoder:6.6'
39-
implementation 'org.bouncycastle:bcpkix-jdk15on:1.70'
40-
implementation 'com.nimbusds:nimbus-jose-jwt:9.37.3'
41-
implementation 'org.jetbrains:annotations:20.1.0'
42-
implementation 'org.json:json:20231013'
43-
implementation 'org.apache.httpcomponents:httpclient:4.5.14'
44-
45-
implementation('io.netty:netty-buffer') { version { strictly '4.1.104.Final' } }
46-
implementation('io.netty:netty-codec') { version { strictly '4.1.104.Final' } }
47-
implementation('io.netty:netty-codec-http') { version { strictly '4.1.104.Final' } }
48-
implementation('io.netty:netty-codec-http2') { version { strictly '4.1.104.Final' } }
49-
implementation('io.netty:netty-common') { version { strictly '4.1.104.Final' } }
50-
implementation('io.netty:netty-handler') { version { strictly '4.1.104.Final' } }
51-
implementation('io.netty:netty-resolver') { version { strictly '4.1.104.Final' } }
52-
implementation('io.netty:netty-transport') { version { strictly '4.1.104.Final' } }
53-
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.1.104.Final' } }
54-
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.1.104.Final' } }
55-
56-
implementation platform('software.amazon.awssdk:bom:2.18.41')
41+
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
42+
testImplementation 'org.springframework.boot:spring-boot-starter-restclient-test'
43+
44+
implementation 'org.yaml:snakeyaml:2.5'
45+
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.2'
46+
implementation 'net.logstash.logback:logstash-logback-encoder:9.0'
47+
implementation 'org.bouncycastle:bcpkix-jdk18on:1.83'
48+
implementation 'com.nimbusds:nimbus-jose-jwt:10.8'
49+
implementation 'org.json:json:20251224'
50+
51+
implementation('io.netty:netty-buffer') { version { strictly '4.2.9.Final' } }
52+
implementation('io.netty:netty-codec') { version { strictly '4.2.9.Final' } }
53+
implementation('io.netty:netty-codec-http') { version { strictly '4.2.9.Final' } }
54+
implementation('io.netty:netty-codec-http2') { version { strictly '4.2.9.Final' } }
55+
implementation('io.netty:netty-common') { version { strictly '4.2.9.Final' } }
56+
implementation('io.netty:netty-handler') { version { strictly '4.2.9.Final' } }
57+
implementation('io.netty:netty-resolver') { version { strictly '4.2.9.Final' } }
58+
implementation('io.netty:netty-transport') { version { strictly '4.2.9.Final' } }
59+
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.2.9.Final' } }
60+
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.2.9.Final' } }
61+
62+
implementation platform('software.amazon.awssdk:bom:2.41.14')
5763
implementation 'software.amazon.awssdk:ssm'
5864

59-
compileOnly 'org.projectlombok:lombok:1.18.30'
65+
compileOnly 'org.projectlombok:lombok:1.18.42'
6066

6167
annotationProcessor 'org.projectlombok:lombok'
6268

63-
testImplementation 'com.github.tomakehurst:wiremock-jre8:2.35.1'
69+
testImplementation 'org.wiremock:wiremock-standalone:3.13.2'
70+
implementation 'org.apache.httpcomponents.client5:httpclient5'
71+
mockitoAgent('org.mockito:mockito-core') { transitive = false }
6472
}
6573

6674
springBoot {
@@ -87,6 +95,7 @@ test {
8795

8896
tasks.withType(Test) {
8997
useJUnitPlatform()
98+
jvmArgs "-javaagent:${configurations.mockitoAgent.asPath}"
9099
}
91100

92101
task integration(type: Test) {
@@ -118,33 +127,5 @@ jacocoTestCoverageVerification {
118127
}
119128
}
120129

121-
spotbugsMain {
122-
ignoreFailures = true
123-
reports {
124-
html {
125-
enabled = true
126-
destination = file("$buildDir/reports/spotbugs/main/spotbugs.html")
127-
stylesheet = 'fancy-hist.xsl'
128-
}
129-
}
130-
}
131-
132-
spotbugsTest {
133-
enabled = false
134-
}
135-
136-
spotbugsIntegration {
137-
ignoreFailures = true
138-
reports {
139-
html {
140-
enabled = true
141-
destination = file("$buildDir/reports/spotbugs/integration/spotbugs.html")
142-
stylesheet = 'fancy-hist.xsl'
143-
}
144-
}
145-
}
146-
147-
check.dependsOn integration
148-
149130
test.outputs.upToDateWhen {false}
150131
integration.outputs.upToDateWhen {false}

services/pds-adaptor/gradle.properties

Whitespace-only changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

services/pds-adaptor/src/integration/java/uk/nhs/prm/deductions/pdsadaptor/ApplicationHealthIntegrationTest.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

services/pds-adaptor/src/integration/java/uk/nhs/prm/deductions/pdsadaptor/AuthIntegrationTest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
import org.junit.jupiter.api.Test;
44
import org.junit.jupiter.api.extension.ExtendWith;
55
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.resttestclient.TestRestTemplate;
7+
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
68
import org.springframework.boot.test.context.SpringBootTest;
7-
import org.springframework.boot.test.web.client.TestRestTemplate;
8-
import org.springframework.boot.web.server.LocalServerPort;
9-
import org.springframework.http.*;
9+
import org.springframework.boot.test.web.server.LocalServerPort;
10+
import org.springframework.http.HttpEntity;
11+
import org.springframework.http.HttpHeaders;
12+
import org.springframework.http.HttpMethod;
13+
import org.springframework.http.HttpStatus;
14+
import org.springframework.http.ResponseEntity;
1015
import org.springframework.test.context.junit.jupiter.SpringExtension;
1116

1217
import static org.assertj.core.api.Assertions.assertThat;
1318

19+
@AutoConfigureTestRestTemplate
1420
@ExtendWith(SpringExtension.class)
1521
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
1622
public class AuthIntegrationTest {

services/pds-adaptor/src/integration/java/uk/nhs/prm/deductions/pdsadaptor/PdsAdaptorIntegrationTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import org.junit.jupiter.api.BeforeEach;
99
import org.junit.jupiter.api.Test;
1010
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.resttestclient.TestRestTemplate;
12+
import org.springframework.boot.resttestclient.autoconfigure.AutoConfigureTestRestTemplate;
1113
import org.springframework.boot.test.context.SpringBootTest;
12-
import org.springframework.boot.test.web.client.TestRestTemplate;
13-
import org.springframework.boot.web.server.LocalServerPort;
14+
import org.springframework.boot.test.web.server.LocalServerPort;
1415
import org.springframework.http.*;
1516
import org.springframework.test.context.ContextConfiguration;
1617
import uk.nhs.prm.deductions.pdsadaptor.model.SuspendedPatientStatus;
@@ -23,6 +24,7 @@
2324
import static org.assertj.core.api.Assertions.assertThat;
2425
import static uk.nhs.prm.deductions.pdsadaptor.testing.MapBuilder.json;
2526

27+
@AutoConfigureTestRestTemplate
2628
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
2729
@ContextConfiguration(initializers = {WireMockInitializer.class})
2830
public class PdsAdaptorIntegrationTest {
@@ -244,7 +246,7 @@ public void shouldRetryWhen503ErrorsFromPdsFhir() {
244246
.withRequestBody(equalToJson(fhirPatchJsonToUpdateMofTo("A1235")))
245247
.whenScenarioStateIs(STARTED)
246248
.willReturn(aResponse()
247-
.withStatus(503) // request unsuccessful with status code 500
249+
.withStatus(503) // request unsuccessful with status code 503
248250
.withHeader("Content-Type", "text/xml")
249251
.withBody("<response>Some content</response>"))
250252
.willSetStateTo("TRIED_ONCE"));
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
9+
<root level="INFO">
10+
<appender-ref ref="CONSOLE" />
11+
</root>
12+
13+
<!-- Set specific log levels for debugging -->
14+
<logger name="uk.nhs.prm.deductions.pdsadaptor" level="DEBUG" />
15+
<logger name="org.springframework" level="INFO" />
16+
<logger name="com.amazonaws" level="WARN" />
17+
</configuration>

services/pds-adaptor/src/main/java/uk/nhs/prm/deductions/pdsadaptor/client/AuthenticatingHttpClient.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import lombok.RequiredArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
5-
import org.jetbrains.annotations.NotNull;
65
import org.springframework.http.HttpHeaders;
76
import org.springframework.http.HttpStatus;
87
import org.springframework.http.ResponseEntity;
@@ -52,12 +51,10 @@ private boolean isUnauthorized(HttpStatusCodeException e) {
5251
return e.getStatusCode() == HttpStatus.UNAUTHORIZED;
5352
}
5453

55-
@NotNull
5654
private HttpHeaders withRefreshedAuthHeader(HttpHeaders headers) {
5755
return withAuthHeader(headers, authService.getNewAccessToken());
5856
}
5957

60-
@NotNull
6158
private HttpHeaders withCurrentAuthHeader(HttpHeaders headers) {
6259
return withAuthHeader(headers, authService.getAccessToken());
6360
}

0 commit comments

Comments
 (0)