package edu.asu.spring.quadriga.web.conceptcollection;
import java.security.Principal;
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.factory.conceptcollection.IConceptCollectionFactory;
import edu.asu.spring.quadriga.domain.impl.conceptcollection.ConceptCollection;
import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.conceptcollection.IConceptCollectionManager;
import edu.asu.spring.quadriga.service.conceptcollection.IModifyConceptCollectionManager;
import edu.asu.spring.quadriga.validator.ConceptCollectionValidator;
import edu.asu.spring.quadriga.web.login.RoleNames;
@Controller
public class ModifyConceptCollectionController {
@Autowired
private IConceptCollectionFactory collectionFactory;
@Autowired
private IConceptCollectionManager conceptControllerManager;
@Autowired
private IModifyConceptCollectionManager collectionManager;
@Autowired
private ConceptCollectionValidator validator;
@Autowired
private MessageSource messageSource;
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(validator);
}
/**
* This method retrieves the concept collection details for updation.
*
* @param collectionid
* @param principal
* @return ModelAndView
* @throws QuadrigaStorageException
* @throws QuadrigaAccessException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 1, userRole = { RoleNames.ROLE_CC_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/conceptcollections/updatecollection/{collectionid}", method = RequestMethod.GET)
public ModelAndView updateConceptCollectionDetials(
@PathVariable("collectionid") String collectionid,
Principal principal) throws QuadrigaStorageException,
QuadrigaAccessException {
ModelAndView model = new ModelAndView(
"auth/conceptcollections/updatecollectiondetails");
// retrieve the collection details
IConceptCollection collection = conceptControllerManager
.getConceptCollection(collectionid);
model.getModelMap().put("collection", collection);
return model;
}
/**
* This method updates the concept collection details.
*
* @param collection
* @param result
* @param collectionid
* @param principal
* @return
* @throws QuadrigaStorageException
*/
@AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.CONCEPTCOLLECTION, paramIndex = 3, userRole = { RoleNames.ROLE_CC_COLLABORATOR_ADMIN }) })
@RequestMapping(value = "auth/conceptcollections/updatecollection/{collectionid}", method = RequestMethod.POST)
public String updateConceptCollectionDetails(
@Validated @ModelAttribute("collection") ConceptCollection collection,
BindingResult result,
@PathVariable("collectionid") String collectionid,
Principal principal, Model model, RedirectAttributes redirectAttrs, Locale locale) throws QuadrigaStorageException,
QuadrigaAccessException {
if (result.hasErrors()) {
model.addAttribute("collection", collection);
model.addAttribute("show_error_alert", true);
model.addAttribute("error_alert_msg",
messageSource.getMessage("concept_collection.modify.failure", new Object[] {}, locale));
return "auth/conceptcollections/updatecollectiondetails";
} else {
collectionManager.updateCollectionDetails(collection, principal.getName());
redirectAttrs.addFlashAttribute("show_success_alert", true);
redirectAttrs.addFlashAttribute("success_alert_msg",
messageSource.getMessage("concept_collection.modify.success", new Object[] {}, locale));
}
return "redirect:/auth/conceptcollections/" + collectionid;
}
}