package org.liveSense.server.i18n;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang.LocaleUtils;
import com.google.gwt.i18n.client.Constants;
import com.google.gwt.i18n.client.Messages;
public class I18N {
private static final Map<String,WeakReference<Object>> cache = new ConcurrentHashMap<String, WeakReference<Object>>();
private static final Map<String,WeakReference<GenericX>> cacheHandlers = new ConcurrentHashMap<String, WeakReference<GenericX>>();
public static boolean useCache = true;
public static void resetCache() {
cache.clear();
}
public static <T> T create(Class<T> itf) throws IOException {
return create(itf, (Locale)null, (ClassLoader)null);
}
public static <T> T create(Class<T> itf, ResourceBundle bundle) throws IOException {
return create(itf, (Locale)null, (ClassLoader)null, bundle);
}
public static <T> T create(Class<T> itf, Locale locale) throws IOException {
return create(itf, locale, (ClassLoader)null);
}
public static <T> T create(Class<T> itf, Locale locale, ResourceBundle bundle) throws IOException {
return create(itf, locale, (ClassLoader)null, bundle);
}
public static Locale createLocaleFromLang(String lang) {
return createLocaleFromLang(lang, null);
}
public static Locale createLocaleFromLang(String lang, Locale loc) {
Locale ret = LocaleUtils.toLocale(lang);
if (ret == null)
ret = Locale.getDefault();
return ret;
}
public static <T> T create(Class<T> itf, Locale locale, ClassLoader classLoader) throws IOException {
return create(itf, locale, classLoader, (ResourceBundle)null);
}
public static <T> T create(Class<T> itf, Locale locale, ClassLoader classLoader, ResourceBundle bundle) throws IOException {
String locStr = null;
if (locale != null) {
locStr = locale.getLanguage();
if (locale.getCountry() != null && !"".equals(locale.getCountry())) {
locStr += "_"+locale.getCountry();
}
if (locale.getVariant() != null && !"".equals(locale.getVariant())) {
locStr += "_"+locale.getVariant();
}
}
return create(itf, locStr, classLoader, bundle);
}
public static <T> T create(Class<T> itf, String lang) throws IOException {
return create(itf, lang, (ClassLoader)null);
}
public static <T> T create(Class<T> itf, String lang, ResourceBundle bundle) throws IOException {
return create(itf, lang, (ClassLoader)null, bundle);
}
@SuppressWarnings("unchecked")
public static <T> T create(Class<T> itf, String lang, ClassLoader classLoader) throws IOException {
return create(itf, lang, classLoader, null);
}
@SuppressWarnings("unchecked")
public static <T> T create(Class<T> itf, String lang, ClassLoader classLoader, ResourceBundle bundle) throws IOException {
return create(itf, lang, classLoader, null, bundle);
}
@SuppressWarnings("unchecked")
public static <T> T create(Class<T> itf, String lang, ClassLoader classLoader, String prefix, ResourceBundle bundle) throws IOException {
Locale locale = createLocaleFromLang(lang);
final String key = ( (prefix == null) ? "" : prefix + "#" ) + itf.getName() + ((lang == null) ? "" : ("_" + lang));
if (useCache) {
// Object o = cache.get(key).get();
T msg = null;
try {
msg = (T) cache.get(key).get();
} catch (Throwable th) {
}
if (msg == null) {
msg = createProxy(itf, locale.getLanguage(), locale.getCountry(), locale.getVariant(), classLoader, bundle);
cache.put(key, new WeakReference(msg));
}
return msg;
} else {
return createProxy(itf, locale.getLanguage(), locale.getCountry(), locale.getVariant(), classLoader, bundle);
}
}
@SuppressWarnings("unchecked")
private static <T> T createProxy(Class<T> itf, String lang, String country, String variant, ClassLoader classLoader, ResourceBundle bundle) throws IOException {
InvocationHandler ih;
if (GenericX.isA(itf, Constants.class)) {
ih = new GenericConstants(itf, lang, country, variant, classLoader, bundle);
} else if (GenericX.isA(itf, Messages.class)) {
ih = new GenericMessages(itf, lang, country, variant, classLoader, bundle);
} else {
ih = new GenericMessages(itf, lang, country, variant, classLoader, bundle);
}
// throw new InvalidParameterException("Class " + itf.getName() + " is not a GWT i18n subclass");
//}
return (T) Proxy.newProxyInstance(itf.getClassLoader(), new Class[] { itf }, ih);
}
private static Map<Object, Object> convertResourceBundleToProperties(ResourceBundle resource) {
Map<Object, Object> properties = new HashMap<Object, Object>();
Enumeration<String> keys = resource.getKeys();
while (keys.hasMoreElements()) {
String key = keys.nextElement();
properties.put(key, resource.getString(key));
}
return properties;
}
}