package fr.mch.mdo.restaurant.services.business.managers.users;
import java.util.HashSet;
import java.util.Set;
import fr.mch.mdo.logs.ILogger;
import fr.mch.mdo.restaurant.beans.IMdoDaoBean;
import fr.mch.mdo.restaurant.beans.IMdoDtoBean;
import fr.mch.mdo.restaurant.dao.authentication.AuthenticationPasswordLevel;
import fr.mch.mdo.restaurant.dao.beans.UserAuthentication;
import fr.mch.mdo.restaurant.dao.beans.UserLocale;
import fr.mch.mdo.restaurant.dao.users.IUserAuthenticationsDao;
import fr.mch.mdo.restaurant.dao.users.hibernate.DefaultUserAuthenticationsDao;
import fr.mch.mdo.restaurant.dto.beans.IAdministrationManagerViewBean;
import fr.mch.mdo.restaurant.dto.beans.LocaleDto;
import fr.mch.mdo.restaurant.dto.beans.UserAuthenticationDto;
import fr.mch.mdo.restaurant.dto.beans.UserAuthenticationsManagerViewBean;
import fr.mch.mdo.restaurant.dto.beans.UserDto;
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.DefaultUserAuthenticationsAssembler;
import fr.mch.mdo.restaurant.services.business.managers.locales.DefaultLocalesManager;
import fr.mch.mdo.restaurant.services.business.managers.locales.ILocalesManager;
import fr.mch.mdo.restaurant.services.business.managers.restaurants.DefaultRestaurantsManager;
import fr.mch.mdo.restaurant.services.business.managers.restaurants.IRestaurantsManager;
import fr.mch.mdo.restaurant.services.logs.LoggerServiceImpl;
import fr.mch.mdo.utils.IManagerAssembler;
public class DefaultUserAuthenticationsManager extends AbstractAdministrationManager implements IUserAuthenticationsManager
{
private ILocalesManager localesManager;
private IUsersManager usersManager;
private IUserRolesManager userRolesManager;
private IRestaurantsManager restaurantsManager;
private static class LazyHolder {
private static IUserAuthenticationsManager instance = new DefaultUserAuthenticationsManager(
LoggerServiceImpl.getInstance().getLogger(DefaultUserAuthenticationsManager.class.getName()),
DefaultUserAuthenticationsDao.getInstance(), DefaultUserAuthenticationsAssembler.getInstance());
}
private DefaultUserAuthenticationsManager(ILogger logger, IUserAuthenticationsDao dao, IManagerAssembler assembler) {
super.logger = logger;
super.dao = dao;
super.assembler = assembler;
this.localesManager = DefaultLocalesManager.getInstance();
this.usersManager = DefaultUsersManager.getInstance();
this.userRolesManager = DefaultUserRolesManager.getInstance();
this.restaurantsManager = DefaultRestaurantsManager.getInstance();
}
/**
* This constructor is used by ioc
*/
public DefaultUserAuthenticationsManager() {
}
public static IUserAuthenticationsManager getInstance() {
return LazyHolder.instance;
}
/**
* @return the localesManager
*/
public ILocalesManager getLocalesManager() {
return localesManager;
}
/**
* @param localesManager the localesManager to set
*/
public void setLocalesManager(ILocalesManager localesManager) {
this.localesManager = localesManager;
}
/**
* @return the usersManager
*/
public IUsersManager getUsersManager() {
return usersManager;
}
/**
* @param usersManager the usersManager to set
*/
public void setUsersManager(IUsersManager usersManager) {
this.usersManager = usersManager;
}
/**
* @return the userRolesManager
*/
public IUserRolesManager getUserRolesManager() {
return userRolesManager;
}
/**
* @param userRolesManager the userRolesManager to set
*/
public void setUserRolesManager(IUserRolesManager userRolesManager) {
this.userRolesManager = userRolesManager;
}
/**
* @return the restaurantsManager
*/
public IRestaurantsManager getRestaurantsManager() {
return restaurantsManager;
}
/**
* @param restaurantsManager the restaurantsManager to set
*/
public void setRestaurantsManager(IRestaurantsManager restaurantsManager) {
this.restaurantsManager = restaurantsManager;
}
@Override
public IMdoDtoBean findByLogin(String login) throws MdoBusinessException {
IMdoDtoBean result = null;
try {
UserAuthentication user = (UserAuthentication) ((IUserAuthenticationsDao) dao).findByUniqueKey(login);
result = assembler.marshal(user);
} catch (MdoException e) {
logger.error("message.error.administration.business.user.authentication.not.found", new Object[] {login}, e);
throw new MdoBusinessException("message.error.administration.business.user.authentication.not.found", new Object[] {login}, e);
}
return result;
}
@Override
public void processList(IAdministrationManagerViewBean viewBean, LocaleDto locale, boolean... lazy) throws MdoBusinessException {
super.processList(viewBean, lazy);
UserAuthenticationsManagerViewBean userAuthenticationsManagerViewBean = (UserAuthenticationsManagerViewBean) viewBean;
try {
userAuthenticationsManagerViewBean.setLanguages(localesManager.getLanguageLocales(locale.getLanguageCode()));
userAuthenticationsManagerViewBean.setUsers(usersManager.findAll());
userAuthenticationsManagerViewBean.setUserRoles(userRolesManager.findAll());
UserAuthenticationDto dtoBean = (UserAuthenticationDto) userAuthenticationsManagerViewBean.getDtoBean();
Long userIdForRestaurant = null;
if (dtoBean != null && dtoBean.getUser() != null) {
userIdForRestaurant = dtoBean.getUser().getId();
} else if (userAuthenticationsManagerViewBean.getUsers() != null && !userAuthenticationsManagerViewBean.getUsers().isEmpty()) {
userIdForRestaurant = ((UserDto) userAuthenticationsManagerViewBean.getUsers().get(0)).getId();
}
userAuthenticationsManagerViewBean.setUserRestaurants(restaurantsManager.findRestaurantsByUser(userIdForRestaurant));
} catch (Exception e) {
logger.error("message.error.administration.business.find.all", e);
throw new MdoBusinessException("message.error.administration.business.find.all", e);
}
}
@Override
public IMdoDtoBean update(IMdoDtoBean dtoBean) throws MdoBusinessException {
UserAuthenticationDto result = null;
UserAuthentication daoBean = (UserAuthentication) assembler.unmarshal(dtoBean);
try {
// Deleting daoBean.getLocales() before inserting new ones
Set<UserLocale> backup = new HashSet<UserLocale>(daoBean.getLocales());
// Removing
daoBean.getLocales().clear();
dao.update(daoBean);
// Restoring
daoBean.getLocales().addAll(backup);
result = (UserAuthenticationDto) assembler.marshal((IMdoDaoBean) dao.update(daoBean));
} catch (MdoException e) {
logger.error("message.error.administration.business.save", e);
throw new MdoBusinessException("message.error.administration.business.save", e);
}
return result;
}
@Override
public IMdoDtoBean delete(IMdoDtoBean dtoBean) throws MdoBusinessException {
// No need to Delete Locales before Deleting user because of hibernate mapping all-delete-orphan in collection
// Delete dto
return super.delete(dtoBean);
}
@Override
public void changePassword(Long id, String levelPassword, String newPassword) throws MdoException {
IUserAuthenticationsDao castedDao = (IUserAuthenticationsDao) dao;
castedDao.changePassword(id, AuthenticationPasswordLevel.valueOf(levelPassword), newPassword);
}
}