com.liferay.users.admin.web.internal.portlet.action.EditUserMVCActionCommand.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.users.admin.web.internal.portlet.action.EditUserMVCActionCommand.java

Source

/**
 * 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;

}