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

com.github.fridujo.automocker.context.ExtendedBeanDefinitionRegistryImpl Maven / Gradle / Ivy

The newest version!
package com.github.fridujo.automocker.context;

import com.github.fridujo.automocker.api.ExtendedBeanDefinitionRegistry;
import com.github.fridujo.automocker.utils.BeanDefinitions;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;

import java.util.HashSet;
import java.util.Set;

class ExtendedBeanDefinitionRegistryImpl implements ExtendedBeanDefinitionRegistry {

    private final BeanDefinitionRegistry registry;

    ExtendedBeanDefinitionRegistryImpl(BeanDefinitionRegistry registry) {
        this.registry = registry;
    }

    @Override
    public Set getBeanDefinitionsForClass(Class clazz) {
        Set result = new HashSet<>();

        for (String beanName : registry.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
            if (beanDefinition instanceof AbstractBeanDefinition) {
                Class beanClass = BeanDefinitions.extractClass((AbstractBeanDefinition) beanDefinition);
                if (clazz.isAssignableFrom(beanClass)) {
                    result.add(new ImmutableBeanDefinitionMetadata(
                        this,
                        beanName,
                        beanClass,
                        (AbstractBeanDefinition) beanDefinition,
                        new BeanDefinitionModifier((AbstractBeanDefinition) beanDefinition)));
                }
            }
        }

        return result;
    }

    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        registry.registerBeanDefinition(beanName, beanDefinition);
    }

    private static class ImmutableBeanDefinitionMetadata implements BeanDefinitionMetadata {
        private final ExtendedBeanDefinitionRegistryImpl extendedBeanDefinitionRegistry;
        private final String name;
        private final Class beanClass;
        private final AbstractBeanDefinition beanDefinition;
        private final BeanDefinitionModifier beanDefinitionModifier;

        private ImmutableBeanDefinitionMetadata(ExtendedBeanDefinitionRegistryImpl extendedBeanDefinitionRegistry, String name,
                                                Class beanClass,
                                                AbstractBeanDefinition beanDefinition,
                                                BeanDefinitionModifier beanDefinitionModifier) {
            this.extendedBeanDefinitionRegistry = extendedBeanDefinitionRegistry;
            this.name = name;
            this.beanClass = beanClass;
            this.beanDefinition = beanDefinition;
            this.beanDefinitionModifier = beanDefinitionModifier;
        }


        @Override
        public String name() {
            return name;
        }

        @Override
        public Class beanClass() {
            return beanClass;
        }

        @Override
        public AbstractBeanDefinition beanDefinition() {
            return beanDefinition;
        }

        @Override
        public BeanDefinitionModifier beanDefinitionModifier() {
            return beanDefinitionModifier;
        }

        @Override
        public String registerLinkedBeanDefinition(Class beanClass) {
            String linkedBeanName = "Automocker" + name() + beanClass.getSimpleName();
            RootBeanDefinition linkedBeanDefinition = new RootBeanDefinition(beanClass);
            extendedBeanDefinitionRegistry.registerBeanDefinition(linkedBeanName, linkedBeanDefinition, getBeanQualifiers());
            return linkedBeanName;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy