diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java
index 3e8c8d77371..8a0ab6a7a31 100644
--- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java
+++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java
@@ -58,7 +58,8 @@ public abstract class CheckAdditionalSpringConfigurationMetadata extends SourceT
void check() throws IOException {
ConfigurationPropertiesAnalyzer analyzer = new ConfigurationPropertiesAnalyzer(getSource().getFiles());
Report report = new Report(this.projectDir);
- analyzer.analyzeSort(report);
+ analyzer.analyzeOrder(report);
+ analyzer.analyzeDuplicates(report);
analyzer.analyzeDeprecationSince(report);
File reportFile = getReportLocation().get().getAsFile();
report.write(reportFile);
diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckManualSpringConfigurationMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckManualSpringConfigurationMetadata.java
index 0f61062c3a1..93b32b3baf0 100644
--- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckManualSpringConfigurationMetadata.java
+++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckManualSpringConfigurationMetadata.java
@@ -64,7 +64,8 @@ public abstract class CheckManualSpringConfigurationMetadata extends DefaultTask
ConfigurationPropertiesAnalyzer analyzer = new ConfigurationPropertiesAnalyzer(
List.of(getMetadataLocation().get()));
Report report = new Report(this.projectDir);
- analyzer.analyzeSort(report);
+ analyzer.analyzeOrder(report);
+ analyzer.analyzeDuplicates(report);
analyzer.analyzePropertyDescription(report, getExclusions().get());
analyzer.analyzeDeprecationSince(report);
File reportFile = getReportLocation().get().getAsFile();
diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesAnalyzer.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesAnalyzer.java
index 4e8ffbbf134..8b444060b1a 100644
--- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesAnalyzer.java
+++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/ConfigurationPropertiesAnalyzer.java
@@ -25,9 +25,11 @@ import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.function.Consumer;
import tools.jackson.core.StreamReadFeature;
@@ -40,15 +42,18 @@ import org.springframework.util.function.SingletonSupplier;
/**
* Check configuration metadata for inconsistencies. The available checks are:
*
- * - Metadata element should be sorted alphabetically: {@link #analyzeSort(Report)}
- * - Property must have a description:
- * {@link #analyzePropertyDescription(Report, List)}
+ * - Metadata elements {@link #analyzeOrder(Report) must be sorted alphabetically}
+ * - Metadata elements {@link #analyzeDuplicates(Report) must not be duplicates}
+ * - Properties {@link #analyzePropertyDescription(Report, List) must have a
+ * description}
*
*
* @author Stephane Nicoll
*/
class ConfigurationPropertiesAnalyzer {
+ private static final List ELEMENT_TYPES = List.of("groups", "properties", "hints");
+
private final Collection sources;
private final SingletonSupplier jsonMapperSupplier;
@@ -62,23 +67,23 @@ class ConfigurationPropertiesAnalyzer {
.of(() -> JsonMapper.builder().enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION).build());
}
- void analyzeSort(Report report) {
+ void analyzeOrder(Report report) {
for (File source : this.sources) {
- report.registerAnalysis(source, analyzeSort(source));
+ report.registerAnalysis(source, analyzeOrder(source));
}
}
- private Analysis analyzeSort(File source) {
+ private Analysis analyzeOrder(File source) {
Map json = readJsonContent(source);
Analysis analysis = new Analysis("Metadata element order:");
- analyzeMetadataElementsSort("groups", json, analysis);
- analyzeMetadataElementsSort("properties", json, analysis);
- analyzeMetadataElementsSort("hints", json, analysis);
+ for (String elementType : ELEMENT_TYPES) {
+ analyzeMetadataElementOrder(elementType, json, analysis);
+ }
return analysis;
}
@SuppressWarnings("unchecked")
- private void analyzeMetadataElementsSort(String key, Map json, Analysis analysis) {
+ private void analyzeMetadataElementOrder(String key, Map json, Analysis analysis) {
List