1 package org.oxerr.spring.cache.redis.scored;
2
3 import java.util.Optional;
4
5 import org.oxerr.spring.cache.redis.scored.score.resolver.ScoreResolver;
6 import org.springframework.cache.Cache;
7 import org.springframework.cache.interceptor.CacheInterceptor;
8 import org.springframework.lang.NonNull;
9 import org.springframework.lang.Nullable;
10
11
12
13
14
15
16
17 public class ScoredRedisCacheInterceptor extends CacheInterceptor {
18
19 private static final long serialVersionUID = 2021082001L;
20
21 private final ScoreResolver scoreResolver;
22 private final ScoreHolder scoreHolder;
23
24 public ScoredRedisCacheInterceptor(
25 @NonNull ScoreResolver scoreResolver,
26 @NonNull ScoreHolder scoreHolder
27 ) {
28 this.scoreResolver = scoreResolver;
29 this.scoreHolder = scoreHolder;
30 }
31
32 @Override
33 protected void doPut(Cache cache, Object key, @Nullable Object result) {
34 try {
35 this.setScore(result);
36 super.doPut(cache, key, result);
37 } finally {
38 this.clearScore();
39 }
40 }
41
42 private void setScore(@Nullable Object result) {
43 Optional<Double> score = this.scoreResolver.resolveScore(result);
44 this.scoreHolder.set(score.orElse(null));
45 }
46
47 private void clearScore() {
48 this.scoreHolder.remove();
49 }
50
51 }