diff --git a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java index 9342d144b..7204ce7d2 100644 --- a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java +++ b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryBean.java @@ -41,9 +41,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.AnnotatedGenericBeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.data.repository.config.CustomRepositoryImplementationDetector; -import org.springframework.data.repository.config.DefaultRepositoryConfiguration; import org.springframework.data.repository.config.RepositoryBeanNameGenerator; import org.springframework.data.repository.config.SpringDataAnnotationBeanNameGenerator; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -407,6 +407,34 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl + "in order to use custom repository implementations"); } + /** + * Applies the configuration from {@link CdiRepositoryConfiguration} to {@link RepositoryFactorySupport} by looking up + * the actual configuration. + * + * @param repositoryFactory will never be {@literal null}. + * @since 2.1 + */ + protected void applyConfiguration(RepositoryFactorySupport repositoryFactory) { + applyConfiguration(repositoryFactory, lookupConfiguration(beanManager, qualifiers)); + } + + /** + * Applies the configuration from {@link CdiRepositoryConfiguration} to {@link RepositoryFactorySupport} by looking up + * the actual configuration. + * + * @param repositoryFactory will never be {@literal null}. + * @param configuration will never be {@literal null}. + * @since 2.1 + */ + protected static void applyConfiguration(RepositoryFactorySupport repositoryFactory, + CdiRepositoryConfiguration configuration) { + + configuration.getEvaluationContextProvider().ifPresent(repositoryFactory::setEvaluationContextProvider); + configuration.getNamedQueries().ifPresent(repositoryFactory::setNamedQueries); + configuration.getQueryLookupStrategy().ifPresent(repositoryFactory::setQueryLookupStrategyKey); + configuration.getRepositoryBeanClass().ifPresent(repositoryFactory::setRepositoryBaseClass); + } + /* * (non-Javadoc) * @see java.lang.Object#toString() @@ -417,17 +445,7 @@ public abstract class CdiRepositoryBean implements Bean, PassivationCapabl qualifiers.toString()); } - static enum DefaultCdiRepositoryConfiguration implements CdiRepositoryConfiguration { - + enum DefaultCdiRepositoryConfiguration implements CdiRepositoryConfiguration { INSTANCE; - - /* - * (non-Javadoc) - * @see org.springframework.data.repository.cdi.CdiRepositoryConfiguration#getRepositoryImplementationPostfix() - */ - @Override - public String getRepositoryImplementationPostfix() { - return DefaultRepositoryConfiguration.DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX; - } } } diff --git a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryConfiguration.java b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryConfiguration.java index 30ba10065..62360ddfc 100644 --- a/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryConfiguration.java +++ b/src/main/java/org/springframework/data/repository/cdi/CdiRepositoryConfiguration.java @@ -16,7 +16,10 @@ package org.springframework.data.repository.cdi; -import org.springframework.data.repository.config.DefaultRepositoryConfiguration; +import java.util.Optional; + +import org.springframework.data.repository.core.NamedQueries; +import org.springframework.data.repository.query.EvaluationContextProvider; import org.springframework.data.repository.query.QueryLookupStrategy; /** @@ -27,20 +30,53 @@ import org.springframework.data.repository.query.QueryLookupStrategy; */ public interface CdiRepositoryConfiguration { + /** + * Return the {@link EvaluationContextProvider} to use. Can be {@link Optional#empty()} . + * + * @return the optional {@link EvaluationContextProvider} base to use, can be {@link Optional#empty()}, must not be + * {@literal null}. + * @since 2.1 + */ + default Optional getEvaluationContextProvider() { + return Optional.empty(); + } + + /** + * Return the {@link NamedQueries} to use. Can be {@link Optional#empty()}. + * + * @return the optional named queries to use, can be {@link Optional#empty()}, must not be {@literal null}. + * @since 2.1 + */ + default Optional getNamedQueries() { + return Optional.empty(); + } + + /** + * Return the {@link QueryLookupStrategy.Key} to lookup queries. Can be {@link Optional#empty()}. + * + * @return the lookup strategy to use, can be {@link Optional#empty()}, must not be {@literal null}. + * @since 2.1 + */ + default Optional getQueryLookupStrategy() { + return Optional.empty(); + } + + /** + * Return the {@link Class repository base class} to use. Can be {@link Optional#empty()} . + * + * @return the optional repository base to use, can be {@link Optional#empty()}, must not be {@literal null}. + * @since 2.1 + */ + default Optional> getRepositoryBeanClass() { + return Optional.empty(); + } + /** * Returns the configured postfix to be used for looking up custom implementation classes. * * @return the postfix to use, must not be {@literal null}. */ - String getRepositoryImplementationPostfix(); - - /** - * Return the strategy to lookup queries. - * - * @return the lookup strategy to use. - * @since 2.1 - */ - default QueryLookupStrategy.Key getQueryLookupStrategy() { - return DefaultRepositoryConfiguration.DEFAULT_QUERY_LOOKUP_STRATEGY; + default String getRepositoryImplementationPostfix() { + return "Impl"; } } diff --git a/src/test/java/org/springframework/data/repository/cdi/CdiRepositoryBeanUnitTests.java b/src/test/java/org/springframework/data/repository/cdi/CdiRepositoryBeanUnitTests.java index c2abd7115..f12411b55 100755 --- a/src/test/java/org/springframework/data/repository/cdi/CdiRepositoryBeanUnitTests.java +++ b/src/test/java/org/springframework/data/repository/cdi/CdiRepositoryBeanUnitTests.java @@ -39,11 +39,18 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.data.repository.Repository; import org.springframework.data.repository.config.CustomRepositoryImplementationDetector; +import org.springframework.data.repository.core.NamedQueries; +import org.springframework.data.repository.core.support.PropertiesBasedNamedQueries; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.data.repository.query.DefaultEvaluationContextProvider; +import org.springframework.data.repository.query.EvaluationContextProvider; +import org.springframework.data.repository.query.QueryLookupStrategy.Key; /** * Unit tests for {@link CdiRepositoryBean}. * * @author Oliver Gierke + * @author Mark Paluch */ @RunWith(MockitoJUnitRunner.class) public class CdiRepositoryBeanUnitTests { @@ -55,6 +62,7 @@ public class CdiRepositoryBeanUnitTests { .singleton((Annotation) new CdiRepositoryExtensionSupport.DefaultAnnotationLiteral()); @Mock BeanManager beanManager; + @Mock RepositoryFactorySupport repositoryFactory; @Test(expected = IllegalArgumentException.class) public void voidRejectsNullQualifiers() { @@ -154,6 +162,25 @@ public class CdiRepositoryBeanUnitTests { ); } + @Test // DATACMNS-1255 + public void appliesRepositoryConfiguration() { + + DummyCdiRepositoryBean bean = new DummyCdiRepositoryBean(NO_ANNOTATIONS, + SampleRepository.class, beanManager) { + @Override + protected CdiRepositoryConfiguration lookupConfiguration(BeanManager beanManager, Set qualifiers) { + return RepositoryConfiguration.INSTANCE; + } + }; + + bean.applyConfiguration(repositoryFactory); + + verify(repositoryFactory).setEvaluationContextProvider(DefaultEvaluationContextProvider.INSTANCE); + verify(repositoryFactory).setNamedQueries(PropertiesBasedNamedQueries.EMPTY); + verify(repositoryFactory).setRepositoryBaseClass(String.class); + verify(repositoryFactory).setQueryLookupStrategyKey(Key.CREATE); + } + static class DummyCdiRepositoryBean extends CdiRepositoryBean { DummyCdiRepositoryBean(Set qualifiers, Class repositoryType, BeanManager beanManager) { @@ -168,12 +195,37 @@ public class CdiRepositoryBeanUnitTests { } @Named("namedRepository") - static interface SampleRepository extends Repository { + interface SampleRepository extends Repository { } @StereotypeAnnotation - static interface StereotypedSampleRepository { + interface StereotypedSampleRepository { } + + enum RepositoryConfiguration implements CdiRepositoryConfiguration { + + INSTANCE; + + @Override + public Optional getEvaluationContextProvider() { + return Optional.of(DefaultEvaluationContextProvider.INSTANCE); + } + + @Override + public Optional getNamedQueries() { + return Optional.of(PropertiesBasedNamedQueries.EMPTY); + } + + @Override + public Optional getQueryLookupStrategy() { + return Optional.of(Key.CREATE); + } + + @Override + public Optional> getRepositoryBeanClass() { + return Optional.of(String.class); + } + } }