Skip to content

Commit 4c77586

Browse files
[PRM-712] Upgraded to Java 25, Spring Boot 4 and Gradle 9.3
1 parent a4aa771 commit 4c77586

File tree

20 files changed

+230
-228
lines changed

20 files changed

+230
-228
lines changed

services/re-registration-service/build.gradle

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
plugins {
2-
id 'org.springframework.boot' version '3.5.11'
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'
66
id "org.sonarqube" version "4.4.1.3373"
77
}
88

99
group = 'uk.nhs.prm.repo'
1010
version = '0.0.1-SNAPSHOT'
11-
sourceCompatibility = '21'
1211

1312
configurations {
1413
compileOnly {
@@ -20,57 +19,58 @@ repositories {
2019
mavenCentral()
2120
}
2221

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

2934
dependencies {
30-
implementation('com.google.guava:guava') { version { strictly '32.1.3-jre' } }
31-
32-
implementation('org.yaml:snakeyaml') { version { strictly '2.2' } }
33-
3435
implementation 'org.springframework.boot:spring-boot-starter'
3536
implementation 'org.springframework.boot:spring-boot-starter-web'
3637

37-
implementation('io.netty:netty-buffer') { version { strictly '4.1.104.Final' } }
38-
implementation('io.netty:netty-codec') { version { strictly '4.1.104.Final' } }
39-
implementation('io.netty:netty-codec-http') { version { strictly '4.1.104.Final' } }
40-
implementation('io.netty:netty-codec-http2') { version { strictly '4.1.104.Final' } }
41-
implementation('io.netty:netty-common') { version { strictly '4.1.104.Final' } }
42-
implementation('io.netty:netty-handler') { version { strictly '4.1.104.Final' } }
43-
implementation('io.netty:netty-resolver') { version { strictly '4.1.104.Final' } }
44-
implementation('io.netty:netty-transport') { version { strictly '4.1.104.Final' } }
45-
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.1.104.Final' } }
46-
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.1.104.Final' } }
38+
implementation 'org.yaml:snakeyaml:2.5'
39+
40+
implementation('io.netty:netty-buffer') { version { strictly '4.2.9.Final' } }
41+
implementation('io.netty:netty-codec') { version { strictly '4.2.9.Final' } }
42+
implementation('io.netty:netty-codec-http') { version { strictly '4.2.9.Final' } }
43+
implementation('io.netty:netty-codec-http2') { version { strictly '4.2.9.Final' } }
44+
implementation('io.netty:netty-common') { version { strictly '4.2.9.Final' } }
45+
implementation('io.netty:netty-handler') { version { strictly '4.2.9.Final' } }
46+
implementation('io.netty:netty-resolver') { version { strictly '4.2.9.Final' } }
47+
implementation('io.netty:netty-transport') { version { strictly '4.2.9.Final' } }
48+
implementation('io.netty:netty-transport-classes-epoll') { version { strictly '4.2.9.Final' } }
49+
implementation('io.netty:netty-transport-native-unix-common') { version { strictly '4.2.9.Final' } }
4750

48-
implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:1.1.2'
51+
implementation 'com.fasterxml.jackson.core:jackson-databind'
4952

50-
implementation platform('software.amazon.awssdk:bom:2.18.41')
53+
implementation 'com.amazonaws:amazon-sqs-java-messaging-lib:2.1.4'
54+
55+
implementation platform('software.amazon.awssdk:bom:2.41.14')
5156
implementation 'software.amazon.awssdk:cloudwatch'
5257
implementation 'software.amazon.awssdk:sqs'
5358
implementation 'software.amazon.awssdk:sns'
5459
implementation 'software.amazon.awssdk:dynamodb'
5560

56-
implementation group: 'javax.inject', name: 'javax.inject', version: '1'
57-
implementation 'org.springframework:spring-jms:5.3.19'
58-
implementation 'com.google.code.gson:gson:2.10.1'
59-
implementation 'io.github.resilience4j:resilience4j-retry:1.7.1'
61+
implementation 'com.google.code.gson:gson:2.13.2'
62+
implementation 'io.github.resilience4j:resilience4j-retry:2.3.0'
6063

61-
implementation 'net.logstash.logback:logstash-logback-encoder:7.2'
64+
implementation 'net.logstash.logback:logstash-logback-encoder:9.0'
6265

63-
compileOnly 'org.projectlombok:lombok:1.18.24'
66+
compileOnly 'org.projectlombok:lombok:1.18.42'
6467
annotationProcessor 'org.projectlombok:lombok'
6568

66-
implementation 'com.github.spotbugs:spotbugs-annotations:4.8.3'
67-
6869
testImplementation 'org.springframework.boot:spring-boot-starter-test'
6970
testImplementation 'org.springframework.boot:spring-boot-test'
7071

71-
testImplementation "org.mockito:mockito-core:3.+"
72-
testImplementation 'org.wiremock:wiremock-standalone:3.3.1'
73-
testImplementation 'org.awaitility:awaitility:4.2.0'
72+
testImplementation 'org.wiremock:wiremock-standalone:3.13.2'
73+
testImplementation 'org.awaitility:awaitility:4.3.0'
7474
}
7575

7676
test {
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-8.5-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/re-registration-service/src/integration/java/uk/nhs/prm/repo/re_registration/ActiveSuspensionsIntegrationTest.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package uk.nhs.prm.repo.re_registration;
22

3-
import com.amazonaws.services.sqs.AmazonSQSAsync;
43
import org.junit.jupiter.api.Test;
54
import org.junit.jupiter.api.extension.ExtendWith;
65
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +8,7 @@
98
import org.springframework.test.context.ActiveProfiles;
109
import org.springframework.test.context.ContextConfiguration;
1110
import org.springframework.test.context.junit.jupiter.SpringExtension;
11+
import software.amazon.awssdk.services.sqs.SqsClient;
1212
import uk.nhs.prm.repo.re_registration.data.ActiveSuspensionsDb;
1313
import uk.nhs.prm.repo.re_registration.infra.LocalStackAwsConfig;
1414
import uk.nhs.prm.repo.re_registration.model.ActiveSuspensionsMessage;
@@ -27,7 +27,7 @@
2727
@ContextConfiguration(classes = LocalStackAwsConfig.class)
2828
public class ActiveSuspensionsIntegrationTest {
2929
@Autowired
30-
private AmazonSQSAsync amazonSQSAsync;
30+
private SqsClient sqs;
3131

3232
@Autowired
3333
ActiveSuspensionsDb activeSuspensionsDb;
@@ -38,9 +38,6 @@ public class ActiveSuspensionsIntegrationTest {
3838
@Value("${aws.reRegistrationsQueueName}")
3939
private String reRegistrationsQueueName;
4040

41-
@Autowired
42-
private AmazonSQSAsync sqs;
43-
4441
private static final String NHS_NUMBER = "0987654321";
4542
private static final String PREVIOUS_ODS_CODE = "OLD001";
4643
private static final String NEWLY_REGISTERED_ODS_CODE = "NEW001";
@@ -77,8 +74,8 @@ void shouldDeleteRecordFromActiveSuspensionsDbWhenRecordFoundByNhsNumber() {
7774
}
7875

7976
private void sendMessage(String queueName, String messageBody) {
80-
var queueUrl = amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();
81-
amazonSQSAsync.sendMessage(queueUrl, messageBody);
77+
var queueUrl = sqs.getQueueUrl(builder -> builder.queueName(queueName)).queueUrl();
78+
sqs.sendMessage(builder -> builder.queueUrl(queueUrl).messageBody(messageBody));
8279
}
8380

8481
private String getActiveSuspensionsMessage() {
Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package uk.nhs.prm.repo.re_registration;
22

3-
import com.amazonaws.services.sqs.AmazonSQSAsync;
4-
import com.amazonaws.services.sqs.model.CreateQueueRequest;
5-
import com.amazonaws.services.sqs.model.Message;
6-
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
73
import org.junit.jupiter.api.Test;
84
import org.junit.jupiter.api.extension.ExtendWith;
95
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,13 +8,18 @@
128
import org.springframework.test.context.ActiveProfiles;
139
import org.springframework.test.context.ContextConfiguration;
1410
import org.springframework.test.context.junit.jupiter.SpringExtension;
11+
import software.amazon.awssdk.services.sqs.SqsClient;
12+
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest;
13+
import software.amazon.awssdk.services.sqs.model.Message;
14+
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
1515
import uk.nhs.prm.repo.re_registration.infra.LocalStackAwsConfig;
1616
import uk.nhs.prm.repo.re_registration.logging.TestLogAppender;
1717
import uk.nhs.prm.repo.re_registration.message_publishers.ReRegistrationAuditPublisher;
1818
import uk.nhs.prm.repo.re_registration.model.ReRegistrationEvent;
1919

2020
import java.util.HashMap;
2121
import java.util.List;
22+
import java.util.Map;
2223
import java.util.UUID;
2324
import java.util.concurrent.TimeUnit;
2425

@@ -32,26 +33,22 @@
3233
public class ReRegistrationsIntegrationTest {
3334

3435
@Autowired
35-
private AmazonSQSAsync amazonSQSAsync;
36+
private SqsClient sqs;
3637

3738
@Autowired
3839
ReRegistrationAuditPublisher publisher;
3940

4041
@Value("${aws.reRegistrationsQueueName}")
4142
private String reRegistrationsQueueName;
4243

43-
4444
private String getReRegistrationsEvent() {
4545
return new ReRegistrationEvent("1234567890", "ABC123", UUID.randomUUID().toString(), "2017-11-01T15:00:33+00:00").toJsonString();
4646
}
4747

4848
private void createQueue(String queueName) {
49-
CreateQueueRequest createQueueRequest = new CreateQueueRequest();
50-
createQueueRequest.setQueueName(queueName);
51-
HashMap<String, String> attributes = new HashMap<>();
52-
createQueueRequest.withAttributes(attributes);
53-
amazonSQSAsync.createQueue(reRegistrationsQueueName);
54-
49+
sqs.createQueue(CreateQueueRequest.builder()
50+
.queueName(queueName)
51+
.build());
5552
}
5653

5754
@Test
@@ -68,29 +65,24 @@ void shouldReceiveAndLogAndAcknowledgeReRegistrationsEvent() {
6865
assertThat(receiveLog).isNotNull();
6966
});
7067

71-
7268
var messages = receiveMessages(reRegistrationsQueueName);
73-
7469
assertThat(messages).isEmpty();
7570
}
7671

77-
7872
private void sendMessage(String queueName, String messageBody) {
7973
var queueUrl = getQueueUrl(queueName);
80-
amazonSQSAsync.sendMessage(queueUrl, messageBody);
74+
sqs.sendMessage(builder -> builder.queueUrl(queueUrl).messageBody(messageBody));
8175
}
8276

8377
private String getQueueUrl(String queueName) {
84-
return amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();
78+
return sqs.getQueueUrl(builder -> builder.queueName(queueName)).queueUrl();
8579
}
8680

87-
@Test
8881
private List<Message> receiveMessages(String queueName) {
89-
String queueUrl = amazonSQSAsync.getQueueUrl(queueName).getQueueUrl();
90-
91-
var receiveMessageRequest = new ReceiveMessageRequest().withQueueUrl(queueUrl);
92-
return amazonSQSAsync.receiveMessage(receiveMessageRequest).getMessages();
82+
String queueUrl = getQueueUrl(queueName);
83+
var receiveMessageRequest = ReceiveMessageRequest.builder()
84+
.queueUrl(queueUrl)
85+
.build();
86+
return sqs.receiveMessage(receiveMessageRequest).messages();
9387
}
94-
9588
}
96-

services/re-registration-service/src/integration/java/uk/nhs/prm/repo/re_registration/delete_ehr/DeleteEhrIntegrationTest.java

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package uk.nhs.prm.repo.re_registration.delete_ehr;
22

3-
import com.amazonaws.services.sqs.AmazonSQSAsync;
4-
import com.amazonaws.services.sqs.model.Message;
5-
import com.amazonaws.services.sqs.model.PurgeQueueRequest;
6-
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
73
import com.github.tomakehurst.wiremock.WireMockServer;
84
import org.apache.logging.log4j.LogManager;
95
import org.apache.logging.log4j.Logger;
@@ -20,6 +16,10 @@
2016
import org.springframework.test.context.ActiveProfiles;
2117
import org.springframework.test.context.ContextConfiguration;
2218
import org.springframework.test.context.junit.jupiter.SpringExtension;
19+
import software.amazon.awssdk.services.sqs.SqsClient;
20+
import software.amazon.awssdk.services.sqs.model.Message;
21+
import software.amazon.awssdk.services.sqs.model.PurgeQueueRequest;
22+
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
2323
import uk.nhs.prm.repo.re_registration.data.ActiveSuspensionsDb;
2424
import uk.nhs.prm.repo.re_registration.infra.LocalStackAwsConfig;
2525
import uk.nhs.prm.repo.re_registration.model.ActiveSuspensionsMessage;
@@ -30,25 +30,25 @@
3030

3131
import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
3232
import static com.github.tomakehurst.wiremock.client.WireMock.delete;
33+
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
3334
import static com.github.tomakehurst.wiremock.client.WireMock.get;
3435
import static com.github.tomakehurst.wiremock.client.WireMock.matching;
35-
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
36-
import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching;
36+
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
3737
import static org.assertj.core.api.Assertions.assertThat;
3838
import static org.awaitility.Awaitility.await;
3939

4040
@SpringBootTest()
4141
@ActiveProfiles("test")
4242
@ExtendWith(SpringExtension.class)
43-
@ContextConfiguration( classes = LocalStackAwsConfig.class)
43+
@ContextConfiguration(classes = LocalStackAwsConfig.class)
4444
@DirtiesContext
4545
public class DeleteEhrIntegrationTest {
4646

4747
private static final Logger LOGGER = LogManager.getLogger(DeleteEhrIntegrationTest.class);
4848
public static final String NHS_NUMBER = "9999567890";
4949

5050
@Autowired
51-
private AmazonSQSAsync sqs;
51+
private SqsClient sqs;
5252

5353
@Autowired
5454
ActiveSuspensionsDb activeSuspensionsDb;
@@ -66,20 +66,19 @@ public class DeleteEhrIntegrationTest {
6666
private String reRegistrationsQueueUrl;
6767
private String reRegistrationsAuditUrl;
6868

69-
7069
@BeforeEach
7170
public void setUp() {
7271
stubPdsAdaptor = initializeWebServer();
73-
reRegistrationsQueueUrl = sqs.getQueueUrl(reRegistrationsQueueName).getQueueUrl();
74-
reRegistrationsAuditUrl = sqs.getQueueUrl(reRegistrationsAuditQueueName).getQueueUrl();
72+
reRegistrationsQueueUrl = sqs.getQueueUrl(builder -> builder.queueName(reRegistrationsQueueName)).queueUrl();
73+
reRegistrationsAuditUrl = sqs.getQueueUrl(builder -> builder.queueName(reRegistrationsAuditQueueName)).queueUrl();
7574
stubResponses();
7675
}
7776

7877
@AfterEach
7978
public void tearDown() {
8079
stubPdsAdaptor.resetAll();
8180
stubPdsAdaptor.stop();
82-
sqs.purgeQueue(new PurgeQueueRequest(reRegistrationsAuditUrl));
81+
sqs.purgeQueue(PurgeQueueRequest.builder().queueUrl(reRegistrationsAuditUrl).build());
8382
}
8483

8584
private WireMockServer initializeWebServer() {
@@ -91,10 +90,10 @@ private WireMockServer initializeWebServer() {
9190
@Test
9291
void shouldPutTheEHRDeleteAuditMessageOntoTheAuditQueueWhenActiveSuspensionExistsInDBAndPDSReturnsAStatusCode200() {
9392
activeSuspensionsDb.save(getActiveSuspensionsMessage());
94-
sqs.sendMessage(reRegistrationsQueueUrl, getReRegistrationEvent().toJsonString());
93+
sqs.sendMessage(builder -> builder.queueUrl(reRegistrationsQueueUrl).messageBody(getReRegistrationEvent().toJsonString()));
9594

96-
await().atMost(20, TimeUnit.SECONDS).untilAsserted(()-> {
97-
String messageBody = checkMessageInRelatedQueue(reRegistrationsAuditUrl).get(0).getBody();
95+
await().atMost(20, TimeUnit.SECONDS).untilAsserted(() -> {
96+
String messageBody = checkMessageInRelatedQueue(reRegistrationsAuditUrl).get(0).body();
9897
System.out.println("Found message - " + messageBody);
9998

10099
assertThat(messageBody).contains("\"status\":\"ACTION:RE_REGISTRATION_EHR_DELETED\"");
@@ -103,13 +102,12 @@ void shouldPutTheEHRDeleteAuditMessageOntoTheAuditQueueWhenActiveSuspensionExist
103102
});
104103
}
105104

106-
107105
@Test
108106
void shouldPutTheUnknownReRegistrationsAuditMessageOntoTheAuditQueueWhenActiveSuspensionDoesNotExistInDBAndPDSReturnsAStatusCode200() {
109-
sqs.sendMessage(reRegistrationsQueueUrl,getReRegistrationEvent().toJsonString());
107+
sqs.sendMessage(builder -> builder.queueUrl(reRegistrationsQueueUrl).messageBody(getReRegistrationEvent().toJsonString()));
110108

111-
await().atMost(20, TimeUnit.SECONDS).untilAsserted(()-> {
112-
String messageBody = checkMessageInRelatedQueue(reRegistrationsAuditUrl).get(0).getBody();
109+
await().atMost(20, TimeUnit.SECONDS).untilAsserted(() -> {
110+
String messageBody = checkMessageInRelatedQueue(reRegistrationsAuditUrl).get(0).body();
113111
System.out.println("Found message - " + messageBody);
114112
assertThat(messageBody).contains("\"status\":\"NO_ACTION:UNKNOWN_REGISTRATION_EVENT_RECEIVED\"");
115113
});
@@ -121,17 +119,16 @@ private void stubResponses() {
121119
}
122120

123121
private void setPds200SuccessState() {
124-
stubFor(get(urlMatching("/suspended-patient-status/" + NHS_NUMBER))
125-
.withHeader("Authorization", matching("Basic cmUtcmVnaXN0cmF0aW9uLXNlcnZpY2U6ZGVmYXVsdA=="))
126-
.inScenario("Retry Scenario")
122+
stubPdsAdaptor.stubFor(get(urlEqualTo("/suspended-patient-status/" + NHS_NUMBER))
123+
.withHeader("Authorization", equalTo("Basic cmUtcmVnaXN0cmF0aW9uLXNlcnZpY2U6ZGVmYXVsdA=="))
127124
.willReturn(aResponse()
128125
.withStatus(200)
129-
.withHeader("Content-Type", "text/xml")
126+
.withHeader("Content-Type", "application/json")
130127
.withBody(getPdsResponseString().getBody())));
131128
}
132129

133130
private void ehrRepository200Response() {
134-
stubFor(delete(urlMatching("/patients/" + NHS_NUMBER))
131+
stubPdsAdaptor.stubFor(delete(urlEqualTo("/patients/" + NHS_NUMBER))
135132
.withHeader("Authorization", matching(authKey))
136133
.willReturn(aResponse()
137134
.withStatus(200)
@@ -151,13 +148,14 @@ private ReRegistrationEvent getReRegistrationEvent() {
151148
private List<Message> checkMessageInRelatedQueue(String queueUrl) {
152149
LOGGER.info("Checking SQS Queue: {}", queueUrl);
153150

154-
ReceiveMessageRequest requestForMessagesWithAttributes = new ReceiveMessageRequest()
155-
.withQueueUrl(queueUrl)
156-
.withMessageAttributeNames("traceId");
151+
ReceiveMessageRequest requestForMessagesWithAttributes = ReceiveMessageRequest.builder()
152+
.queueUrl(queueUrl)
153+
.messageAttributeNames("traceId")
154+
.build();
157155

158156
final List<Message> messages = sqs
159157
.receiveMessage(requestForMessagesWithAttributes)
160-
.getMessages();
158+
.messages();
161159

162160
LOGGER.info("Found {} messages on queue: {}", messages.size(), queueUrl);
163161
assertThat(messages).hasSize(1);

0 commit comments

Comments
 (0)