/** * ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium. */ package org.esupportail.helpdesk.web.controllers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; import org.esupportail.commons.aop.cache.RequestCache; import org.esupportail.commons.services.authentication.AuthUtils; import org.esupportail.commons.services.logging.Logger; import org.esupportail.commons.services.logging.LoggerImpl; import org.esupportail.commons.utils.HttpUtils; import org.esupportail.commons.utils.strings.StringUtils; import org.esupportail.helpdesk.domain.beans.DepartmentManager; import org.esupportail.helpdesk.domain.beans.User; import org.esupportail.helpdesk.services.statistics.StatisticsUtils; import org.esupportail.helpdesk.web.beans.TicketMonitoringI18nKeyProvider; /** * A bean to manage user preferences. */ public class PreferencesController extends AbstractContextAwareController { /** * The serialization id. */ private static final long serialVersionUID = 8413538915740558036L; /** * The prefix of i18n values for start pages. */ private static final String START_PAGE_PREFIX = "DOMAIN.START_PAGE."; /** * The prefix of i18n values for page transitions. */ private static final String PAGE_TRANSITION_PREFIX = "DOMAIN.PAGE_TRANSITION."; /** * The control panel default refresh delays. */ private static final String DEFAULT_CONTROL_PANEL_REFRESH_DELAYS = "1,2,5"; /** * A list of JSF components for the locales. */ private static List<SelectItem> localeItems; /** * A logger. */ private final Logger logger = new LoggerImpl(this.getClass()); /** * The department manager to update. */ private DepartmentManager departmentManagerToUpdate; /** * The old password. */ private String oldPassword; /** * The new password. */ private String newPassword1; /** * The new password. */ private String newPassword2; /** * The control panel refresh delays. */ private List<Integer> controlPanelRefreshDelays; /** * Bean constructor. */ @SuppressWarnings("unchecked") public PreferencesController() { super(); localeItems = new ArrayList<SelectItem>(); Iterator<Locale> iter = FacesContext.getCurrentInstance().getApplication().getSupportedLocales(); while (iter.hasNext()) { Locale locale = iter.next(); localeItems.add(new SelectItem( locale, locale.getLanguage() + " - " + locale.getDisplayLanguage(locale))); } } /** * @see org.esupportail.helpdesk.web.controllers.AbstractContextAwareController#afterPropertiesSetInternal() */ @Override public void afterPropertiesSetInternal() { super.afterPropertiesSetInternal(); if (controlPanelRefreshDelays == null) { setControlPanelRefreshDelays(DEFAULT_CONTROL_PANEL_REFRESH_DELAYS); } } /** * JSF callback. * @return A String. */ public String enter() { if (!isPageAuthorized()) { return null; } getSessionController().setShowShortMenu(false); return "navigationPreferences"; } /** * @see org.esupportail.helpdesk.web.controllers.AbstractContextAwareController#reset() */ @Override public void reset() { super.reset(); departmentManagerToUpdate = null; } /** * @see java.lang.Object#toString() */ @Override public String toString() { return getClass().getSimpleName() + "#" + hashCode(); } /** * @return true if the current user is allowed to view the page. */ public boolean isPageAuthorized() { return getCurrentUser() != null; } /** * @return the user agent. */ public String getUserAgent() { return HttpUtils.getUserAgent(); } /** * @return true if the current user is a manager. */ public boolean isUserManager() { User user = getCurrentUser(); if (user == null) { return false; } return getDomainService().isDepartmentManager(user); } /** * @return true if the current user is a manager or administrator. */ public boolean isUserManagerOrAdmin() { User user = getCurrentUser(); if (user == null) { return false; } return user.getAdmin() || getDomainService().isDepartmentManager(user); } /** * @return the localeItems */ public List<SelectItem> getLocaleItems() { return localeItems; } /** * Add a start page item. * @param startPageItems * @param item */ public void addStartPageItem( final List<SelectItem> startPageItems, final String item) { startPageItems.add(new SelectItem(item, getString(START_PAGE_PREFIX + item))); } /** * @return the startPageItems */ public List<SelectItem> getStartPageItems() { List<SelectItem> startPageItems = new ArrayList<SelectItem>(); addStartPageItem(startPageItems, User.START_PAGE_WELCOME); addStartPageItem(startPageItems, User.START_PAGE_BOOKMARKS); addStartPageItem(startPageItems, User.START_PAGE_FAQ); addStartPageItem(startPageItems, User.START_PAGE_CONTROL_PANEL); addStartPageItem(startPageItems, User.START_PAGE_SEARCH); addStartPageItem(startPageItems, User.START_PAGE_PREFERENCES); addStartPageItem(startPageItems, User.START_PAGE_ABOUT); if (getDomainService().isDepartmentManager(getCurrentUser())) { addStartPageItem(startPageItems, User.START_PAGE_JOURNAL); addStartPageItem(startPageItems, User.START_PAGE_STATISTICS); } return startPageItems; } /** * Add a page transition item. * @param pageTransitionItems * @param item */ public void addPageTransitionItem( final List<SelectItem> pageTransitionItems, final String item) { pageTransitionItems.add(new SelectItem(item, getString(PAGE_TRANSITION_PREFIX + item))); } /** * @return the startPageItems */ public List<SelectItem> getPageTransitionItems() { List<SelectItem> pageTransitionItems = new ArrayList<SelectItem>(); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_FREEZE_TEXT_IMAGE); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_FREEZE_TEXT); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_FREEZE_IMAGE); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_FREEZE); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_TEXT_IMAGE); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_TEXT); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_IMAGE); addPageTransitionItem(pageTransitionItems, User.PAGE_TRANSITION_NONE); return pageTransitionItems; } /** * Add a report time item. * @param reportTimeItems * @param item */ public void addReportTimeItem( final List<SelectItem> reportTimeItems, final Integer item) { reportTimeItems.add(new SelectItem( item, getString("MANAGER_PREFERENCES.REPORT.TIME_ITEM.VALUE", item))); } /** * @return the reportTimeItems */ public List<SelectItem> getReportTimeItems() { List<SelectItem> reportTimeItems = new ArrayList<SelectItem>(); reportTimeItems.add(new SelectItem( -1, getString("MANAGER_PREFERENCES.REPORT.TIME_ITEM.NONE"))); for (int i = 0; i < StatisticsUtils.HOURS_PER_DAY; i++) { addReportTimeItem(reportTimeItems, i); } return reportTimeItems; } /** * Add a control panel refresh delay item. * @param controlPanelRefreshDelayItems * @param item */ public void addControlPanelRefreshDelayItem( final List<SelectItem> controlPanelRefreshDelayItems, final Integer item) { String i18nString = "PREFERENCES.CONTROL_PANEL_REFRESH_DELAY."; if (item == 0) { i18nString += "NEVER"; } else if (item == 1) { i18nString += "ONE"; } else { i18nString += "MORE"; } controlPanelRefreshDelayItems.add(new SelectItem( item, getString(i18nString, item))); } /** * @return the controlPanelRefreshDelayItems */ public List<SelectItem> getControlPanelRefreshDelayItems() { List<SelectItem> controlPanelRefreshDelayItems = new ArrayList<SelectItem>(); addControlPanelRefreshDelayItem(controlPanelRefreshDelayItems, 0); for (Integer value : getControlPanelRefreshDelays()) { addControlPanelRefreshDelayItem(controlPanelRefreshDelayItems, value); } return controlPanelRefreshDelayItems; } /** * @param locale the locale to set */ public void setLocale(final Locale locale) { User currentUser = getCurrentUser(); if (currentUser == null) { // store in the session setSessionLocale(locale); } else { // update the current user if (logger.isDebugEnabled()) { logger.debug("set language [" + locale + "] for user '" + currentUser.getId() + "'"); } currentUser.setLanguage(locale.toString()); setSessionLocale(locale); addInfoMessage(null, "PREFERENCES.MESSAGE.UPDATED"); } } /** * JSF callback. */ public void updateUser() { User currentUser = getCurrentUser(); getDomainService().updateUser(currentUser); getSessionController().resetSessionLocale(); } /** * Add a ticket monitoring select item. * @param ticketMonitoringItems * @param key */ public void addTicketMonitoringItems( final List<SelectItem> ticketMonitoringItems, final int key) { ticketMonitoringItems.add(new SelectItem( new Integer(key), getString(TicketMonitoringI18nKeyProvider.getI18nKey(key)))); } /** * @return the localeItems */ public List<SelectItem> getTicketMonitoringItems() { List<SelectItem> ticketMonitoringItems = new ArrayList<SelectItem>(); addTicketMonitoringItems( ticketMonitoringItems, DepartmentManager.TICKET_MONITORING_ALWAYS); addTicketMonitoringItems( ticketMonitoringItems, DepartmentManager.TICKET_MONITORING_CREATION); addTicketMonitoringItems( ticketMonitoringItems, DepartmentManager.TICKET_MONITORING_NEVER); return ticketMonitoringItems; } /** * @return a permanent link to the page for application users. */ public String getApplicationPermLink() { return getUrlBuilder().getPreferencesUrl(AuthUtils.APPLICATION); } /** * @return a permanent link to the page for CAS users. */ public String getCasPermLink() { return getUrlBuilder().getPreferencesUrl(AuthUtils.CAS); } /** * @return a permanent link to the page for Shibboleth users. */ public String getShibbolethPermLink() { return getUrlBuilder().getPreferencesUrl(AuthUtils.SHIBBOLETH); } /** * @return a permanent link to the page for specific users. */ public String getSpecificPermLink() { return getUrlBuilder().getPreferencesUrl(AuthUtils.SPECIFIC); } /** * @return the department managers that correspond to the current user. */ @RequestCache public List<DepartmentManager> getDepartmentManagers() { return getDomainService().getDepartmentManagers(getCurrentUser()); } /** * JSF callback. */ public void updateManager() { getDomainService().updateDepartmentManager(departmentManagerToUpdate); addInfoMessage(null, "PREFERENCES.MESSAGE.UPDATED"); } /** * JSF callback. */ public void updateManagerAndTestReport() { getDomainService().updateDepartmentManager(departmentManagerToUpdate); getDomainService().sendTicketReport(departmentManagerToUpdate); addInfoMessage(null, "MANAGER_PREFERENCES.MESSAGE.REPORT_SENT"); } /** * JSF callback. */ public void toggleTicketReports() { User user = getCurrentUser(); user.setReceiveTicketReports(!user.getReceiveTicketReports()); getDomainService().updateUser(user); addInfoMessage(null, "PREFERENCES.MESSAGE.UPDATED"); } /** * JSF callback. */ public void toggleFaqReports() { User user = getCurrentUser(); user.setReceiveFaqReports(!user.getReceiveFaqReports()); getDomainService().updateUser(user); addInfoMessage(null, "PREFERENCES.MESSAGE.UPDATED"); } /** * JSF callback. */ public void toggleMonitoring() { User user = getCurrentUser(); user.setReceiveManagerMonitoring(!user.getReceiveManagerMonitoring()); getDomainService().updateUser(user); addInfoMessage(null, "PREFERENCES.MESSAGE.UPDATED"); } /** * JSF callback. * @return a String. */ public String gotoChangePassword() { if (!getDomainService().getUserStore().isApplicationUser(getCurrentUser())) { return null; } return "changePassword"; } /** * JSF callback. * @return a String. */ public String doChangePassword() { if (oldPassword == null) { addErrorMessage(null, "PREFERENCES.MESSAGE.ENTER_OLD_PASSWORD"); gotoChangePassword(); return null; } if (newPassword1 == null || newPassword2 == null || !newPassword1.equals(newPassword2)) { addErrorMessage(null, "PREFERENCES.MESSAGE.ENTER_NEW_PASSWORD_TWICE"); gotoChangePassword(); return null; } if (!oldPassword.equals(getCurrentUser().getPassword())) { addErrorMessage(null, "PREFERENCES.MESSAGE.OLD_PASSWORD_ERROR"); gotoChangePassword(); return null; } getCurrentUser().setPassword(newPassword1); getDomainService().updateUser(getCurrentUser()); oldPassword = null; newPassword1 = null; newPassword2 = null; addErrorMessage(null, "PREFERENCES.MESSAGE.PASSWORD_CHANGED"); return "passwordChanged"; } /** * @param departmentManagerToUpdate the departmentManagerToUpdate to set */ public void setDepartmentManagerToUpdate( final DepartmentManager departmentManagerToUpdate) { this.departmentManagerToUpdate = departmentManagerToUpdate; } /** * @return the oldPassword */ public String getOldPassword() { return oldPassword; } /** * @param oldPassword the oldPassword to set */ public void setOldPassword(final String oldPassword) { this.oldPassword = StringUtils.nullIfEmpty(oldPassword); } /** * @return the newPassword1 */ public String getNewPassword1() { return newPassword1; } /** * @param newPassword1 the newPassword1 to set */ public void setNewPassword1(final String newPassword1) { this.newPassword1 = StringUtils.nullIfEmpty(newPassword1); } /** * @return the newPassword2 */ public String getNewPassword2() { return newPassword2; } /** * @param newPassword2 the newPassword2 to set */ public void setNewPassword2(final String newPassword2) { this.newPassword2 = StringUtils.nullIfEmpty(newPassword2); } /** * @return the controlPanelRefreshDelays */ protected List<Integer> getControlPanelRefreshDelays() { return controlPanelRefreshDelays; } /** * @param controlPanelRefreshDelaysString the controlPanelRefreshDelays to set */ public void setControlPanelRefreshDelays(final String controlPanelRefreshDelaysString) { controlPanelRefreshDelays = new ArrayList<Integer>(); for (String stringValue : controlPanelRefreshDelaysString.split(",")) { Integer intValue = Integer.parseInt(stringValue); if (!controlPanelRefreshDelays.contains(intValue)) { controlPanelRefreshDelays.add(intValue); } } } }