1
16 package org.springframework.data.repository.support;
17
18 import static org.springframework.data.util.Optionals.*;
19
20 import java.util.Map;
21 import java.util.Optional;
22 import java.util.concurrent.ConcurrentHashMap;
23
24 import org.springframework.core.convert.ConversionService;
25 import org.springframework.data.repository.CrudRepository;
26 import org.springframework.data.repository.PagingAndSortingRepository;
27 import org.springframework.data.repository.core.RepositoryInformation;
28 import org.springframework.format.support.DefaultFormattingConversionService;
29 import org.springframework.util.Assert;
30
31
41 public class DefaultRepositoryInvokerFactory implements RepositoryInvokerFactory {
42
43 private final Repositories repositories;
44 private final ConversionService conversionService;
45 private final Map<Class<?>, RepositoryInvoker> invokers;
46
47
52 public DefaultRepositoryInvokerFactory(Repositories repositories) {
53 this(repositories, new DefaultFormattingConversionService());
54 }
55
56
63 public DefaultRepositoryInvokerFactory(Repositories repositories, ConversionService conversionService) {
64
65 Assert.notNull(repositories, "Repositories must not be null!");
66 Assert.notNull(conversionService, "ConversionService must not be null!");
67
68 this.repositories = repositories;
69 this.conversionService = conversionService;
70 this.invokers = new ConcurrentHashMap<>();
71 }
72
73
77 @Override
78 public RepositoryInvoker getInvokerFor(Class<?> domainType) {
79 return invokers.computeIfAbsent(domainType, this::prepareInvokers);
80 }
81
82
88 private RepositoryInvoker prepareInvokers(Class<?> domainType) {
89
90 Optional<RepositoryInformation> information = repositories.getRepositoryInformationFor(domainType);
91 Optional<Object> repository = repositories.getRepositoryFor(domainType);
92
93 return mapIfAllPresent(information, repository, this::createInvoker)
94 .orElseThrow(
95 () -> new IllegalArgumentException(String.format("No repository found for domain type: %s", domainType)));
96 }
97
98 @SuppressWarnings("unchecked")
99 protected RepositoryInvoker createInvoker(RepositoryInformation information, Object repository) {
100
101 if (repository instanceof PagingAndSortingRepository) {
102 return new PagingAndSortingRepositoryInvoker((PagingAndSortingRepository<Object, Object>) repository, information,
103 conversionService);
104 } else if (repository instanceof CrudRepository) {
105 return new CrudRepositoryInvoker((CrudRepository<Object, Object>) repository, information, conversionService);
106 } else {
107 return new ReflectionRepositoryInvoker(repository, information, conversionService);
108 }
109 }
110 }
111