package org.finra.datagenerator.scaffolding.utils; import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.env.Environment; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * Created by dkopel on 1/5/17. */ public class AdvancedClassPathScanner extends ClassPathScanningCandidateComponentProvider { private Boolean isConcrete = true; public AdvancedClassPathScanner(boolean useDefaultFilters) { super(useDefaultFilters); } public AdvancedClassPathScanner(boolean useDefaultFilters, Environment environment) { super(useDefaultFilters, environment); } public Boolean getConcrete() { return isConcrete; } public AdvancedClassPathScanner setConcrete(Boolean concrete) { isConcrete = concrete; return this; } private boolean isConcrete(AnnotatedBeanDefinition beanDefinition) { return isConcrete || beanDefinition.getMetadata().isConcrete(); } @Override protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { return isConcrete(beanDefinition) && beanDefinition.getMetadata().isIndependent(); } public Set<BeanDefinition> findCandidateComponents(List<String> basePackages) { return basePackages .stream() .flatMap(bp -> findCandidateComponents(bp).stream()) .collect(Collectors.toSet()); } }