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..e0af2670236 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 Value Changed in %s%n%n", newVersionNumber); + writeDefaultValueChanged(differencesByType.get(DifferenceType.DEFAULT_VALUE_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 writeDefaultValueChanged(List differences) { + List rows = sortProperties(differences, Difference::newProperty); + writeTable("| Key | Old Default | New Default", rows, this::writeDefaultValueChanged); + } + + private void writeDefaultValueChanged(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..a3af8e1f1ff 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_VALUE_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..aa81fe45b52 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,11 @@ enum DifferenceType { /** * The entry has been deleted. */ - DELETED + DELETED, + + /** + * The entry's default value has been changed. + */ + DEFAULT_VALUE_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..7854ab076f8 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,6 +65,13 @@ 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 defaultValueChanged = differences.differences() + .stream() + .filter((difference) -> difference.type() == DifferenceType.DEFAULT_VALUE_CHANGED) + .toList(); + assertThat(defaultValueChanged).hasSize(2) + .anySatisfy((entry) -> assertProperty(entry.newProperty(), "test.default.change", String.class, "new")) + .anySatisfy((entry) -> assertThat(entry.newProperty().getId()).isEqualTo("test.array.change")); } private void assertProperty(ConfigurationMetadataProperty property, String id, Class type, Object 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..37ace809760 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,12 @@ "description": "Test equality.", "defaultValue": "test" }, + { + "name": "test.default.change", + "type": "java.lang.String", + "description": "Test default value change.", + "defaultValue": "old" + }, { "name": "test.replace", "type": "java.lang.String", @@ -41,6 +47,12 @@ "deprecation": { "level": "error" } + }, + { + "name": "test.array.change", + "type": "java.lang.String[]", + "description": "Test array default value change.", + "defaultValue": ["a", "b"] } ] -} \ No newline at end of file +} 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..73bd835b026 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,12 @@ "description": "Test add.", "defaultValue": "new" }, + { + "name": "test.default.change", + "type": "java.lang.String", + "description": "Test default value change.", + "defaultValue": "new" + }, { "name": "test.replace", "type": "java.lang.String", @@ -60,6 +66,12 @@ "replacement": "test.new.property", "reason": "removed in third-party library without deprecation" } + }, + { + "name": "test.array.change", + "type": "java.lang.String[]", + "description": "Test array default value change.", + "defaultValue": ["a", "b", "c"] } ] } 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..147f7d976e1 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 Value Changed in 2.0 + +|====================== +| Key | Old Default | New Default + +| `test.array.change` +| `a, b` +| `a, b, c` + +| `test.default.change` +| `old` +| `new` +|====================== + + + == Deprecated in 2.0 |======================