From 2d163165c8d24e6c0a14e0cd657e6bc1341aab91 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Wed, 6 May 2026 23:25:55 -0500 Subject: [PATCH 1/9] added new arch rule for configuration properties Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+GollapudiSrikanth@users.noreply.github.com> --- .../build/architecture/ArchitectureRules.java | 34 ++++++++++++++- .../architecture/ArchitectureCheckTests.java | 29 +++++++++++++ .../ConfigurationPropertiesWithHashMap.java | 42 +++++++++++++++++++ .../ConfigurationPropertiesWithHashSet.java | 42 +++++++++++++++++++ ...figurationPropertiesWithLinkedHashMap.java | 42 +++++++++++++++++++ ...figurationPropertiesWithLinkedHashSet.java | 42 +++++++++++++++++++ 6 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashmap/ConfigurationPropertiesWithHashMap.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashset/ConfigurationPropertiesWithHashSet.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashmap/ConfigurationPropertiesWithLinkedHashMap.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashset/ConfigurationPropertiesWithLinkedHashSet.java diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java index bfb0460d68a..dc16d468471 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java @@ -77,6 +77,7 @@ * @author Ngoc Nhan * @author Moritz Halbritter * @author Stefano Cordio + * @author Venkata Naga Sai Srikanth Gollapudi */ final class ArchitectureRules { @@ -126,7 +127,8 @@ static List conditionalOnMissingBean(String annotationClass) { static List configurationProperties(String annotationClass) { return List.of(classLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), - methodLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass)); + methodLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), + configurationPropertiesShouldNotUseHashMapOrHashSet(annotationClass)); } static List configurationPropertiesBinding(String annotationClass) { @@ -428,6 +430,36 @@ private static ArchRule allDeprecatedConfigurationPropertiesShouldIncludeSince(S .allowEmptyShould(true); } + private static ArchRule configurationPropertiesShouldNotUseHashMapOrHashSet(String annotationClass) { + DescribedPredicate> hashMapOrHashSetConstructor = hasJavaCallTarget( + new DescribedPredicate("is a HashMap or HashSet constructor") { + @Override + public boolean test(CodeUnitCallTarget target) { + String ownerName = target.getOwner().getName(); + return ("java.util.HashMap".equals(ownerName) || "java.util.HashSet".equals(ownerName)) + && "".equals(target.getName()); + } + }); + return ArchRuleDefinition.noClasses() + .that() + .areAnnotatedWith(annotationClass) + .or(areNestedInConfigurationPropertiesClasses(annotationClass)) + .should() + .callConstructorWhere(hashMapOrHashSetConstructor) + .because("@ConfigurationProperties classes should use LinkedHashMap/LinkedHashSet " + + "instead of HashMap/HashSet to preserve insertion order consistent with the Binder") + + .allowEmptyShould(true); + } + + private static DescribedPredicate areNestedInConfigurationPropertiesClasses(String annotationClass) { + return DescribedPredicate.describe("are nested in @ConfigurationProperties", + (javaClass) -> javaClass.getEnclosingClass() + .map((enclosing) -> enclosing.isAnnotatedWith(annotationClass) + || areNestedInConfigurationPropertiesClasses(annotationClass).test(enclosing)) + .orElse(false)); + } + private static ArchRule autoConfigurationClassesShouldBePublicAndFinal() { return ArchRuleDefinition.classes() .that(areRegularAutoConfiguration()) diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java index 0686e00a60f..643d42ccdb0 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java @@ -62,6 +62,7 @@ * @author Ivan Malutin * @author Dmytro Nosan * @author Stefano Cordio + * @author Venkata Naga Sai Srikanth Gollapudi */ class ArchitectureCheckTests { @@ -331,6 +332,34 @@ void whenMethodLevelConfigurationPropertiesContainsOnlyValueShouldSucceedAndWrit Task.CHECK_ARCHITECTURE_MAIN); } + @Test + void whenConfigurationPropertiesUsesHashMapShouldFailAndWriteReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/hashmap", "annotations"); + buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN, "should use LinkedHashMap/LinkedHashSet instead of HashMap/HashSet"); + } + + @Test + void whenConfigurationPropertiesUsesHashSetShouldFailAndWriteReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/hashset", "annotations"); + buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN, "should use LinkedHashMap/LinkedHashSet instead of HashMap/HashSet"); + } + + @Test + void whenConfigurationPropertiesUsesLinkedHashMapShouldSucceedAndWriteEmptyReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedhashmap", "annotations"); + build(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN); + } + + @Test + void whenConfigurationPropertiesUsesLinkedHashSetShouldSucceedAndWriteEmptyReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedhashset", "annotations"); + build(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN); + } + @Test void whenConfigurationPropertiesBindingBeanMethodIsNotStaticShouldFailAndWriteReport() throws IOException { prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/bindingnonstatic", "annotations"); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashmap/ConfigurationPropertiesWithHashMap.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashmap/ConfigurationPropertiesWithHashMap.java new file mode 100644 index 00000000000..1668ccc84af --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashmap/ConfigurationPropertiesWithHashMap.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.hashmap; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link HashMap}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithHashMap { + + private Map properties = new HashMap<>(); + + public Map getProperties() { + return this.properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashset/ConfigurationPropertiesWithHashSet.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashset/ConfigurationPropertiesWithHashSet.java new file mode 100644 index 00000000000..f8bfc8497d9 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/hashset/ConfigurationPropertiesWithHashSet.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.hashset; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link HashSet}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithHashSet { + + private Set items = new HashSet<>(); + + public Set getItems() { + return this.items; + } + + public void setItems(Set items) { + this.items = items; + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashmap/ConfigurationPropertiesWithLinkedHashMap.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashmap/ConfigurationPropertiesWithLinkedHashMap.java new file mode 100644 index 00000000000..b8a8ed38a98 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashmap/ConfigurationPropertiesWithLinkedHashMap.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.linkedhashmap; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link LinkedHashMap}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithLinkedHashMap { + + private Map properties = new LinkedHashMap<>(); + + public Map getProperties() { + return this.properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashset/ConfigurationPropertiesWithLinkedHashSet.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashset/ConfigurationPropertiesWithLinkedHashSet.java new file mode 100644 index 00000000000..d75c7db3f79 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedhashset/ConfigurationPropertiesWithLinkedHashSet.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.linkedhashset; + +import java.util.LinkedHashSet; +import java.util.Set; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link LinkedHashSet}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithLinkedHashSet { + + private Set items = new LinkedHashSet<>(); + + public Set getItems() { + return this.items; + } + + public void setItems(Set items) { + this.items = items; + } + +} From b880f128c10733386e99b140630090165ddab7b0 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Thu, 7 May 2026 14:58:48 -0500 Subject: [PATCH 2/9] updated HashMap/HashSet with LinkedHashMap/LinkedHashSet with the new Arch rule Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+GollapudiSrikanth@users.noreply.github.com> --- .../MyMapsProperties.java | 4 ++-- .../MyMapsProperties.kt | 2 +- ...ionPropertiesReportEndpointProperties.java | 5 +++-- .../env/EnvironmentEndpointProperties.java | 5 +++-- .../exchanges/HttpExchangesProperties.java | 5 +++-- .../boot/actuate/sbom/SbomProperties.java | 6 +++--- .../autoconfigure/ArtemisProperties.java | 5 +++-- .../autoconfigure/FlywayProperties.java | 7 ++++--- .../autoconfigure/FreeMarkerProperties.java | 4 ++-- .../health/GrpcServerHealthProperties.java | 4 ++-- .../autoconfigure/HibernateProperties.java | 5 +++-- .../autoconfigure/JerseyProperties.java | 5 +++-- .../boot/jpa/autoconfigure/JpaProperties.java | 5 +++-- .../kafka/autoconfigure/KafkaProperties.java | 19 ++++++++++--------- .../ldap/autoconfigure/LdapProperties.java | 5 +++-- .../mail/autoconfigure/MailProperties.java | 5 +++-- .../export/humio/HumioProperties.java | 5 +++-- .../prometheus/PrometheusProperties.java | 7 ++++--- .../otlp/OtlpTracingProperties.java | 5 +++-- .../OpenTelemetryProperties.java | 5 +++-- .../logging/otlp/OtlpLoggingProperties.java | 5 +++-- .../QuartzEndpointProperties.java | 5 +++-- .../autoconfigure/QuartzProperties.java | 5 +++-- .../OAuth2AuthorizationServerProperties.java | 17 +++++++++-------- .../autoconfigure/OAuth2ClientProperties.java | 7 ++++--- .../autoconfigure/SessionProperties.java | 4 ++-- .../autoconfigure/ServerProperties.java | 5 +++-- .../autoconfigure/WebServicesProperties.java | 5 +++-- 28 files changed, 94 insertions(+), 72 deletions(-) diff --git a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.java b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.java index 71b7cb4c1b9..441f57b726c 100644 --- a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.java +++ b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.docs.features.externalconfig.typesafeconfigurationproperties.relaxedbinding.mapsfromenvironmentvariables; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -24,7 +24,7 @@ @ConfigurationProperties("my.props") public class MyMapsProperties { - private final Map values = new HashMap<>(); + private final Map values = new LinkedHashMap<>(); public Map getValues() { return this.values; diff --git a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.kt b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.kt index a41a55efbbb..a91490e3a7c 100644 --- a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.kt +++ b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/externalconfig/typesafeconfigurationproperties/relaxedbinding/mapsfromenvironmentvariables/MyMapsProperties.kt @@ -21,7 +21,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties @ConfigurationProperties("my.props") class MyMapsProperties { - val values: Map = HashMap() + val values: Map = LinkedHashMap() } diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java index 8bc6c645f7f..1a39fe2ff07 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.context.properties; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint; @@ -28,6 +28,7 @@ * * @author Stephane Nicoll * @author Madhura Bhave + * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.endpoint.configprops") @@ -42,7 +43,7 @@ public class ConfigurationPropertiesReportEndpointProperties { * Roles used to determine whether a user is authorized to be shown unsanitized * values. When empty, all authenticated users are authorized. */ - private final Set roles = new HashSet<>(); + private final Set roles = new LinkedHashSet<>(); public Show getShowValues() { return this.showValues; diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java index 301276abb59..bce1a59f8e8 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.env; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.springframework.boot.actuate.endpoint.Show; @@ -27,6 +27,7 @@ * Configuration properties for {@link EnvironmentEndpoint}. * * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.endpoint.env") @@ -41,7 +42,7 @@ public class EnvironmentEndpointProperties { * Roles used to determine whether a user is authorized to be shown unsanitized * values. When empty, all authenticated users are authorized. */ - private final Set roles = new HashSet<>(); + private final Set roles = new LinkedHashSet<>(); public Show getShowValues() { return this.showValues; diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java index 70883127d22..883eae4bdd0 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.web.exchanges; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.springframework.boot.actuate.web.exchanges.Include; @@ -30,6 +30,7 @@ * @author Venil Noronha * @author Madhura Bhave * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.httpexchanges") @@ -53,7 +54,7 @@ public static class Recording { * (excluding Authorization and Cookie), response headers (excluding Set-Cookie), * and time taken. */ - private Set include = new HashSet<>(Include.defaultIncludes()); + private Set include = new LinkedHashSet<>(Include.defaultIncludes()); public Set getInclude() { return this.include; diff --git a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java index 94d6424eed9..56fb24c6d64 100644 --- a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java +++ b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.actuate.sbom; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -26,8 +26,8 @@ /** * Configuration properties for the SBOM endpoint. - * * @author Moritz Halbritter + * @author Venkata Naga Sai Srikanth Gollapudi * @since 3.3.0 */ @ConfigurationProperties("management.endpoint.sbom") @@ -41,7 +41,7 @@ public class SbomProperties { /** * Additional SBOMs. */ - private Map additional = new HashMap<>(); + private Map additional = new LinkedHashMap<>(); public Sbom getApplication() { return this.application; diff --git a/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java b/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java index 94c681c3a0a..dcb3df3eae4 100644 --- a/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java +++ b/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.artemis.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -34,6 +34,7 @@ * @author Eddú Meléndez * @author Stephane Nicoll * @author Justin Bertram + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.artemis") @@ -216,7 +217,7 @@ public boolean isDefaultClusterPassword() { * @see TransportConstants#SERVER_ID_PROP_NAME */ public Map generateTransportParameters() { - Map parameters = new HashMap<>(); + Map parameters = new LinkedHashMap<>(); parameters.put(TransportConstants.SERVER_ID_PROP_NAME, getServerId()); return parameters; } diff --git a/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java b/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java index 9af24f3261a..57a1d4e4942 100644 --- a/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java +++ b/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java @@ -23,7 +23,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -39,6 +39,7 @@ * @author Eddú Meléndez * @author Stephane Nicoll * @author Chris Bono + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.flyway") @@ -137,7 +138,7 @@ public class FlywayProperties { /** * Placeholders and their replacements to apply to sql migration scripts. */ - private Map placeholders = new HashMap<>(); + private Map placeholders = new LinkedHashMap<>(); /** * Prefix of placeholders in migration scripts. @@ -310,7 +311,7 @@ public class FlywayProperties { /** * Properties to pass to the JDBC driver. */ - private Map jdbcProperties = new HashMap<>(); + private Map jdbcProperties = new LinkedHashMap<>(); /** * Path of the Kerberos config file. Requires Flyway Teams. diff --git a/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java b/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java index 89afd1946e8..27216836075 100644 --- a/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java +++ b/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java @@ -18,7 +18,6 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -35,6 +34,7 @@ * * @author Dave Syer * @author Andy Wilkinson + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.freemarker") @@ -123,7 +123,7 @@ public class FreeMarkerProperties { /** * Well-known FreeMarker keys which are passed to FreeMarker's Configuration. */ - private Map settings = new HashMap<>(); + private Map settings = new LinkedHashMap<>(); /** * List of template paths. diff --git a/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java b/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java index 2912cad3669..d7e4ffc717a 100644 --- a/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java +++ b/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java @@ -19,7 +19,6 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -38,6 +37,7 @@ * * @author Phillip Webb * @author Chris Bono + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.1.0 */ @ConfigurationProperties("spring.grpc.server.health") @@ -177,7 +177,7 @@ public static class Status { * Mapping of health statuses to gRPC service status. By default, registered * health statuses map to sensible defaults (for example, UP maps to SERVING). */ - private final Map mapping = new HashMap<>(); + private final Map mapping = new LinkedHashMap<>(); public List getOrder() { return this.order; diff --git a/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java b/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java index ae00735c58c..95dd7b93e89 100644 --- a/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java +++ b/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.hibernate.autoconfigure; import java.util.Collection; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Supplier; @@ -40,6 +40,7 @@ * * @author Stephane Nicoll * @author Chris Bono + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 * @see JpaProperties */ @@ -85,7 +86,7 @@ public Map determineHibernateProperties(Map jpaP } private Map getAdditionalProperties(Map existing, HibernateSettings settings) { - Map result = new HashMap<>(existing); + Map result = new LinkedHashMap<>(existing); applyScanner(result); getNaming().applyNamingStrategies(result); String ddlAuto = determineDdlAuto(existing, settings::getDdlAuto); diff --git a/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java b/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java index 2a858ad353a..4c68f974f25 100644 --- a/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java +++ b/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.jersey.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -29,6 +29,7 @@ * @author Dave Syer * @author Eddú Meléndez * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.jersey") @@ -42,7 +43,7 @@ public class JerseyProperties { /** * Init parameters to pass to Jersey through the servlet or filter. */ - private Map init = new HashMap<>(); + private Map init = new LinkedHashMap<>(); private final Filter filter = new Filter(); diff --git a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java index 5bcbc156318..f07153a8d09 100644 --- a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java +++ b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.jpa.autoconfigure; import java.util.ArrayList; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -34,6 +34,7 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Madhura Bhave + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.jpa") @@ -42,7 +43,7 @@ public class JpaProperties { /** * Additional native properties to set on the JPA provider. */ - private Map properties = new HashMap<>(); + private Map properties = new LinkedHashMap<>(); /** * Mapping resources (equivalent to "mapping-file" entries in persistence.xml). diff --git a/module/spring-boot-kafka/src/main/java/org/springframework/boot/kafka/autoconfigure/KafkaProperties.java b/module/spring-boot-kafka/src/main/java/org/springframework/boot/kafka/autoconfigure/KafkaProperties.java index 172ffd70780..70d4bc6bef3 100644 --- a/module/spring-boot-kafka/src/main/java/org/springframework/boot/kafka/autoconfigure/KafkaProperties.java +++ b/module/spring-boot-kafka/src/main/java/org/springframework/boot/kafka/autoconfigure/KafkaProperties.java @@ -21,7 +21,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -59,6 +59,7 @@ * @author Andy Wilkinson * @author Scott Frederick * @author Yanming Zhou + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.kafka") @@ -79,7 +80,7 @@ public class KafkaProperties { * Additional properties, common to producers and consumers, used to configure the * client. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); private final Consumer consumer = new Consumer(); @@ -162,7 +163,7 @@ public Retry getRetry() { } private Map buildCommonProperties() { - Map properties = new HashMap<>(); + Map properties = new LinkedHashMap<>(); if (this.bootstrapServers != null) { properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, this.bootstrapServers); } @@ -318,7 +319,7 @@ public static class Consumer { /** * Additional consumer-specific properties used to configure the client. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); public Ssl getSsl() { return this.ssl; @@ -540,7 +541,7 @@ public static class Producer { /** * Additional producer-specific properties used to configure the client. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); public Ssl getSsl() { return this.ssl; @@ -667,7 +668,7 @@ public static class Admin { /** * Additional admin-specific properties used to configure the client. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); /** * Close timeout. @@ -815,7 +816,7 @@ public static class Streams { /** * Additional Kafka properties used to configure the streams. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); public Ssl getSsl() { return this.ssl; @@ -1510,7 +1511,7 @@ public static class Jaas { /** * Additional JAAS options. */ - private final Map options = new HashMap<>(); + private final Map options = new LinkedHashMap<>(); public boolean isEnabled() { return this.enabled; @@ -1741,7 +1742,7 @@ public byte id() { } @SuppressWarnings("serial") - private static final class Properties extends HashMap { + private static final class Properties extends LinkedHashMap { java.util.function.Consumer in(String key) { return (value) -> put(key, value); diff --git a/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java b/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java index 636834cf6cf..b84fe0ead19 100644 --- a/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java +++ b/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.ldap.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -32,6 +32,7 @@ * Configuration properties for LDAP. * * @author Eddú Meléndez + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.ldap") @@ -74,7 +75,7 @@ public class LdapProperties { /** * LDAP specification settings. */ - private final Map baseEnvironment = new HashMap<>(); + private final Map baseEnvironment = new LinkedHashMap<>(); private final Template template = new Template(); diff --git a/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java b/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java index 4024232ac83..6622a71a297 100644 --- a/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java +++ b/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java @@ -18,7 +18,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -31,6 +31,7 @@ * @author Oliver Gierke * @author Stephane Nicoll * @author Eddú Meléndez + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.mail") @@ -71,7 +72,7 @@ public class MailProperties { /** * Additional JavaMail Session properties. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); /** * Session JNDI name. When set, takes precedence over other Session settings. diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java index befa265456f..2d0785aee95 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.micrometer.metrics.autoconfigure.export.humio; import java.time.Duration; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -30,6 +30,7 @@ * export. * * @author Andy Wilkinson + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.humio.metrics.export") @@ -50,7 +51,7 @@ public class HumioProperties extends StepRegistryProperties { * are a distinct concept from Micrometer's tags. Micrometer's tags are used to divide * metrics along dimensional boundaries. */ - private Map tags = new HashMap<>(); + private Map tags = new LinkedHashMap<>(); /** * URI to ship metrics to. If you need to publish metrics to an internal proxy diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java index d7ca355cf0c..7a689c0910e 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.micrometer.metrics.autoconfigure.export.prometheus; import java.time.Duration; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -31,6 +31,7 @@ * * @author Jon Schneider * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.prometheus.metrics.export") @@ -56,7 +57,7 @@ public class PrometheusProperties { /** * Additional properties to pass to the Prometheus client. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); /** * Step size (i.e. reporting frequency) to use. @@ -148,7 +149,7 @@ public static class Pushgateway { /** * Grouping key for the pushed metrics. */ - private Map groupingKey = new HashMap<>(); + private Map groupingKey = new LinkedHashMap<>(); /** * Operation that should be performed on shutdown. diff --git a/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java b/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java index edf073fa349..87d88403ab9 100644 --- a/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java +++ b/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.micrometer.tracing.opentelemetry.autoconfigure.otlp; import java.time.Duration; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -28,6 +28,7 @@ * Configuration properties for exporting traces using OTLP. * * @author Jonatan Ivanov + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry.tracing.export.otlp") @@ -64,7 +65,7 @@ public class OtlpTracingProperties { /** * Custom HTTP headers you want to pass to the collector, for example auth headers. */ - private Map headers = new HashMap<>(); + private Map headers = new LinkedHashMap<>(); private final Ssl ssl = new Ssl(); diff --git a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java index a900b3e373a..eca8ceeea54 100644 --- a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java +++ b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.opentelemetry.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -25,6 +25,7 @@ * Configuration properties for OpenTelemetry. * * @author Moritz Halbritter + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry") @@ -40,7 +41,7 @@ public class OpenTelemetryProperties { /** * Resource attributes. */ - private Map resourceAttributes = new HashMap<>(); + private Map resourceAttributes = new LinkedHashMap<>(); public boolean isEnabled() { return this.enabled; diff --git a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java index 569935763a6..553cf30ec04 100644 --- a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java +++ b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.opentelemetry.autoconfigure.logging.otlp; import java.time.Duration; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -28,6 +28,7 @@ * Configuration properties for exporting logs using OpenTelemetry. * * @author Jonatan Ivanov + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry.logging.export.otlp") @@ -64,7 +65,7 @@ public class OtlpLoggingProperties { /** * Custom HTTP headers you want to pass to the collector, for example auth headers. */ - private final Map headers = new HashMap<>(); + private final Map headers = new LinkedHashMap<>(); private final Ssl ssl = new Ssl(); diff --git a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java index 176dd4b6e60..a55c1899328 100644 --- a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java +++ b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.quartz.autoconfigure; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.springframework.boot.actuate.endpoint.Show; @@ -27,6 +27,7 @@ * Configuration properties for {@link QuartzEndpoint}. * * @author Madhura Bhave + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.endpoint.quartz") @@ -41,7 +42,7 @@ public class QuartzEndpointProperties { * Roles used to determine whether a user is authorized to be shown unsanitized job or * trigger values. When empty, all authenticated users are authorized. */ - private final Set roles = new HashSet<>(); + private final Set roles = new LinkedHashSet<>(); public Show getShowValues() { return this.showValues; diff --git a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java index 14c405cb9e6..92a4b8a4645 100644 --- a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java +++ b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java @@ -17,7 +17,7 @@ package org.springframework.boot.quartz.autoconfigure; import java.time.Duration; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.jspecify.annotations.Nullable; @@ -29,6 +29,7 @@ * * @author Vedran Pavic * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.quartz") @@ -69,7 +70,7 @@ public class QuartzProperties { /** * Additional Quartz Scheduler properties. */ - private final Map properties = new HashMap<>(); + private final Map properties = new LinkedHashMap<>(); public JobStoreType getJobStoreType() { return this.jobStoreType; diff --git a/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java b/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java index ede513ef61a..c253ff38571 100644 --- a/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java +++ b/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java @@ -17,8 +17,8 @@ package org.springframework.boot.security.oauth2.server.authorization.autoconfigure.servlet; import java.time.Duration; -import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; @@ -35,6 +35,7 @@ * * @author Steve Riesenberg * @author Florian Lemaire + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.security.oauth2.authorizationserver") @@ -55,7 +56,7 @@ public class OAuth2AuthorizationServerProperties implements InitializingBean { /** * Registered clients of the Authorization Server. */ - private final Map client = new HashMap<>(); + private final Map client = new LinkedHashMap<>(); /** * Authorization Server endpoints. @@ -380,27 +381,27 @@ public static class Registration { /** * Client authentication method(s) that the client may use. */ - private Set clientAuthenticationMethods = new HashSet<>(); + private Set clientAuthenticationMethods = new LinkedHashSet<>(); /** * Authorization grant type(s) that the client may use. */ - private Set authorizationGrantTypes = new HashSet<>(); + private Set authorizationGrantTypes = new LinkedHashSet<>(); /** * Redirect URI(s) that the client may use in redirect-based flows. */ - private Set redirectUris = new HashSet<>(); + private Set redirectUris = new LinkedHashSet<>(); /** * Redirect URI(s) that the client may use for logout. */ - private Set postLogoutRedirectUris = new HashSet<>(); + private Set postLogoutRedirectUris = new LinkedHashSet<>(); /** * Scope(s) that the client may use. */ - private Set scopes = new HashSet<>(); + private Set scopes = new LinkedHashSet<>(); public @Nullable String getClientId() { return this.clientId; diff --git a/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java b/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java index c87a49c033d..4ec4c096512 100644 --- a/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java +++ b/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.security.oauth2.client.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; @@ -34,6 +34,7 @@ * @author Artsiom Yudovin * @author MyeongHyeon Lee * @author Moritz Halbritter + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.security.oauth2.client") @@ -42,12 +43,12 @@ public class OAuth2ClientProperties implements InitializingBean { /** * OAuth provider details. */ - private final Map provider = new HashMap<>(); + private final Map provider = new LinkedHashMap<>(); /** * OAuth client registrations. */ - private final Map registration = new HashMap<>(); + private final Map registration = new LinkedHashMap<>(); public Map getProvider() { return this.provider; diff --git a/module/spring-boot-session/src/main/java/org/springframework/boot/session/autoconfigure/SessionProperties.java b/module/spring-boot-session/src/main/java/org/springframework/boot/session/autoconfigure/SessionProperties.java index 0f7c500b41b..30216c894ab 100644 --- a/module/spring-boot-session/src/main/java/org/springframework/boot/session/autoconfigure/SessionProperties.java +++ b/module/spring-boot-session/src/main/java/org/springframework/boot/session/autoconfigure/SessionProperties.java @@ -19,7 +19,7 @@ import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Arrays; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import java.util.function.Supplier; @@ -90,7 +90,7 @@ public static class Servlet { /** * Session repository filter dispatcher types. */ - private Set filterDispatcherTypes = new HashSet<>( + private Set filterDispatcherTypes = new LinkedHashSet<>( Arrays.asList(DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.REQUEST)); public int getFilterOrder() { diff --git a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java index 32629886c8a..dd2adc65213 100644 --- a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java +++ b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java @@ -20,7 +20,7 @@ import java.nio.charset.Charset; import java.time.Duration; import java.time.temporal.ChronoUnit; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; @@ -67,6 +67,7 @@ * @author Florian Storz * @author Michael Weidmann * @author Lasse Wulff + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("server") @@ -212,7 +213,7 @@ public static class Servlet { /** * Servlet context init parameters. */ - private final Map contextParameters = new HashMap<>(); + private final Map contextParameters = new LinkedHashMap<>(); /** * Context path of the application. diff --git a/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java b/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java index a93dd86a9d2..ba480dec7f4 100644 --- a/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java +++ b/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java @@ -16,7 +16,7 @@ package org.springframework.boot.webservices.autoconfigure; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -27,6 +27,7 @@ * * @author Vedran Pavic * @author Stephane Nicoll + * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.webservices") @@ -59,7 +60,7 @@ public static class Servlet { /** * Servlet init parameters to pass to Spring Web Services. */ - private Map init = new HashMap<>(); + private Map init = new LinkedHashMap<>(); /** * Load on startup priority of the Spring Web Services servlet. From 2e3b14555ca1a2247b1ddaaa0eca861a125768fe Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Thu, 7 May 2026 17:38:46 -0500 Subject: [PATCH 3/9] to make sure Sbom is formatted Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+GollapudiSrikanth@users.noreply.github.com> --- .../org/springframework/boot/actuate/sbom/SbomProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java index 56fb24c6d64..9cf17341dab 100644 --- a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java +++ b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java @@ -27,7 +27,7 @@ /** * Configuration properties for the SBOM endpoint. * @author Moritz Halbritter - * @author Venkata Naga Sai Srikanth Gollapudi + * @author Srikanth Gollapudi * @since 3.3.0 */ @ConfigurationProperties("management.endpoint.sbom") From 23ed792366b70cb13571c98af5593586cd964486 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+GollapudiSrikanth@users.noreply.github.com> Date: Thu, 7 May 2026 22:24:16 -0500 Subject: [PATCH 4/9] format fix Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+GollapudiSrikanth@users.noreply.github.com> --- .../org/springframework/boot/actuate/sbom/SbomProperties.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java index 9cf17341dab..bd366c43883 100644 --- a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java +++ b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java @@ -26,8 +26,9 @@ /** * Configuration properties for the SBOM endpoint. + * * @author Moritz Halbritter - * @author Srikanth Gollapudi + * @author Venkata Naga Sai Srikanth Gollapudi * @since 3.3.0 */ @ConfigurationProperties("management.endpoint.sbom") From e883fc13eba7bf36246e5fd9cd1bb96c87ca7d14 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Wed, 10 Jun 2026 23:35:20 -0500 Subject: [PATCH 5/9] Refine configuration properties collection architecture rules Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> --- .../build/architecture/ArchitectureRules.java | 57 +++++++++++++------ .../architecture/ArchitectureCheckTests.java | 18 +++++- .../ConfigurationPropertiesWithArrayList.java | 42 ++++++++++++++ ...ConfigurationPropertiesWithLinkedList.java | 42 ++++++++++++++ 4 files changed, 140 insertions(+), 19 deletions(-) create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java index dc16d468471..bb7af184f05 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java @@ -37,7 +37,10 @@ import com.tngtech.archunit.core.domain.JavaClass.Predicates; import com.tngtech.archunit.core.domain.JavaClasses; import com.tngtech.archunit.core.domain.JavaConstructor; +import com.tngtech.archunit.core.domain.JavaConstructorCall; import com.tngtech.archunit.core.domain.JavaField; +import com.tngtech.archunit.core.domain.JavaFieldAccess; +import com.tngtech.archunit.core.domain.JavaFieldAccess.AccessType; import com.tngtech.archunit.core.domain.JavaMember; import com.tngtech.archunit.core.domain.JavaMethod; import com.tngtech.archunit.core.domain.JavaModifier; @@ -128,7 +131,11 @@ static List conditionalOnMissingBean(String annotationClass) { static List configurationProperties(String annotationClass) { return List.of(classLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), methodLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), - configurationPropertiesShouldNotUseHashMapOrHashSet(annotationClass)); + initializedConfigurationPropertiesShouldUse("java.util.List", "java.util.ArrayList", annotationClass), + initializedConfigurationPropertiesShouldUse("java.util.Set", "java.util.LinkedHashSet", + annotationClass), + initializedConfigurationPropertiesShouldUse("java.util.Map", "java.util.LinkedHashMap", + annotationClass)); } static List configurationPropertiesBinding(String annotationClass) { @@ -430,28 +437,44 @@ private static ArchRule allDeprecatedConfigurationPropertiesShouldIncludeSince(S .allowEmptyShould(true); } - private static ArchRule configurationPropertiesShouldNotUseHashMapOrHashSet(String annotationClass) { - DescribedPredicate> hashMapOrHashSetConstructor = hasJavaCallTarget( - new DescribedPredicate("is a HashMap or HashSet constructor") { - @Override - public boolean test(CodeUnitCallTarget target) { - String ownerName = target.getOwner().getName(); - return ("java.util.HashMap".equals(ownerName) || "java.util.HashSet".equals(ownerName)) - && "".equals(target.getName()); - } - }); - return ArchRuleDefinition.noClasses() + private static ArchRule initializedConfigurationPropertiesShouldUse(String propertyType, String implementationType, + String annotationClass) { + return ArchRuleDefinition.classes() .that() .areAnnotatedWith(annotationClass) .or(areNestedInConfigurationPropertiesClasses(annotationClass)) - .should() - .callConstructorWhere(hashMapOrHashSetConstructor) - .because("@ConfigurationProperties classes should use LinkedHashMap/LinkedHashSet " - + "instead of HashMap/HashSet to preserve insertion order consistent with the Binder") - + .should(useImplementationForInitializedProperties(propertyType, implementationType)) + .because("@ConfigurationProperties classes should preserve the property type's expected implementation") .allowEmptyShould(true); } + private static ArchCondition useImplementationForInitializedProperties(String propertyType, + String implementationType) { + return check("use %s for initialized %s properties".formatted(implementationType, propertyType), + (javaClass, events) -> javaClass.getFields() + .stream() + .filter((field) -> propertyType.equals(field.getRawType().getName())) + .forEach((field) -> checkPropertyInitializer(field, implementationType, events))); + } + + private static void checkPropertyInitializer(JavaField field, String implementationType, ConditionEvents events) { + field.getAccessesToSelf() + .stream() + .filter((access) -> access.getAccessType() == AccessType.SET) + .flatMap((access) -> initializerConstructorCalls(access).stream()) + .filter((call) -> !implementationType.equals(call.getTargetOwner().getName())) + .forEach((call) -> addViolation(events, field, "%s should be initialized with %s instead of %s" + .formatted(field.getDescription(), implementationType, call.getTargetOwner().getName()))); + } + + private static List initializerConstructorCalls(JavaFieldAccess fieldAccess) { + return fieldAccess.getOrigin() + .getConstructorCallsFromSelf() + .stream() + .filter((call) -> call.getLineNumber() == fieldAccess.getLineNumber()) + .toList(); + } + private static DescribedPredicate areNestedInConfigurationPropertiesClasses(String annotationClass) { return DescribedPredicate.describe("are nested in @ConfigurationProperties", (javaClass) -> javaClass.getEnclosingClass() diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java index 643d42ccdb0..8d703d40810 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java @@ -336,14 +336,28 @@ void whenMethodLevelConfigurationPropertiesContainsOnlyValueShouldSucceedAndWrit void whenConfigurationPropertiesUsesHashMapShouldFailAndWriteReport() throws IOException { prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/hashmap", "annotations"); buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), - Task.CHECK_ARCHITECTURE_MAIN, "should use LinkedHashMap/LinkedHashSet instead of HashMap/HashSet"); + Task.CHECK_ARCHITECTURE_MAIN, "should be initialized with java.util.LinkedHashMap"); } @Test void whenConfigurationPropertiesUsesHashSetShouldFailAndWriteReport() throws IOException { prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/hashset", "annotations"); buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), - Task.CHECK_ARCHITECTURE_MAIN, "should use LinkedHashMap/LinkedHashSet instead of HashMap/HashSet"); + Task.CHECK_ARCHITECTURE_MAIN, "should be initialized with java.util.LinkedHashSet"); + } + + @Test + void whenConfigurationPropertiesUsesLinkedListShouldFailAndWriteReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedlist", "annotations"); + buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN, "should be initialized with java.util.ArrayList"); + } + + @Test + void whenConfigurationPropertiesUsesArrayListShouldSucceedAndWriteEmptyReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/arraylist", "annotations"); + build(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN); } @Test diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java new file mode 100644 index 00000000000..b1fd83d06dc --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.arraylist; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link ArrayList}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithArrayList { + + private List items = new ArrayList<>(); + + public List getItems() { + return this.items; + } + + public void setItems(List items) { + this.items = items; + } + +} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java new file mode 100644 index 00000000000..144c24d2ac1 --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.linkedlist; + +import java.util.LinkedList; +import java.util.List; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link LinkedList}. + * + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithLinkedList { + + private List items = new LinkedList<>(); + + public List getItems() { + return this.items; + } + + public void setItems(List items) { + this.items = items; + } + +} From 38814f16129fbf50cfb41106aaae4a03033fc8ea Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Sat, 13 Jun 2026 12:47:53 -0500 Subject: [PATCH 6/9] Tighten architecture rules for configuration properties collections Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> --- .../build/architecture/ArchitectureRules.java | 1 - .../architecture/ArchitectureCheckTests.java | 14 ------- .../ConfigurationPropertiesWithArrayList.java | 42 ------------------- ...ConfigurationPropertiesWithLinkedList.java | 42 ------------------- 4 files changed, 99 deletions(-) delete mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java delete mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java index bb7af184f05..e86baea2630 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java @@ -131,7 +131,6 @@ static List conditionalOnMissingBean(String annotationClass) { static List configurationProperties(String annotationClass) { return List.of(classLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), methodLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), - initializedConfigurationPropertiesShouldUse("java.util.List", "java.util.ArrayList", annotationClass), initializedConfigurationPropertiesShouldUse("java.util.Set", "java.util.LinkedHashSet", annotationClass), initializedConfigurationPropertiesShouldUse("java.util.Map", "java.util.LinkedHashMap", diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java index 8d703d40810..8df22d69626 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java @@ -346,20 +346,6 @@ void whenConfigurationPropertiesUsesHashSetShouldFailAndWriteReport() throws IOE Task.CHECK_ARCHITECTURE_MAIN, "should be initialized with java.util.LinkedHashSet"); } - @Test - void whenConfigurationPropertiesUsesLinkedListShouldFailAndWriteReport() throws IOException { - prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedlist", "annotations"); - buildAndFail(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), - Task.CHECK_ARCHITECTURE_MAIN, "should be initialized with java.util.ArrayList"); - } - - @Test - void whenConfigurationPropertiesUsesArrayListShouldSucceedAndWriteEmptyReport() throws IOException { - prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/arraylist", "annotations"); - build(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), - Task.CHECK_ARCHITECTURE_MAIN); - } - @Test void whenConfigurationPropertiesUsesLinkedHashMapShouldSucceedAndWriteEmptyReport() throws IOException { prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedhashmap", "annotations"); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java deleted file mode 100644 index b1fd83d06dc..00000000000 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/arraylist/ConfigurationPropertiesWithArrayList.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.build.architecture.configurationproperties.arraylist; - -import java.util.ArrayList; -import java.util.List; - -import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; - -/** - * Test {@link TestConfigurationProperties} using {@link ArrayList}. - * - * @author Venkata Naga Sai Srikanth Gollapudi - */ -@TestConfigurationProperties("testing") -public class ConfigurationPropertiesWithArrayList { - - private List items = new ArrayList<>(); - - public List getItems() { - return this.items; - } - - public void setItems(List items) { - this.items = items; - } - -} diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java deleted file mode 100644 index 144c24d2ac1..00000000000 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/linkedlist/ConfigurationPropertiesWithLinkedList.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.build.architecture.configurationproperties.linkedlist; - -import java.util.LinkedList; -import java.util.List; - -import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; - -/** - * Test {@link TestConfigurationProperties} using {@link LinkedList}. - * - * @author Venkata Naga Sai Srikanth Gollapudi - */ -@TestConfigurationProperties("testing") -public class ConfigurationPropertiesWithLinkedList { - - private List items = new LinkedList<>(); - - public List getItems() { - return this.items; - } - - public void setItems(List items) { - this.items = items; - } - -} From 54a6aca63cd3bcbdf3ca12f6195b6419e7efe80a Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Sat, 13 Jun 2026 13:02:15 -0500 Subject: [PATCH 7/9] Remove author tags from properties classes Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> --- .../ConfigurationPropertiesReportEndpointProperties.java | 1 - .../actuate/autoconfigure/env/EnvironmentEndpointProperties.java | 1 - .../autoconfigure/web/exchanges/HttpExchangesProperties.java | 1 - .../org/springframework/boot/actuate/sbom/SbomProperties.java | 1 - .../boot/artemis/autoconfigure/ArtemisProperties.java | 1 - .../boot/flyway/autoconfigure/FlywayProperties.java | 1 - .../boot/freemarker/autoconfigure/FreeMarkerProperties.java | 1 - .../server/autoconfigure/health/GrpcServerHealthProperties.java | 1 - .../boot/hibernate/autoconfigure/HibernateProperties.java | 1 - .../boot/jersey/autoconfigure/JerseyProperties.java | 1 - .../springframework/boot/jpa/autoconfigure/JpaProperties.java | 1 - .../springframework/boot/ldap/autoconfigure/LdapProperties.java | 1 - .../springframework/boot/mail/autoconfigure/MailProperties.java | 1 - .../metrics/autoconfigure/export/humio/HumioProperties.java | 1 - .../autoconfigure/export/prometheus/PrometheusProperties.java | 1 - .../opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java | 1 - .../opentelemetry/autoconfigure/OpenTelemetryProperties.java | 1 - .../autoconfigure/logging/otlp/OtlpLoggingProperties.java | 1 - .../boot/quartz/autoconfigure/QuartzEndpointProperties.java | 1 - .../boot/quartz/autoconfigure/QuartzProperties.java | 1 - .../servlet/OAuth2AuthorizationServerProperties.java | 1 - .../oauth2/client/autoconfigure/OAuth2ClientProperties.java | 1 - .../boot/web/server/autoconfigure/ServerProperties.java | 1 - .../boot/webservices/autoconfigure/WebServicesProperties.java | 1 - 24 files changed, 24 deletions(-) diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java index 1a39fe2ff07..6f594812072 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/context/properties/ConfigurationPropertiesReportEndpointProperties.java @@ -28,7 +28,6 @@ * * @author Stephane Nicoll * @author Madhura Bhave - * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.endpoint.configprops") diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java index bce1a59f8e8..d2de960491f 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/env/EnvironmentEndpointProperties.java @@ -27,7 +27,6 @@ * Configuration properties for {@link EnvironmentEndpoint}. * * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.endpoint.env") diff --git a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java index 883eae4bdd0..fc049e7b072 100644 --- a/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java +++ b/module/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/exchanges/HttpExchangesProperties.java @@ -30,7 +30,6 @@ * @author Venil Noronha * @author Madhura Bhave * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 2.0.0 */ @ConfigurationProperties("management.httpexchanges") diff --git a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java index bd366c43883..3c05315caa6 100644 --- a/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java +++ b/module/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/sbom/SbomProperties.java @@ -28,7 +28,6 @@ * Configuration properties for the SBOM endpoint. * * @author Moritz Halbritter - * @author Venkata Naga Sai Srikanth Gollapudi * @since 3.3.0 */ @ConfigurationProperties("management.endpoint.sbom") diff --git a/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java b/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java index dcb3df3eae4..3add6adba38 100644 --- a/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java +++ b/module/spring-boot-artemis/src/main/java/org/springframework/boot/artemis/autoconfigure/ArtemisProperties.java @@ -34,7 +34,6 @@ * @author Eddú Meléndez * @author Stephane Nicoll * @author Justin Bertram - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.artemis") diff --git a/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java b/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java index 57a1d4e4942..44ef3c2ac3b 100644 --- a/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java +++ b/module/spring-boot-flyway/src/main/java/org/springframework/boot/flyway/autoconfigure/FlywayProperties.java @@ -39,7 +39,6 @@ * @author Eddú Meléndez * @author Stephane Nicoll * @author Chris Bono - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.flyway") diff --git a/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java b/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java index 27216836075..ba0082af1f9 100644 --- a/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java +++ b/module/spring-boot-freemarker/src/main/java/org/springframework/boot/freemarker/autoconfigure/FreeMarkerProperties.java @@ -34,7 +34,6 @@ * * @author Dave Syer * @author Andy Wilkinson - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.freemarker") diff --git a/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java b/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java index d7e4ffc717a..c2be3e85eed 100644 --- a/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java +++ b/module/spring-boot-grpc-server/src/main/java/org/springframework/boot/grpc/server/autoconfigure/health/GrpcServerHealthProperties.java @@ -37,7 +37,6 @@ * * @author Phillip Webb * @author Chris Bono - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.1.0 */ @ConfigurationProperties("spring.grpc.server.health") diff --git a/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java b/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java index 95dd7b93e89..e9299e4e720 100644 --- a/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java +++ b/module/spring-boot-hibernate/src/main/java/org/springframework/boot/hibernate/autoconfigure/HibernateProperties.java @@ -40,7 +40,6 @@ * * @author Stephane Nicoll * @author Chris Bono - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 * @see JpaProperties */ diff --git a/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java b/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java index 4c68f974f25..cc3906d936a 100644 --- a/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java +++ b/module/spring-boot-jersey/src/main/java/org/springframework/boot/jersey/autoconfigure/JerseyProperties.java @@ -29,7 +29,6 @@ * @author Dave Syer * @author Eddú Meléndez * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.jersey") diff --git a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java index f07153a8d09..fcd8631c500 100644 --- a/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java +++ b/module/spring-boot-jpa/src/main/java/org/springframework/boot/jpa/autoconfigure/JpaProperties.java @@ -34,7 +34,6 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Madhura Bhave - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.jpa") diff --git a/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java b/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java index b84fe0ead19..9bbb9bde845 100644 --- a/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java +++ b/module/spring-boot-ldap/src/main/java/org/springframework/boot/ldap/autoconfigure/LdapProperties.java @@ -32,7 +32,6 @@ * Configuration properties for LDAP. * * @author Eddú Meléndez - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.ldap") diff --git a/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java b/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java index 6622a71a297..7d2f4d4319f 100644 --- a/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java +++ b/module/spring-boot-mail/src/main/java/org/springframework/boot/mail/autoconfigure/MailProperties.java @@ -31,7 +31,6 @@ * @author Oliver Gierke * @author Stephane Nicoll * @author Eddú Meléndez - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.mail") diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java index 2d0785aee95..ede0cdb5cf7 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/humio/HumioProperties.java @@ -30,7 +30,6 @@ * export. * * @author Andy Wilkinson - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.humio.metrics.export") diff --git a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java index 7a689c0910e..7d7de22eb3a 100644 --- a/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java +++ b/module/spring-boot-micrometer-metrics/src/main/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/prometheus/PrometheusProperties.java @@ -31,7 +31,6 @@ * * @author Jon Schneider * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.prometheus.metrics.export") diff --git a/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java b/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java index 87d88403ab9..b76c63cb610 100644 --- a/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java +++ b/module/spring-boot-micrometer-tracing-opentelemetry/src/main/java/org/springframework/boot/micrometer/tracing/opentelemetry/autoconfigure/otlp/OtlpTracingProperties.java @@ -28,7 +28,6 @@ * Configuration properties for exporting traces using OTLP. * * @author Jonatan Ivanov - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry.tracing.export.otlp") diff --git a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java index eca8ceeea54..6e1f003677c 100644 --- a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java +++ b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/OpenTelemetryProperties.java @@ -25,7 +25,6 @@ * Configuration properties for OpenTelemetry. * * @author Moritz Halbritter - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry") diff --git a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java index 553cf30ec04..ebb114ae24b 100644 --- a/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java +++ b/module/spring-boot-opentelemetry/src/main/java/org/springframework/boot/opentelemetry/autoconfigure/logging/otlp/OtlpLoggingProperties.java @@ -28,7 +28,6 @@ * Configuration properties for exporting logs using OpenTelemetry. * * @author Jonatan Ivanov - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.opentelemetry.logging.export.otlp") diff --git a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java index a55c1899328..053b7ff7901 100644 --- a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java +++ b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzEndpointProperties.java @@ -27,7 +27,6 @@ * Configuration properties for {@link QuartzEndpoint}. * * @author Madhura Bhave - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("management.endpoint.quartz") diff --git a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java index 92a4b8a4645..73fbbc77ffc 100644 --- a/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java +++ b/module/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java @@ -29,7 +29,6 @@ * * @author Vedran Pavic * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.quartz") diff --git a/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java b/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java index c253ff38571..b44e870f810 100644 --- a/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java +++ b/module/spring-boot-security-oauth2-authorization-server/src/main/java/org/springframework/boot/security/oauth2/server/authorization/autoconfigure/servlet/OAuth2AuthorizationServerProperties.java @@ -35,7 +35,6 @@ * * @author Steve Riesenberg * @author Florian Lemaire - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.security.oauth2.authorizationserver") diff --git a/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java b/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java index 4ec4c096512..7d17fef2bdf 100644 --- a/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java +++ b/module/spring-boot-security-oauth2-client/src/main/java/org/springframework/boot/security/oauth2/client/autoconfigure/OAuth2ClientProperties.java @@ -34,7 +34,6 @@ * @author Artsiom Yudovin * @author MyeongHyeon Lee * @author Moritz Halbritter - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.security.oauth2.client") diff --git a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java index dd2adc65213..415b7bc54a1 100644 --- a/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java +++ b/module/spring-boot-web-server/src/main/java/org/springframework/boot/web/server/autoconfigure/ServerProperties.java @@ -67,7 +67,6 @@ * @author Florian Storz * @author Michael Weidmann * @author Lasse Wulff - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("server") diff --git a/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java b/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java index ba480dec7f4..847c3de30d7 100644 --- a/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java +++ b/module/spring-boot-webservices/src/main/java/org/springframework/boot/webservices/autoconfigure/WebServicesProperties.java @@ -27,7 +27,6 @@ * * @author Vedran Pavic * @author Stephane Nicoll - * @author Venkata Naga Sai Srikanth Gollapudi * @since 4.0.0 */ @ConfigurationProperties("spring.webservices") From 9122fa7fb81d66bd93528205f5ecdf16328a0331 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Sat, 13 Jun 2026 14:04:50 -0500 Subject: [PATCH 8/9] Allow EnumMap in configuration properties architecture rule Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> --- .../build/architecture/ArchitectureRules.java | 26 ++++++---- .../architecture/ArchitectureCheckTests.java | 7 +++ .../ConfigurationPropertiesWithEnumMap.java | 47 +++++++++++++++++++ 3 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java index e86baea2630..2a4bb2d92c8 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java @@ -133,8 +133,8 @@ static List configurationProperties(String annotationClass) { methodLevelConfigurationPropertiesShouldNotSpecifyOnlyPrefixAttribute(annotationClass), initializedConfigurationPropertiesShouldUse("java.util.Set", "java.util.LinkedHashSet", annotationClass), - initializedConfigurationPropertiesShouldUse("java.util.Map", "java.util.LinkedHashMap", - annotationClass)); + initializedConfigurationPropertiesShouldUse("java.util.Map", + List.of("java.util.LinkedHashMap", "java.util.EnumMap"), annotationClass)); } static List configurationPropertiesBinding(String annotationClass) { @@ -438,32 +438,40 @@ private static ArchRule allDeprecatedConfigurationPropertiesShouldIncludeSince(S private static ArchRule initializedConfigurationPropertiesShouldUse(String propertyType, String implementationType, String annotationClass) { + return initializedConfigurationPropertiesShouldUse(propertyType, List.of(implementationType), annotationClass); + } + + private static ArchRule initializedConfigurationPropertiesShouldUse(String propertyType, + List implementationTypes, String annotationClass) { return ArchRuleDefinition.classes() .that() .areAnnotatedWith(annotationClass) .or(areNestedInConfigurationPropertiesClasses(annotationClass)) - .should(useImplementationForInitializedProperties(propertyType, implementationType)) + .should(useImplementationForInitializedProperties(propertyType, implementationTypes)) .because("@ConfigurationProperties classes should preserve the property type's expected implementation") .allowEmptyShould(true); } private static ArchCondition useImplementationForInitializedProperties(String propertyType, - String implementationType) { - return check("use %s for initialized %s properties".formatted(implementationType, propertyType), + List implementationTypes) { + String description = implementationTypes.stream().collect(Collectors.joining(" or ")); + return check("use %s for initialized %s properties".formatted(description, propertyType), (javaClass, events) -> javaClass.getFields() .stream() .filter((field) -> propertyType.equals(field.getRawType().getName())) - .forEach((field) -> checkPropertyInitializer(field, implementationType, events))); + .forEach((field) -> checkPropertyInitializer(field, implementationTypes, events))); } - private static void checkPropertyInitializer(JavaField field, String implementationType, ConditionEvents events) { + private static void checkPropertyInitializer(JavaField field, List implementationTypes, + ConditionEvents events) { + String description = implementationTypes.stream().collect(Collectors.joining(" or ")); field.getAccessesToSelf() .stream() .filter((access) -> access.getAccessType() == AccessType.SET) .flatMap((access) -> initializerConstructorCalls(access).stream()) - .filter((call) -> !implementationType.equals(call.getTargetOwner().getName())) + .filter((call) -> !implementationTypes.contains(call.getTargetOwner().getName())) .forEach((call) -> addViolation(events, field, "%s should be initialized with %s instead of %s" - .formatted(field.getDescription(), implementationType, call.getTargetOwner().getName()))); + .formatted(field.getDescription(), description, call.getTargetOwner().getName()))); } private static List initializerConstructorCalls(JavaFieldAccess fieldAccess) { diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java index 8df22d69626..aaddc9feda3 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/ArchitectureCheckTests.java @@ -353,6 +353,13 @@ void whenConfigurationPropertiesUsesLinkedHashMapShouldSucceedAndWriteEmptyRepor Task.CHECK_ARCHITECTURE_MAIN); } + @Test + void whenConfigurationPropertiesUsesEnumMapShouldSucceedAndWriteEmptyReport() throws IOException { + prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/enummap", "annotations"); + build(this.gradleBuild.withDependencies(SPRING_CONTEXT).withConfigurationPropertiesAnnotation(), + Task.CHECK_ARCHITECTURE_MAIN); + } + @Test void whenConfigurationPropertiesUsesLinkedHashSetShouldSucceedAndWriteEmptyReport() throws IOException { prepareTask(Task.CHECK_ARCHITECTURE_MAIN, "configurationproperties/linkedhashset", "annotations"); diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java new file mode 100644 index 00000000000..277866df72d --- /dev/null +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.build.architecture.configurationproperties.enummap; + +import java.util.EnumMap; +import java.util.Map; + +import org.springframework.boot.build.architecture.annotations.TestConfigurationProperties; + +/** + * Test {@link TestConfigurationProperties} using {@link EnumMap}. + * @author Venkata Naga Sai Srikanth Gollapudi + */ +@TestConfigurationProperties("testing") +public class ConfigurationPropertiesWithEnumMap { + + private Map properties = new EnumMap<>(Example.class); + + public Map getProperties() { + return this.properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + enum Example { + + ONE + + } + +} From 80b0a027609839d86eca73640a3ecda2b79ce969 Mon Sep 17 00:00:00 2001 From: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> Date: Sat, 13 Jun 2026 14:12:20 -0500 Subject: [PATCH 9/9] format fix Signed-off-by: Venkata Naga Sai Srikanth Gollapudi <42247688+gollapudisrikanth@users.noreply.github.com> --- .../enummap/ConfigurationPropertiesWithEnumMap.java | 1 + 1 file changed, 1 insertion(+) diff --git a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java index 277866df72d..f3fa73b9cb3 100644 --- a/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java +++ b/buildSrc/src/test/java/org/springframework/boot/build/architecture/configurationproperties/enummap/ConfigurationPropertiesWithEnumMap.java @@ -23,6 +23,7 @@ /** * Test {@link TestConfigurationProperties} using {@link EnumMap}. + * * @author Venkata Naga Sai Srikanth Gollapudi */ @TestConfigurationProperties("testing")