package fr.mch.mdo.restaurant.services.business.managers.locales;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import fr.mch.mdo.logs.ILogger;
import fr.mch.mdo.restaurant.beans.IMdoBean;
import fr.mch.mdo.restaurant.beans.IMdoDaoBean;
import fr.mch.mdo.restaurant.beans.IMdoDtoBean;
import fr.mch.mdo.restaurant.dao.beans.Locale;
import fr.mch.mdo.restaurant.dao.locales.ILocalesDao;
import fr.mch.mdo.restaurant.dao.locales.hibernate.DefaultLocalesDao;
import fr.mch.mdo.restaurant.dto.beans.IAdministrationManagerViewBean;
import fr.mch.mdo.restaurant.dto.beans.LocaleDto;
import fr.mch.mdo.restaurant.dto.beans.LocalesManagerViewBean;
import fr.mch.mdo.restaurant.dto.beans.UserLocaleDto;
import fr.mch.mdo.restaurant.exception.MdoBusinessException;
import fr.mch.mdo.restaurant.exception.MdoException;
import fr.mch.mdo.restaurant.services.business.managers.AbstractAdministrationManager;
import fr.mch.mdo.restaurant.services.business.managers.assembler.DefaultLocalesAssembler;
import fr.mch.mdo.restaurant.services.logs.LoggerServiceImpl;
import fr.mch.mdo.restaurant.services.util.UtilsImpl;
import fr.mch.mdo.utils.ILocalesAssembler;
import fr.mch.mdo.utils.IManagerAssembler;
public class DefaultLocalesManager extends AbstractAdministrationManager implements ILocalesManager
{
private static List<java.util.Locale> isoLanguagesList = Arrays.asList(java.util.Locale.getAvailableLocales());
private static class LazyHolder {
private static ILocalesManager instance = new DefaultLocalesManager(LoggerServiceImpl.getInstance().getLogger(DefaultLocalesManager.class.getName()),
DefaultLocalesDao.getInstance(), DefaultLocalesAssembler.getInstance());
}
private DefaultLocalesManager(ILogger logger, ILocalesDao dao, IManagerAssembler assembler) {
super.logger = logger;
super.dao = dao;
super.assembler = assembler;
}
/**
* This constructor is used by ioc
*/
public DefaultLocalesManager() {
}
public static ILocalesManager getInstance() {
return LazyHolder.instance;
}
@Override
public void processList(IAdministrationManagerViewBean viewBean, LocaleDto locale, boolean... lazy) throws MdoBusinessException {
List<IMdoDtoBean> list = null;
try {
List<IMdoBean> locales = dao.findAll(lazy);
if (locales != null) {
list = ((ILocalesAssembler) assembler).marshal(locales, locale.getLanguageCode());
}
} catch (MdoException e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
LocalesManagerViewBean view = (LocalesManagerViewBean) viewBean;
view.setList(list);
java.util.Locale userLocale = new java.util.Locale(locale.getLanguageCode());
view.setLanguages(this.getAvailableLanguages(userLocale));
}
@Override
public IMdoBean findByLanguage(String language) throws MdoBusinessException {
try {
return assembler.marshal((IMdoDaoBean) dao.findByUniqueKey(language));
} catch (MdoException e) {
logger.error("message.error.administration.business.find", new Object[] { language }, e);
throw new MdoBusinessException("message.error.administration.business.find", new Object[] { language }, e);
}
}
@Override
public Map<String, String> getAvailableLanguages(java.util.Locale currentLocale) throws MdoBusinessException {
java.util.Locale[] locales = java.util.Locale.getAvailableLocales();
Map<String, String> result = new HashMap<String, String>(locales.length);
List<IMdoBean> localesListFromDba;
// Be sure that the server manages this language
if (!isoLanguagesList.contains(currentLocale)) {
currentLocale = java.util.Locale.getDefault();
}
try {
localesListFromDba = dao.findAll();
for (int i = 0; i < locales.length; i++) {
java.util.Locale locale = locales[i];
boolean doesLocaleAlreadyExistInDba = false;
for (int j = 0; j < localesListFromDba.size(); j++) {
Locale myLocale = (Locale) localesListFromDba.get(j);
if (locale.getLanguage().equals(myLocale.getLanguage())) {
doesLocaleAlreadyExistInDba = true;
break;
}
}
if (!doesLocaleAlreadyExistInDba) {
result.put(locale.getLanguage(), locale.getDisplayLanguage(currentLocale));
}
}
} catch (Exception e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
// Sort the map
return UtilsImpl.getInstance().sortedMapByValue(result);
}
@Override
public Map<String, String> getSystemAvailableLanguages(java.util.Locale currentLocale) throws MdoBusinessException {
java.util.Locale[] locales = java.util.Locale.getAvailableLocales();
Map<String, String> result = new HashMap<String, String>(locales.length);
// Be sure that the server manages this language
if (!isoLanguagesList.contains(currentLocale)) {
currentLocale = java.util.Locale.getDefault();
}
for (int i = 0; i < locales.length; i++) {
java.util.Locale locale = locales[i];
result.put(locale.getLanguage(), locale.getDisplayLanguage(currentLocale));
}
// Sort the map
return UtilsImpl.getInstance().sortedMapByValue(result);
}
@Override
public Map<Long, String> getLanguages(java.util.Locale currentLocale) throws MdoBusinessException {
List<IMdoBean> localesListFromDba;
try {
localesListFromDba = dao.findAll();
} catch (MdoException e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
// Be sure that the server manages this language
if (!isoLanguagesList.contains(currentLocale)) {
currentLocale = java.util.Locale.getDefault();
}
Map<Long, String> result = new HashMap<Long, String>(localesListFromDba.size());
for (int i = 0; i < localesListFromDba.size(); i++) {
Locale myLocale = (Locale) localesListFromDba.get(i);
result.put(myLocale.getId(), (new java.util.Locale(myLocale.getLanguage())).getDisplayLanguage(currentLocale));
}
// Sort the map
return UtilsImpl.getInstance().sortedMapByValue(result);
}
@Override
public Map<Long, String> getLanguages(String languageCode) throws MdoBusinessException {
return this.getLanguages(this.getLocale(languageCode));
}
/**
* Get the java.util.Locale from locale language iso code
* @param languageCode language iso code
* @return a locale
*/
private java.util.Locale getLocale(String languageCode) {
if (languageCode != null) {
return new java.util.Locale(languageCode);
}
return java.util.Locale.getDefault();
}
@Override
public List<LocaleDto> getLanguageLocales(String defaultLanguageCode) throws MdoBusinessException {
List<IMdoBean> localesListFromDba;
try {
localesListFromDba = dao.findAll();
} catch (MdoException e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
/*
TODO userContext
String defaultLanguageCode = null;
if (userContext != null && userContext.getCurrentLocale() != null) {
defaultLanguageCode = userContext.getCurrentLocale().getLanguageCode();
}
*/
Set<LocaleDto> result = new TreeSet<LocaleDto>(comparator);
for (int i = 0; i < localesListFromDba.size(); i++) {
Locale myLocale = (Locale) localesListFromDba.get(i);
LocaleDto localeDto = (LocaleDto) ((ILocalesAssembler) super.assembler).marshal(myLocale, defaultLanguageCode);
result.add(localeDto);
}
return new ArrayList<LocaleDto>(result);
}
private Comparator<LocaleDto> comparator = new Comparator<LocaleDto>() {
@Override
public int compare(LocaleDto o1, LocaleDto o2) {
int result = 0;
if (o1 == null && o2 == null) {
} else if (o1 == null) {
result = -1;
} else if (o2 == null) {
result = 1;
} else {
// First compare with Display Language
if (o1.getDisplayLanguage() != null) {
result = o1.getDisplayLanguage().compareTo(o2.getDisplayLanguage());
} else if (o2.getDisplayLanguage() != null) {
result = -1;
}
if (result == 0) {
// Second compare with Language Code
if (o1.getLanguageCode() != null) {
result = o1.getLanguageCode().compareTo(o2.getLanguageCode());
} else if (o2.getLanguageCode() != null) {
result = -1;
}
}
}
return result;
}
};
@Override
public LocaleDto findLocale(java.util.Locale locale, Set<UserLocaleDto> defaultLocales) throws MdoBusinessException {
LocaleDto result = null;
// Be sure that the server manages this language
if (!isoLanguagesList.contains(locale)) {
locale = java.util.Locale.getDefault();
}
String language = locale.getLanguage();
/**
TODO userContext
if (userContext != null) {
UserAuthenticationDto userX = userContext.getUserAuthentication();
if (userX != null && userX.getLocales() != null && !userX.getLocales().isEmpty()) {
UserLocaleDto userLocale = null;
for (Iterator<UserLocaleDto> i = userX.getLocales().iterator(); i.hasNext();) {
userLocale = i.next();
if (userLocale != null && userLocale.getLocale() != null && userLocale.getLocale().getLanguageCode() != null
&& userLocale.getLocale().getLanguageCode().equals(language)) {
// Get the one in the user locales equals to the
// specific locale
result = userLocale.getLocale();
break;
}
}
// Get the last one in the user locales
if (result == null && userLocale != null) {
result = userLocale.getLocale();
}
}
}
*/
if (defaultLocales != null && !defaultLocales.isEmpty()) {
UserLocaleDto userLocale = null;
for (Iterator<UserLocaleDto> i = defaultLocales.iterator(); i.hasNext();) {
userLocale = i.next();
if (userLocale != null && userLocale.getLocale() != null && userLocale.getLocale().getLanguageCode() != null
&& userLocale.getLocale().getLanguageCode().equals(language)) {
// Get the one in the user locales equals to the
// specific locale
result = userLocale.getLocale();
break;
}
}
// Get the last one in the user locales
if (result == null && userLocale != null) {
result = userLocale.getLocale();
}
}
if (result == null) {
// Get the one from database by specific language
result = (LocaleDto) findByLanguage(language);
}
if (result == null) {
try {
// Get the first one from database without specific language
List<IMdoBean> list = dao.findAll();
if (list != null && !list.isEmpty()) {
result = (LocaleDto) assembler.marshal((IMdoDaoBean) dao.findAll().get(0));
}
} catch (MdoException e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
}
if (result == null) {
// Create new one with specific language
result = new LocaleDto();
result.setLanguageCode(language);
result.setDisplayLanguage(locale.getDisplayLanguage());
}
return result;
}
}