Search in sources :

Example 1 with RootDefinition

use of io.quarkus.deployment.configuration.definition.RootDefinition in project quarkus by quarkusio.

the class ExtensionLoader method loadStepsFrom.

/**
 * Load all the build steps from the given class loader.
 *
 * @param classLoader the class loader
 * @param buildSystemProps the build system properties to use
 * @param launchMode launch mode
 * @param configCustomizer configuration customizer
 * @return a consumer which adds the steps to the given chain builder
 * @throws IOException if the class loader could not load a resource
 * @throws ClassNotFoundException if a build step class is not found
 */
public static Consumer<BuildChainBuilder> loadStepsFrom(ClassLoader classLoader, Properties buildSystemProps, ApplicationModel appModel, LaunchMode launchMode, DevModeType devModeType) throws IOException, ClassNotFoundException {
    // populate with all known types
    List<Class<?>> roots = new ArrayList<>();
    for (Class<?> clazz : ServiceUtil.classesNamedIn(classLoader, CONFIG_ROOTS_LIST)) {
        final ConfigRoot annotation = clazz.getAnnotation(ConfigRoot.class);
        if (annotation == null) {
            cfgLog.warnf("Ignoring configuration root %s because it has no annotation", clazz);
        } else {
            roots.add(clazz);
        }
    }
    final BuildTimeConfigurationReader reader = new BuildTimeConfigurationReader(roots);
    // now prepare & load the build configuration
    final SmallRyeConfigBuilder builder = ConfigUtils.configBuilder(false, launchMode);
    final DefaultValuesConfigurationSource ds1 = new DefaultValuesConfigurationSource(reader.getBuildTimePatternMap());
    final DefaultValuesConfigurationSource ds2 = new DefaultValuesConfigurationSource(reader.getBuildTimeRunTimePatternMap());
    final PropertiesConfigSource pcs = new PropertiesConfigSource(buildSystemProps, "Build system");
    final Map<String, String> platformProperties = appModel.getPlatformProperties();
    if (platformProperties.isEmpty()) {
        builder.withSources(ds1, ds2, pcs);
    } else {
        final KeyMap<String> props = new KeyMap<>(platformProperties.size());
        for (Map.Entry<String, String> prop : platformProperties.entrySet()) {
            props.findOrAdd(new NameIterator(prop.getKey())).putRootValue(prop.getValue());
        }
        final KeyMapBackedConfigSource platformConfigSource = new KeyMapBackedConfigSource("Quarkus platform", // (see io.quarkus.deployment.configuration.DefaultValuesConfigurationSource)
        Integer.MIN_VALUE + 1000, props);
        builder.withSources(ds1, ds2, platformConfigSource, pcs);
    }
    for (ConfigClassWithPrefix mapping : reader.getBuildTimeVisibleMappings()) {
        builder.withMapping(mapping.getKlass(), mapping.getPrefix());
    }
    final SmallRyeConfig src = builder.build();
    // install globally
    QuarkusConfigFactory.setConfig(src);
    final ConfigProviderResolver cpr = ConfigProviderResolver.instance();
    try {
        cpr.releaseConfig(cpr.getConfig());
    } catch (IllegalStateException ignored) {
    // just means no config was installed, which is fine
    }
    final BuildTimeConfigurationReader.ReadResult readResult = reader.readConfiguration(src);
    final BooleanSupplierFactoryBuildItem bsf = new BooleanSupplierFactoryBuildItem(readResult, launchMode, devModeType);
    Consumer<BuildChainBuilder> result = Functions.discardingConsumer();
    // BooleanSupplier factory
    result = result.andThen(bcb -> bcb.addBuildStep(bc -> {
        bc.produce(bsf);
    }).produces(BooleanSupplierFactoryBuildItem.class).build());
    // the proxy objects used for run time config in the recorders
    Map<Class<?>, Object> proxies = new HashMap<>();
    for (Class<?> clazz : ServiceUtil.classesNamedIn(classLoader, "META-INF/quarkus-build-steps.list")) {
        try {
            result = result.andThen(ExtensionLoader.loadStepsFromClass(clazz, readResult, proxies, bsf));
        } catch (Throwable e) {
            throw new RuntimeException("Failed to load steps from " + clazz, e);
        }
    }
    // this has to be an identity hash map else the recorder will get angry
    Map<Object, FieldDescriptor> rootFields = new IdentityHashMap<>();
    Map<Object, ConfigClassWithPrefix> mappingClasses = new IdentityHashMap<>();
    for (Map.Entry<Class<?>, Object> entry : proxies.entrySet()) {
        // ConfigRoot
        RootDefinition root = readResult.getAllRootsByClass().get(entry.getKey());
        if (root != null) {
            rootFields.put(entry.getValue(), root.getDescriptor());
            continue;
        }
        // ConfigMapping
        ConfigClassWithPrefix mapping = readResult.getAllMappings().get(entry.getKey());
        if (mapping != null) {
            mappingClasses.put(entry.getValue(), mapping);
            continue;
        }
        throw new IllegalStateException("No config found for " + entry.getKey());
    }
    result = result.andThen(bcb -> bcb.addBuildStep(bc -> {
        bc.produce(new ConfigurationBuildItem(readResult));
        bc.produce(new RunTimeConfigurationProxyBuildItem(proxies));
        ObjectLoader rootLoader = new ObjectLoader() {

            public ResultHandle load(final BytecodeCreator body, final Object obj, final boolean staticInit) {
                return body.readStaticField(rootFields.get(obj));
            }

            public boolean canHandleObject(final Object obj, final boolean staticInit) {
                return rootFields.containsKey(obj);
            }
        };
        ObjectLoader mappingLoader = new ObjectLoader() {

            @Override
            public ResultHandle load(final BytecodeCreator body, final Object obj, final boolean staticInit) {
                ConfigClassWithPrefix mapping = mappingClasses.get(obj);
                MethodDescriptor getConfig = MethodDescriptor.ofMethod(ConfigProvider.class, "getConfig", Config.class);
                ResultHandle config = body.invokeStaticMethod(getConfig);
                MethodDescriptor getMapping = MethodDescriptor.ofMethod(SmallRyeConfig.class, "getConfigMapping", Object.class, Class.class, String.class);
                return body.invokeVirtualMethod(getMapping, config, body.loadClass(mapping.getKlass()), body.load(mapping.getPrefix()));
            }

            @Override
            public boolean canHandleObject(final Object obj, final boolean staticInit) {
                return mappingClasses.containsKey(obj);
            }
        };
        bc.produce(new BytecodeRecorderObjectLoaderBuildItem(rootLoader));
        bc.produce(new BytecodeRecorderObjectLoaderBuildItem(mappingLoader));
    }).produces(ConfigurationBuildItem.class).produces(RunTimeConfigurationProxyBuildItem.class).produces(BytecodeRecorderObjectLoaderBuildItem.class).build());
    return result;
}
Also used : RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) ReflectUtil.isSupplierOfOptionalOf(io.quarkus.deployment.util.ReflectUtil.isSupplierOfOptionalOf) RecorderContext(io.quarkus.deployment.recording.RecorderContext) BooleanSupplier(java.util.function.BooleanSupplier) Functions(org.wildfly.common.function.Functions) ReflectUtil.isSupplierOf(io.quarkus.deployment.util.ReflectUtil.isSupplierOf) Arrays.asList(java.util.Arrays.asList) Map(java.util.Map) BytecodeCreator(io.quarkus.gizmo.BytecodeCreator) Recorder(io.quarkus.runtime.annotations.Recorder) ConsumeFlags(io.quarkus.builder.ConsumeFlags) RunTimeConfigurationProxyBuildItem(io.quarkus.deployment.builditem.RunTimeConfigurationProxyBuildItem) ReflectUtil.rawTypeIs(io.quarkus.deployment.util.ReflectUtil.rawTypeIs) KeyMap(io.smallrye.config.KeyMap) EnumSet(java.util.EnumSet) Consume(io.quarkus.deployment.annotations.Consume) Member(java.lang.reflect.Member) MainBytecodeRecorderBuildItem(io.quarkus.deployment.builditem.MainBytecodeRecorderBuildItem) StaticBytecodeRecorderBuildItem(io.quarkus.deployment.builditem.StaticBytecodeRecorderBuildItem) ReflectUtil.isBuildProducerOf(io.quarkus.deployment.util.ReflectUtil.isBuildProducerOf) InvocationTargetException(java.lang.reflect.InvocationTargetException) Weak(io.quarkus.deployment.annotations.Weak) ApplicationModel(io.quarkus.bootstrap.model.ApplicationModel) ConfigProvider(org.eclipse.microprofile.config.ConfigProvider) ConsumeFlag(io.quarkus.builder.ConsumeFlag) PropertiesConfigSource(io.smallrye.config.PropertiesConfigSource) ConfigClassWithPrefix(io.smallrye.config.ConfigMappings.ConfigClassWithPrefix) ResultHandle(io.quarkus.gizmo.ResultHandle) AnnotatedElement(java.lang.reflect.AnnotatedElement) Record(io.quarkus.deployment.annotations.Record) ProduceWeak(io.quarkus.deployment.annotations.ProduceWeak) DevModeType(io.quarkus.dev.spi.DevModeType) ReflectUtil.rawTypeOf(io.quarkus.deployment.util.ReflectUtil.rawTypeOf) BuildStepBuilder(io.quarkus.builder.BuildStepBuilder) BuildItem(io.quarkus.builder.item.BuildItem) SimpleBuildItem(io.quarkus.builder.item.SimpleBuildItem) Constructor(java.lang.reflect.Constructor) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) ConfigRoot(io.quarkus.runtime.annotations.ConfigRoot) BuildChainBuilder(io.quarkus.builder.BuildChainBuilder) Parameter(java.lang.reflect.Parameter) BiConsumer(java.util.function.BiConsumer) KeyMapBackedConfigSource(io.smallrye.config.KeyMapBackedConfigSource) Properties(java.util.Properties) Executor(java.util.concurrent.Executor) IOException(java.io.IOException) Field(java.lang.reflect.Field) FieldDescriptor(io.quarkus.gizmo.FieldDescriptor) ParameterizedType(java.lang.reflect.ParameterizedType) SmallRyeConfigBuilder(io.smallrye.config.SmallRyeConfigBuilder) ConfigPhase(io.quarkus.runtime.annotations.ConfigPhase) BiFunction(java.util.function.BiFunction) ProduceFlags(io.quarkus.builder.ProduceFlags) Overridable(io.quarkus.deployment.annotations.Overridable) BuildProducer(io.quarkus.deployment.annotations.BuildProducer) ConfigProviderResolver(org.eclipse.microprofile.config.spi.ConfigProviderResolver) ProduceFlag(io.quarkus.builder.ProduceFlag) ReflectUtil(io.quarkus.deployment.util.ReflectUtil) Method(java.lang.reflect.Method) BootstrapConfigSetupCompleteBuildItem(io.quarkus.deployment.builditem.BootstrapConfigSetupCompleteBuildItem) IdentityHashMap(java.util.IdentityHashMap) ReflectUtil.isOptionalOf(io.quarkus.deployment.util.ReflectUtil.isOptionalOf) ReflectUtil.rawTypeExtends(io.quarkus.deployment.util.ReflectUtil.rawTypeExtends) ExecutionTime(io.quarkus.deployment.annotations.ExecutionTime) Config(org.eclipse.microprofile.config.Config) DefaultValuesConfigurationSource(io.quarkus.deployment.configuration.DefaultValuesConfigurationSource) List(java.util.List) BuildContext(io.quarkus.builder.BuildContext) Type(java.lang.reflect.Type) Modifier(java.lang.reflect.Modifier) Optional(java.util.Optional) ConfigMappingUtils(io.quarkus.deployment.configuration.ConfigMappingUtils) ConfigUtils(io.quarkus.runtime.configuration.ConfigUtils) Logger(org.jboss.logging.Logger) LaunchMode(io.quarkus.runtime.LaunchMode) HashMap(java.util.HashMap) Function(java.util.function.Function) ReflectUtil.isConsumerOf(io.quarkus.deployment.util.ReflectUtil.isConsumerOf) Inject(javax.inject.Inject) ConfigurationBuildItem(io.quarkus.deployment.builditem.ConfigurationBuildItem) BuildStep(io.quarkus.deployment.annotations.BuildStep) ReflectUtil.isListOf(io.quarkus.deployment.util.ReflectUtil.isListOf) RuntimeValue(io.quarkus.runtime.RuntimeValue) RuntimeConfigSetupCompleteBuildItem(io.quarkus.deployment.builditem.RuntimeConfigSetupCompleteBuildItem) ObjectLoader(io.quarkus.deployment.recording.ObjectLoader) QuarkusConfigFactory(io.quarkus.runtime.configuration.QuarkusConfigFactory) BytecodeRecorderObjectLoaderBuildItem(io.quarkus.deployment.builditem.BytecodeRecorderObjectLoaderBuildItem) MethodDescriptor(io.quarkus.gizmo.MethodDescriptor) SmallRyeConfig(io.smallrye.config.SmallRyeConfig) BuildTimeConfigurationReader(io.quarkus.deployment.configuration.BuildTimeConfigurationReader) Produce(io.quarkus.deployment.annotations.Produce) Consumer(java.util.function.Consumer) MultiBuildItem(io.quarkus.builder.item.MultiBuildItem) NameIterator(io.smallrye.config.NameIterator) ReflectUtil.rawTypeOfParameter(io.quarkus.deployment.util.ReflectUtil.rawTypeOfParameter) ServiceUtil(io.quarkus.deployment.util.ServiceUtil) BytecodeRecorderImpl(io.quarkus.deployment.recording.BytecodeRecorderImpl) Collections(java.util.Collections) PropertiesConfigSource(io.smallrye.config.PropertiesConfigSource) ConfigRoot(io.quarkus.runtime.annotations.ConfigRoot) IdentityHashMap(java.util.IdentityHashMap) HashMap(java.util.HashMap) DefaultValuesConfigurationSource(io.quarkus.deployment.configuration.DefaultValuesConfigurationSource) IdentityHashMap(java.util.IdentityHashMap) ArrayList(java.util.ArrayList) BuildTimeConfigurationReader(io.quarkus.deployment.configuration.BuildTimeConfigurationReader) FieldDescriptor(io.quarkus.gizmo.FieldDescriptor) SmallRyeConfigBuilder(io.smallrye.config.SmallRyeConfigBuilder) NameIterator(io.smallrye.config.NameIterator) ResultHandle(io.quarkus.gizmo.ResultHandle) ConfigurationBuildItem(io.quarkus.deployment.builditem.ConfigurationBuildItem) KeyMap(io.smallrye.config.KeyMap) RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) ConfigClassWithPrefix(io.smallrye.config.ConfigMappings.ConfigClassWithPrefix) BytecodeCreator(io.quarkus.gizmo.BytecodeCreator) MethodDescriptor(io.quarkus.gizmo.MethodDescriptor) KeyMapBackedConfigSource(io.smallrye.config.KeyMapBackedConfigSource) SmallRyeConfig(io.smallrye.config.SmallRyeConfig) BuildChainBuilder(io.quarkus.builder.BuildChainBuilder) RunTimeConfigurationProxyBuildItem(io.quarkus.deployment.builditem.RunTimeConfigurationProxyBuildItem) ConfigProviderResolver(org.eclipse.microprofile.config.spi.ConfigProviderResolver) BytecodeRecorderObjectLoaderBuildItem(io.quarkus.deployment.builditem.BytecodeRecorderObjectLoaderBuildItem) ObjectLoader(io.quarkus.deployment.recording.ObjectLoader) Map(java.util.Map) KeyMap(io.smallrye.config.KeyMap) IdentityHashMap(java.util.IdentityHashMap) HashMap(java.util.HashMap)

