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 d274e8ab6..1d5290a43 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Stream; import javax.annotation.Nonnull; @@ -129,24 +130,6 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura this.hasExplicitFilters = hasExplicitFilters(attributes); } - /** - * Returns whether there's explicit configuration of include- or exclude filters. - * - * @param attributes must not be {@literal null}. - * @return - */ - private static boolean hasExplicitFilters(AnnotationAttributes attributes) { - - for (String attribute : Arrays.asList("includeFilters", "excludeFilters")) { - - if (attributes.getAnnotationArray(attribute).length > 0) { - return true; - } - } - - return false; - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getBasePackages() @@ -226,25 +209,6 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura return parseFilters("excludeFilters"); } - private Streamable parseFilters(String attributeName) { - - AnnotationAttributes[] filters = attributes.getAnnotationArray(attributeName); - - return Streamable.of(() -> Arrays.stream(filters).flatMap(it -> typeFiltersFor(it).stream())); - } - - /** - * Returns the {@link String} attribute with the given name and defaults it to {@literal Optional#empty()} in case - * it's empty. - * - * @param attributeName - * @return - */ - private Optional getNullDefaultedAttribute(String attributeName) { - String attribute = attributes.getString(attributeName); - return StringUtils.hasText(attribute) ? Optional.of(attribute) : Optional.empty(); - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationSource#getRepositoryFactoryBeanClassName() @@ -288,55 +252,6 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura return enableAnnotationMetadata; } - /** - * Copy of {@code ComponentScanAnnotationParser#typeFiltersFor}. - * - * @param filterAttributes - * @return - */ - private List typeFiltersFor(AnnotationAttributes filterAttributes) { - - List typeFilters = new ArrayList<>(); - FilterType filterType = filterAttributes.getEnum("type"); - - for (Class filterClass : filterAttributes.getClassArray("value")) { - switch (filterType) { - case ANNOTATION: - Assert.isAssignable(Annotation.class, filterClass, - "An error occured when processing a @ComponentScan " + "ANNOTATION type filter: "); - @SuppressWarnings("unchecked") - Class annoClass = (Class) filterClass; - typeFilters.add(new AnnotationTypeFilter(annoClass)); - break; - case ASSIGNABLE_TYPE: - typeFilters.add(new AssignableTypeFilter(filterClass)); - break; - case CUSTOM: - Assert.isAssignable(TypeFilter.class, filterClass, - "An error occured when processing a @ComponentScan " + "CUSTOM type filter: "); - typeFilters.add(BeanUtils.instantiateClass(filterClass, TypeFilter.class)); - break; - default: - throw new IllegalArgumentException("Unknown filter type " + filterType); - } - } - - for (String expression : getPatterns(filterAttributes)) { - - String rawName = filterType.toString(); - - if ("REGEX".equals(rawName)) { - typeFilters.add(new RegexPatternTypeFilter(Pattern.compile(expression))); - } else if ("ASPECTJ".equals(rawName)) { - typeFilters.add(new AspectJTypeFilter(expression, this.resourceLoader.getClassLoader())); - } else { - throw new IllegalArgumentException("Unknown filter type " + filterType); - } - } - - return typeFilters; - } - /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationSourceSupport#shouldConsiderNestedRepositories() @@ -406,6 +321,76 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura } } + private Streamable parseFilters(String attributeName) { + + AnnotationAttributes[] filters = attributes.getAnnotationArray(attributeName); + + return Streamable.of(() -> Arrays.stream(filters).flatMap(it -> typeFiltersFor(it).stream())); + } + + /** + * Returns the {@link String} attribute with the given name and defaults it to {@literal Optional#empty()} in case + * it's empty. + * + * @param attributeName + * @return + */ + private Optional getNullDefaultedAttribute(String attributeName) { + + String attribute = attributes.getString(attributeName); + + return StringUtils.hasText(attribute) ? Optional.of(attribute) : Optional.empty(); + } + + /** + * Copy of {@code ComponentScanAnnotationParser#typeFiltersFor}. + * + * @param filterAttributes + * @return + */ + private List typeFiltersFor(AnnotationAttributes filterAttributes) { + + List typeFilters = new ArrayList<>(); + FilterType filterType = filterAttributes.getEnum("type"); + + for (Class filterClass : filterAttributes.getClassArray("value")) { + switch (filterType) { + case ANNOTATION: + Assert.isAssignable(Annotation.class, filterClass, + "An error occured when processing a @ComponentScan " + "ANNOTATION type filter: "); + @SuppressWarnings("unchecked") + Class annoClass = (Class) filterClass; + typeFilters.add(new AnnotationTypeFilter(annoClass)); + break; + case ASSIGNABLE_TYPE: + typeFilters.add(new AssignableTypeFilter(filterClass)); + break; + case CUSTOM: + Assert.isAssignable(TypeFilter.class, filterClass, + "An error occured when processing a @ComponentScan " + "CUSTOM type filter: "); + typeFilters.add(BeanUtils.instantiateClass(filterClass, TypeFilter.class)); + break; + default: + throw new IllegalArgumentException("Unknown filter type " + filterType); + } + } + + for (String expression : getPatterns(filterAttributes)) { + + String rawName = filterType.toString(); + + if ("REGEX".equals(rawName)) { + typeFilters.add(new RegexPatternTypeFilter(Pattern.compile(expression))); + } else if ("ASPECTJ".equals(rawName)) { + typeFilters.add(new AspectJTypeFilter(expression, this.resourceLoader.getClassLoader())); + } else { + throw new IllegalArgumentException("Unknown filter type " + filterType); + } + } + + return typeFilters; + } + /** * Safely reads the {@code pattern} attribute from the given {@link AnnotationAttributes} and returns an empty list if * the attribute is not present. @@ -422,6 +407,18 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura } } + /** + * Returns whether there's explicit configuration of include- or exclude filters. + * + * @param attributes must not be {@literal null}. + * @return + */ + private static boolean hasExplicitFilters(AnnotationAttributes attributes) { + + return Stream.of("includeFilters", "excludeFilters") // + .anyMatch(it -> attributes.getAnnotationArray(it).length > 0); + } + /** * Returns the {@link BeanNameGenerator} to use falling back to an {@link AnnotationBeanNameGenerator} if either the * given generator is {@literal null} or it's the one locally declared in {@link ConfigurationClassPostProcessor}'s @@ -430,6 +427,7 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura * * @param generator can be {@literal null}. * @return + * @since 2.2 */ private static BeanNameGenerator defaultBeanNameGenerator(@Nullable BeanNameGenerator generator) { 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 52a1fdfde..960c7bc22 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationSourceSupport.java @@ -123,7 +123,7 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository return false; } - /* + /* * (non-Javadoc) * @see org.springframework.data.repository.config.RepositoryConfigurationSource#toImplementationDetectionConfiguration() */ @@ -138,7 +138,7 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository private final RepositoryConfigurationSource source; private final @Getter MetadataReaderFactory metadataReaderFactory; - /* + /* * (non-Javadoc) * @see org.springframework.data.repository.config.CustomRepositoryImplementationDetector.ImplementationDetectionConfiguration#getImplementationPostfix() */ @@ -148,7 +148,7 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository .orElse(DefaultRepositoryConfiguration.DEFAULT_REPOSITORY_IMPLEMENTATION_POSTFIX); } - /* + /* * (non-Javadoc) * @see org.springframework.data.repository.config.CustomRepositoryImplementationDetector.ImplementationDetectionConfiguration#getBasePackages() */ @@ -157,7 +157,7 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository return source.getBasePackages(); } - /* + /* * (non-Javadoc) * @see org.springframework.data.repository.config.CustomRepositoryImplementationDetector.ImplementationDetectionConfiguration#getExcludeFilters() */ @@ -166,7 +166,7 @@ public abstract class RepositoryConfigurationSourceSupport implements Repository return source.getExcludeFilters(); } - /* + /* * (non-Javadoc) * @see org.springframework.data.repository.config.CustomRepositoryImplementationDetector.ImplementationDetectionConfiguration#generateBeanName(org.springframework.beans.factory.config.BeanDefinition) */