package edu.asu.spring.quadriga.web.workbench;
import java.security.Principal;
import java.util.List;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import edu.asu.spring.quadriga.aspects.annotations.AccessPolicies;
import edu.asu.spring.quadriga.aspects.annotations.CheckedElementType;
import edu.asu.spring.quadriga.aspects.annotations.ElementAccessPolicy;
import edu.asu.spring.quadriga.aspects.annotations.InjectProject;
import edu.asu.spring.quadriga.aspects.annotations.InjectProjectById;
import edu.asu.spring.quadriga.aspects.annotations.ProjectIdentifier;
import edu.asu.spring.quadriga.domain.factories.ICollaboratorFactory;
import edu.asu.spring.quadriga.domain.factories.IModifyCollaboratorFormFactory;
import edu.asu.spring.quadriga.domain.factories.IUserFactory;
import edu.asu.spring.quadriga.domain.workbench.IProject;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.workbench.IProjectCollaboratorManager;
import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager;
import edu.asu.spring.quadriga.validator.CollaboratorFormDeleteValidator;
import edu.asu.spring.quadriga.web.login.RoleNames;
import edu.asu.spring.quadriga.web.workbench.backing.ModifyCollaborator;
import edu.asu.spring.quadriga.web.workbench.backing.ModifyCollaboratorForm;
import edu.asu.spring.quadriga.web.workbench.backing.ModifyCollaboratorFormManager;
@Controller
public class DeleteProjectCollaboratorController {
@Autowired
private IProjectCollaboratorManager projectCollaboratorManager;
@Autowired
private IUserFactory userFactory;
@Autowired
private ICollaboratorFactory collaboratorFactory;
@Autowired
private IRetrieveProjectManager retrieveprojectManager;
@Autowired
private IProjectCollaboratorManager projectCollabManager;
@Autowired
private CollaboratorFormDeleteValidator validator;
@Autowired
private IModifyCollaboratorFormFactory collaboratorFormFactory;
@Autowired
private ModifyCollaboratorFormManager collaboratorFormManager;
@Autowired
private MessageSource messageSource;
@InitBinder
protected void initBinder(WebDataBinder validateBinder) throws Exception {
validateBinder.setValidator(validator);
}
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = {
RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/workbench/{projectid}/collaborators/delete", method = RequestMethod.GET)
@InjectProjectById
public ModelAndView displayDeleteCollaborator(@ProjectIdentifier @PathVariable("projectid") String projectId,
@InjectProject IProject project) throws QuadrigaStorageException, QuadrigaAccessException {
ModelAndView modelAndView = new ModelAndView("auth/workbench/deletecollaborators");
// retrieve project details
ModifyCollaboratorForm collaboratorForm = collaboratorFormFactory.createCollaboratorFormObject();
List<ModifyCollaborator> modifyCollaborator = collaboratorFormManager.getProjectCollaborators(projectId);
collaboratorForm.setCollaborators(modifyCollaborator);
modelAndView.getModelMap().put("collaboratorForm", collaboratorForm);
modelAndView.getModelMap().put("myprojectId", projectId);
modelAndView.getModel().put("projectname", project.getProjectName());
modelAndView.getModelMap().put("projectdesc", project.getDescription());
return modelAndView;
}
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = {
RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/workbench/{projectid}/collaborators/delete", method = RequestMethod.POST)
@InjectProjectById
public String deleteCollaborators(@ProjectIdentifier @PathVariable("projectid") String projectId,
@InjectProject IProject project,
@Validated @ModelAttribute("collaboratorForm") ModifyCollaboratorForm collaboratorForm,
BindingResult result, Principal principal, Model model, Locale locale, RedirectAttributes redirectAttrs)
throws QuadrigaStorageException, QuadrigaAccessException {
if (result.hasErrors()) {
List<ModifyCollaborator> collaborators = collaboratorFormManager.getProjectCollaborators(projectId);
collaboratorForm.setCollaborators(collaborators);
model.addAttribute("collaboratorForm", collaboratorForm);
model.addAttribute("myprojectId", projectId);
model.addAttribute("projectname", project.getProjectName());
model.addAttribute("projectdesc", project.getDescription());
// show error message
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("collaborators.remove.failure", new Object[] {}, locale));
return "auth/workbench/deletecollaborators";
}
List<ModifyCollaborator> collaborators = collaboratorForm.getCollaborators();
for (ModifyCollaborator collaborator : collaborators) {
String userName = collaborator.getUserName();
if (userName != null) {
projectCollaboratorManager.deleteCollaborators(userName, projectId);
}
}
redirectAttrs.addFlashAttribute("show_success_alert", true);
redirectAttrs.addFlashAttribute("success_alert_msg",
messageSource.getMessage("collaborators.remove.success", new Object[] {}, locale));
return "redirect:/auth/workbench/projects/" + projectId;
}
}