/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.i18n.message;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.hoteia.qalingo.core.Constants;
import org.hoteia.qalingo.core.i18n.enumtype.I18nKeyValueUniverse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSourceResolvable;
import org.springframework.context.NoSuchMessageException;
import org.springframework.stereotype.Service;
@Service("coreMessageSource")
public class CoreMessageSource {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private ExtReloadableResourceBundleMessageSource messageSource;
/**
* Common-Message
*/
public String getCommonMessage(final String scope, String key, final Locale locale) {
return getMessage(buildCommonFullKey(scope, key), locale);
}
public String getCommonMessage(final String scope, String key, final Object[] params, final Locale locale) {
return getMessage(buildCommonFullKey(scope, key), params, locale);
}
/**
* Email-Message
*/
public String getEmailMessage(final String scope, String key, final Locale locale) {
return getMessage(buildEmailFullKey(scope, key), locale);
}
public String getEmailMessage(final String scope, String key, final Object[] params, final Locale locale) {
return getMessage(buildEmailFullKey(scope, key), params, locale);
}
/**
* Document-Message
*/
public String getDocumentMessage(final String scope, String key, final Locale locale) {
return getMessage(buildDocumentFullKey(scope, key), locale);
}
public String getDocumentMessage(final String scope, String key, final Object[] params, final Locale locale) {
return getMessage(buildDocumentFullKey(scope, key), params, locale);
}
/**
* Specific
*/
public String getSpecificMessage(final String universe, final String scope, String key, final Locale locale) {
return getMessage(buildSpecificFullKey(universe, scope, key), locale);
}
public String getSpecificMessage(final String universe, final String scope, String key, final Object[] params, final Locale locale) {
return getMessage(buildSpecificFullKey(universe, scope, key), params, locale);
}
/**
* ReferenceData
*/
public String getReferenceData(final String scope, String key, final Locale locale) {
return getMessage(buildReferenceDataFullKey(scope, key), locale);
}
public String getReferenceData(final String scope, String key, final Object[] params, final Locale locale) {
return getMessage(buildReferenceDataFullKey(scope, key), params, locale);
}
// /*
// * (non-Javadoc)
// *
// * @see
// * org.hoteia.qalingo.core.i18n.message.CoreMessageSource#loadWording(org
// * .hoteia.qalingo.core.domain.enumtype.EngineSettingWebAppContext,
// * java.lang.String, java.util.Locale)
// */
// public Map<String, String> loadWording(final EngineSettingWebAppContext context, final String group, final Locale locale) {
// final Map<String, String> wordingKeyValues = loadWording(context, locale);
// final Map<String, String> wordingFilteredKeyValues = new HashMap<String, String>();
// for (Iterator<String> iterator = wordingKeyValues.keySet().iterator(); iterator.hasNext();) {
// String key = (String) iterator.next();
// if (key.contains(group)) {
// wordingFilteredKeyValues.put(key, wordingKeyValues.get(key));
// }
// }
// return wordingFilteredKeyValues;
// }
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#loadWording(org.hoteia.qalingo.core.domain.enumtype.EngineSettingWebAppContext, java.util.Locale)
*/
// public Map<String, String> loadWording(final EngineSettingWebAppContext context, final Locale locale) {
// final Map<String, String> wordingKeyValues = new HashMap<String, String>();
// if (context != null) {
// String[] contextSplit = context.getPropertyKey().split("_");
// String prefix = contextSplit[0].toLowerCase() + "-";
// wordingKeyValues.putAll(loadWording(prefix, locale));
// }
// return wordingKeyValues;
// }
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#loadWordingByContext(java.util.String, java.util.Locale)
*/
public Map<String, String> loadWordingByContext(final String context, final Locale locale) {
final Map<String, String> wordingKeyValues = new HashMap<String, String>();
if (context != null) {
String[] contextSplit = context.split("_");
String prefix = contextSplit[0].toLowerCase() + "-";
wordingKeyValues.putAll(loadWording(prefix, locale));
}
return wordingKeyValues;
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#loadWording(org.hoteia.qalingo.core.domain.enumtype.EngineSettingWebAppContext, java.lang.String, java.util.Locale)
*/
public Map<String, String> loadWording(final String context, final String group, final Locale locale) {
final Map<String, String> wordingKeyValues = loadWording(context, locale);
final Map<String, String> wordingFilteredKeyValues = new HashMap<String, String>();
for (Iterator<String> iterator = wordingKeyValues.keySet().iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
if (key.contains(group)) {
wordingFilteredKeyValues.put(key, wordingKeyValues.get(key));
}
}
return wordingFilteredKeyValues;
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#loadWording(java.util.String, java.util.Locale)
*/
public Map<String, String> loadWording(final String pattern, final Locale locale) {
final Map<String, String> wordingKeyValues = new HashMap<String, String>();
if (StringUtils.isNotEmpty(pattern)) {
List<String> allFileNames = messageSource.getFileBasenames();
for (Iterator<String> iterator = allFileNames.iterator(); iterator.hasNext();) {
String fileName = (String) iterator.next();
if (fileName.contains("wording") && (fileName.contains("common-") || fileName.contains(pattern))) {
wordingKeyValues.putAll(messageSource.getWordingProperties(fileName, locale));
}
}
}
return wordingKeyValues;
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#getMessage(java
* .lang.String, java.lang.String, java.util.Locale)
*/
public String getMessage(final String code, final String defaultMessage, final Locale locale) {
Object args[] = {};
return getMessage(code, args, defaultMessage, locale);
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#getMessage(java
* .lang.String, java.lang.Object[], java.lang.String, java.util.Locale)
*/
public String getMessage(final String code, final Object args[], final String defaultMessage, final Locale locale) {
try {
return messageSource.getMessage(code, args, defaultMessage, locale);
} catch (Exception e) {
if (code != null && code.contains("javax")) {
logger.info("This message key doesn't exist: " + code + ", for this locale: " + locale.toString());
} else {
logger.info("This message key doesn't exist: " + code + ", for this locale: " + locale.toString());
}
if (BooleanUtils.negate(locale.toString().equalsIgnoreCase(Constants.DEFAULT_LOCALE_CODE))) {
return getMessage(code, args, defaultMessage, new Locale(Constants.DEFAULT_LOCALE_CODE));
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#getMessage(java
* .lang.String, java.util.Locale)
*/
public String getMessage(final String code, final Locale locale) throws NoSuchMessageException {
Object args[] = {};
return getMessage(code, args, locale);
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#getMessage(java
* .lang.String, java.lang.Object[], java.util.Locale)
*/
public String getMessage(final String code, final Object args[], final Locale locale) throws NoSuchMessageException {
try {
return messageSource.getMessage(code, args, locale);
} catch (Exception e) {
logger.info("This message key doesn't exist: " + code + ", for this locale: " + locale.toString());
if (BooleanUtils.negate(locale.toString().equalsIgnoreCase(Constants.DEFAULT_LOCALE_CODE))) {
return getMessage(code, args, new Locale(Constants.DEFAULT_LOCALE_CODE));
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.hoteia.qalingo.core.i18n.message.CoreMessageSource#getMessage(org
* .springframework.context.MessageSourceResolvable, java.util.Locale)
*/
public String getMessage(final MessageSourceResolvable resolvable, final Locale locale) throws NoSuchMessageException {
try {
return messageSource.getMessage(resolvable, locale);
} catch (Exception e) {
logger.info("This message key doesn't exist: " + resolvable.getCodes() + ", for this locale: " + locale.toString());
if (BooleanUtils.negate(locale.toString().equalsIgnoreCase(Constants.DEFAULT_LOCALE_CODE))) {
return getMessage(resolvable, new Locale(Constants.DEFAULT_LOCALE_CODE));
}
}
return null;
}
public void clearCache() {
messageSource.clearCache();
}
private String buildCommonFullKey(final String scope, String key) {
return I18nKeyValueUniverse.COMMON.getPropertyKey() + "." + scope + "." + handleKey(key);
}
private String buildEmailFullKey(final String scope, String key) {
return I18nKeyValueUniverse.EMAIL.getPropertyKey() + "." + scope + "." + handleKey(key);
}
private String buildDocumentFullKey(final String scope, String key) {
return I18nKeyValueUniverse.DOCUMENT.getPropertyKey() + "." + scope + "." + handleKey(key);
}
private String buildSpecificFullKey(final String universe, final String scope, String key) {
return universe + "." + scope + "." + handleKey(key);
}
private String buildReferenceDataFullKey(final String scope, String key) {
return scope + "." + handleKey(key);
}
private String handleKey(String key) {
if(key != null){
key = key.replaceAll("\\.", "_");
key = key.replaceAll("\\-", "_");
}
return key;
}
}