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