/********************************************************************************** * $URL$ * $Id$ *********************************************************************************** * * Copyright (c) 2010 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.theospi.portfolio.prefs.control; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.entity.api.ResourcePropertiesEdit; import org.sakaiproject.event.api.NotificationService; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.IdUsedException; import org.sakaiproject.exception.InUseException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.metaobj.security.AuthenticationManager; import org.sakaiproject.metaobj.worksite.mgt.WorksiteManager; import org.sakaiproject.site.api.Site; import org.sakaiproject.tool.api.ToolManager; import org.sakaiproject.user.api.PreferencesEdit; import org.sakaiproject.user.api.PreferencesService; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; public class PreferencesController extends SimpleFormController { private PreferencesService preferencesService = null; private AuthenticationManager authManager = null; private ToolManager toolManager = null; private WorksiteManager worksiteManager = null; protected final Log logger = LogFactory.getLog(getClass()); @Override protected void onBindOnNewForm(HttpServletRequest request, Object command) throws Exception { super.onBindOnNewForm(request, command); NotificationPreferenceBean npb = (NotificationPreferenceBean)command; //populateBackingBean(request, npb); PreferencesEdit prefEdit = getPreferencesEdit(); if (prefEdit != null) { //Find the default ResourcePropertiesEdit defautProps = prefEdit.getPropertiesEdit(NotificationService.PREFS_TYPE + npb.getTypeKey()); String defaultProp = (String)defautProps.get(Integer.valueOf(NotificationService.NOTI_OPTIONAL).toString()); if (defaultProp != null) { npb.setDefaultOption(Integer.valueOf(defaultProp).intValue()); } //Find the site override ResourcePropertiesEdit props = prefEdit.getPropertiesEdit(NotificationService.PREFS_TYPE + npb.getTypeKey() + NotificationService.NOTI_OVERRIDE_EXTENSION); String prop = (String)props.get(getToolManager().getCurrentPlacement().getContext()); if (prop != null) { npb.setNotificationOption(Integer.valueOf(prop).intValue()); } //If nothing is set, use the default (which should be set for the bean) if (npb.getNotificationOption() == NotificationService.PREF_NONE) { npb.setNotificationOption(npb.getDefaultOption()); } getPreferencesService().cancel(prefEdit); } logger.debug("onBindOnNewForm(): " + npb.toString()); } @Override protected ModelAndView processFormSubmission(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Map<String, Object> model = new HashMap<String, Object>(); NotificationPreferenceBean npb = (NotificationPreferenceBean)command; logger.debug("processFormSubmission(): " + npb.toString()); passThroughToModel(npb, model); model.put(NotificationPreferenceBean.READY_TO_CLOSE_KEY, true); PreferencesEdit prefEdit = getPreferencesEdit(); List<Site> siteList = new ArrayList<Site>(); if (request.getParameter("update") != null) { Site site = getWorksiteManager().getSite(getToolManager().getCurrentPlacement().getContext()); siteList.add(site); model.put(NotificationPreferenceBean.PREFS_SAVED_DIV_TO_RETURN_KEY, npb.getPrefsSiteSavedDiv()); } else if (request.getParameter("updateAll") != null) { siteList.addAll(getSitesWithTool(npb.getToolId())); model.put(NotificationPreferenceBean.PREFS_SAVED_DIV_TO_RETURN_KEY, npb.getPrefsAllSavedDiv()); } if (prefEdit != null) { ResourcePropertiesEdit props = prefEdit.getPropertiesEdit(NotificationService.PREFS_TYPE + npb.getTypeKey() + NotificationService.NOTI_OVERRIDE_EXTENSION); for (Site site : siteList) { props.addProperty(site.getId(), Integer.toString(npb.getNotificationOption())); } try { getPreferencesService().commit(prefEdit); } catch (Exception e) { logger.warn("Problem saving preferences for site notifications in processFormSubmission().", e); } } return new ModelAndView(getSuccessView(), model); } private void passThroughToModel(NotificationPreferenceBean npb, Map<String, Object> model) { model.put(NotificationPreferenceBean.DIALOG_DIV_ID_KEY, npb.getDialogDivId()); model.put(NotificationPreferenceBean.PREFS_ALL_SAVED_DIV_KEY, npb.getPrefsAllSavedDiv()); model.put(NotificationPreferenceBean.PREFS_SITE_SAVED_DIV_KEY, npb.getPrefsSiteSavedDiv()); model.put(NotificationPreferenceBean.QUALIFIER_TEXT_KEY, npb.getQualifier_text()); model.put(NotificationPreferenceBean.TYPEKEY_KEY, npb.getTypeKey()); model.put(NotificationPreferenceBean.TOOLID_KEY, npb.getToolId()); model.put(NotificationPreferenceBean.FRAMEID_KEY, npb.getFrameId()); model.put(NotificationPreferenceBean.DEFAULTOPTION_KEY, npb.getDefaultOption()); } /** * Returns all sites that contain the passed toolId * @param toolId * @return */ private List<Site> getSitesWithTool(String toolId) { List<Site> siteList = new ArrayList<Site>(); List<Site> fullList = getWorksiteManager().getUserSites(); for (Site site : fullList) { if (site.getToolForCommonId(toolId) != null) siteList.add(site); } return siteList; } /** Return PreferencesEdit object for current user **/ private PreferencesEdit getPreferencesEdit() { if (logger.isDebugEnabled()) { logger.debug("In getPreferencesEdit(): "); //Thread.dumpStack(); } PreferencesEdit prefEdit = null; try { prefEdit = (PreferencesEdit) getPreferencesService().add(authManager.getAgent().getId().getValue()); } catch (PermissionException e) { logger.warn("Problem getting preferences for site notifications in getPreferencesEdit().", e); } catch (IdUsedException e) { // Preferences already exist, just edit try { prefEdit = (PreferencesEdit) getPreferencesService().edit(authManager.getAgent().getId().getValue()); } catch (PermissionException e1) { logger.warn("Problem getting preferences for site notifications in getPreferencesEdit().", e1); } catch (InUseException e1) { logger.warn("Problem getting preferences for site notifications in getPreferencesEdit().", e1); } catch (IdUnusedException e1) { // This should be safe to ignore since we got here because it existed logger.warn("Problem getting preferences for site notifications in getPreferencesEdit().", e1); } } return prefEdit; } public void setPreferencesService(PreferencesService preferencesService) { this.preferencesService = preferencesService; } public PreferencesService getPreferencesService() { return preferencesService; } /** * @return */ public AuthenticationManager getAuthManager() { return authManager; } /** * @param manager */ public void setAuthManager(AuthenticationManager manager) { authManager = manager; } public void setToolManager(ToolManager toolManager) { this.toolManager = toolManager; } public ToolManager getToolManager() { return toolManager; } public void setWorksiteManager(WorksiteManager worksiteManager) { this.worksiteManager = worksiteManager; } public WorksiteManager getWorksiteManager() { return worksiteManager; } }