Skip to content

Commit 11dc67d

Browse files
committed
DATACMNS-1018 - Reinstantiated ability to customize repository factory bean through annotation and XML namespace.
The refactoring for DATACMNS-867 has dropped support to customize the repository factory bean class on both the @Enable-annotations and the XML namespace. Reintroduced this feature, added a test case and moved the fallback into the value that's defined by the configuration extension inside DefaultRepositoryConfiguration.
1 parent 6b5b658 commit 11dc67d

13 files changed

+93
-39
lines changed

Diff for: src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,11 @@ private Optional<String> getNullDefaultedAttribute(String attributeName) {
211211

212212
/*
213213
* (non-Javadoc)
214-
* @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanName()
214+
* @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanClassName()
215215
*/
216-
public String getRepositoryFactoryBeanName() {
217-
return attributes.getClass(REPOSITORY_FACTORY_BEAN_CLASS).getName();
216+
@Override
217+
public Optional<String> getRepositoryFactoryBeanClassName() {
218+
return Optional.of(attributes.getClass(REPOSITORY_FACTORY_BEAN_CLASS).getName());
218219
}
219220

220221
/*

Diff for: src/main/java/org/springframework/data/repository/config/DefaultRepositoryConfiguration.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public class DefaultRepositoryConfiguration<T extends RepositoryConfigurationSou
4040

4141
private final @NonNull T configurationSource;
4242
private final @NonNull BeanDefinition definition;
43+
private final @NonNull RepositoryConfigurationExtension extension;
4344

4445
/*
4546
* (non-Javadoc)
@@ -133,7 +134,18 @@ public Optional<String> getRepositoryBaseClassName() {
133134
return configurationSource.getRepositoryBaseClassName();
134135
}
135136

136-
/*
137+
/*
138+
* (non-Javadoc)
139+
* @see org.springframework.data.repository.config.RepositoryConfiguration#getRepositoryFactoryBeanClassName()
140+
*/
141+
@Override
142+
public String getRepositoryFactoryBeanClassName() {
143+
144+
return configurationSource.getRepositoryFactoryBeanClassName()
145+
.orElseGet(() -> extension.getRepositoryFactoryBeanClassName());
146+
}
147+
148+
/*
137149
* (non-Javadoc)
138150
* @see org.springframework.data.repository.config.RepositoryConfiguration#isLazyInit()
139151
*/

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public BeanDefinitionBuilder build(RepositoryConfiguration<?> configuration) {
8484
Assert.notNull(registry, "BeanDefinitionRegistry must not be null!");
8585
Assert.notNull(resourceLoader, "ResourceLoader must not be null!");
8686

87-
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(extension.getRepositoryFactoryClassName());
87+
BeanDefinitionBuilder builder = BeanDefinitionBuilder
88+
.rootBeanDefinition(configuration.getRepositoryFactoryBeanClassName());
8889

8990
builder.getRawBeanDefinition().setSource(configuration.getSource());
9091
builder.addConstructorArgValue(configuration.getRepositoryInterface());

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfiguration.java

+7
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ public interface RepositoryConfiguration<T extends RepositoryConfigurationSource
7979
*/
8080
Optional<String> getRepositoryBaseClassName();
8181

82+
/**
83+
* Returns the name of the repository factory bean class to be used.
84+
*
85+
* @return
86+
*/
87+
String getRepositoryFactoryBeanClassName();
88+
8289
/**
8390
* Returns the source of the {@link RepositoryConfiguration}.
8491
*

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
137137

138138
if (LOGGER.isDebugEnabled()) {
139139
LOGGER.debug(REPOSITORY_REGISTRATION, extension.getModuleName(), beanName,
140-
configuration.getRepositoryInterface(), extension.getRepositoryFactoryClassName());
140+
configuration.getRepositoryInterface(), configuration.getRepositoryFactoryBeanClassName());
141141
}
142142

143143
beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, configuration.getRepositoryInterface());

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ <T extends RepositoryConfigurationSource> Collection<RepositoryConfiguration<T>>
7676
*
7777
* @return
7878
*/
79-
String getRepositoryFactoryClassName();
79+
String getRepositoryFactoryBeanClassName();
8080

8181
/**
8282
* Callback to register additional bean definitions for a {@literal repositories} root node. This usually includes

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,15 @@ public static boolean hasBean(Class<?> type, BeanDefinitionRegistry registry) {
232232
/**
233233
* Creates a actual {@link RepositoryConfiguration} instance for the given {@link RepositoryConfigurationSource} and
234234
* interface name. Defaults to the {@link DefaultRepositoryConfiguration} but allows sub-classes to override this to
235-
* customize the behaviour.
235+
* customize the behavior.
236236
*
237237
* @param definition will never be {@literal null} or empty.
238238
* @param configSource will never be {@literal null}.
239239
* @return
240240
*/
241241
protected <T extends RepositoryConfigurationSource> RepositoryConfiguration<T> getRepositoryConfiguration(
242242
BeanDefinition definition, T configSource) {
243-
return new DefaultRepositoryConfiguration<>(configSource, definition);
243+
return new DefaultRepositoryConfiguration<>(configSource, definition, this);
244244
}
245245

246246
/**

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public interface RepositoryConfigurationSource {
5757
/**
5858
* Returns the configured postfix to be used for looking up custom implementation classes.
5959
*
60-
* @return the postfix to use or {@literal null} in case none is configured.
60+
* @return the postfix to use or {@link Optional#empty()} in case none is configured.
6161
*/
6262
Optional<String> getRepositoryImplementationPostfix();
6363

@@ -67,14 +67,21 @@ public interface RepositoryConfigurationSource {
6767
Optional<String> getNamedQueryLocation();
6868

6969
/**
70-
* Returns the name of the repository base class to be used or {@literal null} if the store specific defaults shall be
71-
* applied.
70+
* Returns the name of the repository base class to be used or {@link Optional#empty()} if the store specific defaults
71+
* shall be applied.
7272
*
7373
* @return
7474
* @since 1.11
7575
*/
7676
Optional<String> getRepositoryBaseClassName();
7777

78+
/**
79+
* Returns the name of the repository factory bean class or {@link Optional#empty()} if not defined in the source.
80+
*
81+
* @return
82+
*/
83+
Optional<String> getRepositoryFactoryBeanClassName();
84+
7885
/**
7986
* Returns the source {@link BeanDefinition}s of the repository interfaces to create repository instances for.
8087
*
@@ -88,7 +95,7 @@ public interface RepositoryConfigurationSource {
8895
* camel-case.
8996
*
9097
* @param name must not be {@literal null} or empty.
91-
* @return the attribute with the given name or {@literal null} if not configured or empty.
98+
* @return the attribute with the given name or {@link Optional#empty()} if not configured or empty.
9299
* @since 1.8
93100
*/
94101
Optional<String> getAttribute(String name);

Diff for: src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.springframework.core.type.filter.TypeFilter;
2525
import org.springframework.data.config.TypeFilterParser;
2626
import org.springframework.data.config.TypeFilterParser.Type;
27-
import org.springframework.data.repository.query.QueryLookupStrategy;
2827
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
2928
import org.springframework.data.util.ParsingUtils;
3029
import org.springframework.util.Assert;
@@ -162,6 +161,15 @@ public Optional<String> getRepositoryBaseClassName() {
162161
return getNullDefaultedAttribute(element, REPOSITORY_BASE_CLASS_NAME);
163162
}
164163

164+
/*
165+
* (non-Javadoc)
166+
* @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanClassName()
167+
*/
168+
@Override
169+
public Optional<String> getRepositoryFactoryBeanClassName() {
170+
return getNullDefaultedAttribute(element, REPOSITORY_FACTORY_BEAN_CLASS_NAME);
171+
}
172+
165173
private Optional<String> getNullDefaultedAttribute(Element element, String attributeName) {
166174

167175
String attribute = element.getAttribute(attributeName);
@@ -175,8 +183,7 @@ private Optional<String> getNullDefaultedAttribute(Element element, String attri
175183
@Override
176184
public boolean shouldConsiderNestedRepositories() {
177185

178-
return getNullDefaultedAttribute(element, CONSIDER_NESTED_REPOSITORIES).map(Boolean::parseBoolean)
179-
.orElse(false);
186+
return getNullDefaultedAttribute(element, CONSIDER_NESTED_REPOSITORIES).map(Boolean::parseBoolean).orElse(false);
180187
}
181188

182189
/*

Diff for: src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadata.java

+3-18
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.repository.core.support;
1717

18+
import lombok.Getter;
19+
1820
import java.io.Serializable;
1921
import java.util.List;
2022

@@ -31,6 +33,7 @@
3133
* @author Oliver Gierke
3234
* @author Thomas Darimont
3335
*/
36+
@Getter
3437
public class DefaultRepositoryMetadata extends AbstractRepositoryMetadata {
3538

3639
private static final String MUST_BE_A_REPOSITORY = String.format("Given type must be assignable to %s!",
@@ -53,24 +56,6 @@ public DefaultRepositoryMetadata(Class<?> repositoryInterface) {
5356
this.domainType = resolveDomainType(repositoryInterface);
5457
}
5558

56-
/*
57-
* (non-Javadoc)
58-
* @see org.springframework.data.repository.core.RepositoryMetadata#getDomainType()
59-
*/
60-
@Override
61-
public Class<?> getDomainType() {
62-
return this.domainType;
63-
}
64-
65-
/*
66-
* (non-Javadoc)
67-
* @see org.springframework.data.repository.core.RepositoryMetadata#getIdType()
68-
*/
69-
@Override
70-
public Class<? extends Serializable> getIdType() {
71-
return this.idType;
72-
}
73-
7459
@SuppressWarnings("unchecked")
7560
private Class<? extends Serializable> resolveIdType(Class<?> repositoryInterface) {
7661

Diff for: src/test/java/org/springframework/data/repository/config/DefaultRepositoryConfigurationUnitTests.java

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2013 the original author or authors.
2+
* Copyright 2012-2017 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,11 +16,18 @@
1616
package org.springframework.data.repository.config;
1717

1818
import static org.assertj.core.api.Assertions.*;
19+
import static org.mockito.Mockito.*;
20+
21+
import lombok.EqualsAndHashCode;
22+
import lombok.Value;
23+
24+
import java.util.Optional;
1925

2026
import org.junit.Test;
2127
import org.junit.runner.RunWith;
2228
import org.mockito.Mock;
2329
import org.mockito.junit.MockitoJUnitRunner;
30+
import org.springframework.beans.factory.config.BeanDefinition;
2431
import org.springframework.beans.factory.support.RootBeanDefinition;
2532
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
2633

@@ -34,11 +41,13 @@ public class DefaultRepositoryConfigurationUnitTests {
3441

3542
@Mock RepositoryConfigurationSource source;
3643

44+
BeanDefinition definition = new RootBeanDefinition("com.acme.MyRepository");
45+
RepositoryConfigurationExtension extension = new SimplerRepositoryConfigurationExtension("factory", "module");
46+
3747
@Test
3848
public void supportsBasicConfiguration() {
3949

40-
RepositoryConfiguration<RepositoryConfigurationSource> configuration = new DefaultRepositoryConfiguration<>(
41-
source, new RootBeanDefinition("com.acme.MyRepository"));
50+
RepositoryConfiguration<RepositoryConfigurationSource> configuration = getConfiguration(source);
4251

4352
assertThat(configuration.getConfigurationSource()).isEqualTo(source);
4453
assertThat(configuration.getImplementationBeanName()).isEqualTo("myRepositoryImpl");
@@ -47,4 +56,28 @@ public void supportsBasicConfiguration() {
4756
assertThat(configuration.getQueryLookupStrategyKey()).isEqualTo(Key.CREATE_IF_NOT_FOUND);
4857
assertThat(configuration.isLazyInit()).isFalse();
4958
}
59+
60+
@Test // DATACMNS-1018
61+
public void usesExtensionFactoryBeanClassNameIfNoneDefinedInSource() {
62+
assertThat(getConfiguration(source).getRepositoryFactoryBeanClassName()).isEqualTo("factory");
63+
}
64+
65+
@Test // DATACMNS-1018
66+
public void prefersSourcesRepositoryFactoryBeanClass() {
67+
68+
when(source.getRepositoryFactoryBeanClassName()).thenReturn(Optional.of("custom"));
69+
70+
assertThat(getConfiguration(source).getRepositoryFactoryBeanClassName()).isEqualTo("custom");
71+
}
72+
73+
private DefaultRepositoryConfiguration<RepositoryConfigurationSource> getConfiguration(
74+
RepositoryConfigurationSource source) {
75+
return new DefaultRepositoryConfiguration<>(source, definition, extension);
76+
}
77+
78+
@Value
79+
@EqualsAndHashCode(callSuper = true)
80+
private static class SimplerRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport {
81+
String repositoryFactoryBeanClassName, modulePrefix;
82+
}
5083
}

Diff for: src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18+
import static org.mockito.ArgumentMatchers.*;
1819
import static org.mockito.Mockito.*;
1920

2021
import java.lang.annotation.Annotation;
@@ -120,7 +121,7 @@ protected RepositoryConfigurationExtension getExtension() {
120121

121122
static class DummyConfigurationExtension extends RepositoryConfigurationExtensionSupport {
122123

123-
public String getRepositoryFactoryClassName() {
124+
public String getRepositoryFactoryBeanClassName() {
124125
return DummyRepositoryFactoryBean.class.getName();
125126
}
126127

Diff for: src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ protected String getModulePrefix() {
6666
}
6767

6868
@Override
69-
public String getRepositoryFactoryClassName() {
69+
public String getRepositoryFactoryBeanClassName() {
7070
return RepositoryFactorySupport.class.getName();
7171
}
7272

0 commit comments

Comments
 (0)