diff --git a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java index eb14ad074..6936b8b2d 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -211,10 +211,11 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura /* * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanName() + * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanClassName() */ - public String getRepositoryFactoryBeanName() { - return attributes.getClass(REPOSITORY_FACTORY_BEAN_CLASS).getName(); + @Override + public Optional getRepositoryFactoryBeanClassName() { + return Optional.of(attributes.getClass(REPOSITORY_FACTORY_BEAN_CLASS).getName()); } /* diff --git a/src/main/java/org/springframework/data/repository/config/DefaultRepositoryConfiguration.java b/src/main/java/org/springframework/data/repository/config/DefaultRepositoryConfiguration.java index 4c530f0f1..c61ae5cee 100644 --- a/src/main/java/org/springframework/data/repository/config/DefaultRepositoryConfiguration.java +++ b/src/main/java/org/springframework/data/repository/config/DefaultRepositoryConfiguration.java @@ -40,6 +40,7 @@ public class DefaultRepositoryConfiguration extension.getRepositoryFactoryBeanClassName()); + } + + /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfiguration#isLazyInit() */ diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java index d0b13845d..89f4435f0 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionBuilder.java @@ -84,7 +84,8 @@ class RepositoryBeanDefinitionBuilder { Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); Assert.notNull(resourceLoader, "ResourceLoader must not be null!"); - BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(extension.getRepositoryFactoryClassName()); + BeanDefinitionBuilder builder = BeanDefinitionBuilder + .rootBeanDefinition(configuration.getRepositoryFactoryBeanClassName()); builder.getRawBeanDefinition().setSource(configuration.getSource()); builder.addConstructorArgValue(configuration.getRepositoryInterface()); diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfiguration.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfiguration.java index 15dcbd0e0..9a06545cb 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfiguration.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfiguration.java @@ -79,6 +79,13 @@ public interface RepositoryConfiguration getRepositoryBaseClassName(); + /** + * Returns the name of the repository factory bean class to be used. + * + * @return + */ + String getRepositoryFactoryBeanClassName(); + /** * Returns the source of the {@link RepositoryConfiguration}. * diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java index 105abce74..fb0b3b067 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java @@ -137,7 +137,7 @@ public class RepositoryConfigurationDelegate { if (LOGGER.isDebugEnabled()) { LOGGER.debug(REPOSITORY_REGISTRATION, extension.getModuleName(), beanName, - configuration.getRepositoryInterface(), extension.getRepositoryFactoryClassName()); + configuration.getRepositoryInterface(), configuration.getRepositoryFactoryBeanClassName()); } beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, configuration.getRepositoryInterface()); diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java index b30a60ea7..767e892f9 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtension.java @@ -76,7 +76,7 @@ public interface RepositoryConfigurationExtension { * * @return */ - String getRepositoryFactoryClassName(); + String getRepositoryFactoryBeanClassName(); /** * Callback to register additional bean definitions for a {@literal repositories} root node. This usually includes diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java index 234dc5c7f..e26bc4b93 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java @@ -232,7 +232,7 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit /** * Creates a actual {@link RepositoryConfiguration} instance for the given {@link RepositoryConfigurationSource} and * interface name. Defaults to the {@link DefaultRepositoryConfiguration} but allows sub-classes to override this to - * customize the behaviour. + * customize the behavior. * * @param definition will never be {@literal null} or empty. * @param configSource will never be {@literal null}. @@ -240,7 +240,7 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit */ protected RepositoryConfiguration getRepositoryConfiguration( BeanDefinition definition, T configSource) { - return new DefaultRepositoryConfiguration<>(configSource, definition); + return new DefaultRepositoryConfiguration<>(configSource, definition, this); } /** diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java index afb27855f..ca549c6ba 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSource.java @@ -57,7 +57,7 @@ public interface RepositoryConfigurationSource { /** * Returns the configured postfix to be used for looking up custom implementation classes. * - * @return the postfix to use or {@literal null} in case none is configured. + * @return the postfix to use or {@link Optional#empty()} in case none is configured. */ Optional getRepositoryImplementationPostfix(); @@ -67,14 +67,21 @@ public interface RepositoryConfigurationSource { Optional getNamedQueryLocation(); /** - * Returns the name of the repository base class to be used or {@literal null} if the store specific defaults shall be - * applied. + * Returns the name of the repository base class to be used or {@link Optional#empty()} if the store specific defaults + * shall be applied. * * @return * @since 1.11 */ Optional getRepositoryBaseClassName(); + /** + * Returns the name of the repository factory bean class or {@link Optional#empty()} if not defined in the source. + * + * @return + */ + Optional getRepositoryFactoryBeanClassName(); + /** * Returns the source {@link BeanDefinition}s of the repository interfaces to create repository instances for. * @@ -88,7 +95,7 @@ public interface RepositoryConfigurationSource { * camel-case. * * @param name must not be {@literal null} or empty. - * @return the attribute with the given name or {@literal null} if not configured or empty. + * @return the attribute with the given name or {@link Optional#empty()} if not configured or empty. * @since 1.8 */ Optional getAttribute(String name); diff --git a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java index e2bbe84dd..4d8ccd010 100644 --- a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java @@ -24,7 +24,6 @@ import org.springframework.core.env.Environment; import org.springframework.core.type.filter.TypeFilter; import org.springframework.data.config.TypeFilterParser; import org.springframework.data.config.TypeFilterParser.Type; -import org.springframework.data.repository.query.QueryLookupStrategy; import org.springframework.data.repository.query.QueryLookupStrategy.Key; import org.springframework.data.util.ParsingUtils; import org.springframework.util.Assert; @@ -162,6 +161,15 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou return getNullDefaultedAttribute(element, REPOSITORY_BASE_CLASS_NAME); } + /* + * (non-Javadoc) + * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanClassName() + */ + @Override + public Optional getRepositoryFactoryBeanClassName() { + return getNullDefaultedAttribute(element, REPOSITORY_FACTORY_BEAN_CLASS_NAME); + } + private Optional getNullDefaultedAttribute(Element element, String attributeName) { String attribute = element.getAttribute(attributeName); @@ -175,8 +183,7 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou @Override public boolean shouldConsiderNestedRepositories() { - return getNullDefaultedAttribute(element, CONSIDER_NESTED_REPOSITORIES).map(Boolean::parseBoolean) - .orElse(false); + return getNullDefaultedAttribute(element, CONSIDER_NESTED_REPOSITORIES).map(Boolean::parseBoolean).orElse(false); } /* diff --git a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadata.java b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadata.java index 09218faff..db6fbe03a 100644 --- a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadata.java +++ b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryMetadata.java @@ -15,6 +15,8 @@ */ package org.springframework.data.repository.core.support; +import lombok.Getter; + import java.io.Serializable; import java.util.List; @@ -31,6 +33,7 @@ import org.springframework.util.Assert; * @author Oliver Gierke * @author Thomas Darimont */ +@Getter public class DefaultRepositoryMetadata extends AbstractRepositoryMetadata { private static final String MUST_BE_A_REPOSITORY = String.format("Given type must be assignable to %s!", @@ -53,24 +56,6 @@ public class DefaultRepositoryMetadata extends AbstractRepositoryMetadata { this.domainType = resolveDomainType(repositoryInterface); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.core.RepositoryMetadata#getDomainType() - */ - @Override - public Class getDomainType() { - return this.domainType; - } - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.core.RepositoryMetadata#getIdType() - */ - @Override - public Class getIdType() { - return this.idType; - } - @SuppressWarnings("unchecked") private Class resolveIdType(Class repositoryInterface) { diff --git a/src/test/java/org/springframework/data/repository/config/DefaultRepositoryConfigurationUnitTests.java b/src/test/java/org/springframework/data/repository/config/DefaultRepositoryConfigurationUnitTests.java index ed0cb0daa..383c6eab7 100755 --- a/src/test/java/org/springframework/data/repository/config/DefaultRepositoryConfigurationUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/DefaultRepositoryConfigurationUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,18 @@ package org.springframework.data.repository.config; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import lombok.EqualsAndHashCode; +import lombok.Value; + +import java.util.Optional; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.data.repository.query.QueryLookupStrategy.Key; @@ -34,11 +41,13 @@ public class DefaultRepositoryConfigurationUnitTests { @Mock RepositoryConfigurationSource source; + BeanDefinition definition = new RootBeanDefinition("com.acme.MyRepository"); + RepositoryConfigurationExtension extension = new SimplerRepositoryConfigurationExtension("factory", "module"); + @Test public void supportsBasicConfiguration() { - RepositoryConfiguration configuration = new DefaultRepositoryConfiguration<>( - source, new RootBeanDefinition("com.acme.MyRepository")); + RepositoryConfiguration configuration = getConfiguration(source); assertThat(configuration.getConfigurationSource()).isEqualTo(source); assertThat(configuration.getImplementationBeanName()).isEqualTo("myRepositoryImpl"); @@ -47,4 +56,28 @@ public class DefaultRepositoryConfigurationUnitTests { assertThat(configuration.getQueryLookupStrategyKey()).isEqualTo(Key.CREATE_IF_NOT_FOUND); assertThat(configuration.isLazyInit()).isFalse(); } + + @Test // DATACMNS-1018 + public void usesExtensionFactoryBeanClassNameIfNoneDefinedInSource() { + assertThat(getConfiguration(source).getRepositoryFactoryBeanClassName()).isEqualTo("factory"); + } + + @Test // DATACMNS-1018 + public void prefersSourcesRepositoryFactoryBeanClass() { + + when(source.getRepositoryFactoryBeanClassName()).thenReturn(Optional.of("custom")); + + assertThat(getConfiguration(source).getRepositoryFactoryBeanClassName()).isEqualTo("custom"); + } + + private DefaultRepositoryConfiguration getConfiguration( + RepositoryConfigurationSource source) { + return new DefaultRepositoryConfiguration<>(source, definition, extension); + } + + @Value + @EqualsAndHashCode(callSuper = true) + private static class SimplerRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { + String repositoryFactoryBeanClassName, modulePrefix; + } } diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java index df8b2c41d..e63c21330 100755 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.repository.config; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.lang.annotation.Annotation; @@ -120,7 +121,7 @@ public class RepositoryBeanDefinitionRegistrarSupportUnitTests { static class DummyConfigurationExtension extends RepositoryConfigurationExtensionSupport { - public String getRepositoryFactoryClassName() { + public String getRepositoryFactoryBeanClassName() { return DummyRepositoryFactoryBean.class.getName(); } diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java index bebd27cdd..32f3deea3 100755 --- a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java @@ -66,7 +66,7 @@ public class RepositoryConfigurationExtensionSupportUnitTests { } @Override - public String getRepositoryFactoryClassName() { + public String getRepositoryFactoryBeanClassName() { return RepositoryFactorySupport.class.getName(); }