Search in sources :

Example 16 with TypeFilter

use of org.springframework.core.type.filter.TypeFilter in project spring-integration by spring-projects.

the class IntegrationComponentScanRegistrar method typeFiltersFor.

private List<TypeFilter> typeFiltersFor(AnnotationAttributes filter, BeanDefinitionRegistry registry) {
    List<TypeFilter> typeFilters = new ArrayList<>();
    FilterType filterType = filter.getEnum("type");
    for (Class<?> filterClass : filter.getClassArray("classes")) {
        switch(filterType) {
            case ANNOTATION:
                Assert.isAssignable(Annotation.class, filterClass, "An error occurred while processing a @IntegrationComponentScan ANNOTATION type filter: ");
                @SuppressWarnings("unchecked") Class<Annotation> annotationType = (Class<Annotation>) filterClass;
                typeFilters.add(new AnnotationTypeFilter(annotationType));
                break;
            case ASSIGNABLE_TYPE:
                typeFilters.add(new AssignableTypeFilter(filterClass));
                break;
            case CUSTOM:
                Assert.isAssignable(TypeFilter.class, filterClass, "An error occurred while processing a @IntegrationComponentScan CUSTOM type filter: ");
                TypeFilter typeFilter = BeanUtils.instantiateClass(filterClass, TypeFilter.class);
                invokeAwareMethods(filter, this.environment, this.resourceLoader, registry);
                typeFilters.add(typeFilter);
                break;
            default:
                throw new IllegalArgumentException("Filter type not supported with Class value: " + filterType);
        }
    }
    for (String expression : filter.getStringArray("pattern")) {
        switch(filterType) {
            case ASPECTJ:
                typeFilters.add(new AspectJTypeFilter(expression, this.resourceLoader.getClassLoader()));
                break;
            case REGEX:
                typeFilters.add(new RegexPatternTypeFilter(Pattern.compile(expression)));
                break;
            default:
                throw new IllegalArgumentException("Filter type not supported with String pattern: " + filterType);
        }
    }
    return typeFilters;
}
Also used : AnnotationTypeFilter(org.springframework.core.type.filter.AnnotationTypeFilter) AspectJTypeFilter(org.springframework.core.type.filter.AspectJTypeFilter) ArrayList(java.util.ArrayList) TypeFilter(org.springframework.core.type.filter.TypeFilter) AspectJTypeFilter(org.springframework.core.type.filter.AspectJTypeFilter) AnnotationTypeFilter(org.springframework.core.type.filter.AnnotationTypeFilter) RegexPatternTypeFilter(org.springframework.core.type.filter.RegexPatternTypeFilter) AssignableTypeFilter(org.springframework.core.type.filter.AssignableTypeFilter) RegexPatternTypeFilter(org.springframework.core.type.filter.RegexPatternTypeFilter) Annotation(java.lang.annotation.Annotation) FilterType(org.springframework.context.annotation.FilterType) AssignableTypeFilter(org.springframework.core.type.filter.AssignableTypeFilter)

Example 17 with TypeFilter

use of org.springframework.core.type.filter.TypeFilter in project spring-integration by spring-projects.

the class IntegrationComponentScanRegistrar method registerBeanDefinitions.

@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    Map<String, Object> componentScan = importingClassMetadata.getAnnotationAttributes(IntegrationComponentScan.class.getName());
    Collection<String> basePackages = getBasePackages(importingClassMetadata, registry);
    if (basePackages.isEmpty()) {
        basePackages = Collections.singleton(ClassUtils.getPackageName(importingClassMetadata.getClassName()));
    }
    ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false) {

        @Override
        protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
            return beanDefinition.getMetadata().isIndependent() && !beanDefinition.getMetadata().isAnnotation();
        }
    };
    if ((boolean) componentScan.get("useDefaultFilters")) {
        for (TypeFilter typeFilter : this.componentRegistrars.keySet()) {
            scanner.addIncludeFilter(typeFilter);
        }
    }
    for (AnnotationAttributes filter : (AnnotationAttributes[]) componentScan.get("includeFilters")) {
        for (TypeFilter typeFilter : typeFiltersFor(filter, registry)) {
            scanner.addIncludeFilter(typeFilter);
        }
    }
    for (AnnotationAttributes filter : (AnnotationAttributes[]) componentScan.get("excludeFilters")) {
        for (TypeFilter typeFilter : typeFiltersFor(filter, registry)) {
            scanner.addExcludeFilter(typeFilter);
        }
    }
    scanner.setResourceLoader(this.resourceLoader);
    for (String basePackage : basePackages) {
        Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents(basePackage);
        for (BeanDefinition candidateComponent : candidateComponents) {
            if (candidateComponent instanceof AnnotatedBeanDefinition) {
                for (ImportBeanDefinitionRegistrar registrar : this.componentRegistrars.values()) {
                    registrar.registerBeanDefinitions(((AnnotatedBeanDefinition) candidateComponent).getMetadata(), registry);
                }
            }
        }
    }
}
Also used : IntegrationComponentScan(org.springframework.integration.annotation.IntegrationComponentScan) AnnotationAttributes(org.springframework.core.annotation.AnnotationAttributes) AnnotatedBeanDefinition(org.springframework.beans.factory.annotation.AnnotatedBeanDefinition) ClassPathScanningCandidateComponentProvider(org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider) TypeFilter(org.springframework.core.type.filter.TypeFilter) AspectJTypeFilter(org.springframework.core.type.filter.AspectJTypeFilter) AnnotationTypeFilter(org.springframework.core.type.filter.AnnotationTypeFilter) RegexPatternTypeFilter(org.springframework.core.type.filter.RegexPatternTypeFilter) AssignableTypeFilter(org.springframework.core.type.filter.AssignableTypeFilter) ImportBeanDefinitionRegistrar(org.springframework.context.annotation.ImportBeanDefinitionRegistrar) AnnotatedBeanDefinition(org.springframework.beans.factory.annotation.AnnotatedBeanDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition)

