package edu.asu.spring.quadriga.web.settings; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; 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.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; 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.factory.workbench.IPublicPageFactory; import edu.asu.spring.quadriga.domain.impl.workbench.PublicPage; import edu.asu.spring.quadriga.domain.workbench.IPublicPage; import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; import edu.asu.spring.quadriga.service.publicwebsite.IPublicPageBlockLinkTargets; import edu.asu.spring.quadriga.service.workbench.IPublicPageManager; import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager; import edu.asu.spring.quadriga.web.login.RoleNames; @Controller public class PublicPageSettingsController { @Autowired private IPublicPageFactory publicPageFactory; @Autowired private IPublicPageManager publicPageContentManager; @Autowired private IRetrieveProjectManager projectManager; /** * This method is called during the load of Public page settings form * * @return model - model object */ @AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = { RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN }) }) @RequestMapping(value = "auth/workbench/projects/{projectid}/settings", method = RequestMethod.GET) public ModelAndView publicPageSettingsForm(@PathVariable("projectid") String projectid) throws QuadrigaStorageException, QuadrigaAccessException { List<IPublicPage> publicPageList = publicPageContentManager.retrievePublicPageContent(projectid); ModelAndView model = new ModelAndView("auth/workbench/addpublicpage"); model.getModelMap().put("publicpagelist", publicPageList); model.getModel().put("publicpage", publicPageFactory.createPublicPageObject()); model.getModelMap().put("publicpageprojectid", projectid); model.getModel().put("project", projectManager.getProjectDetails(projectid)); Collections.sort(publicPageList, new Comparator<IPublicPage>() { @Override public int compare(IPublicPage o1, IPublicPage o2) { return o1.getOrder() - o2.getOrder(); } }); for (IPublicPage publicPage : publicPageList) { model.getModel().put("publicpageObject" + publicPageList.indexOf(publicPage), publicPage); } Map<String, String> linkTypes = getLinkTargetMap(); model.getModel().put("linkTypes", linkTypes); return model; } private Map<String, String> getLinkTargetMap() { Map<String, String> linkTypes = new HashMap<String, String>(); linkTypes.put(IPublicPageBlockLinkTargets.ABOUT, "About Text"); linkTypes.put(IPublicPageBlockLinkTargets.BLOG, "Project Blog"); linkTypes.put(IPublicPageBlockLinkTargets.BROWSE, "Browse Networks"); linkTypes.put(IPublicPageBlockLinkTargets.EXPLORE, "Explore Combined Network"); linkTypes.put(IPublicPageBlockLinkTargets.SEARCH, "Search Networks"); linkTypes.put(IPublicPageBlockLinkTargets.STATS, "Project Statistics"); return linkTypes; } /** * This method is used update the database with the information provided in * the Public settings page * * @return json * @throws JSONException */ @RequestMapping(method = RequestMethod.POST, value = "auth/workbench/{projectid}/addpublicpagesuccess") public @ResponseBody ResponseEntity<String> addpublicpagesuccess(@RequestParam("data") JSONObject data, @PathVariable("projectid") String projectid) throws QuadrigaStorageException, QuadrigaAccessException, JSONException { List<String> validationFailed = new ArrayList<String>(); IPublicPage publicpageentry = new PublicPage(); if (validate("title", validationFailed, data)) { publicpageentry.setTitle(data.getString("title")); } String description = data.getString("desc"); if (validate("desc", validationFailed, data)) { publicpageentry.setDescription(description); } int order = data.getInt("order"); if (validate("order", validationFailed, data)) { publicpageentry.setOrder(order); } publicpageentry.setProjectId(projectid); String pageId = data.getString("publicpageid"); if (pageId != null && !pageId.trim().isEmpty()) { publicpageentry.setPublicPageId(pageId); } String linkTo = data.getString("linkTo"); if (validate("linkTo", validationFailed, data)) { Map<String, String> linkTypes = getLinkTargetMap(); if (!linkTypes.keySet().contains(linkTo)) { validationFailed.add("linkTo"); } else { publicpageentry.setLinkTo(linkTo); } } String linkText = data.getString("linkText"); if (validate("linkText", validationFailed, data)) { publicpageentry.setLinkText(linkText); } if (!validationFailed.isEmpty()) { JSONObject fieldList = new JSONObject(); fieldList.put("fields", validationFailed); return new ResponseEntity<String>(fieldList.toString(), HttpStatus.BAD_REQUEST); } publicPageContentManager.saveOrUpdatePublicPage(publicpageentry); return new ResponseEntity<String>("Successfully updated", HttpStatus.OK); } private boolean validate(String field, List<String> validationList, JSONObject data) throws JSONException { String value = data.getString(field); if (value == null || value.trim().isEmpty()) { validationList.add(field); return false; } return true; } }