Include properties in source merge algorithm
This commit improves SimpleConfigurationMetadataRepository to include properties that are contributed to an existing configuration metadata source. See gh-25507
This commit is contained in:
committed by
Stephane Nicoll
parent
c62367e8c4
commit
cf4bc6e9e0
@@ -117,4 +117,17 @@ public class SimpleConfigurationMetadataRepository implements ConfigurationMetad
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Uncomment this code to fix issue revealed by ConfigurationMetadataRepositoryJsonBuilderTests#severalRepositoriesIdenticalGroups3()
|
||||
|
||||
private void putIfAbsent(Map<String, ConfigurationMetadataSource> sources, String name,
|
||||
ConfigurationMetadataSource source) {
|
||||
ConfigurationMetadataSource existing = sources.get(name);
|
||||
if (existing == null) {
|
||||
sources.put(name, source);
|
||||
} else {
|
||||
source.getProperties().forEach((k, v) -> putIfAbsent(existing.getProperties(), k, v));
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -113,6 +113,102 @@ class ConfigurationMetadataRepositoryJsonBuilderTests extends AbstractConfigurat
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* A rewrite of severalRepositoriesIdenticalGroups() using "containsOnlyKeys" to show actual vs. expected when assert fails.
|
||||
*/
|
||||
@Test
|
||||
void severalRepositoriesIdenticalGroups_rewritten() throws IOException {
|
||||
try (InputStream foo = getInputStreamFor("foo")) {
|
||||
try (InputStream foo2 = getInputStreamFor("foo2")) {
|
||||
ConfigurationMetadataRepository repo = ConfigurationMetadataRepositoryJsonBuilder.create(foo, foo2)
|
||||
.build();
|
||||
|
||||
// assert all properties are found
|
||||
assertThat(repo.getAllProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description",
|
||||
"spring.foo.counter",
|
||||
"spring.foo.enabled",
|
||||
"spring.foo.type");
|
||||
|
||||
// we have a single group containing all properties
|
||||
assertThat(repo.getAllGroups()).containsOnlyKeys("spring.foo");
|
||||
|
||||
ConfigurationMetadataGroup group = repo.getAllGroups().get("spring.foo");
|
||||
assertThat(group.getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description",
|
||||
"spring.foo.counter",
|
||||
"spring.foo.enabled",
|
||||
"spring.foo.type");
|
||||
|
||||
// the group contains 3 different sources
|
||||
assertThat(group.getSources()).containsOnlyKeys(
|
||||
"org.acme.Foo", "org.acme.Foo2", "org.springframework.boot.FooProperties");
|
||||
|
||||
assertThat(group.getSources().get("org.acme.Foo").getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description");
|
||||
|
||||
assertThat(group.getSources().get("org.acme.Foo2").getProperties()).containsOnlyKeys(
|
||||
"spring.foo.enabled",
|
||||
"spring.foo.type");
|
||||
|
||||
assertThat(group.getSources().get("org.springframework.boot.FooProperties").getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.counter");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* "foo3" contains the same properties as "foo2" except they refer to a group that already exists in
|
||||
* "foo1" (same NAME, same TYPE).
|
||||
*
|
||||
* This test shows that the union of properties collected from the sources is less than what the group actually
|
||||
* contains (some properties are missing).
|
||||
*/
|
||||
@Test
|
||||
void severalRepositoriesIdenticalGroups3() throws IOException {
|
||||
try (InputStream foo = getInputStreamFor("foo")) {
|
||||
try (InputStream foo3 = getInputStreamFor("foo3")) {
|
||||
ConfigurationMetadataRepository repo = ConfigurationMetadataRepositoryJsonBuilder.create(foo, foo3)
|
||||
.build();
|
||||
|
||||
assertThat(repo.getAllProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description",
|
||||
"spring.foo.counter",
|
||||
"spring.foo.enabled",
|
||||
"spring.foo.type");
|
||||
|
||||
assertThat(repo.getAllGroups()).containsOnlyKeys("spring.foo");
|
||||
|
||||
ConfigurationMetadataGroup group = repo.getAllGroups().get("spring.foo");
|
||||
assertThat(group.getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description",
|
||||
"spring.foo.counter",
|
||||
"spring.foo.enabled",
|
||||
"spring.foo.type");
|
||||
|
||||
|
||||
assertThat(group.getSources()).containsOnlyKeys("org.acme.Foo", "org.springframework.boot.FooProperties");
|
||||
assertThat(group.getSources().get("org.acme.Foo").getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.description",
|
||||
"spring.foo.enabled", // <-- missing although present in repo.getAllProperties()
|
||||
"spring.foo.type"); // <-- missing although present in repo.getAllProperties()
|
||||
|
||||
assertThat(group.getSources().get("org.springframework.boot.FooProperties").getProperties()).containsOnlyKeys(
|
||||
"spring.foo.name",
|
||||
"spring.foo.counter");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void emptyGroups() throws IOException {
|
||||
try (InputStream in = getInputStreamFor("empty-groups")) {
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"groups": [
|
||||
{
|
||||
"name": "spring.foo",
|
||||
"type": "org.acme.Foo",
|
||||
"sourceType": "org.acme.config.FooApp",
|
||||
"sourceMethod": "foo2()",
|
||||
"description": "This is Foo."
|
||||
}
|
||||
],
|
||||
"properties": [
|
||||
{
|
||||
"name": "spring.foo.enabled",
|
||||
"type": "java.lang.Boolean",
|
||||
"sourceType": "org.acme.Foo"
|
||||
},
|
||||
{
|
||||
"name": "spring.foo.type",
|
||||
"type": "java.lang.String",
|
||||
"sourceType": "org.acme.Foo"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user