diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/ChangelogWriter.java b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/ChangelogWriter.java index 32db7488bdb..802f59769b0 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/ChangelogWriter.java +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/ChangelogWriter.java @@ -68,6 +68,8 @@ class ChangelogWriter implements AutoCloseable { String newVersionNumber = changelog.newVersionNumber(); Map> differencesByType = collateByType(changelog); write("Configuration property changes between `%s` and `%s`%n", oldVersionNumber, newVersionNumber); + write("%n%n%n== Default Changed in %s%n%n", newVersionNumber); + writeDefaultChanged(differencesByType.get(DifferenceType.DEFAULT_CHANGED)); write("%n%n%n== Deprecated in %s%n%n", newVersionNumber); writeDeprecated(differencesByType.get(DifferenceType.DEPRECATED)); write("%n%n%n== Added in %s%n%n", newVersionNumber); @@ -98,6 +100,17 @@ class ChangelogWriter implements AutoCloseable { writeDeprecatedPropertyRow(difference.newProperty()); } + private void writeDefaultChanged(List differences) { + List rows = sortProperties(differences, Difference::newProperty); + writeTable("| Key | Old Default | New Default", rows, this::writeDefaultChanged); + } + + private void writeDefaultChanged(Difference difference) { + writeCell(monospace(difference.newProperty().getId())); + writeCell(monospace(asString(difference.oldProperty().getDefaultValue()))); + writeCell(monospace(asString(difference.newProperty().getDefaultValue()))); + } + private void writeAdded(List differences) { List rows = sortProperties(differences, Difference::newProperty); writeTable("| Key | Default value | Description", rows, this::writeAdded); diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/Difference.java b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/Difference.java index 2f8f5e3e45d..35a1867c89b 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/Difference.java +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/Difference.java @@ -16,6 +16,8 @@ package org.springframework.boot.configurationmetadata.changelog; +import java.util.Objects; + import org.springframework.boot.configurationmetadata.ConfigurationMetadataProperty; import org.springframework.boot.configurationmetadata.Deprecation.Level; @@ -49,6 +51,9 @@ record Difference(DifferenceType type, ConfigurationMetadataProperty oldProperty && newProperty.isDeprecated() && newProperty.getDeprecation().getLevel() == Level.ERROR) { return new Difference(DifferenceType.DELETED, oldProperty, newProperty); } + if (!Objects.equals(oldProperty.getDefaultValue(), newProperty.getDefaultValue())) { + return new Difference(DifferenceType.DEFAULT_CHANGED, oldProperty, newProperty); + } return null; } diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/DifferenceType.java b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/DifferenceType.java index d8bbe93560b..46246c99296 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/DifferenceType.java +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/main/java/org/springframework/boot/configurationmetadata/changelog/DifferenceType.java @@ -37,6 +37,12 @@ enum DifferenceType { /** * The entry has been deleted. */ - DELETED + DELETED, + + /** + * The entry's default value has changed. The entry exists in both the previous and + * current versions, but its default value is different. + */ + DEFAULT_CHANGED } diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/java/org/springframework/boot/configurationmetadata/changelog/ChangelogTests.java b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/java/org/springframework/boot/configurationmetadata/changelog/ChangelogTests.java index 100f5a99f27..487d78ccdfd 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/java/org/springframework/boot/configurationmetadata/changelog/ChangelogTests.java +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/java/org/springframework/boot/configurationmetadata/changelog/ChangelogTests.java @@ -39,7 +39,7 @@ class ChangelogTests { assertThat(differences).isNotNull(); assertThat(differences.oldVersionNumber()).isEqualTo("1.0"); assertThat(differences.newVersionNumber()).isEqualTo("2.0"); - assertThat(differences.differences()).hasSize(7); + assertThat(differences.differences()).hasSize(9); List added = differences.differences() .stream() .filter((difference) -> difference.type() == DifferenceType.ADDED) @@ -65,12 +65,20 @@ class ChangelogTests { assertThat(deprecated).hasSize(1); assertProperty(deprecated.get(0).oldProperty(), "test.deprecate", String.class, "wrong"); assertProperty(deprecated.get(0).newProperty(), "test.deprecate", String.class, "wrong"); + List defaultChanged = differences.differences() + .stream() + .filter((difference) -> difference.type() == DifferenceType.DEFAULT_CHANGED) + .toList(); + assertThat(defaultChanged).hasSize(2) + .anySatisfy((entry) -> assertProperty(entry.newProperty(), "test.default.array.change", String[].class, + new String[] { "b", "a" })) + .anySatisfy((entry) -> assertProperty(entry.newProperty(), "test.default.change", String.class, "new")); } private void assertProperty(ConfigurationMetadataProperty property, String id, Class type, Object defaultValue) { assertThat(property).isNotNull(); assertThat(property.getId()).isEqualTo(id); - assertThat(property.getType()).isEqualTo(type.getName()); + assertThat(property.getType()).isEqualTo(type.getCanonicalName()); assertThat(property.getDefaultValue()).isEqualTo(defaultValue); } diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-1.0.json b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-1.0.json index 6f6ab846845..e28ce4affd6 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-1.0.json +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-1.0.json @@ -6,6 +6,18 @@ "description": "Test equality.", "defaultValue": "test" }, + { + "name": "test.default.change", + "type": "java.lang.String", + "description": "Test default value change.", + "defaultValue": "old" + }, + { + "name": "test.default.array.change", + "type": "java.lang.String[]", + "description": "Test default array value change.", + "defaultValue": ["a", "b"] + }, { "name": "test.replace", "type": "java.lang.String", diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-2.0.json b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-2.0.json index e650460140d..48923d76ec4 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-2.0.json +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample-2.0.json @@ -6,6 +6,18 @@ "description": "Test add.", "defaultValue": "new" }, + { + "name": "test.default.change", + "type": "java.lang.String", + "description": "Test default value change.", + "defaultValue": "new" + }, + { + "name": "test.default.array.change", + "type": "java.lang.String[]", + "description": "Test default array value change.", + "defaultValue": ["b", "a"] + }, { "name": "test.replace", "type": "java.lang.String", diff --git a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample.adoc b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample.adoc index 908f48e73c5..7a0f17b8ada 100644 --- a/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample.adoc +++ b/configuration-metadata/spring-boot-configuration-metadata-changelog-generator/src/test/resources/sample.adoc @@ -2,6 +2,22 @@ Configuration property changes between `1.0` and `2.0` +== Default Changed in 2.0 + +|====================== +| Key | Old Default | New Default + +| `test.default.array.change` +| `a, b` +| `b, a` + +| `test.default.change` +| `old` +| `new` +|====================== + + + == Deprecated in 2.0 |======================