diff --git a/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java b/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java index d1edbcd1df..d5c6014d2d 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java @@ -19,6 +19,7 @@ package org.springframework.boot.build; import java.io.File; import java.util.Collections; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask; @@ -111,7 +112,7 @@ class AsciidoctorConventions { asciidoctorTask.baseDirFollowsSourceDir(); createSyncDocumentationSourceTask(project, asciidoctorTask); if (asciidoctorTask instanceof AsciidoctorTask task) { - boolean pdf = task.getName().toLowerCase().contains("pdf"); + boolean pdf = task.getName().toLowerCase(Locale.ROOT).contains("pdf"); String backend = (!pdf) ? "spring-html" : "spring-pdf"; task.outputOptions((outputOptions) -> outputOptions.backends(backend)); } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/properties/BuildType.java b/buildSrc/src/main/java/org/springframework/boot/build/properties/BuildType.java index fa430dda44..428b7b423c 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/properties/BuildType.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/properties/BuildType.java @@ -16,6 +16,8 @@ package org.springframework.boot.build.properties; +import java.util.Locale; + /** * The type of build being performed. * @@ -34,7 +36,7 @@ public enum BuildType { COMMERCIAL; public String toIdentifier() { - return toString().replace("_", "").toLowerCase(); + return toString().replace("_", "").toLowerCase(Locale.ROOT); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/OnAvailableEndpointCondition.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/OnAvailableEndpointCondition.java index a485aa2a4a..4c896539ed 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/OnAvailableEndpointCondition.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/OnAvailableEndpointCondition.java @@ -20,6 +20,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -118,7 +119,7 @@ class OnAvailableEndpointCondition extends SpringBootCondition { for (ExposureFilter exposureFilter : exposureFilters) { if (exposuresToCheck.contains(exposureFilter.getExposure()) && exposureFilter.isExposed(endpointId)) { return ConditionOutcome.match(message.because("marked as exposed by a 'management.endpoints." - + exposureFilter.getExposure().name().toLowerCase() + ".exposure' property")); + + exposureFilter.getExposure().name().toLowerCase(Locale.ROOT) + ".exposure' property")); } } return ConditionOutcome.noMatch(message.because("no 'management.endpoints' property marked it as exposed")); @@ -187,7 +188,7 @@ class OnAvailableEndpointCondition extends SpringBootCondition { if (EndpointExposure.CLOUD_FOUNDRY.equals(exposure)) { return "cloud-foundry"; } - return exposure.name().toLowerCase(); + return exposure.name().toLowerCase(Locale.ROOT); } EndpointExposure getExposure() { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java index 492e43792d..b8f6c074ed 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.autoconfigure.tracing.otlp; +import java.util.Locale; import java.util.Map.Entry; import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter; @@ -78,7 +79,7 @@ class OtlpTracingConfigurations { OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder() .setEndpoint(connectionDetails.getUrl()) .setTimeout(properties.getTimeout()) - .setCompression(properties.getCompression().name().toLowerCase()); + .setCompression(properties.getCompression().name().toLowerCase(Locale.ROOT)); for (Entry header : properties.getHeaders().entrySet()) { builder.addHeader(header.getKey(), header.getValue()); } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/web/exchanges/HttpExchange.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/web/exchanges/HttpExchange.java index 375b5fc853..bd6c5f82c9 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/web/exchanges/HttpExchange.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/web/exchanges/HttpExchange.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.function.Supplier; @@ -434,7 +435,7 @@ public final class HttpExchange { void excludeUnless(String header, Include exception) { if (!this.includes.contains(exception)) { - this.filteredHeaderNames.add(header.toLowerCase()); + this.filteredHeaderNames.add(header.toLowerCase(Locale.ROOT)); } } @@ -444,7 +445,7 @@ public final class HttpExchange { } Map> filtered = new LinkedHashMap<>(); headers.forEach((name, value) -> { - if (!this.filteredHeaderNames.contains(name.toLowerCase())) { + if (!this.filteredHeaderNames.contains(name.toLowerCase(Locale.ROOT))) { filtered.put(name, value); } }); diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationMethodTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationMethodTests.java index 3227e787f4..36f6d0b9a5 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationMethodTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationMethodTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.actuate.endpoint.annotation; import java.lang.reflect.Method; +import java.util.Locale; import org.junit.jupiter.api.Test; @@ -76,7 +77,7 @@ class DiscoveredOperationMethodTests { @Override public MimeType getProducedMimeType() { - return new MimeType(toString().toLowerCase()); + return new MimeType(toString().toLowerCase(Locale.ROOT)); } } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactoryTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactoryTests.java index 3fcefeb69f..5b38a3e16a 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactoryTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactoryTests.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -254,7 +255,7 @@ class DiscoveredOperationsFactoryTests { @Override public MimeType getProducedMimeType() { - return new MimeType(toString().toLowerCase()); + return new MimeType(toString().toLowerCase(Locale.ROOT)); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerPropertiesMapper.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerPropertiesMapper.java index e53d587e19..5e907d7de2 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerPropertiesMapper.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerPropertiesMapper.java @@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.security.oauth2.server.servlet; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerProperties.Client; import org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerProperties.Registration; @@ -123,7 +124,7 @@ final class OAuth2AuthorizationServerPropertiesMapper { } private JwsAlgorithm jwsAlgorithm(String signingAlgorithm) { - String name = signingAlgorithm.toUpperCase(); + String name = signingAlgorithm.toUpperCase(Locale.ROOT); JwsAlgorithm jwsAlgorithm = SignatureAlgorithm.from(name); if (jwsAlgorithm == null) { jwsAlgorithm = MacAlgorithm.from(name); @@ -132,7 +133,7 @@ final class OAuth2AuthorizationServerPropertiesMapper { } private SignatureAlgorithm signatureAlgorithm(String signatureAlgorithm) { - return SignatureAlgorithm.from(signatureAlgorithm.toUpperCase()); + return SignatureAlgorithm.from(signatureAlgorithm.toUpperCase(Locale.ROOT)); } } diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java index fc68becc1c..0aebce045d 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java @@ -24,6 +24,7 @@ import java.net.SocketTimeoutException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Base64; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -81,7 +82,7 @@ class Connection { * @throws Exception in case of errors */ void run() throws Exception { - String lowerCaseHeader = this.header.toLowerCase(); + String lowerCaseHeader = this.header.toLowerCase(Locale.ROOT); if (lowerCaseHeader.contains("upgrade: websocket") && lowerCaseHeader.contains("sec-websocket-version: 13")) { runWebSocket(); } diff --git a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/livereload/LiveReloadServerTests.java b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/livereload/LiveReloadServerTests.java index 2211602fcb..943f3d8a34 100644 --- a/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/livereload/LiveReloadServerTests.java +++ b/spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/livereload/LiveReloadServerTests.java @@ -27,6 +27,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.concurrent.Callable; @@ -338,7 +339,7 @@ class LiveReloadServerTests { @Override public void beforeRequest(Map> requestHeaders) { Map> uppercaseRequestHeaders = new LinkedHashMap<>(); - requestHeaders.forEach((key, value) -> uppercaseRequestHeaders.put(key.toUpperCase(), value)); + requestHeaders.forEach((key, value) -> uppercaseRequestHeaders.put(key.toUpperCase(Locale.ROOT), value)); requestHeaders.clear(); requestHeaders.putAll(uppercaseRequestHeaders); requestHeaders.putAll(this.headers); diff --git a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/ProcessRunner.java b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/ProcessRunner.java index a027bbb175..e8c8ae3958 100644 --- a/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/ProcessRunner.java +++ b/spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/ProcessRunner.java @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; +import java.util.Locale; import java.util.concurrent.CountDownLatch; import java.util.function.Consumer; @@ -42,7 +43,7 @@ class ProcessRunner { private static final String USR_LOCAL_BIN = "/usr/local/bin"; - private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase().contains("mac"); + private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("mac"); private static final Log logger = LogFactory.getLog(ProcessRunner.class); diff --git a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/messaging/kafka/streams/MyKafkaStreamsConfiguration.java b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/messaging/kafka/streams/MyKafkaStreamsConfiguration.java index 23ea0b9008..b848ef796c 100644 --- a/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/messaging/kafka/streams/MyKafkaStreamsConfiguration.java +++ b/spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/messaging/kafka/streams/MyKafkaStreamsConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.boot.docs.messaging.kafka.streams; +import java.util.Locale; + import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.KeyValue; import org.apache.kafka.streams.StreamsBuilder; @@ -39,7 +41,7 @@ public class MyKafkaStreamsConfiguration { } private KeyValue uppercaseValue(Integer key, String value) { - return new KeyValue<>(key, value.toUpperCase()); + return new KeyValue<>(key, value.toUpperCase(Locale.getDefault())); } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/filter/StandardAnnotationCustomizableTypeExcludeFilter.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/filter/StandardAnnotationCustomizableTypeExcludeFilter.java index 8a9f0da2cf..64e56e6b86 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/filter/StandardAnnotationCustomizableTypeExcludeFilter.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/filter/StandardAnnotationCustomizableTypeExcludeFilter.java @@ -18,6 +18,7 @@ package org.springframework.boot.test.autoconfigure.filter; import java.lang.annotation.Annotation; import java.util.Collections; +import java.util.Locale; import java.util.Set; import org.springframework.context.annotation.ComponentScan.Filter; @@ -45,7 +46,7 @@ public abstract class StandardAnnotationCustomizableTypeExcludeFilter "File '" + jarFile + "' is not a JAR"); + Assert.isTrue(filename.toLowerCase(Locale.ROOT).endsWith(".jar"), () -> "File '" + jarFile + "' is not a JAR"); filename = filename.substring(0, filename.length() - 4); int firstDot = filename.indexOf('.'); if (firstDot == -1) { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java index c70207eddb..c3cc0a5808 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java @@ -625,7 +625,7 @@ abstract class AbstractBootArchiveIntegrationTests { protected void copyApplication(String name) throws IOException { File output = new File(this.gradleBuild.getProjectDir(), - "src/main/java/com/example/" + this.taskName.toLowerCase() + "/" + name); + "src/main/java/com/example/" + this.taskName.toLowerCase(Locale.ROOT) + "/" + name); output.mkdirs(); FileSystemUtils.copyRecursively( new File("src/test/java/com/example/" + this.taskName.toLowerCase(Locale.ENGLISH) + "/" + name), diff --git a/spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/Context.java b/spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/Context.java index 4be9b946f4..b35cbec234 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/Context.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/Context.java @@ -25,6 +25,7 @@ import java.net.URLConnection; import java.nio.file.Paths; import java.security.CodeSource; import java.security.ProtectionDomain; +import java.util.Locale; import java.util.jar.JarFile; import org.springframework.util.Assert; @@ -67,7 +68,7 @@ class Context { } private boolean isJarOrWar(File jarFile) { - String name = jarFile.getName().toLowerCase(); + String name = jarFile.getName().toLowerCase(Locale.ROOT); return name.endsWith(".jar") || name.endsWith(".war"); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/FileUtils.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/FileUtils.java index 0347e1cbe6..1a41ab82f0 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/FileUtils.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/FileUtils.java @@ -18,6 +18,7 @@ package org.springframework.boot.loader.tools; import java.io.File; import java.io.IOException; +import java.util.Locale; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -88,7 +89,7 @@ public abstract class FileUtils { } private static boolean isDigestName(Object name) { - return String.valueOf(name).toUpperCase().endsWith("-DIGEST"); + return String.valueOf(name).toUpperCase(Locale.ROOT).endsWith("-DIGEST"); } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Layer.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Layer.java index 484bc2286c..9e980b0eb7 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Layer.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Layer.java @@ -16,6 +16,7 @@ package org.springframework.boot.loader.tools; +import java.util.Locale; import java.util.regex.Pattern; import org.springframework.util.Assert; @@ -41,7 +42,7 @@ public class Layer { public Layer(String name) { Assert.hasText(name, "Name must not be empty"); Assert.isTrue(PATTERN.matcher(name).matches(), () -> "Malformed layer name '" + name + "'"); - Assert.isTrue(!name.equalsIgnoreCase("ext") && !name.toLowerCase().startsWith("springboot"), + Assert.isTrue(!name.equalsIgnoreCase("ext") && !name.toLowerCase(Locale.ROOT).startsWith("springboot"), () -> "Layer name '" + name + "' is reserved"); this.name = name; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java index 764c84f9fd..1206c4536f 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java @@ -19,6 +19,7 @@ package org.springframework.boot.loader.tools; import java.io.File; import java.io.IOException; import java.nio.file.attribute.FileTime; +import java.util.Locale; import java.util.Map; import java.util.jar.JarFile; @@ -50,7 +51,7 @@ public class Repackager extends Packager { @Override protected void writeSignatureFileIfNecessary(Map writtenLibraries, AbstractJarWriter writer) throws IOException { - if (getSource().getName().toLowerCase().endsWith(".jar") && hasSignedLibrary(writtenLibraries)) { + if (getSource().getName().toLowerCase(Locale.ROOT).endsWith(".jar") && hasSignedLibrary(writtenLibraries)) { writer.writeEntry("META-INF/BOOT.SF", (entryWriter) -> { }); } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.java index e8ce0f503d..8bfa598eef 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.java @@ -18,6 +18,7 @@ package org.springframework.boot.loader.net.protocol.jar; import java.lang.ref.SoftReference; import java.net.URL; +import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -54,10 +55,10 @@ final class JarFileUrlKey { String host = url.getHost(); int port = (url.getPort() != -1) ? url.getPort() : url.getDefaultPort(); String file = url.getFile(); - value.append(protocol.toLowerCase()); + value.append(protocol.toLowerCase(Locale.ROOT)); value.append(":"); if (host != null && !host.isEmpty()) { - value.append(host.toLowerCase()); + value.append(host.toLowerCase(Locale.ROOT)); value.append((port != -1) ? ":" + port : ""); } value.append((file != null) ? file : ""); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/process/DisabledIfProcessUnavailableCondition.java b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/process/DisabledIfProcessUnavailableCondition.java index 0e48896d98..6121246599 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/process/DisabledIfProcessUnavailableCondition.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/process/DisabledIfProcessUnavailableCondition.java @@ -19,6 +19,7 @@ package org.springframework.boot.testsupport.process; import java.lang.reflect.AnnotatedElement; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.concurrent.TimeUnit; import java.util.stream.Stream; @@ -42,7 +43,7 @@ class DisabledIfProcessUnavailableCondition implements ExecutionCondition { private static final String USR_LOCAL_BIN = "/usr/local/bin"; - private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase().contains("mac"); + private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("mac"); @Override public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/ConfigTreePropertySource.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/ConfigTreePropertySource.java index ae3737c547..e8faf1f96b 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/ConfigTreePropertySource.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/ConfigTreePropertySource.java @@ -26,6 +26,7 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -212,7 +213,7 @@ public class ConfigTreePropertySource extends EnumerablePropertySource imp String name = getName(sourceDirectory.relativize(path)); if (StringUtils.hasText(name)) { if (options.contains(Option.USE_LOWERCASE_NAMES)) { - name = name.toLowerCase(); + name = name.toLowerCase(Locale.getDefault()); } propertyFiles.put(name, new PropertyFile(path, options)); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/PortInUseException.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/PortInUseException.java index 360c28ce71..22e6b9010b 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/PortInUseException.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/server/PortInUseException.java @@ -17,6 +17,7 @@ package org.springframework.boot.web.server; import java.net.BindException; +import java.util.Locale; import java.util.function.Consumer; import java.util.function.IntSupplier; @@ -81,7 +82,7 @@ public class PortInUseException extends WebServerException { public static void ifPortBindingException(Exception ex, Consumer action) { ifCausedBy(ex, BindException.class, (bindException) -> { // bind exception can be also thrown because an address can't be assigned - if (bindException.getMessage().toLowerCase().contains("in use")) { + if (bindException.getMessage().toLowerCase(Locale.ROOT).contains("in use")) { action.accept(bindException); } }); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/SpringConfigurationPropertySourceTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/SpringConfigurationPropertySourceTests.java index ec870d734b..70ad170308 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/SpringConfigurationPropertySourceTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/source/SpringConfigurationPropertySourceTests.java @@ -17,6 +17,7 @@ package org.springframework.boot.context.properties.source; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.Map; import org.junit.jupiter.api.Test; @@ -239,7 +240,7 @@ class SpringConfigurationPropertySourceTests { @Override public Object getProperty(String name) { - name = name.toLowerCase(); + name = name.toLowerCase(Locale.ROOT); if (!name.startsWith(this.prefix)) { return null; } diff --git a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/dockerTest/java/org/springframework/boot/launchscript/AbstractLaunchScriptIntegrationTests.java b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/dockerTest/java/org/springframework/boot/launchscript/AbstractLaunchScriptIntegrationTests.java index 7a2f0edee2..0cdc24e927 100644 --- a/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/dockerTest/java/org/springframework/boot/launchscript/AbstractLaunchScriptIntegrationTests.java +++ b/spring-boot-tests/spring-boot-integration-tests/spring-boot-launch-script-tests/src/dockerTest/java/org/springframework/boot/launchscript/AbstractLaunchScriptIntegrationTests.java @@ -20,6 +20,7 @@ import java.io.File; import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.function.Predicate; import org.assertj.core.api.Condition; @@ -115,7 +116,7 @@ abstract class AbstractLaunchScriptIntegrationTests { private static ImageFromDockerfile createImage(String os, String version) { ImageFromDockerfile image = new ImageFromDockerfile( - "spring-boot-launch-script/" + os.toLowerCase() + "-" + version); + "spring-boot-launch-script/" + os.toLowerCase(Locale.ROOT) + "-" + version); image.withFileFromFile("Dockerfile", new File("src/dockerTest/resources/conf/" + os + "/" + version + "/Dockerfile")); for (File file : new File("build/downloads/jdk/bellsoft").listFiles()) {