1 package org.oxerr.spring.cache.redis.scored.score.resolver.annotated;
2
3 import java.lang.annotation.Annotation;
4 import java.util.Arrays;
5 import java.util.List;
6 import java.util.Objects;
7 import java.util.Optional;
8 import java.util.stream.Collectors;
9
10 import org.oxerr.spring.cache.redis.scored.score.resolver.ScoreResolver;
11 import org.oxerr.spring.cache.redis.scored.score.resolver.chained.ChainedScoreResolver;
12 import org.springframework.lang.Nullable;
13
14 public class ChainedAnnotatedScoreResolver implements ScoreResolver {
15
16 private static final long serialVersionUID = 2021082001L;
17
18 private final ChainedScoreResolver chainedScoreResolver;
19
20 public ChainedAnnotatedScoreResolver(String... annotationTypes) {
21 List<AnnotatedScoreResolver> resolvers = this.getAnnotatedScoreResolvers(annotationTypes);
22 this.chainedScoreResolver = new ChainedScoreResolver(resolvers);
23 }
24
25 @Override
26 public Optional<Double> resolveScore(@Nullable Object value) {
27 return this.chainedScoreResolver.resolveScore(value);
28 }
29
30 private List<AnnotatedScoreResolver> getAnnotatedScoreResolvers(String... annotationTypes) {
31 return Arrays.stream(annotationTypes)
32 .map(this::getAnnotatedScoreResolver)
33 .filter(Objects::nonNull)
34 .collect(Collectors.toList());
35 }
36
37 private AnnotatedScoreResolver getAnnotatedScoreResolver(String className) {
38 try {
39 Class<? extends Annotation> annotationType = getAnnotationType(className);
40 return new AnnotatedScoreResolver(annotationType);
41 } catch (ClassNotFoundException e) {
42 return null;
43 }
44 }
45
46 private Class<? extends Annotation> getAnnotationType(String className) throws ClassNotFoundException {
47 @SuppressWarnings("unchecked")
48 Class<? extends Annotation> annotationType = (Class<? extends Annotation>) Class.forName(className);
49 return annotationType;
50 }
51
52 }