package fr.mch.mdo.restaurant.services.business.managers.restaurants; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; 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.Restaurant; import fr.mch.mdo.restaurant.dao.beans.RestaurantPrefixTable; import fr.mch.mdo.restaurant.dao.beans.RestaurantReductionTable; import fr.mch.mdo.restaurant.dao.beans.RestaurantValueAddedTax; import fr.mch.mdo.restaurant.dao.beans.RestaurantVatTableType; import fr.mch.mdo.restaurant.dao.restaurants.IRestaurantsDao; import fr.mch.mdo.restaurant.dao.restaurants.hibernate.DefaultRestaurantsDao; import fr.mch.mdo.restaurant.dto.beans.IAdministrationManagerViewBean; import fr.mch.mdo.restaurant.dto.beans.RestaurantDto; import fr.mch.mdo.restaurant.dto.beans.RestaurantsManagerViewBean; 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.DefaultMdoTableAsEnumsManager; import fr.mch.mdo.restaurant.services.business.managers.assembler.DefaultRestaurantsAssembler; import fr.mch.mdo.restaurant.services.business.managers.products.DefaultValueAddedTaxesManager; import fr.mch.mdo.restaurant.services.business.managers.products.IMdoTableAsEnumsManager; import fr.mch.mdo.restaurant.services.business.managers.products.IValueAddedTaxesManager; import fr.mch.mdo.restaurant.services.business.managers.tables.DefaultTableTypesManager; import fr.mch.mdo.restaurant.services.business.managers.tables.ITableTypesManager; import fr.mch.mdo.restaurant.services.logs.LoggerServiceImpl; import fr.mch.mdo.restaurant.services.util.RestaurantReferenceFactory; import fr.mch.mdo.utils.IManagerAssembler; public class DefaultRestaurantsManager extends AbstractAdministrationManager implements IRestaurantsManager { private IMdoTableAsEnumsManager mdoTableAsEnumsManager; private IValueAddedTaxesManager valueAddedTaxesManager; private ITableTypesManager tableTypesManager; private static class LazyHolder { private static IRestaurantsManager instance = new DefaultRestaurantsManager( LoggerServiceImpl.getInstance().getLogger(DefaultRestaurantsManager.class.getName()), DefaultRestaurantsDao.getInstance(), DefaultRestaurantsAssembler.getInstance()); } private DefaultRestaurantsManager(ILogger logger, IRestaurantsDao dao, IManagerAssembler assembler) { super.logger = logger; super.dao = dao; super.assembler = assembler; this.mdoTableAsEnumsManager = DefaultMdoTableAsEnumsManager.getInstance(); this.valueAddedTaxesManager = DefaultValueAddedTaxesManager.getInstance(); this.tableTypesManager = DefaultTableTypesManager.getInstance(); } /** * This constructor is used by ioc */ public DefaultRestaurantsManager() { } public static IRestaurantsManager getInstance() { return LazyHolder.instance; } /** * @return the mdoTableAsEnumsManager */ public IMdoTableAsEnumsManager getMdoTableAsEnumsManager() { return mdoTableAsEnumsManager; } /** * @param mdoTableAsEnumsManager the mdoTableAsEnumsManager to set */ public void setMdoTableAsEnumsManager(IMdoTableAsEnumsManager mdoTableAsEnumsManager) { this.mdoTableAsEnumsManager = mdoTableAsEnumsManager; } /** * @return the valueAddedTaxesManager */ public IValueAddedTaxesManager getValueAddedTaxesManager() { return valueAddedTaxesManager; } /** * @param valueAddedTaxesManager the valueAddedTaxesManager to set */ public void setValueAddedTaxesManager(IValueAddedTaxesManager valueAddedTaxesManager) { this.valueAddedTaxesManager = valueAddedTaxesManager; } /** * @param tableTypesManager the tableTypesManager to set */ public void setTableTypesManager(ITableTypesManager tableTypesManager) { this.tableTypesManager = tableTypesManager; } /** * @return the tableTypesManager */ public ITableTypesManager getTableTypesManager() { return tableTypesManager; } @Override public List<IMdoDtoBean> findRestaurantsByUser(Long userId) throws MdoBusinessException { List<IMdoDtoBean> result = new ArrayList<IMdoDtoBean>(); try { List<IMdoBean> restaurants = ((IRestaurantsDao) super.getDao()).findRestaurants(userId); result = assembler.marshal(restaurants); } catch (Exception e) { logger.error("message.error.administration.business.users.restaurants.not.found", new Object[] {userId}, e); throw new MdoBusinessException("message.error.administration.business.users.restaurants.not.found", new Object[] {userId}, e); } return result; } @Override public void processList(IAdministrationManagerViewBean viewBean, boolean... lazy) throws MdoBusinessException { super.processList(viewBean, lazy); RestaurantsManagerViewBean restaurantsManagerViewBean = (RestaurantsManagerViewBean) viewBean; try { restaurantsManagerViewBean.setPrefixTableNames(mdoTableAsEnumsManager.getPrefixTableNames()); restaurantsManagerViewBean.setSpecificRounds(mdoTableAsEnumsManager.getSpecificRounds()); restaurantsManagerViewBean.setValueAddedTaxes(valueAddedTaxesManager.findAll(lazy)); // DO NOT refactor tableTypesManager.findAll(lazy) to ONE list because we must have 3 instances of this collection. restaurantsManagerViewBean.setTableTypes(tableTypesManager.findAll(lazy)); restaurantsManagerViewBean.setReductionTableTypes(tableTypesManager.findAll(lazy)); restaurantsManagerViewBean.setVatTableTypes(tableTypesManager.findAll(lazy)); } catch (MdoException e) { logger.error("message.error.administration.business.find.all", e); throw new MdoBusinessException("message.error.administration.business.find.all", e); } } private String generateReference(RestaurantDto restaurant) throws MdoBusinessException { String key = restaurant.getTripleDESKey(); String value = new Long(restaurant.getRegistrationDate().getTime()).toString(); String result = null; try { result = RestaurantReferenceFactory.getInstance().getReferenceFromValue(key, value); } catch (MdoException e) { throw new MdoBusinessException(e); } return result; } private String generateKey(RestaurantDto restaurant) throws MdoBusinessException { String key = new StringBuilder(new Long(restaurant.getRegistrationDate().getTime()).toString()).append(restaurant.getName()) .append(restaurant.getVatRef()).append(restaurant.getVisaRef()).toString(); String value = ""; String result = null; try { result = RestaurantReferenceFactory.getInstance().getReferenceFromValue(key, value); } catch (MdoException e) { throw new MdoBusinessException(e); } return result; } @Override public IMdoDtoBean save(IMdoDtoBean dtoBean) throws MdoBusinessException { RestaurantDto restaurant = (RestaurantDto) dtoBean; // 1) Generate key String key = restaurant.getTripleDESKey(); if (key == null || key.isEmpty()) { key = this.generateKey(restaurant); } restaurant.setTripleDESKey(key); // 1) Generate reference using generated key String reference = restaurant.getReference(); if (reference == null || reference.isEmpty()) { reference = this.generateReference(restaurant); } restaurant.setReference(reference); return super.save(dtoBean); } @Override public IMdoDtoBean update(IMdoDtoBean dtoBean) throws MdoBusinessException { Restaurant daoBean = (Restaurant) assembler.unmarshal(dtoBean); try { // Deleting daoBean.getVats() and daoBean.getPrefixTableNames() before inserting new ones Set<RestaurantValueAddedTax> backupVats = new HashSet<RestaurantValueAddedTax>(daoBean.getVats()); Set<RestaurantPrefixTable> backupPrefixTableNames = new HashSet<RestaurantPrefixTable>(daoBean.getPrefixTableNames()); Set<RestaurantReductionTable> backupReductionTables = new HashSet<RestaurantReductionTable>(daoBean.getReductionTables()); Set<RestaurantVatTableType> backupVatTableTypes = new HashSet<RestaurantVatTableType>(daoBean.getVatTableTypes()); // Removing daoBean.getVats().clear(); daoBean.getPrefixTableNames().clear(); daoBean.getReductionTables().clear(); daoBean.getVatTableTypes().clear(); dao.update(daoBean); // Restoring daoBean.getVats().addAll(backupVats); daoBean.getPrefixTableNames().addAll(backupPrefixTableNames); daoBean.getReductionTables().addAll(backupReductionTables); daoBean.getVatTableTypes().addAll(backupVatTableTypes); return 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); } } @Override public IMdoDtoBean delete(IMdoDtoBean dtoBean) throws MdoBusinessException { // No need to Delete Vats/Prefix before Deleting user because of hibernate mapping all-delete-orphan in collection // Delete dto return super.delete(dtoBean); } @Override public IMdoDtoBean findByReference(String reference) throws MdoBusinessException { try { return assembler.marshal((IMdoDaoBean) dao.findByUniqueKey(reference)); } catch (MdoException e) { logger.error("message.error.administration.business.restaurant.find.by.reference", new Object[] {reference}, e); throw new MdoBusinessException("message.error.administration.business.restaurant.find.by.reference", new Object[] {reference}, e); } } }