Skip to content

Commit

Permalink
Register ConfigSources directly with the builder
Browse files Browse the repository at this point in the history
  • Loading branch information
radcortez committed Jul 8, 2021
1 parent 61f3f0d commit 6ad8efd
Show file tree
Hide file tree
Showing 39 changed files with 668 additions and 230 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.quarkus.deployment.builditem;

import io.quarkus.builder.item.MultiBuildItem;

/**
* Provides a way to register a ConfigSourceFactory in STATIC INIT.
*/
public final class StaticInitConfigSourceFactoryBuildItem extends MultiBuildItem {
private String factoryClassName;

public StaticInitConfigSourceFactoryBuildItem(final String factoryClassName) {
this.factoryClassName = factoryClassName;
}

public String getFactoryClassName() {
return factoryClassName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import io.quarkus.builder.item.MultiBuildItem;

public final class AdditionalStaticInitConfigSourceProviderBuildItem extends MultiBuildItem {
/**
* Provides a way to register a ConfigSourceProvider in STATIC INIT.
*/
public final class StaticInitConfigSourceProviderBuildItem extends MultiBuildItem {
private final String providerClassName;

public AdditionalStaticInitConfigSourceProviderBuildItem(String providerClassName) {
public StaticInitConfigSourceProviderBuildItem(String providerClassName) {
this.providerClassName = providerClassName;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,16 @@
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.configuration.AbstractRawDefaultConfigSource;
import io.quarkus.runtime.configuration.ConfigDiagnostic;
import io.quarkus.runtime.configuration.ConfigSourceFactoryProvider;
import io.quarkus.runtime.configuration.ConfigUtils;
import io.quarkus.runtime.configuration.ConfigurationException;
import io.quarkus.runtime.configuration.HyphenateEnumConverter;
import io.quarkus.runtime.configuration.NameIterator;
import io.quarkus.runtime.configuration.ProfileManager;
import io.quarkus.runtime.configuration.QuarkusConfigFactory;
import io.quarkus.runtime.configuration.RuntimeConfigSource;
import io.quarkus.runtime.configuration.RuntimeConfigSourceFactory;
import io.quarkus.runtime.configuration.RuntimeConfigSourceProvider;
import io.smallrye.config.Converters;
import io.smallrye.config.PropertiesConfigSource;
import io.smallrye.config.SmallRyeConfig;
Expand Down Expand Up @@ -165,6 +169,13 @@ public final class RunTimeConfigurationGenerator {
void.class, SmallRyeConfigBuilder.class, ConfigSourceProvider.class);
static final MethodDescriptor CU_ADD_SOURCE_PROVIDERS = MethodDescriptor.ofMethod(ConfigUtils.class, "addSourceProviders",
void.class, SmallRyeConfigBuilder.class, Collection.class);
static final MethodDescriptor CU_ADD_SOURCE_FACTORY_PROVIDER = MethodDescriptor.ofMethod(ConfigUtils.class,
"addSourceFactoryProvider",
void.class, SmallRyeConfigBuilder.class, ConfigSourceFactoryProvider.class);

static final MethodDescriptor RCS_NEW = MethodDescriptor.ofConstructor(RuntimeConfigSource.class, String.class);
static final MethodDescriptor RCSP_NEW = MethodDescriptor.ofConstructor(RuntimeConfigSourceProvider.class, String.class);
static final MethodDescriptor RCSF_NEW = MethodDescriptor.ofConstructor(RuntimeConfigSourceFactory.class, String.class);

static final MethodDescriptor AL_NEW = MethodDescriptor.ofConstructor(ArrayList.class);
static final MethodDescriptor AL_ADD = MethodDescriptor.ofMethod(ArrayList.class, "add", boolean.class, Object.class);
Expand Down Expand Up @@ -251,28 +262,7 @@ public final class RunTimeConfigurationGenerator {
private RunTimeConfigurationGenerator() {
}

public static void generate(
final BuildTimeConfigurationReader.ReadResult readResult,
final ClassOutput classOutput,
LaunchMode launchMode,
final Map<String, String> runTimeDefaults,
final List<Class<?>> additionalTypes,
final List<String> additionalStaticInitConfigSourceProviders,
final List<String> additionalBootstrapConfigSourceProviders) {

new GenerateOperation.Builder()
.setBuildTimeReadResult(readResult)
.setClassOutput(classOutput)
.setLaunchMode(launchMode)
.setRunTimeDefaults(runTimeDefaults)
.setAdditionalTypes(additionalTypes)
.setAdditionalStaticInitConfigSourceProviders(additionalStaticInitConfigSourceProviders)
.setAdditionalBootstrapConfigSourceProviders(additionalBootstrapConfigSourceProviders)
.build()
.run();
}

static final class GenerateOperation implements AutoCloseable {
public static final class GenerateOperation implements AutoCloseable {
final boolean devMode;
final LaunchMode launchMode;
final AccessorFinder accessorFinder;
Expand All @@ -299,8 +289,13 @@ static final class GenerateOperation implements AutoCloseable {
final ResultHandle clinitConfig;
final Map<FieldDescriptor, Class<?>> convertersToRegister = new HashMap<>();
final List<Class<?>> additionalTypes;
final List<String> additionalStaticInitConfigSourceProviders;
final List<String> additionalBootstrapConfigSourceProviders;
final Set<String> staticConfigSources;
final Set<String> staticConfigSourceProviders;
final Set<String> staticConfigSourceFactories;
final Set<String> runtimeConfigSources;
final Set<String> runtimeConfigSourceProviders;
final Set<String> runtimeConfigSourceFactories;
/**
* Regular converters organized by type. Each converter is stored in a separate field. Some are used
* only at build time, some only at run time, and some at both times.
Expand Down Expand Up @@ -331,8 +326,13 @@ static final class GenerateOperation implements AutoCloseable {
roots = Assert.checkNotNullParam("builder.roots", builder.getBuildTimeReadResult().getAllRoots());
runTimeDefaults = Assert.checkNotNullParam("runTimeDefaults", builder.getRunTimeDefaults());
additionalTypes = Assert.checkNotNullParam("additionalTypes", builder.getAdditionalTypes());
additionalStaticInitConfigSourceProviders = builder.getAdditionalStaticInitConfigSourceProviders();
additionalBootstrapConfigSourceProviders = builder.getAdditionalBootstrapConfigSourceProviders();
staticConfigSources = builder.getStaticConfigSources();
staticConfigSourceProviders = builder.getStaticConfigSourceProviders();
staticConfigSourceFactories = builder.getStaticConfigSourceFactories();
runtimeConfigSources = builder.getRuntimeConfigSources();
runtimeConfigSourceProviders = builder.getRuntimeConfigSourceProviders();
runtimeConfigSourceFactories = builder.getRuntimeConfigSourceFactories();
cc = ClassCreator.builder().classOutput(classOutput).className(CONFIG_CLASS_NAME).setFinal(true).build();
generateEmptyParsers(cc);
// not instantiable
Expand Down Expand Up @@ -406,11 +406,22 @@ static final class GenerateOperation implements AutoCloseable {
// build time defaults
clinit.writeArrayValue(array, 1, buildTimeRunTimeDefaultValuesConfigSource);
clinit.invokeVirtualMethod(SRCB_WITH_SOURCES, buildTimeBuilder, array);
// add static init sources
for (String providerClass : additionalStaticInitConfigSourceProviders) {
ResultHandle providerInstance = clinit.newInstance(MethodDescriptor.ofConstructor(providerClass));
clinit.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, buildTimeBuilder, providerInstance);
// add safe static sources
for (String runtimeConfigSource : staticConfigSources) {
clinit.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, buildTimeBuilder,
clinit.newInstance(RCS_NEW, clinit.load(runtimeConfigSource)));
}
// add safe static source providers
for (String runtimeConfigSourceProvider : staticConfigSourceProviders) {
clinit.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, buildTimeBuilder,
clinit.newInstance(RCSP_NEW, clinit.load(runtimeConfigSourceProvider)));
}
// add safe static source factories
for (String discoveredConfigSourceFactory : staticConfigSourceFactories) {
clinit.invokeStaticMethod(CU_ADD_SOURCE_FACTORY_PROVIDER, buildTimeBuilder,
clinit.newInstance(RCSF_NEW, clinit.load(discoveredConfigSourceFactory)));
}

clinitConfig = clinit.checkCast(clinit.invokeVirtualMethod(SRCB_BUILD, buildTimeBuilder),
SmallRyeConfig.class);

Expand Down Expand Up @@ -516,7 +527,9 @@ public void run() {
}

// create the run time config
final ResultHandle runTimeBuilder = readConfig.invokeStaticMethod(CU_CONFIG_BUILDER, readConfig.load(true),
final ResultHandle runTimeBuilder = readConfig.invokeStaticMethod(
CU_CONFIG_BUILDER_WITH_ADD_DISCOVERED_AND_BOOTSRAP, readConfig.load(true), readConfig.load(false),
readConfig.load(false),
readConfig.load(launchMode));

// add in our run time only config source provider
Expand Down Expand Up @@ -633,6 +646,24 @@ public void run() {
// (which were generated by the bootstrap config phase - an empty list is passed when there is no bootstrap phase)
readConfig.invokeStaticMethod(CU_ADD_SOURCE_PROVIDERS, runTimeBuilder, readConfig.getMethodParam(0));

// add discovered sources
for (String runtimeConfigSource : runtimeConfigSources) {
readConfig.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, runTimeBuilder,
readConfig.newInstance(RCS_NEW, readConfig.load(runtimeConfigSource)));
}

// add discovered source providers
for (String runtimeConfigSourceProvider : runtimeConfigSourceProviders) {
readConfig.invokeStaticMethod(CU_ADD_SOURCE_PROVIDER, runTimeBuilder,
readConfig.newInstance(RCSP_NEW, readConfig.load(runtimeConfigSourceProvider)));
}

// add discovered source factories
for (String discoveredConfigSourceFactory : runtimeConfigSourceFactories) {
readConfig.invokeStaticMethod(CU_ADD_SOURCE_FACTORY_PROVIDER, runTimeBuilder,
readConfig.newInstance(RCSF_NEW, readConfig.load(discoveredConfigSourceFactory)));
}

ResultHandle bootstrapConfig = null;
if (bootstrapConfigSetupNeeded()) {
bootstrapConfig = readBootstrapConfig.invokeVirtualMethod(SRCB_BUILD, bootstrapBuilder);
Expand Down Expand Up @@ -1633,23 +1664,33 @@ public void close() {
cc.close();
}

static final class Builder {
public static Builder builder() {
return new Builder();
}

public static final class Builder {
private LaunchMode launchMode;
private ClassOutput classOutput;
private BuildTimeConfigurationReader.ReadResult buildTimeReadResult;
private Map<String, String> runTimeDefaults;
private List<Class<?>> additionalTypes;
private List<String> additionalStaticInitConfigSourceProviders;
private List<String> additionalBootstrapConfigSourceProviders;

private Set<String> staticConfigSources;
private Set<String> staticConfigSourceProviders;
private Set<String> staticConfigSourceFactories;
private Set<String> runtimeConfigSources;
private Set<String> runtimeConfigSourceProviders;
private Set<String> runtimeConfigSourceFactories;

Builder() {
}

ClassOutput getClassOutput() {
return classOutput;
}

Builder setClassOutput(final ClassOutput classOutput) {
public Builder setClassOutput(final ClassOutput classOutput) {
this.classOutput = classOutput;
return this;
}
Expand All @@ -1658,7 +1699,7 @@ BuildTimeConfigurationReader.ReadResult getBuildTimeReadResult() {
return buildTimeReadResult;
}

Builder setBuildTimeReadResult(final BuildTimeConfigurationReader.ReadResult buildTimeReadResult) {
public Builder setBuildTimeReadResult(final BuildTimeConfigurationReader.ReadResult buildTimeReadResult) {
this.buildTimeReadResult = buildTimeReadResult;
return this;
}
Expand All @@ -1667,7 +1708,7 @@ Map<String, String> getRunTimeDefaults() {
return runTimeDefaults;
}

Builder setRunTimeDefaults(final Map<String, String> runTimeDefaults) {
public Builder setRunTimeDefaults(final Map<String, String> runTimeDefaults) {
this.runTimeDefaults = runTimeDefaults;
return this;
}
Expand All @@ -1676,7 +1717,7 @@ List<Class<?>> getAdditionalTypes() {
return additionalTypes;
}

Builder setAdditionalTypes(final List<Class<?>> additionalTypes) {
public Builder setAdditionalTypes(final List<Class<?>> additionalTypes) {
this.additionalTypes = additionalTypes;
return this;
}
Expand All @@ -1690,25 +1731,70 @@ public Builder setLaunchMode(LaunchMode launchMode) {
return this;
}

List<String> getAdditionalStaticInitConfigSourceProviders() {
return additionalStaticInitConfigSourceProviders;
List<String> getAdditionalBootstrapConfigSourceProviders() {
return additionalBootstrapConfigSourceProviders;
}

Builder setAdditionalStaticInitConfigSourceProviders(List<String> additionalStaticInitConfigSourceProviders) {
this.additionalStaticInitConfigSourceProviders = additionalStaticInitConfigSourceProviders;
public Builder setAdditionalBootstrapConfigSourceProviders(List<String> additionalBootstrapConfigSourceProviders) {
this.additionalBootstrapConfigSourceProviders = additionalBootstrapConfigSourceProviders;
return this;
}

List<String> getAdditionalBootstrapConfigSourceProviders() {
return additionalBootstrapConfigSourceProviders;
Set<String> getStaticConfigSources() {
return staticConfigSources;
}

Builder setAdditionalBootstrapConfigSourceProviders(List<String> additionalBootstrapConfigSourceProviders) {
this.additionalBootstrapConfigSourceProviders = additionalBootstrapConfigSourceProviders;
public Builder setStaticConfigSources(final Set<String> staticConfigSources) {
this.staticConfigSources = staticConfigSources;
return this;
}

Set<String> getStaticConfigSourceProviders() {
return staticConfigSourceProviders;
}

public Builder setStaticConfigSourceProviders(final Set<String> staticConfigSourceProviders) {
this.staticConfigSourceProviders = staticConfigSourceProviders;
return this;
}

Set<String> getStaticConfigSourceFactories() {
return staticConfigSourceFactories;
}

public Builder setStaticConfigSourceFactories(final Set<String> staticConfigSourceFactories) {
this.staticConfigSourceFactories = staticConfigSourceFactories;
return this;
}

Set<String> getRuntimeConfigSources() {
return runtimeConfigSources;
}

public Builder setRuntimeConfigSources(final Set<String> runtimeConfigSources) {
this.runtimeConfigSources = runtimeConfigSources;
return this;
}

Set<String> getRuntimeConfigSourceProviders() {
return runtimeConfigSourceProviders;
}

public Builder setRuntimeConfigSourceProviders(final Set<String> runtimeConfigSourceProviders) {
this.runtimeConfigSourceProviders = runtimeConfigSourceProviders;
return this;
}

Set<String> getRuntimeConfigSourceFactories() {
return runtimeConfigSourceFactories;
}

public Builder setRuntimeConfigSourceFactories(final Set<String> runtimeConfigSourceFactories) {
this.runtimeConfigSourceFactories = runtimeConfigSourceFactories;
return this;
}

GenerateOperation build() {
public GenerateOperation build() {
return new GenerateOperation(this);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.util.List;
import java.util.OptionalInt;
import java.util.Set;
import java.util.stream.Collectors;

import org.eclipse.microprofile.config.spi.ConfigProviderResolver;
import org.eclipse.microprofile.config.spi.ConfigSource;
Expand All @@ -27,7 +26,6 @@
import io.quarkus.gizmo.MethodDescriptor;
import io.quarkus.gizmo.ResultHandle;
import io.quarkus.runtime.graal.InetRunTime;
import io.smallrye.config.ConfigSourceFactory;
import io.smallrye.config.ConfigSourceInterceptor;
import io.smallrye.config.ConfigSourceInterceptorFactory;
import io.smallrye.config.ConfigValidator;
Expand Down Expand Up @@ -82,22 +80,15 @@ void nativeServiceProviders(
providerProducer.produce(new ServiceProviderBuildItem(ConfigProviderResolver.class.getName(),
SmallRyeConfigProviderResolver.class.getName()));
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
classLoader.getResources(SERVICES_PREFIX + ConfigSourceProvider.class.getName());
for (Class<?> serviceClass : Arrays.asList(
ConfigSource.class,
ConfigSourceProvider.class,
Converter.class,
ConfigSourceInterceptor.class,
ConfigSourceInterceptorFactory.class,
ConfigSourceFactory.class,
ConfigValidator.class)) {
final String serviceName = serviceClass.getName();
final Set<String> names = ServiceUtil.classNamesNamedIn(classLoader, SERVICES_PREFIX + serviceName);
final List<String> list = names.stream()
// todo: see https://github.com/quarkusio/quarkus/issues/5492
.filter(s -> !s.startsWith("org.jboss.resteasy.microprofile.config.")).collect(Collectors.toList());
if (!list.isEmpty()) {
providerProducer.produce(new ServiceProviderBuildItem(serviceName, list));
if (!names.isEmpty()) {
providerProducer.produce(new ServiceProviderBuildItem(serviceName, names));
}
}
}
Expand Down
Loading

0 comments on commit 6ad8efd

Please sign in to comment.