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