001/* 002 * This library is part of OpenCms - 003 * the Open Source Content Management System 004 * 005 * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * For further information about Alkacon Software, please see the 018 * company website: http://www.alkacon.com 019 * 020 * For further information about OpenCms, please see the 021 * project website: http://www.opencms.org 022 * 023 * You should have received a copy of the GNU Lesser General Public 024 * License along with this library; if not, write to the Free Software 025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 026 */ 027 028package org.opencms.gwt; 029 030import org.opencms.configuration.CmsDefaultUserSettings; 031import org.opencms.configuration.preferences.I_CmsPreference; 032import org.opencms.file.CmsObject; 033import org.opencms.file.CmsUser; 034import org.opencms.gwt.shared.CmsGwtConstants; 035import org.opencms.gwt.shared.CmsUserSettingsBean; 036import org.opencms.i18n.CmsMessages; 037import org.opencms.i18n.CmsMultiMessages; 038import org.opencms.jsp.CmsJspActionElement; 039import org.opencms.main.CmsLog; 040import org.opencms.main.OpenCms; 041import org.opencms.util.CmsMacroResolver; 042import org.opencms.workplace.CmsWorkplace; 043import org.opencms.xml.content.CmsXmlContentProperty; 044import org.opencms.xml.content.CmsXmlContentPropertyHelper; 045 046import java.util.Locale; 047import java.util.Map; 048 049import javax.servlet.http.HttpServletRequest; 050import javax.servlet.http.HttpServletResponse; 051 052import org.apache.commons.logging.Log; 053 054/** 055 * Helper class to deal with loading and saving user preferences from the ADE user interface.<p> 056 */ 057public class CmsClientUserSettingConverter { 058 059 /** 060 * Subclass of the normal action element which can be created even if we are not being called from a JSP.<p> 061 */ 062 class NoJspActionElement extends CmsJspActionElement { 063 064 /** The CMS object to use. */ 065 private CmsObject m_setCms; 066 067 /** 068 * Creates a new instance.<p> 069 * 070 * @param cms the CMS context to use 071 * @param req the current request 072 * @param res the current response 073 */ 074 public NoJspActionElement(CmsObject cms, HttpServletRequest req, HttpServletResponse res) { 075 076 super(null, req, res); 077 m_setCms = cms; 078 079 } 080 081 /** 082 * @see org.opencms.jsp.CmsJspBean#getCmsObject() 083 */ 084 @Override 085 public CmsObject getCmsObject() { 086 087 return m_setCms; 088 } 089 090 /** 091 * @see org.opencms.jsp.CmsJspBean#handleMissingFlexController() 092 */ 093 @Override 094 protected void handleMissingFlexController() { 095 096 // ignore 097 } 098 099 } 100 101 /** Logger instance for this class. */ 102 private static final Log LOG = CmsLog.getLog(CmsClientUserSettingConverter.class); 103 104 /** The CMS context to use. */ 105 private CmsObject m_cms; 106 107 /** The current request. */ 108 private HttpServletRequest m_request; 109 110 /** The macro resolver used for macros in preference property definitions. */ 111 private CmsMacroResolver m_macroResolver = new CmsMacroResolver(); 112 113 /** The current preferences. */ 114 private CmsDefaultUserSettings m_currentPreferences; 115 116 /** 117 * Creates a new instance.<p> 118 * 119 * @param cms the current CMS context 120 * @param request the current request 121 * @param response the current response 122 */ 123 public CmsClientUserSettingConverter(CmsObject cms, HttpServletRequest request, HttpServletResponse response) { 124 125 m_cms = cms; 126 m_request = request; 127 m_currentPreferences = new CmsDefaultUserSettings(); 128 m_currentPreferences.init(cms.getRequestContext().getCurrentUser()); 129 Locale locale = OpenCms.getWorkplaceManager().getWorkplaceLocale(cms); 130 CmsMultiMessages messages = new CmsMultiMessages(locale); 131 messages.addMessages(OpenCms.getWorkplaceManager().getMessages(locale)); 132 messages.addMessages(org.opencms.workplace.commons.Messages.get().getBundle(locale)); 133 m_macroResolver.setMessages(messages); 134 135 } 136 137 /** 138 * Loads the current user's preferences into a CmsUserSettingsBean.<p> 139 * 140 * @return the bean representing the current user's preferences 141 */ 142 public CmsUserSettingsBean loadSettings() { 143 144 CmsUserSettingsBean result = new CmsUserSettingsBean(); 145 CmsDefaultUserSettings currentSettings = new CmsDefaultUserSettings(); 146 currentSettings.init(m_currentPreferences.getUser()); 147 for (I_CmsPreference pref : OpenCms.getWorkplaceManager().getDefaultUserSettings().getPreferences().values()) { 148 String tab = pref.getTab(); 149 if (CmsGwtConstants.TAB_HIDDEN.equals(tab) || pref.isDisabled()) { 150 continue; 151 } 152 CmsXmlContentProperty prop2 = pref.getPropertyDefinition(m_cms); 153 String value = pref.getValue(currentSettings); 154 CmsXmlContentProperty resolvedProp = CmsXmlContentPropertyHelper.resolveMacrosInProperty( 155 prop2.withDefaultWidget("string"), 156 m_macroResolver); 157 result.addSetting(value, resolvedProp, CmsGwtConstants.TAB_BASIC.equals(tab)); 158 } 159 addAccountInfo(result); 160 return result; 161 } 162 163 /** 164 * Saves the given user preference values.<p> 165 * 166 * @param settings the user preference values to save 167 * 168 * @throws Exception if something goes wrong 169 */ 170 public void saveSettings(Map<String, String> settings) throws Exception { 171 172 for (Map.Entry<String, String> entry : settings.entrySet()) { 173 String key = entry.getKey(); 174 String value = entry.getValue(); 175 saveSetting(key, value); 176 } 177 m_currentPreferences.save(m_cms); 178 CmsWorkplace.updateUserPreferences(m_cms, m_request); 179 } 180 181 /** 182 * Adds the account information to a user settings bean.<p> 183 * 184 * @param prefs the user settings bean to which the information should be added 185 */ 186 private void addAccountInfo(CmsUserSettingsBean prefs) { 187 188 Locale wpLocale = OpenCms.getWorkplaceManager().getWorkplaceLocale(m_cms); 189 CmsMessages wpMessages = org.opencms.workplace.commons.Messages.get().getBundle(wpLocale); 190 CmsUser user = m_currentPreferences.getUser(); 191 192 prefs.addAccountInfo(wpMessages.key(org.opencms.workplace.commons.Messages.GUI_LABEL_USER_0), user.getName()); 193 prefs.addAccountInfo(wpMessages.key(org.opencms.workplace.commons.Messages.GUI_LABEL_EMAIL_0), user.getEmail()); 194 prefs.addAccountInfo( 195 wpMessages.key(org.opencms.workplace.commons.Messages.GUI_LABEL_LASTNAME_0), 196 user.getLastname()); 197 prefs.addAccountInfo( 198 wpMessages.key(org.opencms.workplace.commons.Messages.GUI_LABEL_FIRSTNAME_0), 199 user.getFirstname()); 200 prefs.addAccountInfo( 201 wpMessages.key(org.opencms.workplace.commons.Messages.GUI_INPUT_ADRESS_0), 202 user.getAddress()); 203 prefs.addAccountInfo( 204 wpMessages.key(org.opencms.workplace.commons.Messages.GUI_LABEL_DESCRIPTION_0), 205 user.getDescription(wpLocale)); 206 } 207 208 /** 209 * Saves an individual user preference value.<p> 210 * 211 * @param key the key of the user preference 212 * @param value the value of the user preference 213 * 214 * @throws Exception if something goes wrong 215 */ 216 private void saveSetting(String key, String value) throws Exception { 217 218 Map<String, I_CmsPreference> prefs = OpenCms.getWorkplaceManager().getDefaultUserSettings().getPreferences(); 219 if (prefs.containsKey(key)) { 220 prefs.get(key).setValue(m_currentPreferences, value); 221 } else { 222 LOG.error("Can't save user setting '" + key + "'"); 223 } 224 } 225 226}