Skip to content

Commit

Permalink
Move initial configuration setup out of build steps
Browse files Browse the repository at this point in the history
Also fix handling of quarkus.application.*

Fixes quarkusio#3008, groundwork for quarkusio#3233
  • Loading branch information
dmlloyd committed Jul 19, 2019
1 parent bf97558 commit 8e67742
Show file tree
Hide file tree
Showing 14 changed files with 198 additions and 305 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
import io.quarkus.creator.outcome.OutcomeProviderRegistration;
import io.quarkus.creator.phase.curate.CurateOutcome;
import io.quarkus.deployment.ApplicationArchive;
import io.quarkus.deployment.ApplicationInfoUtil;
import io.quarkus.deployment.ClassOutput;
import io.quarkus.deployment.QuarkusAugmentor;
import io.quarkus.deployment.QuarkusClassWriter;
Expand All @@ -72,7 +71,6 @@
public class AugmentPhase implements AppCreationPhase<AugmentPhase>, AugmentOutcome {

private static final Logger log = Logger.getLogger(AugmentPhase.class);
private static final String APPLICATION_INFO_PROPERTIES = "application-info.properties";
private static final String META_INF = "META-INF";

private Path outputDir;
Expand Down Expand Up @@ -219,11 +217,8 @@ public void provideOutcome(AppCreator ctx) throws AppCreatorException {
IoUtils.recursiveDelete(metaInf.resolve("maven"));
IoUtils.recursiveDelete(metaInf.resolve("INDEX.LIST"));
IoUtils.recursiveDelete(metaInf.resolve("MANIFEST.MF"));
IoUtils.recursiveDelete(metaInf.resolve(APPLICATION_INFO_PROPERTIES));
}

ApplicationInfoUtil.writeApplicationInfoProperties(appState.getAppArtifact(), appClassesDir);

//lets default to appClassesDir for now
if (configDir == null)
configDir = appClassesDir;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,20 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

import org.jboss.logging.Logger;
import org.wildfly.common.function.Functions;

import io.quarkus.builder.BuildChainBuilder;
Expand All @@ -56,14 +61,26 @@
import io.quarkus.deployment.builditem.MainBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.RunTimeConfigurationBuildItem;
import io.quarkus.deployment.builditem.StaticBytecodeRecorderBuildItem;
import io.quarkus.deployment.builditem.UnmatchedConfigBuildItem;
import io.quarkus.deployment.configuration.ConfigDefinition;
import io.quarkus.deployment.configuration.DefaultValuesConfigurationSource;
import io.quarkus.deployment.recording.BytecodeRecorderImpl;
import io.quarkus.deployment.recording.RecorderContext;
import io.quarkus.deployment.util.ReflectUtil;
import io.quarkus.deployment.util.ServiceUtil;
import io.quarkus.gizmo.FieldDescriptor;
import io.quarkus.runtime.annotations.ConfigPhase;
import io.quarkus.runtime.annotations.ConfigRoot;
import io.quarkus.runtime.annotations.Recorder;
import io.quarkus.runtime.annotations.Template;
import io.quarkus.runtime.configuration.ApplicationPropertiesConfigSource;
import io.quarkus.runtime.configuration.ConverterSupport;
import io.quarkus.runtime.configuration.DeploymentProfileConfigSource;
import io.quarkus.runtime.configuration.ExpandingConfigSource;
import io.smallrye.config.PropertiesConfigSource;
import io.smallrye.config.SmallRyeConfig;
import io.smallrye.config.SmallRyeConfigBuilder;
import io.smallrye.config.SmallRyeConfigProviderResolver;

/**
* Utility class to load build steps, runtime recorders, and configuration roots from a given extension class.
Expand All @@ -72,6 +89,20 @@ public final class ExtensionLoader {
private ExtensionLoader() {
}

private static final Logger cfgLog = Logger.getLogger("io.quarkus.configuration");

public static final String BUILD_TIME_CONFIG = "io.quarkus.runtime.generated.BuildTimeConfig";
public static final String BUILD_TIME_CONFIG_ROOT = "io.quarkus.runtime.generated.BuildTimeConfigRoot";
public static final String RUN_TIME_CONFIG = "io.quarkus.runtime.generated.RunTimeConfig";
public static final String RUN_TIME_CONFIG_ROOT = "io.quarkus.runtime.generated.RunTimeConfigRoot";

private static final FieldDescriptor RUN_TIME_CONFIG_FIELD = FieldDescriptor.of(RUN_TIME_CONFIG, "runConfig",
RUN_TIME_CONFIG_ROOT);
private static final FieldDescriptor BUILD_TIME_CONFIG_FIELD = FieldDescriptor.of(BUILD_TIME_CONFIG, "buildConfig",
BUILD_TIME_CONFIG_ROOT);

private static final String CONFIG_ROOTS_LIST = "META-INF/quarkus-config-roots.list";

private static boolean isRecorder(AnnotatedElement element) {
return element.isAnnotationPresent(Recorder.class) || element.isAnnotationPresent(Template.class);
}
Expand All @@ -86,7 +117,107 @@ private static boolean isRecorder(AnnotatedElement element) {
*/
public static Consumer<BuildChainBuilder> loadStepsFrom(ClassLoader classLoader)
throws IOException, ClassNotFoundException {
return loadStepsFrom(classLoader, new Properties());
}

/**
* Load all the build steps from the given class loader.
*
* @param classLoader the class loader
* @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, Map<String, String> buildSystemProps)
throws IOException, ClassNotFoundException {
final Properties props = new Properties();
props.putAll(buildSystemProps);
return loadStepsFrom(classLoader, props);
}

/**
* Load all the build steps from the given class loader.
*
* @param classLoader the class loader
* @param buildSystemProps the build system properties to use
* @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)
throws IOException, ClassNotFoundException {

// set up the configuration definitions
final ConfigDefinition buildTimeConfig = new ConfigDefinition(FieldDescriptor.of("Bogus", "No field", "Nothing"));
final ConfigDefinition buildTimeRunTimeConfig = new ConfigDefinition(BUILD_TIME_CONFIG_FIELD);
final ConfigDefinition runTimeConfig = new ConfigDefinition(RUN_TIME_CONFIG_FIELD, true);

// populate it with all known types
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 {
final ConfigPhase phase = annotation.phase();
if (phase == ConfigPhase.RUN_TIME) {
runTimeConfig.registerConfigRoot(clazz);
} else if (phase == ConfigPhase.BUILD_AND_RUN_TIME_FIXED) {
buildTimeRunTimeConfig.registerConfigRoot(clazz);
} else if (phase == ConfigPhase.BUILD_TIME) {
buildTimeConfig.registerConfigRoot(clazz);
} else {
cfgLog.warnf("Unrecognized configuration phase \"%s\" on %s", phase, clazz);
}
}
}

// now prepare & load the build configuration
final SmallRyeConfigBuilder builder = new SmallRyeConfigBuilder();

// expand properties
final ExpandingConfigSource.Cache cache = new ExpandingConfigSource.Cache();
builder.withWrapper(ExpandingConfigSource.wrapper(cache));
builder.withWrapper(DeploymentProfileConfigSource.wrapper());
builder.addDefaultSources();
final ApplicationPropertiesConfigSource.InJar inJar = new ApplicationPropertiesConfigSource.InJar();
final DefaultValuesConfigurationSource defaultSource = new DefaultValuesConfigurationSource(
buildTimeConfig.getLeafPatterns());
final PropertiesConfigSource pcs = new PropertiesConfigSource(buildSystemProps, "Build system");

builder.withSources(inJar, defaultSource, pcs);

// populate builder with all converters loaded from ServiceLoader
ConverterSupport.populateConverters(builder);

final SmallRyeConfig src = (SmallRyeConfig) builder
.addDefaultSources()
.addDiscoveredSources()
.addDiscoveredConverters()
.build();

SmallRyeConfigProviderResolver.instance().registerConfig(src, classLoader);

Set<String> unmatched = new HashSet<>();

ConfigDefinition.loadConfiguration(cache, src,
unmatched,
buildTimeConfig,
buildTimeRunTimeConfig, // this one is only for generating a default-values config source
runTimeConfig);

unmatched.removeIf(s -> !inJar.getPropertyNames().contains(s) && !s.startsWith("quarkus."));

Consumer<BuildChainBuilder> result = Functions.discardingConsumer();
result = result.andThen(bcb -> bcb.addBuildStep(bc -> {
bc.produce(new BuildTimeConfigurationBuildItem(buildTimeConfig));
bc.produce(new BuildTimeRunTimeFixedConfigurationBuildItem(buildTimeRunTimeConfig));
bc.produce(new RunTimeConfigurationBuildItem(runTimeConfig));
bc.produce(new UnmatchedConfigBuildItem(Collections.unmodifiableSet(unmatched)));
}).produces(BuildTimeConfigurationBuildItem.class)
.produces(BuildTimeRunTimeFixedConfigurationBuildItem.class)
.produces(RunTimeConfigurationBuildItem.class)
.produces(UnmatchedConfigBuildItem.class)
.build());
for (Class<?> clazz : ServiceUtil.classesNamedIn(classLoader, "META-INF/quarkus-build-steps.list")) {
result = result.andThen(ExtensionLoader.loadStepsFrom(clazz));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import io.quarkus.builder.item.BuildItem;
import io.quarkus.deployment.builditem.AdditionalApplicationArchiveBuildItem;
import io.quarkus.deployment.builditem.ArchiveRootBuildItem;
import io.quarkus.deployment.builditem.BuildTimeConfigurationSourceBuildItem;
import io.quarkus.deployment.builditem.ClassOutputBuildItem;
import io.quarkus.deployment.builditem.ExtensionClassLoaderBuildItem;
import io.quarkus.deployment.builditem.GeneratedClassBuildItem;
Expand All @@ -31,7 +30,6 @@
import io.quarkus.deployment.builditem.LiveReloadBuildItem;
import io.quarkus.deployment.builditem.ShutdownContextBuildItem;
import io.quarkus.runtime.LaunchMode;
import io.smallrye.config.PropertiesConfigSource;

public class QuarkusAugmentor {

Expand Down Expand Up @@ -71,7 +69,11 @@ public BuildResult run() throws Exception {

final BuildChainBuilder chainBuilder = BuildChain.builder();

ExtensionLoader.loadStepsFrom(classLoader).accept(chainBuilder);
if (buildSystemProperties != null) {
ExtensionLoader.loadStepsFrom(classLoader, buildSystemProperties).accept(chainBuilder);
} else {
ExtensionLoader.loadStepsFrom(classLoader).accept(chainBuilder);
}
chainBuilder.loadProviders(classLoader);

chainBuilder
Expand All @@ -89,10 +91,6 @@ public BuildResult run() throws Exception {
chainBuilder.addFinal(GeneratedClassBuildItem.class)
.addFinal(GeneratedResourceBuildItem.class);

if (buildSystemProperties != null) {
chainBuilder.addInitial(BuildTimeConfigurationSourceBuildItem.class);
}

for (Consumer<BuildChainBuilder> i : buildChainCustomizers) {
i.accept(chainBuilder);
}
Expand All @@ -113,11 +111,6 @@ public BuildResult run() throws Exception {
for (Path i : additionalApplicationArchives) {
execBuilder.produce(new AdditionalApplicationArchiveBuildItem(i));
}
if (buildSystemProperties != null) {
execBuilder.produce(
new BuildTimeConfigurationSourceBuildItem(
new PropertiesConfigSource(buildSystemProperties, "Build system")));
}
BuildResult buildResult = execBuilder
.execute();

Expand Down

This file was deleted.

This file was deleted.

Loading

0 comments on commit 8e67742

Please sign in to comment.