/** * ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium. */ package org.esupportail.helpdesk.web.controllers; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.esupportail.commons.aop.cache.RequestCache; import org.esupportail.commons.services.authentication.AuthUtils; import org.esupportail.helpdesk.domain.beans.Department; import org.esupportail.helpdesk.domain.beans.Response; import org.springframework.util.StringUtils; /** * The responses controller. */ public class ResponsesController extends AbstractContextAwareController { /** * The serialization id. */ private static final long serialVersionUID = 2863153063528865413L; /** * The global responses. */ private List<Response> globalResponses; /** * The user responses. */ private List<Response> userResponses; /** * The targetDepartment. */ private Department targetDepartment; /** * The departments. */ private List<Department> departments; /** * The department responses. */ private Map<Department, List<Response>> departmentResponses; /** * True when the user can manage the department responses. */ private Map<Department, Boolean> userCanManageDepartmentResponses; /** * The number of department responses. */ private Map<Department, Integer> departmentResponsesNumber; /** * The response to add. */ private Response responseToAdd; /** * The response to update. */ private Response responseToUpdate; /** * The response to delete. */ private Response responseToDelete; /** * Bean constructor. */ public ResponsesController() { super(); } /** * @see org.esupportail.helpdesk.web.controllers.AbstractContextAwareController#reset() */ @Override public void reset() { super.reset(); globalResponses = null; userResponses = null; responseToAdd = new Response(); responseToDelete = null; responseToUpdate = null; departments = null; departmentResponses = new LinkedHashMap<Department, List<Response>>(); departmentResponses = null; userCanManageDepartmentResponses = null; departmentResponsesNumber = null; } /** * @see java.lang.Object#toString() */ @Override public String toString() { return getClass().getSimpleName() + "#" + hashCode(); } /** * @return true if the current user is allowed to access the view. */ @RequestCache public boolean isPageAuthorized() { if (getCurrentUser() == null) { return false; } if (getCurrentUser().getAdmin()) { return true; } if (!getDomainService().isDepartmentManager(getCurrentUser())) { return false; } return true; } /** * JSF callback. * @return A String. */ public String enter() { if (!isPageAuthorized()) { return null; } getSessionController().setShowShortMenu(false); globalResponses = getDomainService().getGlobalResponses(); userResponses = getDomainService().getUserResponses(getCurrentUser()); departments = getDomainService().getManagedDepartments(getCurrentUser()); departmentResponses = new LinkedHashMap<Department, List<Response>>(); userCanManageDepartmentResponses = new LinkedHashMap<Department, Boolean>(); departmentResponsesNumber = new LinkedHashMap<Department, Integer>(); for (Department department : departments) { List<Response> responses = getDomainService().getDepartmentResponses(department); departmentResponses.put( department, responses); userCanManageDepartmentResponses.put( department, getDomainService().userCanManageDepartmentResponses( getCurrentUser(), department)); departmentResponsesNumber.put(department, responses.size()); } return "navigationResponses"; } /** * JSF callback. * @return true if the user can manage global responses. */ @RequestCache public boolean isUserCanManageGlobalResponses() { return getDomainService().userCanManageGlobalResponses(getCurrentUser()); } /** * JSF callback. * @return a String. */ public String addGlobalResponse() { if (!isUserCanManageGlobalResponses()) { addUnauthorizedActionMessage(); return null; } responseToAdd.setDepartment(null); responseToAdd.setUser(null); return "addResponse"; } /** * JSF callback. * @return a String. */ public String addUserResponse() { responseToAdd.setDepartment(null); responseToAdd.setUser(getCurrentUser()); return "addResponse"; } /** * JSF callback. * @return a String. */ public String addDepartmentResponse() { responseToAdd.setDepartment(targetDepartment); responseToAdd.setUser(null); return "addResponse"; } /** * JSF callback. * @return a String. */ public String doAddResponse() { if (responseToAdd.isGlobalResponse() && !isUserCanManageGlobalResponses()) { addUnauthorizedActionMessage(); return null; } if (responseToAdd.isDepartmentResponse() && !userCanManageDepartmentResponses.get(responseToAdd.getDepartment())) { addUnauthorizedActionMessage(); return null; } if (!StringUtils.hasText(responseToAdd.getLabel())) { addErrorMessage(null, "RESPONSES.MESSAGE.ENTER_LABEL"); return null; } if (!StringUtils.hasText(responseToAdd.getMessage())) { addErrorMessage(null, "RESPONSES.MESSAGE.ENTER_MESSAGE"); return null; } getDomainService().addResponse(responseToAdd); responseToAdd = new Response(); enter(); return "responseAdded"; } /** * JSF callback. * @return a String. */ public String doDeleteResponse() { if (responseToDelete.isGlobalResponse() && !isUserCanManageGlobalResponses()) { addUnauthorizedActionMessage(); return null; } if (responseToDelete.isDepartmentResponse() && !userCanManageDepartmentResponses.get(responseToDelete.getDepartment())) { addUnauthorizedActionMessage(); return null; } getDomainService().deleteResponse(responseToDelete); enter(); return "responseDeleted"; } /** * JSF callback. * @return a String. */ public String editResponse() { if (responseToUpdate.isGlobalResponse() && !isUserCanManageGlobalResponses()) { addUnauthorizedActionMessage(); return null; } if (responseToUpdate.isDepartmentResponse() && !userCanManageDepartmentResponses.get(responseToUpdate.getDepartment())) { addUnauthorizedActionMessage(); return null; } return "editResponse"; } /** * JSF callback. * @return a String. */ public String doEditResponse() { if (responseToUpdate.isGlobalResponse() && !isUserCanManageGlobalResponses()) { addUnauthorizedActionMessage(); return null; } if (responseToUpdate.isDepartmentResponse() && !userCanManageDepartmentResponses.get(responseToUpdate.getDepartment())) { addUnauthorizedActionMessage(); return null; } getDomainService().updateResponse(responseToUpdate); enter(); return "responseUpdated"; } /** * @return a permanent link to the page for application users. */ public String getApplicationPermLink() { return getUrlBuilder().getResponsesUrl(AuthUtils.APPLICATION); } /** * @return a permanent link to the page for CAS users. */ public String getCasPermLink() { return getUrlBuilder().getResponsesUrl(AuthUtils.CAS); } /** * @return a permanent link to the page for Shibboleth users. */ public String getShibbolethPermLink() { return getUrlBuilder().getResponsesUrl(AuthUtils.SHIBBOLETH); } /** * @return a permanent link to the page for specific users. */ public String getSpecificPermLink() { return getUrlBuilder().getResponsesUrl(AuthUtils.SPECIFIC); } /** * @return the globalResponses */ public List<Response> getGlobalResponses() { return globalResponses; } /** * @return the number of globalResponses */ public int getGlobalResponsesNumber() { return globalResponses.size(); } /** * @param globalResponses the globalResponses to set */ protected void setGlobalResponses(final List<Response> globalResponses) { this.globalResponses = globalResponses; } /** * @return the responseToAdd */ public Response getResponseToAdd() { return responseToAdd; } /** * @param responseToAdd the responseToAdd to set */ protected void setResponseToAdd(final Response responseToAdd) { this.responseToAdd = responseToAdd; } /** * @return the responseToUpdate */ public Response getResponseToUpdate() { return responseToUpdate; } /** * @param responseToUpdate the responseToUpdate to set */ public void setResponseToUpdate(final Response responseToUpdate) { this.responseToUpdate = new Response(responseToUpdate); } /** * @return the responseToDelete */ public Response getResponseToDelete() { return responseToDelete; } /** * @param responseToDelete the responseToDelete to set */ public void setResponseToDelete(final Response responseToDelete) { this.responseToDelete = responseToDelete; } /** * @return the userResponses */ public List<Response> getUserResponses() { return userResponses; } /** * @return the number of userResponses */ public int getUserResponsesNumber() { return userResponses.size(); } /** * @param userResponses the userResponses to set */ protected void setUserResponses(final List<Response> userResponses) { this.userResponses = userResponses; } /** * @return the departments */ public List<Department> getDepartments() { return departments; } /** * @return the departmentResponses */ public Map<Department, List<Response>> getDepartmentResponses() { return departmentResponses; } /** * @return the userCanManageDepartmentResponses */ public Map<Department, Boolean> getUserCanManageDepartmentResponses() { return userCanManageDepartmentResponses; } /** * @param targetDepartment the targetDepartment to set */ public void setTargetDepartment(final Department targetDepartment) { this.targetDepartment = targetDepartment; } /** * @return the departmentResponsesNumber */ public Map<Department, Integer> getDepartmentResponsesNumber() { return departmentResponsesNumber; } /** * @param departmentResponsesNumber the departmentResponsesNumber to set */ protected void setDepartmentResponsesNumber( final Map<Department, Integer> departmentResponsesNumber) { this.departmentResponsesNumber = departmentResponsesNumber; } }