package edu.asu.spring.quadriga.web.conceptcollection;
import java.security.Principal;
import java.util.ArrayList;
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.IUser;
import edu.asu.spring.quadriga.domain.conceptcollection.IConceptCollection;
import edu.asu.spring.quadriga.domain.conceptcollection.IConceptCollectionCollaborator;
import edu.asu.spring.quadriga.domain.factories.IUserFactory;
import edu.asu.spring.quadriga.domain.factory.conceptcollection.IConceptCollectionFactory;
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.conceptcollection.ICCCollaboratorManager;
import edu.asu.spring.quadriga.service.conceptcollection.IConceptCollectionManager;
import edu.asu.spring.quadriga.service.conceptcollection.IModifyConceptCollectionManager;
import edu.asu.spring.quadriga.validator.UserValidator;
import edu.asu.spring.quadriga.web.login.RoleNames;
@Controller
public class TransferCCOwnerController {
@Autowired
private UserValidator validator;
@Autowired
private IUserFactory userFactory;
@Autowired
private IConceptCollectionManager conceptCollectionManager;
@Autowired
private IModifyConceptCollectionManager modifyCCManager;
@Autowired
private ICCCollaboratorManager collabManager;
@Autowired
private IConceptCollectionFactory collectionFactory;
@Autowired
private IQuadrigaRoleManager roleManager;
@Autowired
private MessageSource messageSource;
@InitBinder
protected void initBinder(WebDataBinder validateBinder) {
validateBinder.setValidator(validator);
}
/**
* This method retrieves the collaborators associated with the concept
* collection for change of ownership to any one of the collaborator.
*
* @param collectionId
* @param principal
* @return ModelAndView
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 1, userRole = {}) })
@RequestMapping(value = "auth/conceptcollections/transfer/{collectionid}", method = RequestMethod.GET)
public ModelAndView transferConceptCollectionOwner(@PathVariable("collectionid") String collectionId,
Principal principal) throws QuadrigaStorageException, QuadrigaAccessException {
String userName;
ModelAndView model;
IConceptCollection conceptCollection;
List<IConceptCollectionCollaborator> collaboratingUser = new ArrayList<IConceptCollectionCollaborator>();
List<IUser> userList = new ArrayList<IUser>();
model = new ModelAndView("auth/conceptcollections/transferconceptcollectionowner");
userName = principal.getName();
// retrieve the concept collection details
conceptCollection = conceptCollectionManager.getConceptCollection(collectionId);
// create a model
model.getModelMap().put("user", userFactory.createUserObject());
model.getModelMap().put("collectionname", conceptCollection.getConceptCollectionName());
model.getModelMap().put("collectionowner", conceptCollection.getOwner().getName());
model.getModelMap().put("collectionid", collectionId);
// fetch the collaborators
// TODO: showCollaboratingUsers() needs to be changed to mapper.
collaboratingUser = conceptCollectionManager.showCollaboratingUsers(collectionId);
if (collaboratingUser != null) {
for (IConceptCollectionCollaborator collabuser : collaboratingUser) {
userList.add(collabuser.getCollaborator().getUserObj());
}
}
model.getModelMap().put("collaboratinguser", userList);
return model;
}
/**
* This method transfer the ownership of given concept collection to the
* selected collaborator and assigns the old owner as collaborator to the
* concept collection.
*
* @param collaboratorUser
* @param result
* @param collectionId
* @param principal
* @return
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
* @throws QuadrigaException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 3, userRole = {}) })
@RequestMapping(value = "auth/conceptcollections/transferconceptcollectionowner/{collectionid}", method = RequestMethod.POST)
public String transferConceptCollectionOwner(@Validated @ModelAttribute("user") User collaboratorUser,
BindingResult result, @PathVariable("collectionid") String collectionId, Principal principal, Model model,
RedirectAttributes redirectAttrs, Locale locale)
throws QuadrigaStorageException, QuadrigaAccessException, QuadrigaException {
String userName = principal.getName();
// retrieve the concept collection details
IConceptCollection conceptCollection = conceptCollectionManager.getConceptCollection(collectionId);
model.addAttribute("collectionid", collectionId);
if (result.hasErrors()) {
model.addAttribute("user", collaboratorUser);
// create a model
model.addAttribute("collectionname", conceptCollection.getConceptCollectionName());
model.addAttribute("collectionowner", conceptCollection.getOwner().getName());
// fetch the collaborators
List<IConceptCollectionCollaborator> collaboratingUser = conceptCollectionManager
.showCollaboratingUsers(collectionId);
List<IUser> userList = new ArrayList<IUser>();
for (IConceptCollectionCollaborator collabuser : collaboratingUser) {
userList.add(collabuser.getCollaborator().getUserObj());
}
model.addAttribute("collaboratinguser", userList);
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("concept_collection.transfer_ownership.failure", new Object[] {}, locale));
return "auth/conceptcollections/transferconceptcollectionowner";
}
// fetch the new owner
String newOwner = collaboratorUser.getUserName();
String collaboratorRole = roleManager.getQuadrigaRoleById(IQuadrigaRoleManager.CONCEPT_COLLECTION_ROLES,
RoleNames.ROLE_CC_COLLABORATOR_ADMIN).getDBid();
// call the method to transfer the ownership
collabManager.transferOwnership(collectionId, userName, newOwner, collaboratorRole);
conceptCollectionManager.fillConceptCollection(conceptCollection);
redirectAttrs.addFlashAttribute("show_success_alert", true);
redirectAttrs.addFlashAttribute("success_alert_msg",
messageSource.getMessage("concept_collection.transfer_ownership.success", new Object[] {}, locale));
return "redirect:/auth/conceptcollections/" + collectionId;
}
}