Skip to content

Commit bcc91f7

Browse files
authored
KB-9789| Q8 | Access Control | My Assigned Content (#154)
* KB-9789| Q8 | Access Control | My Assigned Content * added testCases * KB-9789| Q8 | Access Control | My Assigned Content * KB-9789| Q8 | Access Control | My Assigned Content * KB-9789| Q8 | Access Control | My Assigned Content
1 parent 095c6f5 commit bcc91f7

File tree

3 files changed

+50
-30
lines changed

3 files changed

+50
-30
lines changed

src/main/java/com/igot/cb/cache/AccessSettingRuleCacheMgr.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package com.igot.cb.cache;
22

3+
import java.time.Duration;
34
import java.util.*;
45
import java.util.concurrent.ConcurrentHashMap;
56
import java.util.stream.Collectors;
67

8+
import com.github.benmanes.caffeine.cache.Cache;
9+
import com.github.benmanes.caffeine.cache.Caffeine;
710
import com.igot.cb.cassandra.CassandraOperation;
11+
import jakarta.annotation.PostConstruct;
812
import org.apache.commons.collections.CollectionUtils;
913
import org.apache.commons.collections.MapUtils;
14+
import org.springframework.beans.factory.annotation.Value;
1015
import org.springframework.stereotype.Component;
1116

1217
import com.igot.cb.model.CachedAccessSettingRule;
@@ -25,21 +30,38 @@ public class AccessSettingRuleCacheMgr {
2530
private final CassandraOperation cassandraOperation;
2631
private Map<String, CachedAccessSettingRule> cachedAccessSettingRules = new ConcurrentHashMap<>();
2732

33+
private Cache<String, CachedAccessSettingRule> accessSettingsCache;
34+
35+
2836
private final long LOCAL_CACHE_TTL = 3600000;
2937

3038
private final String ACCESS_SETTINGS_CACHE_KEY = "accessSettingRules";
3139

40+
@Value("${access.rule.ttl.minutes}")
41+
private int ttlMinutes;
42+
43+
@PostConstruct
44+
public void initCache() {
45+
accessSettingsCache = Caffeine.newBuilder()
46+
.maximumSize(1000)
47+
.expireAfterWrite(Duration.ofMinutes(ttlMinutes))
48+
.build();
49+
}
50+
51+
3252
/**
3353
* Constructor for AccessSettingRuleCacheMgr.
3454
*
3555
* @param redisCacheMgr Cache manager for Redis operations.
3656
* @param cassandraOperation Cassandra operations for database interactions.
3757
*/
38-
public AccessSettingRuleCacheMgr(RedisCacheMgr redisCacheMgr, CassandraOperation cassandraOperation) {
58+
public AccessSettingRuleCacheMgr(RedisCacheMgr redisCacheMgr,
59+
CassandraOperation cassandraOperation) {
3960
this.redisCacheMgr = redisCacheMgr;
4061
this.cassandraOperation = cassandraOperation;
4162
}
4263

64+
4365
/**
4466
* Retrieves the cached access setting rules.
4567
* If the cache is empty or expired, it loads the rules from Redis or Cassandra.
@@ -207,17 +229,12 @@ BitSet createBitSetForAttribute(Collection<Integer> attributeValues) {
207229
return bitSet;
208230
}
209231

210-
211232
public CachedAccessSettingRule getOrLoadAccessSettingRule(String courseId, String contextId) {
212-
213233
String cacheKey = courseId + "|" + contextId;
214-
if (MapUtils.isEmpty(cachedAccessSettingRules)) {
215-
cachedAccessSettingRules = new ConcurrentHashMap<>();
216-
}
217-
CachedAccessSettingRule rule = cachedAccessSettingRules.get(cacheKey);
218-
if (rule != null) {
234+
CachedAccessSettingRule cachedRule = accessSettingsCache.getIfPresent(cacheKey);
235+
if (cachedRule != null) {
219236
log.debug("Cache hit for rule key: {}", cacheKey);
220-
return rule;
237+
return cachedRule;
221238
}
222239
log.info("Cache miss for rule key: {}, loading from Cassandra...", cacheKey);
223240
try {
@@ -248,7 +265,7 @@ public CachedAccessSettingRule getOrLoadAccessSettingRule(String courseId, Strin
248265
if (MapUtils.isNotEmpty(contextData)) {
249266
processContextData(cacheKey, contextData);
250267
}
251-
cachedAccessSettingRules.put(cacheKey, loadedRule);
268+
accessSettingsCache.put(cacheKey, loadedRule);
252269
log.info("Loaded and cached rule for key: {}", cacheKey);
253270
} catch (Exception e) {
254271
log.error("Error processing rule {}: {}", cacheKey, e.getMessage(), e);

src/main/resources/application.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,5 @@ cb.search.limit=100
8181
cb.search.offset=0
8282
cb.search.access.settings.enabled=true
8383
cb.cache.course.ttl=600000
84-
cb.cache.ttl=600
84+
cb.cache.ttl=600
85+
access.rule.ttl.minutes=30

src/test/java/com/igot/cb/cache/AccessSettingRuleCacheMgrTest.java

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,33 +35,35 @@ class AccessSettingRuleCacheMgrTest {
3535

3636
@BeforeEach
3737
void setup() throws Exception {
38-
cacheMgr = new AccessSettingRuleCacheMgr(redisCacheMgr, cassandraOperation);
38+
cacheMgr = new AccessSettingRuleCacheMgr(redisCacheMgr, cassandraOperation); // 10 minutes TTL
39+
3940
validJsonRule = """
40-
{
41-
"contextId": "do_123",
42-
"contextIdType": "Course",
43-
"contextData": {
44-
"accessControlId": {
45-
"version": 1,
46-
"userGroups": [
41+
{
42+
"contextId": "do_123",
43+
"contextIdType": "Course",
44+
"contextData": {
45+
"accessControlId": {
46+
"version": 1,
47+
"userGroups": [
48+
{
49+
"userGroupId": "group-123",
50+
"userGroupName": "Test Group",
51+
"userGroupCriteriaList": [
4752
{
48-
"userGroupId": "group-123",
49-
"userGroupName": "Test Group",
50-
"userGroupCriteriaList": [
51-
{
52-
"criteriaKey": "designation",
53-
"criteriaValue": [1, 2]
54-
}
55-
]
53+
"criteriaKey": "designation",
54+
"criteriaValue": [1, 2]
5655
}
5756
]
5857
}
59-
},
60-
"isArchived": false
58+
]
6159
}
62-
""";
60+
},
61+
"isArchived": false
62+
}
63+
""";
6364
}
6465

66+
6567
@Test
6668
void testGetAccessSettingRules_fromRedis() {
6769
Map<String, String> redisMap = Map.of("do_123|Course", validJsonRule);

0 commit comments

Comments
 (0)