Consolidate locale parsing. (#26400)

Mappings and ingest have different locale parsing code.
This commit is contained in:
Adrien Grand 2017-08-30 10:58:33 +02:00 committed by GitHub
parent 06b7f9c78e
commit 34a6c7af26
3 changed files with 20 additions and 29 deletions

View File

@ -103,15 +103,4 @@ public class LocaleUtils {
throw new IllegalArgumentException("Locales can have at most 3 parts but got " + parts.length + ": " + Arrays.asList(parts)); throw new IllegalArgumentException("Locales can have at most 3 parts but got " + parts.length + ": " + Arrays.asList(parts));
} }
} }
/**
* Validate a {@link Locale} object
*/
public static boolean isValid(Locale locale) {
try {
return locale.getISO3Language() != null && locale.getISO3Country() != null;
} catch (MissingResourceException e) {
return false;
}
}
} }

View File

@ -111,7 +111,6 @@ public final class DateProcessor extends AbstractProcessor {
public static final class Factory implements Processor.Factory { public static final class Factory implements Processor.Factory {
@SuppressWarnings("unchecked")
public DateProcessor create(Map<String, Processor.Factory> registry, String processorTag, public DateProcessor create(Map<String, Processor.Factory> registry, String processorTag,
Map<String, Object> config) throws Exception { Map<String, Object> config) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
@ -119,16 +118,9 @@ public final class DateProcessor extends AbstractProcessor {
String timezoneString = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "timezone"); String timezoneString = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "timezone");
DateTimeZone timezone = timezoneString == null ? DateTimeZone.UTC : DateTimeZone.forID(timezoneString); DateTimeZone timezone = timezoneString == null ? DateTimeZone.UTC : DateTimeZone.forID(timezoneString);
String localeString = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "locale"); String localeString = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "locale");
Locale locale = Locale.ENGLISH; Locale locale = Locale.ROOT;
if (localeString != null) { if (localeString != null) {
try { locale = LocaleUtils.parse(localeString);
locale = (new Locale.Builder()).setLanguageTag(localeString).build();
} catch (IllformedLocaleException e) {
throw new IllegalArgumentException("Invalid language tag specified: " + localeString);
}
if (!LocaleUtils.isValid(locale)) {
throw new IllegalArgumentException("Invalid language tag specified: " + localeString);
}
} }
List<String> formats = ConfigurationUtils.readList(TYPE, processorTag, config, "formats"); List<String> formats = ConfigurationUtils.readList(TYPE, processorTag, config, "formats");
return new DateProcessor(processorTag, timezone, locale, field, formats, targetField); return new DateProcessor(processorTag, timezone, locale, field, formats, targetField);

View File

@ -46,7 +46,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
assertThat(processor.getField(), equalTo(sourceField)); assertThat(processor.getField(), equalTo(sourceField));
assertThat(processor.getTargetField(), equalTo(DateProcessor.DEFAULT_TARGET_FIELD)); assertThat(processor.getTargetField(), equalTo(DateProcessor.DEFAULT_TARGET_FIELD));
assertThat(processor.getFormats(), equalTo(Collections.singletonList("dd/MM/yyyyy"))); assertThat(processor.getFormats(), equalTo(Collections.singletonList("dd/MM/yyyyy")));
assertThat(processor.getLocale(), equalTo(Locale.ENGLISH)); assertThat(processor.getLocale(), equalTo(Locale.ROOT));
assertThat(processor.getTimezone(), equalTo(DateTimeZone.UTC)); assertThat(processor.getTimezone(), equalTo(DateTimeZone.UTC));
} }
@ -95,7 +95,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
} }
public void testParseInvalidLocale() throws Exception { public void testParseInvalidLocale() throws Exception {
String[] locales = new String[] { "invalid_locale", "english", "xy", "en-XY" }; String[] locales = new String[] { "invalid_locale", "english", "xy", "xy-US" };
for (String locale : locales) { for (String locale : locales) {
DateProcessor.Factory factory = new DateProcessor.Factory(); DateProcessor.Factory factory = new DateProcessor.Factory();
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
@ -103,12 +103,22 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("field", sourceField); config.put("field", sourceField);
config.put("formats", Collections.singletonList("dd/MM/yyyyy")); config.put("formats", Collections.singletonList("dd/MM/yyyyy"));
config.put("locale", locale); config.put("locale", locale);
try { IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
factory.create(null, null, config); () -> factory.create(null, null, config));
fail("should fail with invalid locale"); assertThat(e.getMessage(), equalTo("Unknown language: " + locale.split("[_-]")[0]));
} catch(IllegalArgumentException e) { }
assertThat(e.getMessage(), equalTo("Invalid language tag specified: " + locale));
} locales = new String[] { "en-XY", "en-Canada" };
for (String locale : locales) {
DateProcessor.Factory factory = new DateProcessor.Factory();
Map<String, Object> config = new HashMap<>();
String sourceField = randomAlphaOfLengthBetween(1, 10);
config.put("field", sourceField);
config.put("formats", Collections.singletonList("dd/MM/yyyyy"));
config.put("locale", locale);
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
() -> factory.create(null, null, config));
assertThat(e.getMessage(), equalTo("Unknown country: " + locale.split("[_-]")[1]));
} }
} }