diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index f1ac0393b980..47bb3ab0861b 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -69,6 +69,16 @@ runs: COMMERCIAL_REPO_USERNAME: ${{ inputs.commercial-repository-username }} COMMERCIAL_SNAPSHOT_REPO_URL: ${{ inputs.commercial-snapshot-repository-url }} run: ./gradlew build + - name: Sanity Check + id: sanity + if: ${{ inputs.publish == 'false' }} + shell: bash + env: + COMMERCIAL_RELEASE_REPO_URL: ${{ inputs.commercial-release-repository-url }} + COMMERCIAL_REPO_PASSWORD: ${{ inputs.commercial-repository-password }} + COMMERCIAL_REPO_USERNAME: ${{ inputs.commercial-repository-username }} + COMMERCIAL_SNAPSHOT_REPO_URL: ${{ inputs.commercial-snapshot-repository-url }} + run: ./gradlew rewriteDryRun -Dorg.gradle.jvmargs=-Xmx12G - name: Publish id: publish if: ${{ inputs.publish == 'true' }} diff --git a/.github/workflows/build-pull-request.yml b/.github/workflows/build-pull-request.yml index d3e70557a436..ee6acb2ead78 100644 --- a/.github/workflows/build-pull-request.yml +++ b/.github/workflows/build-pull-request.yml @@ -13,6 +13,9 @@ jobs: - name: Build id: build uses: ./.github/actions/build + - name: Sanity + id: sanity + uses: ./.github/actions/build - name: Print JVM Thread Dumps When Cancelled if: cancelled() uses: ./.github/actions/print-jvm-thread-dumps diff --git a/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoProperties.java b/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoProperties.java index 4029f248f0d7..10c95a45d714 100644 --- a/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoProperties.java +++ b/build-plugin/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/tasks/buildinfo/BuildInfoProperties.java @@ -37,6 +37,8 @@ import org.gradle.api.tasks.Optional; import org.jspecify.annotations.Nullable; +import static java.util.Collections.emptySet; + /** * The properties that are written into the {@code build-info.properties} file. * @@ -148,7 +150,7 @@ Map getAdditionalIfNotExcluded() { } private @Nullable T getIfNotExcluded(Property property, String name, Supplier<@Nullable T> defaultValue) { - if (this.excludes.getOrElse(Collections.emptySet()).contains(name)) { + if (this.excludes.getOrElse(emptySet()).contains(name)) { return null; } if (property.isPresent()) { @@ -172,7 +174,7 @@ private Map coerceToStringValues(Map input) { private Map applyExclusions(Map input) { Map output = new HashMap<>(); - Set exclusions = this.excludes.getOrElse(Collections.emptySet()); + Set exclusions = this.excludes.getOrElse(emptySet()); input.forEach((key, value) -> { boolean isExcluded = exclusions.contains(key); if (!isExcluded) { diff --git a/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/ArtifactsLibrariesTests.java b/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/ArtifactsLibrariesTests.java index 41c7980ac54e..ec822bc85b41 100644 --- a/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/ArtifactsLibrariesTests.java +++ b/build-plugin/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/ArtifactsLibrariesTests.java @@ -41,6 +41,7 @@ import org.springframework.boot.loader.tools.LibraryCoordinates; import org.springframework.boot.loader.tools.LibraryScope; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.assertArg; import static org.mockito.BDDMockito.given; @@ -200,7 +201,7 @@ void nonIncludedArtifact() throws IOException { MavenProject mavenProject = mock(MavenProject.class); given(mavenProject.getArtifact()).willReturn(artifact); this.artifacts = Collections.singleton(artifact); - new ArtifactsLibraries(this.artifacts, Collections.emptySet(), Collections.singleton(mavenProject), null, + new ArtifactsLibraries(this.artifacts, emptySet(), Collections.singleton(mavenProject), null, mock(Log.class)) .doWithLibraries((library) -> assertThat(library.isIncluded()).isFalse()); } diff --git a/build.gradle b/build.gradle index 84acc8603902..b8dde8dd92f3 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,7 @@ plugins { id "base" + id "org.openrewrite.rewrite" version "7.23.0" apply false } description = "Spring Boot Build" @@ -46,3 +47,5 @@ subprojects { resolutionStrategy.cacheChangingModulesFor 0, "minutes" } } + +apply from: rootProject.file("gradle/plugins/config/sanity.gradle") diff --git a/buildpack/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/io/FilePermissionsTests.java b/buildpack/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/io/FilePermissionsTests.java index 3c75e9c7211e..f8d236ec8451 100644 --- a/buildpack/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/io/FilePermissionsTests.java +++ b/buildpack/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/io/FilePermissionsTests.java @@ -23,7 +23,6 @@ import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; -import java.util.Collections; import java.util.Set; import org.junit.jupiter.api.Test; @@ -32,6 +31,7 @@ import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.api.io.TempDir; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIOException; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; @@ -86,7 +86,7 @@ void posixPermissionsToUmask() { @Test void posixPermissionsToUmaskWithEmptyPermissions() { - Set permissions = Collections.emptySet(); + Set permissions = emptySet(); assertThat(FilePermissions.posixPermissionsToUmask(permissions)).isZero(); } diff --git a/configuration-metadata/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/fieldvalues/javac/VariableTree.java b/configuration-metadata/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/fieldvalues/javac/VariableTree.java index ebf62ecdd8a9..a6a2c2901c88 100644 --- a/configuration-metadata/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/fieldvalues/javac/VariableTree.java +++ b/configuration-metadata/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/fieldvalues/javac/VariableTree.java @@ -16,11 +16,12 @@ package org.springframework.boot.configurationprocessor.fieldvalues.javac; -import java.util.Collections; import java.util.Set; import javax.lang.model.element.Modifier; +import static java.util.Collections.emptySet; + /** * Reflection based access to {@code com.sun.source.tree.VariableTree}. * @@ -49,7 +50,7 @@ ExpressionTree getInitializer() throws Exception { Set getModifierFlags() throws Exception { Object modifiers = findMethod("getModifiers").invoke(getInstance()); if (modifiers == null) { - return Collections.emptySet(); + return emptySet(); } return (Set) findMethod(findClass("com.sun.source.tree.ModifiersTree"), "getFlags").invoke(modifiers); } diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java index 5657bfc11c5d..ea3fd43411d6 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationImportSelector.java @@ -61,6 +61,8 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import static java.util.Collections.emptySet; + /** * {@link DeferredImportSelector} to handle {@link EnableAutoConfiguration * auto-configuration}. This class can also be subclassed if a custom variant of @@ -546,7 +548,7 @@ protected static class AutoConfigurationEntry { private AutoConfigurationEntry() { this.configurations = Collections.emptyList(); - this.exclusions = Collections.emptySet(); + this.exclusions = emptySet(); } /** diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java index f44b05573b23..d49daeb8b7c4 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationSorter.java @@ -37,6 +37,8 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.Assert; +import static java.util.Collections.emptySet; + /** * Sort {@link EnableAutoConfiguration auto-configuration} classes into priority order by * reading {@link AutoConfigureOrder @AutoConfigureOrder}, @@ -226,7 +228,7 @@ private Set getClassNames(String metadataKey, Class getSet(String metadataKey) { Assert.state(this.autoConfigurationMetadata != null, "'autoConfigurationMetadata' must not be null"); - return this.autoConfigurationMetadata.getSet(this.className, metadataKey, Collections.emptySet()); + return this.autoConfigurationMetadata.getSet(this.className, metadataKey, emptySet()); } private Set applyReplacements(Set values) { @@ -265,7 +267,7 @@ private Set getAnnotationValue(Class annotation) { Map attributes = getAnnotationMetadata() .getAnnotationAttributes(annotation.getName(), true); if (attributes == null) { - return Collections.emptySet(); + return emptySet(); } Set result = new LinkedHashSet<>(); String[] value = (String[]) attributes.get("value"); diff --git a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index a53c64fcda7d..a2d1e8df826e 100644 --- a/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/core/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -72,6 +72,8 @@ import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; +import static java.util.Collections.emptySet; + /** * {@link Condition} that checks for the presence or absence of specific beans. * @@ -315,7 +317,7 @@ private Set getNamesOfBeansIgnoredByType(ListableBeanFactory beanFactory .keySet(); result = addAll(result, ignoredNames); } - return (result != null) ? result : Collections.emptySet(); + return (result != null) ? result : emptySet(); } private Map getBeanDefinitionsForType(ListableBeanFactory beanFactory, @@ -607,7 +609,7 @@ protected Set extractTypes(@Nullable MultiValueMap extract(@Nullable MultiValueMap attributes, String... attributeNames) { if (CollectionUtils.isEmpty(attributes)) { - return Collections.emptySet(); + return emptySet(); } Set result = new LinkedHashSet<>(); for (String attributeName : attributeNames) { @@ -621,7 +623,7 @@ else if (value instanceof String string) { } } } - return result.isEmpty() ? Collections.emptySet() : result; + return result.isEmpty() ? emptySet() : result; } private void merge(Set result, String... additional) { diff --git a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportAutoConfigurationImportListenerTests.java b/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportAutoConfigurationImportListenerTests.java index bf9ae811d82d..a3c9405c7511 100644 --- a/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportAutoConfigurationImportListenerTests.java +++ b/core/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionEvaluationReportAutoConfigurationImportListenerTests.java @@ -30,6 +30,7 @@ import org.springframework.boot.autoconfigure.AutoConfigurationImportListener; import org.springframework.core.io.support.SpringFactoriesLoader; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; /** @@ -61,7 +62,7 @@ void shouldBeInSpringFactories() { @Test void onAutoConfigurationImportEventShouldRecordCandidates() { List candidateConfigurations = Collections.singletonList("Test"); - Set exclusions = Collections.emptySet(); + Set exclusions = emptySet(); AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, candidateConfigurations, exclusions); this.listener.onAutoConfigurationImportEvent(event); @@ -83,7 +84,7 @@ void onAutoConfigurationImportEventShouldRecordExclusions() { @Test void onAutoConfigurationImportEventShouldApplyExclusionsGlobally() { AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, Arrays.asList("First", "Second"), - Collections.emptySet()); + emptySet()); this.listener.onAutoConfigurationImportEvent(event); AutoConfigurationImportEvent anotherEvent = new AutoConfigurationImportEvent(this, Collections.emptyList(), Collections.singleton("First")); @@ -99,7 +100,7 @@ void onAutoConfigurationImportEventShouldApplyExclusionsGloballyWhenExclusionIsA Collections.singleton("First")); this.listener.onAutoConfigurationImportEvent(excludeEvent); AutoConfigurationImportEvent event = new AutoConfigurationImportEvent(this, Arrays.asList("First", "Second"), - Collections.emptySet()); + emptySet()); this.listener.onAutoConfigurationImportEvent(event); ConditionEvaluationReport report = ConditionEvaluationReport.get(this.beanFactory); assertThat(report.getUnconditionalClasses()).containsExactly("Second"); diff --git a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java index 625c88f65448..4fe79c3ae334 100644 --- a/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java +++ b/core/spring-boot-docker-compose/src/dockerTest/java/org/springframework/boot/docker/compose/core/DockerCliIntegrationTests.java @@ -45,6 +45,7 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.util.FileCopyUtils; +import static java.util.Collections.emptySet; import static org.assertj.core.api.Assertions.assertThat; /** @@ -74,7 +75,7 @@ void runLifecycle() throws IOException { File composeFile = createComposeFile("redis-compose.yaml"); String projectName = UUID.randomUUID().toString(); DockerCli cli = new DockerCli(null, new DockerComposeOptions(DockerComposeFile.of(composeFile), - Collections.emptySet(), List.of("--project-name=" + projectName))); + emptySet(), List.of("--project-name=" + projectName))); try { // Verify that no services are running (this is a fresh compose project) List ps = cli.run(new ComposePs()); diff --git a/core/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DockerCli.java b/core/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DockerCli.java index 194f2da41adf..4f3d7b25b57e 100644 --- a/core/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DockerCli.java +++ b/core/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/DockerCli.java @@ -35,6 +35,8 @@ import org.springframework.core.log.LogMessage; import org.springframework.util.CollectionUtils; +import static java.util.Collections.emptySet; + /** * Wrapper around {@code docker} and {@code docker-compose} command line tools. * @@ -212,7 +214,7 @@ record DockerComposeOptions(@Nullable DockerComposeFile composeFile, Set DockerComposeOptions(@Nullable DockerComposeFile composeFile, @Nullable Set activeProfiles, @Nullable List arguments) { this.composeFile = composeFile; - this.activeProfiles = (activeProfiles != null) ? activeProfiles : Collections.emptySet(); + this.activeProfiles = (activeProfiles != null) ? activeProfiles : emptySet(); this.arguments = (arguments != null) ? arguments : Collections.emptyList(); } diff --git a/core/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/annotation/StandardAnnotationCustomizableTypeExcludeFilter.java b/core/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/annotation/StandardAnnotationCustomizableTypeExcludeFilter.java index 3c68d037402b..532f7d6c054d 100644 --- a/core/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/annotation/StandardAnnotationCustomizableTypeExcludeFilter.java +++ b/core/spring-boot-test/src/main/java/org/springframework/boot/test/context/filter/annotation/StandardAnnotationCustomizableTypeExcludeFilter.java @@ -17,7 +17,6 @@ package org.springframework.boot.test.context.filter.annotation; import java.lang.annotation.Annotation; -import java.util.Collections; import java.util.HashSet; import java.util.Locale; import java.util.Set; @@ -29,6 +28,8 @@ import org.springframework.core.annotation.MergedAnnotations.SearchStrategy; import org.springframework.util.Assert; +import static java.util.Collections.emptySet; + /** * {@link AnnotationCustomizableTypeExcludeFilter} that can be used to any test annotation * that uses the standard {@code includeFilters}, {@code excludeFilters} and @@ -87,12 +88,12 @@ protected final Set> getDefaultIncludes() { } protected Set> getKnownIncludes() { - return Collections.emptySet(); + return emptySet(); } @Override protected Set> getComponentIncludes() { - return Collections.emptySet(); + return emptySet(); } @SuppressWarnings("unchecked") diff --git a/core/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/SslBundleSource.java b/core/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/SslBundleSource.java index d9cdca525deb..49722c09c66f 100644 --- a/core/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/SslBundleSource.java +++ b/core/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/SslBundleSource.java @@ -17,7 +17,6 @@ package org.springframework.boot.testcontainers.service.connection; import java.lang.annotation.Annotation; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; @@ -37,6 +36,8 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import static java.util.Collections.emptySet; + /** * {@link SslBundle} source created from annotations. Used as a cache key and as a * {@link SslBundle} factory. @@ -141,7 +142,7 @@ record SslBundleSource(@Nullable Ssl ssl, @Nullable PemKeyStore pemKeyStore, @Nu private static @Nullable A getAnnotation(@Nullable ListableBeanFactory beanFactory, @Nullable String beanName, @Nullable MergedAnnotations annotations, Class annotationType) { Set found = (beanFactory != null && beanName != null) - ? beanFactory.findAllAnnotationsOnBean(beanName, annotationType, false) : Collections.emptySet(); + ? beanFactory.findAllAnnotationsOnBean(beanName, annotationType, false) : emptySet(); if (annotations != null) { found = new LinkedHashSet<>(found); annotations.stream(annotationType).map(MergedAnnotation::synthesize).forEach(found::add); diff --git a/core/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java b/core/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java index c38474584f69..40213274abef 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/SpringApplication.java @@ -108,6 +108,8 @@ import org.springframework.util.function.ThrowingConsumer; import org.springframework.util.function.ThrowingSupplier; +import static java.util.Collections.emptySet; + /** * Class that can be used to bootstrap and launch a Spring application from a Java main * method. By default class will perform the following steps to bootstrap your @@ -234,7 +236,7 @@ public class SpringApplication { private final List bootstrapRegistryInitializers; - private Set additionalProfiles = Collections.emptySet(); + private Set additionalProfiles = emptySet(); private boolean isCustomEnvironment; @@ -1431,7 +1433,7 @@ public static int exit(ApplicationContext context, ExitCodeGenerator... exitCode */ public static SpringApplication.Augmented from(ThrowingConsumer main) { Assert.notNull(main, "'main' must not be null"); - return new Augmented(main, Collections.emptySet(), Collections.emptySet()); + return new Augmented(main, emptySet(), emptySet()); } /** diff --git a/core/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java b/core/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java index 3ebaf5bfb8dd..bd4ff5a0cc84 100644 --- a/core/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java +++ b/core/spring-boot/src/main/java/org/springframework/boot/context/config/ConfigData.java @@ -31,6 +31,8 @@ import org.springframework.core.env.PropertySource; import org.springframework.util.Assert; +import static java.util.Collections.emptySet; + /** * Configuration data that has been loaded from a {@link ConfigDataResource} and may * ultimately contribute {@link PropertySource property sources} to Spring's @@ -51,7 +53,7 @@ public final class ConfigData { /** * A {@link ConfigData} instance that contains no data. */ - public static final ConfigData EMPTY = new ConfigData(Collections.emptySet()); + public static final ConfigData EMPTY = new ConfigData(emptySet()); /** * Create a new {@link ConfigData} instance with the same options applied to each @@ -177,7 +179,7 @@ public static final class Options { /** * No options. */ - public static final Options NONE = new Options(Collections.emptySet()); + public static final Options NONE = new Options(emptySet()); private final Set