/** * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.organization.webui.component; import org.exoplatform.commons.serialization.api.annotations.Serialized; import org.exoplatform.portal.Constants; import org.exoplatform.portal.application.PortalRequestContext; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.portal.webui.workspace.UIPortalApplication; import org.exoplatform.portal.webui.workspace.UIWorkingWorkspace; import org.exoplatform.services.organization.OrganizationService; import org.exoplatform.services.organization.User; import org.exoplatform.services.organization.UserProfile; import org.exoplatform.services.organization.UserProfileHandler; import org.exoplatform.services.organization.UserStatus; import org.exoplatform.services.resources.LocaleConfig; import org.exoplatform.services.resources.LocaleConfigService; import org.exoplatform.web.application.AbstractApplicationMessage; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputContainer; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormTabPane; import org.exoplatform.webui.organization.UIUserMembershipSelector; import org.exoplatform.webui.organization.UIUserProfileInputSet; import java.util.ResourceBundle; /** Created by The eXo Platform SARL Author : chungnv nguyenchung136@yahoo.com Jun 23, 2006 10:07:15 AM */ @ComponentConfig(lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormTabPane.gtmpl", events = { @EventConfig(listeners = UIUserInfo.SaveActionListener.class, csrfCheck = true), @EventConfig(listeners = UIUserInfo.BackActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIUserInfo.ToggleChangePasswordActionListener.class, phase = Phase.DECODE) }) @Serialized public class UIUserInfo extends UIFormTabPane { private String username_ = null; public UIUserInfo() throws Exception { super("UIUserInfo"); UIFormInputSet accountInputSet = new UIAccountEditInputSet("UIAccountEditInputSet"); addChild(accountInputSet); setSelectedTab(accountInputSet.getId()); UIFormInputSet userProfileSet = new UIUserProfileInputSet("UIUserProfileInputSet"); addChild(userProfileSet); UIFormInputContainer<?> uiUserMembershipSelectorSet = new UIUserMembershipSelector(); addChild(uiUserMembershipSelectorSet); setActions(new String[] { "Save", "Back" }); } public void setUser(String userName) throws Exception { username_ = userName; OrganizationService service = getApplicationComponent(OrganizationService.class); User user = service.getUserHandler().findUserByName(userName, UserStatus.ANY); getChild(UIAccountEditInputSet.class).setValue(user); getChild(UIUserProfileInputSet.class).setUserProfile(userName); UIUserMembershipSelector uiMembershipSelector = getChild(UIUserMembershipSelector.class); uiMembershipSelector.setUser(user); } public String getUserName() { return username_; } public void processRender(WebuiRequestContext context) throws Exception { super.processRender(context); UIUserMembershipSelector uiUserMembershipSelector = getChild(UIUserMembershipSelector.class); if (uiUserMembershipSelector == null) { return; } UIPopupWindow uiPopupWindow = uiUserMembershipSelector.getChild(UIPopupWindow.class); if (uiPopupWindow == null) { return; } uiPopupWindow.processRender(context); } public static class SaveActionListener extends EventListener<UIUserInfo> { public void execute(Event<UIUserInfo> event) throws Exception { UIUserInfo uiUserInfo = event.getSource(); OrganizationService service = uiUserInfo.getApplicationComponent(OrganizationService.class); boolean save = uiUserInfo.getChild(UIAccountEditInputSet.class).save(service); if (!save) { return; } // TODO: UserProfile save can be unsuccessful, but user info from accountEditInputSet has been already edited. So it's not atomic edit... save = uiUserInfo.getChild(UIUserProfileInputSet.class).save(service, uiUserInfo.getUserName(), false); if (!save) { return; } if (uiUserInfo.getUserName().equals(event.getRequestContext().getRemoteUser())) { UserProfileHandler hanlder = service.getUserProfileHandler(); UserProfile userProfile = hanlder.findUserProfileByName(event.getRequestContext().getRemoteUser()); String language = userProfile != null ? userProfile.getAttribute(Constants.USER_LANGUAGE) : null; UIPortalApplication uiApp = Util.getUIPortalApplication(); if (language != null && language.trim().length() >= 1) { LocaleConfigService localeConfigService = event.getSource().getApplicationComponent(LocaleConfigService.class); LocaleConfig localeConfig = localeConfigService.getLocaleConfig(language); if (localeConfig == null) localeConfig = localeConfigService.getDefaultLocaleConfig(); PortalRequestContext prqCtx = Util.getPortalRequestContext(); prqCtx.setLocale(localeConfig.getLocale()); // GTNPORTAL-3244: A workaround to update localization in the popup messages ResourceBundle bundle = Util.getPortalRequestContext().getApplication().getResourceBundle(localeConfig.getLocale()); for(AbstractApplicationMessage message : uiApp.getUIPopupMessages().getErrors()) { message.setResourceBundle(bundle); } for(AbstractApplicationMessage message : uiApp.getUIPopupMessages().getWarnings()) { message.setResourceBundle(bundle); } for(AbstractApplicationMessage message : uiApp.getUIPopupMessages().getInfos()) { message.setResourceBundle(bundle); } Util.getPortalRequestContext().addUIComponentToUpdateByAjax( uiApp.findFirstComponentOfType(UIWorkingWorkspace.class)); Util.getPortalRequestContext().ignoreAJAXUpdateOnPortlets(true); } } UIAccountEditInputSet accountInput = uiUserInfo.getChild(UIAccountEditInputSet.class); UIUserProfileInputSet userProfile = uiUserInfo.getChild(UIUserProfileInputSet.class); uiUserInfo.setRenderSibling(UIListUsers.class); accountInput.reset(); userProfile.reset(); event.getRequestContext().setProcessRender(true); } } public static class BackActionListener extends EventListener<UIUserInfo> { public void execute(Event<UIUserInfo> event) throws Exception { UIUserInfo userInfo = event.getSource(); UIAccountEditInputSet accountInput = userInfo.getChild(UIAccountEditInputSet.class); UIUserProfileInputSet userProfile = userInfo.getChild(UIUserProfileInputSet.class); userInfo.setRenderSibling(UIListUsers.class); accountInput.reset(); userProfile.reset(); event.getRequestContext().setProcessRender(true); } } public static class ToggleChangePasswordActionListener extends EventListener<UIUserInfo> { public void execute(Event<UIUserInfo> event) throws Exception { UIUserInfo userInfo = event.getSource(); UIAccountEditInputSet uiAccountInput = userInfo.getChild(UIAccountEditInputSet.class); uiAccountInput.checkChangePassword(); } } }