package org.smartly.packages.mongo.impl.i18n; import com.mongodb.DB; import com.mongodb.DBObject; import org.smartly.Smartly; import org.smartly.commons.logging.util.LoggingUtils; import org.smartly.commons.util.ExceptionUtils; import org.smartly.commons.util.FormatUtils; import org.smartly.commons.util.StringUtils; import org.smartly.packages.mongo.impl.IMongoConstants; import org.smartly.packages.mongo.impl.db.GenericMongoService; import org.smartly.packages.mongo.impl.util.MongoUtils; import java.util.Collections; import java.util.HashMap; import java.util.Map; /** * Quick access to locale dictionaries. * <p/> * Works with internal cache for values. */ public final class DictionaryManager { private DictionaryManager() { } private static final Map<String, String> _cache = Collections.synchronizedMap(new HashMap<String, String>()); private static final String[] LOCALFIELDS = new String[]{ IMongoConstants.VALUE }; private static String getKey(final String lang, final String collection, final String id) { return StringUtils.concatDot(lang, collection, id); } private static void add(final String key, final String value) { synchronized (_cache) { _cache.put(key, value); } } private static String getFromDB(final String lang, final String collection, final String id) throws Exception { try { if (null != _DATABASE) { final GenericMongoService srvc = new GenericMongoService( _DATABASE, collection, Smartly.getLanguages()); final DBObject item = srvc.findById(id); if (null != item) { srvc.localize(item, lang, LOCALFIELDS); return MongoUtils.getString(item, IMongoConstants.VALUE); } } else { LoggingUtils.getLogger(DictionaryManager.class).warning("DictionaryManager not initialized!"); } return null; } catch (Throwable t) { throw new Exception(FormatUtils.format("Error: '{0}'", ExceptionUtils.getRealMessage(t))); } } private static String getValue(final String lang, final String collection, final String id) { final String key = getKey(lang, collection, id); try { if (!_cache.containsKey(key)) { add(key, getFromDB(lang, collection, id)); } return _cache.get(key); } catch (Throwable t) { return ExceptionUtils.getRealMessage(t); } } // -------------------------------------------------------------------- // S T A T I C // -------------------------------------------------------------------- private static DB _DATABASE = null; public static void init(DB database){ _DATABASE = database; } public static String get(final String lang, final String collection, final String id) { return get(lang, collection, id, ""); } public static String get(final String lang, final String collection, final String id, final String defaultValue) { final String result = getValue(lang, collection, id); return null != result ? result : defaultValue; } }