package pl.net.bluesoft.rnd.pt.dict.global.i18n;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.ReturningProcessToolContextCallback;
import pl.net.bluesoft.rnd.processtool.dict.ProcessDictionaryRegistry;
import pl.net.bluesoft.rnd.processtool.model.dict.ProcessDictionary;
import pl.net.bluesoft.rnd.processtool.model.dict.ProcessDictionaryItem;
import pl.net.bluesoft.rnd.processtool.model.dict.ProcessDictionaryItemValue;
import pl.net.bluesoft.rnd.processtool.plugins.ProcessToolRegistry;
import pl.net.bluesoft.rnd.util.i18n.I18NProvider;
import pl.net.bluesoft.util.lang.ExpiringCache;
import pl.net.bluesoft.util.lang.ExpiringCache.NewValueCallback;
import pl.net.bluesoft.util.lang.Strings;
import java.util.Locale;
import java.util.Properties;
/**
* @author: amichalak@bluesoft.net.pl
*/
public class GlobalDictionaryI18NProvider implements I18NProvider {
private ProcessToolRegistry registry;
private String dictionaryId;
private static final String EMPTY_LANGUAGE_CODE = "";
private static final String CONFIG_CACHE_REFRESH_INTERVAL = "cache.refresh.interval";
private static final long DEFAULT_CACHE_REFRESH_INTERVAL = 360 * 1000;
private ExpiringCache<String, ProcessDictionary> cache;
public GlobalDictionaryI18NProvider(String dictionaryId, ProcessToolRegistry registry, Properties properties) {
this.registry = registry;
this.dictionaryId = dictionaryId;
String interval = properties.getProperty(CONFIG_CACHE_REFRESH_INTERVAL);
this.cache = new ExpiringCache<String, ProcessDictionary>(Strings.hasText(interval) ? Integer.parseInt(interval) * 1000L : DEFAULT_CACHE_REFRESH_INTERVAL);
}
@Override
public boolean hasFullyLocalizedMessage(String key, Locale locale) {
ProcessDictionary dictionary = fetchSpecificDictionary(fullyLocalizedLanguageCode(locale));
return dictionary != null && dictionary.containsKey(key);
}
@Override
public boolean hasLocalizedMessage(String key, Locale locale) {
ProcessDictionary dictionary = fetchSpecificDictionary(localizedLanguageCode(locale));
return dictionary != null && dictionary.containsKey(key);
}
@Override
public String getMessage(String key, Locale locale) {
ProcessDictionary dictionary = fetchSpecificDictionary(fullyLocalizedLanguageCode(locale));
if (dictionary == null) {
dictionary = fetchSpecificDictionary(localizedLanguageCode(locale));
}
if (dictionary == null) {
dictionary = fetchDefaultDictionary();
}
if (dictionary != null && dictionary.containsKey(key)) {
ProcessDictionaryItem<String, String> item = dictionary.lookup(key);
ProcessDictionaryItemValue<String> value = item.getValueForCurrentDate();
if (value != null) {
return value.getValue();
}
}
return null;
}
private String fullyLocalizedLanguageCode(Locale locale) {
return locale.getLanguage() + "_" + locale.getCountry();
}
private String localizedLanguageCode(Locale locale) {
return locale.getLanguage();
}
private ProcessDictionary fetchSpecificDictionary(final String languageCode) {
return cache.get(languageCode, new NewValueCallback<String, ProcessDictionary>() {
@Override
public ProcessDictionary getNewValue(String key) {
return registry.withProcessToolContext(new ReturningProcessToolContextCallback<ProcessDictionary>() {
@Override
public ProcessDictionary processWithContext(ProcessToolContext ctx) {
ProcessDictionaryRegistry dictionaryRegistry = ctx.getProcessDictionaryRegistry();
return dictionaryRegistry.getSpecificGlobalDictionary("db", dictionaryId, languageCode);
}
});
}
});
}
private ProcessDictionary fetchDefaultDictionary() {
return cache.get(EMPTY_LANGUAGE_CODE, new NewValueCallback<String, ProcessDictionary>() {
@Override
public ProcessDictionary getNewValue(String key) {
return registry.withProcessToolContext(new ReturningProcessToolContextCallback<ProcessDictionary>() {
@Override
public ProcessDictionary processWithContext(ProcessToolContext ctx) {
ProcessDictionaryRegistry dictionaryRegistry = ctx.getProcessDictionaryRegistry();
return dictionaryRegistry.getDefaultGlobalDictionary("db", dictionaryId);
}
});
}
});
}
}