Skip to content

Commit 860c1fd

Browse files
sebersolebrmeyer
authored andcommitted
HHH-8207 - Locale conversion is broken
Conflicts: hibernate-core/src/main/java/org/hibernate/type/descriptor/java/LocaleTypeDescriptor.java
1 parent 700ec50 commit 860c1fd

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/LocaleTypeDescriptor.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,15 @@ public String toString(Locale value) {
5959
}
6060

6161
public Locale fromString(String string) {
62-
StringTokenizer tokens = new StringTokenizer( string, "_" );
63-
String language = tokens.hasMoreTokens() ? tokens.nextToken() : "";
64-
String country = tokens.hasMoreTokens() ? tokens.nextToken() : "";
65-
// Need to account for allowable '_' within the variant
62+
// TODO : Ultimately switch to Locale.Builder for this. However, Locale.Builder is Java 7
63+
64+
final StringTokenizer tokens = new StringTokenizer( string, "_" );
65+
final String language = tokens.hasMoreTokens() && string.charAt(0) != '_' ? tokens.nextToken() : "";
66+
final String country = tokens.hasMoreTokens() && string.charAt(string.indexOf(language) + language.length() + 1) != '_' ? tokens.nextToken() : "";
67+
68+
// Need to account for allowable '_' within the variant. The underscore within the variant delimits "subtags".
69+
// Technically the reference spec (IETF BCP 47) also allows dash ("-") as a variant subtag delimiter.
70+
// Note that this code block supports both approaches...
6671
String variant = "";
6772
String sep = "";
6873
while ( tokens.hasMoreTokens() ) {

hibernate-core/src/test/java/org/hibernate/test/type/descriptor/java/LocaleTypeDescriptorTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@
4242
* @author Steve Ebersole
4343
*/
4444
public class LocaleTypeDescriptorTest extends BaseUnitTestCase {
45+
4546
@Test
4647
public void testConversionFromString() {
4748
assertEquals( toLocale( "de", null, null ), LocaleTypeDescriptor.INSTANCE.fromString( "de" ) );
4849
assertEquals( toLocale( "de", "DE", null ), LocaleTypeDescriptor.INSTANCE.fromString( "de_DE" ) );
4950
assertEquals( toLocale( null, "DE", null ), LocaleTypeDescriptor.INSTANCE.fromString( "_DE" ) );
50-
assertEquals( toLocale( null, null, "ch" ), LocaleTypeDescriptor.INSTANCE.fromString( "__ch" ) );
51-
assertEquals( toLocale( null, "DE", "ch" ), LocaleTypeDescriptor.INSTANCE.fromString( "_DE_ch" ) );
52-
assertEquals( toLocale( "de", null, "ch" ), LocaleTypeDescriptor.INSTANCE.fromString( "de__ch" ) );
53-
assertEquals( toLocale( "de", "DE", "ch" ), LocaleTypeDescriptor.INSTANCE.fromString( "de_DE_ch" ) );
51+
assertEquals( toLocale( null, null, "ch123" ), LocaleTypeDescriptor.INSTANCE.fromString( "__ch123" ) );
52+
assertEquals( toLocale( null, "DE", "ch123" ), LocaleTypeDescriptor.INSTANCE.fromString( "_DE_ch123" ) );
53+
assertEquals( toLocale( "de", null, "ch123" ), LocaleTypeDescriptor.INSTANCE.fromString( "de__ch123" ) );
54+
assertEquals( toLocale( "de", "DE", "ch123" ), LocaleTypeDescriptor.INSTANCE.fromString( "de_DE_ch123" ) );
5455
}
5556

5657
public Locale toLocale(String lang, String region, String variant) {

0 commit comments

Comments
 (0)