package edu.asu.spring.quadriga.web.dictionary; import java.beans.PropertyEditorSupport; import java.security.Principal; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; 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.ServletRequestDataBinder; 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.IQuadrigaRole; import edu.asu.spring.quadriga.domain.dictionary.IDictionary; import edu.asu.spring.quadriga.domain.factories.IModifyCollaboratorFormFactory; import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; import edu.asu.spring.quadriga.service.IQuadrigaRoleManager; import edu.asu.spring.quadriga.service.dictionary.IDictionaryCollaboratorManager; import edu.asu.spring.quadriga.service.dictionary.IDictionaryManager; import edu.asu.spring.quadriga.validator.CollaboratorFormValidator; 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 ModifyDictionaryCollaboratorController { @Autowired private ModifyCollaboratorFormManager collaboratorFormManager; @Autowired private IModifyCollaboratorFormFactory collaboratorFactory; @Autowired private IQuadrigaRoleManager collaboratorRoleManager; @Autowired private IDictionaryCollaboratorManager dictionaryCollabManager; @Autowired private IDictionaryManager dictManager; @Autowired private CollaboratorFormValidator validator; @Autowired private MessageSource messageSource; @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder, WebDataBinder validateBinder) throws Exception { validateBinder.setValidator(validator); binder.registerCustomEditor(List.class, "collaborators.collaboratorRoles", new PropertyEditorSupport() { @Override public void setAsText(String text) { String[] roleIds = text.split(","); List<IQuadrigaRole> roles = new ArrayList<IQuadrigaRole>(); for (String roleId : roleIds) { IQuadrigaRole role = collaboratorRoleManager.getQuadrigaRoleById(IQuadrigaRoleManager.DICT_ROLES, roleId.trim()); roles.add(role); } setValue(roles); } }); } /** * This method retrieves the collaborators associated with a dictionary for * updating the selected collaborator roles * * @param dictionaryid * @return ModelAndView * @throws QuadrigaStorageException * @throws QuadrigaAccessException */ @AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 1, userRole = { RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN }) }) @RequestMapping(value = "auth/dictionaries/{dictionaryid}/collaborators/update", method = RequestMethod.GET) public ModelAndView updateCollaboratorForm(@PathVariable("dictionaryid") String dictionaryid) throws QuadrigaStorageException, QuadrigaAccessException { ModelAndView model = new ModelAndView("auth/dictionaries/updatecollaborators"); // fetch the dictionary details IDictionary dictionary = dictManager.getDictionaryDetails(dictionaryid); // create a model for collaborators ModifyCollaboratorForm collaboratorForm = collaboratorFactory.createCollaboratorFormObject(); List<ModifyCollaborator> modifyCollaborator = collaboratorFormManager.getDictionaryCollaborators(dictionaryid); collaboratorForm.setCollaborators(modifyCollaborator); // fetch the concept collection collaborator roles List<IQuadrigaRole> collaboratorRoles = collaboratorRoleManager .getQuadrigaRoles(IQuadrigaRoleManager.DICT_ROLES); // add the collaborator roles to the model model.getModelMap().put("dictcollabroles", collaboratorRoles); model.getModelMap().put("collaboratorform", collaboratorForm); model.getModelMap().put("dictionaryid", dictionaryid); model.getModelMap().put("dictionaryname", dictionary.getDictionaryName()); model.getModelMap().put("dictionarydesc", dictionary.getDescription()); return model; } /** * This method updates the roles of selected collaborator associated with * the given dictionary * * @param collaboratorForm * @param result * @param dictionaryid * @param principal * @return * @throws QuadrigaStorageException */ @AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 3, userRole = { RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN }) }) @RequestMapping(value = "auth/dictionaries/{dictionaryid}/collaborators/update", method = RequestMethod.POST) public String updateCollaboratorForm( @Validated @ModelAttribute("collaboratorform") ModifyCollaboratorForm collaboratorForm, BindingResult result, @PathVariable("dictionaryid") String dictionaryid, Principal principal, Model model, Locale locale, RedirectAttributes redirectAttrs) throws QuadrigaStorageException, QuadrigaAccessException { String userName = principal.getName(); if (result.hasErrors()) { // fetch the dictionary details IDictionary dictionary = dictManager.getDictionaryDetails(dictionaryid); List<ModifyCollaborator> dictCollaborators = collaboratorFormManager .getDictionaryCollaborators(dictionaryid); collaboratorForm.setCollaborators(dictCollaborators); // add the model map model.addAttribute("collaboratorform", collaboratorForm); model.addAttribute("dictionaryid", dictionaryid); model.addAttribute("dictionaryname", dictionary.getDictionaryName()); model.addAttribute("dictionarydesc", dictionary.getDescription()); // retrieve the collaborator roles and assign it to a map // fetch the roles that can be associated to the workspace // collaborator List<IQuadrigaRole> collaboratorRoles = collaboratorRoleManager .getQuadrigaRoles(IQuadrigaRoleManager.DICT_ROLES); model.addAttribute("dictcollabroles", collaboratorRoles); model.addAttribute("show_error_alert", true); model.addAttribute("error_alert_msg", messageSource.getMessage("dictionary.collaborators.update.failure", new Object[] {}, locale)); return "auth/dictionaries/updatecollaborators"; } List<ModifyCollaborator> dictCollaborators = collaboratorForm.getCollaborators(); // fetch the user and his collaborator roles for (ModifyCollaborator collab : dictCollaborators) { StringBuilder collabRoles = new StringBuilder(); String collabUser = collab.getUserName(); List<IQuadrigaRole> values = collab.getCollaboratorRoles(); // fetch the role names for the roles and form a string for (IQuadrigaRole role : values) { collabRoles.append(","); collabRoles.append(role.getDBid()); } dictionaryCollabManager.updateCollaborators(dictionaryid, collabUser, collabRoles.toString().substring(1), userName); } redirectAttrs.addFlashAttribute("show_success_alert", true); redirectAttrs.addFlashAttribute("success_alert_msg", messageSource.getMessage("dictionary.collaborators.update.success", new Object[] {}, locale)); return "redirect:/auth/dictionaries/" + dictionaryid; } }