Example 2 with RootDefinition

use of io.quarkus.deployment.configuration.definition.RootDefinition in project quarkus by quarkusio.

the class FieldContainer method getPropertyName.

StringBuilder getPropertyName(final StringBuilder sb) {
    Container parent = getParent();
    if (parent != null) {
        parent.getPropertyName(sb);
    }
    final ClassDefinition enclosing = member.getEnclosingDefinition();
    if (enclosing instanceof RootDefinition) {
        RootDefinition rootDefinition = (RootDefinition) enclosing;
        String rootName = rootDefinition.getRootName();
        if (!rootName.isEmpty()) {
            sb.append(rootName);
        }
    }
    final String propertyName = member.getPropertyName();
    if (!propertyName.isEmpty()) {
        if (sb.length() > 0) {
            sb.append('.');
        }
        sb.append(propertyName);
    }
    return sb;
}
Also used : RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) ClassDefinition(io.quarkus.deployment.configuration.definition.ClassDefinition)

Example 3 with RootDefinition

use of io.quarkus.deployment.configuration.definition.RootDefinition in project quarkus by quarkusio.

the class ConfigBuildStep method registerConfigRootsAsBeans.

@BuildStep
void registerConfigRootsAsBeans(ConfigurationBuildItem configItem, BuildProducer<SyntheticBeanBuildItem> syntheticBeans) {
    for (RootDefinition rootDefinition : configItem.getReadResult().getAllRoots()) {
        if (rootDefinition.getConfigPhase() == ConfigPhase.BUILD_AND_RUN_TIME_FIXED || rootDefinition.getConfigPhase() == ConfigPhase.RUN_TIME) {
            Class<?> configRootClass = rootDefinition.getConfigurationClass();
            syntheticBeans.produce(SyntheticBeanBuildItem.configure(configRootClass).types(configRootClass).scope(Dependent.class).creator(mc -> {
                // e.g. return Config.ApplicationConfig
                ResultHandle configRoot = mc.readStaticField(rootDefinition.getDescriptor());
                // BUILD_AND_RUN_TIME_FIXED roots are always set before the container is started (in the static initializer of the generated Config class)
                // However, RUN_TIME roots may be not be set when the bean instance is created
                mc.ifNull(configRoot).trueBranch().throwException(CreationException.class, String.format("Config root [%s] with config phase [%s] not initialized yet.", configRootClass.getName(), rootDefinition.getConfigPhase().name()));
                mc.returnValue(configRoot);
            }).done());
        }
    }
}
Also used : RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) ResultHandle(io.quarkus.gizmo.ResultHandle) Dependent(javax.enterprise.context.Dependent) BuildStep(io.quarkus.deployment.annotations.BuildStep)

