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 &amp;p=}, {@code &amp;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