From 5e226111d515dfd57e718a1edd28924f31da954c Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Sat, 29 May 2021 19:12:46 -0400 Subject: [PATCH 1/3] LANG-1172: Support dash as a delimiter in locales --- .../java/org/apache/commons/lang3/LocaleUtils.java | 11 +++++++---- .../org/apache/commons/lang3/LocaleUtilsTest.java | 6 +++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/LocaleUtils.java b/src/main/java/org/apache/commons/lang3/LocaleUtils.java index dbade05fce4..e505bce6650 100644 --- a/src/main/java/org/apache/commons/lang3/LocaleUtils.java +++ b/src/main/java/org/apache/commons/lang3/LocaleUtils.java @@ -248,7 +248,9 @@ private static Locale parseLocale(final String str) { return new Locale(str); } - final String[] segments = str.split("_", -1); + final String[] segments = str.contains("-") + ? str.split("-", -1) + : str.split("_", -1); final String language = segments[0]; if (segments.length == 2) { final String country = segments[1]; @@ -289,6 +291,7 @@ public static Locale toLocale(final Locale locale) { * LocaleUtils.toLocale("") = new Locale("", "") * LocaleUtils.toLocale("en") = new Locale("en", "") * LocaleUtils.toLocale("en_GB") = new Locale("en", "GB") + * LocaleUtils.toLocale("en-GB") = new Locale("en", "GB") * LocaleUtils.toLocale("en_001") = new Locale("en", "001") * LocaleUtils.toLocale("en_GB_xxx") = new Locale("en", "GB", "xxx") (#) * @@ -300,7 +303,7 @@ public static Locale toLocale(final Locale locale) { *

This method validates the input strictly. * The language code must be lowercase. * The country code must be uppercase. - * The separator must be an underscore. + * The separator must be an underscore or a dash. * The length must be correct. *

* @@ -325,7 +328,7 @@ public static Locale toLocale(final String str) { throw new IllegalArgumentException("Invalid locale format: " + str); } final char ch0 = str.charAt(0); - if (ch0 == '_') { + if (ch0 == '_' || ch0 == '-') { if (len < 3) { throw new IllegalArgumentException("Invalid locale format: " + str); } @@ -340,7 +343,7 @@ public static Locale toLocale(final String str) { if (len < 5) { throw new IllegalArgumentException("Invalid locale format: " + str); } - if (str.charAt(3) != '_') { + if (str.charAt(3) != ch0) { throw new IllegalArgumentException("Invalid locale format: " + str); } return new Locale(StringUtils.EMPTY, str.substring(1, 3), str.substring(4)); diff --git a/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java b/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java index d8bd84dd147..112f5baec32 100644 --- a/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/LocaleUtilsTest.java @@ -170,11 +170,10 @@ public void testToLocale_1Part() { @Test public void testToLocale_2Part() { assertValidToLocale("us_EN", "us", "EN"); + assertValidToLocale("us-EN", "us", "EN"); //valid though doesn't exist assertValidToLocale("us_ZH", "us", "ZH"); - assertThrows( - IllegalArgumentException.class, () -> LocaleUtils.toLocale("us-EN"), "Should fail as not underscore"); assertThrows( IllegalArgumentException.class, () -> LocaleUtils.toLocale("us_En"), @@ -203,6 +202,7 @@ public void testToLocale_2Part() { @Test public void testToLocale_3Part() { assertValidToLocale("us_EN_A", "us", "EN", "A"); + assertValidToLocale("us-EN-A", "us", "EN", "A"); // this isn't pretty, but was caused by a jdk bug it seems // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4210525 if (SystemUtils.isJavaVersionAtLeast(JAVA_1_4)) { @@ -214,7 +214,7 @@ public void testToLocale_3Part() { } assertThrows( - IllegalArgumentException.class, () -> LocaleUtils.toLocale("us_EN-a"), "Should fail as not underscore"); + IllegalArgumentException.class, () -> LocaleUtils.toLocale("us_EN-a"), "Should fail as no consistent delimiter"); assertThrows( IllegalArgumentException.class, () -> LocaleUtils.toLocale("uu_UU_"), "Must be 3, 5 or 7+ in length"); } From 730e156f9da1964a188537f485191b0f6defd81b Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Mon, 8 Nov 2021 20:57:31 -0500 Subject: [PATCH 2/3] Extract constants for dash and underscore --- .../java/org/apache/commons/lang3/LocaleUtils.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/LocaleUtils.java b/src/main/java/org/apache/commons/lang3/LocaleUtils.java index e505bce6650..a7908454339 100644 --- a/src/main/java/org/apache/commons/lang3/LocaleUtils.java +++ b/src/main/java/org/apache/commons/lang3/LocaleUtils.java @@ -36,6 +36,8 @@ * @since 2.2 */ public class LocaleUtils { + private static final char UNDERSCORE = '_'; + private static final char DASH = '-'; // class to avoid synchronization (Init on demand) static class SyncAvoid { @@ -248,9 +250,9 @@ private static Locale parseLocale(final String str) { return new Locale(str); } - final String[] segments = str.contains("-") - ? str.split("-", -1) - : str.split("_", -1); + final String[] segments = str.indexOf(DASH) != -1 + ? str.split(String.valueOf(DASH), -1) + : str.split(String.valueOf(UNDERSCORE), -1); final String language = segments[0]; if (segments.length == 2) { final String country = segments[1]; @@ -328,7 +330,7 @@ public static Locale toLocale(final String str) { throw new IllegalArgumentException("Invalid locale format: " + str); } final char ch0 = str.charAt(0); - if (ch0 == '_' || ch0 == '-') { + if (ch0 == UNDERSCORE || ch0 == DASH) { if (len < 3) { throw new IllegalArgumentException("Invalid locale format: " + str); } From 0319d84d1c68b1335fd23570143aec454ad66108 Mon Sep 17 00:00:00 2001 From: Clemens Wolff Date: Mon, 6 Dec 2021 11:52:59 -0500 Subject: [PATCH 3/3] Prioritize old delimiter in comparison order --- src/main/java/org/apache/commons/lang3/LocaleUtils.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/LocaleUtils.java b/src/main/java/org/apache/commons/lang3/LocaleUtils.java index a7908454339..c09cb1da904 100644 --- a/src/main/java/org/apache/commons/lang3/LocaleUtils.java +++ b/src/main/java/org/apache/commons/lang3/LocaleUtils.java @@ -250,9 +250,9 @@ private static Locale parseLocale(final String str) { return new Locale(str); } - final String[] segments = str.indexOf(DASH) != -1 - ? str.split(String.valueOf(DASH), -1) - : str.split(String.valueOf(UNDERSCORE), -1); + final String[] segments = str.indexOf(UNDERSCORE) != -1 + ? str.split(String.valueOf(UNDERSCORE), -1) + : str.split(String.valueOf(DASH), -1); final String language = segments[0]; if (segments.length == 2) { final String country = segments[1];