Example 4 with RootDefinition

use of io.quarkus.deployment.configuration.definition.RootDefinition in project quarkus by quarkusio.

the class PatternMapBuilder method makePatterns.

public static ConfigPatternMap<Container> makePatterns(List<RootDefinition> rootDefinitions) {
    ConfigPatternMap<Container> patternMap = new ConfigPatternMap<>();
    for (RootDefinition rootDefinition : rootDefinitions) {
        ConfigPatternMap<Container> addTo = patternMap, child;
        NameIterator ni = new NameIterator(rootDefinition.getName());
        assert ni.hasNext();
        do {
            final String seg = ni.getNextSegment();
            child = addTo.getChild(seg);
            ni.next();
            if (child == null) {
                addTo.addChild(seg, child = new ConfigPatternMap<>());
            }
            addTo = child;
        } while (ni.hasNext());
        addGroup(addTo, rootDefinition, null);
    }
    return patternMap;
}
Also used : RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) NameIterator(io.quarkus.runtime.configuration.NameIterator)

Example 5 with RootDefinition

use of io.quarkus.deployment.configuration.definition.RootDefinition in project quarkus by quarkusio.

the class FieldContainer method getCombinedName.

StringBuilder getCombinedName(final StringBuilder sb) {
    Container parent = getParent();
    if (parent != null) {
        parent.getCombinedName(sb);
    }
    final ClassDefinition enclosing = member.getEnclosingDefinition();
    if (enclosing instanceof RootDefinition) {
        RootDefinition rootDefinition = (RootDefinition) enclosing;
        String rootName = rootDefinition.getRootName();
        if (!rootName.isEmpty()) {
            sb.append(rootName.replace('.', ':'));
        }
    }
    if (sb.length() > 0) {
        sb.append(':');
    }
    sb.append(member.getField().getDeclaringClass().getSimpleName()).append('#');
    sb.append(member.getName());
    return sb;
}
Also used : RootDefinition(io.quarkus.deployment.configuration.definition.RootDefinition) ClassDefinition(io.quarkus.deployment.configuration.definition.ClassDefinition)

