package edu.asu.spring.quadriga.web.conceptcollection;
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.domain.conceptcollection.IConceptCollection;
import edu.asu.spring.quadriga.domain.factories.IModifyCollaboratorFormFactory;
import edu.asu.spring.quadriga.domain.factory.conceptcollection.IConceptCollectionFactory;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.conceptcollection.ICCCollaboratorManager;
import edu.asu.spring.quadriga.service.conceptcollection.IConceptCollectionManager;
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 DeleteCCCollaboratorController {
@Autowired
private IModifyCollaboratorFormFactory collaboratorFormFactory;
@Autowired
private ModifyCollaboratorFormManager collaboratorFormManager;
@Autowired
private ICCCollaboratorManager collaboratorManager;
@Autowired
private CollaboratorFormDeleteValidator validator;
@Autowired
private IConceptCollectionFactory collectionFactory;
@Autowired
private IConceptCollectionManager conceptControllerManager;
@Autowired
private MessageSource messageSource;
@InitBinder
protected void initBinder(WebDataBinder validateBinder) {
validateBinder.setValidator(validator);
}
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 1, userRole = { RoleNames.ROLE_CC_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/conceptcollections/{collectionid}/deletecollaborators", method = RequestMethod.GET)
public ModelAndView deleteCollaborators(@PathVariable("collectionid") String collectionid, Principal principal)
throws QuadrigaAccessException, QuadrigaStorageException {
ModelAndView model;
ModifyCollaboratorForm collaboratorForm;
model = new ModelAndView("auth/conceptcollection/deletecollaborators");
// fetch the concept collection details
IConceptCollection conceptCollection = conceptControllerManager.getConceptCollection(collectionid);
collaboratorForm = collaboratorFormFactory.createCollaboratorFormObject();
List<ModifyCollaborator> modifyCollaborators = collaboratorFormManager
.getConceptCollectionCollaborators(collectionid);
// if current user is collaborator, remove from list
// collaborators shouldn't be able to remove themselves
// should be done through a different workflow
removeCurrentUser(principal, modifyCollaborators);
collaboratorForm.setCollaborators(modifyCollaborators);
model.getModelMap().put("collectionid", collectionid);
model.getModelMap().put("collectionname", conceptCollection.getConceptCollectionName());
model.getModelMap().put("collectiondesc", conceptCollection.getDescription());
model.getModelMap().put("collaboratorForm", collaboratorForm);
model.getModelMap().put("success", 0);
return model;
}
private void removeCurrentUser(Principal principal, List<ModifyCollaborator> modifyCollaborators) {
ModifyCollaborator currentUser = null;
for (ModifyCollaborator collaborator : modifyCollaborators) {
if (collaborator.getUserName().equals(principal.getName())) {
currentUser = collaborator;
break;
}
}
if (currentUser != null) {
modifyCollaborators.remove(currentUser);
}
}
/**
* @description deletes the collaborator from current conceptcollection
* @param collectionid
* id of the conceptcollection
* @param model
* @param req
* contains string array returned by jsp
* @return String having path for showcollaborators jsp page
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 1, userRole = { RoleNames.ROLE_CC_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/conceptcollections/{collectionid}/deleteCollaborator", method = RequestMethod.POST)
public String deleteCollaborators(@PathVariable("collectionid") String collectionid,
@Validated @ModelAttribute("collaboratorForm") ModifyCollaboratorForm collaboratorForm,
BindingResult result, Principal principal, Locale locale, RedirectAttributes redirectAttrs, Model model)
throws QuadrigaStorageException, QuadrigaAccessException {
List<ModifyCollaborator> collaborators;
model.addAttribute("collectionid", collectionid);
if (result.hasErrors()) {
// fetch the concept collection details
// fetch the concept collection details
IConceptCollection conceptCollection = conceptControllerManager.getConceptCollection(collectionid);
model.addAttribute("collectionname", conceptCollection.getConceptCollectionName());
model.addAttribute("collectiondesc", conceptCollection.getDescription());
collaborators = collaboratorFormManager.getConceptCollectionCollaborators(collectionid);
collaboratorForm.setCollaborators(collaborators);
model.addAttribute("success", 0);
model.addAttribute("error", 1);
model.addAttribute("collaboratorForm", collaboratorForm);
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("collaborator_user_selection.required", new Object[] {}, locale));
return "auth/conceptcollection/deletecollaborators";
}
collaborators = collaboratorForm.getCollaborators();
StringBuilder collabUser = new StringBuilder();
for (ModifyCollaborator collaborator : collaborators) {
String user = collaborator.getUserName();
if (user != null) {
collabUser.append(",");
collabUser.append(user);
}
}
collaboratorManager.deleteCollaborators(collabUser.toString().substring(1), collectionid);
redirectAttrs.addFlashAttribute("show_success_alert", true);
redirectAttrs.addFlashAttribute("success_alert_msg",
messageSource.getMessage("collaborator_deleted.success", new Object[] {}, locale));
return "redirect:/auth/conceptcollections/" + collectionid;
}
}