Java tutorial
/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library 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 library 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. */ package com.liferay.users.admin.web.internal.portlet.action; import com.liferay.announcements.kernel.model.AnnouncementsDelivery; import com.liferay.announcements.kernel.service.AnnouncementsDeliveryLocalService; import com.liferay.asset.kernel.exception.AssetCategoryException; import com.liferay.asset.kernel.exception.AssetTagException; import com.liferay.document.library.kernel.service.DLAppLocalService; import com.liferay.petra.string.CharPool; import com.liferay.petra.string.StringPool; import com.liferay.portal.kernel.bean.BeanParamUtil; import com.liferay.portal.kernel.exception.CompanyMaxUsersException; import com.liferay.portal.kernel.exception.ContactBirthdayException; import com.liferay.portal.kernel.exception.ContactNameException; import com.liferay.portal.kernel.exception.GroupFriendlyURLException; import com.liferay.portal.kernel.exception.NoSuchListTypeException; import com.liferay.portal.kernel.exception.NoSuchUserException; import com.liferay.portal.kernel.exception.RequiredUserException; import com.liferay.portal.kernel.exception.UserEmailAddressException; import com.liferay.portal.kernel.exception.UserFieldException; import com.liferay.portal.kernel.exception.UserIdException; import com.liferay.portal.kernel.exception.UserReminderQueryException; import com.liferay.portal.kernel.exception.UserScreenNameException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.model.Address; import com.liferay.portal.kernel.model.Company; import com.liferay.portal.kernel.model.Contact; import com.liferay.portal.kernel.model.EmailAddress; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Layout; import com.liferay.portal.kernel.model.ListType; import com.liferay.portal.kernel.model.ListTypeConstants; import com.liferay.portal.kernel.model.Phone; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.model.Website; import com.liferay.portal.kernel.portlet.DynamicActionRequest; import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCActionCommand; import com.liferay.portal.kernel.portlet.bridges.mvc.MVCActionCommand; import com.liferay.portal.kernel.repository.model.FileEntry; import com.liferay.portal.kernel.security.auth.PrincipalException; import com.liferay.portal.kernel.security.membershippolicy.MembershipPolicyException; import com.liferay.portal.kernel.service.ListTypeLocalService; import com.liferay.portal.kernel.service.ServiceContext; import com.liferay.portal.kernel.service.ServiceContextFactory; import com.liferay.portal.kernel.service.UserLocalService; import com.liferay.portal.kernel.service.UserService; import com.liferay.portal.kernel.servlet.SessionErrors; import com.liferay.portal.kernel.servlet.SessionMessages; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.CalendarFactoryUtil; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.FileUtil; import com.liferay.portal.kernel.util.Http; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.ParamUtil; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.URLCodec; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.workflow.WorkflowConstants; import com.liferay.portlet.InvokerPortletImpl; import com.liferay.portlet.admin.util.AdminUtil; import com.liferay.users.admin.constants.UsersAdminPortletKeys; import com.liferay.users.admin.kernel.util.UsersAdminUtil; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.PortletRequest; import javax.portlet.PortletSession; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts.Globals; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; /** * @author Brian Wing Shun Chan * @author Jorge Ferrer * @author Julio Camarero * @author Wesley Gong */ @Component(immediate = true, property = { "javax.portlet.name=" + UsersAdminPortletKeys.MY_ORGANIZATIONS, "javax.portlet.name=" + UsersAdminPortletKeys.USERS_ADMIN, "mvc.command.name=/users_admin/edit_user" }, service = MVCActionCommand.class) public class EditUserMVCActionCommand extends BaseMVCActionCommand { protected User addUser(ActionRequest actionRequest) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); boolean autoScreenName = ParamUtil.getBoolean(actionRequest, "autoScreenName"); String screenName = ParamUtil.getString(actionRequest, "screenName"); String emailAddress = ParamUtil.getString(actionRequest, "emailAddress"); long facebookId = 0; String languageId = ParamUtil.getString(actionRequest, "languageId"); String firstName = ParamUtil.getString(actionRequest, "firstName"); String middleName = ParamUtil.getString(actionRequest, "middleName"); String lastName = ParamUtil.getString(actionRequest, "lastName"); long prefixId = ParamUtil.getInteger(actionRequest, "prefixId"); long suffixId = ParamUtil.getInteger(actionRequest, "suffixId"); boolean male = ParamUtil.getBoolean(actionRequest, "male", true); int birthdayMonth = ParamUtil.getInteger(actionRequest, "birthdayMonth"); int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay"); int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear"); String comments = ParamUtil.getString(actionRequest, "comments"); String jobTitle = ParamUtil.getString(actionRequest, "jobTitle"); long[] organizationIds = UsersAdminUtil.getOrganizationIds(actionRequest); boolean sendEmail = true; ServiceContext serviceContext = ServiceContextFactory.getInstance(User.class.getName(), actionRequest); User user = _userService.addUser(themeDisplay.getCompanyId(), true, null, null, autoScreenName, screenName, emailAddress, facebookId, null, LocaleUtil.fromLanguageId(languageId), firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, null, organizationIds, null, null, new ArrayList<Address>(), new ArrayList<EmailAddress>(), new ArrayList<Phone>(), new ArrayList<Website>(), new ArrayList<AnnouncementsDelivery>(), sendEmail, serviceContext); user = _userService.updateUser(user.getUserId(), StringPool.BLANK, StringPool.BLANK, StringPool.BLANK, user.getPasswordReset(), null, null, user.getScreenName(), user.getEmailAddress(), facebookId, user.getOpenId(), true, null, languageId, user.getTimeZoneId(), user.getGreeting(), comments, firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, null, null, null, null, null, jobTitle, null, null, null, null, null, null, null, null, null, null, serviceContext); return user; } protected void deleteRole(ActionRequest actionRequest) throws Exception { User user = portal.getSelectedUser(actionRequest); long roleId = ParamUtil.getLong(actionRequest, "roleId"); _userService.deleteRoleUser(roleId, user.getUserId()); } protected void deleteUsers(ActionRequest actionRequest) throws Exception { String cmd = ParamUtil.getString(actionRequest, Constants.CMD); long[] deleteUserIds = StringUtil.split(ParamUtil.getString(actionRequest, "deleteUserIds"), 0L); for (long deleteUserId : deleteUserIds) { if (cmd.equals(Constants.DEACTIVATE) || cmd.equals(Constants.RESTORE)) { int status = WorkflowConstants.STATUS_APPROVED; if (cmd.equals(Constants.DEACTIVATE)) { status = WorkflowConstants.STATUS_INACTIVE; } _userService.updateStatus(deleteUserId, status, new ServiceContext()); } else { _userService.deleteUser(deleteUserId); } } } @Override protected void doProcessAction(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { actionRequest = _wrapActionRequest(actionRequest); String cmd = ParamUtil.getString(actionRequest, Constants.CMD); try { User user = null; String oldScreenName = StringPool.BLANK; boolean updateLanguageId = false; if (cmd.equals(Constants.ADD)) { user = addUser(actionRequest); } else if (cmd.equals(Constants.DEACTIVATE) || cmd.equals(Constants.DELETE) || cmd.equals(Constants.RESTORE)) { deleteUsers(actionRequest); } else if (cmd.equals("deleteRole")) { deleteRole(actionRequest); } else if (cmd.equals(Constants.UPDATE)) { Object[] returnValue = updateUser(actionRequest, actionResponse); user = (User) returnValue[0]; oldScreenName = (String) returnValue[1]; updateLanguageId = (Boolean) returnValue[2]; } else if (cmd.equals("unlock")) { user = updateLockout(actionRequest); } ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); String redirect = ParamUtil.getString(actionRequest, "redirect"); if (user != null) { if (Validator.isNotNull(oldScreenName)) { // This will fix the redirect if the user is on his personal // my account page and changes his screen name. A redirect // that references the old screen name no longer points to a // valid screen name and therefore needs to be updated. Group group = user.getGroup(); if (group.getGroupId() == themeDisplay.getScopeGroupId()) { Layout layout = themeDisplay.getLayout(); String friendlyURLPath = group.getPathFriendlyURL(layout.isPrivateLayout(), themeDisplay); String oldPath = friendlyURLPath + StringPool.SLASH + oldScreenName; String newPath = friendlyURLPath + StringPool.SLASH + user.getScreenName(); redirect = StringUtil.replace(redirect, oldPath, newPath); redirect = StringUtil.replace(redirect, URLCodec.encodeURL(oldPath), URLCodec.encodeURL(newPath)); } } if (updateLanguageId && themeDisplay.isI18n()) { String i18nLanguageId = user.getLanguageId(); int pos = i18nLanguageId.indexOf(CharPool.UNDERLINE); if (pos != -1) { i18nLanguageId = i18nLanguageId.substring(0, pos); } String i18nPath = StringPool.SLASH + i18nLanguageId; redirect = StringUtil.replace(redirect, themeDisplay.getI18nPath(), i18nPath); } redirect = http.setParameter(redirect, actionResponse.getNamespace() + "p_u_i_d", user.getUserId()); } Group scopeGroup = themeDisplay.getScopeGroup(); if (scopeGroup.isUser() && (userLocalService.fetchUserById(scopeGroup.getClassPK()) == null)) { redirect = http.setParameter(redirect, "doAsGroupId", 0); redirect = http.setParameter(redirect, "refererPlid", 0); } sendRedirect(actionRequest, actionResponse, redirect); } catch (Exception e) { String mvcPath = "/edit_user.jsp"; if (e instanceof NoSuchUserException || e instanceof PrincipalException) { SessionErrors.add(actionRequest, e.getClass()); mvcPath = "/error.jsp"; } else if (e instanceof AssetCategoryException || e instanceof AssetTagException || e instanceof CompanyMaxUsersException || e instanceof ContactBirthdayException || e instanceof ContactNameException || e instanceof GroupFriendlyURLException || e instanceof MembershipPolicyException || e instanceof NoSuchListTypeException || e instanceof RequiredUserException || e instanceof UserEmailAddressException || e instanceof UserFieldException || e instanceof UserIdException || e instanceof UserReminderQueryException || e instanceof UserScreenNameException) { if (e instanceof NoSuchListTypeException) { NoSuchListTypeException nslte = (NoSuchListTypeException) e; Class<?> clazz = e.getClass(); SessionErrors.add(actionRequest, clazz.getName() + nslte.getType()); } else { SessionErrors.add(actionRequest, e.getClass(), e); } if (e instanceof CompanyMaxUsersException || e instanceof RequiredUserException) { String redirect = portal.escapeRedirect(ParamUtil.getString(actionRequest, "redirect")); if (Validator.isNotNull(redirect)) { sendRedirect(actionRequest, actionResponse, redirect); return; } } } else { throw e; } actionResponse.setRenderParameter("mvcPath", mvcPath); } } /** * @deprecated As of 2.5.0, with no direct replacement */ @Deprecated protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(ActionRequest actionRequest) { return null; } /** * @deprecated As of 2.5.0, with no direct replacement */ @Deprecated protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(ActionRequest actionRequest, User user) throws Exception { return null; } protected long getListTypeId(PortletRequest portletRequest, String parameterName, String type) throws Exception { String parameterValue = ParamUtil.getString(portletRequest, parameterName); ListType listType = _listTypeLocalService.addListType(parameterValue, type); return listType.getListTypeId(); } /** * @deprecated As of 2.5.0, with no direct replacement */ @Deprecated protected void setAnnouncementsDeliveryLocalService( AnnouncementsDeliveryLocalService announcementsDeliveryLocalService) { } @Reference(unbind = "-") protected void setDLAppLocalService(DLAppLocalService dlAppLocalService) { _dlAppLocalService = dlAppLocalService; } @Reference(unbind = "-") protected void setListTypeLocalService(ListTypeLocalService listTypeLocalService) { _listTypeLocalService = listTypeLocalService; } @Reference(unbind = "-") protected void setUserLocalService(UserLocalService userLocalService) { this.userLocalService = userLocalService; } @Reference(unbind = "-") protected void setUserService(UserService userService) { _userService = userService; } protected User updateLockout(ActionRequest actionRequest) throws Exception { User user = portal.getSelectedUser(actionRequest); _userService.updateLockoutById(user.getUserId(), false); return user; } protected Object[] updateUser(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception { ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY); User user = portal.getSelectedUser(actionRequest); Contact contact = user.getContact(); String oldPassword = AdminUtil.getUpdateUserPassword(actionRequest, user.getUserId()); String oldScreenName = user.getScreenName(); String screenName = BeanParamUtil.getString(user, actionRequest, "screenName"); String oldEmailAddress = user.getEmailAddress(); String emailAddress = BeanParamUtil.getString(user, actionRequest, "emailAddress"); long facebookId = user.getFacebookId(); boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo"); byte[] portraitBytes = null; long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId"); if (fileEntryId > 0) { FileEntry fileEntry = _dlAppLocalService.getFileEntry(fileEntryId); portraitBytes = FileUtil.getBytes(fileEntry.getContentStream()); } String languageId = BeanParamUtil.getString(user, actionRequest, "languageId"); String firstName = BeanParamUtil.getString(user, actionRequest, "firstName"); String middleName = BeanParamUtil.getString(user, actionRequest, "middleName"); String lastName = BeanParamUtil.getString(user, actionRequest, "lastName"); long prefixId = BeanParamUtil.getInteger(contact, actionRequest, "prefixId"); long suffixId = BeanParamUtil.getInteger(contact, actionRequest, "suffixId"); boolean male = BeanParamUtil.getBoolean(user, actionRequest, "male", true); Calendar birthdayCal = CalendarFactoryUtil.getCalendar(); birthdayCal.setTime(contact.getBirthday()); int birthdayMonth = ParamUtil.getInteger(actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH)); int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE)); int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR)); String comments = BeanParamUtil.getString(user, actionRequest, "comments"); String jobTitle = BeanParamUtil.getString(user, actionRequest, "jobTitle"); ServiceContext serviceContext = ServiceContextFactory.getInstance(User.class.getName(), actionRequest); user = _userService.updateUser(user.getUserId(), oldPassword, null, null, user.getPasswordReset(), null, null, screenName, emailAddress, facebookId, user.getOpenId(), !deleteLogo, portraitBytes, languageId, user.getTimeZoneId(), user.getGreeting(), comments, firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, null, null, null, null, null, jobTitle, null, null, null, null, null, null, null, null, null, null, serviceContext); if (oldScreenName.equals(user.getScreenName())) { oldScreenName = StringPool.BLANK; } boolean updateLanguageId = false; if (user.getUserId() == themeDisplay.getUserId()) { // Reset the locale HttpServletRequest request = portal .getOriginalServletRequest(portal.getHttpServletRequest(actionRequest)); HttpServletResponse response = portal.getHttpServletResponse(actionResponse); HttpSession session = request.getSession(); session.removeAttribute(Globals.LOCALE_KEY); Locale locale = LocaleUtil.fromLanguageId(languageId); LanguageUtil.updateCookie(request, response, locale); // Clear cached portlet responses PortletSession portletSession = actionRequest.getPortletSession(); InvokerPortletImpl.clearResponses(portletSession); updateLanguageId = true; } Company company = portal.getCompany(actionRequest); if (company.isStrangersVerify() && !StringUtil.equalsIgnoreCase(oldEmailAddress, emailAddress)) { SessionMessages.add(actionRequest, "verificationEmailSent"); } return new Object[] { user, oldScreenName, updateLanguageId }; } @Reference protected Http http; @Reference protected Portal portal; protected UserLocalService userLocalService; private ActionRequest _wrapActionRequest(ActionRequest actionRequest) throws Exception { DynamicActionRequest dynamicActionRequest = new DynamicActionRequest(actionRequest); long prefixId = getListTypeId(actionRequest, "prefixValue", ListTypeConstants.CONTACT_PREFIX); dynamicActionRequest.setParameter("prefixId", String.valueOf(prefixId)); long suffixId = getListTypeId(actionRequest, "suffixValue", ListTypeConstants.CONTACT_SUFFIX); dynamicActionRequest.setParameter("suffixId", String.valueOf(suffixId)); return dynamicActionRequest; } private DLAppLocalService _dlAppLocalService; private ListTypeLocalService _listTypeLocalService; private UserService _userService; }