Package pl.net.bluesoft.rnd.pt.dict.global.i18n

Source Code of pl.net.bluesoft.rnd.pt.dict.global.i18n.GlobalDictionaryI18NProvider

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);
                    }
                });
            }
        });
    }
}
TOP

Related Classes of pl.net.bluesoft.rnd.pt.dict.global.i18n.GlobalDictionaryI18NProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.