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

com.github.fridujo.automocker.api.ExtendedBeanDefinitionRegistry Maven / Gradle / Ivy

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

import com.github.fridujo.automocker.utils.BeanDefinitions;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.AutowireCandidateQualifier;
import org.springframework.beans.factory.support.RootBeanDefinition;

import java.util.Map;
import java.util.Set;

public interface ExtendedBeanDefinitionRegistry {

    Set getBeanDefinitionsForClass(Class clazz);

    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);

    default String registerBeanDefinition(Class beanClass) {
        String beanName = "Automocker" + beanClass.getSimpleName();
        registerBeanDefinition(beanName, new RootBeanDefinition(beanClass));
        return beanName;
    }

    default String registerBeanDefinition(String beanName, AbstractBeanDefinition abstractBeanDefinition, Map qualifiers) {
        qualifiers.forEach((qualifierType, qualifierValue) -> abstractBeanDefinition.addQualifier(new AutowireCandidateQualifier(qualifierType, qualifierValue)));
        registerBeanDefinition(beanName, abstractBeanDefinition);
        return beanName;
    }

    interface BeanDefinitionMetadata {
        String name();

        Class beanClass();

        AbstractBeanDefinition beanDefinition();

        BeanDefinitionModifier beanDefinitionModifier();

        default Map getBeanQualifiers() {
            return BeanDefinitions.extractQualifiers(beanDefinition());
        }

        String registerLinkedBeanDefinition(Class beanClass);
    }

    class BeanDefinitionModifier {

        private static final String QUALIFIER_CLASS_NAME = Qualifier.class.getName();
        private static final String VALUE_FIELD_NAME = "value";

        private final AbstractBeanDefinition beanDefinition;

        public BeanDefinitionModifier(AbstractBeanDefinition beanDefinition) {
            this.beanDefinition = beanDefinition;
        }

        public BeanDefinitionModifier setFactoryBeanName(String factoryBeanName) {
            beanDefinition.setFactoryBeanName(factoryBeanName);
            return this;
        }

        public BeanDefinitionModifier setFactoryMethodName(String factoryMethodName) {
            beanDefinition.setFactoryMethodName(factoryMethodName);
            return this;
        }

        public BeanDefinitionModifier addConstructorIndexedArgumentValue(int index, Object value) {
            beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(index, value);
            return this;
        }

        public BeanDefinitionModifier setBeanClass(Class beanClass) {
            beanDefinition.setBeanClass(beanClass);
            return this;
        }

        public BeanDefinitionModifier removeConstructorArgumentValues() {
            beanDefinition.setConstructorArgumentValues(null);
            return this;
        }

        public BeanDefinitionModifier removePropertyValues() {
            beanDefinition.setPropertyValues(null);
            return this;
        }

        public BeanDefinitionModifier addPropertyValue(String propertyName, Object propertyValue) {
            beanDefinition.getPropertyValues().add(propertyName, propertyValue);
            return this;
        }

        public BeanDefinitionModifier copyFactoryQualifiersAsDetached() {
            BeanDefinitions.extractQualifiers(beanDefinition)
                .forEach((qualifierType, qualifierValue) -> beanDefinition.addQualifier(new AutowireCandidateQualifier(qualifierType, qualifierValue)));
            return this;
        }

        public BeanDefinitionModifier reset() {
            setFactoryBeanName(null);
            setFactoryMethodName(null);
            removeConstructorArgumentValues();
            removePropertyValues();
            return this;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy