Fix ordering of metadata entries
This commit provides a consistent ordering for groups that share the same configuration property prefix. See gh-26230
This commit is contained in:
parent
20da9826cc
commit
3e34b0a60a
|
@ -160,26 +160,18 @@ class JsonConverter {
|
||||||
|
|
||||||
private static class ItemMetadataComparator implements Comparator<ItemMetadata> {
|
private static class ItemMetadataComparator implements Comparator<ItemMetadata> {
|
||||||
|
|
||||||
|
private final Comparator<ItemMetadata> itemComparator = Comparator.comparing(this::isDeprecated)
|
||||||
|
.thenComparing(ItemMetadata::getName).thenComparing(ItemMetadata::getSourceType);
|
||||||
|
|
||||||
|
private final Comparator<ItemMetadata> groupComparator = Comparator.comparing(ItemMetadata::getName)
|
||||||
|
.thenComparing(ItemMetadata::getSourceType);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(ItemMetadata o1, ItemMetadata o2) {
|
public int compare(ItemMetadata o1, ItemMetadata o2) {
|
||||||
if (o1.isOfItemType(ItemType.GROUP)) {
|
if (o1.isOfItemType(ItemType.GROUP)) {
|
||||||
return compareGroup(o1, o2);
|
return this.groupComparator.compare(o1, o2);
|
||||||
}
|
}
|
||||||
return compareProperty(o1, o2);
|
return this.itemComparator.compare(o1, o2);
|
||||||
}
|
|
||||||
|
|
||||||
private int compareGroup(ItemMetadata o1, ItemMetadata o2) {
|
|
||||||
return o1.getName().compareTo(o2.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
private int compareProperty(ItemMetadata o1, ItemMetadata o2) {
|
|
||||||
if (isDeprecated(o1) && !isDeprecated(o2)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (isDeprecated(o2) && !isDeprecated(o1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return o1.getName().compareTo(o2.getName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isDeprecated(ItemMetadata item) {
|
private boolean isDeprecated(ItemMetadata item) {
|
||||||
|
|
|
@ -82,7 +82,7 @@ class JsonMarshallerTests {
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
JsonMarshaller marshaller = new JsonMarshaller();
|
JsonMarshaller marshaller = new JsonMarshaller();
|
||||||
marshaller.write(metadata, outputStream);
|
marshaller.write(metadata, outputStream);
|
||||||
String json = new String(outputStream.toByteArray());
|
String json = outputStream.toString();
|
||||||
assertThat(json).containsSubsequence("\"groups\"", "\"com.acme.alpha\"", "\"com.acme.bravo\"", "\"properties\"",
|
assertThat(json).containsSubsequence("\"groups\"", "\"com.acme.alpha\"", "\"com.acme.bravo\"", "\"properties\"",
|
||||||
"\"com.example.alpha.ccc\"", "\"com.example.alpha.ddd\"", "\"com.example.bravo.aaa\"",
|
"\"com.example.alpha.ccc\"", "\"com.example.alpha.ddd\"", "\"com.example.bravo.aaa\"",
|
||||||
"\"com.example.bravo.bbb\"", "\"hints\"", "\"eee\"", "\"fff\"");
|
"\"com.example.bravo.bbb\"", "\"hints\"", "\"eee\"", "\"fff\"");
|
||||||
|
@ -100,9 +100,43 @@ class JsonMarshallerTests {
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
JsonMarshaller marshaller = new JsonMarshaller();
|
JsonMarshaller marshaller = new JsonMarshaller();
|
||||||
marshaller.write(metadata, outputStream);
|
marshaller.write(metadata, outputStream);
|
||||||
String json = new String(outputStream.toByteArray());
|
String json = outputStream.toString();
|
||||||
assertThat(json).containsSubsequence("\"properties\"", "\"com.example.alpha.ddd\"", "\"com.example.bravo.bbb\"",
|
assertThat(json).containsSubsequence("\"properties\"", "\"com.example.alpha.ddd\"", "\"com.example.bravo.bbb\"",
|
||||||
"\"com.example.alpha.ccc\"", "\"com.example.bravo.aaa\"");
|
"\"com.example.alpha.ccc\"", "\"com.example.bravo.aaa\"");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void orderingForSameGroupNames() throws IOException {
|
||||||
|
ConfigurationMetadata metadata = new ConfigurationMetadata();
|
||||||
|
metadata.add(ItemMetadata.newGroup("com.acme.alpha", null, "com.example.Foo", null));
|
||||||
|
metadata.add(ItemMetadata.newGroup("com.acme.alpha", null, "com.example.Bar", null));
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
JsonMarshaller marshaller = new JsonMarshaller();
|
||||||
|
marshaller.write(metadata, outputStream);
|
||||||
|
String json = outputStream.toString();
|
||||||
|
assertThat(json).containsSubsequence("\"groups\"", "\"name\": \"com.acme.alpha\"",
|
||||||
|
"\"sourceType\": \"com.example.Bar\"", "\"name\": \"com.acme.alpha\"",
|
||||||
|
"\"sourceType\": \"com.example.Foo\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void orderingForSamePropertyNames() throws IOException {
|
||||||
|
ConfigurationMetadata metadata = new ConfigurationMetadata();
|
||||||
|
metadata.add(ItemMetadata.newProperty("com.example.bravo", "aaa", "java.lang.Boolean", "com.example.Foo", null,
|
||||||
|
null, null, null));
|
||||||
|
metadata.add(ItemMetadata.newProperty("com.example.bravo", "aaa", "java.lang.Integer", "com.example.Bar", null,
|
||||||
|
null, null, null));
|
||||||
|
metadata.add(
|
||||||
|
ItemMetadata.newProperty("com.example.alpha", "ddd", null, "com.example.Bar", null, null, null, null));
|
||||||
|
metadata.add(
|
||||||
|
ItemMetadata.newProperty("com.example.alpha", "ccc", null, "com.example.Foo", null, null, null, null));
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
JsonMarshaller marshaller = new JsonMarshaller();
|
||||||
|
marshaller.write(metadata, outputStream);
|
||||||
|
String json = outputStream.toString();
|
||||||
|
assertThat(json).containsSubsequence("\"groups\"", "\"properties\"", "\"com.example.alpha.ccc\"",
|
||||||
|
"com.example.Foo", "\"com.example.alpha.ddd\"", "com.example.Bar", "\"com.example.bravo.aaa\"",
|
||||||
|
"com.example.Bar", "\"com.example.bravo.aaa\"", "com.example.Foo");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue