diff --git a/config/pmd/ruleset.xml b/config/pmd/ruleset.xml index 038df132c5..9b8cc84b0d 100644 --- a/config/pmd/ruleset.xml +++ b/config/pmd/ruleset.xml @@ -8,15 +8,11 @@ - - - + + + - - - - - + @@ -25,7 +21,6 @@ - @@ -36,6 +31,7 @@ + @@ -68,9 +64,8 @@ - + - @@ -80,7 +75,7 @@ - + diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/AuditControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/AuditControllerFT.java index 9b9bd0735b..996ca06e02 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/AuditControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/AuditControllerFT.java @@ -13,7 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class AuditControllerFT extends FunctionalTestBase { +class AuditControllerFT extends FunctionalTestBase { @DisplayName("Should fail to update an audit record as they are immutable") @Test diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionControllerFT.java index 1441c9750f..5a0a7ec61c 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionControllerFT.java @@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CaptureSessionControllerFT extends FunctionalTestBase { +class CaptureSessionControllerFT extends FunctionalTestBase { @Test @DisplayName("Scenario: Delete capture session with recordings") void shouldNotDeleteCaptureSessionWithRecordings() { diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CourtControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CourtControllerFT.java index 1bbb477e5a..1861758c1c 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CourtControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/CourtControllerFT.java @@ -7,7 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CourtControllerFT extends FunctionalTestBase { +class CourtControllerFT extends FunctionalTestBase { @DisplayName("Scenario: Create and update a court") @Test void createAndUpdateCourt() throws JsonProcessingException { diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/InviteControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/InviteControllerFT.java index c20cfce725..5efb43ac4f 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/InviteControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/InviteControllerFT.java @@ -15,7 +15,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class InviteControllerFT extends FunctionalTestBase { +class InviteControllerFT extends FunctionalTestBase { @DisplayName("Create a portal invite for new user") @Test void createPortalInvite() throws JsonProcessingException { diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceControllerFT.java index 70172828ad..1bac3b55a1 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceControllerFT.java @@ -12,7 +12,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class MediaServiceControllerFT extends FunctionalTestBase { +class MediaServiceControllerFT extends FunctionalTestBase { private static final String VOD_ENDPOINT = "/media-service/vod"; diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/RecordingControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/RecordingControllerFT.java index 5536d091ae..1139b576b0 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/RecordingControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/RecordingControllerFT.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class RecordingControllerFT extends FunctionalTestBase { +class RecordingControllerFT extends FunctionalTestBase { @DisplayName("Scenario: Restore recording") @Test void undeleteRecording() { diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/ReportControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/ReportControllerFT.java index 0c33a980d0..c8544e467e 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/ReportControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/ReportControllerFT.java @@ -12,13 +12,13 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ReportControllerFT extends FunctionalTestBase { +class ReportControllerFT extends FunctionalTestBase { private static final String DATE_FORMAT_REGEX = "^\\d{2}/\\d{2}/\\d{4}$"; private static final String TIME_FORMAT_REGEX = "^\\d{2}:\\d{2}:\\d{2}$"; - @DisplayName("Scenario: Should format Duration and date correctly") @Test + @DisplayName("Scenario: Should format Duration and date correctly") void shouldFormatDurationAndDateCorrectly() throws JsonProcessingException { var bookingId = doPostRequest("/testing-support/should-delete-recordings-for-booking", TestingSupportRoles.SUPER_USER) diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/UserControllerFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/UserControllerFT.java index c40b6019f6..6d3ea30146 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/UserControllerFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/controllers/UserControllerFT.java @@ -13,7 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class UserControllerFT extends FunctionalTestBase { +class UserControllerFT extends FunctionalTestBase { @DisplayName("Scenario: Create/update a user") @Test void shouldCreateUser() throws JsonProcessingException { diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/email/GovNotifyFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/email/GovNotifyFT.java index 0da77f0cde..fa56421b3e 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/email/GovNotifyFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/email/GovNotifyFT.java @@ -15,13 +15,13 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @SpringBootTest -public class GovNotifyFT { - private final String toEmailAddress = "test@test.com"; - private final String fromEmailAddress = "hmcts.prerecorded.evidence@notifications.service.gov.uk"; - private final String caseReference = "123456"; - private final String courtName = "Court Name"; - private final String userFirstName = "John"; - private final String userLastName = "Doe"; +class GovNotifyFT { + private static final String TO_EMAIL_ADDRESS = "test@test.com"; + private static final String FROM_EMAIL_ADDRESS = "hmcts.prerecorded.evidence@notifications.service.gov.uk"; + private static final String CASE_REFERENCE = "123456"; + private static final String COURT_NAME = "Court Name"; + private static final String USER_FIRST_NAME = "John"; + private static final String USER_LAST_NAME = "Doe"; @Value("${portal.url") private String portalUrl; @@ -31,18 +31,18 @@ public class GovNotifyFT { private User createUser() { var user = new User(); - user.setFirstName(userFirstName); - user.setLastName(userLastName); - user.setEmail(toEmailAddress); + user.setFirstName(USER_FIRST_NAME); + user.setLastName(USER_LAST_NAME); + user.setEmail(TO_EMAIL_ADDRESS); return user; } private Case createCase() { var court = new Court(); - court.setName(courtName); + court.setName(COURT_NAME); var forCase = new Case(); forCase.setCourt(court); - forCase.setReference(caseReference); + forCase.setReference(CASE_REFERENCE); return forCase; } @@ -59,7 +59,7 @@ void recordingReady() { var forCase = createCase(); var response = client.recordingReady(user, forCase); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals("[Do Not Reply] HMCTS Pre-recorded Evidence Portal – New Video", response.getSubject()); compareBody( """ @@ -86,7 +86,7 @@ void recordingEdited() { var forCase = createCase(); var response = client.recordingEdited(user, forCase); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals("[Do Not Reply] HMCTS Pre-recorded Evidence Portal – Edited Video", response.getSubject()); compareBody( """ @@ -112,7 +112,7 @@ void portalInvite() { var user = createUser(); var response = client.portalInvite(user); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals("[Do Not Reply] HMCTS Pre-recorded Evidence Portal Invitation", response.getSubject()); compareBody( """ @@ -158,9 +158,9 @@ void casePendingClosure() { var date = Timestamp.valueOf("2021-01-01 00:00:00.0"); var response = client.casePendingClosure(user, forCase, date); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals( - "[Do Not Reply] Pre-recorded Evidence: Case reference " + caseReference + " access update", + "[Do Not Reply] Pre-recorded Evidence: Case reference " + CASE_REFERENCE + " access update", response.getSubject() ); compareBody( @@ -181,9 +181,9 @@ void caseClosed() { var forCase = createCase(); var response = client.caseClosed(user, forCase); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals( - "[Do Not Reply] Pre-recorded Evidence: Case reference " + caseReference + " access update", + "[Do Not Reply] Pre-recorded Evidence: Case reference " + CASE_REFERENCE + " access update", response.getSubject() ); compareBody( @@ -204,9 +204,9 @@ void caseClosureCancelled() { var forCase = createCase(); var response = client.caseClosureCancelled(user, forCase); - assertEquals(fromEmailAddress, response.getFromEmail()); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals( - "[Do Not Reply] Pre-recorded Evidence: Case reference " + caseReference + " access update", + "[Do Not Reply] Pre-recorded Evidence: Case reference " + CASE_REFERENCE + " access update", response.getSubject() ); compareBody( @@ -221,13 +221,12 @@ void caseClosureCancelled() { @DisplayName("Should send verify email email") @Test - @SuppressWarnings("LineLength") void verifyEmail() { var verificationCode = "123456"; - var response = client.emailVerification(toEmailAddress, userFirstName, userLastName, verificationCode); - assertEquals(fromEmailAddress, response.getFromEmail()); + var response = client.emailVerification(TO_EMAIL_ADDRESS, USER_FIRST_NAME, USER_LAST_NAME, verificationCode); + assertEquals(FROM_EMAIL_ADDRESS, response.getFromEmail()); assertEquals( "[Do Not Reply] Pre-recorded Evidence: Account Email Verification Code", response.getSubject() diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterFT.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterFT.java index 2618970c35..bfd31dd3fb 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterFT.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterFT.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static uk.gov.hmcts.reform.preapi.config.OpenAPIConfiguration.X_USER_ID_HEADER; -public class XUserIdFilterFT extends FunctionalTestBase { +class XUserIdFilterFT extends FunctionalTestBase { private static final String ENDPOINT = "/roles"; diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/util/FunctionalTestBase.java b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/util/FunctionalTestBase.java index 49aa0c021e..8323d7fdfc 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/preapi/util/FunctionalTestBase.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/preapi/util/FunctionalTestBase.java @@ -47,7 +47,7 @@ import static uk.gov.hmcts.reform.preapi.config.OpenAPIConfiguration.X_USER_ID_HEADER; @SpringBootTest(classes = { Application.class }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@SuppressWarnings("PMD.JUnit5TestShouldBePackagePrivate") +@SuppressWarnings({"PMD.JUnit5TestShouldBePackagePrivate", "PMD.GodClass"}) public class FunctionalTestBase { protected static final String CONTENT_TYPE_VALUE = "application/json"; protected static final String COURTS_ENDPOINT = "/courts"; diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/AuditTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/AuditTest.java index ca8ebc1959..e6dca2edfb 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/AuditTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/AuditTest.java @@ -21,7 +21,7 @@ class AuditTest extends IntegrationTestBase { @Test @Transactional - public void testSaveAndRetrieveAudit() throws JsonProcessingException { + void testSaveAndRetrieveAudit() throws JsonProcessingException { Audit audit = new Audit(); audit.setTableName("TestTable"); audit.setTableRecordId(UUID.randomUUID()); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/BookingTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/BookingTest.java index f9c16bb180..55481631fe 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/BookingTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/BookingTest.java @@ -108,7 +108,6 @@ public void testAuditWithParticipants() { audit.get().getAuditDetails().get("participants") .forEach(node -> { - System.out.println(node); assertThat(node.asText()).isIn(List.of( participant1.getId().toString(), participant2.getId().toString())); }); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAcceptedTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAcceptedTest.java index 7f982e8a12..d26bd6d416 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAcceptedTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAcceptedTest.java @@ -14,11 +14,11 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest(classes = Application.class) -public class UserTermsAcceptedTest extends IntegrationTestBase { +class UserTermsAcceptedTest extends IntegrationTestBase { @Test @Transactional - public void testSaveAndRetrieve() { + void testSaveAndRetrieve() { var user = HelperFactory.createDefaultTestUser(); entityManager.persist(user); entityManager.flush(); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/AuditServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/AuditServiceIT.java index a787cb5518..19dbb8e25f 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/AuditServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/AuditServiceIT.java @@ -27,7 +27,7 @@ import java.util.Comparator; import java.util.UUID; -public class AuditServiceIT extends IntegrationTestBase { +class AuditServiceIT extends IntegrationTestBase { @Autowired private AuditService auditService; @@ -108,7 +108,7 @@ private CaptureSession getCaptureSession() { @Transactional @Test - public void testInternalAudit() { + void testInternalAudit() { var court = getCreateCourt(); courtService.upsert(court); @@ -132,7 +132,7 @@ public void testInternalAudit() { @Transactional @Test - public void testDeleteAuditCase() { + void testDeleteAuditCase() { mockAdminUser(); var caseDTO = getCase(); @@ -158,7 +158,7 @@ public void testDeleteAuditCase() { @Transactional @Test - public void testDeleteAuditBooking() { + void testDeleteAuditBooking() { mockAdminUser(); var caseDTO = getCase(); @@ -187,7 +187,7 @@ public void testDeleteAuditBooking() { @Transactional @Test - public void testDeleteAuditCaptureSession() { + void testDeleteAuditCaptureSession() { mockAdminUser(); var booking = getBooking(); @@ -222,7 +222,7 @@ public void testDeleteAuditCaptureSession() { @Transactional @Test - public void testDeleteAuditRecording() { + void testDeleteAuditRecording() { mockAdminUser(); var captureSession = getCaptureSession(); @@ -243,7 +243,8 @@ public void testDeleteAuditRecording() { var auditResultsCreated = auditService.getAuditsByTableRecordId(recording.getId()); recordingService.deleteById(recording.getId()); - var auditResults = auditService.getAuditsByTableRecordId(recording.getId()); + var auditResults = auditService.getAuditsByTableRecordId(recording.getId()).stream() + .sorted(Comparator.comparing(Audit::getCreatedAt)).toList(); Assertions.assertEquals(0, auditResultsEmpty.size()); Assertions.assertEquals(1, auditResultsCreated.size()); Assertions.assertEquals(2, auditResults.size()); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java index 6326f7e740..902e1db8da 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/BookingServiceIT.java @@ -397,10 +397,10 @@ void testSearchByCaptureSessionStatus() { null, null).getContent(); assertThat(findEitherStandbyOrProcessing).hasSize(2); - assertThat(findEitherStandbyOrProcessing.stream().map(BookingDTO::getId).anyMatch(b -> b == booking1.getId())) - .isTrue(); - assertThat(findEitherStandbyOrProcessing.stream().map(BookingDTO::getId).anyMatch(b -> b == booking2.getId())) - .isTrue(); + assertThat(findEitherStandbyOrProcessing.stream().map(BookingDTO::getId) + .anyMatch(b -> b.equals(booking1.getId()))).isTrue(); + assertThat(findEitherStandbyOrProcessing.stream().map(BookingDTO::getId) + .anyMatch(b -> b.equals(booking2.getId()))).isTrue(); var findOnlyWithNoRecording = bookingService.searchBy(null, null, diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/CaseServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/CaseServiceIT.java index 22a02d5e22..21735fd539 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/CaseServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/CaseServiceIT.java @@ -38,13 +38,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; -public class CaseServiceIT extends IntegrationTestBase { +class CaseServiceIT extends IntegrationTestBase { @Autowired private CaseService caseService; @Transactional @Test - public void searchCasesAsAdmin() { + void searchCasesAsAdmin() { mockAdminUser(); var court = HelperFactory.createCourt(CourtType.CROWN, "Example Court", "1234"); @@ -77,7 +77,7 @@ public void searchCasesAsAdmin() { @Transactional @Test - public void searchCasesAsNonAdmin() { + void searchCasesAsNonAdmin() { mockNonAdminUser(); var court = HelperFactory.createCourt(CourtType.CROWN, "Example Court", "1234"); @@ -112,7 +112,7 @@ public void searchCasesAsNonAdmin() { @Transactional @Test - public void updateCaseParticipants() { + void updateCaseParticipants() { mockAdminUser(); var court = HelperFactory.createCourt(CourtType.CROWN, "Example Court", "1234"); @@ -167,7 +167,7 @@ public void updateCaseParticipants() { @Transactional @Test - public void testCascadeDelete() { + void testCascadeDelete() { mockAdminUser(); var court = HelperFactory.createCourt(CourtType.CROWN, "Example Court", "1234"); @@ -233,7 +233,7 @@ public void testCascadeDelete() { @Transactional @Test - public void undeleteCase() { + void undeleteCase() { mockAdminUser(); var court = HelperFactory.createCourt(CourtType.CROWN, "Example Court", "1234"); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/RecordingServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/RecordingServiceIT.java index 2a784c6233..2364e0825a 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/RecordingServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/RecordingServiceIT.java @@ -39,7 +39,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class RecordingServiceIT extends IntegrationTestBase { +class RecordingServiceIT extends IntegrationTestBase { @Autowired private RecordingService recordingService; diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/TermsAndConditionsServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/TermsAndConditionsServiceIT.java index e52be44b19..165be7dff6 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/TermsAndConditionsServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/TermsAndConditionsServiceIT.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TermsAndConditionsServiceIT extends IntegrationTestBase { +class TermsAndConditionsServiceIT extends IntegrationTestBase { @Autowired private TermsAndConditionsService termsAndConditionsService; @@ -32,7 +32,7 @@ public void setUp() { @Test @Transactional - public void getLatestTermsAndConditionsApp() { + void getLatestTermsAndConditionsApp() { var latestAppTerms1 = termsAndConditionsService.getLatestTermsAndConditions(TermsAndConditionsType.APP); assertThat(latestAppTerms1.getId()).isEqualTo(termsAndConditionsApp.getId()); @@ -47,7 +47,7 @@ public void getLatestTermsAndConditionsApp() { @Test @Transactional - public void getLatestTermsAndConditionsPortal() { + void getLatestTermsAndConditionsPortal() { var latestPortalTerms1 = termsAndConditionsService.getLatestTermsAndConditions(TermsAndConditionsType.PORTAL); assertThat(latestPortalTerms1.getId()).isEqualTo(termsAndConditionsPortal.getId()); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserAuthenticationServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserAuthenticationServiceIT.java index 73ceb46a52..9d0e84b6a1 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserAuthenticationServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserAuthenticationServiceIT.java @@ -22,7 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -public class UserAuthenticationServiceIT extends IntegrationTestBase { +class UserAuthenticationServiceIT extends IntegrationTestBase { @Autowired private UserAuthenticationService userAuthenticationService; @@ -68,7 +68,7 @@ void setUp() { @Transactional @Test - public void loadAppUserByIdSuccess() { + void loadAppUserByIdSuccess() { var userWithValidId = userAuthenticationService.loadAppUserById(appAccess.getId().toString()); assertEquals(userWithValidId.getUserId(), appAccess.getUser().getId()); assertEquals(userWithValidId.getAppAccess(), appAccess); @@ -80,7 +80,7 @@ public void loadAppUserByIdSuccess() { @Transactional @Test - public void loadPortalUserByIdSuccess() { + void loadPortalUserByIdSuccess() { var userWithValidId = userAuthenticationService.loadAppUserById(portalAccess.getId().toString()); assertEquals(userWithValidId.getUserId(), portalAccess.getUser().getId()); assertEquals(userWithValidId.getPortalAccess(), portalAccess); @@ -92,7 +92,7 @@ public void loadPortalUserByIdSuccess() { @Transactional @Test - public void loadUserByIdNotFound() { + void loadUserByIdNotFound() { var id = UUID.randomUUID(); var message = assertThrows( BadCredentialsException.class, @@ -104,7 +104,7 @@ public void loadUserByIdNotFound() { @Transactional @Test - public void loadUserByIdNull() { + void loadUserByIdNull() { var message = assertThrows( BadCredentialsException.class, () -> userAuthenticationService.loadAppUserById(null) @@ -116,7 +116,7 @@ public void loadUserByIdNull() { @Transactional @Test - public void loadUserByIdNotUuid() { + void loadUserByIdNotUuid() { var id = "1234567890"; var message = assertThrows( BadCredentialsException.class, @@ -128,7 +128,7 @@ public void loadUserByIdNotUuid() { @Transactional @Test - public void loadUserByIdEmpty() { + void loadUserByIdEmpty() { var id = ""; var message = assertThrows( BadCredentialsException.class, @@ -140,7 +140,7 @@ public void loadUserByIdEmpty() { @Test @Transactional - public void loadUserByIdAppInactive() { + void loadUserByIdAppInactive() { appAccess.setActive(false); entityManager.persist(appAccess); var id = appAccess.getId().toString(); @@ -155,7 +155,7 @@ public void loadUserByIdAppInactive() { @Test @Transactional - public void loadUserByIdAppDeleted() { + void loadUserByIdAppDeleted() { appAccess.setDeletedAt(Timestamp.from(Instant.now())); entityManager.persist(appAccess); var id = appAccess.getId().toString(); @@ -170,7 +170,7 @@ public void loadUserByIdAppDeleted() { @Test @Transactional - public void loadUserByIdAppUserDeleted() { + void loadUserByIdAppUserDeleted() { var user = appAccess.getUser(); user.setDeletedAt(Timestamp.from(Instant.now())); entityManager.persist(user); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserServiceIT.java index 0129ac3b31..9612f2c4b7 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserServiceIT.java @@ -24,7 +24,7 @@ import java.util.Comparator; import java.util.UUID; -public class UserServiceIT extends IntegrationTestBase { +class UserServiceIT extends IntegrationTestBase { private static User userEntity; private static User portalUserEntity; private static User appUserEntity; @@ -108,7 +108,7 @@ void setUp() { @Transactional @Test - public void searchUsersAsAdmin() { + void searchUsersAsAdmin() { mockAdminUser(); userEntity.setDeletedAt(Timestamp.from(Instant.now())); entityManager.persist(userEntity); @@ -155,7 +155,7 @@ public void searchUsersAsNonAdmin() { @Transactional @Test - public void testGetUserByAccessType() { + void testGetUserByAccessType() { var resultApp = userService.findAllBy( null, null, @@ -218,7 +218,7 @@ public void testGetUserByAccessType() { @Transactional @Test - public void deleteUndeleteUserSuccess() { + void deleteUndeleteUserSuccess() { userService.deleteById(userEntity.getId()); entityManager.flush(); entityManager.refresh(userEntity); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedServiceIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedServiceIT.java index 74c539adaa..2c8f1a0120 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedServiceIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedServiceIT.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.when; -public class UserTermsAcceptedServiceIT extends IntegrationTestBase { +class UserTermsAcceptedServiceIT extends IntegrationTestBase { @Autowired private UserTermsAcceptedService userTermsAcceptedService; @@ -48,7 +48,7 @@ void setUp() { @Test @Transactional - public void acceptTermsAndConditions() { + void acceptTermsAndConditions() { var mockedUser = mockAdminUser(); when(mockedUser.getUserId()).thenReturn(user.getId()); userTermsAcceptedService.acceptTermsAndConditions(termsAndConditions.getId()); diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsersIT.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsersIT.java index 2129e95585..f2c0baea8b 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsersIT.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsersIT.java @@ -34,7 +34,7 @@ @Slf4j @TestPropertySource(properties = "spring.cache.type=none") -public class AddNROUsersIT extends IntegrationTestBase { +class AddNROUsersIT extends IntegrationTestBase { @Autowired private AppAccessRepository appAccessRepository; @@ -95,7 +95,7 @@ void setUp() throws Exception { @DisplayName("Test NRO users listed in a CSV file are successfully uploaded to the DB") @Transactional @Test - public void testRunAddNROUsers() { + void testRunAddNROUsers() { // initialise & run the AddNROUsers test AddNROUsers addNROUsers = new AddNROUsers(userService, userAuthenticationService, @@ -204,7 +204,7 @@ public void testSettersAndToString() { @Transactional @Test - public void testInvalidCSVFile() { + void testInvalidCSVFile() { mockAdminUser(); String falseFileName = "falseFileName"; AddNROUsers addNROUsers = new AddNROUsers(userService, diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/utils/IntegrationTestBase.java b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/utils/IntegrationTestBase.java index 460c7a305a..a291145ef0 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/preapi/utils/IntegrationTestBase.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/preapi/utils/IntegrationTestBase.java @@ -17,6 +17,7 @@ import static org.mockito.Mockito.when; @SpringBootTest(classes = Application.class) +@SuppressWarnings("PMD.AbstractClassWithoutAbstractMethod") public abstract class IntegrationTestBase { @MockitoBean @@ -57,3 +58,4 @@ void tearDown() { } } } + diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/Application.java b/src/main/java/uk/gov/hmcts/reform/preapi/Application.java index 6e44b9ac48..63138bf9ce 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/Application.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/Application.java @@ -24,8 +24,8 @@ public class Application implements CommandLineRunner { ScheduledTaskRunner taskRunner; public static void main(final String[] args) { - final var application = new SpringApplication(Application.class); - final var instance = application.run(args); + final SpringApplication application = new SpringApplication(Application.class); + final var instance = application.run(args); //NOPMD - suppressed CloseResource if (System.getenv("TASK_NAME") != null) { instance.close(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/actuator/PreApiHealthIndicator.java b/src/main/java/uk/gov/hmcts/reform/preapi/actuator/PreApiHealthIndicator.java index c590e89ff0..d98cf85142 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/actuator/PreApiHealthIndicator.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/actuator/PreApiHealthIndicator.java @@ -8,6 +8,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.preapi.media.MediaKindAccountsClient; +import uk.gov.hmcts.reform.preapi.media.dto.MkStorageAccounts; import java.util.List; import java.util.Map; @@ -29,6 +30,8 @@ public class PreApiHealthIndicator implements HealthIndicator { public final MediaKindAccountsClient mediaKindAccountsClient; + private static final String MEDIA_KIND = "MediaKind"; + @Autowired public PreApiHealthIndicator(@Lazy MediaKindAccountsClient mediaKindAccountsClient) { this.mediaKindAccountsClient = mediaKindAccountsClient; @@ -36,11 +39,11 @@ public PreApiHealthIndicator(@Lazy MediaKindAccountsClient mediaKindAccountsClie @Override public Health health() { - if (!mediaService.equals("MediaKind")) { + if (!MEDIA_KIND.equals(mediaService)) { return Health.up().build(); } try { - var details = checkMediaKindConnections(); + Map details = checkMediaKindConnections(); return Health.up().withDetail("mediakindConnections", details).build(); } catch (Exception e) { log.error("Encountered an error when attempting to check MK storage account connections: {}", @@ -51,7 +54,7 @@ public Health health() { } private Map checkMediaKindConnections() { - var storageAccounts = mediaKindAccountsClient.getStorageAccounts(); + MkStorageAccounts storageAccounts = mediaKindAccountsClient.getStorageAccounts(); if (storageAccounts.getItems().isEmpty()) { log.error("MediaKind does not have any storage account connections"); return Map.of( @@ -60,7 +63,7 @@ private Map checkMediaKindConnections() { ); } - var expectedStorageAccounts = List.of(ingestStorageAccountName, finalStorageAccountName); + List expectedStorageAccounts = List.of(ingestStorageAccountName, finalStorageAccountName); return expectedStorageAccounts .stream() .map(storageAccount -> diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackClient.java b/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackClient.java index 4129db96d9..8794ef1370 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackClient.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackClient.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +@SuppressWarnings("PMD.ImplicitFunctionalInterface") @FeignClient(name = "slackClient", url = "${slack.webhook}") public interface SlackClient { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackMessage.java b/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackMessage.java index f9799fec0a..4e5bfbf7f7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackMessage.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/alerts/SlackMessage.java @@ -40,7 +40,7 @@ public String toJson(SlackMessageJsonOptions options) { boolean showEnvironment = options.showEnvironment(); boolean showIcons = options.showIcons(); - StringBuilder message = new StringBuilder(); + StringBuilder message = new StringBuilder(78); if (showEnvironment) { message.append(":globe_with_meridians: *Environment:* ") diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ArchiveMetadataXmlExtractor.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ArchiveMetadataXmlExtractor.java index d90a950d82..9ee1c5f553 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ArchiveMetadataXmlExtractor.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ArchiveMetadataXmlExtractor.java @@ -17,6 +17,7 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Optional; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; @@ -28,6 +29,7 @@ * It fetches XML files stored in Azure Blob Storage, parses them, and writes the extracted data into a CSV file. */ @Service +@SuppressWarnings("PMD.GodClass") public class ArchiveMetadataXmlExtractor { private final AzureVodafoneStorageService azureVodafoneStorageService; private final MigrationRecordService migrationRecordService; @@ -48,6 +50,7 @@ public ArchiveMetadataXmlExtractor(final AzureVodafoneStorageService azureVodafo * @param containerName The Azure Blob container name. * @param outputDir The directory where the CSV files will be written. */ + @SuppressWarnings("PMD.CognitiveComplexity") public void extractAndReportArchiveMetadata( String containerName, String folderPrefix, String outputDir, String filename) { try { @@ -69,14 +72,14 @@ public void extractAndReportArchiveMetadata( loggingService.logDebug("Generating archive metadata report in directory: %s", outputDir); allArchiveMetadata.sort((a, b) -> { - String nameA = a.get(1).toLowerCase(); - String nameB = b.get(1).toLowerCase(); + String nameA = a.get(1).toLowerCase(Locale.UK); + String nameB = b.get(1).toLowerCase(Locale.UK); String versionA = extractVersion(nameA); String versionB = extractVersion(nameB); - boolean aIsOrig = Constants.VALID_ORIG_TYPES.contains(versionA.toUpperCase()); - boolean bIsOrig = Constants.VALID_ORIG_TYPES.contains(versionB.toUpperCase()); + boolean aIsOrig = Constants.VALID_ORIG_TYPES.contains(versionA.toUpperCase(Locale.UK)); + boolean bIsOrig = Constants.VALID_ORIG_TYPES.contains(versionB.toUpperCase(Locale.UK)); if (aIsOrig && !bIsOrig) { return -1; @@ -237,6 +240,7 @@ private List> extractArchiveFileDetails(Document document, String b * @param duration Recording duration * @return List of metadata rows for MP4 files */ + @SuppressWarnings("PMD.CognitiveComplexity") private List> processMP4Files( Element archiveElement, String blobPrefix, @@ -278,12 +282,13 @@ private List> processMP4Files( return fileRows; } + @SuppressWarnings({"PMD.AvoidLiteralsInIfCondition", "PMD.CognitiveComplexity", "PMD.CyclomaticComplexity"}) private Element selectPreferredMp4File(NodeList mp4Files) { List files = new ArrayList<>(); for (int i = 0; i < mp4Files.getLength(); i++) { - Node n = mp4Files.item(i); - if (n.getNodeType() == Node.ELEMENT_NODE) { - files.add((Element) n); + Node node = mp4Files.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + files.add((Element) node); } } @@ -295,60 +300,60 @@ private Element selectPreferredMp4File(NodeList mp4Files) { } if (files.size() == 2) { - Element a = files.get(0); - Element b = files.get(1); + Element elementA = files.get(0); + Element elementB = files.get(1); - boolean aWatermarked = getBoolean(a, "watermark"); - boolean bWatermarked = getBoolean(b, "watermark"); + boolean aWatermarked = getBoolean(elementA, "watermark"); + boolean bWatermarked = getBoolean(elementB, "watermark"); // (1) Prefer watermark = true when only one has it if (aWatermarked ^ bWatermarked) { - return aWatermarked ? a : b; + return aWatermarked ? elementA : elementB; } // (2) If neither or both have watermark=true, prefer name starting with "UGC" when only one has it; - String nameA = getName(a).toUpperCase(); - String nameB = getName(b).toUpperCase(); + String nameA = getName(elementA).toUpperCase(Locale.UK); + String nameB = getName(elementB).toUpperCase(Locale.UK); boolean aUGC = nameA.contains("UGC"); boolean bUGC = nameB.contains("UGC"); if (aUGC && !bUGC) { - return a; + return elementA; } if (!aUGC && bUGC) { - return b; + return elementB; } // (3) Otherwise pick the largest mp4 file size - long aSize = getLong(a, "Size"); - long bSize = getLong(b, "Size"); + long aSize = getLong(elementA, "Size"); + long bSize = getLong(elementB, "Size"); if (aSize != bSize) { - return (aSize > bSize) ? a : b; + return (aSize > bSize) ? elementA : elementB; } // (4) Duration should be equal or within 1s (sanity check / log only) - long aDur = getLong(a, "Duration"); - long bDur = getLong(b, "Duration"); + long aDur = getLong(elementA, "Duration"); + long bDur = getLong(elementB, "Duration"); boolean aDurValid = aDur >= 0; boolean bDurValid = bDur >= 0; if (aDurValid && bDurValid && aDur != bDur) { - return (aDur > bDur) ? a : b; + return (aDur > bDur) ? elementA : elementB; } if (aDurValid != bDurValid) { - return aDurValid ? a : b; + return aDurValid ? elementA : elementB; } // (5) If duration ties (or both invalid), prefer longer filename int lenA = nameA != null ? nameA.length() : 0; int lenB = nameB != null ? nameB.length() : 0; if (lenA != lenB) { - return (lenA > lenB) ? a : b; + return (lenA > lenB) ? elementA : elementB; } // Fallback: pick the second file (as you had) - return b; + return elementB; } return files.get(0); @@ -399,7 +404,7 @@ private String extractVersion(String displayName) { return ""; } - String cleanName = displayName.toUpperCase() + String cleanName = displayName.toUpperCase(Locale.UK) .replaceAll("\\.(MP4|RAW|M4A|MOV|AVI)$", ""); String[] parts = cleanName.split("-"); @@ -416,26 +421,26 @@ private String extractVersion(String displayName) { return ""; } - //---------- helpers ---------- + //---------- helpers ---------- private String getName(Element el) { - String v = extractTextContent(el, "Name"); - return v == null ? "" : v.trim(); + String content = extractTextContent(el, "Name"); + return content == null ? "" : content.trim(); } private boolean getBoolean(Element el, String tag) { - String v = extractTextContent(el, tag); - if (v == null) { + String content = extractTextContent(el, tag); + if (content == null) { return false; } - v = v.trim().toLowerCase(); - return v.equals("true") || v.equals("1") || v.equals("yes"); + content = content.trim().toLowerCase(Locale.UK); + return content.equals("true") || content.equals("1") || content.equals("yes"); } private long getLong(Element el, String tag) { try { - String v = extractTextContent(el, tag); - return v == null ? 0L : Long.parseLong(v.trim()); + String content = extractTextContent(el, tag); + return content == null ? 0L : Long.parseLong(content.trim()); } catch (NumberFormatException e) { return 0L; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/Processor.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/Processor.java index 89dfee23a6..9661d80be7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/Processor.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/Processor.java @@ -90,6 +90,7 @@ public MigratedItemGroup process(Object item) throws Exception { } } + @SuppressWarnings("PMD.CognitiveComplexity") private MigratedItemGroup processRecording(MigrationRecord migrationRecord) { String archiveId = migrationRecord.getArchiveId(); String archiveName = migrationRecord.getArchiveName(); @@ -199,9 +200,7 @@ private ExtractedMetadata extractData(MigrationRecord migrationRecord) { return null; } - ExtractedMetadata extractedData = (ExtractedMetadata) extractionResult.getData(); - - return extractedData; + return (ExtractedMetadata) extractionResult.getData(); } private ProcessedRecording transformData(ExtractedMetadata extractedData) { @@ -210,7 +209,7 @@ private ProcessedRecording transformData(ExtractedMetadata extractedData) { loggingService.logError("Failed to transform archive: %s", extractedData.getSanitizedArchiveName()); return null; } - + loggingService.logDebug("Transformed data: %s", result.getData()); return result.getData(); } @@ -310,6 +309,7 @@ private ExtractedMetadata convertToExtractedMetadata(MigrationRecord migrationRe // ========================= // Notifications // ========================= + @SuppressWarnings("PMD.CognitiveComplexity") private void checkAndCreateNotifyItem(ProcessedRecording recording) { if (!recording.isPreferred()) { return; @@ -357,7 +357,7 @@ private void checkAndCreateNotifyItem(ProcessedRecording recording) { } - + } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessor.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessor.java index 6df91c22c9..a4977dcaa1 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessor.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessor.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationRecordingVersion; import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationStatus; import uk.gov.hmcts.reform.preapi.batch.application.services.MigrationRecordService; import uk.gov.hmcts.reform.preapi.batch.application.services.extraction.DataExtractionService; @@ -72,7 +73,7 @@ public void processRecording(MigrationRecord archiveItem) { extractedData.getDefendantLastName() ); - if ("COPY".equalsIgnoreCase(extractedData.getRecordingVersion())) { + if (VfMigrationRecordingVersion.COPY.toString().equalsIgnoreCase(extractedData.getRecordingVersion())) { migrationRecordService.updateParentTempIdIfCopy( archiveItem.getArchiveId(), groupKey, diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/MigrationRecordService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/MigrationRecordService.java index 96396661d9..40fe0e42dc 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/MigrationRecordService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/MigrationRecordService.java @@ -26,6 +26,7 @@ import java.sql.Timestamp; import java.util.Comparator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -33,12 +34,15 @@ @Slf4j @Service +@SuppressWarnings("PMD.TooManyMethods") public class MigrationRecordService { private final MigrationRecordRepository migrationRecordRepository; private final LoggingService loggingService; private final CourtRepository courtRepository; private final boolean dryRun; + private static final long EPOCH_THRESHOLD_SECONDS_TO_MILLIS = 100_000_000_000L; + @Autowired public MigrationRecordService(final MigrationRecordRepository migrationRecordRepository, final CourtRepository courtRepository, @@ -70,6 +74,7 @@ public List getPendingMigrationRecords() { } @Transactional + @SuppressWarnings("PMD.ExcessiveParameterList") public UpsertResult upsert(String archiveId, String archiveName, Timestamp createTime, @@ -136,14 +141,16 @@ public boolean insertPendingFromXml(String archiveId, Timestamp createTime = null; long epoch = Long.parseLong(createTimeEpoch); if (epoch > 0) { - if (epoch < 100_000_000_000L) { + if (epoch < EPOCH_THRESHOLD_SECONDS_TO_MILLIS) { epoch *= 1000; } createTime = new Timestamp(epoch); } - Integer parsedDuration; - parsedDuration = duration != null ? Integer.valueOf(duration) : null; + Integer parsedDuration = null; + if (duration != null) { + parsedDuration = Integer.valueOf(duration); + } upsert( archiveId, @@ -221,7 +228,7 @@ public void updateMetadataFields(String archiveId, ExtractedMetadata extracted) nullToEmpty(extracted.getExhibitReference()), nullToEmpty(extracted.getWitnessFirstName()), nullToEmpty(extracted.getDefendantLastName()) - ).toLowerCase().trim(); + ).toLowerCase(Locale.UK).trim(); record.setRecordingGroupKey(groupKey); migrationRecordRepository.save(record); @@ -292,7 +299,7 @@ public void updateParentTempIdIfCopy(String archiveId, String recordingGroupKey, Optional maybeOrig = migrationRecordRepository .findByRecordingGroupKey(recordingGroupKey) .stream() - .filter(r -> !r.getArchiveName().toLowerCase().endsWith(".raw")) + .filter(r -> !r.getArchiveName().toLowerCase(Locale.UK).endsWith(".raw")) .filter(r -> "ORIG".equalsIgnoreCase(r.getRecordingVersion())) .filter(MigrationRecord::getIsPreferred) .filter(r -> { @@ -300,8 +307,8 @@ public void updateParentTempIdIfCopy(String archiveId, String recordingGroupKey, return recVersion != null && recVersion.split("\\.")[0].equals(origVersionStr); }) .sorted((a, b) -> { - boolean aIsMp4 = a.getArchiveName().toLowerCase().endsWith(".mp4"); - boolean bIsMp4 = b.getArchiveName().toLowerCase().endsWith(".mp4"); + boolean aIsMp4 = a.getArchiveName().toLowerCase(Locale.UK).endsWith(".mp4"); + boolean bIsMp4 = b.getArchiveName().toLowerCase(Locale.UK).endsWith(".mp4"); if (aIsMp4 != bIsMp4) { return bIsMp4 ? 1 : -1; } @@ -374,12 +381,12 @@ public boolean markNonMp4AsNotPreferred(String archiveId) { boolean updated = false; boolean mp4Exists = matchingVersion.stream() - .anyMatch(r -> r.getArchiveName() != null && r.getArchiveName().toLowerCase().endsWith(".mp4")); + .anyMatch(r -> r.getArchiveName() != null && r.getArchiveName().toLowerCase(Locale.UK).endsWith(".mp4")); if (mp4Exists) { for (MigrationRecord r : matchingVersion) { - boolean isMp4 = r.getFileName() != null && r.getFileName().toLowerCase().endsWith(".mp4"); + boolean isMp4 = r.getFileName() != null && r.getFileName().toLowerCase(Locale.UK).endsWith(".mp4"); r.setIsPreferred(isMp4); migrationRecordRepository.save(r); updated = true; @@ -414,7 +421,7 @@ public static String generateRecordingGroupKey( nullToEmpty(exhibitRef), nullToEmpty(witnessName), nullToEmpty(defendantName)) - .toLowerCase() + .toLowerCase(Locale.UK) .trim(); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/DataExtractionService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/DataExtractionService.java index 0b6a8dadde..8a3daae3db 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/DataExtractionService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/DataExtractionService.java @@ -12,6 +12,9 @@ import uk.gov.hmcts.reform.preapi.batch.util.RegexPatterns; import uk.gov.hmcts.reform.preapi.batch.util.ServiceResultUtil; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; import java.util.regex.Matcher; import static uk.gov.hmcts.reform.preapi.batch.config.Constants.ErrorMessages.PATTERN_MATCH; @@ -41,24 +44,24 @@ public ServiceResult process(MigrationRecord archiveItem) { if (!preExistingValidation.isSuccess()) { return preExistingValidation; } - + // -- 1. TEST validation (validate for pre-go-live, duration check and test keywords) ServiceResult testValidationResult = validator.validateTest(archiveItem); loggingService.logDebug("Validation result in extraction %s", testValidationResult.isSuccess()); if (!testValidationResult.isSuccess()) { return testValidationResult; } - + ServiceResult testValidationExtensionResult = validator.validateRawFile(archiveItem); if (!testValidationExtensionResult.isSuccess()) { return testValidationExtensionResult; } - + String archiveName = archiveItem.getArchiveName(); // -- 2. Pattern matching for legitimate and test scenarios String sanitisedName = archiveItem.getSanitizedArchiveName(); - var patternMatch = patternMatcher.findMatchingPattern(sanitisedName); + Optional> patternMatch = patternMatcher.findMatchingPattern(sanitisedName); if (patternMatch.isEmpty()) { loggingService.logDebug("Extraction - No pattern matched: archiveName=%s", archiveName); return ServiceResultUtil.failure(PATTERN_MATCH, VfFailureReason.VALIDATION_FAILED.toString()); @@ -68,7 +71,7 @@ public ServiceResult process(MigrationRecord archiveItem) { if (RegexPatterns.TEST_PATTERNS.containsKey(patternMatch.get().getKey())) { loggingService.logInfo("Extraction - Test pattern match: %s", patternMatch.get().getKey()); - var testItem = new TestItem( + TestItem testItem = new TestItem( archiveItem, "Matched TEST regex pattern", false, @@ -82,7 +85,7 @@ public ServiceResult process(MigrationRecord archiveItem) { } Matcher matcher = patternMatch.get().getValue(); - var extractedData = extractMetaData(matcher, archiveItem); + ExtractedMetadata extractedData = extractMetaData(matcher, archiveItem); String archiveId = archiveItem.getArchiveId(); loggingService.logDebug("Extraction - Metadata extracted: " + extractedData); @@ -116,7 +119,7 @@ private ExtractedMetadata extractMetaData(Matcher matcher, MigrationRecord archi String versionNumber = getMatcherGroup(matcher, "versionNumber"); versionType = RecordingUtils.normalizeVersionType(versionType); - if (Constants.VALID_ORIG_TYPES.contains(versionType.toUpperCase()) + if (Constants.VALID_ORIG_TYPES.contains(versionType.toUpperCase(Locale.UK)) && (versionNumber == null || versionNumber.isEmpty())) { versionNumber = "1"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/MetadataValidator.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/MetadataValidator.java index 22c55f9eec..4ea56a32b4 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/MetadataValidator.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/extraction/MetadataValidator.java @@ -23,6 +23,7 @@ import static uk.gov.hmcts.reform.preapi.batch.config.Constants.ErrorMessages.TEST_ITEM_NAME; @Service +@SuppressWarnings("PMD.GodClass") public class MetadataValidator { private final LoggingService loggingService; @@ -32,7 +33,7 @@ public MetadataValidator(final LoggingService loggingService) { } public ServiceResult validatePreExisting(MigrationRecord archiveItem) { - String name = archiveItem.getArchiveName().toUpperCase(); + String name = archiveItem.getArchiveName().toUpperCase(Locale.UK); if (name.contains("-PRE-")) { return ServiceResultUtil.failure("Keyword 'PRE' found", VfFailureReason.PRE_EXISTING.toString()); } @@ -63,7 +64,7 @@ public ServiceResult validateExtension(String extension) { } public ServiceResult validateRawFile(MigrationRecord archiveItem) { - if (archiveItem.getArchiveName().toLowerCase().contains(".raw") + if (archiveItem.getArchiveName().toLowerCase().contains(".raw") || archiveItem.getArchiveName().toLowerCase().contains(".r")) { return ServiceResultUtil.failure(RAW_FILE, VfFailureReason.RAW_FILES.toString()); } @@ -120,7 +121,7 @@ private TestItem isTestRecording(MigrationRecord archiveItem) { } private boolean hasTestKeywords(MigrationRecord archiveItem) { - String lowerName = archiveItem.getSanitizedArchiveName().toLowerCase(); + String lowerName = archiveItem.getSanitizedArchiveName().toLowerCase(Locale.UK); for (String keyword : Constants.TEST_KEYWORDS) { if (lowerName.contains(keyword)) { return false; @@ -136,7 +137,7 @@ private String extractTestKeywords(String archiveName) { List foundKeywords = new ArrayList<>(); for (String keyword : Constants.TEST_KEYWORDS) { - if (archiveName.toLowerCase().contains(keyword.toLowerCase())) { + if (archiveName.toLowerCase(Locale.UK).contains(keyword.toLowerCase(Locale.UK))) { foundKeywords.add(keyword); } } @@ -181,7 +182,7 @@ public boolean isValidExtension(String ext) { return false; } - boolean isValid = Constants.VALID_EXTENSIONS.contains(ext.toLowerCase()); + boolean isValid = Constants.VALID_EXTENSIONS.contains(ext.toLowerCase(Locale.UK)); if (!isValid) { loggingService.logDebug("Invalid file extension: %s | Allowed extensions: %s", ext, Constants.VALID_EXTENSIONS); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java index 9f24b06860..5f898c3cee 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -36,6 +37,7 @@ @Service @RequiredArgsConstructor +@SuppressWarnings("PMD.CouplingBetweenObjects") public class EntityCreationService { private final LoggingService loggingService; private final InMemoryCacheService cacheService; @@ -57,7 +59,7 @@ public CreateCaseDTO createCase(ProcessedRecording cleansedData) { throw new IllegalArgumentException("Court information is missing"); } - var caseDTO = new CreateCaseDTO(); + CreateCaseDTO caseDTO = new CreateCaseDTO(); caseDTO.setId(UUID.randomUUID()); caseDTO.setCourtId(cleansedData.getCourt().getId()); caseDTO.setReference(cleansedData.getCaseReference()); @@ -120,12 +122,12 @@ public CreateCaptureSessionDTO createCaptureSession(ProcessedRecording cleansedD captureSessionId = UUID.randomUUID(); } - var captureSessionDTO = new CreateCaptureSessionDTO(); + CreateCaptureSessionDTO captureSessionDTO = new CreateCaptureSessionDTO(); captureSessionDTO.setId(captureSessionId); captureSessionDTO.setBookingId(booking.getId()); captureSessionDTO.setStartedAt(cleansedData.getRecordingTimestamp()); - var vodafoneUser = getUserByEmail(vodafoneUserEmail); + UUID vodafoneUser = getUserByEmail(vodafoneUserEmail); captureSessionDTO.setStartedByUserId(vodafoneUser); captureSessionDTO.setFinishedAt(cleansedData.getFinishedAt()); captureSessionDTO.setFinishedByUserId(vodafoneUser); @@ -143,7 +145,7 @@ public CreateRecordingDTO createRecording(ProcessedRecording cleansedData, Creat UUID parentRecordingId = null; if (isCopy) { - Optional currentRecordOpt = + Optional currentRecordOpt = migrationRecordService.findByArchiveId(cleansedData.getArchiveId()); if (currentRecordOpt.isPresent()) { @@ -167,7 +169,7 @@ public CreateRecordingDTO createRecording(ProcessedRecording cleansedData, Creat } } - var recordingDTO = new CreateRecordingDTO(); + CreateRecordingDTO recordingDTO = new CreateRecordingDTO(); UUID recordingId = UUID.randomUUID(); recordingDTO.setId(recordingId); recordingDTO.setCaptureSessionId(captureSession.getId()); @@ -186,15 +188,15 @@ public CreateRecordingDTO createRecording(ProcessedRecording cleansedData, Creat return recordingDTO; } - + public Set createParticipants(ProcessedRecording cleansedData) { Set participants = new HashSet<>(); - if (cleansedData.getWitnessFirstName() != null && !cleansedData.getWitnessFirstName().trim().isEmpty()) { + if (cleansedData.getWitnessFirstName() != null && !cleansedData.getWitnessFirstName().isBlank()) { participants.add(createParticipant(ParticipantType.WITNESS, cleansedData.getWitnessFirstName(), "")); } - if (cleansedData.getDefendantLastName() != null && !cleansedData.getDefendantLastName().trim().isEmpty()) { + if (cleansedData.getDefendantLastName() != null && !cleansedData.getDefendantLastName().isBlank()) { participants.add(createParticipant(ParticipantType.DEFENDANT, "", cleansedData.getDefendantLastName())); } @@ -202,7 +204,7 @@ public Set createParticipants(ProcessedRecording cleansedD } private CreateParticipantDTO createParticipant(ParticipantType type, String firstName, String lastName) { - var participantDTO = new CreateParticipantDTO(); + CreateParticipantDTO participantDTO = new CreateParticipantDTO(); participantDTO.setId(UUID.randomUUID()); participantDTO.setParticipantType(type); participantDTO.setFirstName(firstName != null ? firstName : Constants.DEFAULT_NAME); @@ -215,7 +217,7 @@ public CreateShareBookingDTO createShareBooking( CreateUserDTO sharedWith, CreateUserDTO sharedBy ) { - var shareBookingDTO = new CreateShareBookingDTO(); + CreateShareBookingDTO shareBookingDTO = new CreateShareBookingDTO(); shareBookingDTO.setId(UUID.randomUUID()); shareBookingDTO.setBookingId(bookingDTO.getId()); shareBookingDTO.setSharedByUser(sharedBy.getId()); @@ -250,7 +252,7 @@ public CreateUserDTO createUser(String firstName, String lastName, String email, } public CreateInviteDTO createInvite(CreateUserDTO user) { - var createInviteDTO = new CreateInviteDTO(); + CreateInviteDTO createInviteDTO = new CreateInviteDTO(); createInviteDTO.setEmail(user.getEmail()); createInviteDTO.setFirstName(user.getFirstName()); createInviteDTO.setUserId(user.getId()); @@ -264,7 +266,7 @@ public PostMigratedItemGroup createShareBookingAndInviteIfNotExists(BookingDTO b String firstName, String lastName) { loggingService.logInfo("Creating share booking and user for %s %s %s", email, firstName, lastName); - String lowerEmail = email.toLowerCase(); + String lowerEmail = email.toLowerCase(Locale.UK); List invites = new ArrayList<>(); @@ -293,7 +295,7 @@ public PostMigratedItemGroup createShareBookingAndInviteIfNotExists(BookingDTO b } String vodafoneID = cacheService.getHashValue(Constants.CacheKeys.USERS_PREFIX, - vodafoneUserEmail.toLowerCase(), + vodafoneUserEmail.toLowerCase(Locale.UK), String.class); CreateUserDTO sharedBy; @@ -333,14 +335,4 @@ public PostMigratedItemGroup createShareBookingAndInviteIfNotExists(BookingDTO b result.setShareBookings(shareBookings); return result; } - - private boolean isOrigRecordingPersisted(String archiveId) { - Optional maybeRecord = migrationRecordService.findByArchiveId(archiveId); - - if (maybeRecord.isPresent()) { - Optional maybeOrig = migrationRecordService.getOrigFromCopy(maybeRecord.get()); - return maybeOrig.isPresent() && maybeOrig.get().getRecordingId() != null; - } - return false; - } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationGroupBuilderService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationGroupBuilderService.java index 86a7f6b512..109172532f 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationGroupBuilderService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationGroupBuilderService.java @@ -16,6 +16,7 @@ import uk.gov.hmcts.reform.preapi.dto.CreateRecordingDTO; import java.util.HashSet; +import java.util.Locale; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -52,10 +53,10 @@ public MigrationGroupBuilderService(final LoggingService loggingService, // ========================= public MigratedItemGroup createMigratedItemGroup(ExtractedMetadata item, ProcessedRecording cleansedData) { CreateCaseDTO aCase = createCaseIfOrig(cleansedData); - + if (aCase == null) { String version = cleansedData.getExtractedRecordingVersion(); - if (version == null || !version.toUpperCase().contains("COPY")) { + if (version == null || !version.toUpperCase(Locale.UK).contains("COPY")) { loggingService.logError("Failed to find or create case for file: %s", cleansedData.getFileName()); return null; } @@ -92,7 +93,7 @@ public MigratedItemGroup createMigratedItemGroup(ExtractedMetadata item, Process protected CreateCaseDTO createCaseIfOrig(ProcessedRecording cleansedData) { String caseReference = cleansedData.getCaseReference(); - + if (isInvalidCaseReference(caseReference)) { loggingService.logDebug("Invalid case reference: '%s'", caseReference); return null; @@ -101,13 +102,13 @@ protected CreateCaseDTO createCaseIfOrig(ProcessedRecording cleansedData) { Optional existingCaseOpt = cacheService.getCase(caseReference); if (existingCaseOpt.isPresent()) { CreateCaseDTO existingCase = existingCaseOpt.get(); - loggingService.logDebug("Existing case ID: %s, Reference: %s", + loggingService.logDebug("Existing case ID: %s, Reference: %s", existingCase.getId(), existingCase.getReference()); return updateExistingCase(caseReference, cleansedData, existingCase); } loggingService.logDebug("Case not found in cache, creating new case for reference: '%s'", caseReference); - + return createNewCase(caseReference, cleansedData); } @@ -167,7 +168,7 @@ protected CreateCaseDTO createNewCase(String caseReference, ProcessedRecording c } private String normalizeName(String name) { - return name == null ? "" : name.trim().toLowerCase(); + return name == null ? "" : name.trim().toLowerCase(Locale.UK); } protected CreateBookingDTO processBooking(String baseKey, ProcessedRecording cleansedData, CreateCaseDTO aCase) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationTrackerService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationTrackerService.java index bdd7d3a346..03b054e09e 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationTrackerService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/MigrationTrackerService.java @@ -37,6 +37,7 @@ * and provides functionality to write these items to CSV files for reporting purposes. */ @Service +@SuppressWarnings({"PMD.CouplingBetweenObjects", "PMD.GodClass"}) public class MigrationTrackerService { @Value("${azure.vodafoneStorage.container}") private String reportContainer; @@ -154,7 +155,7 @@ public List writeCategorizedFailureReports(String outputDir) { try { Path path = ReportCsvWriter.writeToCsv(FAILED_ITEM_HEADERS, rows, fileName, outputDir, false); - if (path != null) { + if (path != null) { writtenFiles.add(path.toFile()); } else { loggingService.logError( diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/persistence/InMemoryCacheService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/persistence/InMemoryCacheService.java index 66b7308228..3fcd004316 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/persistence/InMemoryCacheService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/persistence/InMemoryCacheService.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -23,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap; @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class InMemoryCacheService { private final LoggingService loggingService; @@ -50,7 +52,7 @@ public Optional getCourt(String courtName) { } public Optional getCase(String caseRef) { - if (caseRef == null || caseRef.trim().isEmpty()) { + if (caseRef == null || caseRef.isBlank()) { loggingService.logDebug("Attempted to get case with null or empty reference"); return Optional.empty(); } @@ -63,13 +65,13 @@ public Optional getCase(String caseRef) { } else { loggingService.logInfo("Case not found in cache for reference: '%s'", normalizedRef); } - + return Optional.ofNullable(result); } public void saveCase(String caseRef, CreateCaseDTO caseDTO) { - if (caseRef == null || caseRef.trim().isEmpty()) { + if (caseRef == null || caseRef.isBlank()) { loggingService.logInfo("Case ref is null or empty: %s", caseRef); return; } @@ -77,9 +79,9 @@ public void saveCase(String caseRef, CreateCaseDTO caseDTO) { loggingService.logInfo("CaseDTO is null"); return; } - + String normalizedRef = normalizeCaseReference(caseRef); - loggingService.logInfo("Saving case to cache - Original: '%s', Normalized: '%s', Case ID: %s", + loggingService.logInfo("Saving case to cache - Original: '%s', Normalized: '%s', Case ID: %s", caseRef, normalizedRef, caseDTO.getId()); caseCache.put(normalizedRef, caseDTO); } @@ -89,7 +91,7 @@ private String normalizeCaseReference(String caseRef) { if (caseRef == null) { return null; } - return caseRef.trim().toUpperCase().replaceAll("\\s+", " "); + return caseRef.trim().toUpperCase(Locale.UK).replaceAll("\\s+", " "); } public void saveShareBooking(String cacheKey, CreateShareBookingDTO dto) { @@ -105,7 +107,7 @@ public void saveUser(String email, UUID userID) { loggingService.logWarning("Skipping saveUser: email or userID missing"); return; } - String lowerEmail = email.toLowerCase(); + String lowerEmail = email.toLowerCase(Locale.UK); userCache.put(lowerEmail, userID); saveHashValue(Constants.CacheKeys.USERS_PREFIX, lowerEmail, userID.toString()); } @@ -161,7 +163,7 @@ public String generateEntityCacheKey(String entityType, String... parts) { return String.format("vf:%s:%s", entityType, String.join("-", normalizeAll(parts))); } - private static List normalizeAll(String[] parts) { + private static List normalizeAll(String... parts) { return Arrays.stream(parts) .filter(Objects::nonNull) .map(String::toLowerCase) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/LoggingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/LoggingService.java index 9a76223e05..ca29d8d833 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/LoggingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/LoggingService.java @@ -7,9 +7,13 @@ import uk.gov.hmcts.reform.preapi.batch.entities.FailedItem; import uk.gov.hmcts.reform.preapi.batch.entities.TestItem; -import java.io.FileWriter; +import java.io.BufferedWriter; import java.io.IOException; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -19,24 +23,25 @@ @Slf4j @Service +@SuppressWarnings("PMD.AvoidSynchronizedAtMethodLevel") public class LoggingService { @Getter - private boolean debugEnabled = false; + private boolean debugEnabled; @Setter - private int totalMigrated = 0; + private int totalMigrated; @Setter - private int totalInvited = 0; + private int totalInvited; @Setter private int totalRecords; @Getter - private int processedRecords = 0; + private int processedRecords; @Getter - private int totalFailed = 0; + private int totalFailed; protected LocalDateTime startTime; protected final Map failedCategoryCounts = new HashMap<>(); @@ -47,10 +52,17 @@ public class LoggingService { public void initializeLogFile() { startTime = LocalDateTime.now(); - try (PrintWriter writer = new PrintWriter(new FileWriter(LOG_FILE_PATH, false))) { - writer.println("====================================================="); - writer.println(LocalDateTime.now().format(FORMATTER) + " | Vodafone ETL Job Started"); - writer.println("====================================================="); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(LOG_FILE_PATH), + StandardCharsets.UTF_8, + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING)) { + writer.write("====================================================="); + writer.newLine(); + writer.write(LocalDateTime.now().format(FORMATTER) + " | Vodafone ETL Job Started"); + writer.newLine(); + writer.write("====================================================="); + writer.newLine(); + } catch (IOException e) { log.error("Failed to initialize output.log: {}", e.getMessage()); } @@ -60,11 +72,14 @@ public synchronized void log(String level, String message) { String timestamp = LocalDateTime.now().format(FORMATTER); String logMessage = String.format("%s [%s] %s", timestamp, level, message); - try (FileWriter fileWriter = new FileWriter(LOG_FILE_PATH, true); - PrintWriter printWriter = new PrintWriter(fileWriter)) { + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(LOG_FILE_PATH), + StandardCharsets.UTF_8, + StandardOpenOption.CREATE, + StandardOpenOption.APPEND); + PrintWriter printWriter = new PrintWriter(writer)) { printWriter.println(logMessage); } catch (IOException e) { - log.error("Failed to initialize output.log: {}", e.getMessage()); + log.error("Failed to write to output.log: {}", e.getMessage()); } } @@ -125,9 +140,10 @@ public void incrementProgress() { refreshProgressBar(); } + @SuppressWarnings("PMD.SystemPrintln") private synchronized void refreshProgressBar() { int progressWidth = 40; - double percentage = Math.min((processedRecords * 100.0) / totalRecords, 100.0); + double percentage = Math.min(processedRecords * 100.0 / totalRecords, 100.0); int filledLength = Math.max((int) (progressWidth * (percentage / 100)), 0); String progressBar = "[" + "=".repeat(filledLength) + " ".repeat(progressWidth - filledLength) + "]"; @@ -154,7 +170,7 @@ public void logSummary() { startTime = LocalDateTime.now(); } - var endTime = LocalDateTime.now(); + LocalDateTime endTime = LocalDateTime.now(); Duration duration = Duration.between(startTime, endTime); long seconds = duration.getSeconds(); @@ -175,8 +191,12 @@ public void logSummary() { "Total Execution Time", seconds ); - try (FileWriter fileWriter = new FileWriter(LOG_FILE_PATH, true); - PrintWriter printWriter = new PrintWriter(fileWriter)) { + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(LOG_FILE_PATH), + StandardCharsets.UTF_8, + StandardOpenOption.CREATE, + StandardOpenOption.APPEND); + PrintWriter printWriter = new PrintWriter(writer)) { + printWriter.println(summary); } catch (IOException e) { log.error("Failed to write summary to output.log: {}", e.getMessage()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/ReportCsvWriter.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/ReportCsvWriter.java index e4bad3f94f..f7c76c636c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/ReportCsvWriter.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/reporting/ReportCsvWriter.java @@ -40,10 +40,10 @@ public static Path writeToCsv( if (dataRows == null) { throw new IllegalArgumentException("Data rows cannot be null"); } - if (fileNamePrefix == null || fileNamePrefix.trim().isEmpty()) { + if (fileNamePrefix == null || fileNamePrefix.isBlank()) { throw new IllegalArgumentException("File name prefix cannot be null or empty"); } - if (outputDir == null || outputDir.trim().isEmpty()) { + if (outputDir == null || outputDir.isBlank()) { throw new IllegalArgumentException("Output directory cannot be null or empty"); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/transformation/DataTransformationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/transformation/DataTransformationService.java index e0768d6b95..5693b91b30 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/transformation/DataTransformationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/transformation/DataTransformationService.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.preapi.batch.application.enums.VfFailureReason; +import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationRecordingVersion; import uk.gov.hmcts.reform.preapi.batch.application.services.MigrationRecordService; import uk.gov.hmcts.reform.preapi.batch.application.services.persistence.InMemoryCacheService; import uk.gov.hmcts.reform.preapi.batch.application.services.reporting.LoggingService; @@ -21,19 +22,20 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.UUID; @Service public class DataTransformationService { - private static final String UNKNOWN_COURT = "Unknown Court"; - private final InMemoryCacheService cacheService; private final MigrationRecordService migrationRecordService; private final CourtRepository courtRepository; private final LoggingService loggingService; + private static final String UNKNOWN_COURT = "Unknown Court"; + @Autowired public DataTransformationService(final InMemoryCacheService cacheService, final MigrationRecordService migrationRecordService, @@ -67,6 +69,7 @@ public ServiceResult transformData(ExtractedMetadata extract } } + @SuppressWarnings("PMD.CognitiveComplexity") protected ProcessedRecording buildProcessedRecording(ExtractedMetadata extracted, Map sitesDataMap) { @@ -82,7 +85,7 @@ protected ProcessedRecording buildProcessedRecording(ExtractedMetadata extracted String origVersionStr = "1"; String copyVersionStr = null; - if ("COPY".equals(versionType)) { + if (VfMigrationRecordingVersion.COPY.toString().equals(versionType)) { String baseGroupKey = MigrationRecordService.generateRecordingGroupKey( extracted.getUrn(), extracted.getExhibitReference(), @@ -114,7 +117,8 @@ protected ProcessedRecording buildProcessedRecording(ExtractedMetadata extracted } boolean isPreferred = true; - if (!extracted.getArchiveName().toLowerCase().endsWith(".mp4") && !"COPY".equalsIgnoreCase(versionType)) { + if (!extracted.getArchiveName().toLowerCase(Locale.UK).endsWith(".mp4") + && !"COPY".equalsIgnoreCase(versionType)) { boolean updated = migrationRecordService.markNonMp4AsNotPreferred(extracted.getArchiveId()); if (updated) { loggingService.logInfo("Skipping non-preferred archive: %s", extracted.getArchiveName()); @@ -233,11 +237,9 @@ protected List> buildShareBookingContacts(ExtractedMetadata for (String[] userInfo : usersAndEmails) { String[] nameParts = userInfo[0].split("\\."); - Map contact = new HashMap<>(); - contact.put("firstName", nameParts.length > 0 ? nameParts[0] : ""); - contact.put("lastName", nameParts.length > 1 ? nameParts[1] : ""); - contact.put("email", userInfo[1]); - contactsList.add(contact); + contactsList.add(createContact(nameParts.length > 0 ? nameParts[0] : "", + nameParts.length > 1 ? nameParts[1] : "", + userInfo[1])); } loggingService.logDebug( @@ -248,6 +250,16 @@ protected List> buildShareBookingContacts(ExtractedMetadata return contactsList; } + private static Map createContact(final String firstName, + final String lastName, + final String email) { + Map contact = new HashMap<>(); + contact.put("firstName", firstName); + contact.put("lastName", lastName); + contact.put("email", email); + return contact; + } + /** * Retrieves user email data for a given key. * diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/validation/DataValidationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/validation/DataValidationService.java index 30886f3610..01a1c860b7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/validation/DataValidationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/validation/DataValidationService.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.preapi.batch.application.enums.VfFailureReason; +import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationRecordingVersion; import uk.gov.hmcts.reform.preapi.batch.application.services.MigrationRecordService; import uk.gov.hmcts.reform.preapi.batch.application.services.reporting.LoggingService; import uk.gov.hmcts.reform.preapi.batch.config.Constants; @@ -20,6 +21,10 @@ public class DataValidationService { private final MigrationRecordRepository migrationRecordRepository; private final LoggingService loggingService; + private static int MIN_CASE_REFERENCE_LENGTH = 9; + private static int MAX_CASE_REFERENCE_LENGTH = 24; + private static int MIN_VERSION_NUMBER = 1; + @Autowired public DataValidationService(final MigrationRecordService migrationRecordService, final MigrationRecordRepository migrationRecordRepository, @@ -37,13 +42,13 @@ public DataValidationService(final MigrationRecordService migrationRecordService public ServiceResult validateProcessedRecording( ProcessedRecording cleansedData) { - + if (cleansedData.getCourt() == null) { return ServiceResultUtil.failure(Constants.ErrorMessages.MISSING_COURT, VfFailureReason.INCOMPLETE_DATA.toString()); } - if ("COPY".equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { + if (VfMigrationRecordingVersion.COPY.toString().equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { Optional currentRecord = migrationRecordService.findByArchiveId( cleansedData.getArchiveId()); @@ -55,11 +60,11 @@ public ServiceResult validateProcessedRecording( } } - if ("COPY".equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { + if (VfMigrationRecordingVersion.COPY.toString().equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { boolean isMostRecent = migrationRecordRepository .getIsMostRecent(cleansedData.getArchiveId()) .orElse(false); - + if (!isMostRecent) { return ServiceResultUtil.failure( Constants.ErrorMessages.NOT_MOST_RECENT_VERSION, @@ -68,17 +73,15 @@ public ServiceResult validateProcessedRecording( } } - - String caseReference = cleansedData.getCaseReference(); - if (caseReference == null || caseReference.length() < 9) { + if (caseReference == null || caseReference.length() < MIN_CASE_REFERENCE_LENGTH) { return ServiceResultUtil.failure( Constants.ErrorMessages.CASE_REFERENCE_TOO_SHORT, VfFailureReason.INCOMPLETE_DATA.toString() ); } - if (caseReference.length() > 24) { + if (caseReference.length() > MAX_CASE_REFERENCE_LENGTH) { return ServiceResultUtil.failure( Constants.ErrorMessages.CASE_REFERENCE_TOO_LONG, VfFailureReason.INCOMPLETE_DATA.toString() @@ -92,8 +95,6 @@ public ServiceResult validateProcessedRecording( ); } - - return ServiceResultUtil.success(cleansedData); } @@ -107,7 +108,7 @@ public ServiceResult validateResolvedRecording( } - if ("COPY".equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { + if (VfMigrationRecordingVersion.COPY.toString().equalsIgnoreCase(cleansedData.getExtractedRecordingVersion())) { boolean isMostRecent = migrationRecordRepository .findByArchiveId(cleansedData.getArchiveId()) .map(mr -> Boolean.TRUE.equals(mr.getIsMostRecent())) @@ -122,29 +123,29 @@ public ServiceResult validateResolvedRecording( } String caseReference = cleansedData.getCaseReference(); - if (caseReference == null || caseReference.length() < 9) { + if (caseReference == null || caseReference.length() < MIN_CASE_REFERENCE_LENGTH) { return ServiceResultUtil.failure(Constants.ErrorMessages.CASE_REFERENCE_TOO_SHORT, VfFailureReason.INCOMPLETE_DATA.toString()); } - if (caseReference.length() > 24) { + if (caseReference.length() > MAX_CASE_REFERENCE_LENGTH) { return ServiceResultUtil.failure(Constants.ErrorMessages.CASE_REFERENCE_TOO_LONG, VfFailureReason.INCOMPLETE_DATA.toString()); } String witness = cleansedData.getWitnessFirstName(); - if (witness == null || witness.trim().isEmpty()) { + if (witness == null || witness.isBlank()) { return ServiceResultUtil.failure("Missing or empty witness first name", VfFailureReason.INCOMPLETE_DATA.toString()); } String defendant = cleansedData.getDefendantLastName(); - if (defendant == null || defendant.trim().isEmpty()) { + if (defendant == null || defendant.isBlank()) { return ServiceResultUtil.failure("Missing or empty defendant last name", VfFailureReason.INCOMPLETE_DATA.toString()); } - if (cleansedData.getRecordingVersionNumber() < 1) { + if (cleansedData.getRecordingVersionNumber() < MIN_VERSION_NUMBER) { return ServiceResultUtil.failure("Invalid recording version number", VfFailureReason.INCOMPLETE_DATA.toString()); } @@ -155,5 +156,4 @@ public ServiceResult validateResolvedRecording( return ServiceResultUtil.success(cleansedData); } - } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/MigrationWriter.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/MigrationWriter.java index 687ae270d4..60ebead16d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/MigrationWriter.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/MigrationWriter.java @@ -4,6 +4,7 @@ import org.springframework.batch.item.Chunk; import org.springframework.batch.item.ItemWriter; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; @@ -26,6 +27,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -33,6 +35,7 @@ import java.util.stream.Collectors; @Component +@SuppressWarnings("PMD.CouplingBetweenObjects") @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = Exception.class) public class MigrationWriter implements ItemWriter { private final LoggingService loggingService; @@ -149,17 +152,17 @@ private CaseDTO processCaseData(CreateCaseDTO caseData) { Map union = new HashMap<>(); if (persisted.getParticipants() != null) { for (ParticipantDTO p : persisted.getParticipants()) { - union.put(p.getParticipantType() + "|" + normalize(p.getFirstName()) + union.put(p.getParticipantType() + "|" + normalize(p.getFirstName()) + "|" + normalize(p.getLastName()), toCreate(p)); } } if (caseData.getParticipants() != null) { - for (var p : caseData.getParticipants()) { + for (CreateParticipantDTO p : caseData.getParticipants()) { union.putIfAbsent(participantKey(p), p); } } - var patch = new CreateCaseDTO(); + CreateCaseDTO patch = new CreateCaseDTO(); patch.setId(persisted.getId()); patch.setCourtId(persisted.getCourt().getId()); patch.setReference(persisted.getReference()); @@ -240,15 +243,15 @@ private void remapBookingParticipantsToPersisted(CreateBookingDTO booking, CaseD Map persistedMap = new HashMap<>(); if (persistedCase.getParticipants() != null) { for (ParticipantDTO p : persistedCase.getParticipants()) { - String key = p.getParticipantType() + "|" + normalize(p.getFirstName()) + String key = p.getParticipantType() + "|" + normalize(p.getFirstName()) + "|" + normalize(p.getLastName()); persistedMap.put(key, p); } } - + Map clientMap = new HashMap<>(); - for (var p : booking.getParticipants()) { + for (CreateParticipantDTO p : booking.getParticipants()) { clientMap.put(participantKey(p), p); } @@ -257,46 +260,50 @@ private void remapBookingParticipantsToPersisted(CreateBookingDTO booking, CaseD String key = participantKey(p); ParticipantDTO match = persistedMap.get(key); if (match != null) { - var cp = new CreateParticipantDTO(); - cp.setId(match.getId()); + CreateParticipantDTO cp = new CreateParticipantDTO(); + cp.setId(match.getId()); cp.setParticipantType(match.getParticipantType()); cp.setFirstName(match.getFirstName()); cp.setLastName(match.getLastName()); return cp; } - var client = clientMap.get(key); + CreateParticipantDTO client = clientMap.get(key); if (client != null) { return client; - } + } loggingService.logWarning("Booking participant not in persisted case, skipping: %s", key); return null; }) .filter(Objects::nonNull) - .collect(java.util.stream.Collectors.toSet()); + .collect(Collectors.toSet()); booking.setParticipants(remapped); } - private static String normalize(String s) { - return s == null ? "" : s.trim().toLowerCase(); + private static String normalize(String str) { + return str == null ? "" : str.trim().toLowerCase(Locale.UK); } - private static String participantKey(CreateParticipantDTO p) { - return p.getParticipantType() + "|" + normalize(p.getFirstName()) + "|" + normalize(p.getLastName()); + private static String participantKey(CreateParticipantDTO participant) { + return participant.getParticipantType() + + "|" + + normalize(participant.getFirstName()) + + "|" + + normalize(participant.getLastName()); } - private static CreateParticipantDTO toCreate(ParticipantDTO p) { - var participantDTO = new CreateParticipantDTO(); - participantDTO.setId(p.getId()); - participantDTO.setParticipantType(p.getParticipantType()); - participantDTO.setFirstName(p.getFirstName()); - participantDTO.setLastName(p.getLastName()); + private static CreateParticipantDTO toCreate(ParticipantDTO participant) { + CreateParticipantDTO participantDTO = new CreateParticipantDTO(); + participantDTO.setId(participant.getId()); + participantDTO.setParticipantType(participant.getParticipantType()); + participantDTO.setFirstName(participant.getFirstName()); + participantDTO.setLastName(participant.getLastName()); return participantDTO; } private CaseDTO fetchByRefAndCourt(String reference, java.util.UUID courtId) { - var page = caseService.searchBy(reference, courtId, false, PageRequest.of(0, 1)); + Page page = caseService.searchBy(reference, courtId, false, PageRequest.of(0, 1)); return page.hasContent() ? page.getContent().get(0) : null; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/PostMigrationWriter.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/PostMigrationWriter.java index b36a53b3a2..0c798d8284 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/PostMigrationWriter.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/writer/PostMigrationWriter.java @@ -28,6 +28,7 @@ public PostMigrationWriter(final InviteService inviteService, } @Override + @SuppressWarnings("PMD.CognitiveComplexity") public void write(Chunk items) { loggingService.logInfo("PostMigrationWriter triggered with %d item(s)", items.size()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/BatchConfiguration.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/BatchConfiguration.java index 2d3f0fc16b..799c57ba5d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/BatchConfiguration.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/BatchConfiguration.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.preapi.services.CaseService; import uk.gov.hmcts.reform.preapi.tasks.BatchRobotUserTask; +import java.util.List; @Configuration @EnableBatchProcessing @@ -53,6 +54,7 @@ public class BatchConfiguration implements StepExecutionListener { public LoggingService loggingService; @Autowired + @SuppressWarnings("PMD.ExcessiveParameterList") public BatchConfiguration(final JobRepository jobRepository, final PlatformTransactionManager transactionManager, final PreProcessor preProcessor, @@ -97,7 +99,7 @@ public Step createPreProcessMetadataStep() { return new StepBuilder("preProcessMetadataStep", jobRepository) .tasklet( (contribution, chunkContext) -> { - var pendingRecords = migrationRecordService.getPendingMigrationRecords(); + List pendingRecords = migrationRecordService.getPendingMigrationRecords(); if (pendingRecords.isEmpty()) { loggingService.logInfo("No pending migration records to pre-process."); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/FetchDataJobConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/FetchDataJobConfig.java index 47fd75b911..84f9095507 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/FetchDataJobConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/FetchDataJobConfig.java @@ -19,6 +19,8 @@ import uk.gov.hmcts.reform.preapi.batch.config.steps.CoreStepsConfig; import uk.gov.hmcts.reform.preapi.batch.entities.CSVArchiveListData; +import java.util.Map; + @Configuration public class FetchDataJobConfig { private final JobRepository jobRepository; @@ -34,7 +36,8 @@ public class FetchDataJobConfig { public static final String XML_PREFIX = ""; public static final String CONTAINER_NAME = "prod-migration-1"; public static final String FULL_PATH = "src/main/resources/batch"; - + private static final String CSV = "csv"; + public FetchDataJobConfig(final JobRepository jobRepository, final PlatformTransactionManager transactionManager, final CoreStepsConfig coreSteps, @@ -62,14 +65,14 @@ public Job fetchDataJob() { public Step createXmlFetchStep() { return new StepBuilder("fetchAndConvertXmlFileStep", jobRepository) .tasklet((contribution, chunkContext) -> { - var jobParams = chunkContext.getStepContext().getJobParameters(); + Map jobParams = chunkContext.getStepContext().getJobParameters(); String outputFileName = "Archive_List_initial"; String sourceType = (String) jobParams.getOrDefault("sourceType", "xml"); - if ("csv".equalsIgnoreCase(sourceType)) { + if (CSV.equalsIgnoreCase(sourceType)) { loggingService.logInfo( "FetchDataJob - Skipping XML fetch. Using pre-generated CSV file: %s.csv%n", outputFileName); - var resource = new FileSystemResource(FULL_PATH + "/" + outputFileName + ".csv"); + FileSystemResource resource = new FileSystemResource(FULL_PATH + "/" + outputFileName + ".csv"); FlatFileItemReader reader = CSVReader.createReader( resource, @@ -79,9 +82,8 @@ public Step createXmlFetchStep() { reader.open(chunkContext.getStepContext().getStepExecution().getExecutionContext()); - CSVArchiveListData record; int count = 0; - while ((record = reader.read()) != null) { + for (CSVArchiveListData record = reader.read(); record != null; record = reader.read()) { migrationRecordService.insertPending(record); count++; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/PostMigrationJobConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/PostMigrationJobConfig.java index 0b037c6e5a..08d98dcb67 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/PostMigrationJobConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/PostMigrationJobConfig.java @@ -23,6 +23,7 @@ import uk.gov.hmcts.reform.preapi.dto.BookingDTO; import uk.gov.hmcts.reform.preapi.dto.CaseDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCaseDTO; +import uk.gov.hmcts.reform.preapi.dto.CreateInviteDTO; import uk.gov.hmcts.reform.preapi.dto.CreateParticipantDTO; import uk.gov.hmcts.reform.preapi.dto.ParticipantDTO; import uk.gov.hmcts.reform.preapi.enums.CaseState; @@ -34,6 +35,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -41,6 +43,7 @@ import java.util.stream.Collectors; @Configuration +@SuppressWarnings("PMD.CouplingBetweenObjects") public class PostMigrationJobConfig { public final PlatformTransactionManager transactionManager; private final JobRepository jobRepository; @@ -126,6 +129,7 @@ public Step createMarkCasesClosedStep() { } @Bean + @SuppressWarnings("PMD.CognitiveComplexity") public Step createShareBookingsStep(PostMigrationWriter postMigrationWriter) { return new StepBuilder("createShareBookingsStep", jobRepository) .tasklet((contribution, chunkContext) -> { @@ -146,10 +150,10 @@ public Step createShareBookingsStep(PostMigrationWriter postMigrationWriter) { List matchedUsers = channelUsersMap.entrySet().stream() .filter(entry -> entry.getKey().contains(caseDTO.getReference()) && caseDTO.getParticipants().stream().anyMatch(p -> - entry.getKey().toLowerCase().contains(Optional.ofNullable(p.getFirstName()) - .orElse("").toLowerCase()) - || entry.getKey().toLowerCase().contains(Optional.ofNullable(p.getLastName()) - .orElse("").toLowerCase()) + entry.getKey().toLowerCase(Locale.UK).contains(Optional.ofNullable(p.getFirstName()) + .orElse("").toLowerCase(Locale.UK)) + || entry.getKey().toLowerCase(Locale.UK).contains(Optional.ofNullable(p.getLastName()) + .orElse("").toLowerCase(Locale.UK)) ) ) .flatMap(entry -> entry.getValue().stream()) @@ -168,7 +172,7 @@ public Step createShareBookingsStep(PostMigrationWriter postMigrationWriter) { } for (BookingDTO booking : bookings) { - var participants = booking.getParticipants(); + List participants = booking.getParticipants(); participants.forEach(participant -> loggingService.logDebug( "Booking participant: %s , first name: %s, last name: %s", participant.getParticipantType(), participant.getFirstName(), participant.getLastName())); @@ -185,12 +189,12 @@ public Step createShareBookingsStep(PostMigrationWriter postMigrationWriter) { loggingService.logInfo("[DRY RUN] Would invite and share booking with %s", email); continue; } - var result = entityCreationService.createShareBookingAndInviteIfNotExists( + PostMigratedItemGroup result = entityCreationService.createShareBookingAndInviteIfNotExists( booking, email, firstName, lastName); if (result != null) { migratedItems.add(result); if (result.getInvites() != null) { - for (var invite : result.getInvites()) { + for (CreateInviteDTO invite : result.getInvites()) { migrationTrackerService.addInvitedUser(invite); } } @@ -242,7 +246,7 @@ private void processCase(CaseDTO caseDTO, Map> channelUse private boolean hasMatchingChannelUser(String reference, Map> channelUsersMap) { return channelUsersMap.keySet().stream() - .anyMatch(k -> k.toLowerCase().contains(reference.toLowerCase())); + .anyMatch(k -> k.toLowerCase(Locale.UK).contains(reference.toLowerCase(Locale.UK))); } private CreateCaseDTO buildClosedCaseDTO(CaseDTO caseDTO) { @@ -267,13 +271,12 @@ private CreateCaseDTO buildClosedCaseDTO(CaseDTO caseDTO) { return dto; } - private CreateParticipantDTO mapParticipant(ParticipantDTO p) { + private CreateParticipantDTO mapParticipant(ParticipantDTO participant) { CreateParticipantDTO dto = new CreateParticipantDTO(); - dto.setId(p.getId()); - dto.setFirstName(p.getFirstName()); - dto.setLastName(p.getLastName()); - dto.setParticipantType(p.getParticipantType()); + dto.setId(participant.getId()); + dto.setFirstName(participant.getFirstName()); + dto.setLastName(participant.getLastName()); + dto.setParticipantType(participant.getParticipantType()); return dto; } - } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfig.java index c04d49e41c..8796e4daba 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfig.java @@ -79,7 +79,7 @@ public Step pendingMigrationRecordStep(ListItemReader pendingMi .chunk(BatchConfiguration.CHUNK_SIZE, transactionManager) .reader(pendingMigrationRecordReader) .processor(processor) - .writer(coreSteps.getDryRunFlag() ? coreSteps.noOpWriter() : writer) + .writer(coreSteps.isDryRun() ? coreSteps.noOpWriter() : writer) .faultTolerant() .skipLimit(BatchConfiguration.SKIP_LIMIT) .skip(Exception.class) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfig.java index e89f6676e6..bf1a27ea01 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfig.java @@ -62,7 +62,7 @@ public Step resolvedMigrationRecordStep(ListItemReader resolved .chunk(BatchConfiguration.CHUNK_SIZE, transactionManager) .reader(resolvedMigrationRecordReader) .processor(processor) - .writer(coreSteps.getDryRunFlag() ? coreSteps.noOpWriter() : writer) + .writer(coreSteps.isDryRun() ? coreSteps.noOpWriter() : writer) .faultTolerant() .skipLimit(BatchConfiguration.SKIP_LIMIT) .skip(Exception.class) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfig.java index aa46d986bb..032cc7666a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfig.java @@ -73,7 +73,7 @@ public Step createChannelUserStep() { new String[]{"channel_name", "channel_user", "channel_user_email"}, CSVChannelData.class, false, - getDryRunFlag() + isDryRun() ); } @@ -103,7 +103,7 @@ public Step createReadStep(String stepName, boolean writeToCsv, boolean dryRun) { FlatFileItemReader reader = createCsvReader(filePath, fieldNames, targetClass); - + ItemWriter writer; if (dryRun) { writer = chunk -> { @@ -142,7 +142,7 @@ public ItemWriter noOpWriter() { return items -> { /* no-op writer does nothing */ }; } - public boolean getDryRunFlag() { + public boolean isDryRun() { return Optional.ofNullable(JobSynchronizationManager.getContext()) .map(ctx -> ctx.getJobParameters().get("dryRun")) .map(Object::toString) @@ -159,7 +159,7 @@ public Step createArchiveListStep() { new String[]{"archive_id", "archive_name", "create_time", "duration", "file_name", "file_size"}, CSVArchiveListData.class, true, - getDryRunFlag() + isDryRun() ); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVArchiveListData.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVArchiveListData.java index d983ef2fea..95b5d620e0 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVArchiveListData.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVArchiveListData.java @@ -29,13 +29,13 @@ public class CSVArchiveListData implements IArchiveData { "yyyy-MM-dd HH:mm:ss" ); - private String archiveId = ""; - private String archiveName = ""; + private String archiveId; + private String archiveName; private String sanitizedArchiveName = ""; - private String createTime = ""; - private Integer duration = 0; - private String fileName = ""; - private String fileSize = ""; + private String createTime; + private Integer duration; + private String fileName; + private String fileSize; public CSVArchiveListData(String archiveId, String archiveName, @@ -91,6 +91,7 @@ public String getArchiveNameNoExt() { return (lastDotIndex == -1) ? archiveName : archiveName.substring(0, lastDotIndex); } + @Override public LocalDateTime getCreateTimeAsLocalDateTime() { return getParsedCreateTime(); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVExemptionListData.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVExemptionListData.java index 86666c9c99..56500b63c2 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVExemptionListData.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/CSVExemptionListData.java @@ -28,7 +28,7 @@ public class CSVExemptionListData implements IArchiveData { "d-M-yyyy HH:mm", "d-M-yyyy H:mm", "yyyy-MM-dd HH:mm:ss" ); - + private String archiveId; private String archiveName; private String createTime; @@ -46,6 +46,7 @@ public class CSVExemptionListData implements IArchiveData { private String reason; private String addedBy; + @Override public LocalDateTime getCreateTimeAsLocalDateTime() { if (createTime == null || createTime.isEmpty()) { return null; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ExtractedMetadata.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ExtractedMetadata.java index 5fecf8a624..7431d6f838 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ExtractedMetadata.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ExtractedMetadata.java @@ -8,6 +8,7 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.Arrays; +import java.util.Locale; import java.util.UUID; import java.util.stream.Collectors; @@ -32,6 +33,10 @@ public class ExtractedMetadata implements IArchiveData { private String archiveName; private String sanitizedArchiveName = ""; + private static final int MIN_LEN_EXCLUSIVE = 9; + private static final int MAX_LEN_EXCLUSIVE = 20; + + @SuppressWarnings("PMD.ExcessiveParameterList") public ExtractedMetadata(String courtReference, UUID courtId, String urn, @@ -49,10 +54,14 @@ public ExtractedMetadata(String courtReference, String archiveName) { this.courtReference = courtReference; this.courtId = courtId; - this.urn = urn != null ? urn.toUpperCase() : null; - this.exhibitReference = exhibitReference != null ? exhibitReference.toUpperCase() : null; - this.defendantLastName = formatName(defendantLastName != null ? defendantLastName.toLowerCase() : ""); - this.witnessFirstName = formatName(witnessFirstName != null ? witnessFirstName.toLowerCase() : ""); + if (urn != null) { + this.urn = urn.toUpperCase(Locale.UK); + } + if (exhibitReference != null) { + this.exhibitReference = exhibitReference.toUpperCase(Locale.UK); + } + this.defendantLastName = formatName(defendantLastName != null ? defendantLastName.toLowerCase(Locale.UK) : ""); + this.witnessFirstName = formatName(witnessFirstName != null ? witnessFirstName.toLowerCase(Locale.UK) : ""); this.recordingVersion = recordingVersion; this.recordingVersionNumber = recordingVersionNumber; this.fileExtension = fileExtension; @@ -74,7 +83,7 @@ private String formatName(String name) { if (part.matches("[-'\\s]")) { return part; } else { - return StringUtils.capitalize(part.toLowerCase()); + return StringUtils.capitalize(part.toLowerCase(Locale.UK)); } }) .collect(Collectors.joining("")); @@ -101,7 +110,7 @@ public String createCaseReference() { } else if (exhibitValid) { return exhibitTrimmed; } - + return ""; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/MigrationRecord.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/MigrationRecord.java index 17ad50641f..2ae13a688d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/MigrationRecord.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/MigrationRecord.java @@ -19,6 +19,7 @@ import java.sql.Timestamp; import java.time.LocalDateTime; import java.util.HashMap; +import java.util.Map; import java.util.UUID; @Getter @@ -119,8 +120,8 @@ public LocalDateTime getCreateTimeAsLocalDateTime() { } @Override - public HashMap getDetailsForAudit() { - HashMap details = new HashMap<>(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("archiveId", archiveId); details.put("status", status); details.put("archiveName", archiveName); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ServiceResult.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ServiceResult.java index de9265366f..59814d732b 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ServiceResult.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/ServiceResult.java @@ -39,15 +39,15 @@ public void setData(T data) { this.test = false; } - public static ServiceResult success(T data) { + public static ServiceResult createSuccessResult(T data) { return new ServiceResult<>(data); } - public static ServiceResult error(String message, String category) { + public static ServiceResult createErrorResult(String message, String category) { return new ServiceResult<>(message, category); } - public static ServiceResult test(TestItem testItem) { + public static ServiceResult createTestResult(TestItem testItem) { return new ServiceResult<>(testItem, true); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/TestItem.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/TestItem.java index 01ab2efe2a..6dfeca7472 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/TestItem.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/entities/TestItem.java @@ -7,6 +7,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor +@SuppressWarnings("PMD.TestClassWithoutTestCases") public class TestItem { private MigrationRecord archiveItem; private String reason; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RecordingUtils.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RecordingUtils.java index f43334630b..3c5483ff11 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RecordingUtils.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RecordingUtils.java @@ -4,6 +4,7 @@ import uk.gov.hmcts.reform.preapi.batch.config.Constants; import java.util.HashSet; +import java.util.Locale; import java.util.Set; @UtilityClass @@ -20,7 +21,7 @@ public static String normalizeVersionType(String input) { return "ORIG"; } - String upper = input.trim().toUpperCase(); + String upper = input.trim().toUpperCase(Locale.UK); if (Constants.VALID_ORIG_TYPES.contains(upper)) { return "ORIG"; } @@ -31,23 +32,19 @@ public static String normalizeVersionType(String input) { } public int getStandardizedVersionNumberFromType(String recordingVersion) { - return Constants.VALID_ORIG_TYPES.contains(recordingVersion.toUpperCase()) ? 1 : 2; + return Constants.VALID_ORIG_TYPES.contains(recordingVersion.toUpperCase(Locale.UK)) ? 1 : 2; } public String getValidVersionNumber(String versionNumStr) { - return (versionNumStr == null || versionNumStr.trim().isEmpty()) ? "1" : versionNumStr.trim(); + return (versionNumStr == null || versionNumStr.isBlank()) ? "1" : versionNumStr.trim(); } - public int compareVersionStrings(String v1, String v2) { - if (v1 == null || v1.isBlank()) { - v1 = "0"; - } - if (v2 == null || v2.isBlank()) { - v2 = "0"; - } + public int compareVersionStrings(final String v1, final String v2) { + final String versionString1 = v1 == null || v1.isBlank() ? "0" : v1; + final String versionString2 = v2 == null || v2.isBlank() ? "0" : v2; - String[] v1Parts = v1.split("\\."); - String[] v2Parts = v2.split("\\."); + final String[] v1Parts = versionString1.split("\\."); + final String[] v2Parts = versionString2.split("\\."); int length = Math.max(v1Parts.length, v2Parts.length); for (int i = 0; i < length; i++) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RegexPatterns.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RegexPatterns.java index bea3e865e4..9e1ae3cac4 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RegexPatterns.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/util/RegexPatterns.java @@ -83,7 +83,6 @@ public final class RegexPatterns { public static final Pattern TEST_KEYWORDS_PATTERN = buildTestKeywordsPattern(); - public static final Map TEST_PATTERNS = Map.ofEntries( Map.entry("Digit Only Extension", DIGIT_ONLY_EXT_PATTERN), Map.entry("Digit Only No Ext", DIGIT_ONLY_NO_EXT_PATTERN), @@ -104,16 +103,6 @@ public final class RegexPatterns { Map.entry("Snow morning pattern",SNOW_MORNING_CHECKS_PATTERN) ); - private static Pattern buildTestKeywordsPattern() { - Set keywords = Constants.TEST_KEYWORDS; - - String keywordRegex = keywords.stream() - .map(Pattern::quote) - .collect(Collectors.joining("|")); - - return Pattern.compile(".*(" + keywordRegex + ").*", Pattern.CASE_INSENSITIVE); - } - // ========================= // Common Pattern Components // ========================= @@ -385,22 +374,32 @@ private static Pattern buildTestKeywordsPattern() { // ); public static final Map LEGITAMITE_PATTERNS = Map.ofEntries( - Map.entry("Standard", RegexPatterns.STANDARD_PATTERN), - Map.entry("StandardWithNumbers", RegexPatterns.STANDARD_PATTERN_WITH_NUMBERS_PREFIX), - Map.entry("SpecificT", RegexPatterns.SPECIFIC_T_PATTERN), - Map.entry("SpecialCase", RegexPatterns.SPECIAL_CASE_PATTERN), - Map.entry("DoubleURN", RegexPatterns.DOUBLE_URN_NO_EXHIBIT_PATTERN), - Map.entry("DoubleExhibit", RegexPatterns.DOUBLE_EXHIBIT_NO_URN_PATTERN), - Map.entry("Prefix", RegexPatterns.PREFIX_PATTERN), - Map.entry("Post", RegexPatterns.POST_URN_PREFIX_PATTERN), - Map.entry("Flexible", RegexPatterns.FLEXIBLE_PATTERN), - Map.entry("ExtraId", RegexPatterns.URN_EXTRA_ID_PATTERN), - Map.entry("DotsInName", RegexPatterns.DOTS_IN_NAME_PATTERN), - Map.entry("DotWitness", RegexPatterns.DOUBLE_URN_DOT_WITNESS_PATTERN), - Map.entry("PlusInName", RegexPatterns.PLUS_IN_NAME_PATTERN), - Map.entry("NoUrnPattern", RegexPatterns.NO_URN_PATTERN), - Map.entry("NoExhibitPattern", RegexPatterns.NO_EXHIBIT_DOT_SEPARATOR_PATTERN), - Map.entry("PrefixInExhibit", RegexPatterns.PREFIX_IN_EXHIBIT_POSITION_PATTERN), - Map.entry("DoubeDatePattern", RegexPatterns.DOUBLE_DATE_PATTERN) + Map.entry("Standard", STANDARD_PATTERN), + Map.entry("StandardWithNumbers", STANDARD_PATTERN_WITH_NUMBERS_PREFIX), + Map.entry("SpecificT", SPECIFIC_T_PATTERN), + Map.entry("SpecialCase", SPECIAL_CASE_PATTERN), + Map.entry("DoubleURN", DOUBLE_URN_NO_EXHIBIT_PATTERN), + Map.entry("DoubleExhibit", DOUBLE_EXHIBIT_NO_URN_PATTERN), + Map.entry("Prefix", PREFIX_PATTERN), + Map.entry("Post", POST_URN_PREFIX_PATTERN), + Map.entry("Flexible", FLEXIBLE_PATTERN), + Map.entry("ExtraId", URN_EXTRA_ID_PATTERN), + Map.entry("DotsInName", DOTS_IN_NAME_PATTERN), + Map.entry("DotWitness", DOUBLE_URN_DOT_WITNESS_PATTERN), + Map.entry("PlusInName", PLUS_IN_NAME_PATTERN), + Map.entry("NoUrnPattern", NO_URN_PATTERN), + Map.entry("NoExhibitPattern", NO_EXHIBIT_DOT_SEPARATOR_PATTERN), + Map.entry("PrefixInExhibit", PREFIX_IN_EXHIBIT_POSITION_PATTERN), + Map.entry("DoubeDatePattern", DOUBLE_DATE_PATTERN) ); + + private static Pattern buildTestKeywordsPattern() { + Set keywords = Constants.TEST_KEYWORDS; + + String keywordRegex = keywords.stream() + .map(Pattern::quote) + .collect(Collectors.joining("|")); + + return Pattern.compile(".*(" + keywordRegex + ").*", Pattern.CASE_INSENSITIVE); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/component/util/CommandRunner.java b/src/main/java/uk/gov/hmcts/reform/preapi/component/util/CommandRunner.java index 6f33d05c97..6c038eba95 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/component/util/CommandRunner.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/component/util/CommandRunner.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.preapi.component.util; import lombok.AllArgsConstructor; +import lombok.Cleanup; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.exec.CommandLine; @@ -20,10 +21,10 @@ public final class CommandRunner implements Callable { @Override public String call() throws Exception { - var stdout = new ByteArrayOutputStream(); - var stderr = new ByteArrayOutputStream(); - var exec = DefaultExecutor.builder().get(); - var streamHandler = new PumpStreamHandler(stdout, stderr); + @Cleanup ByteArrayOutputStream stdout = new ByteArrayOutputStream(); + @Cleanup ByteArrayOutputStream stderr = new ByteArrayOutputStream(); + DefaultExecutor exec = DefaultExecutor.builder().get(); + PumpStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr); exec.setStreamHandler(streamHandler); try { @@ -33,7 +34,7 @@ public String call() throws Exception { + stderr.toString("UTF-8"), e); } - var outputString = stdout.toString(StandardCharsets.UTF_8); + String outputString = stdout.toString(StandardCharsets.UTF_8); log.debug("Command output: {} ", outputString); return outputString; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/config/AzureConfiguration.java b/src/main/java/uk/gov/hmcts/reform/preapi/config/AzureConfiguration.java index bdb62b8c6a..060242c7ad 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/config/AzureConfiguration.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/config/AzureConfiguration.java @@ -2,6 +2,7 @@ import com.azure.core.http.policy.HttpLogDetailLevel; import com.azure.core.http.policy.HttpLogOptions; +import com.azure.identity.DefaultAzureCredential; import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; @@ -71,12 +72,12 @@ private BlobServiceClient storageClient(String storageAccountName, String connec private BlobServiceClient getBlobServiceClientUsingConnectionString(String connectionString, String storageAccountName) { try { - var accountKey = Arrays.stream(connectionString.split(";")) + String accountKey = Arrays.stream(connectionString.split(";")) .filter(s -> s.startsWith("AccountKey=")) .findFirst() .orElse("") .replace("AccountKey=", ""); - var credential = new StorageSharedKeyCredential(storageAccountName, accountKey); + StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, accountKey); return new BlobServiceClientBuilder() .credential(credential) .endpoint(String.format("https://%s.blob.core.windows.net", storageAccountName)) @@ -90,7 +91,7 @@ private BlobServiceClient getBlobServiceClientUsingConnectionString(String conne @Nullable private BlobServiceClient getBlobServiceClientUsingManagedIdentity(String storageAccountName) { try { - var credential = new DefaultAzureCredentialBuilder() + DefaultAzureCredential credential = new DefaultAzureCredentialBuilder() .tenantId(tenantId) .managedIdentityClientId(managedIdentityClientId) .build(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/config/JacksonConfiguration.java b/src/main/java/uk/gov/hmcts/reform/preapi/config/JacksonConfiguration.java index d8fc64c606..0934a906d3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/config/JacksonConfiguration.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/config/JacksonConfiguration.java @@ -21,6 +21,7 @@ import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.time.Instant; +import java.util.Locale; import static com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS; import static com.fasterxml.jackson.databind.MapperFeature.INFER_BUILDER_TYPE_BINDINGS; @@ -49,20 +50,19 @@ public ObjectMapper getMapper() { datetime.addDeserializer(Timestamp.class, new TimestampDeserializer()); mapper.registerModule(datetime); - mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")); + mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.UK)); mapper.registerModule(new ParameterNamesModule()); return mapper; } - private static class TimestampDeserializer extends JsonDeserializer { + private static final class TimestampDeserializer extends JsonDeserializer { @Override - public Timestamp deserialize(JsonParser p, DeserializationContext cxt) throws IOException { - String timestampStr = p.getText(); + public Timestamp deserialize(JsonParser parser, DeserializationContext cxt) throws IOException { + String timestampStr = parser.getText(); try { - var instant = Instant.parse(timestampStr); - return Timestamp.from(instant); + return Timestamp.from(Instant.parse(timestampStr)); } catch (Exception e) { throw new IOException("Failed to parse Date value '" + timestampStr + "'", e); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/config/SecurityConfig.java b/src/main/java/uk/gov/hmcts/reform/preapi/config/SecurityConfig.java index d8c1570520..7a871a064c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/config/SecurityConfig.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/config/SecurityConfig.java @@ -21,7 +21,7 @@ public class SecurityConfig { private final UserAuthenticationService userAuthenticationService; - public static final String[] PERMITTED_URIS_ALL_REQUESTS = new String[]{ + public static final String[] PERMITTED_URIS_ALL_REQUESTS = { "/testing-support/**", "/swagger-ui/**", "/v3/api-docs/**", @@ -39,11 +39,11 @@ public class SecurityConfig { "/portal-terms-and-conditions/latest" }; - public static final String[] PERMITTED_URIS_GET_ONLY = new String[]{ + public static final String[] PERMITTED_URIS_GET_ONLY = { "/invites", }; - public static final String[] PERMITTED_URIS_POST = new String[] { + public static final String[] PERMITTED_URIS_POST = { "/invites/redeem", "/batch", "/batch/fetch-xml", @@ -58,6 +58,7 @@ public SecurityConfig(UserAuthenticationService userAuthenticationService) { } @Bean + @SuppressWarnings("PMD.SignatureDeclareThrowsException") public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(AbstractHttpConfigurer::disable) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/AuditController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/AuditController.java index 1bdcd7c752..cf78c86fff 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/AuditController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/AuditController.java @@ -3,9 +3,9 @@ import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -34,16 +34,16 @@ public AuditController(AuditService auditService) { @PutMapping("/{id}") @Operation(operationId = "putAudit", summary = "Create an Audit Entry") - public ResponseEntity upsertAudit(@RequestHeader HttpHeaders headers, + public ResponseEntity upsertAudit(@RequestHeader MultiValueMap headers, @PathVariable UUID id, @Valid @RequestBody CreateAuditDTO createAuditDTO) { if (!id.equals(createAuditDTO.getId())) { throw new PathPayloadMismatchException("id", "createAuditDTO.id"); } - var userId = headers.getValuesAsList(X_USER_ID_HEADER).isEmpty() + UUID userId = !headers.containsKey(X_USER_ID_HEADER) ? null - : UUID.fromString(headers.getValuesAsList(X_USER_ID_HEADER).getFirst()); + : UUID.fromString(headers.get(X_USER_ID_HEADER).getFirst()); this.auditService.upsert(createAuditDTO, userId); return new ResponseEntity<>(HttpStatus.CREATED); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/B2CController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/B2CController.java index 01cd19d810..377aa260b0 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/B2CController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/B2CController.java @@ -11,7 +11,9 @@ import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import uk.gov.hmcts.reform.preapi.dto.VerifyEmailRequestDTO; +import uk.gov.hmcts.reform.preapi.dto.base.BaseUserDTO; import uk.gov.hmcts.reform.preapi.email.EmailServiceFactory; +import uk.gov.hmcts.reform.preapi.email.IEmailService; import uk.gov.hmcts.reform.preapi.services.UserService; @RestController @@ -37,8 +39,8 @@ public B2CController(@Autowired UserService userService, summary = "Trigger an email verification email to be sent out via gov notify" ) public void postEmailVerification(@Valid @RequestBody VerifyEmailRequestDTO request) { - var user = userService.findByEmail(request.getEmail()).getUser(); - var emailService = this.emailServiceFactory.getEnabledEmailService(emailServiceName); + BaseUserDTO user = userService.findByEmail(request.getEmail()).getUser(); + IEmailService emailService = this.emailServiceFactory.getEnabledEmailService(emailServiceName); emailService.emailVerification(request.getEmail(), user.getFirstName(), user.getLastName(), diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java index 725c3e3e26..8e8721cb98 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/BookingController.java @@ -231,8 +231,7 @@ public HttpEntity>> getSharedBookingLogs @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - - var resultPage = shareBookingService.getShareLogsForBooking(bookingId, pageable); + Page resultPage = shareBookingService.getShareLogsForBooking(bookingId, pageable); if (pageable.getPageNumber() > resultPage.getTotalPages()) { throw new RequestedPageOutOfRangeException(pageable.getPageNumber(), resultPage.getTotalPages()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionController.java index 7bad0a2267..4f15d356d9 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaptureSessionController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.hateoas.EntityModel; @@ -44,6 +45,7 @@ public class CaptureSessionController extends PreApiController { @Autowired public CaptureSessionController(CaptureSessionService captureSessionService) { + super(); this.captureSessionService = captureSessionService; } @@ -108,7 +110,7 @@ public HttpEntity>> searchCaptureSessi @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - var resultPage = captureSessionService.searchBy( + Page resultPage = captureSessionService.searchBy( params.getCaseReference(), params.getBookingId(), params.getOrigin(), diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaseController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaseController.java index 135ca7ea58..0bbfcc7b53 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaseController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/CaseController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.hateoas.EntityModel; @@ -87,7 +88,7 @@ public HttpEntity>> getCases( @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - var resultPage = caseService.searchBy( + Page resultPage = caseService.searchBy( params.getReference(), params.getCourtId(), params.getIncludeDeleted() != null && params.getIncludeDeleted(), diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/EditController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/EditController.java index 7263289707..f9b10f6846 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/EditController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/EditController.java @@ -112,7 +112,7 @@ public HttpEntity>> searchEdits( @PostMapping(value = "/from-csv/{sourceRecordingId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity createEditFromCsv(@PathVariable UUID sourceRecordingId, @RequestParam("file") MultipartFile file) { - var fileType = file.getContentType(); + String fileType = file.getContentType(); if (fileType == null || !fileType.equals(CSV_FILE_TYPE)) { throw new UnsupportedMediaTypeException("Unsupported media type: Only CSV files are supported"); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceController.java index 7785de1b01..e494d3cf44 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/MediaServiceController.java @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.Valid; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; @@ -24,6 +24,7 @@ import uk.gov.hmcts.reform.preapi.dto.CaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.CreateRecordingDTO; import uk.gov.hmcts.reform.preapi.dto.EncodeJobDTO; +import uk.gov.hmcts.reform.preapi.dto.RecordingDTO; import uk.gov.hmcts.reform.preapi.dto.media.AssetDTO; import uk.gov.hmcts.reform.preapi.dto.media.GenerateAssetDTO; import uk.gov.hmcts.reform.preapi.dto.media.GenerateAssetResponseDTO; @@ -38,6 +39,7 @@ import uk.gov.hmcts.reform.preapi.exception.ResourceInWrongStateException; import uk.gov.hmcts.reform.preapi.exception.UnknownServerException; import uk.gov.hmcts.reform.preapi.exception.UnprocessableContentException; +import uk.gov.hmcts.reform.preapi.media.IMediaService; import uk.gov.hmcts.reform.preapi.media.MediaServiceBroker; import uk.gov.hmcts.reform.preapi.media.storage.AzureFinalStorageService; import uk.gov.hmcts.reform.preapi.media.storage.AzureIngestStorageService; @@ -50,9 +52,10 @@ import java.util.UUID; import java.util.logging.Logger; +@Slf4j @RestController @RequestMapping("/media-service") -@Log4j2 +@SuppressWarnings("PMD.CouplingBetweenObjects") public class MediaServiceController extends PreApiController { private final MediaServiceBroker mediaServiceBroker; @@ -87,7 +90,7 @@ public MediaServiceController(MediaServiceBroker mediaServiceBroker, @Operation(operationId = "mediaServiceHealth", summary = "Check the status of the media service connection") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity mediaService() { - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); mediaService.getAssets(); return ResponseEntity.ok("successfully connected to media service (" + mediaService.getClass().getSimpleName() @@ -98,7 +101,7 @@ public ResponseEntity mediaService() { @Operation(operationId = "getAssets", summary = "Get all media service assets") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity> getAssets() { - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); return ResponseEntity.ok(mediaService.getAssets()); } @@ -106,8 +109,8 @@ public ResponseEntity> getAssets() { @Operation(operationId = "getAssetsByName", summary = "Get a media service asset by name") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity getAsset(@PathVariable String assetName) { - var mediaService = mediaServiceBroker.getEnabledMediaService(); - var data = mediaService.getAsset(assetName); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); + AssetDTO data = mediaService.getAsset(assetName); if (data == null) { throw new NotFoundException("Asset: " + assetName); } @@ -118,7 +121,7 @@ public ResponseEntity getAsset(@PathVariable String assetName) { @Operation(operationId = "getLiveEvents", summary = "Get a list of media service live events") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity> getLiveEvents() { - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); return ResponseEntity.ok(mediaService.getLiveEvents()); } @@ -126,14 +129,14 @@ public ResponseEntity> getLiveEvents() { @Operation(operationId = "getLiveEventsByName", summary = "Get a media service live event by name") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity getLiveEvents(@PathVariable String liveEventName) { - var mediaService = mediaServiceBroker.getEnabledMediaService(); - var data = mediaService.getLiveEvent(liveEventName); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); + LiveEventDTO data = mediaService.getLiveEvent(liveEventName); if (data == null) { throw new NotFoundException("Live event: " + liveEventName); } if (data.getResourceState().equals("Running") && data.getInputRtmp() != null) { try { - var captureSession = captureSessionService.findByLiveEventId(liveEventName); + CaptureSessionDTO captureSession = captureSessionService.findByLiveEventId(liveEventName); if (captureSession.getStatus() == RecordingStatus.INITIALISING) { captureSessionService.startCaptureSession( captureSession.getId(), @@ -142,7 +145,7 @@ public ResponseEntity getLiveEvents(@PathVariable String liveEvent ); } } catch (NotFoundException e) { - // ignore + log.info("Capture session for live event {} not found", liveEventName); } } return ResponseEntity.ok(data); @@ -155,7 +158,7 @@ public ResponseEntity getVod( @RequestParam(required = false) String mediaService ) throws InterruptedException { // check recording exists + authed - var recording = recordingService.findById(recordingId); + RecordingDTO recording = recordingService.findById(recordingId); if (recording.getCaptureSession().getCaseState() == CaseState.CLOSED) { throw new ResourceInWrongStateException("Case associated with Recording(" @@ -163,22 +166,23 @@ public ResponseEntity getVod( + ") is in state CLOSED. Cannot play recording."); } - var service = mediaServiceBroker.getEnabledMediaService(mediaService); + IMediaService service = mediaServiceBroker.getEnabledMediaService(mediaService); // TODO dont rely on naming convention, link asset name in db - var assetName = recordingId.toString().replace("-", "") + "_output"; - var userId = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()).getUserId(); + String assetName = recordingId.toString().replace("-", "") + "_output"; + UUID userId = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()).getUserId(); return ResponseEntity.ok(service.playAsset(assetName, userId.toString())); } + @SuppressWarnings("PMD.ExceptionAsFlowControl") @PutMapping("/live-event/end/{captureSessionId}") @Operation(operationId = "stopLiveEvent", summary = "Stop a live event") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2')") public ResponseEntity stopLiveEvent( @PathVariable UUID captureSessionId ) throws InterruptedException { - var dto = captureSessionService.findById(captureSessionId); + CaptureSessionDTO dto = captureSessionService.findById(captureSessionId); if (dto.getFinishedAt() != null) { return ResponseEntity.ok(dto); @@ -199,17 +203,17 @@ public ResponseEntity stopLiveEvent( ); } - var recordingId = UUID.randomUUID(); + UUID recordingId = UUID.randomUUID(); if (!enableEnhancedProcessing) { // todo code to removed once feature fully enabled (deprecated) dto = captureSessionService.stopCaptureSession(captureSessionId, RecordingStatus.PROCESSING, recordingId); } - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); try { if (!enableEnhancedProcessing) { // todo code to removed once feature fully enabled (deprecated) - var status = mediaService.stopLiveEventAndProcess(dto, recordingId); + RecordingStatus status = mediaService.stopLiveEventAndProcess(dto, recordingId); if (status == RecordingStatus.FAILURE) { throw new UnknownServerException("Encountered an error during encoding process for CaptureSession(" + captureSessionId @@ -218,7 +222,7 @@ public ResponseEntity stopLiveEvent( dto = captureSessionService.stopCaptureSession(captureSessionId, status, recordingId); } else { mediaService.stopLiveEvent(dto, recordingId); - var jobName = mediaService.triggerProcessingStep1( + String jobName = mediaService.triggerProcessingStep1( dto, dto.getId().toString().replace("-", ""), recordingId @@ -232,7 +236,7 @@ public ResponseEntity stopLiveEvent( RecordingStatus.PROCESSING, recordingId ); - var encodeJob = new EncodeJobDTO(); + EncodeJobDTO encodeJob = new EncodeJobDTO(); encodeJob.setId(UUID.randomUUID()); encodeJob.setCaptureSessionId(captureSessionId); encodeJob.setJobName(jobName); @@ -255,7 +259,7 @@ public ResponseEntity stopLiveEvent( public ResponseEntity createLiveEventStreamingLocator(@PathVariable UUID captureSessionId) throws InterruptedException { // load captureSession - var captureSession = captureSessionService.findById(captureSessionId); + CaptureSessionDTO captureSession = captureSessionService.findById(captureSessionId); Logger.getAnonymousLogger().info("createLiveEventStreamingLocator: " + captureSession); // return existing captureSession if currently live @@ -273,14 +277,14 @@ public ResponseEntity createLiveEventStreamingLocator(@PathVa captureSession.getStatus().name(), RecordingStatus.STANDBY.name()); } - var container = captureSession.getBookingId().toString(); + String container = captureSession.getBookingId().toString(); if (!azureIngestStorageService.doesIsmFileExist(container) && !azureIngestStorageService.doesBlobExist(container, "gc_state")) { throw new AssetFilesNotFoundException(captureSessionId); } // play live event - var liveOutputUrl = mediaServiceBroker.getEnabledMediaService().playLiveEvent(captureSessionId); + String liveOutputUrl = mediaServiceBroker.getEnabledMediaService().playLiveEvent(captureSessionId); // update captureSession captureSession.setLiveOutputUrl(liveOutputUrl); @@ -297,7 +301,7 @@ public ResponseEntity createLiveEventStreamingLocator(@PathVa ) @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity checkStream(@PathVariable UUID captureSessionId) { - var captureSession = captureSessionService.findById(captureSessionId); + CaptureSessionDTO captureSession = captureSessionService.findById(captureSessionId); if (captureSession.getStatus() == RecordingStatus.RECORDING) { return ResponseEntity.ok(captureSession); } @@ -333,7 +337,7 @@ public ResponseEntity checkStream(@PathVariable UUID captureS @Operation(operationId = "startLiveEvent", summary = "Start a live event") @PreAuthorize("hasAnyRole('ROLE_SUPER_USER', 'ROLE_LEVEL_1', 'ROLE_LEVEL_2', 'ROLE_LEVEL_3', 'ROLE_LEVEL_4')") public ResponseEntity startLiveEvent(@PathVariable UUID captureSessionId) { - var dto = captureSessionService.findById(captureSessionId); + CaptureSessionDTO dto = captureSessionService.findById(captureSessionId); if (dto.getCaseState() != CaseState.OPEN) { throw new ResourceInWrongStateException( @@ -361,7 +365,7 @@ public ResponseEntity startLiveEvent(@PathVariable UUID captu return ResponseEntity.ok(dto); } - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); try { mediaService.startLiveEvent(dto); } catch (Exception e) { @@ -397,19 +401,20 @@ public ResponseEntity generateAsset( log.info("Attempting to generate asset: {}", generateAssetDTO); - var result = mediaServiceBroker.getEnabledMediaService().importAsset(generateAssetDTO, true); + GenerateAssetResponseDTO result = mediaServiceBroker.getEnabledMediaService() + .importAsset(generateAssetDTO, true); if (result.getJobStatus().equals(JobState.FINISHED.toString())) { // add new version to recording etc - var parentRecording = recordingService.findById(generateAssetDTO.getParentRecordingId()); + RecordingDTO parentRecording = recordingService.findById(generateAssetDTO.getParentRecordingId()); - var recording = new CreateRecordingDTO(); + CreateRecordingDTO recording = new CreateRecordingDTO(); recording.setId(generateAssetDTO.getNewRecordingId()); recording.setParentRecordingId(parentRecording.getId()); recording.setCaptureSessionId(parentRecording.getCaptureSession().getId()); - var search = new SearchRecordings(); + SearchRecordings search = new SearchRecordings(); search.setCaptureSessionId(parentRecording.getCaptureSession().getId()); - var numRecordingsForCaptureSession = recordingService.findAll( + int numRecordingsForCaptureSession = recordingService.findAll( search, true, Pageable.unpaged() diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/RecordingController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/RecordingController.java index dc646fa186..71c97e4035 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/RecordingController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/RecordingController.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PagedResourcesAssembler; @@ -144,7 +145,7 @@ public HttpEntity>> searchRecordings( ) @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - var resultPage = recordingService.findAll( + Page resultPage = recordingService.findAll( params, params.getIncludeDeleted() != null && params.getIncludeDeleted(), pageable diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/TestingSupportController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/TestingSupportController.java index 9db5cb0d78..5c9a7a85cf 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/TestingSupportController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/TestingSupportController.java @@ -5,6 +5,7 @@ import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.hateoas.EntityModel; @@ -65,7 +66,7 @@ import java.time.Duration; import java.time.Instant; import java.time.OffsetDateTime; -import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -74,6 +75,7 @@ @RestController @RequestMapping("/testing-support") +@SuppressWarnings({"PMD.CouplingBetweenObjects", "PMD.ExcessiveImports", "PMD.TestClassWithoutTestCases"}) @ConditionalOnExpression("${testing-support-endpoints.enabled:false}") class TestingSupportController { @@ -95,6 +97,7 @@ class TestingSupportController { private final MigrationRecordRepository migrationRecordRepository; @Autowired + @SuppressWarnings("PMD.ExcessiveParameterList") TestingSupportController(final BookingRepository bookingRepository, final CaptureSessionRepository captureSessionRepository, final CaseRepository caseRepository, @@ -131,7 +134,7 @@ class TestingSupportController { @PostMapping(path = "/create-region", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> createRegion(@RequestParam(required = false) String regionName) { - var region = new Region(); + Region region = new Region(); region.setName(regionName == null || regionName.isEmpty() ? "Example Region" : regionName); regionRepository.save(region); @@ -140,22 +143,17 @@ public ResponseEntity> createRegion(@RequestParam(required = @PostMapping(path = "/create-court", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> createCourt() { - var court = createTestCourt(); - - var response = new HashMap() { - { - put("courtId", court.getId().toString()); - } - }; + Court court = createTestCourt(); + Map response = Map.of("courtId", court.getId().toString()); return ResponseEntity.ok(response); } @PostMapping(path = "/create-well-formed-booking", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> shouldNotHavePastScheduledForDate() { - var court = createTestCourt(); + Court court = createTestCourt(); - var region = new Region(); + Region region = new Region(); region.setName("Foo Region"); region.setCourts(Set.of(court)); court.setRegions(Set.of(region)); @@ -164,20 +162,20 @@ public ResponseEntity> shouldNotHavePastScheduledForDate() { court.setRegions(Set.of(region)); courtRepository.save(court); - var caseEntity = new Case(); + Case caseEntity = new Case(); caseEntity.setId(UUID.randomUUID()); caseEntity.setReference("4567890123"); caseEntity.setCourt(court); caseEntity.setOrigin(RecordingOrigin.PRE); caseRepository.save(caseEntity); - var participant1 = new Participant(); + Participant participant1 = new Participant(); participant1.setId(UUID.randomUUID()); participant1.setParticipantType(ParticipantType.WITNESS); participant1.setCaseId(caseEntity); participant1.setFirstName("John"); participant1.setLastName("Smith"); - var participant2 = new Participant(); + Participant participant2 = new Participant(); participant2.setId(UUID.randomUUID()); participant2.setParticipantType(ParticipantType.DEFENDANT); participant2.setCaseId(caseEntity); @@ -185,48 +183,46 @@ public ResponseEntity> shouldNotHavePastScheduledForDate() { participant2.setLastName("Doe"); participantRepository.saveAll(Set.of(participant1, participant2)); - var booking = new Booking(); + Booking booking = new Booking(); booking.setId(UUID.randomUUID()); booking.setCaseId(caseEntity); booking.setParticipants(Set.of(participant1, participant2)); booking.setScheduledFor(Timestamp.from(OffsetDateTime.now().plusWeeks(1).toInstant())); bookingRepository.save(booking); - var response = new HashMap() { - { - put("bookingId", booking.getId().toString()); - put("courtId", court.getId().toString()); - put("caseId", caseEntity.getId().toString()); - } - }; - + Map response = Map.of( + "bookingId", booking.getId().toString(), + "courtId", court.getId().toString(), + "caseId", caseEntity.getId().toString() + ); return ResponseEntity.ok(response); } + @SuppressWarnings("PMD.NcssCount") @PostMapping(path = "/should-delete-recordings-for-booking", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> shouldDeleteRecordingsForBooking() { - var court = createTestCourt(); + Court court = createTestCourt(); - var region = new Region(); + Region region = new Region(); region.setName("Region " + RandomStringUtils.secure().nextAlphabetic(5)); region.setCourts(Set.of(court)); court.setRegions(Set.of(region)); regionRepository.save(region); - var caseEntity = new Case(); + Case caseEntity = new Case(); caseEntity.setId(UUID.randomUUID()); caseEntity.setReference(RandomStringUtils.secure().nextAlphabetic(5)); caseEntity.setCourt(court); caseEntity.setOrigin(RecordingOrigin.PRE); caseRepository.save(caseEntity); - var participant1 = new Participant(); + Participant participant1 = new Participant(); participant1.setId(UUID.randomUUID()); participant1.setParticipantType(ParticipantType.WITNESS); participant1.setCaseId(caseEntity); participant1.setFirstName("John"); participant1.setLastName("Smith"); - var participant2 = new Participant(); + Participant participant2 = new Participant(); participant2.setId(UUID.randomUUID()); participant2.setParticipantType(ParticipantType.DEFENDANT); participant2.setCaseId(caseEntity); @@ -234,22 +230,22 @@ public ResponseEntity> shouldDeleteRecordingsForBooking() { participant2.setLastName("Doe"); participantRepository.saveAll(Set.of(participant1, participant2)); - var booking = new Booking(); + Booking booking = new Booking(); booking.setId(UUID.randomUUID()); booking.setCaseId(caseEntity); booking.setParticipants(Set.of(participant1, participant2)); - var scheduledFor = OffsetDateTime.now().plusWeeks(1); + OffsetDateTime scheduledFor = OffsetDateTime.now().plusWeeks(1); booking.setScheduledFor(Timestamp.from(scheduledFor.toInstant())); bookingRepository.save(booking); - var finishUser = new User(); + User finishUser = new User(); finishUser.setId(UUID.randomUUID()); finishUser.setEmail("finishuser@justice.local"); finishUser.setPhone(RandomStringUtils.secure().nextNumeric(11)); finishUser.setOrganisation("Gov Org"); finishUser.setFirstName("Finish"); finishUser.setLastName("User"); - var startUser = new User(); + User startUser = new User(); startUser.setId(UUID.randomUUID()); startUser.setEmail("startuser@justice.local"); startUser.setPhone(RandomStringUtils.secure().nextNumeric(11)); @@ -258,7 +254,7 @@ public ResponseEntity> shouldDeleteRecordingsForBooking() { startUser.setLastName("User"); userRepository.saveAll(Set.of(finishUser, startUser)); - var captureSession = new CaptureSession(); + CaptureSession captureSession = new CaptureSession(); captureSession.setId(UUID.randomUUID()); captureSession.setBooking(booking); captureSession.setOrigin(RecordingOrigin.PRE); @@ -271,7 +267,7 @@ public ResponseEntity> shouldDeleteRecordingsForBooking() { captureSession.setLiveOutputUrl("http://localhost:8080/live"); captureSessionRepository.save(captureSession); - var recording = new Recording(); + Recording recording = new Recording(); recording.setId(UUID.randomUUID()); recording.setCaptureSession(captureSession); recording.setVersion(1); @@ -281,15 +277,12 @@ public ResponseEntity> shouldDeleteRecordingsForBooking() { recordingRepository.save(recording); - var response = new HashMap() { - { - put("caseId", caseEntity.getId().toString()); - put("bookingId", booking.getId().toString()); - put("recordingId", recording.getId().toString()); - put("captureSessionId", captureSession.getId().toString()); - } - }; - + Map response = Map.of( + "caseId", caseEntity.getId().toString(), + "bookingId", booking.getId().toString(), + "recordingId", recording.getId().toString(), + "captureSessionId", captureSession.getId().toString() + ); return ResponseEntity.ok(response); } @@ -301,18 +294,16 @@ public ResponseEntity> createSuperUserRole( required = true ) TestingSupportRoles roleName ) { - String roleStr; - switch (roleName) { - case SUPER_USER -> roleStr = "Super User"; - case LEVEL_1 -> roleStr = "Level 1"; - case LEVEL_2 -> roleStr = "Level 2"; - case LEVEL_3 -> roleStr = "Level 3"; - case LEVEL_4 -> roleStr = "Level 4"; - default -> roleStr = "Other Role"; - } + String roleStr = switch (roleName) { + case SUPER_USER -> "Super User"; + case LEVEL_1 -> "Level 1"; + case LEVEL_2 -> "Level 2"; + case LEVEL_3 -> "Level 3"; + case LEVEL_4 -> "Level 4"; + }; - var role = createRole(roleStr); - var response = Map.of("roleId", role.getId().toString()); + Role role = createRole(roleStr); + Map response = Map.of("roleId", role.getId().toString()); return ResponseEntity.ok(response); } @@ -325,10 +316,9 @@ public ResponseEntity> createAuthenticatedUser(@PathVariable case LEVEL_3 -> "Level 3"; case LEVEL_4 -> "Level 4"; }; - var r = roleRepository.findFirstByName(roleName) + Role roleEntity = roleRepository.findFirstByName(roleName) .orElse(createRole(roleName)); - var appAccess = createAppAccess(r); - + AppAccess appAccess = createAppAccess(roleEntity); return ResponseEntity.ok(Map.of( "accessId", appAccess.getId().toString(), "courtId", appAccess.getCourt().getId().toString() @@ -337,20 +327,20 @@ public ResponseEntity> createAuthenticatedUser(@PathVariable @PostMapping(value = "/create-ready-to-use-booking/{caseReference}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> createReadyToUseBooking(@PathVariable String caseReference) { - var cases = caseRepository.findAllByReference(caseReference); + List cases = caseRepository.findAllByReference(caseReference); if (cases.isEmpty()) { throw new NotFoundException("Only use this endpoint for cases that already exist"); } - var aCase = cases.getFirst(); + Case aCase = cases.getFirst(); - var booking = new Booking(); + Booking booking = new Booking(); booking.setId(UUID.randomUUID()); booking.setCaseId(aCase); booking.setParticipants(aCase.getParticipants()); booking.setScheduledFor(Timestamp.from(Instant.now())); bookingRepository.save(booking); - var captureSession = new CaptureSession(); + CaptureSession captureSession = new CaptureSession(); captureSession.setId(UUID.randomUUID()); captureSession.setBooking(booking); captureSession.setOrigin(RecordingOrigin.PRE); @@ -368,7 +358,7 @@ public ResponseEntity> createReadyToUseBooking(@PathVariable public ResponseEntity> createTermsAndConditions( @PathVariable TermsAndConditionsType termsType ) { - var terms = new TermsAndConditions(); + TermsAndConditions terms = new TermsAndConditions(); terms.setId(UUID.randomUUID()); terms.setType(termsType); terms.setContent("some terms and conditions content"); @@ -406,7 +396,7 @@ public HttpEntity>> getLatestAudits( @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - var resultPage = auditRepository.findLatest(pageable); + Page resultPage = auditRepository.findLatest(pageable); if (pageable.getPageNumber() > resultPage.getTotalPages()) { throw new RequestedPageOutOfRangeException(pageable.getPageNumber(), resultPage.getTotalPages()); @@ -417,7 +407,7 @@ public HttpEntity>> getLatestAudits( @PostMapping(value = "/booking-scheduled-for-past/{bookingId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity bookingScheduledForPast(@PathVariable UUID bookingId) { - var booking = bookingRepository.findByIdAndDeletedAtIsNull(bookingId) + Booking booking = bookingRepository.findByIdAndDeletedAtIsNull(bookingId) .orElseThrow(() -> new NotFoundException("Booking: " + bookingId)); booking.setScheduledFor(Timestamp.from(booking.getScheduledFor().toInstant().minusSeconds(31536000))); @@ -428,8 +418,8 @@ public ResponseEntity bookingScheduledForPast(@PathVariable UUID boo @PostMapping(value = "/trigger-task/{taskName}") public ResponseEntity triggerTask(@PathVariable String taskName) { - final var beanName = toLowerCase(taskName.charAt(0)) + taskName.substring(1); - var task = scheduledTaskRunner.getTask(beanName); + final String beanName = toLowerCase(taskName.charAt(0)) + taskName.substring(1); + Runnable task = scheduledTaskRunner.getTask(beanName); if (task == null) { throw new NotFoundException("Task: " + taskName); } @@ -442,11 +432,11 @@ public ResponseEntity triggerTask(@PathVariable String taskName) { @PostMapping(value = "/create-existing-v1-recording/{recordingId}", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity createExistingRecording(@PathVariable UUID recordingId) { // done first so that we can get 404 if recording doesn't actually exist - var mp4FileName = azureFinalStorageService.getMp4FileName(recordingId.toString()); + String mp4FileName = azureFinalStorageService.getMp4FileName(recordingId.toString()); - var court = createTestCourt(); + Court court = createTestCourt(); - var region = new Region(); + Region region = new Region(); region.setName("Foo Region"); region.setCourts(Set.of(court)); court.setRegions(Set.of(region)); @@ -455,20 +445,20 @@ public ResponseEntity createExistingRecording(@PathVariable UUID r court.setRegions(Set.of(region)); courtRepository.save(court); - var caseEntity = new Case(); + Case caseEntity = new Case(); caseEntity.setId(UUID.randomUUID()); caseEntity.setReference("4567890123"); caseEntity.setCourt(court); caseEntity.setOrigin(RecordingOrigin.PRE); caseRepository.save(caseEntity); - var participant1 = new Participant(); + Participant participant1 = new Participant(); participant1.setId(UUID.randomUUID()); participant1.setParticipantType(ParticipantType.WITNESS); participant1.setCaseId(caseEntity); participant1.setFirstName("John"); participant1.setLastName("Smith"); - var participant2 = new Participant(); + Participant participant2 = new Participant(); participant2.setId(UUID.randomUUID()); participant2.setParticipantType(ParticipantType.DEFENDANT); participant2.setCaseId(caseEntity); @@ -476,14 +466,14 @@ public ResponseEntity createExistingRecording(@PathVariable UUID r participant2.setLastName("Doe"); participantRepository.saveAll(Set.of(participant1, participant2)); - var booking = new Booking(); + Booking booking = new Booking(); booking.setId(UUID.randomUUID()); booking.setCaseId(caseEntity); booking.setParticipants(Set.of(participant1, participant2)); booking.setScheduledFor(Timestamp.from(OffsetDateTime.now().plusWeeks(1).toInstant())); bookingRepository.save(booking); - var captureSession = new CaptureSession(); + CaptureSession captureSession = new CaptureSession(); captureSession.setId(UUID.randomUUID()); captureSession.setBooking(booking); captureSession.setOrigin(RecordingOrigin.PRE); @@ -492,7 +482,7 @@ public ResponseEntity createExistingRecording(@PathVariable UUID r captureSession.setFinishedAt(Timestamp.from(Instant.now())); captureSessionRepository.save(captureSession); - var recording = new Recording(); + Recording recording = new Recording(); recording.setId(recordingId); recording.setVersion(1); recording.setCaptureSession(captureSession); @@ -575,7 +565,7 @@ public ResponseEntity updateMigrationRecordToInvalidDurati } private Court createTestCourt() { - var court = new Court(); + Court court = new Court(); court.setId(UUID.randomUUID()); court.setName("Foo Court"); court.setCourtType(CourtType.CROWN); @@ -586,7 +576,7 @@ private Court createTestCourt() { } private AppAccess createAppAccess(Role role) { - var access = new AppAccess(); + AppAccess access = new AppAccess(); access.setUser(createUser()); access.setCourt(createTestCourt()); access.setRole(role); @@ -598,7 +588,7 @@ private AppAccess createAppAccess(Role role) { } private User createUser() { - var user = new User(); + User user = new User(); user.setId(UUID.randomUUID()); user.setEmail(user.getId() + "@example.com"); user.setFirstName("Example"); @@ -610,21 +600,12 @@ private User createUser() { return user; } - private Role createRole(String r) { - var role = new Role(); + private Role createRole(String roleName) { + Role role = new Role(); role.setId(UUID.randomUUID()); - role.setName(r); + role.setName(roleName); roleRepository.save(role); return role; } - - public enum AuthLevel { - NONE, - SUPER_USER, - LEVEL_1, - LEVEL_2, - LEVEL_3, - LEVEL_4 - } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/UserController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/UserController.java index de092c4b8e..29d1cc64ab 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/UserController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/UserController.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.hateoas.EntityModel; @@ -128,7 +129,7 @@ public ResponseEntity>> getUsers( @Parameter(hidden = true) Pageable pageable, @Parameter(hidden = true) PagedResourcesAssembler assembler ) { - var resultPage = userService.findAllBy( + Page resultPage = userService.findAllBy( params.getName(), params.getEmail(), params.getOrganisation(), diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/VfMigrationController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/VfMigrationController.java index 3249016a93..17aa6b353d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/VfMigrationController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/VfMigrationController.java @@ -46,6 +46,7 @@ public class VfMigrationController extends PreApiController { @Autowired public VfMigrationController(final MigrationRecordService migrationRecordService, final MigrateResolved migrateResolved) { + super(); this.migrationRecordService = migrationRecordService; this.migrateResolved = migrateResolved; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/base/PreApiController.java b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/base/PreApiController.java index 0ec4bbfcb7..a1e4227710 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/controllers/base/PreApiController.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/controllers/base/PreApiController.java @@ -14,13 +14,14 @@ import uk.gov.hmcts.reform.preapi.exception.RequestedPageOutOfRangeException; import uk.gov.hmcts.reform.preapi.exception.UnknownServerException; +import java.net.URI; import java.util.UUID; import java.util.function.Supplier; @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PreApiController { protected ResponseEntity getUpsertResponse(UpsertResult result, UUID id) { - var location = ServletUriComponentsBuilder + URI location = ServletUriComponentsBuilder .fromCurrentRequest() .path("") .buildAndExpand(id) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/AccessDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/AccessDTO.java index ce0130def2..d167a4535f 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/AccessDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/AccessDTO.java @@ -15,7 +15,7 @@ import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; +import java.util.EnumMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -56,7 +56,7 @@ public AccessDTO(User entity, Set latestTermsAndConditions) .map(PortalAccessDTO::new)) .collect(Collectors.toSet()); if (latestTermsAndConditions != null) { - termsAccepted = new HashMap<>(); + termsAccepted = new EnumMap<>(TermsAndConditionsType.class); Arrays.stream(TermsAndConditionsType.values()) .forEach(type -> { termsAccepted.put(type, latestTermsAndConditions @@ -65,10 +65,11 @@ public AccessDTO(User entity, Set latestTermsAndConditions) .anyMatch(t -> Stream.ofNullable(entity.getUserTermsAccepted()) .flatMap(Collection::stream) .anyMatch(userAcceptedTsCs -> userAcceptedTsCs.isValid() - && userAcceptedTsCs.getTermsAndConditions().getId() == t.getId()))); + && userAcceptedTsCs.getTermsAndConditions() + .getId().equals(t.getId())))); }); } else { - termsAccepted = new HashMap<>(); + termsAccepted = new EnumMap<>(TermsAndConditionsType.class); Arrays.stream(TermsAndConditionsType.values()).forEach(type -> { termsAccepted.put(type, false); }); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CaseDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CaseDTO.java index b72d6b0fe1..54e0e225c2 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CaseDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CaseDTO.java @@ -21,7 +21,6 @@ @NoArgsConstructor @Schema(description = "CaseDTO") @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -@SuppressWarnings("PMD.ShortClassName") public class CaseDTO { @Schema(description = "CaseId") private UUID id; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaptureSessionDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaptureSessionDTO.java index 217ee69753..311f7f1484 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaptureSessionDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaptureSessionDTO.java @@ -59,13 +59,13 @@ public CreateCaptureSessionDTO(CaptureSession captureSession) { this.ingestAddress = captureSession.getIngestAddress(); this.liveOutputUrl = captureSession.getLiveOutputUrl(); this.startedAt = captureSession.getStartedAt(); - this.startedByUserId = captureSession.getStartedByUser() != null - ? captureSession.getStartedByUser().getId() - : null; + if (captureSession.getStartedByUser() != null) { + this.startedByUserId = captureSession.getStartedByUser().getId(); + } this.finishedAt = captureSession.getFinishedAt(); - this.finishedByUserId = captureSession.getFinishedByUser() != null - ? captureSession.getFinishedByUser().getId() - : null; + if (captureSession.getFinishedByUser() != null) { + this.finishedByUserId = captureSession.getFinishedByUser().getId(); + } this.status = captureSession.getStatus(); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaseDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaseDTO.java index 43c6cf2d82..d2ff486be6 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaseDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateCaseDTO.java @@ -24,7 +24,6 @@ @CaseStateConstraint @Schema(description = "CreateCaseDTO") @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -@SuppressWarnings("PMD.ShortClassName") public class CreateCaseDTO { @Schema(description = "CreateCaseId") private UUID id; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateRecordingDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateRecordingDTO.java index 1242dda68b..e9253712ce 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateRecordingDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/CreateRecordingDTO.java @@ -25,11 +25,12 @@ public class CreateRecordingDTO extends BaseRecordingDTO { protected UUID captureSessionId; public CreateRecordingDTO(Recording recording) { + super(); id = recording.getId(); captureSessionId = recording.getCaptureSession().getId(); - parentRecordingId = recording.getParentRecording() != null - ? recording.getParentRecording().getId() - : null; + if (recording.getParentRecording() != null) { + parentRecordingId = recording.getParentRecording().getId(); + } version = recording.getVersion(); filename = recording.getFilename(); duration = recording.getDuration(); @@ -37,6 +38,7 @@ public CreateRecordingDTO(Recording recording) { } public CreateRecordingDTO(RecordingDTO recordingDTO) { + super(); id = recordingDTO.getId(); captureSessionId = recordingDTO.getCaptureSession().getId(); parentRecordingId = recordingDTO.getParentRecordingId(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/EditCutInstructionDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/EditCutInstructionDTO.java index 2f3f6cf652..ebf42f455f 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/EditCutInstructionDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/EditCutInstructionDTO.java @@ -56,14 +56,14 @@ public long getEnd() { private static long parseTime(String time) { try { - var units = time.split(":"); + String[] units = time.split(":"); int hours = Integer.parseInt(units[0]); int minutes = Integer.parseInt(units[1]); int seconds = Integer.parseInt(units[2]); return hours * 3600L + minutes * 60L + seconds; } catch (Exception e) { - throw new BadRequestException("Invalid time format: " + time + ". Must be in the form HH:MM:SS"); + throw new BadRequestException("Invalid time format: " + time + ". Must be in the form HH:MM:SS", e); } } @@ -73,7 +73,7 @@ private static String formatTime(long time) { } long hours = time / 3600; - long minutes = (time % 3600) / 60; + long minutes = time % 3600 / 60; long seconds = time % 60; return String.format("%02d:%02d:%02d", hours, minutes, seconds); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/InviteDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/InviteDTO.java index 184926f5ae..005025b776 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/InviteDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/InviteDTO.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.entities.PortalAccess; +import uk.gov.hmcts.reform.preapi.entities.User; import java.sql.Timestamp; import java.util.UUID; @@ -35,7 +36,7 @@ public class InviteDTO { protected String code; public InviteDTO(PortalAccess portalAccess) { - var user = portalAccess.getUser(); + User user = portalAccess.getUser(); userId = user.getId(); firstName = user.getFirstName(); lastName = user.getLastName(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/RecordingDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/RecordingDTO.java index 50f5b1fb3f..d8d2dc15d8 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/RecordingDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/RecordingDTO.java @@ -8,12 +8,14 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.base.BaseRecordingDTO; +import uk.gov.hmcts.reform.preapi.entities.Case; import uk.gov.hmcts.reform.preapi.entities.Participant; import uk.gov.hmcts.reform.preapi.entities.Recording; import java.sql.Timestamp; import java.util.Comparator; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -50,12 +52,13 @@ public class RecordingDTO extends BaseRecordingDTO { private int totalVersionCount; public RecordingDTO(Recording recording) { + super(); id = recording.getId(); captureSession = new CaptureSessionDTO(recording.getCaptureSession()); - parentRecordingId = recording.getParentRecording() != null - ? recording.getParentRecording().getId() - : null; - var versions = recording.getParentRecording() != null + if (recording.getParentRecording() != null) { + parentRecordingId = recording.getParentRecording().getId(); + } + Set versions = recording.getParentRecording() != null ? recording.getParentRecording().getRecordings() : recording.getRecordings(); totalVersionCount = versions != null ? versions.size() + 1 : 1; @@ -65,7 +68,7 @@ public RecordingDTO(Recording recording) { editInstructions = recording.getEditInstruction(); deletedAt = recording.getDeletedAt(); createdAt = recording.getCreatedAt(); - var caseEntity = recording.getCaptureSession().getBooking().getCaseId(); + Case caseEntity = recording.getCaptureSession().getBooking().getCaseId(); caseId = caseEntity.getId(); caseReference = caseEntity.getReference(); isTestCase = caseEntity.isTest(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/UserDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/UserDTO.java index 00a158f49e..4dcb669322 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/UserDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/UserDTO.java @@ -18,7 +18,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Comparator; -import java.util.HashMap; +import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -72,7 +72,7 @@ public UserDTO(User user, Set latestTermsAndConditions) { .map(PortalAccessDTO::new)) .collect(Collectors.toList()); if (latestTermsAndConditions != null) { - termsAccepted = new HashMap<>(); + termsAccepted = new EnumMap<>(TermsAndConditionsType.class); Arrays.stream(TermsAndConditionsType.values()) .forEach(type -> { termsAccepted.put(type, latestTermsAndConditions @@ -81,10 +81,10 @@ public UserDTO(User user, Set latestTermsAndConditions) { .anyMatch(t -> Stream.ofNullable(user.getUserTermsAccepted()) .flatMap(Collection::stream) .anyMatch(userAcceptedTsCs -> userAcceptedTsCs.isValid() - && userAcceptedTsCs.getTermsAndConditions().getId() == t.getId()))); + && userAcceptedTsCs.getTermsAndConditions().getId().equals(t.getId())))); }); } else { - termsAccepted = new HashMap<>(); + termsAccepted = new EnumMap<>(TermsAndConditionsType.class); Arrays.stream(TermsAndConditionsType.values()).forEach(type -> { termsAccepted.put(type, false); }); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseRecordingDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseRecordingDTO.java index 44e477543f..d77b16c0f0 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseRecordingDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseRecordingDTO.java @@ -14,6 +14,7 @@ @Data @NoArgsConstructor +@SuppressWarnings("PMD.AbstractClassWithoutAbstractMethod") public abstract class BaseRecordingDTO { @Schema(description = "RecordingId") @NotNull(message = "id is required") diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseUserDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseUserDTO.java index aa709f33f4..75bd6e5922 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseUserDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/base/BaseUserDTO.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.reform.preapi.dto.base; - import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/flow/CaseStateChangeNotificationDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/flow/CaseStateChangeNotificationDTO.java index f4f243f81b..28a5f4cece 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/flow/CaseStateChangeNotificationDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/flow/CaseStateChangeNotificationDTO.java @@ -29,10 +29,10 @@ public enum EmailType { CLOSURE_CANCELLATION } - public CaseStateChangeNotificationDTO(EmailType notificationType, Case c, ShareBooking share) { + public CaseStateChangeNotificationDTO(EmailType notificationType, Case aCase, ShareBooking share) { emailType = notificationType; - caseReference = c.getReference(); - closeDate = c.getClosedAt(); + caseReference = aCase.getReference(); + closeDate = aCase.getClosedAt(); firstName = share.getSharedWith().getFirstName(); lastName = share.getSharedWith().getLastName(); email = share.getSharedWith().getEmail(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/AccessRemovedReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/AccessRemovedReportDTO.java index c18fe43098..c96da356e7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/AccessRemovedReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/AccessRemovedReportDTO.java @@ -6,7 +6,10 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; +import uk.gov.hmcts.reform.preapi.entities.Booking; +import uk.gov.hmcts.reform.preapi.entities.Court; import uk.gov.hmcts.reform.preapi.entities.ShareBooking; +import uk.gov.hmcts.reform.preapi.entities.User; import java.sql.Timestamp; import java.util.Set; @@ -41,8 +44,8 @@ public class AccessRemovedReportDTO { private String removalReason; public AccessRemovedReportDTO(ShareBooking shareBooking) { - var booking = shareBooking.getBooking(); - var courtEntity = booking.getCaseId().getCourt(); + Booking booking = shareBooking.getBooking(); + Court courtEntity = booking.getCaseId().getCourt(); removedAt = shareBooking.getDeletedAt(); caseReference = booking.getCaseId().getReference(); @@ -51,7 +54,7 @@ public AccessRemovedReportDTO(ShareBooking shareBooking) { .flatMap(regions -> regions.stream().map(RegionDTO::new)) .collect(Collectors.toSet()); - var user = shareBooking.getSharedWith(); + User user = shareBooking.getSharedWith(); userFullName = user.getFullName(); userEmail = user.getEmail(); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/CompletedCaptureSessionReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/CompletedCaptureSessionReportDTO.java index ceee1e7c97..6649e2d34a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/CompletedCaptureSessionReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/CompletedCaptureSessionReportDTO.java @@ -7,6 +7,9 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; +import uk.gov.hmcts.reform.preapi.entities.Booking; +import uk.gov.hmcts.reform.preapi.entities.CaptureSession; +import uk.gov.hmcts.reform.preapi.entities.Case; import uk.gov.hmcts.reform.preapi.entities.Recording; import uk.gov.hmcts.reform.preapi.enums.ParticipantType; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; @@ -58,16 +61,16 @@ public class CompletedCaptureSessionReportDTO { private Set regions; public CompletedCaptureSessionReportDTO(Recording recording) { - var captureSession = recording.getCaptureSession(); + CaptureSession captureSession = recording.getCaptureSession(); startedAt = captureSession.getStartedAt(); finishedAt = captureSession.getFinishedAt(); duration = recording.getDuration(); - var booking = captureSession.getBooking(); + Booking booking = captureSession.getBooking(); scheduledFor = booking.getScheduledFor(); - var caseEntity = booking.getCaseId(); + Case caseEntity = booking.getCaseId(); caseReference = caseEntity.getReference(); countDefendants = (int) booking .getParticipants() diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ConcurrentCaptureSessionReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ConcurrentCaptureSessionReportDTO.java index d18c0ec62a..0e50f3d34c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ConcurrentCaptureSessionReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ConcurrentCaptureSessionReportDTO.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; +import uk.gov.hmcts.reform.preapi.entities.Case; +import uk.gov.hmcts.reform.preapi.entities.Court; import java.sql.Timestamp; import java.time.Duration; @@ -50,8 +52,8 @@ public ConcurrentCaptureSessionReportDTO(CaptureSession entity) { id = entity.getId(); startTime = entity.getStartedAt(); endTime = entity.getFinishedAt(); - var caseEntity = entity.getBooking().getCaseId(); - var courtEntity = caseEntity.getCourt(); + Case caseEntity = entity.getBooking().getCaseId(); + Court courtEntity = caseEntity.getCourt(); court = courtEntity.getName(); caseReference = caseEntity.getReference(); region = Stream.ofNullable(caseEntity.getCourt().getRegions()) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/EditReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/EditReportDTO.java index fa68e555dd..b361b67a05 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/EditReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/EditReportDTO.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; +import uk.gov.hmcts.reform.preapi.entities.Case; import uk.gov.hmcts.reform.preapi.entities.Recording; import java.sql.Timestamp; @@ -42,7 +43,7 @@ public class EditReportDTO { public EditReportDTO(Recording recordingEntity) { createdAt = recordingEntity.getCreatedAt(); version = recordingEntity.getVersion(); - var caseEntity = recordingEntity + Case caseEntity = recordingEntity .getCaptureSession() .getBooking() .getCaseId(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/PlaybackReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/PlaybackReportDTO.java index 2268a5e59e..feaee086cb 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/PlaybackReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/PlaybackReportDTO.java @@ -8,6 +8,8 @@ import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; import uk.gov.hmcts.reform.preapi.entities.Audit; +import uk.gov.hmcts.reform.preapi.entities.Case; +import uk.gov.hmcts.reform.preapi.entities.Court; import uk.gov.hmcts.reform.preapi.entities.Recording; import uk.gov.hmcts.reform.preapi.entities.User; @@ -53,8 +55,8 @@ public PlaybackReportDTO(Audit audit, User user, @Nullable Recording recording) userEmail = user.getEmail(); } if (recording != null) { - var caseEntity = recording.getCaptureSession().getBooking().getCaseId(); - var courtEntity = caseEntity.getCourt(); + Case caseEntity = recording.getCaptureSession().getBooking().getCaseId(); + Court courtEntity = caseEntity.getCourt(); court = courtEntity.getName(); caseReference = caseEntity.getReference(); regions = Stream.ofNullable(caseEntity.getCourt().getRegions()) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ScheduleReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ScheduleReportDTO.java index 4543201681..6db9e3eb6d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ScheduleReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/ScheduleReportDTO.java @@ -6,7 +6,9 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; +import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; +import uk.gov.hmcts.reform.preapi.entities.Case; import java.sql.Timestamp; import java.util.Set; @@ -38,8 +40,8 @@ public class ScheduleReportDTO { private Set regions; public ScheduleReportDTO(CaptureSession captureSession) { - var bookingEntity = captureSession.getBooking(); - var caseEntity = bookingEntity.getCaseId(); + Booking bookingEntity = captureSession.getBooking(); + Case caseEntity = bookingEntity.getCaseId(); scheduledFor = bookingEntity.getScheduledFor(); bookingCreatedAt = bookingEntity.getCreatedAt(); caseReference = caseEntity.getReference(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/SharedReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/SharedReportDTO.java index 1161a82e38..cecf8ec2e0 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/SharedReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/legacyreports/SharedReportDTO.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.dto.RegionDTO; +import uk.gov.hmcts.reform.preapi.entities.Case; import uk.gov.hmcts.reform.preapi.entities.ShareBooking; import java.sql.Timestamp; @@ -54,7 +55,7 @@ public SharedReportDTO(ShareBooking shareBooking) { allocatedToFullName = shareBooking.getSharedWith().getFullName(); allocatedBy = shareBooking.getSharedBy().getEmail(); allocatedByFullName = shareBooking.getSharedBy().getFullName(); - var caseEntity = shareBooking.getBooking().getCaseId(); + Case caseEntity = shareBooking.getBooking().getCaseId(); caseReference = caseEntity.getReference(); court = caseEntity.getCourt().getName(); regions = Stream.ofNullable(caseEntity.getCourt().getRegions()) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/AccessRemovedReportDTOV2.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/AccessRemovedReportDTOV2.java index e3bd8ae347..1c35d91481 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/AccessRemovedReportDTOV2.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/AccessRemovedReportDTOV2.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import uk.gov.hmcts.reform.preapi.entities.ShareBooking; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.utils.DateTimeUtils; @Data @@ -37,7 +38,7 @@ public AccessRemovedReportDTOV2(ShareBooking shareBooking) { removedTime = DateTimeUtils.formatTime(shareBooking.getDeletedAt()); removedTimezone = DateTimeUtils.getTimezoneAbbreviation(shareBooking.getDeletedAt()); - var user = shareBooking.getSharedWith(); + User user = shareBooking.getSharedWith(); fullName = user.getFullName(); userEmail = user.getEmail(); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/BaseReportDTO.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/BaseReportDTO.java index ff9dd285d8..6234528901 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/BaseReportDTO.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/BaseReportDTO.java @@ -9,6 +9,7 @@ @Data @NoArgsConstructor +@SuppressWarnings("PMD.AbstractClassWithoutAbstractMethod") public abstract class BaseReportDTO { @Schema(description = "ReportCaseReference") protected String caseReference; @@ -25,13 +26,13 @@ public abstract class BaseReportDTO { @Schema(description = "ReportRegion") protected String region; - protected BaseReportDTO(Case c) { - if (c == null) { + protected BaseReportDTO(Case aCase) { + if (aCase == null) { return; } - caseReference = c.getReference(); - Court courtEntity = c.getCourt(); + caseReference = aCase.getReference(); + Court courtEntity = aCase.getCourt(); court = courtEntity.getName(); county = courtEntity.getCounty(); postcode = courtEntity.getPostcode(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/CompletedCaptureSessionReportDTOV2.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/CompletedCaptureSessionReportDTOV2.java index 4ed519eacf..a7265a0e80 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/CompletedCaptureSessionReportDTOV2.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/CompletedCaptureSessionReportDTOV2.java @@ -6,12 +6,15 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import uk.gov.hmcts.reform.preapi.entities.Booking; +import uk.gov.hmcts.reform.preapi.entities.CaptureSession; import uk.gov.hmcts.reform.preapi.entities.Participant; import uk.gov.hmcts.reform.preapi.entities.Recording; import uk.gov.hmcts.reform.preapi.enums.ParticipantType; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.utils.DateTimeUtils; +import java.util.List; import java.util.stream.Collectors; @Data @@ -53,17 +56,17 @@ public class CompletedCaptureSessionReportDTOV2 extends BaseReportDTO { public CompletedCaptureSessionReportDTOV2(Recording recording) { super(recording.getCaptureSession().getBooking().getCaseId()); - var captureSession = recording.getCaptureSession(); + CaptureSession captureSession = recording.getCaptureSession(); status = captureSession.getStatus(); recordingDate = DateTimeUtils.formatDate(captureSession.getStartedAt()); recordingTime = DateTimeUtils.formatTime(captureSession.getStartedAt()); finishTime = DateTimeUtils.formatTime(captureSession.getFinishedAt()); timezone = DateTimeUtils.getTimezoneAbbreviation(captureSession.getStartedAt()); - var booking = captureSession.getBooking(); + Booking booking = captureSession.getBooking(); scheduledDate = DateTimeUtils.formatDate(captureSession.getBooking().getScheduledFor()); - var defendants = booking.getParticipants() + List defendants = booking.getParticipants() .stream() .filter(p -> p.getParticipantType() == ParticipantType.DEFENDANT) .toList(); @@ -72,7 +75,7 @@ public CompletedCaptureSessionReportDTOV2(Recording recording) { .collect(Collectors.joining(", ")); defendant = defendants.size(); - var witnesses = booking.getParticipants() + List witnesses = booking.getParticipants() .stream() .filter(p -> p.getParticipantType() == ParticipantType.WITNESS) .toList(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/ScheduleReportDTOV2.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/ScheduleReportDTOV2.java index f00de85a55..5a496e8ce7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/ScheduleReportDTOV2.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/reports/ScheduleReportDTOV2.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; import uk.gov.hmcts.reform.preapi.utils.DateTimeUtils; @@ -27,7 +28,7 @@ public class ScheduleReportDTOV2 extends BaseReportDTO { public ScheduleReportDTOV2(CaptureSession captureSession) { super(captureSession.getBooking().getCaseId()); - var booking = captureSession.getBooking(); + Booking booking = captureSession.getBooking(); scheduledDate = DateTimeUtils.formatDate(booking.getScheduledFor()); dateOfBooking = DateTimeUtils.formatDate(booking.getCreatedAt()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/BookingScheduledForNotPastOrNotChangedValidator.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/BookingScheduledForNotPastOrNotChangedValidator.java index 6d569b89d9..b8e451add1 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/BookingScheduledForNotPastOrNotChangedValidator.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/BookingScheduledForNotPastOrNotChangedValidator.java @@ -39,8 +39,8 @@ public boolean isValid(CreateBookingDTO booking, ConstraintValidatorContext cxt) return false; } - var localDateField = toLocalDate(booking.getScheduledFor()); - var today = LocalDate.now(); + LocalDate localDateField = toLocalDate(booking.getScheduledFor()); + LocalDate today = LocalDate.now(); return !localDateField.isBefore(today) || bookingRepository.findById(booking.getId()) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidator.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidator.java index 22231c8571..1fd4a66cb1 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidator.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidator.java @@ -19,8 +19,9 @@ public boolean isValid(Timestamp dateField, ConstraintValidatorContext cxt) { return false; } - var localDateField = LocalDateTime.ofInstant(dateField.toInstant(), ZoneId.of("Europe/London")).toLocalDate(); - var today = LocalDate.now(); + LocalDate localDateField = LocalDateTime.ofInstant(dateField.toInstant(), ZoneId.of("Europe/London")) + .toLocalDate(); + LocalDate today = LocalDate.now(); return !localDateField.isBefore(today); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/PortalAppAccessValidator.java b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/PortalAppAccessValidator.java index af5cc7deb6..396f839073 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/PortalAppAccessValidator.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/dto/validators/PortalAppAccessValidator.java @@ -13,6 +13,8 @@ public class PortalAppAccessValidator private final RoleRepository roleRepository; + private static final String PORTAL_ROLE_NAME = "Level 3"; + @Autowired public PortalAppAccessValidator(final RoleRepository roleRepository) { this.roleRepository = roleRepository; @@ -46,9 +48,7 @@ public boolean isValid(Set access, ConstraintValidatorContex } private boolean isRolePortal(CreateAppAccessDTO dto) { - if (dto.getRoleId() == null) { - return false; - } - return roleRepository.findById(dto.getRoleId()).map(r -> r.getName().equals("Level 3")).orElse(false); + return dto.getRoleId() != null + && roleRepository.findById(dto.getRoleId()).map(r -> r.getName().equals(PORTAL_ROLE_NAME)).orElse(false); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/EmailServiceFactory.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/EmailServiceFactory.java index 255c702c90..ba29d7bfa8 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/EmailServiceFactory.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/EmailServiceFactory.java @@ -29,15 +29,19 @@ public EmailServiceFactory( emailServices.put(service.getClass().getSimpleName(), service); } - this.enabledEmailService = getEnabledEmailService(emailServiceName); + this.enabledEmailService = findEmailService(emailServiceName); this.isEnabled = isEnabled; } - public IEmailService getEnabledEmailService(String name) { + private IEmailService findEmailService(String name) { if (emailServices.containsKey(name)) { return emailServices.get(name); } else { throw new IllegalArgumentException("Unknown email service: " + name); } } + + public IEmailService getEnabledEmailService(String emailServiceName) { + return findEmailService(emailServiceName); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/GovNotify.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/GovNotify.java index 24f28939a7..4766ad2028 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/GovNotify.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/GovNotify.java @@ -40,33 +40,45 @@ public GovNotify( @Override public EmailResponse recordingReady(User to, Case forCase) { - var template = new RecordingReady(to.getEmail(), to.getFirstName(), to.getLastName(), forCase.getReference(), - forCase.getCourt().getName(), portalUrl); + RecordingReady template = new RecordingReady( + to.getEmail(), + to.getFirstName(), + to.getLastName(), + forCase.getReference(), + forCase.getCourt().getName(), + portalUrl + ); try { log.info("Recording ready email sent to {}", to.getEmail()); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send recording ready email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse recordingEdited(User to, Case forCase) { - var template = new RecordingEdited(to.getEmail(), to.getFirstName(), to.getLastName(), forCase.getReference(), - forCase.getCourt().getName(), portalUrl); + RecordingEdited template = new RecordingEdited( + to.getEmail(), + to.getFirstName(), + to.getLastName(), + forCase.getReference(), + forCase.getCourt().getName(), + portalUrl + ); try { log.info("Recording edited email sent to {}", to.getEmail()); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send recording edited email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse portalInvite(User to) { - var template = new PortalInvite(to.getEmail(), to.getFirstName(), to.getLastName(), portalUrl, + PortalInvite template = new PortalInvite(to.getEmail(), to.getFirstName(), to.getLastName(), portalUrl, portalUrl + "/assets/files/user-guide.pdf", portalUrl + "/assets/files/process-guide.pdf", portalUrl + "/assets/files/faqs.pdf", @@ -76,59 +88,62 @@ public EmailResponse portalInvite(User to) { return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send portal invite email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse casePendingClosure(User to, Case forCase, Timestamp date) { - var template = new CasePendingClosure(to.getEmail(), to.getFirstName(), to.getLastName(), + CasePendingClosure template = new CasePendingClosure(to.getEmail(), to.getFirstName(), to.getLastName(), forCase.getReference(), date); try { log.info("Case pending closure email sent to {}", to.getEmail()); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send case pending closure email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse caseClosed(User to, Case forCase) { - var template = new CaseClosed(to.getEmail(), to.getFirstName(), to.getLastName(), forCase.getReference()); + CaseClosed template = new CaseClosed( + to.getEmail(), + to.getFirstName(), + to.getLastName(), + forCase.getReference() + ); try { log.info("Case closed email sent to {}", to.getEmail()); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send case closed email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse caseClosureCancelled(User to, Case forCase) { - var template = new CaseClosureCancelled(to.getEmail(), to.getFirstName(), to.getLastName(), + CaseClosureCancelled template = new CaseClosureCancelled(to.getEmail(), to.getFirstName(), to.getLastName(), forCase.getReference()); try { log.info("Case closure cancelled email sent to {}", to.getEmail()); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send case closure cancelled email to {}", to.getEmail(), e); - throw new EmailFailedToSendException(to.getEmail()); + throw (EmailFailedToSendException) new EmailFailedToSendException(to.getEmail()).initCause(e); } } @Override public EmailResponse emailVerification(String email, String firstName, String lastName, String verificationCode) { - var template = new EmailVerification( - email, firstName, lastName, verificationCode - ); + EmailVerification template = new EmailVerification(email, firstName, lastName, verificationCode); try { log.info("Email verification sent to {}", email); return EmailResponse.fromGovNotifyResponse(sendEmail(template)); } catch (NotificationClientException e) { log.error("Failed to send email verification to {}", email, e); - throw new EmailFailedToSendException(email); + throw new EmailFailedToSendException(email, e); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/BaseTemplate.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/BaseTemplate.java index 0b9a6027be..ef12e23845 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/BaseTemplate.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/BaseTemplate.java @@ -6,7 +6,6 @@ @Getter public abstract class BaseTemplate { - private final String templateId = ""; private final String to; private final String reference; private final Map variables; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosed.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosed.java index 37fd8270e8..36db31b3ec 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosed.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosed.java @@ -14,6 +14,7 @@ public CaseClosed(String to, String firstName, String lastName, String caseRef) ); } + @Override public String getTemplateId() { return "ee5c6d3f-e934-4053-9f48-0ba082b8caf4"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosureCancelled.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosureCancelled.java index 34db0017f5..af4eb2a5fa 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosureCancelled.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CaseClosureCancelled.java @@ -5,6 +5,7 @@ public CaseClosureCancelled(String to, String firstName, String lastName, String super(to, firstName, lastName, caseRef); } + @Override public String getTemplateId() { return "5fba3021-a835-4f98-a575-83cc5fcb83a4"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CasePendingClosure.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CasePendingClosure.java index 3d6b08642c..5c903a2263 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CasePendingClosure.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/CasePendingClosure.java @@ -18,6 +18,7 @@ public CasePendingClosure(String to, String firstName, String lastName, String c ); } + @Override public String getTemplateId() { return "5322ba5c-f4c4-4d1b-807c-16f56f0d8d0c"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/EmailVerification.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/EmailVerification.java index 8dbbdde202..fbb3df5b91 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/EmailVerification.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/EmailVerification.java @@ -14,6 +14,7 @@ public EmailVerification(String to, String firstName, String lastName, String ve ); } + @Override public String getTemplateId() { return "24de8c44-06af-4489-9e83-134b48894d36"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/PortalInvite.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/PortalInvite.java index aa406ab849..58f85deb8d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/PortalInvite.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/PortalInvite.java @@ -27,6 +27,7 @@ public PortalInvite(String to, ); } + @Override public String getTemplateId() { return "e04adfb8-58e0-44be-ab42-bd6d896ccfb7"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingEdited.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingEdited.java index ac431f8e98..eca2c7dbbf 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingEdited.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingEdited.java @@ -10,6 +10,7 @@ public RecordingEdited(String to, super(to, firstName, lastName, caseRef, courtName, portalLink); } + @Override public String getTemplateId() { return "1da03824-84e8-425d-b913-c2bac661e64a"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingReady.java b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingReady.java index c48cef7c00..8ae53f7e5f 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingReady.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/email/govnotify/templates/RecordingReady.java @@ -21,6 +21,7 @@ public RecordingReady(String to, ); } + @Override public String getTemplateId() { return "6ad8d468-4a18-4180-9c08-c6fae055a385"; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/AppAccess.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/AppAccess.java index df0e8204bd..8fbb7940f3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/AppAccess.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/AppAccess.java @@ -13,6 +13,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -51,8 +52,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("userEmail", user.getEmail()); details.put("courtName", court.getName()); details.put("roleName", role.getName()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Booking.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Booking.java index d918f52ec8..8c2369e64a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Booking.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Booking.java @@ -19,6 +19,7 @@ import java.sql.Timestamp; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; @Getter @@ -63,8 +64,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("caseId", caseId.getId()); details.put("bookingScheduledFor", scheduledFor); details.put("deleted", isDeleted()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/CaptureSession.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/CaptureSession.java index f514a95563..a297e34764 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/CaptureSession.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/CaptureSession.java @@ -21,6 +21,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; import java.util.Set; @Getter @@ -82,8 +83,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("bookingId", booking.getId()); details.put("captureSessionOrigin", origin); details.put("captureSessionStartedAt", startedAt); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Case.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Case.java index beaddf5379..1637d54abd 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Case.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Case.java @@ -21,6 +21,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -71,8 +72,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("courtName", court.getName()); details.put("caseReference", reference); details.put("caseParticipants", Stream.ofNullable(getParticipants()) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Court.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Court.java index 8e1a61792e..4cea84d5ce 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Court.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Court.java @@ -17,6 +17,7 @@ import uk.gov.hmcts.reform.preapi.enums.CourtType; import java.util.HashMap; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -52,8 +53,8 @@ public class Court extends BaseEntity { private Set regions; @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("courtName", name); details.put("courtType", courtType); details.put("courtLocationCode", locationCode); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/EditRequest.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/EditRequest.java index 547fbfeb55..351aebb1fc 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/EditRequest.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/EditRequest.java @@ -17,6 +17,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -47,8 +48,8 @@ public class EditRequest extends CreatedModifiedAtEntity { private User createdBy; @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("id", getId()); details.put("sourceRecordingId", sourceRecording.getId()); details.put("status", status); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/EncodeJob.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/EncodeJob.java index 3fa331da82..618874b80d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/EncodeJob.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/EncodeJob.java @@ -16,6 +16,7 @@ import uk.gov.hmcts.reform.preapi.enums.EncodeTransform; import java.util.HashMap; +import java.util.Map; import java.util.UUID; @Getter @@ -39,8 +40,8 @@ public class EncodeJob extends CreatedModifiedAtEntity { private EncodeTransform transform; @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("captureSessionId", captureSession.getId()); details.put("recordingId", recordingId); details.put("jobName", jobName); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Participant.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Participant.java index 3434dfb686..73876fb08e 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Participant.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Participant.java @@ -19,6 +19,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; import java.util.Set; @Getter @@ -55,8 +56,8 @@ public String getFullName() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("caseId", caseId.getId()); details.put("firstName", firstName); details.put("lastName", lastName); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/PortalAccess.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/PortalAccess.java index 078cbc9153..c792f6e4cf 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/PortalAccess.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/PortalAccess.java @@ -19,6 +19,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -54,8 +55,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("portalAccessUserEmail", user.getEmail()); details.put("portalAccessStatus", status); details.put("portalAccessInvitedAt", invitedAt); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Recording.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Recording.java index ef11dd26bd..21752ffac7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Recording.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Recording.java @@ -23,6 +23,7 @@ import java.sql.Timestamp; import java.time.Duration; import java.util.HashMap; +import java.util.Map; import java.util.Set; @Getter @@ -77,8 +78,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("parentRecordingId", parentRecording != null ? parentRecording.getId() : null); details.put("recordingVersion", version); details.put("recordingFilename", filename); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Role.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Role.java index b7cad5e559..c118116248 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/Role.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/Role.java @@ -8,6 +8,7 @@ import uk.gov.hmcts.reform.preapi.entities.base.BaseEntity; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -22,8 +23,8 @@ public class Role extends BaseEntity { private String description; @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("roleName", getName()); return details; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/ShareBooking.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/ShareBooking.java index a0ebb644de..2874ff9e6a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/ShareBooking.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/ShareBooking.java @@ -16,6 +16,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -52,9 +53,8 @@ public boolean isDeleted() { } @Override - public HashMap getDetailsForAudit() { - - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("bookingId", booking.getId()); details.put("sharedWithUser", sharedWith.getEmail()); details.put("sharedByUser", sharedBy.getEmail()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/TermsAndConditions.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/TermsAndConditions.java index 1d6670c9dc..eda31b436a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/TermsAndConditions.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/TermsAndConditions.java @@ -16,6 +16,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -36,8 +37,8 @@ public class TermsAndConditions extends BaseEntity { private Timestamp createdAt; @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("content", content); details.put("type", type); return details; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/User.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/User.java index 8583c72091..2b5fb741aa 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/User.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/User.java @@ -13,6 +13,7 @@ import java.sql.Timestamp; import java.util.HashMap; +import java.util.Map; import java.util.Set; @Getter @@ -54,23 +55,23 @@ public class User extends CreatedModifiedAtEntity implements ISoftDeletable { @Transient private boolean deleted; - public boolean isDeleted() { - return deletedAt != null; - } - @Transient private boolean isSoftDeleteOperation; @Transient private String fullName; + public boolean isDeleted() { + return deletedAt != null; + } + public String getFullName() { return firstName + " " + lastName; } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("userEmail", email); details.put("userOrganisation", organisation); details.put("deleted", isDeleted()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAccepted.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAccepted.java index 1e1f352256..84ace9fa27 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAccepted.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/UserTermsAccepted.java @@ -14,6 +14,7 @@ import java.sql.Timestamp; import java.time.Instant; import java.util.HashMap; +import java.util.Map; @Getter @Setter @@ -42,8 +43,8 @@ public boolean isValid() { } @Override - public HashMap getDetailsForAudit() { - var details = new HashMap(); + public Map getDetailsForAudit() { + Map details = new HashMap<>(); details.put("userId", getUser().getId()); details.put("termsAndConditions", getTermsAndConditions().getId()); details.put("acceptedAt", getAcceptedAt()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/base/BaseEntity.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/base/BaseEntity.java index 93db41b6aa..1f7af4d2b7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/base/BaseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/base/BaseEntity.java @@ -10,6 +10,7 @@ import uk.gov.hmcts.reform.preapi.entities.listeners.AuditListener; import java.util.HashMap; +import java.util.Map; import java.util.UUID; @MappedSuperclass @@ -29,7 +30,7 @@ public void prePersist() { } } - public HashMap getDetailsForAudit() { + public Map getDetailsForAudit() { return new HashMap<>(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/AuditListener.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/AuditListener.java index ed6b28a9c7..9f0c8a36a3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/AuditListener.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/AuditListener.java @@ -29,10 +29,8 @@ public class AuditListener { private final HttpServletRequest request; private final ObjectMapper mapper = new ObjectMapper(); - public AuditListener( - @Lazy AuditRepository auditRepository, - @Lazy HttpServletRequest request - ) { + public AuditListener(@Lazy AuditRepository auditRepository, + @Lazy HttpServletRequest request) { this.auditRepository = auditRepository; this.request = request; } @@ -60,7 +58,7 @@ private void audit(BaseEntity entity, AuditAction action) { if (entity.getClass() == Audit.class) { return; } - var audit = new Audit(); + Audit audit = new Audit(); audit.setId(UUID.randomUUID()); audit.setActivity(action.toString()); audit.setCategory(entity.getClass().getSimpleName()); @@ -70,7 +68,7 @@ private void audit(BaseEntity entity, AuditAction action) { audit.setSource(AuditLogSource.AUTO); audit.setAuditDetails(mapper.valueToTree(entity.getDetailsForAudit())); - var userId = getUserIdFromRequestHeader(); + UUID userId = getUserIdFromRequestHeader(); if (userId == null) { userId = getUserIdFromContext(); } @@ -82,17 +80,17 @@ private void audit(BaseEntity entity, AuditAction action) { } private static String getTableName(BaseEntity entity) { - var entityClass = entity.getClass(); - Table t = entityClass.getAnnotation(Table.class); - if (t == null) { + Class entityClass = entity.getClass(); + Table table = entityClass.getAnnotation(Table.class); + if (table == null) { throw new UnauditableTableException(entityClass.toString()); } - return t.name(); + return table.name(); } private UUID getUserIdFromRequestHeader() { try { - var xUserId = request.getHeader(X_USER_ID_HEADER); + String xUserId = request.getHeader(X_USER_ID_HEADER); return UUID.fromString(xUserId); } catch (Exception e) { return null; @@ -104,7 +102,7 @@ protected UUID getUserIdFromContext() { return null; } return auth.isAppUser() - ? (auth.getAppAccess() != null ? auth.getAppAccess().getId() : null) - : (auth.getPortalAccess() != null ? auth.getPortalAccess().getId() : null); + ? auth.getAppAccess() != null ? auth.getAppAccess().getId() : null + : auth.getPortalAccess() != null ? auth.getPortalAccess().getId() : null; } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/RecordingListener.java b/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/RecordingListener.java index c85096288d..4488c99a49 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/RecordingListener.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/entities/listeners/RecordingListener.java @@ -9,10 +9,13 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.preapi.email.EmailServiceFactory; +import uk.gov.hmcts.reform.preapi.email.IEmailService; import uk.gov.hmcts.reform.preapi.entities.Recording; +import uk.gov.hmcts.reform.preapi.entities.ShareBooking; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.media.storage.AzureFinalStorageService; +import java.util.List; import java.util.Set; import java.util.stream.Stream; @@ -39,37 +42,38 @@ public void setDurationBeforePersist(Recording recording) { } @PostPersist + @SuppressWarnings("PMD.AvoidLiteralsInIfCondition") @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void onRecordingCreated(Recording r) { - log.info("onRecordingCreated: Recording({})", r.getId()); + public void onRecordingCreated(Recording recording) { + log.info("onRecordingCreated: Recording({})", recording.getId()); if (!emailServiceFactory.isEnabled()) { return; } try { - var shares = r.getCaptureSession().getBooking().getShares() + List shares = recording.getCaptureSession().getBooking().getShares() .stream() .filter(s -> !s.isDeleted()) .toList(); - var emailService = emailServiceFactory.getEnabledEmailService(); + IEmailService emailService = emailServiceFactory.getEnabledEmailService(); shares.forEach(share -> { if (Stream.ofNullable(share.getBooking().getCaptureSessions()) .flatMap(Set::stream) .anyMatch(c -> c.getStatus().equals(RecordingStatus.RECORDING_AVAILABLE))) { - if (r.getVersion() > 1) { + if (recording.getVersion() > 1) { emailService.recordingEdited( - share.getSharedWith(), r.getCaptureSession().getBooking().getCaseId()); + share.getSharedWith(), recording.getCaptureSession().getBooking().getCaseId()); } else { emailService.recordingReady( - share.getSharedWith(), r.getCaptureSession().getBooking().getCaseId()); + share.getSharedWith(), recording.getCaptureSession().getBooking().getCaseId()); } } } ); } catch (Exception e) { - log.error("Failed to notify users of recording ready for recording: " + r.getId()); + log.error("Failed to notify users of recording ready for recording: " + recording.getId()); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/AssetFilesNotFoundException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/AssetFilesNotFoundException.java index 7b74682b6b..957eae46c2 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/AssetFilesNotFoundException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/AssetFilesNotFoundException.java @@ -1,8 +1,10 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; import java.util.UUID; public class AssetFilesNotFoundException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579141837456533851L; public AssetFilesNotFoundException(UUID id) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/BadRequestException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/BadRequestException.java index 1662ac21a3..708a3dfa29 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/BadRequestException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/BadRequestException.java @@ -1,10 +1,16 @@ package uk.gov.hmcts.reform.preapi.exception; -public class BadRequestException extends RuntimeException { +import java.io.Serial; +public class BadRequestException extends RuntimeException { + @Serial private static final long serialVersionUID = 6679241837356553851L; public BadRequestException(String message) { super(message); } + + public BadRequestException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/CommandExecutionException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/CommandExecutionException.java index 1a572e6d0b..a70ec1ee75 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/CommandExecutionException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/CommandExecutionException.java @@ -1,6 +1,11 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class CommandExecutionException extends RuntimeException { + @Serial + private static final long serialVersionUID = 1L; + public CommandExecutionException(String message) { super(message); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ConflictException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ConflictException.java index f7d7e18798..e5cbde7735 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ConflictException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ConflictException.java @@ -1,13 +1,19 @@ package uk.gov.hmcts.reform.preapi.exception; -public class ConflictException extends RuntimeException { +import java.io.Serial; +public class ConflictException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533854L; public ConflictException(String message) { super("Conflict: " + message); } + public ConflictException(String message, Throwable cause) { + super("Conflict: " + message, cause); + } + public ConflictException(Exception exception) { super(exception); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/EmailFailedToSendException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/EmailFailedToSendException.java index 6faeba2b55..43b61fbe1f 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/EmailFailedToSendException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/EmailFailedToSendException.java @@ -1,9 +1,16 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class EmailFailedToSendException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579141936356533851L; public EmailFailedToSendException(String email) { super("Failed to send email to: " + email); } + + public EmailFailedToSendException(String email, Exception cause) { + super("Failed to send email to: " + email, cause); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ForbiddenException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ForbiddenException.java index 1df6cb4bff..1f1ad4049d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ForbiddenException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ForbiddenException.java @@ -1,7 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; -public class ForbiddenException extends RuntimeException { +import java.io.Serial; +public class ForbiddenException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826146533854L; public ForbiddenException(String message) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/GlobalControllerExceptionHandler.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/GlobalControllerExceptionHandler.java index 1f7d9991a3..c32586f5d6 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/GlobalControllerExceptionHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/GlobalControllerExceptionHandler.java @@ -10,6 +10,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.util.MultiValueMap; +import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -17,9 +19,11 @@ import java.util.Arrays; import java.util.HashMap; +import java.util.Map; -@ControllerAdvice @Slf4j +@ControllerAdvice +@SuppressWarnings({"PMD.CouplingBetweenObjects", "PMD.ShortVariable", "PMD.TooManyMethods"}) public class GlobalControllerExceptionHandler { private static final String MESSAGE = "message"; @@ -70,10 +74,10 @@ ResponseEntity requestedPageOutOfRangeException(final RequestedPageOutOf ResponseEntity onMethodArgumentNotValidException(final MethodArgumentNotValidException e) throws JsonProcessingException { - var error = new HashMap(); - HttpHeaders responseHeaders = new HttpHeaders(); + Map error = new HashMap<>(); + MultiValueMap responseHeaders = new HttpHeaders(); responseHeaders.set(CONTENT_TYPE, APPLICATION_JSON); - for (var fieldError : e.getBindingResult().getFieldErrors()) { + for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { error.put(fieldError.getField(), fieldError.getDefaultMessage()); } @@ -209,8 +213,8 @@ ResponseEntity unsupportedMediaTypeException(final UnsupportedMediaTypeE private static ResponseEntity getResponseEntity(String message, HttpStatus status) throws JsonProcessingException { - HashMap error = new HashMap<>(); - HttpHeaders responseHeaders = new HttpHeaders(); + Map error = new HashMap<>(); + MultiValueMap responseHeaders = new HttpHeaders(); responseHeaders.set(CONTENT_TYPE, APPLICATION_JSON); error.put(MESSAGE, message); return new ResponseEntity<>(new ObjectMapper().writeValueAsString(error), diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ImmutableDataException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ImmutableDataException.java index 2544ccf04f..57bc996d32 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ImmutableDataException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ImmutableDataException.java @@ -1,7 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; -public class ImmutableDataException extends RuntimeException { +import java.io.Serial; +public class ImmutableDataException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941126346533850L; public ImmutableDataException(String message) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventCleanupException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventCleanupException.java new file mode 100644 index 0000000000..15df7efa63 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventCleanupException.java @@ -0,0 +1,12 @@ +package uk.gov.hmcts.reform.preapi.exception; + +import java.io.Serial; + +public class LiveEventCleanupException extends RuntimeException { + @Serial + private static final long serialVersionUID = 1L; + + public LiveEventCleanupException(String message, Exception cause) { + super(message, cause); + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventNotRunningException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventNotRunningException.java index 9a75a30b94..059febfefb 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventNotRunningException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/LiveEventNotRunningException.java @@ -1,6 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class LiveEventNotRunningException extends RuntimeException { + @Serial private static final long serialVersionUID = 6379141826356533851L; public LiveEventNotRunningException(String id) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/NotFoundException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/NotFoundException.java index cb2f52eb51..68c7f8c363 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/NotFoundException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/NotFoundException.java @@ -1,13 +1,19 @@ package uk.gov.hmcts.reform.preapi.exception; -public class NotFoundException extends RuntimeException { +import java.io.Serial; +public class NotFoundException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533850L; public NotFoundException(String message) { super("Not found: " + message); } + public NotFoundException(String message, Throwable cause) { + super("Not found: " + message, cause); + } + public NotFoundException(Exception exception) { super(exception); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/PathPayloadMismatchException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/PathPayloadMismatchException.java index d365168a94..f9f73e9d06 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/PathPayloadMismatchException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/PathPayloadMismatchException.java @@ -1,6 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class PathPayloadMismatchException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533851L; public PathPayloadMismatchException(String pathName, String modelPropertyName) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/RequestedPageOutOfRangeException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/RequestedPageOutOfRangeException.java index 14995fba3a..94afdefc08 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/RequestedPageOutOfRangeException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/RequestedPageOutOfRangeException.java @@ -1,6 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class RequestedPageOutOfRangeException extends RuntimeException { + @Serial private static final long serialVersionUID = 1579941826346533851L; public RequestedPageOutOfRangeException(int requestedPage, int maxPage) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInDeletedStateException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInDeletedStateException.java index 44c3fd9050..80c76ad5eb 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInDeletedStateException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInDeletedStateException.java @@ -1,6 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class ResourceInDeletedStateException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533851L; public ResourceInDeletedStateException(String className, String id) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInWrongStateException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInWrongStateException.java index b9402d9482..e31c1b4d16 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInWrongStateException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/ResourceInWrongStateException.java @@ -2,9 +2,11 @@ import uk.gov.hmcts.reform.preapi.enums.CaseState; +import java.io.Serial; import java.util.UUID; public class ResourceInWrongStateException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941126346533851L; public ResourceInWrongStateException(String className, String id, String currentState, String expectedState) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnauditableTableException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnauditableTableException.java index 3c023615f8..db39cc37aa 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnauditableTableException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnauditableTableException.java @@ -1,7 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; -public class UnauditableTableException extends RuntimeException { +import java.io.Serial; +public class UnauditableTableException extends RuntimeException { + @Serial private static final long serialVersionUID = 6519941826346533854L; public UnauditableTableException(String className) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnknownServerException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnknownServerException.java index 4155498472..6bdbee63c0 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnknownServerException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnknownServerException.java @@ -1,13 +1,19 @@ package uk.gov.hmcts.reform.preapi.exception; -public class UnknownServerException extends RuntimeException { +import java.io.Serial; +public class UnknownServerException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533852L; public UnknownServerException(String message) { super("Unknown Server Exception: " + message); } + public UnknownServerException(String message, Throwable cause) { + super("Unknown Server Exception: " + message, cause); + } + public UnknownServerException(Exception exception) { super(exception); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnprocessableContentException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnprocessableContentException.java index 5a4318ddad..b99911b717 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnprocessableContentException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnprocessableContentException.java @@ -1,6 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; +import java.io.Serial; + public class UnprocessableContentException extends RuntimeException { + @Serial private static final long serialVersionUID = 6579941826346533422L; public UnprocessableContentException(String message) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnsupportedMediaTypeException.java b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnsupportedMediaTypeException.java index edd5c93869..4c9dcc501d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnsupportedMediaTypeException.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/exception/UnsupportedMediaTypeException.java @@ -1,7 +1,9 @@ package uk.gov.hmcts.reform.preapi.exception; -public class UnsupportedMediaTypeException extends RuntimeException { +import java.io.Serial; +public class UnsupportedMediaTypeException extends RuntimeException { + @Serial private static final long serialVersionUID = 6679231437391522851L; public UnsupportedMediaTypeException(String message) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoder.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoder.java index ce605d71b9..0cb2d54cd3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoder.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoder.java @@ -4,6 +4,7 @@ import feign.Response; import feign.codec.ErrorDecoder; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import uk.gov.hmcts.reform.preapi.exception.ConflictException; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; import uk.gov.hmcts.reform.preapi.media.dto.MkErrorResponse; @@ -19,21 +20,22 @@ public class FeignErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { if (response.body() != null) { - MkErrorResponse errorResponse = null; + MkErrorResponse errorResponse; try (InputStream bodyIs = response.body().asInputStream()) { ObjectMapper mapper = new ObjectMapper(); errorResponse = mapper.readValue(bodyIs, MkErrorResponse.class); } catch (IOException e) { return new Exception(e.getMessage()); } - if (response.status() == 404) { + if (response.status() == HttpStatus.NOT_FOUND.value()) { return new NotFoundException(errorResponse.getError().getDetail() != null ? errorResponse.getError().getDetail() : "Not found"); } // MK API sometimes returns a 400 instead of a 409 when the live event already exists - if ((response.status() == 400 && errorResponse.getError().getDetail().contains(" already exists.")) - || response.status() == 409) { + if ((response.status() == HttpStatus.BAD_REQUEST.value() + && errorResponse.getError().getDetail().contains(" already exists.")) + || response.status() == HttpStatus.CONFLICT.value()) { return new ConflictException(errorResponse.getError().getDetail()); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKind.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKind.java index 50632035fb..d3292153d8 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKind.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKind.java @@ -86,6 +86,12 @@ @Slf4j @Service +@SuppressWarnings({ + "PMD.CouplingBetweenObjects", + "PMD.CyclomaticComplexity", + "PMD.ExcessiveImports", + "PMD.TooManyMethods", +}) public class MediaKind implements IMediaService { private final String ingestStorageAccount; private final String finalStorageAccount; @@ -141,14 +147,14 @@ public PlaybackDTO playAsset(String assetName, String userId) throws Interrupted // todo check asset has files createContentKeyPolicy(userId, symmetricKey); assertStreamingPolicyExists(userId); - var streamingLocatorName = refreshStreamingLocatorForUser(userId, assetName); + String streamingLocatorName = refreshStreamingLocatorForUser(userId, assetName); - var hostName = "https://" + assertStreamingEndpointExists(DEFAULT_VOD_STREAMING_ENDPOINT).getProperties().getHostName(); - var paths = mediaKindClient.getStreamingLocatorPaths(streamingLocatorName); + String hostName = "https://" + assertStreamingEndpointExists(DEFAULT_VOD_STREAMING_ENDPOINT).getProperties().getHostName(); + MkStreamingLocatorUrlPaths paths = mediaKindClient.getStreamingLocatorPaths(streamingLocatorName); - var dash = paths.getStreamingPaths().stream().filter(p -> p.getStreamingProtocol() == StreamingProtocol.Dash) + String dash = paths.getStreamingPaths().stream().filter(p -> p.getStreamingProtocol() == StreamingProtocol.Dash) .findFirst().map(p -> p.getPaths().getFirst()).orElse(null); - var hls = paths.getStreamingPaths().stream().filter(p -> p.getStreamingProtocol() == StreamingProtocol.Hls) + String hls = paths.getStreamingPaths().stream().filter(p -> p.getStreamingProtocol() == StreamingProtocol.Hls) .findFirst().map(p -> p.getPaths().getFirst()).orElse(null); if (dash == null && hls == null) { @@ -179,11 +185,11 @@ public GenerateAssetResponseDTO importAsset(GenerateAssetDTO generateAssetDTO, b generateAssetDTO.getDestinationContainer().toString(), true); - var fileName = (sourceIsFinalStorage ? azureFinalStorageService : azureIngestStorageService) + String fileName = (sourceIsFinalStorage ? azureFinalStorageService : azureIngestStorageService) .getMp4FileName(generateAssetDTO.getSourceContainer()); - var jobName = encodeFromMp4(generateAssetDTO.getTempAsset(), generateAssetDTO.getFinalAsset(), fileName); + String jobName = encodeFromMp4(generateAssetDTO.getTempAsset(), generateAssetDTO.getFinalAsset(), fileName); - var jobState = waitEncodeComplete(jobName, ENCODE_FROM_MP4_TRANSFORM); + JobState jobState = waitEncodeComplete(jobName, ENCODE_FROM_MP4_TRANSFORM); return new GenerateAssetResponseDTO( generateAssetDTO.getFinalAsset(), @@ -232,7 +238,8 @@ public String playLiveEvent(UUID liveEventId) throws InterruptedException { assertStreamingEndpointExists(DEFAULT_LIVE_STREAMING_ENDPOINT); assertStreamingLocatorExists(liveEventId); - var paths = mediaKindClient.listStreamingLocatorPaths(getSanitisedLiveEventId(liveEventId)); + MkStreamingLocatorUrlPaths paths = mediaKindClient + .listStreamingLocatorPaths(getSanitisedLiveEventId(liveEventId)); return parseLiveOutputUrlFromStreamingLocatorPaths(DEFAULT_LIVE_STREAMING_ENDPOINT, paths); } @@ -246,7 +253,7 @@ private MkLiveEvent getLiveEventMk(String liveEventName) { try { return mediaKindClient.getLiveEvent(liveEventName); } catch (NotFoundException e) { - throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName)); + throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName), e); } } @@ -260,7 +267,7 @@ public List getLiveEvents() { @Override @Transactional(dontRollbackOn = Exception.class) public void stopLiveEvent(CaptureSessionDTO captureSession, UUID recordingId) { - var captureSessionNoHyphen = getSanitisedLiveEventId(captureSession.getId()); + String captureSessionNoHyphen = getSanitisedLiveEventId(captureSession.getId()); cleanupStoppedLiveEvent(captureSessionNoHyphen); } @@ -269,7 +276,7 @@ public void stopLiveEvent(String liveEventId) { try { stopAndDeleteLiveEvent(liveEventId); } catch (NotFoundException e) { - // ignore + log.info("Live event {} not found", liveEventId); } } @@ -277,14 +284,15 @@ public void stopLiveEvent(String liveEventId) { @Transactional(dontRollbackOn = Exception.class) public RecordingStatus stopLiveEventAndProcess(CaptureSessionDTO captureSession, UUID recordingId) throws InterruptedException { - var captureSessionNoHyphen = getSanitisedLiveEventId(captureSession.getId()); + String captureSessionNoHyphen = getSanitisedLiveEventId(captureSession.getId()); cleanupStoppedLiveEvent(captureSessionNoHyphen); - var jobName = triggerProcessingStep1(captureSession, captureSessionNoHyphen, recordingId); + String jobName = triggerProcessingStep1(captureSession, captureSessionNoHyphen, recordingId); if (jobName == null) { return RecordingStatus.NO_RECORDING; } - var encodeFromIngestJobState = waitEncodeComplete(jobName, ENCODE_FROM_INGEST_TRANSFORM); + + JobState encodeFromIngestJobState = waitEncodeComplete(jobName, ENCODE_FROM_INGEST_TRANSFORM); telemetryClient.trackMetric(SENT_FOR_ENCODING, 1.0); @@ -292,16 +300,17 @@ public RecordingStatus stopLiveEventAndProcess(CaptureSessionDTO captureSession, return RecordingStatus.FAILURE; } - var jobName2 = triggerProcessingStep2(recordingId, false); + String jobName2 = triggerProcessingStep2(recordingId, false); if (jobName2 == null) { return RecordingStatus.FAILURE; } - var encodeFromMp4JobState = waitEncodeComplete(jobName2, ENCODE_FROM_MP4_TRANSFORM); + + JobState encodeFromMp4JobState = waitEncodeComplete(jobName2, ENCODE_FROM_MP4_TRANSFORM); if (encodeFromMp4JobState != JobState.FINISHED) { return RecordingStatus.FAILURE; } - var recordingStatus = verifyFinalAssetExists(recordingId); + RecordingStatus recordingStatus = verifyFinalAssetExists(recordingId); if (recordingStatus == RecordingStatus.RECORDING_AVAILABLE) { telemetryClient.trackMetric(AVAILABLE_IN_FINAL_STORAGE, 1.0); azureIngestStorageService.markContainerAsSafeToDelete(captureSession.getBookingId().toString()); @@ -322,7 +331,6 @@ public void cleanupStoppedLiveEvent(String liveEventId) { @Override public void deleteAllStreamingLocatorsAndContentKeyPolicies() { - getAllMkList(mediaKindClient::getStreamingLocators) .map(MkStreamingLocator::getName) .forEach(locatorName -> { @@ -346,7 +354,7 @@ public void deleteAllStreamingLocatorsAndContentKeyPolicies() { @Override public void startLiveEvent(CaptureSessionDTO captureSession) { - var liveEventName = getSanitisedLiveEventId(captureSession.getId()); + String liveEventName = getSanitisedLiveEventId(captureSession.getId()); createLiveEvent(captureSession); getLiveEventMk(liveEventName); @@ -366,7 +374,7 @@ private void startLiveEvent(String liveEventName) { try { mediaKindClient.startLiveEvent(liveEventName); } catch (NotFoundException e) { - throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName)); + throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName), e); } } @@ -382,9 +390,9 @@ public String triggerProcessingStep1(CaptureSessionDTO captureSession, String ca return null; } - var recordingNoHyphen = getSanitisedLiveEventId(recordingId); - var recordingTempAssetName = recordingNoHyphen + "_temp"; - var recordingAssetName = recordingNoHyphen + "_output"; + String recordingNoHyphen = getSanitisedLiveEventId(recordingId); + String recordingTempAssetName = recordingNoHyphen + "_temp"; + String recordingAssetName = recordingNoHyphen + "_output"; createAsset(recordingTempAssetName, captureSession, recordingId.toString(), false); createAsset(recordingAssetName, captureSession, recordingId.toString(), true); @@ -402,9 +410,9 @@ public String triggerProcessingStep2(UUID recordingId, boolean isImport) { return null; } - var recordingNoHyphen = getSanitisedLiveEventId(recordingId); - var recordingTempAssetName = recordingNoHyphen + "_temp"; - var recordingAssetName = recordingNoHyphen + "_output"; + String recordingNoHyphen = getSanitisedLiveEventId(recordingId); + String recordingTempAssetName = recordingNoHyphen + "_temp"; + String recordingAssetName = recordingNoHyphen + "_output"; azureIngestStorageService.markContainerAsProcessing(recordingId.toString()); return encodeFromMp4(recordingTempAssetName, recordingAssetName, filename); @@ -412,7 +420,7 @@ public String triggerProcessingStep2(UUID recordingId, boolean isImport) { @Override public RecordingStatus verifyFinalAssetExists(UUID recordingId) { - var recordingAssetName = getSanitisedLiveEventId(recordingId) + "_output"; + String recordingAssetName = getSanitisedLiveEventId(recordingId) + "_output"; if (!azureFinalStorageService.doesIsmFileExist(recordingId.toString())) { log.error("Final asset .ism file not found for asset [{}] in container [{}]", @@ -424,17 +432,17 @@ public RecordingStatus verifyFinalAssetExists(UUID recordingId) { @Override public RecordingStatus hasJobCompleted(String transformName, String jobName) { - var job = mediaKindClient.getJob(transformName, jobName); + MkJob job = mediaKindClient.getJob(transformName, jobName); return hasJobCompleted(job) && job.getProperties().getState() == JobState.FINISHED ? RecordingStatus.RECORDING_AVAILABLE - : (job.getProperties().getState() == JobState.ERROR || job.getProperties().getState() == JobState.CANCELED + : job.getProperties().getState() == JobState.ERROR || job.getProperties().getState() == JobState.CANCELED ? RecordingStatus.FAILURE - : RecordingStatus.PROCESSING); + : RecordingStatus.PROCESSING; } private boolean hasJobCompleted(MkJob job) { - var state = job.getProperties().getState(); - var jobName = job.getName(); + JobState state = job.getProperties().getState(); + String jobName = job.getName(); if (state.equals(JobState.ERROR)) { log.error("Job [{}] failed with error [{}]", @@ -450,18 +458,18 @@ private boolean hasJobCompleted(MkJob job) { } private String refreshStreamingLocatorForUser(String userId, String assetName) { - var now = OffsetDateTime.now(); - var streamingLocatorName = userId + "_" + assetName; + OffsetDateTime now = OffsetDateTime.now(); + String streamingLocatorName = userId + "_" + assetName; // check streaming locator is still valid try { - var locator = mediaKindClient.getStreamingLocator(streamingLocatorName); + MkStreamingLocator locator = mediaKindClient.getStreamingLocator(streamingLocatorName); if (locator.getProperties().getEndTime().toInstant().isAfter(now.toInstant())) { return streamingLocatorName; } mediaKindClient.deleteStreamingLocator(streamingLocatorName); } catch (NotFoundException e) { - // ignore + log.info("Streaming locator [{}] does not exist yet", streamingLocatorName); } mediaKindClient.createStreamingLocator( @@ -488,10 +496,10 @@ private String refreshStreamingLocatorForUser(String userId, String assetName) { private void assertStreamingPolicyExists(String defaultContentKeyPolicy) { try { - mediaKindClient.getStreamingPolicy(MediaKind.STREAMING_POLICY_CLEAR_KEY); + mediaKindClient.getStreamingPolicy(STREAMING_POLICY_CLEAR_KEY); } catch (NotFoundException e) { log.info("Streaming policy {} was not found. Creating streaming policy.", - MediaKind.STREAMING_POLICY_CLEAR_KEY + STREAMING_POLICY_CLEAR_KEY ); mediaKindClient.putStreamingPolicy( STREAMING_POLICY_CLEAR_KEY, @@ -550,7 +558,7 @@ private void stopAndDeleteLiveEvent(String liveEventName) { try { mediaKindClient.stopLiveEvent(liveEventName); } catch (NotFoundException e) { - throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName)); + throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName), e); } catch (FeignException.BadRequest e) { // live output still exists (only occurs on manually created live events) log.info("Skipped stopping live event. The live event will be cleaned up by deletion."); @@ -612,7 +620,7 @@ private String runEncodeTransform(String inputAssetName, String transformName, String fileName) { assertTransformExists(transformName); - var jobName = inputAssetName + "-" + LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); + String jobName = inputAssetName + "-" + LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); log.info("Creating job [{}]", jobName); mediaKindClient.putJob( transformName, @@ -644,12 +652,15 @@ private JobState waitEncodeComplete(String jobName, String transformName) throws } private MkStreamingEndpoint checkStreamingEndpointReady(MkStreamingEndpoint endpoint) throws InterruptedException { - var endpointName = endpoint.getName(); - while (endpoint.getProperties().getResourceState() != MkStreamingEndpointProperties.ResourceState.Running) { + MkStreamingEndpoint streamingEndpoint = endpoint; + String endpointName = endpoint.getName(); + + while (streamingEndpoint.getProperties().getResourceState() + != MkStreamingEndpointProperties.ResourceState.Running) { TimeUnit.MILLISECONDS.sleep(2000); // wait 2 seconds - endpoint = mediaKindClient.getStreamingEndpointByName(endpointName); + streamingEndpoint = mediaKindClient.getStreamingEndpointByName(endpointName); } - return endpoint; + return streamingEndpoint; } private void createLiveOutput(String liveEventName, String liveOutputName) { @@ -670,9 +681,9 @@ private void createLiveOutput(String liveEventName, String liveOutputName) { .build() ); } catch (ConflictException e) { - throw new ConflictException("Live Output: " + liveOutputName); + throw new ConflictException("Live Output: " + liveOutputName, e); } catch (NotFoundException e) { - throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName)); + throw new NotFoundException(getLiveEventNotFoundExceptionMessage(liveEventName), e); } } @@ -686,6 +697,7 @@ private void createAsset(String assetName, isFinal); } + @SuppressWarnings("PMD.UnusedPrivateMethod") private void createAsset(String assetName, String description, String containerName, @@ -703,12 +715,13 @@ private void createAsset(String assetName, .build() ); } catch (ConflictException e) { - throw new ConflictException("Asset: " + assetName); + throw new ConflictException("Asset: " + assetName, e); } } + @SuppressWarnings("PMD.AvoidUsingHardCodedIP") private void createLiveEvent(CaptureSessionDTO captureSession) { - var accessToken = UUID.randomUUID(); + UUID accessToken = UUID.randomUUID(); try { mediaKindClient.putLiveEvent( getSanitisedLiveEventId(captureSession.getId()), @@ -783,10 +796,11 @@ protected interface GetListFunction { MkGetListResponse get(int skip); } + @SuppressWarnings("PMD.ExceptionAsFlowControl") private void assertLiveEventExists(UUID liveEventId) { - var sanitisedLiveEventId = getSanitisedLiveEventId(liveEventId); + String sanitisedLiveEventId = getSanitisedLiveEventId(liveEventId); try { - var liveEvent = mediaKindClient.getLiveEvent(sanitisedLiveEventId); + MkLiveEvent liveEvent = mediaKindClient.getLiveEvent(sanitisedLiveEventId); if (!liveEvent.getProperties().getResourceState().equals(LiveEventResourceState.RUNNING.toString())) { throw new LiveEventNotRunningException(sanitisedLiveEventId); } @@ -798,14 +812,14 @@ private void assertLiveEventExists(UUID liveEventId) { private MkStreamingEndpoint assertStreamingEndpointExists(String endpointName) throws InterruptedException { try { - var endpoint = mediaKindClient.getStreamingEndpointByName(endpointName); + MkStreamingEndpoint endpoint = mediaKindClient.getStreamingEndpointByName(endpointName); if (endpoint.getProperties().getResourceState() != MkStreamingEndpointProperties.ResourceState.Running) { mediaKindClient.startStreamingEndpoint(endpointName); endpoint = checkStreamingEndpointReady(endpoint); } return endpoint; } catch (NotFoundException e) { - var endpoint = mediaKindClient.createStreamingEndpoint( + MkStreamingEndpoint endpoint = mediaKindClient.createStreamingEndpoint( endpointName, MkStreamingEndpoint.builder() .location(LOCATION) @@ -830,7 +844,7 @@ private MkStreamingEndpoint assertStreamingEndpointExists(String endpointName) t } private void assertStreamingLocatorExists(UUID liveEventId) { - var sanitisedLiveEventId = getSanitisedLiveEventId(liveEventId); + String sanitisedLiveEventId = getSanitisedLiveEventId(liveEventId); try { mediaKindClient.getStreamingLocator(sanitisedLiveEventId); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKindAccountsClient.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKindAccountsClient.java index a0a74aaa4f..07c464f7a4 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKindAccountsClient.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaKindAccountsClient.java @@ -10,6 +10,7 @@ url = "${mediakind.accountsApi}", configuration = MediaKindClientConfiguration.class ) +@SuppressWarnings("PMD.ImplicitFunctionalInterface") public interface MediaKindAccountsClient { @GetMapping("/subscriptions/${mediakind.subscription-id}/storage") MkStorageAccounts getStorageAccounts(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaResourcesHelper.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaResourcesHelper.java index eda982a92d..a5051cafaf 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaResourcesHelper.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/MediaResourcesHelper.java @@ -2,6 +2,7 @@ import java.util.UUID; +@SuppressWarnings("PMD.AbstractClassWithoutAbstractMethod") public abstract class MediaResourcesHelper { public static String getSanitisedLiveEventId(UUID liveEventId) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/dto/MkStreamingEndpointProperties.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/dto/MkStreamingEndpointProperties.java index 84d7e49cea..e6ffdc30e5 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/dto/MkStreamingEndpointProperties.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/dto/MkStreamingEndpointProperties.java @@ -22,6 +22,7 @@ public class MkStreamingEndpointProperties { private MkStreamingEndpointSku sku; private String hostName; + @SuppressWarnings("PMD.UnusedPrivateField") public enum CdnProviderEnum { EMPTY(""), StandardAkamai("StandardAkamai"); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/EditInstructions.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/EditInstructions.java index 07a7a87828..9b9231d4e9 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/EditInstructions.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/EditInstructions.java @@ -19,7 +19,7 @@ public static EditInstructions fromJson(String editInstructions) { try { return new ObjectMapper().readValue(editInstructions, EditInstructions.class); } catch (Exception e) { - throw new UnknownServerException("Unable to read edit instructions"); + throw new UnknownServerException("Unable to read edit instructions", e); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/FfmpegService.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/FfmpegService.java index 2277b27b58..a2d98f8ca7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/FfmpegService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/FfmpegService.java @@ -14,8 +14,11 @@ import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -46,15 +49,16 @@ public FfmpegService(AzureIngestStorageService azureIngestStorageService, @Override public void performEdit(UUID newRecordingId, EditRequest request) { - var inputFileName = request.getSourceRecording().getFilename(); - var outputFileName = newRecordingId + ".mp4"; + String inputFileName = request.getSourceRecording().getFilename(); if (inputFileName == null) { throw new NotFoundException("No file name provided"); } + String outputFileName = newRecordingId + ".mp4"; performCommandsForEdit(request, newRecordingId, inputFileName, outputFileName); } + @SuppressWarnings("PMD.AvoidLiteralsInIfCondition") private void performCommandsForEdit(final EditRequest request, final UUID newRecordingId, final String inputFileName, @@ -95,7 +99,7 @@ private void performCommandsForEdit(final EditRequest request, runFfmpegConcatCommand(request.getId(), concatCommand, outputFileName); final long ffmpegEnd = System.currentTimeMillis(); - log.info("All ffmpeg commands completed in {} ms", (ffmpegEnd - ffmpegStart)); + log.info("All ffmpeg commands completed in {} ms", ffmpegEnd - ffmpegStart); uploadOutputFile(newRecordingId, outputFileName, filesToDelete); } finally { @@ -116,7 +120,7 @@ private void runFfmpegCommand(final UUID requestId, } log.info("Successfully applied edit instructions to: {} and created output: {}", inputFileName, outputFileName); final long ffmpegEnd = System.currentTimeMillis(); - log.info("Ffmpeg completed in {} ms", (ffmpegEnd - ffmpegStart)); + log.info("Ffmpeg completed in {} ms", ffmpegEnd - ffmpegStart); } private void runFfmpegConcatCommand(final UUID requestId, final CommandLine command, final String outputFileName) { @@ -127,7 +131,7 @@ private void runFfmpegConcatCommand(final UUID requestId, final CommandLine comm } log.info("Successfully applied ffmpeg concat command and created output: {}", outputFileName); final long ffmpegEnd = System.currentTimeMillis(); - log.info("Ffmpeg concat completed in {} ms", (ffmpegEnd - ffmpegStart)); + log.info("Ffmpeg concat completed in {} ms", ffmpegEnd - ffmpegStart); } public void cleanup(final List files) { @@ -165,7 +169,7 @@ public Duration getDurationFromMp4(final String containerName, final String file } private void deleteFile(String fileName) { - var file = new File(fileName); + File file = new File(fileName); try { if (file.delete()) { log.info("Successfully deleted file: {}", fileName); @@ -203,6 +207,7 @@ protected CommandLine generateConcatCommand(final String concatListFileName, fin .addArgument(outputFileName); } + @SuppressWarnings({"PMD.AvoidLiteralsInIfCondition", "PMD.LooseCoupling"}) protected LinkedHashMap generateMultiEditCommands(final EditRequest editRequest, final String inputFileName, final String outputFileName) { @@ -234,25 +239,28 @@ protected LinkedHashMap generateMultiEditCommands(final Edi } protected void generateConcatListFile(final Set segmentFiles, final String outputPath) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputPath))) { + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputPath), + StandardCharsets.UTF_8, + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING)) { for (String file : segmentFiles) { writer.write("file '" + file + "'"); writer.newLine(); } } catch (IOException e) { - throw new UnknownServerException("Error occurred when attempting to generate concat list file"); + throw new UnknownServerException("Error occurred when attempting to generate concat list file", e); } } private void downloadInputFile(final EditRequest request, - final String inputFileName) throws UnknownServerException { + final String inputFileName) { final long downloadStart = System.currentTimeMillis(); if (!azureFinalStorageService .downloadBlob(request.getSourceRecording().getId().toString(), inputFileName, inputFileName)) { throw new UnknownServerException("Error occurred when attempting to download file: " + inputFileName); } final long downloadEnd = System.currentTimeMillis(); - log.info("Download completed in {} ms", (downloadEnd - downloadStart)); + log.info("Download completed in {} ms", downloadEnd - downloadStart); } @@ -265,6 +273,6 @@ private void uploadOutputFile(final UUID newRecordingId, throw new UnknownServerException("Error occurred when attempting to upload file"); } final long uploadEnd = System.currentTimeMillis(); - log.info("Upload completed in {} ms", (uploadEnd - uploadStart)); + log.info("Upload completed in {} ms", uploadEnd - uploadStart); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/IEditingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/IEditingService.java index 570dafdf97..fcf830ac26 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/IEditingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/edit/IEditingService.java @@ -4,6 +4,7 @@ import java.util.UUID; +@SuppressWarnings("PMD.ImplicitFunctionalInterface") public interface IEditingService { void performEdit(UUID newRecordingId, EditRequest request); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureFinalStorageService.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureFinalStorageService.java index 720a26d0b8..52b686a964 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureFinalStorageService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureFinalStorageService.java @@ -3,10 +3,12 @@ import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.models.BlobItem; import com.azure.storage.blob.sas.BlobSasPermission; +import com.azure.storage.blob.specialized.BlobInputStream; import lombok.Cleanup; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.w3c.dom.Element; import uk.gov.hmcts.reform.preapi.config.AzureConfiguration; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; @@ -25,23 +27,24 @@ public AzureFinalStorageService(BlobServiceClient finalStorageClient, AzureConfi public Duration getRecordingDuration(UUID recordingId) { try { - var containerName = recordingId.toString(); - var mpdFile = tryGetBlobWithExtension(containerName, ".mpd"); + String containerName = recordingId.toString(); + BlobItem mpdFile = tryGetBlobWithExtension(containerName, ".mpd"); if (mpdFile == null) { return null; } - @Cleanup var inputStream = client.getBlobContainerClient(containerName).getBlobClient(mpdFile.getName()) + @Cleanup BlobInputStream inputStream = client.getBlobContainerClient(containerName) + .getBlobClient(mpdFile.getName()) .openInputStream(); - var contents = DocumentBuilderFactory + Element contents = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .parse(inputStream) .getDocumentElement(); contents.normalize(); - var duration = contents.getAttribute("mediaPresentationDuration"); + String duration = contents.getAttribute("mediaPresentationDuration"); return Duration.parse(duration); } catch (Exception e) { log.error("Something went wrong when attempting to get recording's duration: {}", e.getMessage()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureStorageService.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureStorageService.java index d8ea70e05d..75730f4a20 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureStorageService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureStorageService.java @@ -14,13 +14,16 @@ import uk.gov.hmcts.reform.preapi.exception.NotFoundException; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.time.OffsetDateTime; import java.util.HashMap; import java.util.Map; +import java.util.Optional; @Slf4j +@SuppressWarnings("PMD.AbstractClassWithoutAbstractMethod") public abstract class AzureStorageService { protected final BlobServiceClient client; protected final AzureConfiguration azureConfiguration; @@ -48,7 +51,7 @@ public boolean doesIsmFileExist(String containerName) { } public String getMp4FileName(String containerName) { - var blob = client.getBlobContainerClient(containerName) + Optional blob = client.getBlobContainerClient(containerName) .listBlobs() .stream() .filter(blobItem -> blobItem.getName().endsWith(".mp4")) @@ -96,11 +99,11 @@ public boolean downloadBlob(String containerName, String blobName, String downlo } public boolean uploadBlob(String localFileName, String containerName, String uploadFileName) { - try { - var file = new File(localFileName); - var containerClient = client.createBlobContainerIfNotExists(containerName); - var blobClient = containerClient.getBlobClient(uploadFileName); - blobClient.upload(new FileInputStream(file), file.length(), true); + File file = new File(localFileName); + try (InputStream inputStream = Files.newInputStream(file.toPath())) { + BlobContainerClient containerClient = client.createBlobContainerIfNotExists(containerName); + BlobClient blobClient = containerClient.getBlobClient(uploadFileName); + blobClient.upload(inputStream, file.length(), true); log.info("Successfully uploaded to ingest storage: {}/{}", containerName, uploadFileName); return true; } catch (IOException e) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureVodafoneStorageService.java b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureVodafoneStorageService.java index 995243bae7..ff159ae56c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureVodafoneStorageService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/media/storage/AzureVodafoneStorageService.java @@ -12,8 +12,9 @@ import uk.gov.hmcts.reform.preapi.config.AzureConfiguration; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.util.List; @Service @@ -25,7 +26,7 @@ public AzureVodafoneStorageService(BlobServiceClient vodafoneStorageClient, Azur } public List fetchBlobNames(String containerName) { - var containerClient = client.getBlobContainerClient(containerName); + BlobContainerClient containerClient = client.getBlobContainerClient(containerName); return containerClient.listBlobs().stream() .map(BlobItem::getName) @@ -34,7 +35,7 @@ public List fetchBlobNames(String containerName) { } public List fetchBlobNamesWithPrefix(String containerName, String prefix) { - var containerClient = client.getBlobContainerClient(containerName); + BlobContainerClient containerClient = client.getBlobContainerClient(containerName); return containerClient.listBlobs(new ListBlobsOptions().setPrefix(prefix), null) .stream() @@ -65,13 +66,12 @@ public void uploadCsvFile(String containerName, String blobPath, File file) { BlobContainerClient containerClient = client.getBlobContainerClient(containerName); BlobClient blobClient = containerClient.getBlobClient(blobPath); - try (FileInputStream fis = new FileInputStream(file)) { - blobClient.upload(fis, file.length(), true); + try (InputStream is = Files.newInputStream(file.toPath())) { + blobClient.upload(is, file.length(), true); log.info("Uploaded CSV to Azure: {}/{}", containerName, blobPath); } } catch (IOException e) { log.error("Failed to upload CSV file to Azure: {} - {}", blobPath, e.getMessage()); } } - } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/AppAccessRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/AppAccessRepository.java index 0622334142..b4b6572c30 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/AppAccessRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/AppAccessRepository.java @@ -7,16 +7,15 @@ import org.springframework.stereotype.Repository; import uk.gov.hmcts.reform.preapi.entities.AppAccess; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.UUID; @Repository -@SuppressWarnings({"PMD.MethodNamingConventions", "PMD.UseObjectForClearerAPI"}) +@SuppressWarnings("PMD.MethodNamingConventions") public interface AppAccessRepository extends JpaRepository { - ArrayList findAllByUser_IdAndDeletedAtNullAndUser_DeletedAtNull(UUID userId); + List findAllByUser_IdAndDeletedAtNullAndUser_DeletedAtNull(UUID userId); List findAllByUser_IdAndDeletedAtIsNotNull(UUID id); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java index 8e1222c492..ebd70a586a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/BookingRepository.java @@ -69,6 +69,7 @@ public interface BookingRepository extends JpaRepository { ))) """ ) + @SuppressWarnings("PMD.ExcessiveParameterList") Page searchBookingsBy( @Param("caseId") UUID caseId, @Param("reference") String reference, diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaptureSessionRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaptureSessionRepository.java index e0dca2c27e..4d2207450e 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaptureSessionRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaptureSessionRepository.java @@ -17,7 +17,6 @@ import java.util.UUID; @Repository -@SuppressWarnings("PMD.MethodNamingConventions") public interface CaptureSessionRepository extends JpaRepository { Optional findByIdAndDeletedAtIsNull(UUID captureSessionId); @@ -51,6 +50,7 @@ List findAllByStartedAtIsBetweenAndDeletedAtIsNull(Timestamp fro ) """ ) + @SuppressWarnings("PMD.ExcessiveParameterList") Page searchCaptureSessionsBy( @Param("caseReference") String caseReference, @Param("bookingId") UUID bookingId, diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaseRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaseRepository.java index bac44c1fe5..2bd8318515 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaseRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/CaseRepository.java @@ -38,6 +38,7 @@ Page searchCasesBy( Optional findByIdAndDeletedAtIsNull(UUID id); + @SuppressWarnings("PMD.MethodNamingConventions") List findAllByReferenceAndCourt_Id(String caseReference, UUID courtId); List findAllByReference(String reference); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/EditRequestRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/EditRequestRepository.java index 5613da1637..83def19f3d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/EditRequestRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/EditRequestRepository.java @@ -21,6 +21,7 @@ @Repository public interface EditRequestRepository extends JpaRepository { @NotNull + @Override @Lock(LockModeType.PESSIMISTIC_WRITE) @Query("select e from EditRequest e where e.id = ?1") @QueryHints({@QueryHint(name = "jakarta.persistence.lock.timeout", value = "0")}) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ParticipantRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ParticipantRepository.java index 2c1ffaae37..84e603f003 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ParticipantRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ParticipantRepository.java @@ -8,5 +8,6 @@ @Repository public interface ParticipantRepository extends JpaRepository { + @SuppressWarnings("PMD.MethodNamingConventions") boolean existsByIdAndCaseId_Id(UUID id, UUID caseId); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ShareBookingRepository.java b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ShareBookingRepository.java index 8fcb8e6665..2e4244b1b3 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ShareBookingRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/repositories/ShareBookingRepository.java @@ -13,6 +13,7 @@ import java.util.UUID; @Repository +@SuppressWarnings("PMD.MethodNamingConventions") public interface ShareBookingRepository extends JpaRepository { List findAllByDeletedAtIsNotNull(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/security/AuthorisationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/security/AuthorisationService.java index e1efe32f51..c11e045075 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/security/AuthorisationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/security/AuthorisationService.java @@ -9,8 +9,12 @@ import uk.gov.hmcts.reform.preapi.dto.CreateParticipantDTO; import uk.gov.hmcts.reform.preapi.dto.CreateRecordingDTO; import uk.gov.hmcts.reform.preapi.dto.CreateShareBookingDTO; +import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; import uk.gov.hmcts.reform.preapi.entities.Case; +import uk.gov.hmcts.reform.preapi.entities.EditRequest; +import uk.gov.hmcts.reform.preapi.entities.Participant; +import uk.gov.hmcts.reform.preapi.entities.Recording; import uk.gov.hmcts.reform.preapi.enums.CaseState; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.repositories.BookingRepository; @@ -21,10 +25,12 @@ import uk.gov.hmcts.reform.preapi.repositories.RecordingRepository; import uk.gov.hmcts.reform.preapi.security.authentication.UserAuthentication; +import java.util.Optional; import java.util.Set; import java.util.UUID; @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class AuthorisationService { private final BookingRepository bookingRepository; private final CaseRepository caseRepository; @@ -35,6 +41,8 @@ public class AuthorisationService { private final boolean enableMigratedData; + private static final String ROLE_LEVEL_2 = "ROLE_LEVEL_2"; + public AuthorisationService(BookingRepository bookingRepository, CaseRepository caseRepository, ParticipantRepository participantRepository, @@ -52,7 +60,7 @@ public AuthorisationService(BookingRepository bookingRepository, } private boolean isBookingSharedWithUser(UserAuthentication authentication, UUID bookingId) { - var booking = bookingRepository.findById(bookingId); + Optional booking = bookingRepository.findById(bookingId); return booking.isPresent() && (authentication.isAppUser() && booking.get().getCaseId().getCourt().getId().equals(authentication.getCourtId() @@ -70,7 +78,7 @@ public boolean hasBookingAccess(UserAuthentication authentication, UUID bookingI if (bookingId == null) { return true; } - var booking = bookingRepository.findById(bookingId).orElse(null); + Booking booking = bookingRepository.findById(bookingId).orElse(null); if (booking == null) { return true; } @@ -101,7 +109,7 @@ public boolean hasRecordingAccess(UserAuthentication authentication, UUID record if (recordingId == null || (enableMigratedData && authentication.isAdmin())) { return true; } - var entity = recordingRepository.findById(recordingId).orElse(null); + Recording entity = recordingRepository.findById(recordingId).orElse(null); return entity == null || hasCaptureSessionAccess(authentication, entity.getCaptureSession().getId()); } @@ -110,7 +118,7 @@ public boolean hasParticipantAccess(UserAuthentication authentication, UUID part return true; } - var participant = participantRepository.findById(participantId).orElse(null); + Participant participant = participantRepository.findById(participantId).orElse(null); return participant == null || hasCaseAccess(authentication, participant.getCaseId().getId()); } @@ -137,7 +145,7 @@ public boolean hasEditRequestAccess(UserAuthentication authentication, UUID id) return true; } try { - var request = editRequestRepository.findByIdNotLocked(id).orElse(null); + EditRequest request = editRequestRepository.findByIdNotLocked(id).orElse(null); return request == null || hasRecordingAccess(authentication, request.getSourceRecording().getId()); } catch (Exception e) { return false; @@ -201,6 +209,6 @@ public boolean canUpdateCaseState(UserAuthentication authentication, CreateCaseD .map(c -> (dto.getState() == null && c.getState() == CaseState.OPEN) || c.getState() == dto.getState()) .orElse(true) || authentication.isAdmin() - || authentication.hasRole("ROLE_LEVEL_2"); + || authentication.hasRole(ROLE_LEVEL_2); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/security/authentication/UserAuthentication.java b/src/main/java/uk/gov/hmcts/reform/preapi/security/authentication/UserAuthentication.java index 273c7fb0d2..aeb5d76906 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/security/authentication/UserAuthentication.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/security/authentication/UserAuthentication.java @@ -6,12 +6,16 @@ import uk.gov.hmcts.reform.preapi.entities.AppAccess; import uk.gov.hmcts.reform.preapi.entities.PortalAccess; +import java.io.Serial; import java.util.Collection; import java.util.List; import java.util.UUID; @Getter public class UserAuthentication extends AbstractAuthenticationToken { + @Serial + private static final long serialVersionUID = 1L; + private final UUID userId; private final String email; private final AppAccess appAccess; @@ -22,6 +26,9 @@ public class UserAuthentication extends AbstractAuthenticationToken { private final boolean appUser; private final List sharedBookings; + private static final String ROLE_SUPER_USER = "ROLE_SUPER_USER"; + private static final String ROLE_LEVEL_1 = "ROLE_LEVEL_1"; + public UserAuthentication( AppAccess access, Collection authorities @@ -36,9 +43,9 @@ public UserAuthentication( appUser = true; portalUser = false; admin = authorities.stream().anyMatch(a -> - a.getAuthority().equals("ROLE_SUPER_USER") - || a.getAuthority().equals("ROLE_LEVEL_1")); - setAuthenticated(true); + a.getAuthority().equals(ROLE_SUPER_USER) + || a.getAuthority().equals(ROLE_LEVEL_1)); + super.setAuthenticated(true); } public UserAuthentication( @@ -56,7 +63,7 @@ public UserAuthentication( appUser = false; portalUser = true; admin = false; - setAuthenticated(true); + super.setAuthenticated(true); } public boolean hasRole(String role) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/security/filter/XUserIdFilter.java b/src/main/java/uk/gov/hmcts/reform/preapi/security/filter/XUserIdFilter.java index 00b29551e8..6d443c4c82 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/security/filter/XUserIdFilter.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/security/filter/XUserIdFilter.java @@ -6,6 +6,8 @@ import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.Cleanup; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.server.PathContainer; @@ -18,6 +20,7 @@ import uk.gov.hmcts.reform.preapi.security.service.UserAuthenticationService; import java.io.IOException; +import java.io.PrintWriter; import java.util.Arrays; import static uk.gov.hmcts.reform.preapi.config.OpenAPIConfiguration.X_USER_ID_HEADER; @@ -27,14 +30,16 @@ public class XUserIdFilter extends GenericFilterBean { private final UserAuthenticationService userAuthenticationService; + @Autowired public XUserIdFilter(UserAuthenticationService userAuthenticationService) { + super(); this.userAuthenticationService = userAuthenticationService; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - var request = (HttpServletRequest) servletRequest; + HttpServletRequest request = (HttpServletRequest) servletRequest; if (!applyAuth(request)) { filterChain.doFilter(servletRequest, servletResponse); @@ -47,7 +52,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } try { - var id = request.getHeader(X_USER_ID_HEADER); + String id = request.getHeader(X_USER_ID_HEADER); Authentication authentication = userAuthenticationService.loadAppUserById(id); SecurityContextHolder.getContext().setAuthentication(authentication); } catch (Exception e) { @@ -80,24 +85,19 @@ private boolean applyAuth(HttpServletRequest request) { } // POST - if (request.getMethod().equals(HttpMethod.POST.toString()) - && Arrays.stream(SecurityConfig.PERMITTED_URIS_POST) + return !request.getMethod().equals(HttpMethod.POST.toString()) + || Arrays.stream(SecurityConfig.PERMITTED_URIS_POST) .map(parser::parse) .toList() .stream() - .anyMatch(pattern -> pattern.matches(PathContainer.parsePath(request.getRequestURI())))) { - return false; - } - - return true; + .noneMatch(pattern -> pattern.matches(PathContainer.parsePath(request.getRequestURI()))); } - private void writeErrorResponse(Exception e, HttpServletResponse response) throws IOException { + private void writeErrorResponse(Exception exception, HttpServletResponse response) throws IOException { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType(MediaType.APPLICATION_JSON_VALUE); - var writer = response.getWriter(); - writer.print("{\"message\": \"" + e.getMessage() + "\"}"); + @Cleanup PrintWriter writer = response.getWriter(); + writer.print("{\"message\": \"" + exception.getMessage() + "\"}"); writer.flush(); - writer.close(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/security/service/UserAuthenticationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/security/service/UserAuthenticationService.java index c82d4742fa..29ac3279bd 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/security/service/UserAuthenticationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/security/service/UserAuthenticationService.java @@ -71,7 +71,7 @@ public Optional validateUser(String accessId) { return Optional.empty(); } - var user = appAccessRepository + Optional user = appAccessRepository .findByIdValidUser(id) .map(this::getAuthentication); @@ -83,7 +83,7 @@ public Optional validateUser(String accessId) { private List getAuthorities(AppAccess access) { try { - var role = access.getRole().getName().toUpperCase(Locale.ROOT).replace(' ', '_'); + String role = access.getRole().getName().toUpperCase(Locale.ROOT).replace(' ', '_'); return List.of(new SimpleGrantedAuthority("ROLE_" + role)); } catch (Exception ignored) { return AuthorityUtils.NO_AUTHORITIES; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/AppAccessService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/AppAccessService.java index 1b860e9d7f..160fce4684 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/AppAccessService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/AppAccessService.java @@ -6,6 +6,9 @@ import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.preapi.dto.CreateAppAccessDTO; import uk.gov.hmcts.reform.preapi.entities.AppAccess; +import uk.gov.hmcts.reform.preapi.entities.Court; +import uk.gov.hmcts.reform.preapi.entities.Role; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.enums.UpsertResult; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; import uk.gov.hmcts.reform.preapi.exception.ResourceInDeletedStateException; @@ -16,6 +19,7 @@ import java.sql.Timestamp; import java.time.Instant; +import java.util.Optional; import java.util.UUID; @Service @@ -41,21 +45,21 @@ public AppAccessService( @Transactional public UpsertResult upsert(CreateAppAccessDTO createAppAccessDTO) { - var appAccess = appAccessRepository + Optional appAccess = appAccessRepository .findById(createAppAccessDTO.getId()); if (appAccess.isPresent() && appAccess.get().isDeleted()) { throw new ResourceInDeletedStateException("AppAccessDTO", createAppAccessDTO.getId().toString()); } - var user = userRepository.findByIdAndDeletedAtIsNull(createAppAccessDTO.getUserId()) + User user = userRepository.findByIdAndDeletedAtIsNull(createAppAccessDTO.getUserId()) .orElseThrow(() -> new NotFoundException("User: " + createAppAccessDTO.getUserId())); - var court = courtRepository.findById(createAppAccessDTO.getCourtId()) + Court court = courtRepository.findById(createAppAccessDTO.getCourtId()) .orElseThrow(() -> new NotFoundException("Court: " + createAppAccessDTO.getCourtId())); - var role = roleRepository.findById(createAppAccessDTO.getRoleId()) + Role role = roleRepository.findById(createAppAccessDTO.getRoleId()) .orElseThrow(() -> new NotFoundException("Role: " + createAppAccessDTO.getRoleId())); - var entity = appAccess.orElse(new AppAccess()); + AppAccess entity = appAccess.orElse(new AppAccess()); entity.setId(createAppAccessDTO.getId()); entity.setUser(user); entity.setCourt(court); @@ -72,8 +76,7 @@ public UpsertResult upsert(CreateAppAccessDTO createAppAccessDTO) { entity.setLastAccess(createAppAccessDTO.getLastActive()); appAccessRepository.save(entity); - var isUpdate = appAccess.isPresent(); - return isUpdate ? UpsertResult.UPDATED : UpsertResult.CREATED; + return appAccess.isPresent() ? UpsertResult.UPDATED : UpsertResult.CREATED; } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/AuditService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/AuditService.java index 3b00b9317d..7efec9a85d 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/AuditService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/AuditService.java @@ -27,7 +27,7 @@ public UpsertResult upsert(CreateAuditDTO createAuditDTO, @Nullable UUID created throw new ImmutableDataException(createAuditDTO.getId().toString()); } - var audit = new Audit(); + Audit audit = new Audit(); audit.setId(createAuditDTO.getId()); audit.setAuditDetails(createAuditDTO.getAuditDetails()); audit.setActivity(createAuditDTO.getActivity()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java index 875cd89f46..b36bf36757 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/BookingService.java @@ -38,7 +38,7 @@ import java.util.stream.Stream; @Service -@SuppressWarnings("PMD.SingularField") +@SuppressWarnings("PMD.CouplingBetweenObjects") public class BookingService { private final BookingRepository bookingRepository; @@ -93,15 +93,15 @@ public Page searchBy( List notStatuses, Pageable pageable ) { - var until = scheduledFor.isEmpty() + Timestamp until = scheduledFor.isEmpty() ? null : scheduledFor.map( t -> Timestamp.from(t.toInstant().plus(86399, ChronoUnit.SECONDS))) .orElse(null); - var auth = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()); - var authorisedBookings = auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings(); - var authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); + UserAuthentication auth = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); + List authorisedBookings = auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings(); + UUID authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); return bookingRepository .searchBookingsBy( @@ -122,7 +122,6 @@ public Page searchBy( .map(BookingDTO::new); } - @SuppressWarnings("PMD.CyclomaticComplexity") @Transactional @PreAuthorize("@authorisationService.hasUpsertAccess(authentication, #createBookingDTO)") public UpsertResult upsert(CreateBookingDTO createBookingDTO) { @@ -131,10 +130,10 @@ public UpsertResult upsert(CreateBookingDTO createBookingDTO) { throw new ResourceInDeletedStateException("BookingDTO", createBookingDTO.getId().toString()); } - var optBooking = bookingRepository.findById(createBookingDTO.getId()); - var bookingEntity = optBooking.orElse(new Booking()); + Optional optBooking = bookingRepository.findById(createBookingDTO.getId()); + Booking bookingEntity = optBooking.orElse(new Booking()); - var caseEntity = caseRepository.findByIdAndDeletedAtIsNull(createBookingDTO.getCaseId()) + Case caseEntity = caseRepository.findByIdAndDeletedAtIsNull(createBookingDTO.getCaseId()) .orElseThrow(() -> new NotFoundException("Case: " + createBookingDTO.getCaseId())); if (caseEntity.getState() != CaseState.OPEN) { @@ -157,7 +156,7 @@ public UpsertResult upsert(CreateBookingDTO createBookingDTO) { bookingEntity.setParticipants( Stream.ofNullable(createBookingDTO.getParticipants()) .flatMap(participants -> participants.stream().map(model -> { - var entity = participantRepository.findById(model.getId()).orElse(new Participant()); + Participant entity = participantRepository.findById(model.getId()).orElse(new Participant()); if (entity.getDeletedAt() != null) { throw new ResourceInDeletedStateException("Participant", entity.getId().toString()); @@ -174,9 +173,7 @@ public UpsertResult upsert(CreateBookingDTO createBookingDTO) { bookingEntity.setScheduledFor(createBookingDTO.getScheduledFor()); bookingRepository.save(bookingEntity); - - var isUpdate = optBooking.isPresent(); - return isUpdate ? UpsertResult.UPDATED : UpsertResult.CREATED; + return optBooking.isPresent() ? UpsertResult.UPDATED : UpsertResult.CREATED; } private boolean bookingAlreadyDeleted(UUID id) { @@ -186,7 +183,7 @@ private boolean bookingAlreadyDeleted(UUID id) { @Transactional @PreAuthorize("@authorisationService.hasBookingAccess(authentication, #id)") public void markAsDeleted(UUID id) { - var booking = bookingRepository + Booking booking = bookingRepository .findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new NotFoundException("Booking: " + id)); captureSessionService.deleteCascade(booking); @@ -211,7 +208,7 @@ public void cleanUnusedCaptureSessions(Booking booking) { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @PreAuthorize("@authorisationService.hasBookingAccess(authentication, #id)") public void undelete(UUID id) { - var entity = bookingRepository.findById(id).orElseThrow(() -> new NotFoundException("Booking: " + id)); + Booking entity = bookingRepository.findById(id).orElseThrow(() -> new NotFoundException("Booking: " + id)); caseService.undelete(entity.getCaseId().getId()); if (!entity.isDeleted()) { return; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/CaptureSessionService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/CaptureSessionService.java index 59f1125da9..5f1cfd10f5 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/CaptureSessionService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/CaptureSessionService.java @@ -18,6 +18,7 @@ import uk.gov.hmcts.reform.preapi.dto.CreateRecordingDTO; import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.enums.AuditLogSource; import uk.gov.hmcts.reform.preapi.enums.CaseState; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; @@ -42,6 +43,7 @@ @Slf4j @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class CaptureSessionService { private final RecordingService recordingService; @@ -77,13 +79,13 @@ public CaptureSessionService(RecordingService recordingService, @Transactional public CaptureSessionDTO findByLiveEventId(String liveEventId) { try { - var liveEventUUID = new UUID( + UUID liveEventUUID = new UUID( Long.parseUnsignedLong(liveEventId.substring(0, 16), 16), Long.parseUnsignedLong(liveEventId.substring(16), 16) ); return this.findById(liveEventUUID); } catch (Exception e) { - throw new NotFoundException("CaptureSession: " + liveEventId); + throw (NotFoundException) new NotFoundException("CaptureSession: " + liveEventId).initCause(e); } } @@ -106,13 +108,13 @@ public Page searchBy( UUID courtId, Pageable pageable ) { - var until = scheduledFor.isEmpty() + Timestamp until = scheduledFor.isEmpty() ? null : scheduledFor.map(t -> Timestamp.from(t.toInstant().plus(86399, ChronoUnit.SECONDS))).orElse(null); - var auth = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()); - var authorisedBookings = auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings(); - var authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); + UserAuthentication auth = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); + List authorisedBookings = auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings(); + UUID authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); return captureSessionRepository .searchCaptureSessionsBy( @@ -143,7 +145,7 @@ public List findSessionsByDate(LocalDate date) { @Transactional @PreAuthorize("@authorisationService.hasCaptureSessionAccess(authentication, #id)") public void deleteById(UUID id) { - var captureSession = captureSessionRepository + CaptureSession captureSession = captureSessionRepository .findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new NotFoundException("CaptureSession: " + id)); @@ -191,15 +193,16 @@ public void deleteCascade(Booking booking) { @Transactional @PreAuthorize("@authorisationService.hasUpsertAccess(authentication, #createCaptureSessionDTO)") public UpsertResult upsert(CreateCaptureSessionDTO createCaptureSessionDTO) { - var foundCaptureSession = captureSessionRepository.findById(createCaptureSessionDTO.getId()); + Optional foundCaptureSession = captureSessionRepository + .findById(createCaptureSessionDTO.getId()); if (foundCaptureSession.isPresent() && foundCaptureSession.get().isDeleted()) { throw new ResourceInDeletedStateException("CaptureSessionDTO", createCaptureSessionDTO.getId().toString()); } - var captureSession = foundCaptureSession.orElse(new CaptureSession()); + CaptureSession captureSession = foundCaptureSession.orElse(new CaptureSession()); - var booking = bookingRepository + Booking booking = bookingRepository .findByIdAndDeletedAtIsNull(createCaptureSessionDTO.getBookingId()) .orElseThrow(() -> new NotFoundException("Booking: " + createCaptureSessionDTO.getBookingId())); @@ -212,13 +215,13 @@ public UpsertResult upsert(CreateCaptureSessionDTO createCaptureSessionDTO) { ); } - var startedByUser = createCaptureSessionDTO.getStartedByUserId() != null + User startedByUser = createCaptureSessionDTO.getStartedByUserId() != null ? userRepository .findByIdAndDeletedAtIsNull(createCaptureSessionDTO.getStartedByUserId()) .orElseThrow(() -> new NotFoundException("User: " + createCaptureSessionDTO.getStartedByUserId())) : null; - var finishedByUser = createCaptureSessionDTO.getFinishedByUserId() != null + User finishedByUser = createCaptureSessionDTO.getFinishedByUserId() != null ? userRepository .findByIdAndDeletedAtIsNull(createCaptureSessionDTO.getFinishedByUserId()) .orElseThrow(() -> new NotFoundException("User: " + createCaptureSessionDTO.getFinishedByUserId())) @@ -236,16 +239,13 @@ public UpsertResult upsert(CreateCaptureSessionDTO createCaptureSessionDTO) { captureSession.setStatus(createCaptureSessionDTO.getStatus()); captureSessionRepository.save(captureSession); - - var isUpdate = foundCaptureSession.isPresent(); - - return isUpdate ? UpsertResult.UPDATED : UpsertResult.CREATED; + return foundCaptureSession.isPresent() ? UpsertResult.UPDATED : UpsertResult.CREATED; } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @PreAuthorize("@authorisationService.hasCaptureSessionAccess(authentication, #id)") public void undelete(UUID id) { - var entity = + CaptureSession entity = captureSessionRepository.findById(id).orElseThrow(() -> new NotFoundException("Capture Session: " + id)); bookingService.undelete(entity.getBooking().getId()); if (!entity.isDeleted()) { @@ -257,7 +257,7 @@ public void undelete(UUID id) { @Transactional public CaptureSessionDTO startCaptureSession(UUID id, RecordingStatus status, String ingestAddress) { - var captureSession = captureSessionRepository + CaptureSession captureSession = captureSessionRepository .findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new NotFoundException("Capture Session: " + id)); @@ -277,7 +277,7 @@ public CaptureSessionDTO startCaptureSession(UUID id, RecordingStatus status, St public CaptureSessionDTO stopCaptureSession(UUID captureSessionId, RecordingStatus status, UUID recordingId) { - var captureSession = captureSessionRepository + CaptureSession captureSession = captureSessionRepository .findByIdAndDeletedAtIsNull(captureSessionId) .orElseThrow(() -> new NotFoundException("Capture Session: " + captureSessionId)); @@ -288,13 +288,13 @@ public CaptureSessionDTO stopCaptureSession(UUID captureSessionId, switch (status) { case PROCESSING -> { - var user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException("User: " + userId)); + User user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException("User: " + userId)); captureSession.setFinishedByUser(user); captureSession.setFinishedAt(Timestamp.from(Instant.now())); } case RECORDING_AVAILABLE -> { - var recording = new CreateRecordingDTO(); + CreateRecordingDTO recording = new CreateRecordingDTO(); recording.setId(recordingId); recording.setCaptureSessionId(captureSessionId); recording.setVersion(1); @@ -316,7 +316,7 @@ public CaptureSessionDTO stopCaptureSession(UUID captureSessionId, @Transactional public CaptureSessionDTO setCaptureSessionStatus(UUID captureSessionId, RecordingStatus status) { - var captureSession = captureSessionRepository + CaptureSession captureSession = captureSessionRepository .findByIdAndDeletedAtIsNull(captureSessionId) .orElseThrow(() -> new NotFoundException("Capture Session: " + captureSessionId)); captureSession.setStatus(status); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/CaseService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/CaseService.java index 4e261eaa86..71895f2e96 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/CaseService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/CaseService.java @@ -14,10 +14,13 @@ import uk.gov.hmcts.reform.preapi.dto.CaseDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCaseDTO; import uk.gov.hmcts.reform.preapi.email.EmailServiceFactory; +import uk.gov.hmcts.reform.preapi.email.IEmailService; import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.CaptureSession; import uk.gov.hmcts.reform.preapi.entities.Case; +import uk.gov.hmcts.reform.preapi.entities.Court; import uk.gov.hmcts.reform.preapi.entities.Participant; +import uk.gov.hmcts.reform.preapi.entities.ShareBooking; import uk.gov.hmcts.reform.preapi.enums.CaseState; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; @@ -37,6 +40,7 @@ import java.time.Instant; import java.util.HashSet; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -44,6 +48,7 @@ @Slf4j @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class CaseService { private final CaseRepository caseRepository; @@ -87,15 +92,15 @@ public CaseDTO findById(UUID id) { @Transactional(readOnly = true) @PreAuthorize("@authorisationService.hasCaseAccess(authentication, #id)") public List getCasesByOrigin(RecordingOrigin origin) { - var cases = caseRepository.findAllByOrigin(origin); + List cases = caseRepository.findAllByOrigin(origin); return cases.stream().map(CaseDTO::new).toList(); } @Transactional @PreAuthorize("!#includeDeleted or @authorisationService.canViewDeleted(authentication)") public Page searchBy(String reference, UUID courtId, boolean includeDeleted, Pageable pageable) { - var auth = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()); - var authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); + UserAuthentication auth = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); + UUID authorisedCourt = auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId(); return caseRepository .searchCasesBy( @@ -111,13 +116,14 @@ public Page searchBy(String reference, UUID courtId, boolean includeDel @Transactional @PreAuthorize("@authorisationService.hasUpsertAccess(authentication, #createCaseDTO)") + @SuppressWarnings({ "PMD.CognitiveComplexity", "PMD.CyclomaticComplexity", "PMD.NPathComplexity", "PMD.NcssCount" }) public UpsertResult upsert(CreateCaseDTO createCaseDTO) { - var foundCase = caseRepository.findById(createCaseDTO.getId()); - var isUpdate = foundCase.isPresent(); + Optional foundCase = caseRepository.findById(createCaseDTO.getId()); + boolean isUpdate = foundCase.isPresent(); - var isCaseClosure = false; - var isCaseClosureCancellation = false; - var isCasePendingClosure = false; + boolean isCaseClosure = false; + boolean isCaseClosureCancellation = false; + boolean isCasePendingClosure = false; if (isUpdate) { if (foundCase.get().isDeleted()) { @@ -164,13 +170,13 @@ public UpsertResult upsert(CreateCaseDTO createCaseDTO) { throw new ConflictException("Case reference is already in use for this court"); } - var court = courtRepository.findById(createCaseDTO.getCourtId()).orElse(null); + Court court = courtRepository.findById(createCaseDTO.getCourtId()).orElse(null); if (!isUpdate && court == null) { throw new NotFoundException("Court: " + createCaseDTO.getCourtId()); } - var newCase = foundCase.orElse(new Case()); + Case newCase = foundCase.orElse(new Case()); newCase.setId(createCaseDTO.getId()); newCase.setCourt(court); if (createCaseDTO.getReference() != null) { @@ -207,10 +213,10 @@ public UpsertResult upsert(CreateCaseDTO createCaseDTO) { ? new HashSet<>() : new HashSet<>(Set.copyOf(newCase.getParticipants())); - var newParticipants = Stream + Set newParticipants = Stream .ofNullable(createCaseDTO.getParticipants()) .flatMap(participants -> participants.stream().map(model -> { - var entity = participantRepository.findById(model.getId()).orElse(new Participant()); + Participant entity = participantRepository.findById(model.getId()).orElse(new Participant()); if (entity.getDeletedAt() != null) { throw new ResourceInDeletedStateException("Participant", entity.getId().toString()); @@ -226,7 +232,7 @@ public UpsertResult upsert(CreateCaseDTO createCaseDTO) { })) .collect(Collectors.toSet()); - var ids = newParticipants.stream().map(Participant::getId).toList(); + List ids = newParticipants.stream().map(Participant::getId).toList(); oldParticipants .stream() .filter(p -> !ids.contains(p.getId())) @@ -242,7 +248,7 @@ public UpsertResult upsert(CreateCaseDTO createCaseDTO) { @Transactional @PreAuthorize("@authorisationService.hasCaseAccess(authentication, #id)") public void deleteById(UUID id) { - var caseEntity = caseRepository + Case caseEntity = caseRepository .findByIdAndDeletedAtIsNull(id) .orElseThrow(() -> new NotFoundException("CaseDTO: " + id)); caseEntity.setDeleteOperation(true); @@ -253,7 +259,7 @@ public void deleteById(UUID id) { @Transactional public void undelete(UUID id) { - var entity = caseRepository.findById(id).orElseThrow(() -> new NotFoundException("Case: " + id)); + Case entity = caseRepository.findById(id).orElseThrow(() -> new NotFoundException("Case: " + id)); if (!entity.isDeleted()) { return; } @@ -262,7 +268,7 @@ public void undelete(UUID id) { } private boolean isCaseReferenceValid(boolean isUpdate, CreateCaseDTO createCaseDTO) { - var foundCases = caseRepository + List foundCases = caseRepository .findAllByReferenceAndCourt_Id(createCaseDTO.getReference(), createCaseDTO.getCourtId()); return isUpdate @@ -275,7 +281,7 @@ private boolean isCaseReferenceValid(boolean isUpdate, CreateCaseDTO createCaseD @Transactional public void closePendingCases() { - var timestamp = Timestamp.from(Instant.now()); + Timestamp timestamp = Timestamp.from(Instant.now()); caseRepository.findAllByStateAndClosedAtBefore(CaseState.PENDING_CLOSURE, timestamp).forEach(c -> { c.setState(CaseState.CLOSED); caseRepository.save(c); @@ -285,21 +291,21 @@ public void closePendingCases() { @Transactional(propagation = Propagation.REQUIRED, noRollbackFor = CaptureSessionNotDeletedException.class, rollbackFor = Exception.class) - public void onCaseClosed(Case c) { - log.info("onCaseClosed: Case({})", c.getId()); - var shares = shareBookingService.deleteCascade(c); + public void onCaseClosed(Case aCase) { + log.info("onCaseClosed: Case({})", aCase.getId()); + Set shares = shareBookingService.deleteCascade(aCase); if (!shares.isEmpty()) { try { - var emailService = emailServiceFactory.getEnabledEmailService(); - shares.forEach(share -> emailService.caseClosed(share.getSharedWith(), c)); + IEmailService emailService = emailServiceFactory.getEnabledEmailService(); + shares.forEach(share -> emailService.caseClosed(share.getSharedWith(), aCase)); } catch (Exception e) { - log.error("Failed to notify users of case closure: {}", c.getId()); + log.error("Failed to notify users of case closure: {}", aCase.getId()); } } List bookingsWithCaptureSessions = bookingRepository - .findAllByCaseIdAndDeletedAtIsNull(c) + .findAllByCaseIdAndDeletedAtIsNull(aCase) .stream() .filter(b -> !b.getCaptureSessions().isEmpty()) .toList(); @@ -318,36 +324,36 @@ public void onCaseClosed(Case c) { } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void onCaseClosureCancellation(Case c) { - log.info("onCaseClosureCancellation: Case({})", c.getId()); - var shares = shareBookingService.getSharesForCase(c); + public void onCaseClosureCancellation(Case aCase) { + log.info("onCaseClosureCancellation: Case({})", aCase.getId()); + Set shares = shareBookingService.getSharesForCase(aCase); if (shares.isEmpty()) { return; } try { - var emailService = emailServiceFactory.getEnabledEmailService(); - shares.forEach(share -> emailService.caseClosureCancelled(share.getSharedWith(), c)); + IEmailService emailService = emailServiceFactory.getEnabledEmailService(); + shares.forEach(share -> emailService.caseClosureCancelled(share.getSharedWith(), aCase)); } catch (Exception e) { - log.error("Failed to notify users of case closure cancellation: {}", c.getId()); + log.error("Failed to notify users of case closure cancellation: {}", aCase.getId()); } } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void onCasePendingClosure(Case c) { - log.info("onCasePendingClosure: Case({})", c.getId()); - var shares = shareBookingService.getSharesForCase(c); + public void onCasePendingClosure(Case aCase) { + log.info("onCasePendingClosure: Case({})", aCase.getId()); + Set shares = shareBookingService.getSharesForCase(aCase); if (shares.isEmpty()) { return; } try { - var emailService = emailServiceFactory.getEnabledEmailService(); - shares.forEach(share -> emailService.casePendingClosure(share.getSharedWith(), c, c.getClosedAt())); + IEmailService emailService = emailServiceFactory.getEnabledEmailService(); + shares.forEach(share -> emailService.casePendingClosure(share.getSharedWith(), aCase, aCase.getClosedAt())); } catch (Exception e) { - log.error("Failed to notify users of case pending closure: {}", c.getId()); + log.error("Failed to notify users of case pending closure: {}", aCase.getId()); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/CourtService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/CourtService.java index 5ca9c650a0..9f802e052c 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/CourtService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/CourtService.java @@ -9,6 +9,7 @@ import uk.gov.hmcts.reform.preapi.dto.CourtDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCourtDTO; import uk.gov.hmcts.reform.preapi.entities.Court; +import uk.gov.hmcts.reform.preapi.entities.Region; import uk.gov.hmcts.reform.preapi.enums.CourtType; import uk.gov.hmcts.reform.preapi.enums.UpsertResult; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; @@ -16,6 +17,7 @@ import uk.gov.hmcts.reform.preapi.repositories.RegionRepository; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -61,15 +63,15 @@ public UpsertResult upsert(CreateCourtDTO createCourtDTO) { } }); - var regions = createCourtDTO.getRegions() + Set regions = createCourtDTO.getRegions() .stream() .map(regionRepository::findById) .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toSet()); - var court = courtRepository.findById(createCourtDTO.getId()); - var courtEntity = court.orElse(new Court()); + Optional court = courtRepository.findById(createCourtDTO.getId()); + Court courtEntity = court.orElse(new Court()); courtEntity.setId(createCourtDTO.getId()); courtEntity.setName(createCourtDTO.getName()); courtEntity.setCourtType(createCourtDTO.getCourtType()); @@ -78,7 +80,7 @@ public UpsertResult upsert(CreateCourtDTO createCourtDTO) { courtEntity.setPostcode(createCourtDTO.getPostcode()); courtEntity.setRegions(regions); - var isUpdate = court.isPresent(); + boolean isUpdate = court.isPresent(); courtRepository.save(courtEntity); return isUpdate ? UpsertResult.UPDATED : UpsertResult.CREATED; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/EditRequestService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/EditRequestService.java index 46e021d97d..bce88590bf 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/EditRequestService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/EditRequestService.java @@ -56,6 +56,7 @@ @Slf4j @Service +@SuppressWarnings({"PMD.CouplingBetweenObjects", "PMD.GodClass"}) public class EditRequestService { private final EditRequestRepository editRequestRepository; private final RecordingRepository recordingRepository; @@ -93,7 +94,7 @@ public EditRequestDTO findById(UUID id) { @Transactional public Page findAll(SearchEditRequests params, Pageable pageable) { - UserAuthentication auth = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()); + UserAuthentication auth = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); params.setAuthorisedBookings(auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings()); params.setAuthorisedCourt(auth.isPortalUser() || auth.isAdmin() ? null : auth.getCourtId()); @@ -206,6 +207,7 @@ public String generateAsset(UUID newRecordingId, EditRequest request) throws Int } @Transactional + @SuppressWarnings("PMD.UnusedAssignment") @PreAuthorize("@authorisationService.hasUpsertAccess(authentication, #dto)") public UpsertResult upsert(CreateEditRequestDTO dto) { recordingService.syncRecordingMetadataWithStorage(dto.getSourceRecordingId()); @@ -288,20 +290,21 @@ private List parseCsv(MultipartFile file) { .parse(); } catch (Exception e) { log.error("Error when reading CSV file: {} ", e.getMessage()); - throw new UnknownServerException("Uploaded CSV file incorrectly formatted"); + throw new UnknownServerException("Uploaded CSV file incorrectly formatted", e); } } - protected List invertInstructions(final List instructions, + @SuppressWarnings({"PMD.CognitiveComplexity", "PMD.AvoidLiteralsInIfCondition"}) + public List invertInstructions(final List instructions, final Recording recording) { long recordingDuration = recording.getDuration().toSeconds(); if (instructions.size() == 1) { - EditCutInstructionDTO i = instructions.getFirst(); - if (i.getStart() == 0 && i.getEnd() == recordingDuration) { + EditCutInstructionDTO firstInstruction = instructions.getFirst(); + if (firstInstruction.getStart() == 0 && firstInstruction.getEnd() == recordingDuration) { throw new BadRequestException("Invalid Instruction: Cannot cut an entire recording: Start(" - + i.getStart() + + firstInstruction.getStart() + "), End(" - + i.getEnd() + + firstInstruction.getEnd() + "), Recording Duration(" + recordingDuration + ")"); @@ -327,7 +330,7 @@ protected List invertInstructions(final List invertedInstructions = new ArrayList<>(); // invert - for (var instruction : instructions) { + for (EditCutInstructionDTO instruction : instructions) { if (instruction.getStart() == instruction.getEnd()) { throw new BadRequestException("Invalid instruction: Instruction with 0 second duration invalid: Start(" + instruction.getStart() @@ -433,7 +436,7 @@ protected String toJson(EditInstructions instructions) { try { return new ObjectMapper().writeValueAsString(instructions); } catch (JsonProcessingException e) { - throw new UnknownServerException("Something went wrong: " + e.getMessage()); + throw new UnknownServerException("Something went wrong: " + e.getMessage(), e); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/EncodeJobService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/EncodeJobService.java index 86a830b066..0937830153 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/EncodeJobService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/EncodeJobService.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.preapi.dto.EncodeJobDTO; +import uk.gov.hmcts.reform.preapi.entities.CaptureSession; import uk.gov.hmcts.reform.preapi.entities.EncodeJob; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; @@ -12,6 +13,7 @@ import uk.gov.hmcts.reform.preapi.repositories.EncodeJobRepository; import java.util.List; +import java.util.Optional; import java.util.UUID; @Service @@ -36,7 +38,7 @@ public List findAllProcessing() { @Transactional public void upsert(EncodeJobDTO dto) { - var encodeJob = fromDto(dto); + EncodeJob encodeJob = fromDto(dto); encodeJobRepository.saveAndFlush(encodeJob); } @@ -51,7 +53,7 @@ public void delete(UUID id) { } protected EncodeJob fromDto(EncodeJobDTO dto) { - var captureSession = captureSessionRepository.findByIdAndDeletedAtIsNull(dto.getCaptureSessionId()) + CaptureSession captureSession = captureSessionRepository.findByIdAndDeletedAtIsNull(dto.getCaptureSessionId()) .orElseThrow(() -> new NotFoundException("CaptureSession: " + dto.getCaptureSessionId())); if (!captureSession.getStatus().equals(RecordingStatus.PROCESSING)) { @@ -63,9 +65,9 @@ protected EncodeJob fromDto(EncodeJobDTO dto) { ); } - var optEncodeJob = encodeJobRepository.findById(dto.getId()); + Optional optEncodeJob = encodeJobRepository.findById(dto.getId()); - var encodeJob = optEncodeJob.orElse(new EncodeJob()); + EncodeJob encodeJob = optEncodeJob.orElse(new EncodeJob()); encodeJob.setId(dto.getId()); encodeJob.setCaptureSession(captureSession); encodeJob.setRecordingId(dto.getRecordingId()); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/InviteService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/InviteService.java index 6f16edc2b5..ca5affc842 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/InviteService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/InviteService.java @@ -12,6 +12,7 @@ import uk.gov.hmcts.reform.preapi.dto.CreateInviteDTO; import uk.gov.hmcts.reform.preapi.dto.InviteDTO; import uk.gov.hmcts.reform.preapi.email.EmailServiceFactory; +import uk.gov.hmcts.reform.preapi.entities.PortalAccess; import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.enums.AccessStatus; import uk.gov.hmcts.reform.preapi.enums.UpsertResult; @@ -63,9 +64,9 @@ public Page findAllBy( @Transactional public UpsertResult upsert(CreateInviteDTO createInviteDTO) { - var result = userService.upsert(createInviteDTO); + UpsertResult result = userService.upsert(createInviteDTO); - var user = userRepository.findById(createInviteDTO.getUserId()) + User user = userRepository.findById(createInviteDTO.getUserId()) .orElseThrow(() -> new NotFoundException("User: " + createInviteDTO.getUserId())); onUserInvitedToPortal(user); @@ -77,7 +78,7 @@ public UpsertResult upsert(CreateInviteDTO createInviteDTO) { @CacheEvict(value = "users", key = "#email.toLowerCase()") }) public UpsertResult redeemInvite(String email) { - var portalAccess = portalAccessRepository + PortalAccess portalAccess = portalAccessRepository .findByUser_EmailIgnoreCaseAndDeletedAtNullAndUser_DeletedAtNull(email) .orElseThrow(() -> new NotFoundException("Invite: " + email)); portalAccess.setStatus(AccessStatus.ACTIVE); @@ -88,7 +89,7 @@ public UpsertResult redeemInvite(String email) { @Transactional public void deleteByUserId(UUID userId) { - var portalAccess = portalAccessRepository + PortalAccess portalAccess = portalAccessRepository .findByUser_IdAndDeletedAtNullAndUser_DeletedAtNullAndStatus(userId, AccessStatus.INVITATION_SENT) .orElseThrow(() -> new NotFoundException("User: " + userId)); @@ -96,16 +97,16 @@ public void deleteByUserId(UUID userId) { } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void onUserInvitedToPortal(User u) { - log.info("onUserInvitedToPortal: User({})", u.getId()); + public void onUserInvitedToPortal(User user) { + log.info("onUserInvitedToPortal: User({})", user.getId()); try { if (!emailServiceFactory.isEnabled()) { return; } - emailServiceFactory.getEnabledEmailService().portalInvite(u); + emailServiceFactory.getEnabledEmailService().portalInvite(user); } catch (Exception e) { - log.error("Failed to notify user of invite to portal: " + u.getId()); + log.error("Failed to notify user of invite to portal: " + user.getId()); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/LegacyReportService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/LegacyReportService.java index 555ae8a3b1..8ff9fa2836 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/LegacyReportService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/LegacyReportService.java @@ -123,9 +123,9 @@ public List reportPlayback(AuditLogSource source) { .map(this::toPlaybackReport) .toList(); } else if (source == AuditLogSource.PORTAL || source == AuditLogSource.APPLICATION) { - final var activityPlay = "Play"; - final var functionalAreaVideoPlayer = "Video Player"; - final var functionalAreaViewRecordings = "View Recordings"; + final String activityPlay = "Play"; + final String functionalAreaVideoPlayer = "Video Player"; + final String functionalAreaViewRecordings = "View Recordings"; return auditRepository .findBySourceAndFunctionalAreaAndActivity( @@ -165,7 +165,7 @@ public List reportAccessRemoved() { private PlaybackReportDTO toPlaybackReport(Audit audit) { // S28-3604 discovered audit details records Recording Id as recordingId _and_ recordinguid - var auditDetails = audit.getAuditDetails() != null && !audit.getAuditDetails().isNull(); + boolean auditDetails = audit.getAuditDetails() != null && !audit.getAuditDetails().isNull(); UUID recordingId = null; if (auditDetails) { if (audit.getAuditDetails().hasNonNull("recordingId")) { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/PortalAccessService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/PortalAccessService.java index ba2150bf07..48c7e3a433 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/PortalAccessService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/PortalAccessService.java @@ -5,6 +5,7 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.preapi.dto.CreatePortalAccessDTO; +import uk.gov.hmcts.reform.preapi.entities.PortalAccess; import uk.gov.hmcts.reform.preapi.enums.AccessStatus; import uk.gov.hmcts.reform.preapi.enums.UpsertResult; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; @@ -26,7 +27,7 @@ public PortalAccessService(PortalAccessRepository portalAccessRepository) { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public UpsertResult update(CreatePortalAccessDTO createDto) { - var entity = portalAccessRepository + PortalAccess entity = portalAccessRepository .findByIdAndDeletedAtIsNull(createDto.getId()) .orElseThrow(() -> new NotFoundException("PortalAccess: " + createDto.getId())); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/RecordingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/RecordingService.java index 574c847013..23f09182a2 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/RecordingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/RecordingService.java @@ -94,7 +94,7 @@ public Page findAll( : null ); - var auth = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()); + UserAuthentication auth = (UserAuthentication) SecurityContextHolder.getContext().getAuthentication(); params.setAuthorisedBookings( auth.isAdmin() || auth.isAppUser() ? null : auth.getSharedBookings() ); @@ -141,15 +141,14 @@ protected UpsertResult upsert(Optional recording, @Transactional @PreAuthorize("@authorisationService.hasUpsertAccess(authentication, #createRecordingDTO)") - @SuppressWarnings("PMD.CyclomaticComplexity") public UpsertResult upsert(CreateRecordingDTO createRecordingDTO) { - var recording = recordingRepository.findById(createRecordingDTO.getId()); + Optional recording = recordingRepository.findById(createRecordingDTO.getId()); if (recording.isPresent() && recording.get().isDeleted()) { throw new ResourceInDeletedStateException("RecordingDTO", createRecordingDTO.getId().toString()); } - var captureSession = captureSessionRepository + CaptureSession captureSession = captureSessionRepository .findByIdAndDeletedAtIsNull(createRecordingDTO.getCaptureSessionId()) .orElseThrow(() -> new NotFoundException("CaptureSession: " + createRecordingDTO.getCaptureSessionId())); @@ -180,7 +179,7 @@ public UpsertResult forceUpsert(CreateRecordingDTO createRecordingDTO) { @Transactional @PreAuthorize("@authorisationService.hasRecordingAccess(authentication, #recordingId)") public void deleteById(UUID recordingId) { - var recording = recordingRepository + Optional recording = recordingRepository .findByIdAndDeletedAtIsNullAndCaptureSessionDeletedAtIsNullAndCaptureSession_Booking_DeletedAtIsNull( recordingId ); @@ -189,7 +188,7 @@ public void deleteById(UUID recordingId) { throw new NotFoundException("Recording: " + recordingId); } - var recordingEntity = recording.get(); + Recording recordingEntity = recording.get(); recordingEntity.setDeleteOperation(true); recordingEntity.setDeletedAt(Timestamp.from(Instant.now())); @@ -206,7 +205,8 @@ public void checkIfCaptureSessionHasAssociatedRecordings(CaptureSession captureS @Transactional @PreAuthorize("@authorisationService.hasRecordingAccess(authentication, #id)") public void undelete(UUID id) { - var entity = recordingRepository.findById(id).orElseThrow(() -> new NotFoundException("Recording: " + id)); + Recording entity = recordingRepository.findById(id) + .orElseThrow(() -> new NotFoundException("Recording: " + id)); captureSessionService.undelete(entity.getCaptureSession().getId()); if (!entity.isDeleted()) { return; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/ReportService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/ReportService.java index a4d9a94ee0..eb4dbe59ae 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/ReportService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/ReportService.java @@ -21,6 +21,7 @@ import uk.gov.hmcts.reform.preapi.entities.PortalAccess; import uk.gov.hmcts.reform.preapi.entities.Recording; import uk.gov.hmcts.reform.preapi.entities.ShareBooking; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.enums.AuditLogSource; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; @@ -38,6 +39,7 @@ import java.util.stream.Collectors; @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class ReportService { private final CaptureSessionRepository captureSessionRepository; @@ -124,7 +126,7 @@ public List userRecordingPlaybackReport() { .findAllAccessAttempts() .stream() .map(a -> { - var args = toPlaybackReport(a); + PlaybackReportArgsRecord args = toPlaybackReport(a); return new UserRecordingPlaybackReportDTOV2(args.audit(), args.user(), args.recording()); }) .toList(); @@ -133,9 +135,9 @@ public List userRecordingPlaybackReport() { @Transactional public List reportPlayback(AuditLogSource source) { if (source == AuditLogSource.PORTAL || source == AuditLogSource.APPLICATION) { - final var activityPlay = "Play"; - final var functionalAreaVideoPlayer = "Video Player"; - final var functionalAreaViewRecordings = "View Recordings"; + final String activityPlay = "Play"; + final String functionalAreaVideoPlayer = "Video Player"; + final String functionalAreaViewRecordings = "View Recordings"; return auditRepository .findBySourceAndFunctionalAreaAndActivity( @@ -147,7 +149,7 @@ public List reportPlayback(AuditLogSource source) { ) .stream() .map(a -> { - var args = toPlaybackReport(a); + PlaybackReportArgsRecord args = toPlaybackReport(a); return new PlaybackReportDTOV2(args.audit(), args.user(), args.recording()); }) .toList(); @@ -197,7 +199,7 @@ private List getParticipantsForRecording(Recordi } private PlaybackReportArgsRecord toPlaybackReport(Audit audit) { - var auditDetails = audit.getAuditDetails() != null && !audit.getAuditDetails().isNull(); + boolean auditDetails = audit.getAuditDetails() != null && !audit.getAuditDetails().isNull(); UUID recordingId = null; if (auditDetails) { if (audit.getAuditDetails().hasNonNull("recordingId")) { @@ -207,7 +209,7 @@ private PlaybackReportArgsRecord toPlaybackReport(Audit audit) { } } - var user = audit.getCreatedBy() != null + User user = audit.getCreatedBy() != null ? userRepository.findById(audit.getCreatedBy()) .orElse(appAccessRepository.findById(audit.getCreatedBy()) .map(AppAccess::getUser) @@ -216,7 +218,7 @@ private PlaybackReportArgsRecord toPlaybackReport(Audit audit) { .orElse(null))) : null; - var recording = recordingId != null + Recording recording = recordingId != null ? recordingRepository.findById(recordingId).orElse(null) : null; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/ScheduledTaskRunner.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/ScheduledTaskRunner.java index 4120ac3e1e..ec48484271 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/ScheduledTaskRunner.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/ScheduledTaskRunner.java @@ -19,8 +19,8 @@ public ScheduledTaskRunner(@Autowired ApplicationContext context) { } public void run(String taskName) { - final var beanName = toLowerCase(taskName.charAt(0)) + taskName.substring(1); - final var task = getTask(beanName); + final String beanName = toLowerCase(taskName.charAt(0)) + taskName.substring(1); + final Runnable task = getTask(beanName); if (task != null) { log.info("Running task: {}", beanName); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/ShareBookingService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/ShareBookingService.java index 9234116d5d..bdf19b48b7 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/ShareBookingService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/ShareBookingService.java @@ -14,6 +14,7 @@ import uk.gov.hmcts.reform.preapi.entities.Booking; import uk.gov.hmcts.reform.preapi.entities.Case; import uk.gov.hmcts.reform.preapi.entities.ShareBooking; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.enums.CaseState; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.enums.UpsertResult; @@ -62,7 +63,7 @@ public UpsertResult shareBookingById(CreateShareBookingDTO createShareBookingDTO throw new ConflictException("Share booking already exists"); } - final var booking = bookingRepository.findById(createShareBookingDTO.getBookingId()) + final Booking booking = bookingRepository.findById(createShareBookingDTO.getBookingId()) .orElseThrow(() -> new NotFoundException("Booking: " + createShareBookingDTO.getBookingId())); if (booking.getCaseId().getState() == CaseState.CLOSED) { @@ -74,12 +75,12 @@ public UpsertResult shareBookingById(CreateShareBookingDTO createShareBookingDTO ); } - final var sharedByUser = userRepository.findById(createShareBookingDTO.getSharedByUser()) + final User sharedByUser = userRepository.findById(createShareBookingDTO.getSharedByUser()) .orElseThrow(() -> new NotFoundException("Shared by User: " + createShareBookingDTO.getSharedByUser())); - final var sharedWithUser = userRepository.findById(createShareBookingDTO.getSharedWithUser()) + final User sharedWithUser = userRepository.findById(createShareBookingDTO.getSharedWithUser()) .orElseThrow(() -> new NotFoundException("Shared with User: " + createShareBookingDTO.getSharedWithUser())); - var shareBookingEntity = new ShareBooking(); + ShareBooking shareBookingEntity = new ShareBooking(); shareBookingEntity.setId(createShareBookingDTO.getId()); shareBookingEntity.setBooking(booking); shareBookingEntity.setSharedBy(sharedByUser); @@ -98,7 +99,7 @@ public void deleteShareBookingById(UUID bookingId, UUID shareId) { throw new NotFoundException("Booking: " + bookingId); } - var share = shareBookingRepository + ShareBooking share = shareBookingRepository .findById(shareId) .orElseThrow(() -> new NotFoundException("ShareBooking: " + shareId)); @@ -139,8 +140,8 @@ public Set deleteCascade(Case aCase) { } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public Set getSharesForCase(Case c) { - return bookingRepository.findAllByCaseIdAndDeletedAtIsNull(c) + public Set getSharesForCase(Case aCase) { + return bookingRepository.findAllByCaseIdAndDeletedAtIsNull(aCase) .stream() .map(shareBookingRepository::findAllByBookingAndDeletedAtIsNull) .flatMap(Collection::stream) @@ -160,20 +161,20 @@ public Page getShareLogsForBooking(UUID bookingId, Pageable pag } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public void onBookingShared(ShareBooking s) { + public void onBookingShared(ShareBooking share) { // only send an email if there is a recording for this booking if (emailServiceFactory.isEnabled() - && Stream.ofNullable(s.getBooking().getCaptureSessions()) + && Stream.ofNullable(share.getBooking().getCaptureSessions()) .flatMap(Set::stream) .anyMatch(c -> c.getStatus().equals(RecordingStatus.RECORDING_AVAILABLE))) { try { - log.info("onBookingShared: Booking({})", s.getBooking().getId()); + log.info("onBookingShared: Booking({})", share.getBooking().getId()); emailServiceFactory.getEnabledEmailService() - .recordingReady(s.getSharedWith(), s.getBooking().getCaseId()); + .recordingReady(share.getSharedWith(), share.getBooking().getCaseId()); } catch (Exception e) { - log.error("Failed to notify user " + s.getSharedWith().getId() - + " of shared booking: " + s.getBooking().getId()); + log.error("Failed to notify user " + share.getSharedWith().getId() + + " of shared booking: " + share.getBooking().getId()); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/UserService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/UserService.java index 4183ae6daa..f110d28077 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/UserService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/UserService.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; @@ -39,12 +40,14 @@ import java.time.Instant; import java.util.Arrays; import java.util.Collection; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @Service +@SuppressWarnings("PMD.CouplingBetweenObjects") public class UserService { private final AppAccessRepository appAccessRepository; @@ -104,7 +107,6 @@ public AccessDTO findByEmail(String email) { @Transactional @PreAuthorize("!#includeDeleted or @authorisationService.canViewDeleted(authentication)") - @SuppressWarnings("PMD.UseObjectForClearerAPI") public Page findAllBy( String name, String email, @@ -124,7 +126,7 @@ public Page findAllBy( throw new NotFoundException("Role: " + role); } - var allLatestTermsAndConditions = getAllLatestTermsAndConditions(); + Set allLatestTermsAndConditions = getAllLatestTermsAndConditions(); return userRepository.searchAllBy( name, @@ -145,11 +147,10 @@ public Page findAllBy( @CacheEvict(value = "users", key = "#createUserDTO.id"), @CacheEvict(value = "users", key = "#createUserDTO.email.toLowerCase()") }) - @SuppressWarnings("PMD.CyclomaticComplexity") public UpsertResult upsert(CreateUserDTO createUserDTO) { - var user = userRepository.findById(createUserDTO.getId()); + Optional user = userRepository.findById(createUserDTO.getId()); - var isUpdate = user.isPresent(); + boolean isUpdate = user.isPresent(); if (isUpdate && user.get().isDeleted()) { throw new ResourceInDeletedStateException("UserDTO", createUserDTO.getId().toString()); } @@ -164,7 +165,7 @@ public UpsertResult upsert(CreateUserDTO createUserDTO) { } }); - var entity = user.orElse(new User()); + User entity = user.orElse(new User()); entity.setId(createUserDTO.getId()); entity.setFirstName(createUserDTO.getFirstName()); entity.setLastName(createUserDTO.getLastName()); @@ -202,9 +203,8 @@ public UpsertResult upsert(CreateUserDTO createUserDTO) { @CacheEvict(value = "users", key = "#createInviteDTO.getUserId()"), @CacheEvict(value = "users", key = "#createInviteDTO.email.toLowerCase()") }) - @SuppressWarnings("PMD.CyclomaticComplexity") public UpsertResult upsert(CreateInviteDTO createInviteDTO) { - var user = userRepository.findById(createInviteDTO.getUserId()); + Optional user = userRepository.findById(createInviteDTO.getUserId()); if (user.isPresent() && user.get().isDeleted()) { throw new ResourceInDeletedStateException("UserDTO", createInviteDTO.getUserId().toString()); } else if (user.isPresent() && portalAccessRepository @@ -213,7 +213,7 @@ public UpsertResult upsert(CreateInviteDTO createInviteDTO) { return UpsertResult.UPDATED; } - var userEntity = user.orElse(new User()); + User userEntity = user.orElse(new User()); userEntity.setId(createInviteDTO.getUserId()); userEntity.setFirstName(createInviteDTO.getFirstName()); @@ -223,7 +223,7 @@ public UpsertResult upsert(CreateInviteDTO createInviteDTO) { userEntity.setPhone(createInviteDTO.getPhone()); userRepository.save(userEntity); - var portalAccessEntity = portalAccessRepository + PortalAccess portalAccessEntity = portalAccessRepository .findByUser_IdAndDeletedAtNullAndUser_DeletedAtNull(createInviteDTO.getUserId()) .orElse(new PortalAccess()); @@ -261,7 +261,7 @@ public void deleteById(UUID userId) { user.setDeletedAt(Timestamp.from(Instant.now())); userRepository.saveAndFlush(user); - var cache = cacheManager.getCache("users"); + Cache cache = cacheManager.getCache("users"); if (cache != null) { cache.evict(userId); cache.evict(user.getEmail()); @@ -271,7 +271,7 @@ public void deleteById(UUID userId) { @Transactional public void undelete(UUID id) { - var entity = userRepository.findById(id).orElseThrow(() -> new NotFoundException("User: " + id)); + User entity = userRepository.findById(id).orElseThrow(() -> new NotFoundException("User: " + id)); if (!entity.isDeleted()) { return; } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedService.java b/src/main/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedService.java index dc6640246a..30f79e4bb1 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/services/UserTermsAcceptedService.java @@ -1,10 +1,13 @@ package uk.gov.hmcts.reform.preapi.services; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import uk.gov.hmcts.reform.preapi.entities.TermsAndConditions; +import uk.gov.hmcts.reform.preapi.entities.User; import uk.gov.hmcts.reform.preapi.entities.UserTermsAccepted; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; import uk.gov.hmcts.reform.preapi.repositories.TermsAndConditionsRepository; @@ -14,6 +17,7 @@ import java.sql.Timestamp; import java.time.Instant; +import java.util.Locale; import java.util.UUID; @Service @@ -53,24 +57,24 @@ public UserTermsAcceptedService(UserRepository userRepository, */ @Transactional public void acceptTermsAndConditions(UUID termsId) { - var userId = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()).getUserId(); - var user = userRepository.findById(userId) + UUID userId = ((UserAuthentication) SecurityContextHolder.getContext().getAuthentication()).getUserId(); + User user = userRepository.findById(userId) // this will not happen .orElseThrow(() -> new NotFoundException("User: " + userId)); - var termsAndConditions = termsAndConditionsRepository.findById(termsId) + TermsAndConditions termsAndConditions = termsAndConditionsRepository.findById(termsId) .orElseThrow(() -> new NotFoundException("TermsAndConditions: " + termsId)); - var accepted = new UserTermsAccepted(); + UserTermsAccepted accepted = new UserTermsAccepted(); accepted.setId(UUID.randomUUID()); accepted.setUser(user); accepted.setTermsAndConditions(termsAndConditions); accepted.setAcceptedAt(Timestamp.from(Instant.now())); userTermsAcceptedRepository.save(accepted); - var userEmail = user.getEmail(); // needed for cache eviction - var cache = cacheManager.getCache("users"); + String userEmail = user.getEmail(); // needed for cache eviction + Cache cache = cacheManager.getCache("users"); if (cache != null) { - cache.evict(userEmail.toLowerCase()); + cache.evict(userEmail.toLowerCase(Locale.UK)); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsers.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsers.java index 4f5bff68d0..182d5b3792 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsers.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/AddNROUsers.java @@ -16,22 +16,26 @@ import uk.gov.hmcts.reform.preapi.services.UserService; import java.io.BufferedReader; -import java.io.FileReader; import java.io.IOException; import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.UUID; -@Component @Slf4j +@Component +@SuppressWarnings({"PMD.CouplingBetweenObjects", "PMD.GodClass", "PMD.InsufficientStringBufferDeclaration"}) public class AddNROUsers extends RobotUserTask { private final CourtRepository courtRepository; @@ -42,6 +46,9 @@ public class AddNROUsers extends RobotUserTask { private final RoleRepository roleRepository; private final String usersFile; + private static final int MAX_SECONDARY_COURTS = 4; + private static final int MAX_PRIMARY_COURTS = 1; + @Autowired public AddNROUsers(UserService userService, UserAuthenticationService userAuthenticationService, @@ -57,7 +64,7 @@ public AddNROUsers(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { log.info("Running AddNROUsers task"); signInRobotUser(); // needed to populate created_by column in audits table @@ -124,13 +131,14 @@ private CreateAppAccessDTO createAppAccessObj(ImportedNROUser importedNROUser, U private void createImportedNROUserObjects(String usersFilePath) throws IOException { int rowNumber = 1; // Read from CSV file - try (BufferedReader br = new BufferedReader(new FileReader(usersFilePath))) { - String line; + try (BufferedReader br = Files.newBufferedReader(Path.of(usersFilePath), StandardCharsets.UTF_8)) { + String line = br.readLine(); // Read each line - while ((line = br.readLine()) != null) { + while (line != null) { // Skip header if there is one if (line.contains("FirstName")) { rowNumber++; + line = br.readLine(); continue; } @@ -142,6 +150,7 @@ private void createImportedNROUserObjects(String usersFilePath) throws IOExcepti } rowNumber++; + line = br.readLine(); } } catch (IOException e) { log.error("Error: {}", e.getMessage()); @@ -150,6 +159,7 @@ private void createImportedNROUserObjects(String usersFilePath) throws IOExcepti } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") private void createUsers() { // sort list of imported NRO users in alphabetical order by email (& then by court) this.importedNROUsers.sort(Comparator.comparing(ImportedNROUser::getEmail) @@ -184,8 +194,8 @@ private void createUsers() { createAppAccessDTOs.add(userAppAccess); // if this is the last element, or if the next element is a new email, - if ((index == (this.importedNROUsers.size() - 1) - || !((this.importedNROUsers.get(index + 1).getEmail()).equals(createUserDTO.getEmail())))) { + if (index == this.importedNROUsers.size() - 1 + || !this.importedNROUsers.get(index + 1).getEmail().equals(createUserDTO.getEmail())) { // assign all the app access objects for this user to the current user, createUserDTO.setAppAccess(createAppAccessDTOs); // then add the user to the list of users to upload @@ -210,6 +220,7 @@ private void deleteInvalidNROUsersForUserCreation() { } } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") private Map getErrorsAndUsersIDsForUsersToDelete( List createAppAccessDTOs) { int index = 0; @@ -236,7 +247,7 @@ private Map getErrorsAndUsersIDsForUsersToDelete( // the current court is: UUID currentCourt = createAppAccessDTO.getCourtId(); // if the user has the same court name in two different app access objects, - if ((currentCourt.equals(previousCourt)) && (currentUser.equals(previousUser))) { + if (currentCourt.equals(previousCourt) && currentUser.equals(previousUser)) { // delete them appAccessErrors.append("User has duplicate court names\n"); usersIDsForUsersToDeleteAndErrors.put(currentUser, appAccessErrors.toString()); @@ -251,22 +262,21 @@ private Map getErrorsAndUsersIDsForUsersToDelete( secondaryCourtCount = courtCountResults.getLast(); // if a user has more than 4 secondary courts, - if (secondaryCourtCount > 4) { + if (secondaryCourtCount > MAX_SECONDARY_COURTS) { // delete them appAccessErrors.append("User has more than 4 secondary courts\n"); usersIDsForUsersToDeleteAndErrors.put(currentUser, appAccessErrors.toString()); } // if a user has more than 1 primary court, - if (primaryCourtCount > 1) { + if (primaryCourtCount > MAX_PRIMARY_COURTS) { // delete them appAccessErrors.append("User has more than 1 primary court\n"); usersIDsForUsersToDeleteAndErrors.put(currentUser, appAccessErrors.toString()); } // if the last iteration has a new user who has no primary court, - if ((index == (createAppAccessDTOs.size() - 1) - && (primaryCourtCount == 0))) { + if (index == createAppAccessDTOs.size() - 1 && primaryCourtCount == 0) { // delete them appAccessErrors.append("User has no primary court\n"); usersIDsForUsersToDeleteAndErrors.put(currentUser, appAccessErrors.toString()); @@ -306,12 +316,10 @@ private Map getErrorsAndUsersIDsForUsersToDelete( } } - private List incrementCourtCount(int primaryCourtCount, int secondaryCourtCount, boolean isDefaultCourt, + private List incrementCourtCount(int primaryCount, int secondaryCount, boolean isDefaultCourt, UUID currentUserID, UUID previousUserID) { - if (!(currentUserID.equals(previousUserID))) { - primaryCourtCount = 0; - secondaryCourtCount = 0; - } + int primaryCourtCount = currentUserID.equals(previousUserID) ? primaryCount : 0; + int secondaryCourtCount = currentUserID.equals(previousUserID) ? secondaryCount : 0; // increment primary and secondary court counters if either detected respectively if (isDefaultCourt) { @@ -390,7 +398,7 @@ private ImportedNROUser validateNROUser(String[] values, int rowNumber) { csvErrors.append("\nUser is missing First Name from the .csv input") .append(fromRowString) .append(rowNumber) - .append(")"); + .append(')'); } // validate lastName @@ -399,7 +407,7 @@ private ImportedNROUser validateNROUser(String[] values, int rowNumber) { csvErrors.append("\nUser is missing Last Name from the .csv input") .append(fromRowString) .append(rowNumber) - .append(")"); + .append(')'); } // validate email @@ -408,18 +416,19 @@ private ImportedNROUser validateNROUser(String[] values, int rowNumber) { csvErrors.append("\nUser is missing Email from the .csv input") .append(fromRowString) .append(rowNumber) - .append(")"); + .append(')'); } // validate isDefault boolean isDefault = false; - if (!values[3].toLowerCase().contains("primary") && !values[3].toLowerCase().contains("secondary")) { + if (!values[3].toLowerCase(Locale.UK).contains("primary") + && !values[3].toLowerCase(Locale.UK).contains("secondary")) { csvErrors.append("\nUser is missing Primary/Secondary Court Level from the .csv input") .append(fromRowString) .append(rowNumber) - .append(")"); - } else if (values[3].toLowerCase().contains("primary")) { + .append(')'); + } else if (values[3].toLowerCase(Locale.UK).contains("primary")) { isDefault = true; } @@ -433,7 +442,7 @@ private ImportedNROUser validateNROUser(String[] values, int rowNumber) { csvErrors.append("\nUser Court from the .csv input does not exist in the DB established in the .env file") .append(fromRowString) .append(rowNumber) - .append(")"); + .append(')'); } // validate role @@ -446,7 +455,7 @@ private ImportedNROUser validateNROUser(String[] values, int rowNumber) { csvErrors.append("\nUser Role from the .csv input does not exist in the DB established in the .env file") .append(fromRowString) .append(rowNumber) - .append(")"); + .append(')'); } this.indexedNROUsers.put(rowNumber, new ImportedNROUser(firstName, lastName, email, court, diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CheckForMissingRecordings.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CheckForMissingRecordings.java index eb541b865c..8663e0d2c5 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CheckForMissingRecordings.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CheckForMissingRecordings.java @@ -66,7 +66,7 @@ public class CheckForMissingRecordings extends RobotUserTask { } @Override - public void run() throws RuntimeException { + public void run() { log.info("Signing in robot user with email {} on env {}", cronUserEmail, platformEnv); signInRobotUser(); @@ -106,7 +106,7 @@ public void run() throws RuntimeException { } private Map getRecordingsFromDate(LocalDate yesterday) { - var search = new SearchRecordings(); + SearchRecordings search = new SearchRecordings(); search.setStartedAt(Timestamp.valueOf(yesterday.atStartOfDay())); search.setIncludeDeleted(false); @@ -139,7 +139,7 @@ private List checkRecordingsAreAvailable(List captu recordingsFromDate = new HashMap<>(getRecordingsFromDate(yesterday)); for (String captureSessionId : captureSessionIds) { - var recording = recordingsFromDate.get(captureSessionId); + RecordingDTO recording = recordingsFromDate.get(captureSessionId); if (recording == null) { unhappyRecordings.add(format( "Missing recording for capture session %s: not in database", @@ -151,7 +151,7 @@ private List checkRecordingsAreAvailable(List captu captureSessionId )); } else { - var recordingFromFinalSA = azureFinalStorageService.getRecordingDuration(recording.getId()); + Duration recordingFromFinalSA = azureFinalStorageService.getRecordingDuration(recording.getId()); if (recordingFromFinalSA == null) { unhappyRecordings.add(format( "Missing recording for capture session %s: not in final SA", @@ -169,6 +169,7 @@ private List checkRecordingsAreAvailable(List captu return emptyList(); } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") private static List getSlackMessageSections(Map> captureSessions) { List sections = new ArrayList<>(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CleanupLiveEvents.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CleanupLiveEvents.java index e333c2581a..a421bc18f4 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CleanupLiveEvents.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/CleanupLiveEvents.java @@ -8,10 +8,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; +import uk.gov.hmcts.reform.preapi.dto.CaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.media.LiveEventDTO; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; +import uk.gov.hmcts.reform.preapi.exception.LiveEventCleanupException; import uk.gov.hmcts.reform.preapi.exception.NotFoundException; import uk.gov.hmcts.reform.preapi.media.IMediaService; import uk.gov.hmcts.reform.preapi.media.MediaKind; @@ -47,10 +49,11 @@ public class CleanupLiveEvents extends RobotUserTask { private final int batchCooldownTime; private final int jobPollingInterval; - private final ConcurrentHashMap liveEventCleanupMap = new ConcurrentHashMap<>(); + private final Map liveEventCleanupMap = new ConcurrentHashMap<>(); @Autowired - CleanupLiveEvents(final MediaServiceBroker mediaServiceBroker, + @SuppressWarnings("PMD.ExcessiveParameterList") + public CleanupLiveEvents(final MediaServiceBroker mediaServiceBroker, final CaptureSessionService captureSessionService, final BookingService bookingService, final UserService userService, @@ -73,20 +76,20 @@ public class CleanupLiveEvents extends RobotUserTask { } @Override - public void run() throws RuntimeException { + public void run() { signInRobotUser(); log.info("Running CleanupLiveEvents task"); - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); // Find all Live events currently running - var liveEvents = mediaService.getLiveEvents() + List liveEvents = mediaService.getLiveEvents() .stream() .filter(liveEventDTO -> liveEventDTO.getResourceState().equals(LiveEventResourceState.RUNNING.toString())) .toList(); // handle invalid named live events (no capture session) - var invalidNamedEvents = liveEvents.stream() + List invalidNamedEvents = liveEvents.stream() .filter(event -> { try { captureSessionService.findByLiveEventId(event.getName()); @@ -116,10 +119,10 @@ public void run() throws RuntimeException { }); // Thread 1 - Cleanup Live Events in batches - var threadCleanupLiveEvents = new Thread(() -> cleanupLiveEventsInBatches(liveEvents)); + Thread threadCleanupLiveEvents = new Thread(() -> cleanupLiveEventsInBatches(liveEvents)); // Thread 2 - Trigger and await processing of live event assets - var threadProcessLiveEventAssets = new Thread(this::processLiveEvents); + Thread threadProcessLiveEventAssets = new Thread(this::processLiveEvents); threadCleanupLiveEvents.start(); threadProcessLiveEventAssets.start(); @@ -129,7 +132,7 @@ public void run() throws RuntimeException { } catch (InterruptedException e) { log.error("Clean up live event thread interrupted", e); Thread.currentThread().interrupt(); - throw new RuntimeException(e); + throw new LiveEventCleanupException("Thread interrupted during live event cleanup", e); } // Delete live events that remain @@ -180,7 +183,7 @@ private void handlePastBookings() { private void processLiveEvents() { signInRobotUser(); - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); do { try { @@ -227,11 +230,11 @@ private void processLiveEvents() { } private void onCaptureSessionReady(Map.Entry task, IMediaService mediaService) { - var captureSessionId = task.getKey(); - var currentTask = task.getValue(); + UUID captureSessionId = task.getKey(); + CleanupTask currentTask = task.getValue(); - var captureSession = captureSessionService.findById(captureSessionId); - var jobName = mediaService.triggerProcessingStep1( + CaptureSessionDTO captureSession = captureSessionService.findById(captureSessionId); + String jobName = mediaService.triggerProcessingStep1( captureSession, getSanitisedLiveEventId(captureSessionId), currentTask.getRecordingId() @@ -252,13 +255,13 @@ private void onCaptureSessionReady(Map.Entry task, IMediaServ } private void onCaptureSessionProcessingStep1(Map.Entry task, IMediaService mediaService) { - var captureSessionId = task.getKey(); - var currentTask = task.getValue(); + UUID captureSessionId = task.getKey(); + CleanupTask currentTask = task.getValue(); switch (mediaService.hasJobCompleted(MediaKind.ENCODE_FROM_INGEST_TRANSFORM, currentTask.getCurrentJobName())) { case RECORDING_AVAILABLE -> { // trigger processing step 2 - var jobName = mediaService.triggerProcessingStep2(currentTask.getRecordingId(), false); + String jobName = mediaService.triggerProcessingStep2(currentTask.getRecordingId(), false); if (jobName == null) { log.error("Failed to trigger processing step 2 for capture session {}", captureSessionId); @@ -291,8 +294,8 @@ private void onCaptureSessionProcessingStep1(Map.Entry task, } private void onCaptureSessionProcessingStep2(Map.Entry task, IMediaService mediaService) { - var captureSessionId = task.getKey(); - var currentTask = task.getValue(); + UUID captureSessionId = task.getKey(); + CleanupTask currentTask = task.getValue(); switch (mediaService.hasJobCompleted(MediaKind.ENCODE_FROM_MP4_TRANSFORM, currentTask.getCurrentJobName())) { case RECORDING_AVAILABLE -> { @@ -308,7 +311,7 @@ private void onCaptureSessionProcessingStep2(Map.Entry task, return; } log.info("Final asset found for capture session {}", captureSessionId); - var captureSession = captureSessionService.stopCaptureSession( + CaptureSessionDTO captureSession = captureSessionService.stopCaptureSession( captureSessionId, RecordingStatus.RECORDING_AVAILABLE, currentTask.getRecordingId() @@ -340,7 +343,7 @@ private void cleanupLiveEventsInBatches(List liveEvents) { liveEvents, batchSize, liveEventDTO -> { - var liveEventName = liveEventDTO.getName(); + String liveEventName = liveEventDTO.getName(); log.info("Cleaning up live event {}", liveEventName); cleanupLiveEvent(mediaServiceBroker.getEnabledMediaService(), liveEventName); }, @@ -356,7 +359,7 @@ private void cleanupLiveEventsInBatches(List liveEvents) { private void cleanupLiveEvent(IMediaService mediaService, String liveEventName) { try { - var captureSession = captureSessionService.findByLiveEventId(liveEventName); + CaptureSessionDTO captureSession = captureSessionService.findByLiveEventId(liveEventName); log.info("Capture session {} is processing", captureSession.getId()); captureSession = captureSessionService.stopCaptureSession( captureSession.getId(), @@ -364,18 +367,18 @@ private void cleanupLiveEvent(IMediaService mediaService, String liveEventName) null ); mediaService.cleanupStoppedLiveEvent(liveEventName); - var currentTask = liveEventCleanupMap.get(captureSession.getId()); + CleanupTask currentTask = liveEventCleanupMap.get(captureSession.getId()); currentTask.setStatus(CleanupTaskStatus.READY); } catch (NotFoundException e) { if (platformEnv.equals("Production")) { - log.error("Error stopping live event {}", liveEventName, e); + log.error("Error stopping live event {}", liveEventName); return; } log.info("Stopping live event without associated capture session: {}", liveEventName); try { mediaService.cleanupStoppedLiveEvent(liveEventName); } catch (Exception ex) { - // Do nothing + log.error("Error stopping live event {}", liveEventName, ex); } } catch (Exception e) { log.error("Error stopping live event {}", liveEventName, e); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookings.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookings.java index ef530dc57b..20560f8996 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookings.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/GetScheduledBookings.java @@ -38,14 +38,14 @@ public GetScheduledBookings(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { log.info("Signing in robot user with email {} on env {}", cronUserEmail, platformEnv); signInRobotUser(); log.info("Running GetScheduledBookings task: looking for bookings for today"); - var bookings = getBookings(); + List bookings = getBookings(); - var slackMessage = createSlackMessage(bookings); + String slackMessage = createSlackMessage(bookings); log.info("About to send slack notification"); slackClient.postSlackMessage(slackMessage); @@ -61,7 +61,7 @@ private List getBookings() { private String createSlackMessage(List bookings) { List sections = List.of(createSlackMessageSection(bookings)); - var slackMessage = SlackMessage.builder() + SlackMessage slackMessage = SlackMessage.builder() .sections(sections) .build(); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ImportedNROUser.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ImportedNROUser.java index 38a28076a2..72fbf709f2 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ImportedNROUser.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ImportedNROUser.java @@ -19,11 +19,13 @@ public class ImportedNROUser { private UUID roleID; private String userAccess; + private static final char CSV_DELIMITER = ','; + public static String[] parseCsvLine(String line) { List result = new ArrayList<>(); StringBuilder currentValue = new StringBuilder(); for (char ch : line.toCharArray()) { - if (ch == ',') { + if (ch == CSV_DELIMITER) { result.add(currentValue.toString().trim()); currentValue.setLength(0); // Reset the StringBuilder } else { diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsers.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsers.java index 91f381e317..f6595c5860 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsers.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsers.java @@ -11,9 +11,11 @@ import uk.gov.hmcts.reform.preapi.services.UserService; import java.io.BufferedReader; -import java.io.FileReader; import java.io.IOException; import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -22,8 +24,9 @@ import java.util.Set; import java.util.UUID; -@Component @Slf4j +@Component +@SuppressWarnings("PMD.InsufficientStringBufferDeclaration") public class ObscureNROUsers extends RobotUserTask { private final CourtRepository courtRepository; @@ -39,7 +42,7 @@ public ObscureNROUsers(UserService userService, CourtRepository courtRepository, RoleRepository roleRepository, @Value("${nroUsersFilePath:src/integrationTest/resources/Test_NRO_User_Import.csv}") - String usersFile) throws IllegalArgumentException { + String usersFile) { super(userService, userAuthenticationService, cronUserEmail); this.courtRepository = courtRepository; this.roleRepository = roleRepository; @@ -47,8 +50,7 @@ public ObscureNROUsers(UserService userService, } @Override - public void run() throws RuntimeException { - + public void run() { UUID obscuringCourtID; if (this.courtRepository.findFirstByName("Foo Court").isEmpty()) { String noObscuringCourtErrorMessage = "Cannot obscure users: obscuring court does not exist in the DB " @@ -70,18 +72,20 @@ public void run() throws RuntimeException { } // Collate user emails - try (BufferedReader br = new BufferedReader(new FileReader(this.usersFile))) { - String line; + try (BufferedReader br = Files.newBufferedReader(Path.of(this.usersFile), StandardCharsets.UTF_8)) { + String line = br.readLine(); // Read each line - while ((line = br.readLine()) != null) { + while (line != null) { // Skip header if there is one if (line.contains("FirstName")) { + line = br.readLine(); continue; } String[] values = ImportedNROUser.parseCsvLine(line); String email = values[2]; this.populateUserEmailsAndIDs(email); + line = br.readLine(); } } catch (IOException e) { throw new UncheckedIOException(e); @@ -97,14 +101,15 @@ private void constructAppAccessQuery(Collection userIDs, UUID obscuringCou StringBuilder pgAdmin4Query = new StringBuilder(""" UPDATE public.app_access SET - court_id =\s"""); + court_id ='\s"""); - pgAdmin4Query.append("'").append(obscuringCourtID).append("',\n"); - pgAdmin4Query.append("role_id = '").append(obscuringRoleID).append("',\n"); - pgAdmin4Query.append("active = false\nWHERE user_id IN ("); + pgAdmin4Query.append(obscuringCourtID) + .append("',\nrole_id = '") + .append(obscuringRoleID) + .append("',\nactive = false\nWHERE user_id IN ("); for (UUID userID : userIDs) { - pgAdmin4Query.append("'").append(userID).append("', "); + pgAdmin4Query.append('\'').append(userID).append("', "); } pgAdmin4Query.delete(pgAdmin4Query.length() - 2, pgAdmin4Query.length()); @@ -146,7 +151,7 @@ private void constructUsersQuery(Collection userIDs) { WHERE id IN ("""); for (UUID userID : userIDs) { - pgAdmin4Query.append("'").append(userID).append("', "); + pgAdmin4Query.append('\'').append(userID).append("', "); } pgAdmin4Query.delete(pgAdmin4Query.length() - 2, pgAdmin4Query.length()); @@ -159,7 +164,7 @@ private void populateUserEmailsAndIDs(String email) { try { this.userEmailAndIDs.put(email, this.userService.findByEmail(email).getUser().getId()); } catch (NotFoundException | NullPointerException e) { - log.info("{} does not exist in the DB yet!", email, e); + log.info("{} does not exist in the DB yet!", email); } } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ProcessCaptureSessions.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ProcessCaptureSessions.java index 5ac2f22cc0..2855b69bf8 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ProcessCaptureSessions.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/ProcessCaptureSessions.java @@ -3,6 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import uk.gov.hmcts.reform.preapi.dto.CaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.EncodeJobDTO; import uk.gov.hmcts.reform.preapi.enums.EncodeTransform; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; @@ -45,7 +46,7 @@ public void run() { signInRobotUser(); log.info("Starting process capture session task"); - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); encodeJobService.findAllProcessing().forEach(job -> checkJob(job, mediaService)); encodeJobService.findAllProcessing() @@ -108,7 +109,7 @@ private void checkJob(EncodeJobDTO job, IMediaService mediaService) { private void onEncodeFromIngestProcessingComplete(EncodeJobDTO job, IMediaService mediaService) { log.info("EncodeFromIngest for capture session {} is complete", job.getCaptureSessionId()); - var jobName = mediaService.triggerProcessingStep2(job.getRecordingId(), false); + String jobName = mediaService.triggerProcessingStep2(job.getRecordingId(), false); if (jobName == null) { log.info("No recording found for capture session {}", job.getCaptureSessionId()); @@ -127,7 +128,7 @@ private void onEncodeFromMp4ProcessingComplete(EncodeJobDTO job, IMediaService m encodeJobService.delete(job.getId()); if (mediaService.verifyFinalAssetExists(job.getRecordingId()) == RecordingStatus.RECORDING_AVAILABLE) { log.info("Final asset found for capture session {}", job.getCaptureSessionId()); - var captureSession = captureSessionService.stopCaptureSession( + CaptureSessionDTO captureSession = captureSessionService.stopCaptureSession( job.getCaptureSessionId(), RecordingStatus.RECORDING_AVAILABLE, job.getRecordingId() @@ -140,6 +141,7 @@ private void onEncodeFromMp4ProcessingComplete(EncodeJobDTO job, IMediaService m } } + @SuppressWarnings("PMD.TooFewBranchesForSwitch") private String getTransformName(EncodeTransform transform) { return switch (transform) { case ENCODE_FROM_INGEST -> MediaKind.ENCODE_FROM_INGEST_TRANSFORM; diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/RobotUserTask.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/RobotUserTask.java index 610ad1635a..578e221933 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/RobotUserTask.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/RobotUserTask.java @@ -3,6 +3,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; +import uk.gov.hmcts.reform.preapi.dto.AccessDTO; +import uk.gov.hmcts.reform.preapi.dto.base.BaseAppAccessDTO; +import uk.gov.hmcts.reform.preapi.security.authentication.UserAuthentication; import uk.gov.hmcts.reform.preapi.security.service.UserAuthenticationService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -22,13 +25,13 @@ protected RobotUserTask(UserService userService, protected void signInRobotUser() { log.info("Sign in as robot user"); - var user = userService.findByEmail(cronUserEmail); + AccessDTO user = userService.findByEmail(cronUserEmail); - var appAccess = user.getAppAccess().stream().findFirst() + BaseAppAccessDTO appAccess = user.getAppAccess().stream().findFirst() .orElseThrow(() -> new RuntimeException( "Failed to authenticate as cron user with email " + cronUserEmail) ); - var userAuth = userAuthenticationService.validateUser(appAccess.getId().toString()) + UserAuthentication userAuth = userAuthenticationService.validateUser(appAccess.getId().toString()) .orElseThrow(() -> new RuntimeException( "Failed to authenticate as cron user with email " + cronUserEmail) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/StartLiveEvents.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/StartLiveEvents.java index def02781d8..dcf9043352 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/StartLiveEvents.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/StartLiveEvents.java @@ -5,10 +5,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.preapi.dto.BookingDTO; +import uk.gov.hmcts.reform.preapi.dto.CaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.media.LiveEventDTO; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; +import uk.gov.hmcts.reform.preapi.media.IMediaService; import uk.gov.hmcts.reform.preapi.media.MediaResourcesHelper; import uk.gov.hmcts.reform.preapi.media.MediaServiceBroker; import uk.gov.hmcts.reform.preapi.security.service.UserAuthenticationService; @@ -25,6 +27,7 @@ @Slf4j @Component public class StartLiveEvents extends RobotUserTask { + private static final String LIVE_EVENT_RUNNING_STATE = "Running"; private final MediaServiceBroker mediaServiceBroker; private final BookingService bookingService; @@ -33,6 +36,7 @@ public class StartLiveEvents extends RobotUserTask { private final int batchSize; private final int pollInterval; + @Autowired public StartLiveEvents(UserService userService, UserAuthenticationService userAuthenticationService, @@ -74,7 +78,7 @@ public void run() { private UUID initCaptureSessionForBooking(UUID bookingId) { log.info("Creating capture session for booking {}", bookingId); - var dto = new CreateCaptureSessionDTO(); + CreateCaptureSessionDTO dto = new CreateCaptureSessionDTO(); dto.setId(UUID.randomUUID()); dto.setBookingId(bookingId); dto.setOrigin(RecordingOrigin.PRE); @@ -93,8 +97,8 @@ private UUID initCaptureSessionForBooking(UUID bookingId) { private void startLiveEvent(UUID captureSessionId) { log.info("Starting live event for capture session {}", captureSessionId); - var mediaService = mediaServiceBroker.getEnabledMediaService(); - var dto = captureSessionService.findById(captureSessionId); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); + CaptureSessionDTO dto = captureSessionService.findById(captureSessionId); try { mediaService.startLiveEvent(dto); @@ -109,9 +113,9 @@ private void startLiveEvent(UUID captureSessionId) { private void awaitIngestAddresses(List captureSessionIds) { log.info("Awaiting ingest addresses for capture sessions"); - var mediaService = mediaServiceBroker.getEnabledMediaService(); + IMediaService mediaService = mediaServiceBroker.getEnabledMediaService(); - var startingCaptureSessions = captureSessionIds + List startingCaptureSessions = captureSessionIds .stream() .filter(id -> captureSessionService.findById(id).getStatus().equals(RecordingStatus.INITIALISING)) .toList(); @@ -119,10 +123,10 @@ private void awaitIngestAddresses(List captureSessionIds) { try { do { Thread.sleep(pollInterval); - var liveEvents = mediaService.getLiveEvents(); + List liveEvents = mediaService.getLiveEvents(); startingCaptureSessions = startingCaptureSessions.stream() .filter(id -> { - var result = tryGetIngestAddress(id, liveEvents); + boolean result = tryGetIngestAddress(id, liveEvents); if (result) { log.info("Ingest address obtained for capture session {}", id); } @@ -130,14 +134,11 @@ private void awaitIngestAddresses(List captureSessionIds) { }) .toList(); } while (!startingCaptureSessions.isEmpty()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + handleIngestAddressException(startingCaptureSessions, e); } catch (Exception e) { - if (e instanceof InterruptedException) { - Thread.currentThread().interrupt(); - } - startingCaptureSessions.forEach(id -> { - log.error("Failed to await ingest address for capture session {}", id, e); - captureSessionService.startCaptureSession(id, RecordingStatus.FAILURE, null); - }); + handleIngestAddressException(startingCaptureSessions, e); } } @@ -158,4 +159,11 @@ private boolean tryGetIngestAddress(UUID captureSessionId, List li ? liveEvent.getInputRtmp() : null; } + + private void handleIngestAddressException(List startingCaptureSessions, Exception ex) { + startingCaptureSessions.forEach(id -> { + log.error("Failed to await ingest address for capture session {}", id, ex); + captureSessionService.startCaptureSession(id, RecordingStatus.FAILURE, null); + }); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/BaseTask.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/BaseTask.java index 11cca6e72c..dc0dddae0a 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/BaseTask.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/BaseTask.java @@ -36,7 +36,7 @@ public BaseTask(UserService userService, protected void startJob(Job job, String jobName, String... extraParams) { try { - var jobParametersBuilder = new JobParametersBuilder() + JobParametersBuilder jobParametersBuilder = new JobParametersBuilder() .addLong("time", System.currentTimeMillis()) .addString("debug", String.valueOf(debug)) .addString("dryRun", String.valueOf(dryRun)); diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/FetchData.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/FetchData.java index 9a37ed4c1e..1244026fd5 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/FetchData.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/FetchData.java @@ -30,7 +30,7 @@ public FetchData(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { startJob(fetchDataJob, "Fetch Data", "sourceType", sourceType); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/MigrateResolved.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/MigrateResolved.java index b1bb66b77b..3fdc95f5d9 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/MigrateResolved.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/MigrateResolved.java @@ -31,7 +31,7 @@ public MigrateResolved(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { startJob(resolvedMigrationRecordJob, "Process Resolved Migration Records"); } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/PostProcessMigration.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/PostProcessMigration.java index 15ff215785..33380aef36 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/PostProcessMigration.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/PostProcessMigration.java @@ -27,7 +27,7 @@ public PostProcessMigration(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { startJob(postMigrationJob, "Post Migration"); } } diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/ProcessMigration.java b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/ProcessMigration.java index 7d735310bc..152ecc7a86 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/ProcessMigration.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/tasks/migration/ProcessMigration.java @@ -27,7 +27,7 @@ public ProcessMigration(UserService userService, } @Override - public void run() throws RuntimeException { + public void run() { startJob(processCSVJob, "Transform"); } } diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ProcessorTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ProcessorTest.java index 2a65a9ed56..1cad94e365 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ProcessorTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/ProcessorTest.java @@ -137,7 +137,7 @@ void shouldReturnNullForUnsupportedItemType() throws Exception { void shouldHandleExtractionFailure() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.PENDING); when(extractionService.process(any(MigrationRecord.class))) - .thenReturn(ServiceResult.error("Extraction failed", "ExtractionError")); + .thenReturn(ServiceResult.createErrorResult("Extraction failed", "ExtractionError")); MigratedItemGroup result = processor.process(testMigrationRecord); @@ -152,7 +152,7 @@ void shouldHandleValidationFailure() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.PENDING); setupSuccessfulProcessingMocks(); when(validationService.validateProcessedRecording(any())) - .thenReturn(ServiceResult.error("Validation failed", "ValidationError")); + .thenReturn(ServiceResult.createErrorResult("Validation failed", "ValidationError")); MigratedItemGroup result = processor.process(testMigrationRecord); @@ -208,7 +208,7 @@ void shouldProcessPendingRecordingSuccessfully() throws Exception { @Test void shouldHandlePreExistingFailureFromExtraction() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.PENDING); - doReturn(ServiceResult.error("Keyword 'PRE' found", "Pre_Existing")) + doReturn(ServiceResult.createErrorResult("Keyword 'PRE' found", "Pre_Existing")) .when(extractionService).process(any(MigrationRecord.class)); MigratedItemGroup result = processor.process(testMigrationRecord); @@ -226,7 +226,7 @@ void shouldHandlePreExistingFailureFromExtraction() throws Exception { @Test void shouldHandleRawFileFailureFromExtraction() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.PENDING); - doReturn(ServiceResult.error(Constants.ErrorMessages.RAW_FILE, "Raw_Files")) + doReturn(ServiceResult.createErrorResult(Constants.ErrorMessages.RAW_FILE, "Raw_Files")) .when(extractionService).process(any(MigrationRecord.class)); MigratedItemGroup result = processor.process(testMigrationRecord); @@ -249,13 +249,14 @@ void shouldHandleRawFileFailureFromExtraction() throws Exception { @Test void shouldProcessResolvedRecordingSuccessfully() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.SUBMITTED); - ServiceResult transformationResult = ServiceResult.success(testProcessedRecording); - ServiceResult validationResult = ServiceResult.success(testProcessedRecording); - + ServiceResult transformationResult = ServiceResult + .createSuccessResult(testProcessedRecording); + ServiceResult validationResult = ServiceResult.createSuccessResult(testProcessedRecording); + when(transformationService.transformData(any(ExtractedMetadata.class))).thenReturn(transformationResult); when(validationService.validateResolvedRecording( testProcessedRecording, testMigrationRecord.getArchiveName())).thenReturn(validationResult); - when(migrationService.createMigratedItemGroup(any(ExtractedMetadata.class), + when(migrationService.createMigratedItemGroup(any(ExtractedMetadata.class), eq(testProcessedRecording))).thenReturn(testMigratedItemGroup); MigratedItemGroup result = processor.process(testMigrationRecord); @@ -270,10 +271,11 @@ void shouldProcessResolvedRecordingSuccessfully() throws Exception { @Test void shouldHandleResolvedValidationFailure() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.SUBMITTED); - ServiceResult transformationResult = ServiceResult.success(testProcessedRecording); - ServiceResult validationResult = ServiceResult.error( + ServiceResult transformationResult = ServiceResult + .createSuccessResult(testProcessedRecording); + ServiceResult validationResult = ServiceResult.createErrorResult( "Resolved validation failed", "ResolvedValidationError"); - + when(transformationService.transformData(any(ExtractedMetadata.class))).thenReturn(transformationResult); when(validationService.validateResolvedRecording( testProcessedRecording, testMigrationRecord.getArchiveName())).thenReturn(validationResult); @@ -282,8 +284,8 @@ void shouldHandleResolvedValidationFailure() throws Exception { assertNull(result); verify(migrationRecordService).updateToFailed( - testMigrationRecord.getArchiveId(), - "ResolvedValidationError", + testMigrationRecord.getArchiveId(), + "ResolvedValidationError", "Resolved validation failed" ); } @@ -297,7 +299,7 @@ void shouldReturnNullForUnexpectedStatus() throws Exception { assertNull(result); verify(loggingService).logWarning( "MigrationRecord with archiveId=%s has unexpected status: %s", - testMigrationRecord.getArchiveId(), + testMigrationRecord.getArchiveId(), VfMigrationStatus.FAILED ); } @@ -336,7 +338,7 @@ void shouldCreateNotifyItemForDoubleBarrelledWitnessName() throws Exception { testProcessedRecording.setWitnessFirstName("Mary-Jane"); testProcessedRecording.setUrn("12345678901"); testProcessedRecording.setExhibitReference("EXHIBIT123"); - + setupSuccessfulProcessingMocks(); processor.process(testMigrationRecord); @@ -351,7 +353,7 @@ void shouldCreateNotifyItemForMissingUrn() throws Exception { testMigrationRecord.setStatus(VfMigrationStatus.PENDING); testExtractedMetadata = createTestExtractedMetadata(); testExtractedMetadata.setUrn(null); - + testProcessedRecording.setDefendantLastName("Smith"); testProcessedRecording.setWitnessFirstName("Mary"); testProcessedRecording.setUrn(""); @@ -386,10 +388,11 @@ void shouldCreateNotifyItemForCaseReferenceLength() throws Exception { @SuppressWarnings("unchecked") private void setupSuccessfulProcessingMocks() { - ServiceResult transformationResult = ServiceResult.success(testProcessedRecording); - ServiceResult validationResult = ServiceResult.success(testProcessedRecording); - - doReturn(ServiceResult.success(testExtractedMetadata)).when(extractionService) + ServiceResult transformationResult = ServiceResult + .createSuccessResult(testProcessedRecording); + ServiceResult validationResult = ServiceResult.createSuccessResult(testProcessedRecording); + + doReturn(ServiceResult.createSuccessResult(testExtractedMetadata)).when(extractionService) .process(any(MigrationRecord.class)); when(transformationService.transformData(any(ExtractedMetadata.class))).thenReturn(transformationResult); when(migrationRecordService.findByArchiveId(anyString())).thenReturn(Optional.empty()); @@ -399,7 +402,7 @@ private void setupSuccessfulProcessingMocks() { .thenReturn(validationResult); when(migrationService.createMigratedItemGroup(any(ExtractedMetadata.class), any(ProcessedRecording.class))) .thenReturn(testMigratedItemGroup); - + doNothing().when(migrationRecordService).updateMetadataFields(anyString(), any(ExtractedMetadata.class)); doNothing().when(loggingService).incrementProgress(); doNothing().when(cacheService).dumpToFile(); @@ -457,5 +460,5 @@ private MigratedItemGroup createTestMigratedItemGroup() { return group; } - -} \ No newline at end of file + +} diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessorTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessorTest.java index 7f5af8176c..e34dfaa035 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessorTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/processor/RecordingMetadataProcessorTest.java @@ -66,7 +66,7 @@ void shouldSkipIfExtractionFails() { when(migrationRecordService.findByArchiveId("B456")) .thenReturn(Optional.of(record)); when(extractionService.process(record)) - .thenReturn(ServiceResult.error("Error", "Mock failure")); + .thenReturn(ServiceResult.createErrorResult("Error", "Mock failure")); processor.processRecording(record); @@ -91,10 +91,10 @@ void shouldSkipIfExtractionIsTest() { true ); - ServiceResult testResult = ServiceResult.test(testItem); + ServiceResult testResult = ServiceResult.createTestResult(testItem); when(extractionService.process(record)) - .thenAnswer(invocation -> testResult); + .thenAnswer(invocation -> testResult); processor.processRecording(record); @@ -117,10 +117,10 @@ void shouldSkipIfTransformationFails() { .thenReturn(Optional.of(record)); when(extractionService.process(record)) - .thenAnswer(invocation -> ServiceResult.success(extracted)); + .thenAnswer(invocation -> ServiceResult.createSuccessResult(extracted)); when(transformationService.transformData(extracted)) - .thenAnswer(invocation -> ServiceResult.error("Error", "Missing")); + .thenAnswer(invocation -> ServiceResult.createErrorResult("Error", "Missing")); processor.processRecording(record); @@ -147,10 +147,10 @@ void shouldProcessAndUpdateParentIfCopy() { .thenReturn(Optional.of(record)); when(extractionService.process(record)) - .thenAnswer(invocation -> ServiceResult.success(extracted)); + .thenAnswer(invocation -> ServiceResult.createSuccessResult(extracted)); when(transformationService.transformData(extracted)) - .thenAnswer(invocation -> ServiceResult.success(processed)); + .thenAnswer(invocation -> ServiceResult.createSuccessResult(processed)); processor.processRecording(record); @@ -173,4 +173,4 @@ void shouldHandleExceptionGracefully() { verify(migrationRecordService).findByArchiveId("X999"); } -} \ No newline at end of file +} diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java index 6341eacb1f..5239c8108b 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java @@ -32,7 +32,6 @@ import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; -import java.lang.reflect.Method; import java.sql.Timestamp; import java.time.Duration; import java.time.Instant; @@ -173,7 +172,7 @@ public void createBookingReturnsNullIfCopyHasNoOrigBookingId() { when(migrationRecordService.findByArchiveId(archiveId.toString())) .thenReturn(Optional.of(copyRecord)); when(migrationRecordService.getOrigFromCopy(copyRecord)) - .thenReturn(Optional.of(new MigrationRecord())); + .thenReturn(Optional.of(new MigrationRecord())); ProcessedRecording recording = ProcessedRecording.builder() .archiveId(archiveId.toString()) @@ -373,7 +372,7 @@ public void createParticipantsWithBoth() { @Test @DisplayName("Should filter participants by witness or defendant name") public void createBookingShouldFilterParticipants() { - + CreateParticipantDTO witness = new CreateParticipantDTO(); witness.setId(UUID.randomUUID()); witness.setFirstName("John"); @@ -696,7 +695,7 @@ void createShareBookingAndInviteIfNotExistsShouldNormalizeEmailCase() { @DisplayName("Should handle exception when getting user by email") void getUserByEmailShouldHandleException() { String email = "error@example.com"; - + when(userService.findByEmail(email)).thenThrow(new RuntimeException("Service error")); UUID result = entityCreationService.getUserByEmail(email); @@ -758,7 +757,7 @@ void createRecordingShouldReturnNullForCopyWithNoOrigRecord() { void createRecordingShouldReturnNullForCopyWhenOrigHasNoRecordingId() { MigrationRecord copyRecord = new MigrationRecord(); copyRecord.setArchiveId("COPY123"); - + MigrationRecord origRecord = new MigrationRecord(); origRecord.setArchiveId("ORIG123"); origRecord.setRecordingId(null); // No recording ID @@ -788,10 +787,10 @@ void createRecordingShouldReturnNullForCopyWhenOrigHasNoRecordingId() { @DisplayName("Should create COPY recording with parent recording ID when all conditions met") void createRecordingShouldCreateCopyWithParentRecordingId() { UUID parentRecordingId = UUID.randomUUID(); - + MigrationRecord copyRecord = new MigrationRecord(); copyRecord.setArchiveId("COPY123"); - + MigrationRecord origRecord = new MigrationRecord(); origRecord.setArchiveId("ORIG123"); origRecord.setRecordingId(parentRecordingId); @@ -819,71 +818,6 @@ void createRecordingShouldCreateCopyWithParentRecordingId() { verify(migrationRecordService, times(1)).updateRecordingId(eq("COPY123"), any(UUID.class)); } - @Test - @DisplayName("Should test isOrigRecordingPersisted method through reflection for false case") - void isOrigRecordingPersistedShouldReturnFalseWhenRecordNotFound() throws Exception { - Method method = EntityCreationService.class.getDeclaredMethod("isOrigRecordingPersisted", String.class); - method.setAccessible(true); - - when(migrationRecordService.findByArchiveId("MISSING_ARCH")).thenReturn(Optional.empty()); - - Boolean result = (Boolean) method.invoke(entityCreationService, "MISSING_ARCH"); - - assertThat(result).isFalse(); - } - - @Test - @DisplayName("Should test isOrigRecordingPersisted method for false case when no orig found") - void isOrigRecordingPersistedShouldReturnFalseWhenNoOrigFound() throws Exception { - Method method = EntityCreationService.class.getDeclaredMethod("isOrigRecordingPersisted", String.class); - method.setAccessible(true); - - MigrationRecord copyRecord = new MigrationRecord(); - when(migrationRecordService.findByArchiveId("COPY123")).thenReturn(Optional.of(copyRecord)); - when(migrationRecordService.getOrigFromCopy(copyRecord)).thenReturn(Optional.empty()); - - Boolean result = (Boolean) method.invoke(entityCreationService, "COPY123"); - - assertThat(result).isFalse(); - } - - @Test - @DisplayName("Should test isOrigRecordingPersisted method for false case when recording ID is null") - void isOrigRecordingPersistedShouldReturnFalseWhenRecordingIdIsNull() throws Exception { - Method method = EntityCreationService.class.getDeclaredMethod("isOrigRecordingPersisted", String.class); - method.setAccessible(true); - - MigrationRecord copyRecord = new MigrationRecord(); - MigrationRecord origRecord = new MigrationRecord(); - origRecord.setRecordingId(null); - - when(migrationRecordService.findByArchiveId("COPY123")).thenReturn(Optional.of(copyRecord)); - when(migrationRecordService.getOrigFromCopy(copyRecord)).thenReturn(Optional.of(origRecord)); - - Boolean result = (Boolean) method.invoke(entityCreationService, "COPY123"); - - assertThat(result).isFalse(); - } - - @Test - @DisplayName("Should test isOrigRecordingPersisted method for true case") - void isOrigRecordingPersistedShouldReturnTrueWhenRecordingIdExists() throws Exception { - Method method = EntityCreationService.class.getDeclaredMethod("isOrigRecordingPersisted", String.class); - method.setAccessible(true); - - UUID recordingId = UUID.randomUUID(); - MigrationRecord copyRecord = new MigrationRecord(); - MigrationRecord origRecord = new MigrationRecord(); - origRecord.setRecordingId(recordingId); - - when(migrationRecordService.findByArchiveId("COPY123")).thenReturn(Optional.of(copyRecord)); - when(migrationRecordService.getOrigFromCopy(copyRecord)).thenReturn(Optional.of(origRecord)); - - Boolean result = (Boolean) method.invoke(entityCreationService, "COPY123"); - - assertThat(result).isTrue(); - } - @Test @DisplayName("Should create capture session and update migration record for non-COPY version") void createCaptureSessionShouldUpdateMigrationRecordForNonCopyVersion() { @@ -933,8 +867,8 @@ void createRecordingShouldUpdateMigrationRecordForNonCopyVersion() { @DisplayName("Should handle empty trimmed participant names") void createParticipantsShouldIgnoreEmptyTrimmedNames() { ProcessedRecording recording = ProcessedRecording.builder() - .witnessFirstName(" ") - .defendantLastName("") + .witnessFirstName(" ") + .defendantLastName("") .build(); Set participants = entityCreationService.createParticipants(recording); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfigTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfigTest.java index bb6a2477ec..b47e8f9a86 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfigTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ProcessCSVJobConfigTest.java @@ -16,7 +16,6 @@ import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationStatus; import uk.gov.hmcts.reform.preapi.batch.application.services.reporting.LoggingService; import uk.gov.hmcts.reform.preapi.batch.config.BatchConfiguration; -import uk.gov.hmcts.reform.preapi.batch.config.jobs.ProcessCSVJobConfig; import uk.gov.hmcts.reform.preapi.batch.config.steps.CoreStepsConfig; import uk.gov.hmcts.reform.preapi.batch.entities.MigratedItemGroup; import uk.gov.hmcts.reform.preapi.batch.entities.MigrationRecord; @@ -137,7 +136,7 @@ void shouldCreateProcessCSVJobWithAllSteps() { @Test void shouldCreatePendingMigrationRecordStepWithDryRunWriter() { // Given - when(coreStepsConfig.getDryRunFlag()).thenReturn(true); + when(coreStepsConfig.isDryRun()).thenReturn(true); when(coreStepsConfig.noOpWriter()).thenReturn(noOpWriter); // When @@ -150,14 +149,14 @@ void shouldCreatePendingMigrationRecordStepWithDryRunWriter() { // Then assertThat(result).isNotNull(); assertThat(result.getName()).isEqualTo("pendingMigrationRecordStep"); - verify(coreStepsConfig).getDryRunFlag(); + verify(coreStepsConfig).isDryRun(); verify(coreStepsConfig).noOpWriter(); } @Test void shouldCreatePendingMigrationRecordStepWithRegularWriter() { // Given - when(coreStepsConfig.getDryRunFlag()).thenReturn(false); + when(coreStepsConfig.isDryRun()).thenReturn(false); // When Step result = processCSVJobConfig.pendingMigrationRecordStep( @@ -169,7 +168,7 @@ void shouldCreatePendingMigrationRecordStepWithRegularWriter() { // Then assertThat(result).isNotNull(); assertThat(result.getName()).isEqualTo("pendingMigrationRecordStep"); - verify(coreStepsConfig).getDryRunFlag(); + verify(coreStepsConfig).isDryRun(); } @Test diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfigTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfigTest.java index 2cf5c78d44..aca3949f8b 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfigTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/jobs/ResolvedJobConfigTest.java @@ -14,7 +14,6 @@ import org.springframework.transaction.PlatformTransactionManager; import uk.gov.hmcts.reform.preapi.batch.application.enums.VfMigrationStatus; import uk.gov.hmcts.reform.preapi.batch.application.services.reporting.LoggingService; -import uk.gov.hmcts.reform.preapi.batch.config.jobs.ResolvedJobConfig; import uk.gov.hmcts.reform.preapi.batch.config.steps.CoreStepsConfig; import uk.gov.hmcts.reform.preapi.batch.entities.MigratedItemGroup; import uk.gov.hmcts.reform.preapi.batch.entities.MigrationRecord; @@ -123,7 +122,7 @@ void shouldCreateResolvedMigrationRecordReaderWithEmptyList() { void shouldCreateResolvedMigrationRecordStepWithDryRunEnabled() { // Given ListItemReader reader = new ListItemReader<>(Collections.emptyList()); - when(coreSteps.getDryRunFlag()).thenReturn(true); + when(coreSteps.isDryRun()).thenReturn(true); when(coreSteps.noOpWriter()).thenReturn(noOpObjectWriter); // When @@ -132,7 +131,7 @@ void shouldCreateResolvedMigrationRecordStepWithDryRunEnabled() { // Then assertThat(step).isNotNull(); assertThat(step.getName()).isEqualTo("resolvedMigrationRecordStep"); - verify(coreSteps).getDryRunFlag(); + verify(coreSteps).isDryRun(); verify(coreSteps).noOpWriter(); } @@ -140,7 +139,7 @@ void shouldCreateResolvedMigrationRecordStepWithDryRunEnabled() { void shouldCreateResolvedMigrationRecordStepWithDryRunDisabled() { // Given ListItemReader reader = new ListItemReader<>(Collections.emptyList()); - when(coreSteps.getDryRunFlag()).thenReturn(false); + when(coreSteps.isDryRun()).thenReturn(false); // When Step step = resolvedJobConfig.resolvedMigrationRecordStep(reader, processor, writer); @@ -148,7 +147,7 @@ void shouldCreateResolvedMigrationRecordStepWithDryRunDisabled() { // Then assertThat(step).isNotNull(); assertThat(step.getName()).isEqualTo("resolvedMigrationRecordStep"); - verify(coreSteps).getDryRunFlag(); + verify(coreSteps).isDryRun(); } @Test diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfigTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfigTest.java index 793b83f576..603f78fd7c 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfigTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/config/steps/CoreStepsConfigTest.java @@ -18,7 +18,6 @@ import uk.gov.hmcts.reform.preapi.batch.application.services.migration.MigrationTrackerService; import uk.gov.hmcts.reform.preapi.batch.application.services.reporting.LoggingService; import uk.gov.hmcts.reform.preapi.batch.application.writer.MigrationWriter; -import uk.gov.hmcts.reform.preapi.batch.config.steps.CoreStepsConfig; import java.io.ByteArrayInputStream; @@ -65,7 +64,7 @@ void setup() { @Test void getDryRunFlagShouldReturnFalseWhenNoContext() { JobSynchronizationManager.close(); - assertThat(stepsConfig.getDryRunFlag()).isFalse(); + assertThat(stepsConfig.isDryRun()).isFalse(); } @@ -109,7 +108,7 @@ void getDryRunFlagShouldReturnTrueWhenParameterIsTrue() { JobExecution jobExecution = new JobExecution(1L, params); JobSynchronizationManager.register(jobExecution); - assertThat(stepsConfig.getDryRunFlag()).isTrue(); + assertThat(stepsConfig.isDryRun()).isTrue(); JobSynchronizationManager.close(); } diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/controller/AuditControllerTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/controller/AuditControllerTest.java index 5c17a72322..0fecbdfa9f 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/controller/AuditControllerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/controller/AuditControllerTest.java @@ -68,8 +68,6 @@ void createAuditEndpointCreated() throws Exception { var xUserId = UUID.randomUUID(); when(auditService.upsert(audit, xUserId)).thenReturn(UpsertResult.CREATED); - System.out.println(OBJECT_MAPPER.writeValueAsString(audit)); - MvcResult response = mockMvc.perform(put(getPath(audit.getId())) .with(csrf()) .header(X_USER_ID_HEADER, xUserId) @@ -94,8 +92,6 @@ void createAuditEndpointWithoutXUserIdCreated() throws Exception { var xUserId = UUID.randomUUID(); when(auditService.upsert(audit, xUserId)).thenReturn(UpsertResult.CREATED); - System.out.println(OBJECT_MAPPER.writeValueAsString(audit)); - MvcResult response = mockMvc.perform(put(getPath(audit.getId())) .with(csrf()) .content(OBJECT_MAPPER.writeValueAsString(audit)) diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/controller/params/SearchRecordingsTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/controller/params/SearchRecordingsTest.java index c91581f804..285658a643 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/controller/params/SearchRecordingsTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/controller/params/SearchRecordingsTest.java @@ -46,7 +46,8 @@ public void getDefendantName() { searchRecordings.setDefendantName(null); assertNull(searchRecordings.getDefendantName()); } - + + @Test public void getId() { var searchRecordings = new SearchRecordings(); searchRecordings.setId("abc"); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidatorTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidatorTest.java index 181edec2eb..36b6659f5b 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/dto/validators/NotPastDateValidatorTest.java @@ -47,7 +47,7 @@ void isValidWithDateToday() { @DisplayName("Should return true when value is in the future") @Test - void givenFutureDate_ReturnsTrue() { + void givenFutureDateReturnsTrue() { ZonedDateTime futureDateTime = ZonedDateTime.now(ZoneId.of("Europe/London")) .plusDays(1); Timestamp futureTimestamp = Timestamp.from(futureDateTime.toInstant()); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/email/GovNotifyTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/email/GovNotifyTest.java index 7ac4bf14b4..72a89e150a 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/email/GovNotifyTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/email/GovNotifyTest.java @@ -39,7 +39,7 @@ public class GovNotifyTest { @MockitoBean NotificationClient mockGovNotifyClient; - private final String govNotifyEmailResponse = """ + private static final String govNotifyEmailResponse = """ { "id": "740e5834-3a29-46b4-9a6f-16142fde533a", "reference": "STRING", diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoderTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoderTest.java index f6497673b2..ed86561005 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoderTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/media/FeignErrorDecoderTest.java @@ -5,6 +5,7 @@ import feign.FeignException; import feign.Request; import feign.Response; +import lombok.Cleanup; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; @@ -31,7 +32,7 @@ public class FeignErrorDecoderTest { @DisplayName("Test for 404") @Test void test404() throws JsonProcessingException { - var response = Response.builder() + @Cleanup var response = Response.builder() .request(REQUEST) .headers(Collections.singletonMap("AcceptTest", Collections.singletonList("Yes"))) .status(HttpStatus.NOT_FOUND.value()) @@ -48,7 +49,7 @@ void test404() throws JsonProcessingException { @Test @SuppressWarnings("checkstyle:linelength") void test400() throws JsonProcessingException { - var response = Response.builder() + @Cleanup var response = Response.builder() .request(REQUEST) .headers(Collections.singletonMap("AcceptTest", Collections.singletonList("Yes"))) .status(HttpStatus.BAD_REQUEST.value()) @@ -64,7 +65,7 @@ void test400() throws JsonProcessingException { @DisplayName("Test for 400 which should be a 409") @Test void test400to409() throws JsonProcessingException { - var response = Response.builder() + @Cleanup var response = Response.builder() .request(REQUEST) .headers(Collections.singletonMap("AcceptTest", Collections.singletonList("Yes"))) .status(HttpStatus.BAD_REQUEST.value()) @@ -80,7 +81,7 @@ void test400to409() throws JsonProcessingException { @DisplayName("Test for 409") @Test void test409() throws JsonProcessingException { - var response = Response.builder() + @Cleanup var response = Response.builder() .request(REQUEST) .headers(Collections.singletonMap("AcceptTest", Collections.singletonList("Yes"))) .status(HttpStatus.CONFLICT.value()) diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/media/storage/AzureIngestStorageServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/media/storage/AzureIngestStorageServiceTest.java index b36d29581d..f91e2e34b5 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/media/storage/AzureIngestStorageServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/media/storage/AzureIngestStorageServiceTest.java @@ -20,6 +20,7 @@ import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.file.Files; import java.util.HashMap; import java.util.Map; @@ -107,7 +108,7 @@ void uploadBlobSuccess() throws IOException { assertTrue(azureIngestStorageService.uploadBlob(localFileName, containerName, uploadFileName)); - verify(mockBlobClient, times(1)).upload(any(FileInputStream.class), anyLong(), eq(true)); + verify(mockBlobClient, times(1)).upload(any(InputStream.class), anyLong(), eq(true)); // clean up Files.deleteIfExists(tempFile); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterTest.java index b83a29f4f6..c952b47a0d 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/security/XUserIdFilterTest.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.preapi.security; import jakarta.servlet.http.HttpServletResponse; +import lombok.Cleanup; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -88,7 +89,7 @@ void doFilterNotFoundUserIdSuccess() throws Exception { var request = mock(MockHttpServletRequest.class); var response = mock(MockHttpServletResponse.class); var id = UUID.randomUUID(); - var writer = mock(PrintWriter.class); + @Cleanup var writer = mock(PrintWriter.class); when(response.getWriter()).thenReturn(writer); when(request.getRequestURI()).thenReturn("/example-uri"); when(request.getMethod()).thenReturn("GET"); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java index 2d0dca865d..c81a7241cf 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/services/BookingServiceTest.java @@ -33,7 +33,6 @@ import java.time.Instant; import java.time.LocalDate; import java.time.LocalTime; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -98,19 +97,9 @@ void findAllByCaseIdSuccess() { var bookingModel2 = new BookingDTO(bookingEntity2); when(bookingRepository.findByCaseId_IdAndDeletedAtIsNull(caseEntity.getId(), null)) - .thenReturn(new PageImpl<>(new ArrayList<>() { - { - add(bookingEntity1); - add(bookingEntity2); - } - })); + .thenReturn(new PageImpl<>(List.of(bookingEntity1, bookingEntity2))); assertThat(bookingService.findAllByCaseId(caseEntity.getId(), null).getContent()) - .isEqualTo(new ArrayList<>() { - { - add(bookingModel1); - add(bookingModel2); - } - }); + .isEqualTo(List.of(bookingModel1, bookingModel2)); } @DisplayName("Search By Case Ref") @@ -155,13 +144,7 @@ void searchByCaseRefSuccess() { null, false, null - )) - .thenReturn(new PageImpl<>(new ArrayList<>() { - { - add(bookingEntity1); - add(bookingEntity2); - } - })); + )).thenReturn(new PageImpl<>(List.of(bookingEntity1, bookingEntity2))); assertThat( bookingService .searchBy(null, "MyRef", null, Optional.empty(), null, null, null, null, null) diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/services/CourtServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/services/CourtServiceTest.java index 0aa6ac7208..4d84839c50 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/services/CourtServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/services/CourtServiceTest.java @@ -44,7 +44,7 @@ public class CourtServiceTest { @Autowired private CourtService courtService; - private Pageable pageable = PageRequest.of(0, 20); + private final Pageable pageable = PageRequest.of(0, 20); @BeforeAll static void setUp() { diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsersTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsersTest.java index bd2daa6d9d..8a9e9237fb 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsersTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/tasks/ObscureNROUsersTest.java @@ -81,6 +81,7 @@ class ObscureNROUsersTest { private List testImportedNROUsers; @BeforeEach + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") void beforeEach() { var accessDto = mock(AccessDTO.class); var baseAppAccessDTO = mock(BaseAppAccessDTO.class); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/util/HelperFactory.java b/src/test/java/uk/gov/hmcts/reform/preapi/util/HelperFactory.java index dbfe3961ef..306459a485 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/util/HelperFactory.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/util/HelperFactory.java @@ -36,8 +36,8 @@ import java.util.concurrent.ThreadLocalRandom; import javax.annotation.Nullable; -@SuppressWarnings("checkstyle:HideUtilityClassConstructor") @UtilityClass +@SuppressWarnings({ "checkstyle:HideUtilityClassConstructor", "PMD.CouplingBetweenObjects" }) public class HelperFactory { public static User createDefaultTestUser() { return createUser("Test", "User", "example@example.com", new Timestamp(System.currentTimeMillis()), null, null);