Skip to content

Commit a306065

Browse files
committed
Call String.toLowerCase and .toUppercase with explicit locale
Closes gh-42719
1 parent 666e0c1 commit a306065

File tree

25 files changed

+54
-29
lines changed

25 files changed

+54
-29
lines changed

buildSrc/src/main/java/org/springframework/boot/build/AsciidoctorConventions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.File;
2020
import java.util.Collections;
2121
import java.util.HashMap;
22+
import java.util.Locale;
2223
import java.util.Map;
2324

2425
import org.asciidoctor.gradle.jvm.AbstractAsciidoctorTask;
@@ -111,7 +112,7 @@ private void configureAsciidoctorTask(Project project, AbstractAsciidoctorTask a
111112
asciidoctorTask.baseDirFollowsSourceDir();
112113
createSyncDocumentationSourceTask(project, asciidoctorTask);
113114
if (asciidoctorTask instanceof AsciidoctorTask task) {
114-
boolean pdf = task.getName().toLowerCase().contains("pdf");
115+
boolean pdf = task.getName().toLowerCase(Locale.ROOT).contains("pdf");
115116
String backend = (!pdf) ? "spring-html" : "spring-pdf";
116117
task.outputOptions((outputOptions) -> outputOptions.backends(backend));
117118
}

buildSrc/src/main/java/org/springframework/boot/build/properties/BuildType.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.build.properties;
1818

19+
import java.util.Locale;
20+
1921
/**
2022
* The type of build being performed.
2123
*
@@ -34,7 +36,7 @@ public enum BuildType {
3436
COMMERCIAL;
3537

3638
public String toIdentifier() {
37-
return toString().replace("_", "").toLowerCase();
39+
return toString().replace("_", "").toLowerCase(Locale.ROOT);
3840
}
3941

4042
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/condition/OnAvailableEndpointCondition.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.EnumSet;
2121
import java.util.HashSet;
2222
import java.util.LinkedHashSet;
23+
import java.util.Locale;
2324
import java.util.Map;
2425
import java.util.Optional;
2526
import java.util.Set;
@@ -118,7 +119,7 @@ private ConditionOutcome getMatchOutcome(Environment environment,
118119
for (ExposureFilter exposureFilter : exposureFilters) {
119120
if (exposuresToCheck.contains(exposureFilter.getExposure()) && exposureFilter.isExposed(endpointId)) {
120121
return ConditionOutcome.match(message.because("marked as exposed by a 'management.endpoints."
121-
+ exposureFilter.getExposure().name().toLowerCase() + ".exposure' property"));
122+
+ exposureFilter.getExposure().name().toLowerCase(Locale.ROOT) + ".exposure' property"));
122123
}
123124
}
124125
return ConditionOutcome.noMatch(message.because("no 'management.endpoints' property marked it as exposed"));
@@ -187,7 +188,7 @@ private static String getCanonicalName(EndpointExposure exposure) {
187188
if (EndpointExposure.CLOUD_FOUNDRY.equals(exposure)) {
188189
return "cloud-foundry";
189190
}
190-
return exposure.name().toLowerCase();
191+
return exposure.name().toLowerCase(Locale.ROOT);
191192
}
192193

193194
EndpointExposure getExposure() {

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/tracing/otlp/OtlpTracingConfigurations.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.tracing.otlp;
1818

19+
import java.util.Locale;
1920
import java.util.Map.Entry;
2021

2122
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
@@ -78,7 +79,7 @@ OtlpHttpSpanExporter otlpHttpSpanExporter(OtlpProperties properties,
7879
OtlpHttpSpanExporterBuilder builder = OtlpHttpSpanExporter.builder()
7980
.setEndpoint(connectionDetails.getUrl())
8081
.setTimeout(properties.getTimeout())
81-
.setCompression(properties.getCompression().name().toLowerCase());
82+
.setCompression(properties.getCompression().name().toLowerCase(Locale.ROOT));
8283
for (Entry<String, String> header : properties.getHeaders().entrySet()) {
8384
builder.addHeader(header.getKey(), header.getValue());
8485
}

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/web/exchanges/HttpExchange.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.HashSet;
2626
import java.util.LinkedHashMap;
2727
import java.util.List;
28+
import java.util.Locale;
2829
import java.util.Map;
2930
import java.util.Set;
3031
import java.util.function.Supplier;
@@ -434,7 +435,7 @@ private static class HeadersFilter {
434435

435436
void excludeUnless(String header, Include exception) {
436437
if (!this.includes.contains(exception)) {
437-
this.filteredHeaderNames.add(header.toLowerCase());
438+
this.filteredHeaderNames.add(header.toLowerCase(Locale.ROOT));
438439
}
439440
}
440441

@@ -444,7 +445,7 @@ Map<String, List<String>> apply(Map<String, List<String>> headers) {
444445
}
445446
Map<String, List<String>> filtered = new LinkedHashMap<>();
446447
headers.forEach((name, value) -> {
447-
if (!this.filteredHeaderNames.contains(name.toLowerCase())) {
448+
if (!this.filteredHeaderNames.contains(name.toLowerCase(Locale.ROOT))) {
448449
filtered.put(name, value);
449450
}
450451
});

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationMethodTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.boot.actuate.endpoint.annotation;
1818

1919
import java.lang.reflect.Method;
20+
import java.util.Locale;
2021

2122
import org.junit.jupiter.api.Test;
2223

@@ -76,7 +77,7 @@ enum ExampleProducible implements Producible<ExampleProducible> {
7677

7778
@Override
7879
public MimeType getProducedMimeType() {
79-
return new MimeType(toString().toLowerCase());
80+
return new MimeType(toString().toLowerCase(Locale.ROOT));
8081
}
8182

8283
}

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/annotation/DiscoveredOperationsFactoryTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Collection;
2121
import java.util.Collections;
2222
import java.util.List;
23+
import java.util.Locale;
2324
import java.util.Map;
2425

2526
import org.junit.jupiter.api.BeforeEach;
@@ -254,7 +255,7 @@ enum ExampleProducible implements Producible<ExampleProducible> {
254255

255256
@Override
256257
public MimeType getProducedMimeType() {
257-
return new MimeType(toString().toLowerCase());
258+
return new MimeType(toString().toLowerCase(Locale.ROOT));
258259
}
259260

260261
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/server/servlet/OAuth2AuthorizationServerPropertiesMapper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import java.util.Locale;
2122

2223
import org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerProperties.Client;
2324
import org.springframework.boot.autoconfigure.security.oauth2.server.servlet.OAuth2AuthorizationServerProperties.Registration;
@@ -123,7 +124,7 @@ private TokenSettings getTokenSettings(Client client, PropertyMapper map) {
123124
}
124125

125126
private JwsAlgorithm jwsAlgorithm(String signingAlgorithm) {
126-
String name = signingAlgorithm.toUpperCase();
127+
String name = signingAlgorithm.toUpperCase(Locale.ROOT);
127128
JwsAlgorithm jwsAlgorithm = SignatureAlgorithm.from(name);
128129
if (jwsAlgorithm == null) {
129130
jwsAlgorithm = MacAlgorithm.from(name);
@@ -132,7 +133,7 @@ private JwsAlgorithm jwsAlgorithm(String signingAlgorithm) {
132133
}
133134

134135
private SignatureAlgorithm signatureAlgorithm(String signatureAlgorithm) {
135-
return SignatureAlgorithm.from(signatureAlgorithm.toUpperCase());
136+
return SignatureAlgorithm.from(signatureAlgorithm.toUpperCase(Locale.ROOT));
136137
}
137138

138139
}

spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/livereload/Connection.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.security.MessageDigest;
2525
import java.security.NoSuchAlgorithmException;
2626
import java.util.Base64;
27+
import java.util.Locale;
2728
import java.util.regex.Matcher;
2829
import java.util.regex.Pattern;
2930

@@ -81,7 +82,7 @@ class Connection {
8182
* @throws Exception in case of errors
8283
*/
8384
void run() throws Exception {
84-
String lowerCaseHeader = this.header.toLowerCase();
85+
String lowerCaseHeader = this.header.toLowerCase(Locale.ROOT);
8586
if (lowerCaseHeader.contains("upgrade: websocket") && lowerCaseHeader.contains("sec-websocket-version: 13")) {
8687
runWebSocket();
8788
}

spring-boot-project/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/livereload/LiveReloadServerTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.ArrayList;
2828
import java.util.LinkedHashMap;
2929
import java.util.List;
30+
import java.util.Locale;
3031
import java.util.Map;
3132
import java.util.Objects;
3233
import java.util.concurrent.Callable;
@@ -338,7 +339,7 @@ private static class UppercaseWebSocketClientConfigurator extends Configurator {
338339
@Override
339340
public void beforeRequest(Map<String, List<String>> requestHeaders) {
340341
Map<String, List<String>> uppercaseRequestHeaders = new LinkedHashMap<>();
341-
requestHeaders.forEach((key, value) -> uppercaseRequestHeaders.put(key.toUpperCase(), value));
342+
requestHeaders.forEach((key, value) -> uppercaseRequestHeaders.put(key.toUpperCase(Locale.ROOT), value));
342343
requestHeaders.clear();
343344
requestHeaders.putAll(uppercaseRequestHeaders);
344345
requestHeaders.putAll(this.headers);

spring-boot-project/spring-boot-docker-compose/src/main/java/org/springframework/boot/docker/compose/core/ProcessRunner.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.io.InputStreamReader;
2424
import java.io.UncheckedIOException;
2525
import java.nio.charset.StandardCharsets;
26+
import java.util.Locale;
2627
import java.util.concurrent.CountDownLatch;
2728
import java.util.function.Consumer;
2829

@@ -42,7 +43,7 @@ class ProcessRunner {
4243

4344
private static final String USR_LOCAL_BIN = "/usr/local/bin";
4445

45-
private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase().contains("mac");
46+
private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("mac");
4647

4748
private static final Log logger = LogFactory.getLog(ProcessRunner.class);
4849

spring-boot-project/spring-boot-docs/src/main/java/org/springframework/boot/docs/messaging/kafka/streams/MyKafkaStreamsConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.docs.messaging.kafka.streams;
1818

19+
import java.util.Locale;
20+
1921
import org.apache.kafka.common.serialization.Serdes;
2022
import org.apache.kafka.streams.KeyValue;
2123
import org.apache.kafka.streams.StreamsBuilder;
@@ -39,7 +41,7 @@ public KStream<Integer, String> kStream(StreamsBuilder streamsBuilder) {
3941
}
4042

4143
private KeyValue<Integer, String> uppercaseValue(Integer key, String value) {
42-
return new KeyValue<>(key, value.toUpperCase());
44+
return new KeyValue<>(key, value.toUpperCase(Locale.getDefault()));
4345
}
4446

4547
}

spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/filter/StandardAnnotationCustomizableTypeExcludeFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.lang.annotation.Annotation;
2020
import java.util.Collections;
21+
import java.util.Locale;
2122
import java.util.Set;
2223

2324
import org.springframework.context.annotation.ComponentScan.Filter;
@@ -45,7 +46,7 @@ public abstract class StandardAnnotationCustomizableTypeExcludeFilter<A extends
4546
FilterType[] filterValues = FilterType.values();
4647
FILTER_TYPE_ATTRIBUTES = new String[filterValues.length];
4748
for (int i = 0; i < filterValues.length; i++) {
48-
FILTER_TYPE_ATTRIBUTES[i] = filterValues[i].name().toLowerCase() + "Filters";
49+
FILTER_TYPE_ATTRIBUTES[i] = filterValues[i].name().toLowerCase(Locale.ROOT) + "Filters";
4950
}
5051
}
5152

spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/type/ImageReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public ImageReference inTaggedOrDigestForm() {
187187
*/
188188
public static ImageReference forJarFile(File jarFile) {
189189
String filename = jarFile.getName();
190-
Assert.isTrue(filename.toLowerCase().endsWith(".jar"), () -> "File '" + jarFile + "' is not a JAR");
190+
Assert.isTrue(filename.toLowerCase(Locale.ROOT).endsWith(".jar"), () -> "File '" + jarFile + "' is not a JAR");
191191
filename = filename.substring(0, filename.length() - 4);
192192
int firstDot = filename.indexOf('.');
193193
if (firstDot == -1) {

spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/tasks/bundling/AbstractBootArchiveIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ private void copyMainClassApplication() throws IOException {
625625

626626
protected void copyApplication(String name) throws IOException {
627627
File output = new File(this.gradleBuild.getProjectDir(),
628-
"src/main/java/com/example/" + this.taskName.toLowerCase() + "/" + name);
628+
"src/main/java/com/example/" + this.taskName.toLowerCase(Locale.ROOT) + "/" + name);
629629
output.mkdirs();
630630
FileSystemUtils.copyRecursively(
631631
new File("src/test/java/com/example/" + this.taskName.toLowerCase(Locale.ENGLISH) + "/" + name),

spring-boot-project/spring-boot-tools/spring-boot-jarmode-layertools/src/main/java/org/springframework/boot/jarmode/layertools/Context.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.nio.file.Paths;
2626
import java.security.CodeSource;
2727
import java.security.ProtectionDomain;
28+
import java.util.Locale;
2829
import java.util.jar.JarFile;
2930

3031
import org.springframework.util.Assert;
@@ -67,7 +68,7 @@ private boolean isExistingFile(File archiveFile) {
6768
}
6869

6970
private boolean isJarOrWar(File jarFile) {
70-
String name = jarFile.getName().toLowerCase();
71+
String name = jarFile.getName().toLowerCase(Locale.ROOT);
7172
return name.endsWith(".jar") || name.endsWith(".war");
7273
}
7374

spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/FileUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21+
import java.util.Locale;
2122
import java.util.jar.Attributes;
2223
import java.util.jar.JarFile;
2324
import java.util.jar.Manifest;
@@ -88,7 +89,7 @@ private static boolean hasDigestName(Attributes attributes) {
8889
}
8990

9091
private static boolean isDigestName(Object name) {
91-
return String.valueOf(name).toUpperCase().endsWith("-DIGEST");
92+
return String.valueOf(name).toUpperCase(Locale.ROOT).endsWith("-DIGEST");
9293
}
9394

9495
}

spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Layer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.loader.tools;
1818

19+
import java.util.Locale;
1920
import java.util.regex.Pattern;
2021

2122
import org.springframework.util.Assert;
@@ -41,7 +42,7 @@ public class Layer {
4142
public Layer(String name) {
4243
Assert.hasText(name, "Name must not be empty");
4344
Assert.isTrue(PATTERN.matcher(name).matches(), () -> "Malformed layer name '" + name + "'");
44-
Assert.isTrue(!name.equalsIgnoreCase("ext") && !name.toLowerCase().startsWith("springboot"),
45+
Assert.isTrue(!name.equalsIgnoreCase("ext") && !name.toLowerCase(Locale.ROOT).startsWith("springboot"),
4546
() -> "Layer name '" + name + "' is reserved");
4647
this.name = name;
4748
}

spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/Repackager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.io.File;
2020
import java.io.IOException;
2121
import java.nio.file.attribute.FileTime;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import java.util.jar.JarFile;
2425

@@ -50,7 +51,7 @@ public Repackager(File source) {
5051
@Override
5152
protected void writeSignatureFileIfNecessary(Map<String, Library> writtenLibraries, AbstractJarWriter writer)
5253
throws IOException {
53-
if (getSource().getName().toLowerCase().endsWith(".jar") && hasSignedLibrary(writtenLibraries)) {
54+
if (getSource().getName().toLowerCase(Locale.ROOT).endsWith(".jar") && hasSignedLibrary(writtenLibraries)) {
5455
writer.writeEntry("META-INF/BOOT.SF", (entryWriter) -> {
5556
});
5657
}

spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/net/protocol/jar/JarFileUrlKey.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.lang.ref.SoftReference;
2020
import java.net.URL;
21+
import java.util.Locale;
2122
import java.util.Map;
2223
import java.util.concurrent.ConcurrentHashMap;
2324

@@ -54,10 +55,10 @@ private static String create(URL url) {
5455
String host = url.getHost();
5556
int port = (url.getPort() != -1) ? url.getPort() : url.getDefaultPort();
5657
String file = url.getFile();
57-
value.append(protocol.toLowerCase());
58+
value.append(protocol.toLowerCase(Locale.ROOT));
5859
value.append(":");
5960
if (host != null && !host.isEmpty()) {
60-
value.append(host.toLowerCase());
61+
value.append(host.toLowerCase(Locale.ROOT));
6162
value.append((port != -1) ? ":" + port : "");
6263
}
6364
value.append((file != null) ? file : "");

spring-boot-project/spring-boot-tools/spring-boot-test-support/src/main/java/org/springframework/boot/testsupport/process/DisabledIfProcessUnavailableCondition.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.lang.reflect.AnnotatedElement;
2020
import java.util.ArrayList;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.concurrent.TimeUnit;
2324
import java.util.stream.Stream;
2425

@@ -42,7 +43,7 @@ class DisabledIfProcessUnavailableCondition implements ExecutionCondition {
4243

4344
private static final String USR_LOCAL_BIN = "/usr/local/bin";
4445

45-
private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase().contains("mac");
46+
private static final boolean MAC_OS = System.getProperty("os.name").toLowerCase(Locale.ROOT).contains("mac");
4647

4748
@Override
4849
public ConditionEvaluationResult evaluateExecutionCondition(ExtensionContext context) {

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/env/ConfigTreePropertySource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Arrays;
2727
import java.util.Collections;
2828
import java.util.EnumSet;
29+
import java.util.Locale;
2930
import java.util.Map;
3031
import java.util.Set;
3132
import java.util.TreeMap;
@@ -212,7 +213,7 @@ static Map<String, PropertyFile> findAll(Path sourceDirectory, Set<Option> optio
212213
String name = getName(sourceDirectory.relativize(path));
213214
if (StringUtils.hasText(name)) {
214215
if (options.contains(Option.USE_LOWERCASE_NAMES)) {
215-
name = name.toLowerCase();
216+
name = name.toLowerCase(Locale.getDefault());
216217
}
217218
propertyFiles.put(name, new PropertyFile(path, options));
218219
}

0 commit comments

Comments
 (0)