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

io.smallrye.config.inject.ConfigMappingInjectionBean Maven / Gradle / Ivy

package io.smallrye.config.inject;

import static io.smallrye.config.inject.SecuritySupport.getContextClassLoader;
import static java.util.Optional.ofNullable;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;

import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;

import org.eclipse.microprofile.config.ConfigProvider;
import org.eclipse.microprofile.config.inject.ConfigProperties;

import io.smallrye.config.ConfigMapping;
import io.smallrye.config.SmallRyeConfig;

public class ConfigMappingInjectionBean implements Bean {
    private final BeanManager bm;
    private final Class klass;
    private final String prefix;
    private final Set qualifiers = new HashSet<>();

    public ConfigMappingInjectionBean(final BeanManager bm, final AnnotatedType type) {
        this.bm = bm;
        this.klass = type.getJavaClass();
        this.prefix = getPrefixFromType(type);
        this.qualifiers.add(Default.Literal.INSTANCE);
        if (type.isAnnotationPresent(ConfigProperties.class)) {
            this.qualifiers.add(ConfigProperties.Literal.of(prefix));
        }
    }

    @Override
    public Class getBeanClass() {
        return klass;
    }

    @Override
    public Set getInjectionPoints() {
        return Collections.emptySet();
    }

    @Override
    public boolean isNullable() {
        return false;
    }

    @Override
    public T create(final CreationalContext creationalContext) {
        InjectionPoint injectionPoint = (InjectionPoint) bm.getInjectableReference(new MetadataInjectionPoint(),
                creationalContext);

        SmallRyeConfig config = (SmallRyeConfig) ConfigProvider.getConfig(getContextClassLoader());
        return config.getConfigMapping(klass, getPrefixFromInjectionPoint(injectionPoint).orElse(prefix));
    }

    @Override
    public void destroy(final T instance, final CreationalContext creationalContext) {

    }

    @Override
    public Set getTypes() {
        return Collections.singleton(klass);
    }

    @Override
    public Set getQualifiers() {
        return qualifiers;
    }

    @Override
    public Class getScope() {
        return Dependent.class;
    }

    @Override
    public String getName() {
        return this.getClass() + "_" + klass.getName();
    }

    @Override
    public Set> getStereotypes() {
        return Collections.emptySet();
    }

    @Override
    public boolean isAlternative() {
        return false;
    }

    static String getPrefixFromType(final Annotated annotated) {
        final Optional prefixFromConfigMappingClass = ofNullable(annotated.getBaseType()).map(type -> (Class) type)
                .map(c -> c.getAnnotation(ConfigMapping.class))
                .map(ConfigMapping::prefix);

        final Optional prefixFromConfigPropertiesClass = ofNullable(annotated.getBaseType())
                .map(type -> (Class) type)
                .map(c -> c.getAnnotation(ConfigProperties.class))
                .map(ConfigProperties::prefix)
                .filter(prefix -> !prefix.equals(ConfigProperties.UNCONFIGURED_PREFIX));

        return Stream.of(prefixFromConfigMappingClass, prefixFromConfigPropertiesClass)
                .flatMap(s -> s.map(Stream::of).orElseGet(Stream::empty))
                .findFirst()
                .orElse("");
    }

    static Optional getPrefixFromInjectionPoint(final InjectionPoint injectionPoint) {
        final Optional prefixFromConfigMapping = Optional.ofNullable(injectionPoint.getAnnotated())
                .map(a -> a.getAnnotation(ConfigMapping.class))
                .map(ConfigMapping::prefix)
                .filter(prefix -> !prefix.isEmpty());

        final Optional prefixFromConfigProperties = Optional.ofNullable(injectionPoint.getAnnotated())
                .map(a -> a.getAnnotation(ConfigProperties.class))
                .map(ConfigProperties::prefix)
                .filter(prefix -> !prefix.equals(ConfigProperties.UNCONFIGURED_PREFIX));

        final Optional prefixFromQualifier = injectionPoint.getQualifiers().stream()
                .filter(ConfigProperties.class::isInstance)
                .map(ConfigProperties.class::cast)
                .map(ConfigProperties::prefix)
                .filter(prefix -> !prefix.equals(ConfigProperties.UNCONFIGURED_PREFIX))
                .findFirst();

        return Stream.of(prefixFromConfigMapping, prefixFromConfigProperties, prefixFromQualifier)
                .flatMap(s -> s.map(Stream::of).orElseGet(Stream::empty))
                .findFirst();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy