View Javadoc
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  }