Aggregations

RootDefinition (io.quarkus.deployment.configuration.definition.RootDefinition)5 BuildStep (io.quarkus.deployment.annotations.BuildStep)2 ClassDefinition (io.quarkus.deployment.configuration.definition.ClassDefinition)2 ResultHandle (io.quarkus.gizmo.ResultHandle)2 ApplicationModel (io.quarkus.bootstrap.model.ApplicationModel)1 BuildChainBuilder (io.quarkus.builder.BuildChainBuilder)1 BuildContext (io.quarkus.builder.BuildContext)1 BuildStepBuilder (io.quarkus.builder.BuildStepBuilder)1 ConsumeFlag (io.quarkus.builder.ConsumeFlag)1 ConsumeFlags (io.quarkus.builder.ConsumeFlags)1 ProduceFlag (io.quarkus.builder.ProduceFlag)1 ProduceFlags (io.quarkus.builder.ProduceFlags)1 BuildItem (io.quarkus.builder.item.BuildItem)1 MultiBuildItem (io.quarkus.builder.item.MultiBuildItem)1 SimpleBuildItem (io.quarkus.builder.item.SimpleBuildItem)1 BuildProducer (io.quarkus.deployment.annotations.BuildProducer)1 Consume (io.quarkus.deployment.annotations.Consume)1 ExecutionTime (io.quarkus.deployment.annotations.ExecutionTime)1 Overridable (io.quarkus.deployment.annotations.Overridable)1 Produce (io.quarkus.deployment.annotations.Produce)1