package fr.mch.mdo.restaurant.web.struts.actions; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import fr.mch.mdo.restaurant.Constants; import fr.mch.mdo.restaurant.beans.IMdoDtoBean; import fr.mch.mdo.restaurant.dto.beans.UserDto; import fr.mch.mdo.restaurant.dto.beans.UserRestaurantDto; import fr.mch.mdo.restaurant.dto.beans.UsersManagerViewBean; import fr.mch.mdo.restaurant.exception.MdoBusinessException; import fr.mch.mdo.restaurant.ioc.spring.WebAdministrationBeanFactory; import fr.mch.mdo.restaurant.ui.forms.IMdoAdministrationForm; import fr.mch.mdo.restaurant.ui.forms.UsersManagerForm; public class UsersManagerWebAction extends AdministrationManagerAction { /** * Default Serial Version UID */ private static final long serialVersionUID = 1L; public UsersManagerWebAction() { super(WebAdministrationBeanFactory.getInstance().getLogger(UsersManagerWebAction.class.getName()), new UsersManagerForm()); administrationManager = WebAdministrationBeanFactory.getInstance().getUsersManager(); } @Override public String form() throws Exception { String result = super.form(); UserDto dtoBean = (UserDto) super.getForm().getDtoBean(); if (dtoBean != null) { if (dtoBean.getBirthdate() == null) { dtoBean.setBirthdate(new Date()); } } processAvailableRestaurants(); return result; } @Override public void validate() { super.validate(); if (super.hasErrors()) { // In case of validation failed // Remove the Restaurant with null id removeRestaurantBeforeSaving(null); processAvailableRestaurants(); } } @Override public String save() throws MdoBusinessException { this.processSave(new String[] {null}); // Return to the list return Constants.ACTION_RESULT_AFTER_CUD; } /** * Process restaurants list on element which is not already stored in database. * Must be called after super.prepare because we have to use viewBean. */ private void processAvailableRestaurants() { UserDto dtoBean = (UserDto) super.getForm().getDtoBean(); UsersManagerViewBean viewBean = (UsersManagerViewBean) ((IMdoAdministrationForm) super.getForm()).getViewBean(); List<IMdoDtoBean> listAll = viewBean.getRestaurants(); List<IMdoDtoBean> availableRestaurants = new ArrayList<IMdoDtoBean>(listAll); if (dtoBean != null && dtoBean.getRestaurants() != null) { for (IMdoDtoBean restaurant : listAll) { for (UserRestaurantDto exlcudedBean : dtoBean.getRestaurants()) { if (restaurant.getId() != null && exlcudedBean.getRestaurant() != null && restaurant.getId().equals(exlcudedBean.getRestaurant().getId())) { availableRestaurants.remove(restaurant); } } } } viewBean.setRestaurants(availableRestaurants); } private void processSave(String... restaurantIdToRemove) throws MdoBusinessException { if (restaurantIdToRemove != null && restaurantIdToRemove.length == 1) { removeRestaurantBeforeSaving(restaurantIdToRemove[0]); } super.save(); } private void removeRestaurantBeforeSaving(String restaurantIdToRemove) { UsersManagerForm form = (UsersManagerForm) super.getForm(); UserDto user = (UserDto) form.getDtoBean(); Set<UserRestaurantDto> restaurants = new HashSet<UserRestaurantDto>(); // Try to remove from user.getRestaurants() list 2 elements of UserRestaurantDto // One of id null and one of id equals to restaurantIdToRemove for (UserRestaurantDto userRestaurant : user.getRestaurants()) { if (userRestaurant.getId() != null && !userRestaurant.getId().toString().equals(restaurantIdToRemove)) { restaurants.add(userRestaurant); } } user.setRestaurants(restaurants); } public String removeRestaurant() throws Exception { String restaurantIdToRemove = super.getRequest().getParameter("method:removeRestaurant"); this.processSave(restaurantIdToRemove); this.form(); return Constants.ACTION_RESULT_AFTER_CUD_RESTAURANT; } public String addRestaurant() throws Exception { this.processSave(); this.form(); return Constants.ACTION_RESULT_AFTER_CUD_RESTAURANT; } }