1
16 package org.springframework.data.repository.config;
17
18 import lombok.NonNull;
19 import lombok.RequiredArgsConstructor;
20
21 import java.util.Optional;
22
23 import org.springframework.beans.factory.config.BeanDefinition;
24 import org.springframework.core.type.classreading.MetadataReaderFactory;
25 import org.springframework.core.type.filter.TypeFilter;
26 import org.springframework.data.config.ConfigurationUtils;
27 import org.springframework.data.repository.query.QueryLookupStrategy.Key;
28 import org.springframework.data.util.Streamable;
29 import org.springframework.lang.Nullable;
30 import org.springframework.util.Assert;
31 import org.springframework.util.ClassUtils;
32 import org.springframework.util.StringUtils;
33
34
41 @RequiredArgsConstructor
42 public class DefaultRepositoryConfiguration<T extends RepositoryConfigurationSource>
43 implements RepositoryConfiguration<T> {
44
45 public static final String DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX = "Impl";
46 public static final Key DEFAULT_QUERY_LOOKUP_STRATEGY = Key.CREATE_IF_NOT_FOUND;
47
48 private final @NonNull T configurationSource;
49 private final @NonNull BeanDefinition definition;
50 private final @NonNull RepositoryConfigurationExtension extension;
51
52
56 public String getBeanId() {
57 return StringUtils.uncapitalize(ClassUtils.getShortName(getRepositoryBaseClassName().orElseThrow(
58 () -> new IllegalStateException("Can't create bean identifier without a repository base class defined!"))));
59 }
60
61
65 public Object getQueryLookupStrategyKey() {
66 return configurationSource.getQueryLookupStrategyKey().orElse(DEFAULT_QUERY_LOOKUP_STRATEGY);
67 }
68
69
73 public Streamable<String> getBasePackages() {
74 return configurationSource.getBasePackages();
75 }
76
77
81 @Override
82 public Streamable<String> getImplementationBasePackages() {
83 return Streamable.of(ClassUtils.getPackageName(getRepositoryInterface()));
84 }
85
86
90 public String getRepositoryInterface() {
91 return ConfigurationUtils.getRequiredBeanClassName(definition);
92 }
93
94
98 public RepositoryConfigurationSource getConfigSource() {
99 return configurationSource;
100 }
101
102
106 public Optional<String> getNamedQueriesLocation() {
107 return configurationSource.getNamedQueryLocation();
108 }
109
110
114 public String getImplementationClassName() {
115 return ClassUtils.getShortName(getRepositoryInterface()).concat(
116 configurationSource.getRepositoryImplementationPostfix().orElse(DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX));
117 }
118
119
123 public String getImplementationBeanName() {
124 return configurationSource.generateBeanName(definition)
125 + configurationSource.getRepositoryImplementationPostfix().orElse("Impl");
126 }
127
128
132 @Nullable
133 @Override
134 public Object getSource() {
135 return configurationSource.getSource();
136 }
137
138
142 @Override
143 public T getConfigurationSource() {
144 return configurationSource;
145 }
146
147
151 @Override
152 public Optional<String> getRepositoryBaseClassName() {
153 return configurationSource.getRepositoryBaseClassName();
154 }
155
156
160 @Override
161 public String getRepositoryFactoryBeanClassName() {
162
163 return configurationSource.getRepositoryFactoryBeanClassName()
164 .orElseGet(extension::getRepositoryFactoryBeanClassName);
165 }
166
167
171 @Override
172 public boolean isLazyInit() {
173 return definition.isLazyInit() || !configurationSource.getBootstrapMode().equals(BootstrapMode.DEFAULT);
174 }
175
176
180 @Override
181 public boolean isPrimary() {
182 return definition.isPrimary();
183 }
184
185
189 @Override
190 public Streamable<TypeFilter> getExcludeFilters() {
191 return configurationSource.getExcludeFilters();
192 }
193
194
198 @Override
199 public ImplementationDetectionConfiguration toImplementationDetectionConfiguration(MetadataReaderFactory factory) {
200
201 Assert.notNull(factory, "MetadataReaderFactory must not be null!");
202
203 return configurationSource.toImplementationDetectionConfiguration(factory);
204 }
205
206
210 @Override
211 public ImplementationLookupConfiguration toLookupConfiguration(MetadataReaderFactory factory) {
212
213 Assert.notNull(factory, "MetadataReaderFactory must not be null!");
214
215 return toImplementationDetectionConfiguration(factory).forRepositoryConfiguration(this);
216 }
217
218
222 @Override
223 @org.springframework.lang.NonNull
224 public String getResourceDescription() {
225 return String.format("%s defined in %s", getRepositoryInterface(), configurationSource.getResourceDescription());
226 }
227 }
228