io.smallrye.config.inject.ConfigInjectionBean Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2017 Red Hat, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.smallrye.config.inject;
import java.lang.annotation.Annotation;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import jakarta.enterprise.context.Dependent;
import jakarta.enterprise.context.spi.CreationalContext;
import jakarta.enterprise.inject.Instance;
import jakarta.enterprise.inject.spi.Annotated;
import jakarta.enterprise.inject.spi.Bean;
import jakarta.enterprise.inject.spi.BeanManager;
import jakarta.enterprise.inject.spi.InjectionPoint;
import jakarta.enterprise.inject.spi.PassivationCapable;
import jakarta.enterprise.util.AnnotationLiteral;
import jakarta.inject.Provider;
import org.eclipse.microprofile.config.Config;
import org.eclipse.microprofile.config.ConfigProvider;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import io.smallrye.config.SmallRyeConfig;
/**
* @author Mark Struberg
*/
public class ConfigInjectionBean implements Bean, PassivationCapable {
private static final Set QUALIFIERS = new HashSet<>();
static {
QUALIFIERS.add(new ConfigPropertyLiteral());
}
private final BeanManager bm;
private final Class> clazz;
/**
* only access via {@link #getConfig()}
*/
private Config _config;
public ConfigInjectionBean(BeanManager bm, Class> clazz) {
this.bm = bm;
this.clazz = clazz;
}
@Override
public Set getInjectionPoints() {
return Collections.emptySet();
}
@Override
public Class> getBeanClass() {
return ConfigInjectionBean.class;
}
@Override
@SuppressWarnings("unchecked")
public T create(CreationalContext context) {
InjectionPoint ip = (InjectionPoint) bm.getInjectableReference(new MetadataInjectionPoint(), context);
Annotated annotated = ip.getAnnotated();
ConfigProperty configProperty = annotated.getAnnotation(ConfigProperty.class);
String key = ConfigProducerUtil.getConfigKey(ip, configProperty);
String defaultValue = configProperty.defaultValue();
if (annotated.getBaseType() instanceof ParameterizedType) {
ParameterizedType paramType = (ParameterizedType) annotated.getBaseType();
Type rawType = paramType.getRawType();
// handle Provider and Instance
if (rawType instanceof Class
&& (((Class>) rawType).isAssignableFrom(Provider.class)
|| ((Class>) rawType).isAssignableFrom(Instance.class))
&& paramType.getActualTypeArguments().length == 1) {
Class> paramTypeClass = (Class>) paramType.getActualTypeArguments()[0];
return (T) getConfig().getValue(key, paramTypeClass);
}
} else {
Class> annotatedTypeClass = (Class>) annotated.getBaseType();
if (defaultValue.isEmpty()) {
return (T) getConfig().getValue(key, annotatedTypeClass);
} else {
Optional optionalValue = (Optional) getConfig().getOptionalValue(key, annotatedTypeClass);
return optionalValue.orElseGet(
() -> (T) getConfig().unwrap(SmallRyeConfig.class).convert(defaultValue, annotatedTypeClass));
}
}
throw InjectionMessages.msg.unhandledConfigProperty();
}
public Config getConfig() {
if (_config == null) {
_config = ConfigProvider.getConfig();
}
return _config;
}
@Override
public void destroy(T instance, CreationalContext context) {
}
@Override
public Set getTypes() {
return Collections.singleton(clazz);
}
@Override
public Set getQualifiers() {
return QUALIFIERS;
}
@Override
public Class extends Annotation> getScope() {
return Dependent.class;
}
@Override
public String getName() {
return "ConfigInjectionBean_" + clazz;
}
@Override
public Set> getStereotypes() {
return Collections.emptySet();
}
@Override
public boolean isAlternative() {
return false;
}
@Override
public String getId() {
return "ConfigInjectionBean_" + clazz;
}
private static class ConfigPropertyLiteral extends AnnotationLiteral implements ConfigProperty {
@Override
public String name() {
return "";
}
@Override
public String defaultValue() {
return "";
}
}
}