View Javadoc
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   * Resolves the score of the caching value by the {@link ScoreResolver},
13   * and stores to the {@link ScoreHolder},
14   * and then the {@link ScoredRedisCacheWriter} could read the score
15   * from the {@link ScoreHolder}
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  }