package org.vaadin.viritin.util;
import com.vaadin.server.VaadinRequest;
import org.vaadin.viritin.util.VaadinLocale.LocaleNegotiationStrategey;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
/**
* Implementation of {@link LocaleNegotiationStrategey} which uses java 1.8
* {@link Locale#lookup(List, Collection)} to negotiate the best locale.
*
* @author Daniel Nordhoff-Vergien
*
*/
public class Java8LocaleNegotiationStrategy implements
LocaleNegotiationStrategey {
@Override
public Locale negotiate(List<Locale> supportedLocales,
VaadinRequest vaadinRequest) {
String languages = vaadinRequest.getHeader("Accept-Language");
try {
// Use reflection here, so the code compiles with jdk 1.7
Class<?> languageRange = Class
.forName("java.util.Locale$LanguageRange");
Method parse = languageRange.getMethod("parse", String.class);
Object priorityList = parse.invoke(null, languages);
Method lookup = Locale.class.getMethod("lookup", List.class,
Collection.class);
return (Locale) lookup.invoke(null, priorityList, supportedLocales);
} catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | NoSuchMethodException | SecurityException | InvocationTargetException e) {
throw new RuntimeException(
"Java8LocaleNegotiontionStrategy need java 1.8 or newer.",
e);
}
}
}