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