package org.smartly.commons.i18n; import org.smartly.commons.i18n.impl.ChainDictionary; import org.smartly.commons.i18n.resourcebundle.AbstractI18nBundle; import org.smartly.commons.logging.Level; import org.smartly.commons.logging.Logger; import org.smartly.commons.logging.util.LoggingUtils; import org.smartly.commons.util.FormatUtils; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; /** * Singleton dictionary registry. * Contains read-only dictionaries. */ public class DictionaryRegistry { private final Map<String, AbstractI18nBundle> _dictionaries; private DictionaryRegistry() { _dictionaries = Collections.synchronizedMap(new LinkedHashMap<String, AbstractI18nBundle>()); } public boolean containsKey(final String name) { return _dictionaries.containsKey(name); } public void add(final Class<? extends AbstractI18nBundle> dictionary) { try { final AbstractI18nBundle dic = dictionary.newInstance(); this.add(dic); } catch (Throwable t) { this.getLogger().log(Level.SEVERE, null, t); } } public AbstractI18nBundle get(final String name) { return _dictionaries.get(name); } public Collection<AbstractI18nBundle> getAll() { return _dictionaries.values(); } // ------------------------------------------------------------------------ // p r i v a t e // ------------------------------------------------------------------------ private Logger getLogger() { return LoggingUtils.getLogger(this); } private void add(final AbstractI18nBundle dic) { if (null != dic) { final String key = dic.getName(); if (_dictionaries.containsKey(key)) { final String msg = FormatUtils.format("'{0}'({1}) already exists and will be replaced from ({2})", key, _dictionaries.get(key).getClass().getName(), dic.getClass().getName()); } _dictionaries.put(dic.getName(), dic); if (dic instanceof ChainDictionary) { this.add(((ChainDictionary) dic).next()); } } } // -------------------------------------------------------------------- // S T A T I C // -------------------------------------------------------------------- private static DictionaryRegistry __instance; private static DictionaryRegistry getInstance() { if (null == __instance) { __instance = new DictionaryRegistry(); } return __instance; } public static void register(final Class<? extends AbstractI18nBundle> dic) { getInstance().add(dic); } public static boolean contains(final String key) { return getInstance().containsKey(key); } public static AbstractI18nBundle getDictionary(final String name) { return getInstance().get(name); } public static Collection<AbstractI18nBundle> getDictionaries() { return getInstance().getAll(); } }