All Downloads are FREE. Search and download functionalities are using the official Maven repository.

in.hocg.boot.netty.client.autoconfiguration.bean.CommandInvokerRegistrar Maven / Gradle / Ivy

package in.hocg.boot.netty.client.autoconfiguration.bean;

import in.hocg.netty.core.annotation.Invoker;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.StringUtils;

import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Getter
@Setter
public class CommandInvokerRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
    private Class annotationClass = Invoker.class;
    private BeanFactory beanFactory;

    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        List packages = AutoConfigurationPackages.get(this.beanFactory);
        String basePackage = StringUtils.collectionToCommaDelimitedString(packages);
//        String[] packages = StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
        ClassPathScanningCandidateComponentProvider scanner = getScanner();
        scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
        Set beanDefinitions = scanner.findCandidateComponents(basePackage);
        for (BeanDefinition candidateComponent : beanDefinitions) {
            if (candidateComponent instanceof AnnotatedBeanDefinition) {
                AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
                AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
                Map attributes = annotationMetadata.getAnnotationAttributes(annotationClass.getCanonicalName());
                registerInvokerBean(registry, annotationMetadata, attributes);
            }
        }
    }

    private void registerInvokerBean(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map attributes) {
        BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(InvokerFactoryBean.class);
        String className = annotationMetadata.getClassName();
        definition.addPropertyValue("type", className);
        definition.addPropertyValue("channelType", attributes.get("value"));
        definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
        AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
        // String alias = className + "Invoker";
        BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className);
        BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
    }


    protected ClassPathScanningCandidateComponentProvider getScanner() {
        return new ClassPathScanningCandidateComponentProvider(false) {
            @Override
            protected boolean isCandidateComponent(
                AnnotatedBeanDefinition beanDefinition) {
                boolean isCandidate = false;
                if (beanDefinition.getMetadata().isIndependent()) {
                    if (!beanDefinition.getMetadata().isAnnotation()) {
                        isCandidate = true;
                    }
                }
                return isCandidate;
            }
        };
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy