package org.ovirt.engine.core.utils.servlet; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang.LocaleUtils; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class UnsupportedLocaleHelper { private static final Logger log = LoggerFactory.getLogger(UnsupportedLocaleHelper.class); public static List<String> getDisplayedLocales(List<String> allLocales) { return getDisplayedLocales(allLocales, getLocalesKeys(ConfigValues.UnsupportedLocalesFilterOverrides), getLocalesKeys(ConfigValues.UnsupportedLocalesFilter)); } /** * Determine the list of locales to display by subtracting unsupported locales from the list of all locales, * but then adding back in locales we want to display anyway (locale overrides). * * Elements in the lists should be of format xx_YY, which is the standard Java Locale format. * @param allLocales List of all available locales. Cannot be null. * @param unsupportedLocalesFilterOverrides The list of unsupported locale overrides * (display them even though they're unsupported). Cannot be null * @param unsupportedLocalesFilter The list of unsupported locales. Cannot be null * @return The {@code List} of locales to display */ static List<String> getDisplayedLocales(List<String> allLocales, List<String> unsupportedLocalesFilterOverrides, List<String> unsupportedLocalesFilter) { List<String> result = new ArrayList<>(allLocales); //Override unsupported locales that we do want to display. List<String> unsupportedLocalesTemp = new ArrayList<>(unsupportedLocalesFilter); unsupportedLocalesTemp.removeAll(unsupportedLocalesFilterOverrides); //Remove remaining unsupported locales from the result. result.removeAll(unsupportedLocalesTemp); Collections.sort(result); return result; } /** * Get the locale keys from the configuration based on the {@code ConfigValues} passed in. Has to be either * ConfigValues.UnsupportedLocalesFilter or ConfigValues.UnsupportedLocalesFilterOverrides. Will throw an * {@code IllegalArgumentException} otherwise. * @param configValues The key to use to look up the values. * @return The value as a {@code List} of {@code Strings}. */ public static List<String> getLocalesKeys(ConfigValues configValues) { if (!configValues.equals(ConfigValues.UnsupportedLocalesFilter) && !configValues.equals(ConfigValues.UnsupportedLocalesFilterOverrides)) { throw new IllegalArgumentException("Passed in config value not related to locales"); //$NON-NLS-1$ } List<String> locales = Config.getValue(configValues); List<String> result = new ArrayList<>(); if (locales != null && !locales.isEmpty()) { for (String localeKey: locales) { if (!StringUtils.isBlank(localeKey)) { try { //Check for valid locale. String underScoredLocaleKey = localeKey.replaceAll("-", "_"); LocaleUtils.toLocale(underScoredLocaleKey); result.add(underScoredLocaleKey); } catch (IllegalArgumentException iae) { //The locale passed in is not valid, don't add it to the list. log.info("Invalid locale found in configuration '{}'", localeKey); //$NON-NLS-1$ } } } } return result; } }