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 f1ad95562..f749a94e6 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.regex.Pattern; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.FilterType; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.env.Environment; @@ -74,9 +75,9 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura * @param environment */ public AnnotationRepositoryConfigurationSource(AnnotationMetadata metadata, Class annotation, - ResourceLoader resourceLoader, Environment environment) { + ResourceLoader resourceLoader, Environment environment, BeanDefinitionRegistry registry) { - super(environment); + super(environment, registry); Assert.notNull(metadata, "Metadata must not be null!"); Assert.notNull(annotation, "Annotation must not be null!"); diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java index 183d75d6b..c4f336298 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupport.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 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. @@ -32,8 +32,8 @@ import org.springframework.util.Assert; * * @author Oliver Gierke */ -public abstract class RepositoryBeanDefinitionRegistrarSupport implements ImportBeanDefinitionRegistrar, - ResourceLoaderAware, EnvironmentAware { +public abstract class RepositoryBeanDefinitionRegistrarSupport + implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware { private ResourceLoader resourceLoader; private Environment environment; @@ -72,7 +72,7 @@ public abstract class RepositoryBeanDefinitionRegistrarSupport implements Import } AnnotationRepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource( - annotationMetadata, getAnnotation(), resourceLoader, environment); + annotationMetadata, getAnnotation(), resourceLoader, environment, registry); RepositoryConfigurationExtension extension = getExtension(); RepositoryConfigurationUtils.exposeRegistration(extension, registry, configurationSource); diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryComponentProvider.java b/src/main/java/org/springframework/data/repository/config/RepositoryComponentProvider.java index 6d1a9f979..af6ca5a75 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryComponentProvider.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryComponentProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 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. @@ -22,6 +22,7 @@ import java.util.Set; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.AnnotationConfigUtils; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.type.classreading.MetadataReader; @@ -47,6 +48,7 @@ class RepositoryComponentProvider extends ClassPathScanningCandidateComponentPro private static final String METHOD_NOT_PUBLIC = "AnnotationConfigUtils.processCommonDefinitionAnnotations(…) is not public! Make sure you're using Spring 3.2.5 or better. The class was loaded from %s."; private boolean considerNestedRepositoryInterfaces; + private BeanDefinitionRegistry registry; /** * Creates a new {@link RepositoryComponentProvider} using the given {@link TypeFilter} to include components to be @@ -55,13 +57,16 @@ class RepositoryComponentProvider extends ClassPathScanningCandidateComponentPro * @param includeFilters the {@link TypeFilter}s to select repository interfaces to consider, must not be * {@literal null}. */ - public RepositoryComponentProvider(Iterable includeFilters) { + public RepositoryComponentProvider(Iterable includeFilters, BeanDefinitionRegistry registry) { super(false); assertRequiredSpringVersionPresent(); Assert.notNull(includeFilters, "Include filters must not be null!"); + Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); + + this.registry = registry; if (includeFilters.iterator().hasNext()) { for (TypeFilter filter : includeFilters) { @@ -129,6 +134,15 @@ class RepositoryComponentProvider extends ClassPathScanningCandidateComponentPro return candidates; } + /* + * (non-Javadoc) + * @see org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#getRegistry() + */ + @Override + protected BeanDefinitionRegistry getRegistry() { + return registry; + } + /** * @return the considerNestedRepositoryInterfaces */ diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java index 3072d9c66..e248932c7 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java @@ -21,6 +21,7 @@ import java.util.HashSet; import java.util.Set; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.core.type.filter.TypeFilter; @@ -38,16 +39,20 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository protected static final String DEFAULT_REPOSITORY_IMPL_POSTFIX = "Impl"; private final Environment environment; + private final BeanDefinitionRegistry registry; /** * Creates a new {@link RepositoryConfigurationSourceSupport} with the given environment. * * @param environment must not be {@literal null}. */ - public RepositoryConfigurationSourceSupport(Environment environment) { + public RepositoryConfigurationSourceSupport(Environment environment, BeanDefinitionRegistry registry) { Assert.notNull(environment, "Environment must not be null!"); + Assert.notNull(registry, "BeanDefinitionRegistry must not be null!"); + this.environment = environment; + this.registry = registry; } /* @@ -56,10 +61,10 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository */ public Collection getCandidates(ResourceLoader loader) { - RepositoryComponentProvider scanner = new RepositoryComponentProvider(getIncludeFilters()); + RepositoryComponentProvider scanner = new RepositoryComponentProvider(getIncludeFilters(), registry); scanner.setConsiderNestedRepositoryInterfaces(shouldConsiderNestedRepositories()); - scanner.setResourceLoader(loader); scanner.setEnvironment(environment); + scanner.setResourceLoader(loader); for (TypeFilter filter : getExcludeFilters()) { scanner.addExcludeFilter(filter); 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 a282bdbfc..a204011e0 100644 --- a/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/XmlRepositoryConfigurationSource.java @@ -61,7 +61,7 @@ public class XmlRepositoryConfigurationSource extends RepositoryConfigurationSou */ public XmlRepositoryConfigurationSource(Element element, ParserContext context, Environment environment) { - super(environment); + super(environment, context.getRegistry()); Assert.notNull(element, "Element must not be null!"); Assert.notNull(context, "Context must not be null!"); diff --git a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java index 050bf1ced..57e174745 100644 --- a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java @@ -17,6 +17,7 @@ package org.springframework.data.repository.config; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -25,6 +26,7 @@ import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; @@ -45,6 +47,7 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { RepositoryConfigurationSource source; Environment environment; ResourceLoader resourceLoader; + BeanDefinitionRegistry registry; @Before public void setUp() { @@ -52,8 +55,10 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { AnnotationMetadata annotationMetadata = new StandardAnnotationMetadata(SampleConfiguration.class, true); environment = new StandardEnvironment(); resourceLoader = new DefaultResourceLoader(); + registry = mock(BeanDefinitionRegistry.class); + source = new AnnotationRepositoryConfigurationSource(annotationMetadata, EnableRepositories.class, resourceLoader, - environment); + environment, registry); } @Test // DATACMNS-47 @@ -109,10 +114,10 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { @Test // DATACMNS-502 public void returnsEmptyStringForBasePackage() throws Exception { - StandardAnnotationMetadata metadata = new StandardAnnotationMetadata(getClass().getClassLoader().loadClass( - "TypeInDefaultPackage"), true); + StandardAnnotationMetadata metadata = new StandardAnnotationMetadata( + getClass().getClassLoader().loadClass("TypeInDefaultPackage"), true); RepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, - EnableRepositories.class, resourceLoader, environment); + EnableRepositories.class, resourceLoader, environment, registry); assertThat(configurationSource.getBasePackages(), hasItem("")); } @@ -129,7 +134,7 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { AnnotationMetadata metadata = new StandardAnnotationMetadata(ConfigWithSampleAnnotation.class, true); RepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, - SampleAnnotation.class, resourceLoader, environment); + SampleAnnotation.class, resourceLoader, environment, registry); assertThat(configurationSource.getRepositoryBaseClassName(), is(nullValue())); } @@ -137,7 +142,8 @@ public class AnnotationRepositoryConfigurationSourceUnitTests { private AnnotationRepositoryConfigurationSource getConfigSource(Class type) { AnnotationMetadata metadata = new StandardAnnotationMetadata(type, true); - return new AnnotationRepositoryConfigurationSource(metadata, EnableRepositories.class, resourceLoader, environment); + return new AnnotationRepositoryConfigurationSource(metadata, EnableRepositories.class, resourceLoader, environment, + registry); } public static class Person {} diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryComponentProviderUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryComponentProviderUnitTests.java index 9bcdef1b2..393b04714 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryComponentProviderUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryComponentProviderUnitTests.java @@ -17,6 +17,7 @@ package org.springframework.data.repository.config; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; +import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.Collections; @@ -28,6 +29,7 @@ import org.hamcrest.Description; import org.hamcrest.Matchers; import org.junit.Test; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.core.type.filter.TypeFilter; import org.springframework.data.repository.Repository; @@ -42,10 +44,13 @@ import org.springframework.data.repository.sample.SampleAnnotatedRepository; */ public class RepositoryComponentProviderUnitTests { + BeanDefinitionRegistry registry = mock(BeanDefinitionRegistry.class); + @Test public void findsAnnotatedRepositoryInterface() { - RepositoryComponentProvider provider = new RepositoryComponentProvider(Collections. emptyList()); + RepositoryComponentProvider provider = new RepositoryComponentProvider(Collections. emptyList(), + registry); Set components = provider.findCandidateComponents("org.springframework.data.repository.sample"); assertThat(components.size(), is(3)); @@ -57,7 +62,7 @@ public class RepositoryComponentProviderUnitTests { List filters = Arrays.asList(new AssignableTypeFilter(MyOtherRepository.class)); - RepositoryComponentProvider provider = new RepositoryComponentProvider(filters); + RepositoryComponentProvider provider = new RepositoryComponentProvider(filters, registry); Set components = provider.findCandidateComponents("org.springframework.data.repository"); assertThat(components.size(), is(1)); @@ -67,7 +72,8 @@ public class RepositoryComponentProviderUnitTests { @Test // DATACMNS-90 public void shouldConsiderNestedRepositoryInterfacesIfEnabled() { - RepositoryComponentProvider provider = new RepositoryComponentProvider(Collections. emptyList()); + RepositoryComponentProvider provider = new RepositoryComponentProvider(Collections. emptyList(), + registry); provider.setConsiderNestedRepositoryInterfaces(true); Set components = provider.findCandidateComponents("org.springframework.data.repository.config"); @@ -78,6 +84,20 @@ public class RepositoryComponentProviderUnitTests { Matchers. hasItem(hasProperty("beanClassName", is(nestedRepositoryClassName)))); } + @Test(expected = IllegalArgumentException.class) // DATACMNS-1098 + public void rejectsNullBeanDefinitionRegistry() { + new RepositoryComponentProvider(Collections. emptyList(), null); + } + + @Test // DATACMNS-1098 + public void exposesBeanDefinitionRegistry() { + + RepositoryComponentProvider provider = new RepositoryComponentProvider(Collections. emptyList(), + registry); + + assertThat(provider.getRegistry(), is(registry)); + } + static class BeanDefinitionOfTypeMatcher extends BaseMatcher { private final Class expectedType; diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java index 26ea72dc7..b31b4fe65 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java @@ -45,8 +45,10 @@ public class RepositoryConfigurationDelegateUnitTests { StandardEnvironment environment = new StandardEnvironment(); GenericApplicationContext context = new GenericApplicationContext(); + RepositoryConfigurationSource configSource = new AnnotationRepositoryConfigurationSource( - new StandardAnnotationMetadata(TestConfig.class, true), EnableRepositories.class, context, environment); + new StandardAnnotationMetadata(TestConfig.class, true), EnableRepositories.class, context, environment, + context.getDefaultListableBeanFactory()); RepositoryConfigurationDelegate delegate = new RepositoryConfigurationDelegate(configSource, context, environment);