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

org.zalando.riptide.autoconfigure.Registry Maven / Gradle / Ivy

There is a newer version: 4.3.0
Show newest version
package org.zalando.riptide.autoconfigure;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.AutowireCandidateQualifier;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.ManagedList;

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

import static org.zalando.riptide.autoconfigure.Name.name;

@AllArgsConstructor
@Slf4j
final class Registry {

    private final BeanDefinitionRegistry registry;

    String registerIfAbsent(final String id, final Class suffix, final Supplier factory) {
        return registerIfAbsent(name(id, suffix), factory);
    }

    String registerIfAbsent(final Name name, final Supplier factory) {
        return find(name).orElseGet(() -> {
            final AbstractBeanDefinition definition = factory.get().getBeanDefinition();

            name.getId().ifPresent(id ->
                    definition.addQualifier(new AutowireCandidateQualifier(Qualifier.class, id)));

            final String beanName = name.toNormalizedString();
            log.debug("Registering [{}]", beanName);
            registry.registerBeanDefinition(beanName, definition);
            return beanName;
        });
    }

    Optional findRef(final String id, final Class... types) {
        return find(id, types).map(Registry::ref);
    }

    Optional find(final String id, final Class... types) {
        return find(name(id, types));
    }

    Optional find(final Name name) {
        return name.getAlternatives().stream()
                .filter(registry::isBeanNameInUse)
                .findFirst();
    }

    static BeanReference ref(final String beanName) {
        return new RuntimeBeanReference(beanName);
    }

    @SafeVarargs
    public static  List list(final T... elements) {
        final ManagedList list = new ManagedList<>();
        Collections.addAll(list, elements);
        return list;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy