
org.zalando.riptide.autoconfigure.Registry Maven / Gradle / Ivy
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;
}
}