Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DTSCCI-1611 add Caching for ReadOnly Dashboard entities #6138

Merged
merged 18 commits into from
Feb 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
dd40dcf
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 11, 2025
38fad2f
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 11, 2025
71f13a0
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 11, 2025
c54641b
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 11, 2025
9a948c4
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
ruban72 Feb 11, 2025
94f7966
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 12, 2025
0976543
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 12, 2025
e849aa6
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 12, 2025
b854d6b
DTSCCI-1592: add Caching for ReadOnly Dashboard entities
ruban72 Feb 12, 2025
793e834
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
ruban72 Feb 12, 2025
5b766b0
DTSCCI-1592: Logging for Caching of ReadOnly Dashboard entities
ruban72 Feb 13, 2025
ed564d2
Merge remote-tracking branch 'origin/DTSCCI-1592_AddCachingDashboard'…
ruban72 Feb 13, 2025
df80f10
DTSCCI-1592: Logging for Caching of ReadOnly Dashboard entities
ruban72 Feb 13, 2025
91740df
DTSCCI-1592: JPA transaction timeouts
ruban72 Feb 13, 2025
561b98a
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
mfallonhmcts Feb 13, 2025
0686113
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
ruban72 Feb 14, 2025
f33e0af
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
ruban72 Feb 15, 2025
824b3f3
Merge branch 'master' into DTSCCI-1592_AddCachingDashboard
ruban72 Feb 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ sonarqube {
property "sonar.projectName", "CIVIL :: service"
property "sonar.projectKey", "civil-service"
property "sonar.coverage.jacoco.xmlReportPaths", "${jacocoTestReport.reports.xml.destination.path}"
property "sonar.coverage.exclusions", "**/model/**, **/config/**/*Configuration.java, **/request/servlet/** , **/controllers/**, **/testingsupport/**, **/*ExternalTaskListener.java, **/*BaseExternalTaskHandler.java, **/stereotypes/**, **/*Exception.java, **/EventHistoryMapper*.java, **/model/hearingvalues/**, **/enums/hearing/**, **/fees/client/**, **/enums/sdo/**, **/service/PaymentsService.java, **/DashboardWithParamsCallbackHandler.java, **/PaymentRequestUpdateCallbackService.java, **/advice/**"
property "sonar.coverage.exclusions", "**/model/**, **/config/**/*Configuration.java, **/request/servlet/** , **/controllers/**, **/testingsupport/**, **/*ExternalTaskListener.java, **/*BaseExternalTaskHandler.java, **/stereotypes/**, **/*Exception.java, **/EventHistoryMapper*.java, **/model/hearingvalues/**, **/enums/hearing/**, **/fees/client/**, **/enums/sdo/**, **/service/PaymentsService.java, **/DashboardWithParamsCallbackHandler.java, **/PaymentRequestUpdateCallbackService.java, **/advice/**, **/dashboard/cache/**"
property "sonar.cpd.exclusions", "**/*DocumentManagementService.java, **/*Spec*.java, **/*CcdDashboardClaimantClaimMatcher.java, **/*CcdDashboardDefendantClaimMatcher.java"
property "sonar.exclusions", "**/hmc/model/**, **/model/hearingvalues/**, **/handler/callback/camunda/dashboardnotifications/claimant/CCJRequestedDashboardNotificationHandler.java, **/handler/callback/camunda/dashboardnotifications/claimant/ClaimantCCJResponseNotificationHandler.java" +
", **/handler/callback/camunda/dashboardnotifications/claimant/ClaimantResponseNotificationHandler.java, **/utils/**, **/filters/**, **/handler/callback/camunda/dashboardnotifications/defendant/MoreTimeRequestedDashboardNotificationDefendantHandler.java, **/handler/callback/camunda/dashboardnotifications/claimant/ClaimantMediationSuccessfulDashboardNotificationHandler.java, **/handler/callback/camunda/dashboardnotifications/claimant/ClaimSettledDashboardNotificationHandler.java, **/handler/callback/camunda/dashboardnotifications/claimant/HearingScheduledClaimantNotificationHandler.java, **/handler/callback/camunda/dashboardnotifications/defendant/SettleClaimPaidInFullDefendantDashboardNotificationHandler.java, **/handler/callback/camunda/dashboardnotifications/defendant/DefendantNotifyDiscontinuanceDashboardNotificationHandler.java" +
Expand Down Expand Up @@ -390,6 +390,8 @@ dependencies {

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache'
implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: '3.1.8'
implementation group:'org.hibernate', name: 'hibernate-jcache', version: '5.6.15.Final'
implementation group:'com.github.ben-manes.caffeine', name: 'jcache', version: '3.1.8'

implementation group: 'org.springframework.security', name: 'spring-security-web', version: versions.springSecurity
implementation group: 'org.springframework.security', name: 'spring-security-config', version: versions.springSecurity
Expand Down Expand Up @@ -450,16 +452,21 @@ dependencies {

testImplementation group: 'org.springframework.statemachine', name: 'spring-statemachine-test', version: versions.springStatemachine
testImplementation 'com.github.hmcts:fortify-client:1.4.6:all'
testImplementation group:'org.hibernate', name: 'hibernate-jcache', version: '5.6.15.Final'
testImplementation group:'com.github.ben-manes.caffeine', name: 'jcache', version: '3.1.8'
//pact contract testing
contractTestImplementation 'au.com.dius.pact.consumer:junit5:4.6.5'
contractTestImplementation group: 'org.hamcrest', name: 'java-hamcrest', version: '2.0.0.0'
contractTestImplementation('org.junit.jupiter:junit-jupiter-api:5.11.4')
contractTestImplementation('org.junit.jupiter:junit-jupiter-engine:5.11.4')

contractTestImplementation sourceSets.main.runtimeClasspath
contractTestImplementation sourceSets.test.runtimeClasspath

integrationTestImplementation('org.junit.jupiter:junit-jupiter-api:5.11.4')
integrationTestImplementation('org.junit.jupiter:junit-jupiter-engine:5.11.4')
integrationTestImplementation group:'org.hibernate', name: 'hibernate-jcache', version: '5.6.15.Final'
integrationTestImplementation group:'com.github.ben-manes.caffeine', name: 'jcache', version: '3.1.8'

// dashboard specific changes

Expand Down
2 changes: 2 additions & 0 deletions dashboard-notifications/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ dependencies {
implementation group: 'org.apache.commons', name: 'commons-text', version: '1.12.0'
implementation group: 'io.swagger.core.v3', name: 'swagger-annotations', version: '2.2.28'
implementation group: 'com.github.hmcts', name: 'idam-java-client', version: '2.1.1'
implementation group:'org.hibernate', name: 'hibernate-jcache', version: '5.6.15.Final'
implementation group:'com.github.ben-manes.caffeine', name: 'jcache', version: '3.1.8'

runtimeOnly 'org.postgresql:postgresql:42.7.5'
compileOnly 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package uk.gov.hmcts.reform.dashboard.cache;

import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.AccessedExpiryPolicy;
import javax.cache.expiry.Duration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

public static final String READ_ONLY_ENTITY = "ReadOnlyEntity";

@Bean
public CacheManager cacheManager() {
CacheManager cacheManager = Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.CaffeineCachingProvider")
.getCacheManager();
configureCache(cacheManager);
return cacheManager;
}

private void configureCache(CacheManager cacheManager) {
MutableConfiguration<Object, Object> cacheConfig = new MutableConfiguration<>()
.setStoreByValue(false)
.setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(Duration.ONE_DAY));

cacheManager.createCache(READ_ONLY_ENTITY, cacheConfig);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class DashboardNotificationsEntity implements Serializable {
@Schema(name = "id")
private UUID id;

@ManyToOne(cascade = CascadeType.REFRESH)
@ManyToOne(cascade = CascadeType.DETACH)
@JoinColumn
@Schema(name = "dashboard_notifications_templates_id")
private NotificationTemplateEntity dashboardNotificationsTemplates;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package uk.gov.hmcts.reform.dashboard.entities;

import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Immutable;
import uk.gov.hmcts.reform.dashboard.cache.CacheConfig;

import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
Expand All @@ -14,6 +19,9 @@
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
@Entity
@Immutable
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = CacheConfig.READ_ONLY_ENTITY)
@Table(name = "dashboard_notifications_templates", schema = "dbs")
public class NotificationTemplateEntity implements Serializable {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,31 @@
package uk.gov.hmcts.reform.dashboard.entities;

import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Type;
import uk.gov.hmcts.reform.dashboard.cache.CacheConfig;

import java.io.Serializable;
import java.time.OffsetDateTime;
import java.util.Map;
import javax.persistence.Cacheable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.time.OffsetDateTime;
import java.util.Map;

@lombok.Data
@lombok.Builder(toBuilder = true)
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
@Entity
@Immutable
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = CacheConfig.READ_ONLY_ENTITY)
@Table(name = "scenario", schema = "dbs")
public class ScenarioEntity implements Serializable {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package uk.gov.hmcts.reform.dashboard.entities;

import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Type;
import uk.gov.hmcts.reform.dashboard.cache.CacheConfig;

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
Expand All @@ -16,6 +21,9 @@
@lombok.NoArgsConstructor
@lombok.AllArgsConstructor
@Entity
@Immutable
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = CacheConfig.READ_ONLY_ENTITY)
@Table(name = "task_item_template", schema = "dbs")
public class TaskItemTemplateEntity implements Serializable {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.reform.dashboard.entities.NotificationTemplateEntity;

import javax.transaction.Transactional;
import java.util.Optional;

@Transactional
@Transactional(readOnly = true)
@Repository
public interface NotificationTemplateRepository extends CrudRepository<NotificationTemplateEntity, Long> {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.reform.dashboard.entities.ScenarioEntity;

import java.util.Optional;

@Repository
@Transactional(readOnly = true)
public interface ScenarioRepository extends CrudRepository<ScenarioEntity, Long> {

Optional<ScenarioEntity> findByName(String name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.reform.dashboard.entities.TaskItemTemplateEntity;

import javax.transaction.Transactional;
import java.util.List;

@Transactional
@Transactional(readOnly = true)
@Repository
public interface TaskItemTemplateRepository extends CrudRepository<TaskItemTemplateEntity, Long> {

List<TaskItemTemplateEntity> findByScenarioName(String name);

List<TaskItemTemplateEntity> findByScenarioNameAndRole(String name, String role);

List<TaskItemTemplateEntity> findByCategoryEnAndRole(String category, String role);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.reform.dashboard.entities.TaskListEntity;

import javax.transaction.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.reform.dashboard.data.TaskList;
import uk.gov.hmcts.reform.dashboard.data.TaskStatus;
import uk.gov.hmcts.reform.dashboard.entities.TaskItemTemplateEntity;
Expand Down Expand Up @@ -44,6 +45,7 @@ public List<TaskList> getTaskList(String ccdCaseIdentifier, String roleType) {
.toList();
}

@Transactional
public TaskListEntity saveOrUpdate(TaskListEntity taskList) {

TaskItemTemplateEntity taskItemTemplate = taskList.getTaskItemTemplate();
Expand All @@ -68,6 +70,7 @@ public TaskListEntity saveOrUpdate(TaskListEntity taskList) {
return taskListRepository.save(beingUpdated);
}

@Transactional
public TaskListEntity updateTaskListItem(UUID taskItemIdentifier) {

Optional<TaskListEntity> existingEntity = taskListRepository.findById(taskItemIdentifier);
Expand All @@ -78,6 +81,7 @@ public TaskListEntity updateTaskListItem(UUID taskItemIdentifier) {
}).orElseThrow(() -> new IllegalArgumentException("Invalid task item identifier " + taskItemIdentifier));
}

@Transactional
public void makeProgressAbleTasksInactiveForCaseIdentifierAndRole(String caseIdentifier, String role, String excludedCategory) {
List<TaskListEntity> tasks = new ArrayList<>();
if (Objects.nonNull(excludedCategory)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.ActiveProfiles;
import uk.gov.hmcts.reform.civil.config.TestCacheConfig;

import java.io.IOException;

@ExtendWith(PactConsumerTestExt.class)
@ActiveProfiles("integration-test")
@SpringBootTest
@Import(TestCacheConfig.class)
public class BaseContractTest {

protected static final String AUTHORIZATION_HEADER = "Authorization";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package uk.gov.hmcts.reform.civil.config;

import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import javax.cache.CacheManager;
import javax.cache.Caching;

@TestConfiguration
public class TestCacheConfig {

@Bean
public CacheManager testCacheManager() {
return Caching.getCachingProvider().getCacheManager();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package uk.gov.hmcts.reform.civil.config;

import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import javax.cache.CacheManager;
import javax.cache.Caching;

@TestConfiguration
public class TestCacheConfig {

@Bean
public CacheManager testCacheManager() {
return Caching.getCachingProvider().getCacheManager();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
Expand All @@ -25,6 +26,7 @@
import uk.gov.hmcts.reform.authorisation.ServiceAuthorisationApi;
import uk.gov.hmcts.reform.civil.Application;
import uk.gov.hmcts.reform.civil.TestIdamConfiguration;
import uk.gov.hmcts.reform.civil.config.TestCacheConfig;
import uk.gov.hmcts.reform.civil.service.AuthorisationService;
import uk.gov.hmcts.reform.civil.service.UserService;
import uk.gov.hmcts.reform.dashboard.data.TaskList;
Expand All @@ -48,6 +50,7 @@
@ActiveProfiles("integration-test")
@SpringBootTest(classes = {Application.class, TestIdamConfiguration.class})
@AutoConfigureMockMvc
@Import(TestCacheConfig.class)
public abstract class BaseIntegrationTest {

protected static final String BEARER_TOKEN = "Bearer eyJ0eXAiOiJKV1QiLCJ6aXAiOiJOT05FIiwia2lkIjoiYi9PNk92VnYxK3k"
Expand Down Expand Up @@ -195,4 +198,5 @@ protected List<TaskList> toTaskList(String input) {
);
}
}

}
Loading