Polish contribution

Closes gh-13904
pull/13923/head
Stephane Nicoll 6 years ago
parent df6feb3e2a
commit f780179777

@ -23,20 +23,20 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
/** /**
* Utility class to scan for a {@link SpringBootConfiguration} or custom annotation. * Utility class to find a class annotated with a particular annotation in a hierarchy.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Artsiom Yudovin * @author Artsiom Yudovin
* @author Stephane Nicoll
* @since 2.1.0 * @since 2.1.0
*/ */
public final class SpringBootConfigurationFinder { public final class AnnotatedClassFinder {
private static final Map<String, Class<?>> cache = Collections private static final Map<String, Class<?>> cache = Collections
.synchronizedMap(new Cache(40)); .synchronizedMap(new Cache(40));
@ -44,28 +44,35 @@ public final class SpringBootConfigurationFinder {
private final ClassPathScanningCandidateComponentProvider scanner; private final ClassPathScanningCandidateComponentProvider scanner;
/** /**
* Default constructor initializing finder to scan for a {@link SpringBootConfiguration} annotation. * Create a new instance with the {@code annotationType} to find.
* @param annotationType the annotation to find
*/ */
public SpringBootConfigurationFinder() { public AnnotatedClassFinder(Class<? extends Annotation> annotationType) {
this(SpringBootConfiguration.class); Assert.notNull(annotationType, "AnnotationType must not be null");
}
/**
* Customiable constructor allow to provide the custom annotation to scan for.
* @param annotationType Annotation to scan for.
*/
public SpringBootConfigurationFinder(Class<? extends Annotation> annotationType) {
this.scanner = new ClassPathScanningCandidateComponentProvider(false); this.scanner = new ClassPathScanningCandidateComponentProvider(false);
this.scanner.addIncludeFilter( this.scanner.addIncludeFilter(new AnnotationTypeFilter(annotationType));
new AnnotationTypeFilter(annotationType));
this.scanner.setResourcePattern("*.class"); this.scanner.setResourcePattern("*.class");
} }
/**
* Find the first {@link Class} that is annotated with the target annotation, starting
* from the package defined by the given {@code source} up to the root.
* @param source the source class to use to initiate the search
* @return the first {@link Class} annotated with the target annotation within the
* hierarchy defined by the given {@code source} or {@code null} if none is found.
*/
public Class<?> findFromClass(Class<?> source) { public Class<?> findFromClass(Class<?> source) {
Assert.notNull(source, "Source must not be null"); Assert.notNull(source, "Source must not be null");
return findFromPackage(ClassUtils.getPackageName(source)); return findFromPackage(ClassUtils.getPackageName(source));
} }
/**
* Find the first {@link Class} that is annotated with the target annotation, starting
* from the package defined by the given {@code source} up to the root.
* @param source the source package to use to initiate the search
* @return the first {@link Class} annotated with the target annotation within the
* hierarchy defined by the given {@code source} or {@code null} if none is found.
*/
public Class<?> findFromPackage(String source) { public Class<?> findFromPackage(String source) {
Assert.notNull(source, "Source must not be null"); Assert.notNull(source, "Source must not be null");
Class<?> configuration = cache.get(source); Class<?> configuration = cache.get(source);

@ -238,7 +238,7 @@ public class SpringBootTestContextBootstrapper extends DefaultTestContextBootstr
if (containsNonTestComponent(classes) || mergedConfig.hasLocations()) { if (containsNonTestComponent(classes) || mergedConfig.hasLocations()) {
return classes; return classes;
} }
Class<?> found = new SpringBootConfigurationFinder() Class<?> found = new AnnotatedClassFinder(SpringBootConfiguration.class)
.findFromClass(mergedConfig.getTestClass()); .findFromClass(mergedConfig.getTestClass());
Assert.state(found != null, Assert.state(found != null,
"Unable to find a @SpringBootConfiguration, you need to use " "Unable to find a @SpringBootConfiguration, you need to use "

@ -20,22 +20,24 @@ import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.ExpectedException; import org.junit.rules.ExpectedException;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.example.ExampleConfig; import org.springframework.boot.test.context.example.ExampleConfig;
import org.springframework.boot.test.context.example.scan.Example; import org.springframework.boot.test.context.example.scan.Example;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
/** /**
* Tests for {@link SpringBootConfigurationFinder}. * Tests for {@link AnnotatedClassFinder}.
* *
* @author Phillip Webb * @author Phillip Webb
*/ */
public class SpringBootConfigurationFinderTests { public class AnnotatedClassFinderTests {
@Rule @Rule
public ExpectedException thrown = ExpectedException.none(); public ExpectedException thrown = ExpectedException.none();
private SpringBootConfigurationFinder finder = new SpringBootConfigurationFinder(); private AnnotatedClassFinder finder = new AnnotatedClassFinder(
SpringBootConfiguration.class);
@Test @Test
public void findFromClassWhenSourceIsNullShouldThrowException() { public void findFromClassWhenSourceIsNullShouldThrowException() {

@ -17,10 +17,10 @@
package org.springframework.boot.test.context.example; package org.springframework.boot.test.context.example;
import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests; import org.springframework.boot.test.context.AnnotatedClassFinderTests;
/** /**
* Example config used in {@link SpringBootConfigurationFinderTests}. * Example config used in {@link AnnotatedClassFinderTests}.
* *
* @author Phillip Webb * @author Phillip Webb
*/ */

@ -16,10 +16,10 @@
package org.springframework.boot.test.context.example.scan; package org.springframework.boot.test.context.example.scan;
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests; import org.springframework.boot.test.context.AnnotatedClassFinderTests;
/** /**
* Example class used in {@link SpringBootConfigurationFinderTests}. * Example class used in {@link AnnotatedClassFinderTests}.
* *
* @author Phillip Webb * @author Phillip Webb
*/ */

@ -17,11 +17,11 @@
package org.springframework.boot.test.context.example.scan.sub; package org.springframework.boot.test.context.example.scan.sub;
import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootConfigurationFinderTests; import org.springframework.boot.test.context.AnnotatedClassFinderTests;
/** /**
* Example config used in {@link SpringBootConfigurationFinderTests}. Should not be found * Example config used in {@link AnnotatedClassFinderTests}. Should not be found since
* since scanner should only search upwards. * scanner should only search upwards.
* *
* @author Phillip Webb * @author Phillip Webb
*/ */

Loading…
Cancel
Save