You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2026/07/17 12:45:13 UTC
(juneau) 02/02: TODO-255: Add Locale.ROOT casing helpers and sweep parse/match sites onto them
This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
commit 11c403c3e6e04bf8d563f43af229cae3a9aafbd5
Author: James Bognar <ja...@apache.org>
AuthorDate: Fri Jul 17 08:44:59 2026 -0400
TODO-255: Add Locale.ROOT casing helpers and sweep parse/match sites onto them
Adds Shorts.lcr/ucr and StringUtils.lowerCaseRoot/upperCaseRoot as
locale-independent (Locale.ROOT) casing helpers for parse/match/normalize
code paths, and sweeps ~22 parse/match main files (+2 test files) off
default-locale and Locale.ENGLISH casing onto them. Includes converting the
three REST HTTP-method sites (RestOpContext, RestSession, RestOperation) that
previously used toUpperCase(Locale.ENGLISH) for consistency with the sweep.
Co-authored-by: Cursor <cu...@cursor.com>
---
.../apache/juneau/bean/swagger/OperationMap.java | 10 ++---
.../juneau/commons/collections/CacheMode.java | 4 +-
.../commons/httppart/HttpPartCollectionFormat.java | 6 ++-
.../juneau/commons/httppart/HttpPartDataType.java | 6 ++-
.../juneau/commons/httppart/HttpPartFormat.java | 6 ++-
.../apache/juneau/commons/io/MimeTypeDetector.java | 4 +-
.../apache/juneau/commons/settings/Settings.java | 2 +-
.../org/apache/juneau/commons/utils/Shorts.java | 26 +++++++++++
.../apache/juneau/commons/utils/StringUtils.java | 52 +++++++++++++++++-----
.../apache/juneau/commons/utils/Shorts_Test.java | 12 +++++
.../juneau/commons/utils/StringUtils_Test.java | 26 +++++++++++
.../juneau/rest/client/classic/RestOperation.java | 5 ++-
.../client/classic/remote/RemoteOperationMeta.java | 4 +-
.../java/org/apache/juneau/http/HttpMethod.java | 2 +-
.../juneau/http/remote/RrpcInterfaceMeta.java | 4 +-
.../apache/juneau/rest/common/utils/HttpUtils.java | 8 ++--
.../apache/juneau/rest/server/RestOpContext.java | 2 +-
.../apache/juneau/rest/server/RestOperations.java | 2 +-
.../org/apache/juneau/rest/server/RestRequest.java | 2 +-
.../org/apache/juneau/rest/server/RestSession.java | 2 +-
.../rest/server/httppart/RequestFormParamList.java | 2 +-
.../rest/server/httppart/RequestHeaderList.java | 4 +-
.../rest/server/httppart/RequestPathParamList.java | 2 +-
.../server/httppart/RequestQueryParamList.java | 2 +-
.../rest/server/logger/CallLoggingDetail.java | 2 +-
.../swagger/BasicSwaggerProviderSession.java | 2 +-
.../server/config/repository/GetConfiguration.java | 3 +-
27 files changed, 155 insertions(+), 47 deletions(-)
diff --git a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
index 9f101667b6..b9ac396de9 100644
--- a/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
+++ b/juneau-bean/juneau-bean-swagger-v2/src/main/java/org/apache/juneau/bean/swagger/OperationMap.java
@@ -105,12 +105,12 @@ public class OperationMap extends TreeMap<String,Operation> {
@Override
public int compare(String o1, String o2) {
// Since keys are now stored in lowercase, we need to normalize them for comparison
- var s1 = methods.get(emptyIfNull(o1).toLowerCase());
- var s2 = methods.get(emptyIfNull(o2).toLowerCase());
+ var s1 = methods.get(lcr(emptyIfNull(o1)));
+ var s2 = methods.get(lcr(emptyIfNull(o2)));
if (s1 == null)
- s1 = emptyIfNull(o1).toLowerCase();
+ s1 = lcr(emptyIfNull(o1));
if (s2 == null)
- s2 = emptyIfNull(o2).toLowerCase();
+ s2 = lcr(emptyIfNull(o2));
return StringUtils.compare(s1, s2);
}
};
@@ -143,6 +143,6 @@ public class OperationMap extends TreeMap<String,Operation> {
*/
@Override
public Operation put(String key, Operation value) {
- return super.put(emptyIfNull(key).toLowerCase(), value);
+ return super.put(lcr(emptyIfNull(key)), value);
}
}
\ No newline at end of file
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/CacheMode.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/CacheMode.java
index e9c099ad99..02d82c5bd8 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/CacheMode.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/collections/CacheMode.java
@@ -16,6 +16,8 @@
*/
package org.apache.juneau.commons.collections;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
/**
* Cache modes for {@link Cache} and related cache classes.
*
@@ -122,7 +124,7 @@ public enum CacheMode {
public static CacheMode parse(String value) {
if (value == null)
return FULL;
- return switch (value.toUpperCase()) {
+ return switch (ucr(value)) {
case CONST_NONE -> NONE;
case CONST_WEAK -> WEAK;
case CONST_FULL -> FULL;
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartCollectionFormat.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartCollectionFormat.java
index 1480293eb7..907b656f18 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartCollectionFormat.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartCollectionFormat.java
@@ -16,6 +16,8 @@
*/
package org.apache.juneau.commons.httppart;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
/**
* Valid values for the <c>collectionFormat</c> field.
*
@@ -71,11 +73,11 @@ public enum HttpPartCollectionFormat {
return null;
if (value.equalsIgnoreCase("UON"))
return UONC;
- return valueOf(value.toUpperCase());
+ return valueOf(ucr(value));
}
@Override /* Overridden from Object */
public String toString() {
- return name().toLowerCase();
+ return lcr(name());
}
}
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartDataType.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartDataType.java
index 64860d7a38..462054ca60 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartDataType.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartDataType.java
@@ -16,6 +16,8 @@
*/
package org.apache.juneau.commons.httppart;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
/**
* Valid values for the <c>type</c> field.
*
@@ -72,11 +74,11 @@ public enum HttpPartDataType {
* @return The enum.
*/
public static HttpPartDataType fromString(String value) {
- return valueOf(value.toUpperCase());
+ return valueOf(ucr(value));
}
@Override /* Overridden from Object */
public String toString() {
- return name().toLowerCase();
+ return lcr(name());
}
}
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartFormat.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartFormat.java
index 487fd6df91..6567d96d1d 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartFormat.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/httppart/HttpPartFormat.java
@@ -16,6 +16,8 @@
*/
package org.apache.juneau.commons.httppart;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
/**
* Valid values for the <c>format</c> field.
*
@@ -218,7 +220,7 @@ public enum HttpPartFormat {
* @return The enum.
*/
public static HttpPartFormat fromString(String value) {
- value = value.toUpperCase().replace('-', '_');
+ value = ucr(value).replace('-', '_');
return valueOf(value);
}
@@ -237,6 +239,6 @@ public enum HttpPartFormat {
@Override /* Overridden from Object */
public String toString() {
- return name().toLowerCase().replace('_', '-');
+ return lcr(name()).replace('_', '-');
}
}
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/MimeTypeDetector.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/MimeTypeDetector.java
index 6f8d71ef53..097ffad108 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/MimeTypeDetector.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/io/MimeTypeDetector.java
@@ -113,7 +113,7 @@ public class MimeTypeDetector {
public Builder addExtensionType(String ext, String type) {
assertArgNotNullOrBlank(ARG_ext, ext);
assertArgNotNullOrBlank(ARG_type, type);
- extMap.put(ext.toLowerCase(), type);
+ extMap.put(lcr(ext), type);
return this;
}
@@ -371,7 +371,7 @@ public class MimeTypeDetector {
// Fall back to extension-based detection
var extension = getFileExtension(fileName);
if (ine(extension)) {
- var mimeType = extMap.get(extension.toLowerCase());
+ var mimeType = extMap.get(lcr(extension));
if (nn(mimeType)) {
return mimeType;
}
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/settings/Settings.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/settings/Settings.java
index 0dbedd78ed..70412752ac 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/settings/Settings.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/settings/Settings.java
@@ -184,7 +184,7 @@ public class Settings {
var v = SYSTEM_PROPERTY_SOURCE.get(property);
if (v.isPresent())
return v.value(); // Not testable
- v = SYSTEM_ENV_SOURCE.get(property.replace('.', '_').toUpperCase());
+ v = SYSTEM_ENV_SOURCE.get(ucr(property.replace('.', '_')));
if (v.isPresent())
return v.value(); // Not testable
return oe();
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Shorts.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Shorts.java
index 2d44b0e3a1..7676957438 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Shorts.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/Shorts.java
@@ -504,6 +504,19 @@ public class Shorts {
*/
public static String lc(String s) { return StringUtils.lowerCase(s); }
+ /**
+ * Converts the specified string to lower case using {@link Locale#ROOT} (null-safe).
+ *
+ * <p>
+ * Locale-independent — use for parse/match/normalize/key-fold code paths (as opposed to {@link #lc(String)},
+ * which uses the default locale and is intended for display casing).
+ *
+ * @param s The string.
+ * @return The lower-cased string, or null if null.
+ * @see StringUtils#lowerCaseRoot(String)
+ */
+ public static String lcr(String s) { return StringUtils.lowerCaseRoot(s); }
+
/**
* Converts the specified string to upper case (null-safe).
*
@@ -513,6 +526,19 @@ public class Shorts {
*/
public static String uc(String s) { return StringUtils.upperCase(s); }
+ /**
+ * Converts the specified string to upper case using {@link Locale#ROOT} (null-safe).
+ *
+ * <p>
+ * Locale-independent — use for parse/match/normalize/key-fold code paths (as opposed to {@link #uc(String)},
+ * which uses the default locale and is intended for display casing).
+ *
+ * @param s The string.
+ * @return The upper-cased string, or null if null.
+ * @see StringUtils#upperCaseRoot(String)
+ */
+ public static String ucr(String s) { return StringUtils.upperCaseRoot(s); }
+
/**
* Trims leading/trailing whitespace from the specified string (null-safe).
*
diff --git a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
index 38dc58be9f..b5a48e6549 100644
--- a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
+++ b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/StringUtils.java
@@ -1003,7 +1003,7 @@ public class StringUtils {
public static boolean containsIgnoreCase(String str, String search) {
if (str == null || search == null)
return false;
- return str.toLowerCase().contains(search.toLowerCase());
+ return str.toLowerCase(Locale.ROOT).contains(search.toLowerCase(Locale.ROOT));
}
/**
@@ -1423,7 +1423,7 @@ public class StringUtils {
public static boolean endsWithIgnoreCase(String str, String suffix) {
if (str == null || suffix == null)
return false;
- return str.toLowerCase().endsWith(suffix.toLowerCase());
+ return str.toLowerCase(Locale.ROOT).endsWith(suffix.toLowerCase(Locale.ROOT));
}
/**
@@ -2555,7 +2555,7 @@ public class StringUtils {
var unitStart = i;
while (i < len && LETTER.contains(s.charAt(i)))
i++;
- var unit = s.substring(unitStart, i).trim().toLowerCase();
+ var unit = s.substring(unitStart, i).trim().toLowerCase(Locale.ROOT);
// Convert to milliseconds
var ms = parseUnit(unit, value);
@@ -2815,7 +2815,7 @@ public class StringUtils {
public static int indexOfIgnoreCase(String str, String search) {
if (str == null || search == null)
return -1;
- return str.toLowerCase().indexOf(search.toLowerCase());
+ return str.toLowerCase(Locale.ROOT).indexOf(search.toLowerCase(Locale.ROOT));
}
/**
@@ -3912,7 +3912,7 @@ public class StringUtils {
return false;
// Remove separators and check if it's 12 hex digits
- var cleaned = mac.replaceAll("[:-]", "").toUpperCase();
+ var cleaned = mac.replaceAll("[:-]", "").toUpperCase(Locale.ROOT);
if (cleaned.length() != 12)
return false;
@@ -4292,7 +4292,7 @@ public class StringUtils {
public static int lastIndexOfIgnoreCase(String str, String search) {
if (str == null || search == null)
return -1;
- return str.toLowerCase().lastIndexOf(search.toLowerCase());
+ return str.toLowerCase(Locale.ROOT).lastIndexOf(search.toLowerCase(Locale.ROOT));
}
/**
@@ -4442,6 +4442,22 @@ public class StringUtils {
return s == null ? null : s.toLowerCase();
}
+ /**
+ * Null-safe convenience method for {@link String#toLowerCase(Locale)} using {@link Locale#ROOT}.
+ *
+ * <p>
+ * Locale-independent lower-casing for parse/match/normalize/key-fold code paths (as opposed to
+ * {@link #lowerCase(String)}, which uses the default locale and is intended for display casing).
+ *
+ * @param s The string to convert.
+ * @return The lowercase string, or <jk>null</jk> if the input was <jk>null</jk>.
+ * @see #upperCaseRoot(String)
+ * @see #lowerCase(String)
+ */
+ public static String lowerCaseRoot(String s) {
+ return s == null ? null : s.toLowerCase(Locale.ROOT);
+ }
+
/**
* Maps each element of a string array using the specified function.
*
@@ -4518,7 +4534,7 @@ public class StringUtils {
if (isEmpty(str))
return null;
- var upper = str.toUpperCase().replaceAll("[^A-Z]", "");
+ var upper = str.toUpperCase(Locale.ROOT).replaceAll("[^A-Z]", "");
if (upper.isEmpty())
return "";
@@ -6442,7 +6458,7 @@ public class StringUtils {
if (isEmpty(str))
return null;
- var upper = str.toUpperCase();
+ var upper = str.toUpperCase(Locale.ROOT);
var result = new StringBuilder(4);
result.append(upper.charAt(0));
@@ -7059,7 +7075,7 @@ public class StringUtils {
public static boolean startsWithIgnoreCase(String str, String prefix) {
if (str == null || prefix == null)
return false;
- return str.toLowerCase().startsWith(prefix.toLowerCase());
+ return str.toLowerCase(Locale.ROOT).startsWith(prefix.toLowerCase(Locale.ROOT));
}
/**
@@ -7807,6 +7823,22 @@ public class StringUtils {
return s == null ? null : s.toUpperCase();
}
+ /**
+ * Null-safe convenience method for {@link String#toUpperCase(Locale)} using {@link Locale#ROOT}.
+ *
+ * <p>
+ * Locale-independent upper-casing for parse/match/normalize/key-fold code paths (as opposed to
+ * {@link #upperCase(String)}, which uses the default locale and is intended for display casing).
+ *
+ * @param s The string to convert.
+ * @return The uppercase string, or <jk>null</jk> if the input was <jk>null</jk>.
+ * @see #lowerCaseRoot(String)
+ * @see #upperCase(String)
+ */
+ public static String upperCaseRoot(String s) {
+ return s == null ? null : s.toUpperCase(Locale.ROOT);
+ }
+
/**
* Decodes a <c>application/x-www-form-urlencoded</c> string using <c>UTF-8</c> encoding scheme.
*
@@ -8149,7 +8181,7 @@ public class StringUtils {
*/
private static int estimateSyllables(String word) {
- var lower = word.toLowerCase();
+ var lower = word.toLowerCase(Locale.ROOT);
var count = 0;
var prevWasVowel = false;
diff --git a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/Shorts_Test.java b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/Shorts_Test.java
index a27fb69eae..ecabc878b0 100644
--- a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/Shorts_Test.java
+++ b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/Shorts_Test.java
@@ -151,6 +151,18 @@ class Shorts_Test extends TestBase {
@Test
void b007_uc_upperCase() { assertEquals("ABC", uc("abc")); }
+ @Test
+ void b007a_lcr_lowerCaseRoot() {
+ assertEquals("abc", lcr("ABC"));
+ assertNull(lcr(null));
+ }
+
+ @Test
+ void b007b_ucr_upperCaseRoot() {
+ assertEquals("ABC", ucr("abc"));
+ assertNull(ucr(null));
+ }
+
@Test
void b008_tr_trim() { assertEquals("x", tr(" x ")); }
diff --git a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
index 9db2f669f2..720e120965 100755
--- a/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
+++ b/juneau-core/juneau-commons/src/test/java/org/apache/juneau/commons/utils/StringUtils_Test.java
@@ -3688,6 +3688,19 @@ class StringUtils_Test extends TestBase {
assertEquals("hello123", lowerCase("Hello123"));
}
+ //====================================================================================================
+ // lowerCaseRoot(String)
+ //====================================================================================================
+ @Test
+ void a122a_lowerCaseRoot() {
+ assertNull(lowerCaseRoot(null));
+ assertEquals("", lowerCaseRoot(""));
+ assertEquals("hello", lowerCaseRoot("Hello"));
+ assertEquals("hello", lowerCaseRoot("HELLO"));
+ // Locale.ROOT keeps ASCII 'I' -> 'i' regardless of default locale (e.g. Turkish).
+ assertEquals("id", lowerCaseRoot("ID"));
+ }
+
//====================================================================================================
// mapped(String[],Function<String,String>)
//====================================================================================================
@@ -6617,6 +6630,19 @@ class StringUtils_Test extends TestBase {
assertEquals("ABC", upperCase("abc"));
}
+ //====================================================================================================
+ // upperCaseRoot(String)
+ //====================================================================================================
+ @Test
+ void a226a_upperCaseRoot() {
+ assertNull(upperCaseRoot(null));
+ assertEquals("", upperCaseRoot(""));
+ assertEquals("HELLO", upperCaseRoot("hello"));
+ assertEquals("ABC", upperCaseRoot("abc"));
+ // Locale.ROOT keeps ASCII 'i' -> 'I' regardless of default locale (e.g. Turkish).
+ assertEquals("ID", upperCaseRoot("id"));
+ }
+
//====================================================================================================
// urlDecode(String)
//====================================================================================================
diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java
index 639b6f97ff..2797950683 100644
--- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java
+++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/RestOperation.java
@@ -16,8 +16,9 @@
*/
package org.apache.juneau.rest.client.classic;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
import java.net.*;
-import java.util.*;
import org.apache.http.client.utils.*;
import org.apache.juneau.http.*;
@@ -104,7 +105,7 @@ public class RestOperation {
*/
public RestOperation(String method, Object url, Object body) {
this.url = url;
- this.method = method.toUpperCase(Locale.ENGLISH);
+ this.method = ucr(method);
this.content = body;
this.hasContent = HttpMethod.hasContent(method);
}
diff --git a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/remote/RemoteOperationMeta.java b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/remote/RemoteOperationMeta.java
index 5834f53353..083c5816e1 100644
--- a/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/remote/RemoteOperationMeta.java
+++ b/juneau-rest/juneau-rest-client-classic/src/main/java/org/apache/juneau/rest/client/classic/remote/RemoteOperationMeta.java
@@ -80,8 +80,8 @@ public class RemoteOperationMeta {
var httpMethodValue = Holder.<String>empty();
var pathValue = Holder.<String>empty();
- al.stream().map(x -> x.getNameSimple().substring(6).toUpperCase()).filter(x -> ! x.equals("OP")).forEach(httpMethodValue::set);
- al.forEach(ai -> ai.getValue(String.class, "method").filter(NOT_EMPTY).ifPresent(x -> httpMethodValue.set(x.trim().toUpperCase())));
+ al.stream().map(x -> ucr(x.getNameSimple().substring(6))).filter(x -> ! x.equals("OP")).forEach(httpMethodValue::set);
+ al.forEach(ai -> ai.getValue(String.class, "method").filter(NOT_EMPTY).ifPresent(x -> httpMethodValue.set(ucr(x.trim()))));
al.forEach(ai -> ai.getValue(String.class, "path").filter(NOT_EMPTY).ifPresent(x -> pathValue.set(x.trim())));
httpMethod = httpMethodValue.orElse("").trim();
path = pathValue.orElse("").trim();
diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpMethod.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpMethod.java
index dca78c5a53..0329443dd6 100644
--- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpMethod.java
+++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpMethod.java
@@ -84,6 +84,6 @@ public class HttpMethod {
* @return <jk>true</jk> if specified http method has content.
*/
public static boolean hasContent(String name) {
- return ! NO_BODY_METHODS.contains(emptyIfNull(name).toUpperCase());
+ return ! NO_BODY_METHODS.contains(ucr(emptyIfNull(name)));
}
}
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
index 1afd6c7acf..e62dd2ae21 100644
--- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
+++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
@@ -516,9 +516,9 @@ public final class RrpcInterfaceMeta {
if (!v.isEmpty()) {
var i = v.indexOf(' ');
if (i == -1) {
- method = v.toUpperCase();
+ method = ucr(v);
} else {
- method = v.substring(0, i).trim().toUpperCase();
+ method = ucr(v.substring(0, i).trim());
path = v.substring(i).trim();
}
}
diff --git a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/rest/common/utils/HttpUtils.java b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/rest/common/utils/HttpUtils.java
index d2b4e91223..cf3f458001 100644
--- a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/rest/common/utils/HttpUtils.java
+++ b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/rest/common/utils/HttpUtils.java
@@ -16,6 +16,8 @@
*/
package org.apache.juneau.rest.common.utils;
+import static org.apache.juneau.commons.utils.Shorts.*;
+
import java.lang.reflect.*;
/**
@@ -47,14 +49,14 @@ public class HttpUtils {
String n = m.getName();
if (detectMethod) {
if (n.startsWith("do") && n.length() > 2) {
- String n2 = n.substring(2).toUpperCase();
+ String n2 = ucr(n.substring(2));
for (var t : UC_METHODS)
if (n2.equals(t))
return n2;
}
for (var t : LC_METHODS)
if (n.startsWith(t) && (n.length() == t.length() || Character.isUpperCase(n.charAt(t.length()))))
- return t.toUpperCase();
+ return ucr(t);
}
return def;
}
@@ -73,7 +75,7 @@ public class HttpUtils {
String n = m.getName();
if (method == null) {
if (n.startsWith("do") && n.length() > 2) {
- String n2 = n.substring(2).toUpperCase();
+ String n2 = ucr(n.substring(2));
for (var t : UC_METHODS)
if (n2.equals(t))
return "/";
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOpContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOpContext.java
index 4dea5ebc51..c75e665faa 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOpContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOpContext.java
@@ -1290,7 +1290,7 @@ public class RestOpContext extends Context implements Comparable<RestOpContext>
private static String normalizeHttpMethod(String v) {
if ("METHOD".equalsIgnoreCase(v))
return "*";
- return v.toUpperCase(Locale.ENGLISH);
+ return ucr(v);
}
/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOperations.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOperations.java
index 192d52cdad..3e7b1996f9 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOperations.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestOperations.java
@@ -76,7 +76,7 @@ public class RestOperations {
* @return Adds a method context to this builder.
*/
public Builder add(String httpMethodName, RestOpContext value) {
- httpMethodName = httpMethodName.toUpperCase();
+ httpMethodName = ucr(httpMethodName);
map.computeIfAbsent(httpMethodName, k -> new TreeSet<>()).add(value);
set.add(value);
return this;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestRequest.java
index eb2e488f68..e311429dca 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestRequest.java
@@ -1121,7 +1121,7 @@ public class RestRequest extends HttpServletRequestWrapper {
if (! swagger2.isPresent())
return oe();
- return o(swagger2.get().getOperation(opContext.getPathPattern(), getMethod().toLowerCase()));
+ return o(swagger2.get().getOperation(opContext.getPathPattern(), lcr(getMethod())));
}
/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestSession.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestSession.java
index 8619d04e4c..67c04d2f8f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestSession.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/RestSession.java
@@ -366,7 +366,7 @@ public class RestSession extends ContextSession {
if (method == null)
method = req.getMethod();
- method = method.toUpperCase(Locale.ENGLISH);
+ method = ucr(method);
}
return method;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestFormParamList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestFormParamList.java
index 7c2ea28376..e4b6f651c7 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestFormParamList.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestFormParamList.java
@@ -466,7 +466,7 @@ public class RequestFormParamList extends ArrayList<RequestFormParam> {
* Returns all the unique header names in this list.
* @return The list of all unique header names in this list.
*/
- public List<String> getNames() { return stream().map(RequestFormParam::getName).map(x -> caseSensitive ? x : x.toLowerCase()).distinct().toList(); }
+ public List<String> getNames() { return stream().map(RequestFormParam::getName).map(x -> caseSensitive ? x : lcr(x)).distinct().toList(); }
/**
* Returns all headers in sorted order.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestHeaderList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestHeaderList.java
index 5ef599a49e..687a7dd26f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestHeaderList.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestHeaderList.java
@@ -393,7 +393,7 @@ public class RequestHeaderList extends ArrayList<RequestHeader> {
* @return The list of all unique header names in this list.
* <br>List is unmodifiable.
*/
- public List<String> getNames() { return stream().map(RequestHeader::getName).map(x -> caseSensitive ? x : x.toLowerCase()).distinct().toList(); }
+ public List<String> getNames() { return stream().map(RequestHeader::getName).map(x -> caseSensitive ? x : lcr(x)).distinct().toList(); }
/**
* Returns all headers in sorted order.
@@ -521,6 +521,6 @@ public class RequestHeaderList extends ArrayList<RequestHeader> {
}
private String key(String name) {
- return caseSensitive ? name : name.toLowerCase();
+ return caseSensitive ? name : lcr(name);
}
}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestPathParamList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestPathParamList.java
index 85369b61f1..d0abf95e19 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestPathParamList.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestPathParamList.java
@@ -397,7 +397,7 @@ public class RequestPathParamList extends ArrayList<RequestPathParam> {
* @return The list of all unique header names in this list.
* <br>List is unmodifiable.
*/
- public List<String> getNames() { return stream().map(RequestPathParam::getName).map(x -> caseSensitive ? x : x.toLowerCase()).distinct().toList(); }
+ public List<String> getNames() { return stream().map(RequestPathParam::getName).map(x -> caseSensitive ? x : lcr(x)).distinct().toList(); }
/**
* Returns the decoded remainder of the URL following any path pattern matches.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestQueryParamList.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestQueryParamList.java
index 8815c90cd4..3d94b0e83e 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestQueryParamList.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/httppart/RequestQueryParamList.java
@@ -428,7 +428,7 @@ public class RequestQueryParamList extends ArrayList<RequestQueryParam> {
* @return The list of all unique header names in this list.
* <br>List is unmodifiable.
*/
- public List<String> getNames() { return stream().map(RequestQueryParam::getName).map(x -> caseSensitive ? x : x.toLowerCase()).distinct().toList(); }
+ public List<String> getNames() { return stream().map(RequestQueryParam::getName).map(x -> caseSensitive ? x : lcr(x)).distinct().toList(); }
/**
* Locates the position/limit query arguments ({@code &p=}, {@code &l=}) in the query string and returns them as a {@link PageArgs} object.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/logger/CallLoggingDetail.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/logger/CallLoggingDetail.java
index c2100b7f0d..ddce9af567 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/logger/CallLoggingDetail.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/logger/CallLoggingDetail.java
@@ -51,7 +51,7 @@ public enum CallLoggingDetail {
public static CallLoggingDetail fromString(String s) {
if (ine(s)) {
try {
- return valueOf(s.toUpperCase());
+ return valueOf(ucr(s));
} catch (@SuppressWarnings("unused") IllegalArgumentException e) {
// Invalid enum value - return null below
}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/swagger/BasicSwaggerProviderSession.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/swagger/BasicSwaggerProviderSession.java
index 84c0f90bb1..74762187f8 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/swagger/BasicSwaggerProviderSession.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/server/swagger/BasicSwaggerProviderSession.java
@@ -379,7 +379,7 @@ public class BasicSwaggerProviderSession {
continue;
// Get the operation from the existing swagger so far.
- var op = getOperation(omSwagger, sm.getPathPattern(), sm.getHttpMethod().toLowerCase());
+ var op = getOperation(omSwagger, sm.getPathPattern(), lcr(sm.getHttpMethod()));
op.append(parseMap(ms.value(), "@OpSwagger(value) on class %s method %s", c, m));
op.appendIf(ne, SWAGGER_operationId,
diff --git a/juneau-sc/juneau-sc-server/src/main/java/org/apache/juneau/server/config/repository/GetConfiguration.java b/juneau-sc/juneau-sc-server/src/main/java/org/apache/juneau/server/config/repository/GetConfiguration.java
index 7d07daf8d1..0502bd6f06 100644
--- a/juneau-sc/juneau-sc-server/src/main/java/org/apache/juneau/server/config/repository/GetConfiguration.java
+++ b/juneau-sc/juneau-sc-server/src/main/java/org/apache/juneau/server/config/repository/GetConfiguration.java
@@ -17,6 +17,7 @@
package org.apache.juneau.server.config.repository;
import static org.apache.juneau.commons.utils.FileUtils.*;
+import static org.apache.juneau.commons.utils.Shorts.*;
import java.io.*;
import java.nio.file.*;
@@ -81,7 +82,7 @@ public class GetConfiguration implements Command, GetValue<Map<String,ConfigItem
gitControl.branch(branch);
gitControl.pullFromRepo();
- var fileDefaultStr = APPLICATION.toLowerCase().concat(EXT);
+ var fileDefaultStr = lcr(APPLICATION).concat(EXT);
var fileProjectStr = this.project.concat(EXT);
// Resolve the config file names under the checkout root through the shared boundary check