@@ -400,28 +400,26 @@ private Locale _deserializeLocale(String value, DeserializationContext ctxt)
400
400
return new Locale (first , value );
401
401
}
402
402
String second = value .substring (0 , ix );
403
- if (!_isScriptOrExtensionPresent (value )) {
403
+ // [databind#3259]: Support for BCP 47 java.util.Locale ser/deser
404
+ int extMarkerIx = value .indexOf (LOCALE_EXT_MARKER );
405
+ if (extMarkerIx < 0 ) {
404
406
return new Locale (first , second , value .substring (ix +1 ));
405
407
}
406
- // Issue #3259: Support for BCP 47 java.util.Locale Serialization / De-serialization
407
- return _deSerializeBCP47Locale (value , ix , first , second );
408
+ return _deSerializeBCP47Locale (value , ix , first , second , extMarkerIx );
408
409
}
409
410
410
- private boolean _isScriptOrExtensionPresent (String value ) {
411
- return value .contains (LOCALE_EXT_MARKER );
412
- }
413
-
414
- private Locale _deSerializeBCP47Locale (String value , int ix , String first , String second ) {
411
+ private Locale _deSerializeBCP47Locale (String value , int ix , String first , String second ,
412
+ int extMarkerIx )
413
+ {
415
414
String third = "" ;
416
415
try {
417
- int scriptExpIx = value .indexOf ("_#" );
418
416
// Below condition checks if variant value is present to handle empty variant values such as
419
417
// en__#Latn_x-ext
420
418
// _US_#Latn
421
- if (scriptExpIx > 0 && scriptExpIx > ix ) {
422
- third = value .substring (ix + 1 , scriptExpIx );
419
+ if (extMarkerIx > 0 && extMarkerIx > ix ) {
420
+ third = value .substring (ix + 1 , extMarkerIx );
423
421
}
424
- value = value .substring (scriptExpIx + 2 );
422
+ value = value .substring (extMarkerIx + 2 );
425
423
426
424
if (value .indexOf ('_' ) < 0 && value .indexOf ('-' ) < 0 ) {
427
425
return new Locale .Builder ().setLanguage (first )
@@ -440,7 +438,8 @@ private Locale _deSerializeBCP47Locale(String value, int ix, String first, Strin
440
438
.setScript (value .substring (0 , ix ))
441
439
.setExtension (value .charAt (ix + 1 ), value .substring (ix + 3 ))
442
440
.build ();
443
- } catch (IllformedLocaleException ex ) {
441
+ } catch (IllformedLocaleException ex ) {
442
+ // should we really just swallow the exception?
444
443
return new Locale (first , second , third );
445
444
}
446
445
}
0 commit comments