001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.usersadmin.action;
016    
017    import com.liferay.portal.AddressCityException;
018    import com.liferay.portal.AddressStreetException;
019    import com.liferay.portal.AddressZipException;
020    import com.liferay.portal.CompanyMaxUsersException;
021    import com.liferay.portal.ContactBirthdayException;
022    import com.liferay.portal.ContactFirstNameException;
023    import com.liferay.portal.ContactFullNameException;
024    import com.liferay.portal.ContactLastNameException;
025    import com.liferay.portal.DuplicateOpenIdException;
026    import com.liferay.portal.DuplicateUserEmailAddressException;
027    import com.liferay.portal.DuplicateUserScreenNameException;
028    import com.liferay.portal.EmailAddressException;
029    import com.liferay.portal.GroupFriendlyURLException;
030    import com.liferay.portal.NoSuchCountryException;
031    import com.liferay.portal.NoSuchListTypeException;
032    import com.liferay.portal.NoSuchRegionException;
033    import com.liferay.portal.NoSuchUserException;
034    import com.liferay.portal.PhoneNumberException;
035    import com.liferay.portal.RequiredUserException;
036    import com.liferay.portal.ReservedUserEmailAddressException;
037    import com.liferay.portal.ReservedUserScreenNameException;
038    import com.liferay.portal.UserEmailAddressException;
039    import com.liferay.portal.UserFieldException;
040    import com.liferay.portal.UserIdException;
041    import com.liferay.portal.UserPasswordException;
042    import com.liferay.portal.UserReminderQueryException;
043    import com.liferay.portal.UserScreenNameException;
044    import com.liferay.portal.UserSmsException;
045    import com.liferay.portal.WebsiteURLException;
046    import com.liferay.portal.kernel.bean.BeanParamUtil;
047    import com.liferay.portal.kernel.language.LanguageUtil;
048    import com.liferay.portal.kernel.servlet.SessionErrors;
049    import com.liferay.portal.kernel.servlet.SessionMessages;
050    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
051    import com.liferay.portal.kernel.util.CharPool;
052    import com.liferay.portal.kernel.util.Constants;
053    import com.liferay.portal.kernel.util.GetterUtil;
054    import com.liferay.portal.kernel.util.HttpUtil;
055    import com.liferay.portal.kernel.util.LocaleUtil;
056    import com.liferay.portal.kernel.util.ParamUtil;
057    import com.liferay.portal.kernel.util.StringPool;
058    import com.liferay.portal.kernel.util.StringUtil;
059    import com.liferay.portal.kernel.util.Validator;
060    import com.liferay.portal.kernel.workflow.WorkflowConstants;
061    import com.liferay.portal.model.Address;
062    import com.liferay.portal.model.Company;
063    import com.liferay.portal.model.Contact;
064    import com.liferay.portal.model.EmailAddress;
065    import com.liferay.portal.model.Group;
066    import com.liferay.portal.model.Layout;
067    import com.liferay.portal.model.Phone;
068    import com.liferay.portal.model.User;
069    import com.liferay.portal.model.UserGroupRole;
070    import com.liferay.portal.model.Website;
071    import com.liferay.portal.security.auth.PrincipalException;
072    import com.liferay.portal.security.membershippolicy.MembershipPolicyException;
073    import com.liferay.portal.service.ServiceContext;
074    import com.liferay.portal.service.ServiceContextFactory;
075    import com.liferay.portal.service.UserLocalServiceUtil;
076    import com.liferay.portal.service.UserServiceUtil;
077    import com.liferay.portal.struts.PortletAction;
078    import com.liferay.portal.theme.ThemeDisplay;
079    import com.liferay.portal.util.PortalUtil;
080    import com.liferay.portal.util.PortletKeys;
081    import com.liferay.portal.util.PropsValues;
082    import com.liferay.portal.util.WebKeys;
083    import com.liferay.portlet.InvokerPortletImpl;
084    import com.liferay.portlet.admin.util.AdminUtil;
085    import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
086    import com.liferay.portlet.announcements.model.AnnouncementsEntryConstants;
087    import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
088    import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil;
089    import com.liferay.portlet.sites.util.SitesUtil;
090    import com.liferay.portlet.usersadmin.util.UsersAdmin;
091    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
092    
093    import java.util.ArrayList;
094    import java.util.Calendar;
095    import java.util.List;
096    import java.util.Locale;
097    
098    import javax.portlet.ActionRequest;
099    import javax.portlet.ActionResponse;
100    import javax.portlet.PortletConfig;
101    import javax.portlet.PortletRequest;
102    import javax.portlet.PortletSession;
103    import javax.portlet.RenderRequest;
104    import javax.portlet.RenderResponse;
105    
106    import javax.servlet.http.HttpServletRequest;
107    import javax.servlet.http.HttpServletResponse;
108    import javax.servlet.http.HttpSession;
109    
110    import org.apache.struts.Globals;
111    import org.apache.struts.action.ActionForm;
112    import org.apache.struts.action.ActionForward;
113    import org.apache.struts.action.ActionMapping;
114    
115    /**
116     * @author Brian Wing Shun Chan
117     * @author Jorge Ferrer
118     * @author Julio Camarero
119     * @author Wesley Gong
120     */
121    public class EditUserAction extends PortletAction {
122    
123            @Override
124            public void processAction(
125                            ActionMapping actionMapping, ActionForm actionForm,
126                            PortletConfig portletConfig, ActionRequest actionRequest,
127                            ActionResponse actionResponse)
128                    throws Exception {
129    
130                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
131    
132                    try {
133                            User user = null;
134                            String oldScreenName = StringPool.BLANK;
135                            boolean updateLanguageId = false;
136    
137                            if (cmd.equals(Constants.ADD)) {
138                                    user = addUser(actionRequest);
139                            }
140                            else if (cmd.equals(Constants.DEACTIVATE) ||
141                                             cmd.equals(Constants.DELETE) ||
142                                             cmd.equals(Constants.RESTORE)) {
143    
144                                    deleteUsers(actionRequest);
145                            }
146                            else if (cmd.equals("deleteRole")) {
147                                    deleteRole(actionRequest);
148                            }
149                            else if (cmd.equals(Constants.UPDATE)) {
150                                    Object[] returnValue = updateUser(
151                                            actionRequest, actionResponse);
152    
153                                    user = (User)returnValue[0];
154                                    oldScreenName = ((String)returnValue[1]);
155                                    updateLanguageId = ((Boolean)returnValue[2]);
156                            }
157                            else if (cmd.equals("unlock")) {
158                                    user = updateLockout(actionRequest);
159                            }
160    
161                            ThemeDisplay themeDisplay =
162                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
163    
164                            String redirect = ParamUtil.getString(actionRequest, "redirect");
165    
166                            if (user != null) {
167                                    if (Validator.isNotNull(oldScreenName)) {
168    
169                                            // This will fix the redirect if the user is on his personal
170                                            // my account page and changes his screen name. A redirect
171                                            // that references the old screen name no longer points to a
172                                            // valid screen name and therefore needs to be updated.
173    
174                                            Group group = user.getGroup();
175    
176                                            if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
177                                                    Layout layout = themeDisplay.getLayout();
178    
179                                                    String friendlyURLPath = group.getPathFriendlyURL(
180                                                            layout.isPrivateLayout(), themeDisplay);
181    
182                                                    String oldPath =
183                                                            friendlyURLPath + StringPool.SLASH + oldScreenName;
184                                                    String newPath =
185                                                            friendlyURLPath + StringPool.SLASH +
186                                                                    user.getScreenName();
187    
188                                                    redirect = StringUtil.replace(
189                                                            redirect, oldPath, newPath);
190    
191                                                    redirect = StringUtil.replace(
192                                                            redirect, HttpUtil.encodeURL(oldPath),
193                                                            HttpUtil.encodeURL(newPath));
194                                            }
195                                    }
196    
197                                    if (updateLanguageId && themeDisplay.isI18n()) {
198                                            String i18nLanguageId = user.getLanguageId();
199                                            int pos = i18nLanguageId.indexOf(CharPool.UNDERLINE);
200    
201                                            if (pos != -1) {
202                                                    i18nLanguageId = i18nLanguageId.substring(0, pos);
203                                            }
204    
205                                            String i18nPath = StringPool.SLASH + i18nLanguageId;
206    
207                                            redirect = StringUtil.replace(
208                                                    redirect, themeDisplay.getI18nPath(), i18nPath);
209                                    }
210    
211                                    redirect = HttpUtil.setParameter(
212                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
213                                            user.getUserId());
214                            }
215    
216                            Group scopeGroup = themeDisplay.getScopeGroup();
217    
218                            if (scopeGroup.isUser() &&
219                                    (UserLocalServiceUtil.fetchUserById(
220                                            scopeGroup.getClassPK()) == null)) {
221    
222                                    redirect = HttpUtil.setParameter(redirect, "doAsGroupId" , 0);
223                                    redirect = HttpUtil.setParameter(redirect, "refererPlid" , 0);
224                            }
225    
226                            sendRedirect(actionRequest, actionResponse, redirect);
227                    }
228                    catch (Exception e) {
229                            if (e instanceof NoSuchUserException ||
230                                    e instanceof PrincipalException) {
231    
232                                    SessionErrors.add(actionRequest, e.getClass());
233    
234                                    setForward(actionRequest, "portlet.users_admin.error");
235                            }
236                            else if (e instanceof AddressCityException ||
237                                             e instanceof AddressStreetException ||
238                                             e instanceof AddressZipException ||
239                                             e instanceof CompanyMaxUsersException ||
240                                             e instanceof ContactBirthdayException ||
241                                             e instanceof ContactFirstNameException ||
242                                             e instanceof ContactFullNameException ||
243                                             e instanceof ContactLastNameException ||
244                                             e instanceof DuplicateOpenIdException ||
245                                             e instanceof DuplicateUserEmailAddressException ||
246                                             e instanceof DuplicateUserScreenNameException ||
247                                             e instanceof EmailAddressException ||
248                                             e instanceof GroupFriendlyURLException ||
249                                             e instanceof MembershipPolicyException ||
250                                             e instanceof NoSuchCountryException ||
251                                             e instanceof NoSuchListTypeException ||
252                                             e instanceof NoSuchRegionException ||
253                                             e instanceof PhoneNumberException ||
254                                             e instanceof RequiredUserException ||
255                                             e instanceof ReservedUserEmailAddressException ||
256                                             e instanceof ReservedUserScreenNameException ||
257                                             e instanceof UserEmailAddressException ||
258                                             e instanceof UserFieldException ||
259                                             e instanceof UserIdException ||
260                                             e instanceof UserPasswordException ||
261                                             e instanceof UserReminderQueryException ||
262                                             e instanceof UserScreenNameException ||
263                                             e instanceof UserSmsException ||
264                                             e instanceof WebsiteURLException) {
265    
266                                    if (e instanceof NoSuchListTypeException) {
267                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
268    
269                                            SessionErrors.add(
270                                                    actionRequest,
271                                                    e.getClass().getName() + nslte.getType());
272                                    }
273                                    else {
274                                            SessionErrors.add(actionRequest, e.getClass(), e);
275                                    }
276    
277                                    if (e instanceof CompanyMaxUsersException ||
278                                            e instanceof RequiredUserException) {
279    
280                                            String redirect = PortalUtil.escapeRedirect(
281                                                    ParamUtil.getString(actionRequest, "redirect"));
282    
283                                            if (Validator.isNotNull(redirect)) {
284                                                    actionResponse.sendRedirect(redirect);
285                                            }
286                                    }
287                            }
288                            else {
289                                    throw e;
290                            }
291                    }
292            }
293    
294            @Override
295            public ActionForward render(
296                            ActionMapping actionMapping, ActionForm actionForm,
297                            PortletConfig portletConfig, RenderRequest renderRequest,
298                            RenderResponse renderResponse)
299                    throws Exception {
300    
301                    try {
302                            PortalUtil.getSelectedUser(renderRequest);
303                    }
304                    catch (Exception e) {
305                            if (e instanceof PrincipalException) {
306                                    SessionErrors.add(renderRequest, e.getClass());
307    
308                                    return actionMapping.findForward("portlet.users_admin.error");
309                            }
310                            else {
311                                    throw e;
312                            }
313                    }
314    
315                    return actionMapping.findForward(
316                            getForward(renderRequest, "portlet.users_admin.edit_user"));
317            }
318    
319            protected User addUser(ActionRequest actionRequest) throws Exception {
320                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
321                            WebKeys.THEME_DISPLAY);
322    
323                    boolean autoPassword = ParamUtil.getBoolean(
324                            actionRequest, "autoPassword", true);
325                    String password1 = actionRequest.getParameter("password1");
326                    String password2 = actionRequest.getParameter("password2");
327    
328                    String reminderQueryQuestion = ParamUtil.getString(
329                            actionRequest, "reminderQueryQuestion");
330    
331                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
332                            reminderQueryQuestion = ParamUtil.getString(
333                                    actionRequest, "reminderQueryCustomQuestion");
334                    }
335    
336                    String reminderQueryAnswer = ParamUtil.getString(
337                            actionRequest, "reminderQueryAnswer");
338                    boolean autoScreenName = ParamUtil.getBoolean(
339                            actionRequest, "autoScreenName");
340                    String screenName = ParamUtil.getString(actionRequest, "screenName");
341                    String emailAddress = ParamUtil.getString(
342                            actionRequest, "emailAddress");
343                    long facebookId = 0;
344                    String openId = ParamUtil.getString(actionRequest, "openId");
345                    String languageId = ParamUtil.getString(actionRequest, "languageId");
346                    String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
347                    String greeting = ParamUtil.getString(actionRequest, "greeting");
348                    String firstName = ParamUtil.getString(actionRequest, "firstName");
349                    String middleName = ParamUtil.getString(actionRequest, "middleName");
350                    String lastName = ParamUtil.getString(actionRequest, "lastName");
351                    int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
352                    int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
353                    boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
354                    int birthdayMonth = ParamUtil.getInteger(
355                            actionRequest, "birthdayMonth");
356                    int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
357                    int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
358                    String comments = ParamUtil.getString(actionRequest, "comments");
359                    String smsSn = ParamUtil.getString(actionRequest, "smsSn");
360                    String aimSn = ParamUtil.getString(actionRequest, "aimSn");
361                    String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
362                    String icqSn = ParamUtil.getString(actionRequest, "icqSn");
363                    String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
364                    String msnSn = ParamUtil.getString(actionRequest, "msnSn");
365                    String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
366                    String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
367                    String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
368                    String ymSn = ParamUtil.getString(actionRequest, "ymSn");
369                    String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
370                    long[] groupIds = getLongArray(
371                            actionRequest, "groupsSearchContainerPrimaryKeys");
372                    long[] organizationIds = getLongArray(
373                            actionRequest, "organizationsSearchContainerPrimaryKeys");
374                    long[] roleIds = getLongArray(
375                            actionRequest, "rolesSearchContainerPrimaryKeys");
376                    List<UserGroupRole> userGroupRoles = UsersAdminUtil.getUserGroupRoles(
377                            actionRequest);
378                    long[] userGroupIds = getLongArray(
379                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
380                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
381                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
382                            actionRequest);
383                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
384                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
385                    List<AnnouncementsDelivery> announcementsDeliveries =
386                            getAnnouncementsDeliveries(actionRequest);
387                    boolean sendEmail = true;
388    
389                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
390                            User.class.getName(), actionRequest);
391    
392                    User user = UserServiceUtil.addUser(
393                            themeDisplay.getCompanyId(), autoPassword, password1, password2,
394                            autoScreenName, screenName, emailAddress, facebookId, openId,
395                            LocaleUtil.getDefault(), firstName, middleName, lastName, prefixId,
396                            suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
397                            groupIds, organizationIds, roleIds, userGroupIds, addresses,
398                            emailAddresses, phones, websites, announcementsDeliveries,
399                            sendEmail, serviceContext);
400    
401                    if (!userGroupRoles.isEmpty()) {
402                            for (UserGroupRole userGroupRole : userGroupRoles) {
403                                    userGroupRole.setUserId(user.getUserId());
404                            }
405    
406                            user = UserServiceUtil.updateUser(
407                                    user.getUserId(), StringPool.BLANK, StringPool.BLANK,
408                                    StringPool.BLANK, false, reminderQueryQuestion,
409                                    reminderQueryAnswer, user.getScreenName(),
410                                    user.getEmailAddress(), facebookId, openId, languageId,
411                                    timeZoneId, greeting, comments, firstName, middleName, lastName,
412                                    prefixId, suffixId, male, birthdayMonth, birthdayDay,
413                                    birthdayYear, smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn,
414                                    mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle, groupIds,
415                                    organizationIds, roleIds, userGroupRoles, userGroupIds,
416                                    addresses, emailAddresses, phones, websites,
417                                    announcementsDeliveries, serviceContext);
418                    }
419    
420                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
421                            actionRequest, "publicLayoutSetPrototypeId");
422                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
423                            actionRequest, "privateLayoutSetPrototypeId");
424                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
425                            actionRequest, "publicLayoutSetPrototypeLinkEnabled");
426                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
427                            actionRequest, "privateLayoutSetPrototypeLinkEnabled");
428    
429                    SitesUtil.updateLayoutSetPrototypesLinks(
430                            user.getGroup(), publicLayoutSetPrototypeId,
431                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
432                            privateLayoutSetPrototypeLinkEnabled);
433    
434                    return user;
435            }
436    
437            protected void deleteRole(ActionRequest actionRequest) throws Exception {
438                    User user = PortalUtil.getSelectedUser(actionRequest);
439    
440                    long roleId = ParamUtil.getLong(actionRequest, "roleId");
441    
442                    UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
443            }
444    
445            protected void deleteUsers(ActionRequest actionRequest) throws Exception {
446                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
447    
448                    long[] deleteUserIds = StringUtil.split(
449                            ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
450    
451                    for (long deleteUserId : deleteUserIds) {
452                            if (cmd.equals(Constants.DEACTIVATE) ||
453                                    cmd.equals(Constants.RESTORE)) {
454    
455                                    int status = WorkflowConstants.STATUS_APPROVED;
456    
457                                    if (cmd.equals(Constants.DEACTIVATE)) {
458                                            status = WorkflowConstants.STATUS_INACTIVE;
459                                    }
460    
461                                    UserServiceUtil.updateStatus(deleteUserId, status);
462                            }
463                            else {
464                                    UserServiceUtil.deleteUser(deleteUserId);
465                            }
466                    }
467            }
468    
469            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
470                    ActionRequest actionRequest) {
471    
472                    List<AnnouncementsDelivery> announcementsDeliveries =
473                            new ArrayList<AnnouncementsDelivery>();
474    
475                    for (String type : AnnouncementsEntryConstants.TYPES) {
476                            boolean email = ParamUtil.getBoolean(
477                                    actionRequest, "announcementsType" + type + "Email");
478                            boolean sms = ParamUtil.getBoolean(
479                                    actionRequest, "announcementsType" + type + "Sms");
480                            boolean website = ParamUtil.getBoolean(
481                                    actionRequest, "announcementsType" + type + "Website");
482    
483                            AnnouncementsDelivery announcementsDelivery =
484                                    new AnnouncementsDeliveryImpl();
485    
486                            announcementsDelivery.setType(type);
487                            announcementsDelivery.setEmail(email);
488                            announcementsDelivery.setSms(sms);
489                            announcementsDelivery.setWebsite(website);
490    
491                            announcementsDeliveries.add(announcementsDelivery);
492                    }
493    
494                    return announcementsDeliveries;
495            }
496    
497            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
498                            ActionRequest actionRequest, User user)
499                    throws Exception {
500    
501                    if (actionRequest.getParameter(
502                                    "announcementsType" + AnnouncementsEntryConstants.TYPES[0] +
503                                            "Email") == null) {
504    
505                            return AnnouncementsDeliveryLocalServiceUtil.getUserDeliveries(
506                                    user.getUserId());
507                    }
508    
509                    return getAnnouncementsDeliveries(actionRequest);
510            }
511    
512            protected long[] getLongArray(PortletRequest portletRequest, String name) {
513                    String value = portletRequest.getParameter(name);
514    
515                    if (value == null) {
516                            return null;
517                    }
518    
519                    return StringUtil.split(GetterUtil.getString(value), 0L);
520            }
521    
522            protected User updateLockout(ActionRequest actionRequest) throws Exception {
523                    User user = PortalUtil.getSelectedUser(actionRequest);
524    
525                    UserServiceUtil.updateLockoutById(user.getUserId(), false);
526    
527                    return user;
528            }
529    
530            protected Object[] updateUser(
531                            ActionRequest actionRequest, ActionResponse actionResponse)
532                    throws Exception {
533    
534                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
535                            WebKeys.THEME_DISPLAY);
536    
537                    User user = PortalUtil.getSelectedUser(actionRequest);
538    
539                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
540    
541                    if (deleteLogo) {
542                            UserServiceUtil.deletePortrait(user.getUserId());
543                    }
544    
545                    Contact contact = user.getContact();
546    
547                    String oldPassword = AdminUtil.getUpdateUserPassword(
548                            actionRequest, user.getUserId());
549                    String newPassword1 = actionRequest.getParameter("password1");
550                    String newPassword2 = actionRequest.getParameter("password2");
551                    boolean passwordReset = ParamUtil.getBoolean(
552                            actionRequest, "passwordReset");
553    
554                    String reminderQueryQuestion = BeanParamUtil.getString(
555                            user, actionRequest, "reminderQueryQuestion");
556    
557                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
558                            reminderQueryQuestion = BeanParamUtil.getStringSilent(
559                                    user, actionRequest, "reminderQueryCustomQuestion");
560                    }
561    
562                    String reminderQueryAnswer = BeanParamUtil.getString(
563                            user, actionRequest, "reminderQueryAnswer");
564                    String oldScreenName = user.getScreenName();
565                    String screenName = BeanParamUtil.getString(
566                            user, actionRequest, "screenName");
567                    String oldEmailAddress = user.getEmailAddress();
568                    String emailAddress = BeanParamUtil.getString(
569                            user, actionRequest, "emailAddress");
570                    long facebookId = user.getFacebookId();
571                    String openId = BeanParamUtil.getString(user, actionRequest, "openId");
572                    String languageId = BeanParamUtil.getString(
573                            user, actionRequest, "languageId");
574                    String timeZoneId = BeanParamUtil.getString(
575                            user, actionRequest, "timeZoneId");
576                    String greeting = BeanParamUtil.getString(
577                            user, actionRequest, "greeting");
578                    String firstName = BeanParamUtil.getString(
579                            user, actionRequest, "firstName");
580                    String middleName = BeanParamUtil.getString(
581                            user, actionRequest, "middleName");
582                    String lastName = BeanParamUtil.getString(
583                            user, actionRequest, "lastName");
584                    int prefixId = BeanParamUtil.getInteger(
585                            contact, actionRequest, "prefixId");
586                    int suffixId = BeanParamUtil.getInteger(
587                            contact, actionRequest, "suffixId");
588                    boolean male = BeanParamUtil.getBoolean(
589                            user, actionRequest, "male", true);
590    
591                    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
592    
593                    birthdayCal.setTime(contact.getBirthday());
594    
595                    int birthdayMonth = ParamUtil.getInteger(
596                            actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
597                    int birthdayDay = ParamUtil.getInteger(
598                            actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
599                    int birthdayYear = ParamUtil.getInteger(
600                            actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
601                    String comments = BeanParamUtil.getString(
602                            user, actionRequest, "comments");
603                    String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
604                    String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
605                    String facebookSn = BeanParamUtil.getString(
606                            contact, actionRequest, "facebookSn");
607                    String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
608                    String jabberSn = BeanParamUtil.getString(
609                            contact, actionRequest, "jabberSn");
610                    String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
611                    String mySpaceSn = BeanParamUtil.getString(
612                            contact, actionRequest, "mySpaceSn");
613                    String skypeSn = BeanParamUtil.getString(
614                            contact, actionRequest, "skypeSn");
615                    String twitterSn = BeanParamUtil.getString(
616                            contact, actionRequest, "twitterSn");
617                    String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
618                    String jobTitle = BeanParamUtil.getString(
619                            user, actionRequest, "jobTitle");
620                    long[] groupIds = getLongArray(
621                            actionRequest, "groupsSearchContainerPrimaryKeys");
622                    long[] organizationIds = getLongArray(
623                            actionRequest, "organizationsSearchContainerPrimaryKeys");
624                    long[] roleIds = getLongArray(
625                            actionRequest, "rolesSearchContainerPrimaryKeys");
626    
627                    List<UserGroupRole> userGroupRoles = null;
628    
629                    if ((actionRequest.getParameter("groupRolesGroupIds") != null) ||
630                            (actionRequest.getParameter("groupRolesRoleIds") != null)) {
631    
632                            userGroupRoles = UsersAdminUtil.getUserGroupRoles(actionRequest);
633                    }
634    
635                    long[] userGroupIds = getLongArray(
636                            actionRequest, "userGroupsSearchContainerPrimaryKeys");
637                    List<Address> addresses = UsersAdminUtil.getAddresses(
638                            actionRequest, user.getAddresses());
639                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
640                            actionRequest, user.getEmailAddresses());
641                    List<Phone> phones = UsersAdminUtil.getPhones(
642                            actionRequest, user.getPhones());
643                    List<Website> websites = UsersAdminUtil.getWebsites(
644                            actionRequest, user.getWebsites());
645                    List<AnnouncementsDelivery> announcementsDeliveries =
646                            getAnnouncementsDeliveries(actionRequest, user);
647    
648                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
649                            User.class.getName(), actionRequest);
650    
651                    user = UserServiceUtil.updateUser(
652                            user.getUserId(), oldPassword, newPassword1, newPassword2,
653                            passwordReset, reminderQueryQuestion, reminderQueryAnswer,
654                            screenName, emailAddress, facebookId, openId, languageId,
655                            timeZoneId, greeting, comments, firstName, middleName, lastName,
656                            prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear,
657                            smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn,
658                            skypeSn, twitterSn, ymSn, jobTitle, groupIds, organizationIds,
659                            roleIds, userGroupRoles, userGroupIds, addresses, emailAddresses,
660                            phones, websites, announcementsDeliveries, serviceContext);
661    
662                    if (oldScreenName.equals(user.getScreenName())) {
663                            oldScreenName = StringPool.BLANK;
664                    }
665    
666                    boolean updateLanguageId = false;
667    
668                    if (user.getUserId() == themeDisplay.getUserId()) {
669    
670                            // Reset the locale
671    
672                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
673                                    actionRequest);
674                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
675                                    actionResponse);
676                            HttpSession session = request.getSession();
677    
678                            session.removeAttribute(Globals.LOCALE_KEY);
679    
680                            Locale locale = LocaleUtil.fromLanguageId(languageId);
681    
682                            LanguageUtil.updateCookie(request, response, locale);
683    
684                            // Clear cached portlet responses
685    
686                            PortletSession portletSession = actionRequest.getPortletSession();
687    
688                            InvokerPortletImpl.clearResponses(portletSession);
689    
690                            // Password
691    
692                            if (PropsValues.SESSION_STORE_PASSWORD &&
693                                    Validator.isNotNull(newPassword1)) {
694    
695                                    portletSession.setAttribute(
696                                            WebKeys.USER_PASSWORD, newPassword1,
697                                            PortletSession.APPLICATION_SCOPE);
698                            }
699    
700                            updateLanguageId = true;
701                    }
702    
703                    String portletId = serviceContext.getPortletId();
704    
705                    if (!portletId.equals(PortletKeys.MY_ACCOUNT)) {
706                            long publicLayoutSetPrototypeId = ParamUtil.getLong(
707                                    actionRequest, "publicLayoutSetPrototypeId");
708                            long privateLayoutSetPrototypeId = ParamUtil.getLong(
709                                    actionRequest, "privateLayoutSetPrototypeId");
710                            boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
711                                    actionRequest, "publicLayoutSetPrototypeLinkEnabled");
712                            boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
713                                    actionRequest, "privateLayoutSetPrototypeLinkEnabled");
714    
715                            SitesUtil.updateLayoutSetPrototypesLinks(
716                                    user.getGroup(), publicLayoutSetPrototypeId,
717                                    privateLayoutSetPrototypeId,
718                                    publicLayoutSetPrototypeLinkEnabled,
719                                    privateLayoutSetPrototypeLinkEnabled);
720                    }
721    
722                    Company company = PortalUtil.getCompany(actionRequest);
723    
724                    if (company.isStrangersVerify() &&
725                            !StringUtil.equalsIgnoreCase(oldEmailAddress, emailAddress)) {
726    
727                            SessionMessages.add(actionRequest, "verificationEmailSent");
728                    }
729    
730                    return new Object[] {user, oldScreenName, updateLanguageId};
731            }
732    
733    }