Example 18 with TypeFilter

use of org.springframework.core.type.filter.TypeFilter in project grails-core by grails.

the class ClosureClassIgnoringComponentScanBeanDefinitionParser method createScanner.

@Override
protected ClassPathBeanDefinitionScanner createScanner(XmlReaderContext readerContext, boolean useDefaultFilters) {
    final ClassPathBeanDefinitionScanner scanner = super.createScanner(readerContext, useDefaultFilters);
    BeanDefinitionRegistry beanDefinitionRegistry = readerContext.getRegistry();
    GrailsPluginManager pluginManager = null;
    if (beanDefinitionRegistry instanceof HierarchicalBeanFactory) {
        HierarchicalBeanFactory beanFactory = (HierarchicalBeanFactory) beanDefinitionRegistry;
        BeanFactory parent = beanFactory.getParentBeanFactory();
        if (parent != null && parent.containsBean(GrailsPluginManager.BEAN_NAME)) {
            pluginManager = parent.getBean(GrailsPluginManager.BEAN_NAME, GrailsPluginManager.class);
        }
    }
    if (pluginManager != null) {
        List<TypeFilter> typeFilters = pluginManager.getTypeFilters();
        for (TypeFilter typeFilter : typeFilters) {
            scanner.addIncludeFilter(typeFilter);
        }
    }
    return scanner;
}
Also used : ClassPathBeanDefinitionScanner(org.springframework.context.annotation.ClassPathBeanDefinitionScanner) GrailsPluginManager(grails.plugins.GrailsPluginManager) HierarchicalBeanFactory(org.springframework.beans.factory.HierarchicalBeanFactory) BeanFactory(org.springframework.beans.factory.BeanFactory) BeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry) TypeFilter(org.springframework.core.type.filter.TypeFilter) HierarchicalBeanFactory(org.springframework.beans.factory.HierarchicalBeanFactory)

Aggregations

TypeFilter (org.springframework.core.type.filter.TypeFilter)18 AnnotationTypeFilter (org.springframework.core.type.filter.AnnotationTypeFilter)12 AssignableTypeFilter (org.springframework.core.type.filter.AssignableTypeFilter)12 RegexPatternTypeFilter (org.springframework.core.type.filter.RegexPatternTypeFilter)8 AspectJTypeFilter (org.springframework.core.type.filter.AspectJTypeFilter)7 Annotation (java.lang.annotation.Annotation)5 HashSet (java.util.HashSet)5 BeanDefinition (org.springframework.beans.factory.config.BeanDefinition)5 IOException (java.io.IOException)4 ArrayList (java.util.ArrayList)4 MetadataReader (org.springframework.core.type.classreading.MetadataReader)4 Element (org.w3c.dom.Element)4 LinkedHashSet (java.util.LinkedHashSet)3 Test (org.junit.Test)3 AnnotatedBeanDefinition (org.springframework.beans.factory.annotation.AnnotatedBeanDefinition)3 BeanDefinitionStoreException (org.springframework.beans.factory.BeanDefinitionStoreException)2 BeanDefinitionRegistry (org.springframework.beans.factory.support.BeanDefinitionRegistry)2 BeanNameGenerator (org.springframework.beans.factory.support.BeanNameGenerator)2 ClassPathBeanDefinitionScanner (org.springframework.context.annotation.ClassPathBeanDefinitionScanner)2 ClassPathScanningCandidateComponentProvider (org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider)2