From 85157b6644f4936558689ec576150fed848dff7d Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 29 Jul 2014 14:18:41 +0200 Subject: [PATCH] DATACMNS-526 - Added type matching to strict repository scanning. Repository interfaces are now also considered strict matches if they are assignable to one of the types returned by getIdentifyingTypes(). --- ...positoryConfigurationExtensionSupport.java | 20 ++++++++++++- ...onfigurationExtensionSupportUnitTests.java | 29 +++++++++++-------- 2 files changed, 36 insertions(+), 13 deletions(-) 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 1dc2a63ad..24e86773a 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupport.java @@ -157,6 +157,16 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit return Collections.emptySet(); } + /** + * Returns the types that indicate a store match when inspecting repositories for strict matches. + * + * @return + * @since 1.9 + */ + protected Collection> getIdentifyingTypes() { + return Collections.emptySet(); + } + /** * Sets the given source on the given {@link AbstractBeanDefinition} and registers it inside the given * {@link BeanDefinitionRegistry}. @@ -219,8 +229,16 @@ public abstract class RepositoryConfigurationExtensionSupport implements Reposit protected boolean isStrictRepositoryCandidate(Class repositoryInterface) { RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(repositoryInterface); - Class domainType = metadata.getDomainType(); + Collection> types = getIdentifyingTypes(); + + for (Class type : types) { + if (type.isAssignableFrom(repositoryInterface)) { + return true; + } + } + + Class domainType = metadata.getDomainType(); Collection> annotations = getIdentifyingAnnotations(); if (annotations.isEmpty()) { 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 423202e7c..468fe8d57 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationExtensionSupportUnitTests.java @@ -52,34 +52,35 @@ public class RepositoryConfigurationExtensionSupportUnitTests { assertThat(extension.isStrictRepositoryCandidate(AnnotatedTypeRepository.class), is(true)); } + /** + * @see DATACMNS-526 + */ + @Test + public void considersRepositoryInterfaceExtendingStoreInterfaceStrictMatch() { + assertThat(extension.isStrictRepositoryCandidate(ExtendingInterface.class), is(true)); + } + static class SampleRepositoryConfigurationExtension extends RepositoryConfigurationExtensionSupport { - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getModulePrefix() - */ @Override protected String getModulePrefix() { return "core"; } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtension#getRepositoryFactoryClassName() - */ @Override public String getRepositoryFactoryClassName() { return RepositoryFactorySupport.class.getName(); } - /* - * (non-Javadoc) - * @see org.springframework.data.repository.config.RepositoryConfigurationExtensionSupport#getIdentifyingAnnotations() - */ @Override protected Collection> getIdentifyingAnnotations() { return Collections.> singleton(Primary.class); } + + @Override + protected Collection> getIdentifyingTypes() { + return Collections.> singleton(StoreInterface.class); + } } @Primary @@ -90,4 +91,8 @@ public class RepositoryConfigurationExtensionSupportUnitTests { interface AnnotatedTypeRepository extends Repository {} interface PlainTypeRepository extends Repository {} + + interface StoreInterface {} + + interface ExtendingInterface extends StoreInterface, Repository {} }