Allow anonymous config roots

Enables #5980
This commit is contained in:
David M. Lloyd
2019-12-06 08:35:49 -06:00
committed by Guillaume Smet
parent 7c1e1bde59
commit 1b05cb6fd3
8 changed files with 57 additions and 21 deletions

View File

@@ -267,7 +267,9 @@ public final class BuildTimeConfigurationReader {
}
objectsByRootClass.put(clazz, instance);
String rootName = root.getRootName();
nameBuilder.append('.').append(rootName);
if (!rootName.isEmpty()) {
nameBuilder.append('.').append(rootName);
}
readConfigGroup(root, instance, nameBuilder);
nameBuilder.setLength(len);
}

View File

@@ -287,7 +287,7 @@ public final class RunTimeConfigurationGenerator {
clinit.setModifiers(Opcodes.ACC_STATIC);
clinit.invokeStaticMethod(PM_SET_RUNTIME_DEFAULT_PROFILE, clinit.load(ProfileManager.getActiveProfile()));
clinitNameBuilder = clinit.newInstance(SB_NEW);
clinit.invokeVirtualMethod(SB_APPEND_STRING, clinitNameBuilder, clinit.load("quarkus."));
clinit.invokeVirtualMethod(SB_APPEND_STRING, clinitNameBuilder, clinit.load("quarkus"));
// create the map for build time config source
final ResultHandle buildTimeValues = clinit.newInstance(HM_NEW);
@@ -329,7 +329,7 @@ public final class RunTimeConfigurationGenerator {
readConfig = cc.getMethodCreator(C_READ_CONFIG);
// the readConfig name builder
readConfigNameBuilder = readConfig.newInstance(SB_NEW);
readConfig.invokeVirtualMethod(SB_APPEND_STRING, readConfigNameBuilder, readConfig.load("quarkus."));
readConfig.invokeVirtualMethod(SB_APPEND_STRING, readConfigNameBuilder, readConfig.load("quarkus"));
runTimePatternMap = buildTimeReadResult.getRunTimePatternMap();
accessorFinder = new AccessorFinder();
}
@@ -466,6 +466,7 @@ public final class RunTimeConfigurationGenerator {
.getConstructorFor(MethodDescriptor.ofConstructor(configurationClass));
// specific actions based on config phase
String rootName = root.getRootName();
if (root.getConfigPhase() == ConfigPhase.BUILD_AND_RUN_TIME_FIXED) {
// config root field is final; we initialize it from clinit
cc.getFieldCreator(rootFieldDescriptor)
@@ -476,7 +477,10 @@ public final class RunTimeConfigurationGenerator {
clinit.writeStaticField(rootFieldDescriptor, instance);
instanceCache.put(rootFieldDescriptor, instance);
// eager init as appropriate
clinit.invokeVirtualMethod(SB_APPEND_STRING, clinitNameBuilder, clinit.load(root.getRootName()));
if (!rootName.isEmpty()) {
clinit.invokeVirtualMethod(SB_APPEND_CHAR, clinitNameBuilder, clinit.load('.'));
clinit.invokeVirtualMethod(SB_APPEND_STRING, clinitNameBuilder, clinit.load(rootName));
}
clinit.invokeStaticMethod(initGroup, clinitConfig, clinitNameBuilder, instance);
clinit.invokeVirtualMethod(SB_SET_LENGTH, clinitNameBuilder, clInitOldLen);
} else if (root.getConfigPhase() == ConfigPhase.RUN_TIME) {
@@ -487,8 +491,11 @@ public final class RunTimeConfigurationGenerator {
final ResultHandle instance = readConfig.invokeStaticMethod(ctor);
// assign instance to field
readConfig.writeStaticField(rootFieldDescriptor, instance);
readConfig.invokeVirtualMethod(SB_APPEND_STRING, readConfigNameBuilder,
readConfig.load(root.getRootName()));
if (!rootName.isEmpty()) {
readConfig.invokeVirtualMethod(SB_APPEND_CHAR, readConfigNameBuilder, readConfig.load('.'));
readConfig.invokeVirtualMethod(SB_APPEND_STRING, readConfigNameBuilder,
readConfig.load(rootName));
}
readConfig.invokeStaticMethod(initGroup, runTimeConfig, readConfigNameBuilder, instance);
readConfig.invokeVirtualMethod(SB_SET_LENGTH, readConfigNameBuilder, rcOldLen);
} else {

View File

@@ -52,7 +52,7 @@ public final class RootDefinition extends ClassDefinition {
"Config");
}
if (rootName.equals(ConfigItem.PARENT)) {
throw reportError(configClass, "Root cannot inherit parent name because it has no parent");
rootName = "";
} else if (rootName.equals(ConfigItem.ELEMENT_NAME)) {
rootName = String.join("", (Iterable<String>) () -> lowerCaseFirst(trimmedSegments.iterator()));
} else if (rootName.equals(ConfigItem.HYPHENATED_ELEMENT_NAME)) {

View File

@@ -32,7 +32,11 @@ public final class FieldContainer extends Container {
}
final ClassDefinition enclosing = member.getEnclosingDefinition();
if (enclosing instanceof RootDefinition) {
sb.append(((RootDefinition) enclosing).getRootName().replace('.', ':'));
RootDefinition rootDefinition = (RootDefinition) enclosing;
String rootName = rootDefinition.getRootName();
if (!rootName.isEmpty()) {
sb.append(rootName.replace('.', ':'));
}
}
if (sb.length() > 0) {
sb.append(':');
@@ -48,7 +52,11 @@ public final class FieldContainer extends Container {
}
final ClassDefinition enclosing = member.getEnclosingDefinition();
if (enclosing instanceof RootDefinition) {
sb.append(((RootDefinition) enclosing).getRootName());
RootDefinition rootDefinition = (RootDefinition) enclosing;
String rootName = rootDefinition.getRootName();
if (!rootName.isEmpty()) {
sb.append(rootName);
}
}
final String propertyName = member.getPropertyName();
if (!propertyName.isEmpty()) {

View File

@@ -19,18 +19,19 @@ public final class PatternMapBuilder {
for (RootDefinition rootDefinition : rootDefinitions) {
final String rootName = rootDefinition.getRootName();
ConfigPatternMap<Container> addTo = patternMap, child;
assert !rootName.isEmpty();
NameIterator ni = new NameIterator(rootName);
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());
if (!rootName.isEmpty()) {
NameIterator ni = new NameIterator(rootName);
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;

View File

@@ -110,3 +110,6 @@ quarkus.btrt.map-of-numbers.key1=one
quarkus.btrt.map-of-numbers.key2=two
quarkus.btrt.my-enum=optional
quarkus.btrt.my-enums=optional,enum-one,enum-two
### anonymous root property
quarkus.test-property=foo

View File

@@ -0,0 +1,12 @@
package io.quarkus.extest.runtime.config;
import io.quarkus.runtime.annotations.ConfigItem;
import io.quarkus.runtime.annotations.ConfigRoot;
/**
*
*/
@ConfigRoot(name = ConfigItem.PARENT)
public class TopLevelRootConfig {
String testProperty;
}

View File

@@ -101,3 +101,6 @@ quarkus.btrt.map-of-numbers.key1=one
quarkus.btrt.map-of-numbers.key2=two
quarkus.btrt.my-enum=optional
quarkus.btrt.my-enums=optional,enum-one,enum-two
### anonymous root property
quarkus.test-property=foo