package edu.asu.spring.quadriga.web.dictionary;
import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.codehaus.jettison.json.JSONException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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.IUser;
import edu.asu.spring.quadriga.domain.dictionary.IDictionary;
import edu.asu.spring.quadriga.domain.dictionary.IDictionaryCollaborator;
import edu.asu.spring.quadriga.domain.factories.IUserFactory;
import edu.asu.spring.quadriga.domain.impl.User;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaException;
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.UserValidator;
import edu.asu.spring.quadriga.web.login.RoleNames;
@Controller
public class TransferDictionaryOwnerController {
@Autowired
private IUserFactory userFactory;
@Autowired
private IDictionaryManager dictionaryManager;
@Autowired
private IDictionaryCollaboratorManager dictCollabManager;
@Autowired
private IQuadrigaRoleManager roleManager;
@Autowired
private UserValidator validator;
@Autowired
private MessageSource messageSource;
@InitBinder("user")
protected void initBinder(WebDataBinder validateBinder) {
validateBinder.setValidator(validator);
}
/**
* This method retrieves the collaborators associated for given dictionary
* to transfer the ownership to one of the collaborators
*
* @param dictionaryid
* @return ModelAndView
* @throws QuadrigaStorageException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 1, userRole = {}) })
@RequestMapping(value = "auth/dictionaries/transfer/{dictionaryid}", method = RequestMethod.GET)
public ModelAndView transferDictionaryOwner(@PathVariable("dictionaryid") String dictionaryid)
throws QuadrigaStorageException, QuadrigaAccessException {
ModelAndView model = new ModelAndView("auth/dictionaries/changedictionaryowner");
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryid);
// create a model
model.getModelMap().put("user", userFactory.createUserObject());
model.getModelMap().put("dictionaryname", dictionary.getDictionaryName());
model.getModelMap().put("dictionaryowner", dictionary.getOwner().getUserName());
model.getModelMap().put("dictionaryid", dictionaryid);
// fetch the collaborators
List<IDictionaryCollaborator> collaboratingUsers = dictionaryManager.showCollaboratingUsers(dictionaryid);
List<IUser> userList = new ArrayList<IUser>();
if (collaboratingUsers != null) {
for (IDictionaryCollaborator collabuser : collaboratingUsers) {
// userList.add(collabuser);
userList.add(collabuser.getCollaborator().getUserObj());
}
}
model.getModelMap().put("collaboratinguser", userList);
return model;
}
/**
* This method transfer the ownership of the dictionary to the selected
* collaborator and assign the old owner as collaborator to the dictionary
*
* @param dictionaryid
* @param principal
* @param collaboratorUser
* @param result
* @return ModelAndView
* @throws QuadrigaStorageException
* @throws QuadrigaException
* @throws JSONException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.DICTIONARY, paramIndex = 1, userRole = {}) })
@RequestMapping(value = "auth/dictionaries/changedictionaryowner/{dictionaryid}", method = RequestMethod.POST)
public String transferDictionaryOwner(@PathVariable("dictionaryid") String dictionaryid, Principal principal,
ModelMap model, @Validated @ModelAttribute("user") User collaboratorUser, BindingResult result,
Locale locale, RedirectAttributes redirectAttrs) throws QuadrigaStorageException, QuadrigaException,
JSONException, QuadrigaAccessException {
if (result.hasErrors()) {
IDictionary dictionary = dictionaryManager.getDictionaryDetails(dictionaryid);
model.addAttribute("user", userFactory.createUserObject());
model.addAttribute("dictionaryname", dictionary.getDictionaryName());
model.addAttribute("dictionaryowner", dictionary.getOwner().getUserName());
model.addAttribute("dictionaryid", dictionaryid);
// fetch the collaborators
List<IDictionaryCollaborator> collaboratingUsers = dictionaryManager.showCollaboratingUsers(dictionaryid);
List<IUser> userList = new ArrayList<IUser>();
if (collaboratingUsers != null) {
for (IDictionaryCollaborator collabuser : collaboratingUsers) {
userList.add(collabuser.getCollaborator().getUserObj());
}
}
model.addAttribute("collaboratinguser", userList);
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("dictionary.transfer_ownership.failure", new Object[] {}, locale));
return "auth/dictionaries/changedictionaryowner";
}
// fetch the new owner
String newOwner = collaboratorUser.getUserName();
String collaboratorRole = roleManager.getQuadrigaRoleById(IQuadrigaRoleManager.DICT_ROLES,
RoleNames.ROLE_DICTIONARY_COLLABORATOR_ADMIN).getDBid();
// call the method to transfer the ownership
dictCollabManager.transferOwnership(dictionaryid, principal.getName(), newOwner, collaboratorRole);
redirectAttrs.addFlashAttribute("show_success_alert", true);
redirectAttrs.addFlashAttribute("success_alert_msg", "Ownership successfully transferred.");
return "redirect:/auth/dictionaries/" + dictionaryid;
}
}