package org.ripple.power.i18n.message;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Locale;
import org.ripple.power.i18n.message.annotations.Message;
import org.ripple.power.i18n.message.annotations.Messages;
public abstract class MessageHandler implements InvocationHandler {
/**
*
*/
protected final Class<?> proxiedInterface;
public MessageHandler(Class<?> proxiedInterface) {
this.proxiedInterface = proxiedInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Messages messageBundle = method.getAnnotation(Messages.class);
if (messageBundle == null) {
throw new IllegalStateException("Messages Annotation does not set.");
}
Locale locale = Locale.getDefault();
Message[] messages = messageBundle.value();
String format = bestFitFormat(locale, messages);
return format(locale, format, args);
}
static String bestFitFormat(Locale locale, Message[] messages) {
String lang = locale.getLanguage();
String country = locale.getCountry();
String variant = locale.getVariant();
String[] localeList = new String[] { "", lang, lang + "_" + country,
lang + "_" + country + "_" + variant };
String[] formats = new String[] { "", "", "", "", "", "" };
int mostFit = 0;
for (Message message : messages) {
String localeStr = message.locale();
for (int i = mostFit; i < localeList.length; i++) {
if (localeList[i].equals(localeStr)) {
mostFit++;
formats[mostFit] = message.value();
break;
}
}
}
return formats[mostFit];
}
protected abstract String format(Locale locale, String format, Object[] args);
}